<?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>16385</bug_id>
          
          <creation_ts>2007-12-10 13:52:12 -0800</creation_ts>
          <short_desc>Cleanup kjs_window</short_desc>
          <delta_ts>2007-12-16 20:52:10 -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>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>63857</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-10 13:52:12 -0800</bug_when>
    <thetext>Most of the content of kjs_window can be move to more appropriate places (to DOMWindow, WindowFeatures, etc.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63860</commentid>
    <comment_count>1</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-10 13:54:13 -0800</bug_when>
    <thetext>*** Bug 16386 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63861</commentid>
    <comment_count>2</comment_count>
      <attachid>17826</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-10 14:13:14 -0800</bug_when>
    <thetext>Created attachment 17826
First round of cleanup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63863</commentid>
    <comment_count>3</comment_count>
      <attachid>17826</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-12-10 14:20:56 -0800</bug_when>
    <thetext>Comment on attachment 17826
First round of cleanup

Please run the sort-Xcode-project-file script on the project file.

+    // - dialogHide: trusted &amp;&amp; WindowFeatures::boolFeature(features, &quot;dialoghide&quot;), makes dialog hide when you print
+    // - help: WindowFeatures::boolFeature(features, &quot;help&quot;, true), makes help icon appear in dialog (what does it do on Windows?)
+    // - unadorned: trusted &amp;&amp; WindowFeatures::boolFeature(features, &quot;unadorned&quot;);

Seems a little strange here. Global replace problem?

+static bool isSeparator(::UChar c)

I don&apos;t think you need the :: here. It was needed because of &quot;using namespace KJS&quot;.

+    {}

We usually put those braces on separate lines.

Where&apos;s the update to the .pro and .bkl files?

Otherwise looks fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64408</commentid>
    <comment_count>4</comment_count>
      <attachid>17937</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-16 13:40:50 -0800</bug_when>
    <thetext>Created attachment 17937
move PausedTimeouts</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64418</commentid>
    <comment_count>5</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-16 14:52:35 -0800</bug_when>
    <thetext>The first patch was landed in r28592.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64427</commentid>
    <comment_count>6</comment_count>
      <attachid>17937</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-12-16 15:36:30 -0800</bug_when>
    <thetext>Comment on attachment 17937
move PausedTimeouts

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64432</commentid>
    <comment_count>7</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-16 16:30:41 -0800</bug_when>
    <thetext>Second patch landed in r28779.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64436</commentid>
    <comment_count>8</comment_count>
      <attachid>17943</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-16 16:48:11 -0800</bug_when>
    <thetext>Created attachment 17943
move ScheduledAction</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64464</commentid>
    <comment_count>9</comment_count>
      <attachid>17943</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-12-16 19:26:52 -0800</bug_when>
    <thetext>Comment on attachment 17943
move ScheduledAction

Please try to use separate bugs for separate patches. Otherwise the state of the bug gets confusing. 

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64472</commentid>
    <comment_count>10</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2007-12-16 20:52:10 -0800</bug_when>
    <thetext>Third patch landed in r28794.  Closing this bug, but will follow up with other bugs for more specific single tasks.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17826</attachid>
            <date>2007-12-10 14:13:14 -0800</date>
            <delta_ts>2007-12-16 13:40:50 -0800</delta_ts>
            <desc>First round of cleanup</desc>
            <filename>kjs_clean1.diff</filename>
            <type>text/plain</type>
            <size>49485</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyODU4OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDYgQEAKKzIwMDctMTItMDkgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3JlIGNs
ZWFudXAgb2Yga2pzX3dpbmRvdy4KKyAgICAgICAgLSBNb3ZlIFdpbmRvd0ZlYXR1cmVzIGZyb20g
YnJpZGdlLyB0byBwYWdlLworICAgICAgICAtIE1vdmUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gV2lu
ZG93RmVhdHVyZXMgKGJvb2xGZWF0dXJlLAorICAgICAgICAgIGZsb2F0RmVhdHVyZSwgc2V0V2lu
ZG93RmVhdHVyZSwgcGFyc2VXaW5kb3dGZWF0dXJlcykgaW50byB0aGUgY2xhc3MuCisgICAgICAg
IC0gRml4IHVwIHdoaXRlc3BhY2UuCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3Jl
LnZjcHJvajoKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6Cisg
ICAgICAgICogYmluZGluZ3MvanMva2pzX3dpbmRvdy5jcHA6CisgICAgICAgIChLSlM6OkRPTVdp
bmRvd1RpbWVyOjp+RE9NV2luZG93VGltZXIpOgorICAgICAgICAoS0pTOjpjcmVhdGVXaW5kb3cp
OgorICAgICAgICAoS0pTOjpzaG93TW9kYWxEaWFsb2cpOgorICAgICAgICAoS0pTOjpXaW5kb3c6
OmdldE93blByb3BlcnR5U2xvdCk6CisgICAgICAgIChLSlM6OldpbmRvdzo6YWxsb3dzQWNjZXNz
RnJvbSk6CisgICAgICAgIChLSlM6OldpbmRvdzo6c2hvdWxkSW50ZXJydXB0U2NyaXB0KToKKyAg
ICAgICAgKEtKUzo6V2luZG93UHJvdG9GdW5jQVRvQjo6Y2FsbEFzRnVuY3Rpb24pOgorICAgICAg
ICAoS0pTOjpXaW5kb3dQcm90b0Z1bmNPcGVuOjpjYWxsQXNGdW5jdGlvbik6CisgICAgICAgIChL
SlM6OldpbmRvdzo6c2V0UmV0dXJuVmFsdWVTbG90KToKKyAgICAgICAgKEtKUzo6U2NoZWR1bGVk
QWN0aW9uOjpleGVjdXRlKToKKyAgICAgICAgKEtKUzo6V2luZG93Ojp0aW1lckZpcmVkKToKKyAg
ICAgICAgKEtKUzo6TG9jYXRpb246OkxvY2F0aW9uKToKKyAgICAgICAgKEtKUzo6TG9jYXRpb246
OmdldFZhbHVlUHJvcGVydHkpOgorICAgICAgICAoS0pTOjpMb2NhdGlvbjo6Z2V0T3duUHJvcGVy
dHlTbG90KToKKyAgICAgICAgKEtKUzo6TG9jYXRpb246OnB1dCk6CisgICAgICAgIChLSlM6Okxv
Y2F0aW9uUHJvdG9GdW5jUmVwbGFjZTo6Y2FsbEFzRnVuY3Rpb24pOiBVc2UgYmV0dGVyIHZhcmlh
YmxlIG5hbWVzLgorICAgICAgICAoS0pTOjpMb2NhdGlvblByb3RvRnVuY0Fzc2lnbjo6Y2FsbEFz
RnVuY3Rpb24pOiBEaXR0by4KKyAgICAgICAgKEtKUzo6TG9jYXRpb25Qcm90b0Z1bmNUb1N0cmlu
Zzo6Y2FsbEFzRnVuY3Rpb24pOiBSZW1vdmUgZXh0cmFuZW91cyBjYWxscyB0bworICAgICAgICBh
bGxvd3NBY2Nlc3NGcm9tLCBjbGVhbnVwIHRoZSBmdW5jdGlvbiBhIGxpdHRsZS4KKyAgICAgICAg
KEtKUzo6UGF1c2VkVGltZW91dHM6On5QYXVzZWRUaW1lb3V0cyk6CisgICAgICAgICogYnJpZGdl
L1dpbmRvd0ZlYXR1cmVzLmg6IFJlbW92ZWQuCisgICAgICAgICogcGFnZS9XaW5kb3dGZWF0dXJl
cy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6aXNTZXBhcmF0b3IpOgorICAgICAgICAo
V2ViQ29yZTo6V2luZG93RmVhdHVyZXM6OldpbmRvd0ZlYXR1cmVzKToKKyAgICAgICAgKFdlYkNv
cmU6OldpbmRvd0ZlYXR1cmVzOjpzZXRXaW5kb3dGZWF0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6
OldpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpXaW5kb3dG
ZWF0dXJlczo6ZmxvYXRGZWF0dXJlKToKKyAgICAgICAgKiBwYWdlL1dpbmRvd0ZlYXR1cmVzLmg6
IENvcGllZCBmcm9tIFdlYkNvcmUvYnJpZGdlL1dpbmRvd0ZlYXR1cmVzLmguCisgICAgICAgIChX
ZWJDb3JlOjpXaW5kb3dGZWF0dXJlczo6V2luZG93RmVhdHVyZXMpOgorCiAyMDA3LTEyLTEwICBB
bHAgVG9rZXIgIDxhbHBAYXRva2VyLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBOaWtvLgpJ
bmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvago9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAyODU4OSkK
KysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkK
QEAgLTI3MDIsNiArMjcwMiwxNCBAQAogCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGFnZVxTZXR0aW5n
cy5oIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0i
Li5ccGFnZVxXaW5kb3dGZWF0dXJlcy5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZp
bGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwYWdlXFdpbmRvd0ZlYXR1cmVzLmgiDQorCQkJCT4N
CisJCQk8L0ZpbGU+DQogCQk8L0ZpbHRlcj4NCiAJCTxGaWx0ZXINCiAJCQlOYW1lPSJsb2FkZXIi
DQpAQCAtNjE4NCwxMCArNjE5Miw2IEBACiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxicmlkZ2VcSmF2
YVNjcmlwdFN0YXRpc3RpY3MuaCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXGJyaWRnZVxXaW5kb3dGZWF0dXJlcy5oIg0KLQkJCQk+DQotCQkJ
PC9GaWxlPg0KIAkJCTxGaWx0ZXINCiAJCQkJTmFtZT0id2luIg0KIAkJCQk+DQpJbmRleDogV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDI4NTg5KQor
KysgV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTc1LDcgKzc1LDYgQEAKIAkJMTRFODM3OEUwOUY4NUQ0RjAwQjg1QUU0IC8qIEpTRXZl
bnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0RTgz
NzhEMDlGODVENEYwMEI4NUFFNCAvKiBKU0V2ZW50LmggKi87IH07CiAJCTE0RUMyNjdGMDlDQTA3
RTAwMEUxRUVFQyAvKiBFdmVudFRhcmdldE5vZGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0RUMyNjdEMDlDQTA3RTAwMEUxRUVFQyAvKiBFdmVudFRh
cmdldE5vZGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OwogCQkxNEVDMjY4MDA5Q0EwN0UwMDBFMUVFRUMgLyogRXZlbnRUYXJnZXROb2RlLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0RUMyNjdFMDlDQTA3
RTAwMEUxRUVFQyAvKiBFdmVudFRhcmdldE5vZGUuY3BwICovOyB9OwotCQkxNEZENkRGRDBBRTVF
QTFCMDBBRDY3QUQgLyogV2luZG93RmVhdHVyZXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0RkQ2REZDMEFFNUVBMUIwMEFENjdBRCAvKiBXaW5kb3dG
ZWF0dXJlcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07
CiAJCTE0RkZFMzFEMEFFMTk2MzMwMDEzNkJGNSAvKiBIVE1MRnJhbWVFbGVtZW50QmFzZS5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTRGRkUzMUIwQUUx
OTYzMzAwMTM2QkY1IC8qIEhUTUxGcmFtZUVsZW1lbnRCYXNlLmggKi87IH07CiAJCTE0RkZFMzFF
MEFFMTk2MzMwMDEzNkJGNSAvKiBIVE1MRnJhbWVFbGVtZW50QmFzZS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNEZGRTMxQzBBRTE5NjMzMDAxMzZC
RjUgLyogSFRNTEZyYW1lRWxlbWVudEJhc2UuY3BwICovOyB9OwogCQkxQTBENTczNjBBNUM3N0ZF
MDA3RURENEMgLyogT3ZlcmZsb3dFdmVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAxQTBENTczNDBBNUM3N0ZFMDA3RURENEMgLyogT3ZlcmZsb3dF
dmVudC5jcHAgKi87IH07CkBAIC0zNjIwLDYgKzM2MTksOCBAQAogCQlCQzgyNDMyQTBEMENFOEEy
MDA0NjBDOEYgLyogSlNTUUxUcmFuc2FjdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkM4MjQzMjYwRDBDRThBMjAwNDYwQzhGIC8qIEpTU1FMVHJh
bnNhY3Rpb24uaCAqLzsgfTsKIAkJQkM4MjQzMkIwRDBDRThBMjAwNDYwQzhGIC8qIEpTVm9pZENh
bGxiYWNrLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEJDODI0MzI3MEQwQ0U4QTIwMDQ2MEM4RiAvKiBKU1ZvaWRDYWxsYmFjay5jcHAgKi87IH07CiAJ
CUJDODI0MzJDMEQwQ0U4QTIwMDQ2MEM4RiAvKiBKU1ZvaWRDYWxsYmFjay5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkM4MjQzMjgwRDBDRThBMjAwNDYw
QzhGIC8qIEpTVm9pZENhbGxiYWNrLmggKi87IH07CisJCUJDODI0M0U4MEQwQ0ZENzUwMDQ2MEM4
RiAvKiBXaW5kb3dGZWF0dXJlcy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQzgyNDNFNjBEMENGRDc1MDA0NjBDOEYgLyogV2luZG93RmVhdHVyZXMu
Y3BwICovOyB9OworCQlCQzgyNDNFOTBEMENGRDc1MDA0NjBDOEYgLyogV2luZG93RmVhdHVyZXMu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDODI0M0U3
MEQwQ0ZENzUwMDQ2MEM4RiAvKiBXaW5kb3dGZWF0dXJlcy5oICovOyBzZXR0aW5ncyA9IHtBVFRS
SUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUJDOTI2RjgwMEMwNTUyNDcwMDgyNzc2QiAv
KiBKU0hUTUxGcmFtZVNldEVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQkM5MjZGN0UwQzA1NTI0NzAwODI3NzZCIC8qIEpTSFRNTEZyYW1l
U2V0RWxlbWVudC5jcHAgKi87IH07CiAJCUJDOTI2RjgxMEMwNTUyNDcwMDgyNzc2QiAvKiBKU0hU
TUxGcmFtZVNldEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDOTI2RjdGMEMwNTUyNDcwMDgyNzc2QiAvKiBKU0hUTUxGcmFtZVNldEVsZW1l
bnQuaCAqLzsgfTsKIAkJQkM5NEQxMDgwQzI3NEY4ODAwNkJDNjE3IC8qIFBsYXRmb3JtU2NyZWVu
TWFjLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkM5
NEQxMDcwQzI3NEY4ODAwNkJDNjE3IC8qIFBsYXRmb3JtU2NyZWVuTWFjLm1tICovOyB9OwpAQCAt
NDM2Niw3ICs0MzY3LDYgQEAKIAkJMTRFODM3OEQwOUY4NUQ0RjAwQjg1QUU0IC8qIEpTRXZlbnQu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTRXZlbnQuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTRFQzI2N0QwOUNBMDdFMDAwRTFFRUVDIC8qIEV2ZW50VGFy
Z2V0Tm9kZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBFdmVudFRhcmdldE5v
ZGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTRFQzI2N0UwOUNBMDdFMDAwRTFF
RUVDIC8qIEV2ZW50VGFyZ2V0Tm9kZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBFdmVudFRhcmdldE5vZGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owot
CQkxNEZENkRGQzBBRTVFQTFCMDBBRDY3QUQgLyogV2luZG93RmVhdHVyZXMuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdpbmRvd0ZlYXR1cmVzLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTE0RkZFMzFCMEFFMTk2MzMwMDEzNkJGNSAvKiBIVE1MRnJhbWVFbGVt
ZW50QmFzZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBIVE1MRnJhbWVFbGVt
ZW50QmFzZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNEZGRTMxQzBBRTE5NjMz
MDAxMzZCRjUgLyogSFRNTEZyYW1lRWxlbWVudEJhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gSFRNTEZyYW1lRWxlbWVudEJhc2UuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQkxQTBENTczNDBBNUM3N0ZFMDA3RURENEMgLyogT3ZlcmZsb3dFdmVu
dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gT3ZlcmZsb3dFdmVu
dC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC03NjIzLDYgKzc2MjMsOCBAQAog
CQlCQzgyNDMyNjBEMENFOEEyMDA0NjBDOEYgLyogSlNTUUxUcmFuc2FjdGlvbi5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU1NRTFRyYW5zYWN0aW9uLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCUJDODI0MzI3MEQwQ0U4QTIwMDQ2MEM4RiAvKiBKU1ZvaWRDYWxs
YmFjay5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1ZvaWRDYWxs
YmFjay5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDODI0MzI4MEQwQ0U4QTIw
MDQ2MEM4RiAvKiBKU1ZvaWRDYWxsYmFjay5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBKU1ZvaWRDYWxsYmFjay5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCQzgy
NDNFNjBEMENGRDc1MDA0NjBDOEYgLyogV2luZG93RmVhdHVyZXMuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gV2luZG93RmVhdHVyZXMuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlCQzgyNDNFNzBEMENGRDc1MDA0NjBDOEYgLyogV2luZG93RmVhdHVy
ZXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2luZG93RmVhdHVyZXMuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkM5MjZGN0UwQzA1NTI0NzAwODI3NzZCIC8q
IEpTSFRNTEZyYW1lU2V0RWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gSlNIVE1MRnJhbWVTZXRFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJQkM5MjZGN0YwQzA1NTI0NzAwODI3NzZCIC8qIEpTSFRNTEZyYW1lU2V0RWxlbWVu
dC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNIVE1MRnJhbWVTZXRFbGVt
ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDOTREMTA3MEMyNzRGODgwMDZC
QzYxNyAvKiBQbGF0Zm9ybVNjcmVlbk1hYy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5v
YmpjcHA7IHBhdGggPSBQbGF0Zm9ybVNjcmVlbk1hYy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKQEAgLTg0MDAsNiArODQwMiw4IEBACiAJCQkJQkNFQzAxQkMwQzI3NERBQzAwOUY0RUM5
IC8qIFNjcmVlbi5pZGwgKi8sCiAJCQkJMTRDOUE1RTkwQjNEMTA1RjAwNUEwMjMyIC8qIFNldHRp
bmdzLmNwcCAqLywKIAkJCQlGNTg3ODYzQTAyREUzQTE0MDFFQTQxMjIgLyogU2V0dGluZ3MuaCAq
LywKKwkJCQlCQzgyNDNFNjBEMENGRDc1MDA0NjBDOEYgLyogV2luZG93RmVhdHVyZXMuY3BwICov
LAorCQkJCUJDODI0M0U3MEQwQ0ZENzUwMDQ2MEM4RiAvKiBXaW5kb3dGZWF0dXJlcy5oICovLAog
CQkJKTsKIAkJCXBhdGggPSBwYWdlOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTg0
MTUsNyArODQxOSw2IEBACiAJCQkJQkM5NEQxNTYwQzI3NUNBQjAwNkJDNjE3IC8qIEdsb2JhbEhp
c3RvcnkuaCAqLywKIAkJCQkwNkZDNDQyQjBCQUU1QTlFMDA5MEVERTEgLyogSmF2YVNjcmlwdFN0
YXRpc3RpY3MuY3BwICovLAogCQkJCTA2RkM0NDJDMEJBRTVBOUUwMDkwRURFMSAvKiBKYXZhU2Ny
aXB0U3RhdGlzdGljcy5oICovLAotCQkJCTE0RkQ2REZDMEFFNUVBMUIwMEFENjdBRCAvKiBXaW5k
b3dGZWF0dXJlcy5oICovLAogCQkJKTsKIAkJCXBhdGggPSBicmlkZ2U7CiAJCQlzb3VyY2VUcmVl
ID0gIjxncm91cD4iOwpAQCAtMTM3OTYsNyArMTM3OTksNiBAQAogCQkJCTg1MDMxQjUxMEE0NEVG
QzcwMEY5OTJFMCAvKiBXaGVlbEV2ZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQk5MzgwRjQ3NDA5
QTExQUI0MDAxRkRCMzQgLyogV2lkZ2V0LmggaW4gSGVhZGVycyAqLywKIAkJCQk5M0I3ODBDQTA5
QjNCN0ZFMDA2OTAxNjIgLyogV2lkZ2V0Q2xpZW50LmggaW4gSGVhZGVycyAqLywKLQkJCQkxNEZE
NkRGRDBBRTVFQTFCMDBBRDY3QUQgLyogV2luZG93RmVhdHVyZXMuaCBpbiBIZWFkZXJzICovLAog
CQkJCTkzMzA5RTI0MDk5RTY0OTIwMDU2RTU4MSAvKiBXcmFwQ29udGVudHNJbkR1bW15U3BhbkNv
bW1hbmQuaCBpbiBIZWFkZXJzICovLAogCQkJCTY1NjU4MjAyMDlEMTUwOEQwMDBFNjFENyAvKiBY
TGlua05hbWVzLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzc3MkM0NzBDNEVCMkM2MDA4MzI4NUYg
LyogWE1MSHR0cFJlcXVlc3QuaCBpbiBIZWFkZXJzICovLApAQCAtMTQwODMsNiArMTQwODUsNyBA
QAogCQkJCUJDODI0MzI5MEQwQ0U4QTIwMDQ2MEM4RiAvKiBKU1NRTEVycm9yLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCQzgyNDMyQTBEMENFOEEyMDA0NjBDOEYgLyogSlNTUUxUcmFuc2FjdGlvbi5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJQkM4MjQzMkMwRDBDRThBMjAwNDYwQzhGIC8qIEpTVm9pZENh
bGxiYWNrLmggaW4gSGVhZGVycyAqLywKKwkJCQlCQzgyNDNFOTBEMENGRDc1MDA0NjBDOEYgLyog
V2luZG93RmVhdHVyZXMuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBs
b3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMTU3OTIsNiArMTU3OTUsNyBAQAog
CQkJCUIyNTU5OUJCMEQwMEQ4QkEwMEJCODI1QyAvKiBTVkdSZXNvdXJjZU1hc2tlci5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQk5MzgzMUI1NzBEMDg3RDYwMDBFNUM5ODQgLyogRXhjZXB0aW9uQ29k
ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQzgyNDMyQjBEMENFOEEyMDA0NjBDOEYgLyogSlNW
b2lkQ2FsbGJhY2suY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQkM4MjQzRTgwRDBDRkQ3NTAwNDYw
QzhGIC8qIFdpbmRvd0ZlYXR1cmVzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9u
bHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy9qcy9ranNfd2luZG93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L2pzL2tqc193aW5kb3cuY3BwCShyZXZpc2lvbiAyODU4OSkKKysrIFdlYkNvcmUvYmluZGluZ3Mv
anMva2pzX3dpbmRvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwNiwxNyArMTA2LDE3IEBAIHB1
YmxpYzoKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCB+RE9NV2luZG93VGltZXIoKSAKLSAg
ICB7IAorICAgIHZpcnR1YWwgfkRPTVdpbmRvd1RpbWVyKCkKKyAgICB7CiAgICAgICAgIEpTTG9j
ayBsb2NrOwotICAgICAgICBkZWxldGUgbV9hY3Rpb247IAorICAgICAgICBkZWxldGUgbV9hY3Rp
b247CiAgICAgfQogCiAgICAgaW50IHRpbWVvdXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1fdGltZW91
dElkOyB9Ci0gICAgCisKICAgICBpbnQgbmVzdGluZ0xldmVsKCkgY29uc3QgeyByZXR1cm4gbV9u
ZXN0aW5nTGV2ZWw7IH0KICAgICB2b2lkIHNldE5lc3RpbmdMZXZlbChpbnQgbikgeyBtX25lc3Rp
bmdMZXZlbCA9IG47IH0KLSAgICAKKwogICAgIFNjaGVkdWxlZEFjdGlvbiogYWN0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9hY3Rpb247IH0KICAgICBTY2hlZHVsZWRBY3Rpb24qIHRha2VBY3Rpb24o
KSB7IFNjaGVkdWxlZEFjdGlvbiogYSA9IG1fYWN0aW9uOyBtX2FjdGlvbiA9IDA7IHJldHVybiBh
OyB9CiAKQEAgLTMyNCwzOSArMzI0LDExIEBAIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5n
PiBwYXJzZU1vZGEKICAgICByZXR1cm4gbWFwOwogfQogCi1zdGF0aWMgYm9vbCBib29sRmVhdHVy
ZShjb25zdCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiYgZmVhdHVyZXMsIGNvbnN0IGNoYXIqIGtl
eSwgYm9vbCBkZWZhdWx0VmFsdWUgPSBmYWxzZSkKLXsKLSAgICBIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5maW5kKGtleSk7Ci0gICAgaWYgKGl0
ID09IGZlYXR1cmVzLmVuZCgpKQotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIGNv
bnN0IFN0cmluZyYgdmFsdWUgPSBpdC0+c2Vjb25kOwotICAgIHJldHVybiB2YWx1ZS5pc051bGwo
KSB8fCB2YWx1ZSA9PSAiMSIgfHwgdmFsdWUgPT0gInllcyIgfHwgdmFsdWUgPT0gIm9uIjsKLX0K
LQotc3RhdGljIGZsb2F0IGZsb2F0RmVhdHVyZShjb25zdCBIYXNoTWFwPFN0cmluZywgU3RyaW5n
PiYgZmVhdHVyZXMsIGNvbnN0IGNoYXIqIGtleSwgZmxvYXQgbWluLCBmbG9hdCBtYXgsIGZsb2F0
IGRlZmF1bHRWYWx1ZSkKLXsKLSAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPjo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBmZWF0dXJlcy5maW5kKGtleSk7Ci0gICAgaWYgKGl0ID09IGZlYXR1cmVzLmVu
ZCgpKQotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIC8vIEZJWE1FOiBDYW4ndCBk
aXN0aW5ndWlzaCAiMHEiIGZyb20gc3RyaW5nIHdpdGggbm8gZGlnaXRzIGluIGl0IC0tIGJvdGgg
cmV0dXJuIGQgPT0gMCBhbmQgb2sgPT0gZmFsc2UuCi0gICAgLy8gV291bGQgYmUgZ29vZCB0byB0
ZWxsIHRoZW0gYXBhcnQgc29tZWhvdyBzaW5jZSBzdHJpbmcgd2l0aCBubyBkaWdpdHMgc2hvdWxk
IGJlIGRlZmF1bHQgdmFsdWUgYW5kCi0gICAgLy8gIjBxIiBzaG91bGQgYmUgbWluaW11bSB2YWx1
ZS4KLSAgICBib29sIG9rOwotICAgIGRvdWJsZSBkID0gaXQtPnNlY29uZC50b0RvdWJsZSgmb2sp
OwotICAgIGlmICgoZCA9PSAwICYmICFvaykgfHwgaXNuYW4oZCkpCi0gICAgICAgIHJldHVybiBk
ZWZhdWx0VmFsdWU7Ci0gICAgaWYgKGQgPCBtaW4gfHwgbWF4IDw9IG1pbikKLSAgICAgICAgcmV0
dXJuIG1pbjsKLSAgICBpZiAoZCA+IG1heCkKLSAgICAgICAgcmV0dXJuIG1heDsKLSAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8aW50PihkKTsKLX0KLQogc3RhdGljIEZyYW1lKiBjcmVhdGVXaW5kb3co
RXhlY1N0YXRlKiBleGVjLCBGcmFtZSogb3BlbmVyRnJhbWUsIGNvbnN0IFN0cmluZyYgdXJsLAog
ICAgIGNvbnN0IFN0cmluZyYgZnJhbWVOYW1lLCBjb25zdCBXaW5kb3dGZWF0dXJlcyYgd2luZG93
RmVhdHVyZXMsIEpTVmFsdWUqIGRpYWxvZ0FyZ3MpCiB7CiAgICAgRnJhbWUqIGFjdGl2ZUZyYW1l
ID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOwotICAgIAor
CiAgICAgUmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3Q7CiAgICAgaWYgKGFjdGl2ZUZyYW1lKQogICAg
ICAgICByZXF1ZXN0LnNldEhUVFBSZWZlcnJlcihhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdv
aW5nUmVmZXJyZXIoKSk7CkBAIC0zNzcsMTUgKzM0OSwxNSBAQCBzdGF0aWMgRnJhbWUqIGNyZWF0
ZVdpbmRvdyhFeGVjU3RhdGUqIGV4CiAgICAgbmV3RnJhbWUtPmxvYWRlcigpLT5zZXRPcGVuZXIo
b3BlbmVyRnJhbWUpOwogICAgIG5ld0ZyYW1lLT5sb2FkZXIoKS0+c2V0T3BlbmVkQnlET00oKTsK
IAotICAgIFdpbmRvdyogbmV3V2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdpbmRvdyhuZXdGcmFt
ZSk7ICAgIAotICAgIAorICAgIFdpbmRvdyogbmV3V2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdp
bmRvdyhuZXdGcmFtZSk7CisKICAgICBpZiAoZGlhbG9nQXJncykKICAgICAgICAgbmV3V2luZG93
LT5wdXREaXJlY3QoImRpYWxvZ0FyZ3VtZW50cyIsIGRpYWxvZ0FyZ3MpOwogCiAgICAgaWYgKCF1
cmwuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkgfHwgbmV3V2luZG93LT5hbGxvd3NB
Y2Nlc3NGcm9tKGV4ZWMpKSB7CiAgICAgICAgIFN0cmluZyBjb21wbGV0ZWRVUkwgPSB1cmwuaXNF
bXB0eSgpID8gdXJsIDogYWN0aXZlRnJhbWUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybCk7
CiAgICAgICAgIGJvb2wgdXNlckdlc3R1cmUgPSBhY3RpdmVGcmFtZS0+c2NyaXB0UHJveHkoKS0+
cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCk7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChjcmVhdGVk
KSB7CiAgICAgICAgICAgICBuZXdGcmFtZS0+bG9hZGVyKCktPmNoYW5nZUxvY2F0aW9uKEtVUkwo
Y29tcGxldGVkVVJMLmRlcHJlY2F0ZWRTdHJpbmcoKSksIGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+
b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1cmUpOwogICAgICAgICAgICAgaWYg
KERvY3VtZW50KiBvbGREb2MgPSBvcGVuZXJGcmFtZS0+ZG9jdW1lbnQoKSkgewpAQCAtMzk1LDcg
KzM2Nyw3IEBAIHN0YXRpYyBGcmFtZSogY3JlYXRlV2luZG93KEV4ZWNTdGF0ZSogZXgKICAgICAg
ICAgfSBlbHNlIGlmICghdXJsLmlzRW1wdHkoKSkKICAgICAgICAgICAgIG5ld0ZyYW1lLT5sb2Fk
ZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVUkwsIGFjdGl2ZUZyYW1lLT5s
b2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1cmUpOwogICAgIH0K
LSAgICAKKwogICAgIHJldHVybiBuZXdGcmFtZTsKIH0KIApAQCAtNDI2LDI2ICszOTgsMjYgQEAg
c3RhdGljIEpTVmFsdWUqIHNob3dNb2RhbERpYWxvZyhFeGVjU3RhdAogICAgIC8vIC0gZGVmYXVs
dCBmb250IHNldHRpbmdzCiAgICAgLy8gLSB3aWR0aCwgaGVpZ2h0LCBsZWZ0LCBhbmQgdG9wIHNw
ZWNpZmllZCBpbiB1bml0cyBvdGhlciB0aGFuICJweCIKICAgICAvLyAtIGVkZ2UgKHN1bmtlbiBv
ciByYWlzZWQsIGRlZmF1bHQgaXMgcmFpc2VkKQotICAgIC8vIC0gZGlhbG9nSGlkZTogdHJ1c3Rl
ZCAmJiBib29sRmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ2hpZGUiKSwgbWFrZXMgZGlhbG9nIGhp
ZGUgd2hlbiB5b3UgcHJpbnQKLSAgICAvLyAtIGhlbHA6IGJvb2xGZWF0dXJlKGZlYXR1cmVzLCAi
aGVscCIsIHRydWUpLCBtYWtlcyBoZWxwIGljb24gYXBwZWFyIGluIGRpYWxvZyAod2hhdCBkb2Vz
IGl0IGRvIG9uIFdpbmRvd3M/KQotICAgIC8vIC0gdW5hZG9ybmVkOiB0cnVzdGVkICYmIGJvb2xG
ZWF0dXJlKGZlYXR1cmVzLCAidW5hZG9ybmVkIik7CisgICAgLy8gLSBkaWFsb2dIaWRlOiB0cnVz
dGVkICYmIFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ2hpZGUi
KSwgbWFrZXMgZGlhbG9nIGhpZGUgd2hlbiB5b3UgcHJpbnQKKyAgICAvLyAtIGhlbHA6IFdpbmRv
d0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgImhlbHAiLCB0cnVlKSwgbWFrZXMgaGVs
cCBpY29uIGFwcGVhciBpbiBkaWFsb2cgKHdoYXQgZG9lcyBpdCBkbyBvbiBXaW5kb3dzPykKKyAg
ICAvLyAtIHVuYWRvcm5lZDogdHJ1c3RlZCAmJiBXaW5kb3dGZWF0dXJlczo6Ym9vbEZlYXR1cmUo
ZmVhdHVyZXMsICJ1bmFkb3JuZWQiKTsKICAgICBpZiAoIWZyYW1lKQogICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKIAogICAgIEZsb2F0UmVjdCBzY3JlZW5SZWN0ID0gc2NyZWVuQXZhaWxh
YmxlUmVjdChmcmFtZS0+dmlldygpKTsKIAogICAgIFdpbmRvd0ZlYXR1cmVzIHdhcmdzOwotICAg
IHdhcmdzLndpZHRoID0gZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9nd2lkdGgiLCAxMDAs
IHNjcmVlblJlY3Qud2lkdGgoKSwgNjIwKTsgLy8gZGVmYXVsdCBoZXJlIGNhbWUgZnJvbSBmcmFt
ZSBzaXplIG9mIGRpYWxvZyBpbiBNYWNJRQorICAgIHdhcmdzLndpZHRoID0gV2luZG93RmVhdHVy
ZXM6OmZsb2F0RmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ3dpZHRoIiwgMTAwLCBzY3JlZW5SZWN0
LndpZHRoKCksIDYyMCk7IC8vIGRlZmF1bHQgaGVyZSBjYW1lIGZyb20gZnJhbWUgc2l6ZSBvZiBk
aWFsb2cgaW4gTWFjSUUKICAgICB3YXJncy53aWR0aFNldCA9IHRydWU7Ci0gICAgd2FyZ3MuaGVp
Z2h0ID0gZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9naGVpZ2h0IiwgMTAwLCBzY3JlZW5S
ZWN0LmhlaWdodCgpLCA0NTApOyAvLyBkZWZhdWx0IGhlcmUgY2FtZSBmcm9tIGZyYW1lIHNpemUg
b2YgZGlhbG9nIGluIE1hY0lFCisgICAgd2FyZ3MuaGVpZ2h0ID0gV2luZG93RmVhdHVyZXM6OmZs
b2F0RmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ2hlaWdodCIsIDEwMCwgc2NyZWVuUmVjdC5oZWln
aHQoKSwgNDUwKTsgLy8gZGVmYXVsdCBoZXJlIGNhbWUgZnJvbSBmcmFtZSBzaXplIG9mIGRpYWxv
ZyBpbiBNYWNJRQogICAgIHdhcmdzLmhlaWdodFNldCA9IHRydWU7CiAKLSAgICB3YXJncy54ID0g
ZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9nbGVmdCIsIHNjcmVlblJlY3QueCgpLCBzY3Jl
ZW5SZWN0LnJpZ2h0KCkgLSB3YXJncy53aWR0aCwgLTEpOworICAgIHdhcmdzLnggPSBXaW5kb3dG
ZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9nbGVmdCIsIHNjcmVlblJlY3Qu
eCgpLCBzY3JlZW5SZWN0LnJpZ2h0KCkgLSB3YXJncy53aWR0aCwgLTEpOwogICAgIHdhcmdzLnhT
ZXQgPSB3YXJncy54ID4gMDsKLSAgICB3YXJncy55ID0gZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAi
ZGlhbG9ndG9wIiwgc2NyZWVuUmVjdC55KCksIHNjcmVlblJlY3QuYm90dG9tKCkgLSB3YXJncy5o
ZWlnaHQsIC0xKTsKKyAgICB3YXJncy55ID0gV2luZG93RmVhdHVyZXM6OmZsb2F0RmVhdHVyZShm
ZWF0dXJlcywgImRpYWxvZ3RvcCIsIHNjcmVlblJlY3QueSgpLCBzY3JlZW5SZWN0LmJvdHRvbSgp
IC0gd2FyZ3MuaGVpZ2h0LCAtMSk7CiAgICAgd2FyZ3MueVNldCA9IHdhcmdzLnkgPiAwOwogCi0g
ICAgaWYgKGJvb2xGZWF0dXJlKGZlYXR1cmVzLCAiY2VudGVyIiwgdHJ1ZSkpIHsKKyAgICBpZiAo
V2luZG93RmVhdHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVzLCAiY2VudGVyIiwgdHJ1ZSkpIHsK
ICAgICAgICAgaWYgKCF3YXJncy54U2V0KSB7CiAgICAgICAgICAgICB3YXJncy54ID0gc2NyZWVu
UmVjdC54KCkgKyAoc2NyZWVuUmVjdC53aWR0aCgpIC0gd2FyZ3Mud2lkdGgpIC8gMjsKICAgICAg
ICAgICAgIHdhcmdzLnhTZXQgPSB0cnVlOwpAQCAtNDU3LDE0ICs0MjksMTQgQEAgc3RhdGljIEpT
VmFsdWUqIHNob3dNb2RhbERpYWxvZyhFeGVjU3RhdAogICAgIH0KIAogICAgIHdhcmdzLmRpYWxv
ZyA9IHRydWU7Ci0gICAgd2FyZ3MucmVzaXphYmxlID0gYm9vbEZlYXR1cmUoZmVhdHVyZXMsICJy
ZXNpemFibGUiKTsKLSAgICB3YXJncy5zY3JvbGxiYXJzVmlzaWJsZSA9IGJvb2xGZWF0dXJlKGZl
YXR1cmVzLCAic2Nyb2xsIiwgdHJ1ZSk7Ci0gICAgd2FyZ3Muc3RhdHVzQmFyVmlzaWJsZSA9IGJv
b2xGZWF0dXJlKGZlYXR1cmVzLCAic3RhdHVzIiwgIXRydXN0ZWQpOworICAgIHdhcmdzLnJlc2l6
YWJsZSA9IFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgInJlc2l6YWJsZSIp
OworICAgIHdhcmdzLnNjcm9sbGJhcnNWaXNpYmxlID0gV2luZG93RmVhdHVyZXM6OmJvb2xGZWF0
dXJlKGZlYXR1cmVzLCAic2Nyb2xsIiwgdHJ1ZSk7CisgICAgd2FyZ3Muc3RhdHVzQmFyVmlzaWJs
ZSA9IFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgInN0YXR1cyIsICF0cnVz
dGVkKTsKICAgICB3YXJncy5tZW51QmFyVmlzaWJsZSA9IGZhbHNlOwogICAgIHdhcmdzLnRvb2xC
YXJWaXNpYmxlID0gZmFsc2U7CiAgICAgd2FyZ3MubG9jYXRpb25CYXJWaXNpYmxlID0gZmFsc2U7
CiAgICAgd2FyZ3MuZnVsbHNjcmVlbiA9IGZhbHNlOwotICAgIAorCiAgICAgRnJhbWUqIGRpYWxv
Z0ZyYW1lID0gY3JlYXRlV2luZG93KGV4ZWMsIGZyYW1lLCB1cmwsICIiLCB3YXJncywgZGlhbG9n
QXJncyk7CiAgICAgaWYgKCFkaWFsb2dGcmFtZSkKICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVk
KCk7CkBAIC02NjEsNyArNjMzLDcgQEAgYm9vbCBXaW5kb3c6OmdldE93blByb3BlcnR5U2xvdChF
eGVjU3RhdAogCiAgIC8vIEZJWE1FOiBTZWFyY2ggdGhlIHdob2xlIGZyYW1lIGhpZXJhY2h5IHNv
bWV3aGVyZSBhcm91bmQgaGVyZS4KICAgLy8gV2UgbmVlZCB0byB0ZXN0IHRoZSBjb3JyZWN0IHBy
aW9yaXR5IG9yZGVyLgotICAKKwogICAvLyBhbGxvdyB3aW5kb3dbMV0gb3IgcGFyZW50WzFdIGV0
Yy4gKCM1Njk4MykKICAgYm9vbCBvazsKICAgdW5zaWduZWQgaSA9IHByb3BlcnR5TmFtZS50b0Fy
cmF5SW5kZXgoJm9rKTsKQEAgLTg0MCw3ICs4MTIsNyBAQCBib29sIFdpbmRvdzo6YWxsb3dzQWNj
ZXNzRnJvbShjb25zdCBKU0dsCiAKICAgICBpZiAob3JpZ2luRnJhbWUgPT0gdGFyZ2V0RnJhbWUp
CiAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAKKwogICAgIFdlYkNvcmU6OkRvY3VtZW50
KiB0YXJnZXREb2N1bWVudCA9IHRhcmdldEZyYW1lLT5kb2N1bWVudCgpOwogCiAgICAgLy8gSlMg
bWF5IGJlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSAid2luZG93IiBvYmplY3QsIHdoaWNoIHNo
b3VsZCBiZSB2YWxpZCwKQEAgLTg3MCw3ICs4NDIsNiBAQCBib29sIFdpbmRvdzo6YWxsb3dzQWNj
ZXNzRnJvbShjb25zdCBKU0dsCiAgICAgfQogCiAgICAgcmV0dXJuIGZhbHNlOwotICAgIAogfQog
CiBFeGVjU3RhdGUqIFdpbmRvdzo6Z2xvYmFsRXhlYygpCkBAIC04ODksOSArODYwLDkgQEAgYm9v
bCBXaW5kb3c6OnNob3VsZEludGVycnVwdFNjcmlwdCgpIGNvbgogCiAgICAgLy8gU2VlIDxyZGFy
Oi8vcHJvYmxlbS81NDc5NDQzPi4gV2UgZG9uJ3QgdGhpbmsgdGhhdCBwYWdlIGNhbiBldmVyIGJl
IE5VTEwKICAgICAvLyBpbiB0aGlzIGNhc2UsIGJ1dCBpZiBpdCBpcywgd2UndmUgZ290dGVuIGlu
dG8gYSBzdGF0ZSB3aGVyZSB3ZSBtYXkgaGF2ZQotICAgIC8vIGh1bmcgdGhlIFVJLCB3aXRoIG5v
IHdheSB0byBhc2sgdGhlIGNsaWVudCB3aGV0aGVyIHRvIGNhbmNlbCBleGVjdXRpb24uIAotICAg
IC8vIEZvciBub3csIG91ciBzb2x1dGlvbiBpcyBqdXN0IHRvIGNhbmNlbCBleGVjdXRpb24gbm8g
bWF0dGVyIHdoYXQsIAotICAgIC8vIGVuc3VyaW5nIHRoYXQgd2UgbmV2ZXIgaGFuZy4gV2UgbWln
aHQgd2FudCB0byBjb25zaWRlciBvdGhlciBzb2x1dGlvbnMgCisgICAgLy8gaHVuZyB0aGUgVUks
IHdpdGggbm8gd2F5IHRvIGFzayB0aGUgY2xpZW50IHdoZXRoZXIgdG8gY2FuY2VsIGV4ZWN1dGlv
bi4KKyAgICAvLyBGb3Igbm93LCBvdXIgc29sdXRpb24gaXMganVzdCB0byBjYW5jZWwgZXhlY3V0
aW9uIG5vIG1hdHRlciB3aGF0LAorICAgIC8vIGVuc3VyaW5nIHRoYXQgd2UgbmV2ZXIgaGFuZy4g
V2UgbWlnaHQgd2FudCB0byBjb25zaWRlciBvdGhlciBzb2x1dGlvbnMKICAgICAvLyBpZiB3ZSBk
aXNjb3ZlciBwcm9ibGVtcyB3aXRoIHRoaXMgb25lLgogICAgIEFTU0VSVChwYWdlKTsKICAgICBp
ZiAoIXBhZ2UpCkBAIC0xMDA0LDEzNSArOTc1LDYgQEAgRXZlbnQqIFdpbmRvdzo6Y3VycmVudEV2
ZW50KCkKICAgICByZXR1cm4gZC0+bV9ldnQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNldFdpbmRvd0Zl
YXR1cmUoY29uc3QgU3RyaW5nJiBrZXlTdHJpbmcsIGNvbnN0IFN0cmluZyYgdmFsdWVTdHJpbmcs
IFdpbmRvd0ZlYXR1cmVzJiB3aW5kb3dGZWF0dXJlcykKLXsKLSAgICBpbnQgdmFsdWU7Ci0gICAg
Ci0gICAgaWYgKHZhbHVlU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgLy8gbGlzdGluZyBhIGtleSB3
aXRoIG5vIHZhbHVlIGlzIHNob3J0aGFuZCBmb3Iga2V5PXllcwotICAgICAgICB2YWx1ZVN0cmlu
ZyA9PSAieWVzIikKLSAgICAgICAgdmFsdWUgPSAxOwotICAgIGVsc2UKLSAgICAgICAgdmFsdWUg
PSB2YWx1ZVN0cmluZy50b0ludCgpOwotCi0gICAgLy8gV2UgaWdub3JlIGEga2V5U3RyaW5nIG9m
ICJyZXNpemFibGUiLCB3aGljaCBpcyBjb25zaXN0ZW50IHdpdGggRmlyZWZveC4KLSAgICBpZiAo
a2V5U3RyaW5nID09ICJsZWZ0IiB8fCBrZXlTdHJpbmcgPT0gInNjcmVlbngiKSB7Ci0gICAgICAg
IHdpbmRvd0ZlYXR1cmVzLnhTZXQgPSB0cnVlOwotICAgICAgICB3aW5kb3dGZWF0dXJlcy54ID0g
dmFsdWU7Ci0gICAgfSBlbHNlIGlmIChrZXlTdHJpbmcgPT0gInRvcCIgfHwga2V5U3RyaW5nID09
ICJzY3JlZW55IikgewotICAgICAgICB3aW5kb3dGZWF0dXJlcy55U2V0ID0gdHJ1ZTsKLSAgICAg
ICAgd2luZG93RmVhdHVyZXMueSA9IHZhbHVlOwotICAgIH0gZWxzZSBpZiAoa2V5U3RyaW5nID09
ICJ3aWR0aCIgfHwga2V5U3RyaW5nID09ICJpbm5lcndpZHRoIikgewotICAgICAgICB3aW5kb3dG
ZWF0dXJlcy53aWR0aFNldCA9IHRydWU7Ci0gICAgICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRoID0g
dmFsdWU7Ci0gICAgfSBlbHNlIGlmIChrZXlTdHJpbmcgPT0gImhlaWdodCIgfHwga2V5U3RyaW5n
ID09ICJpbm5lcmhlaWdodCIpIHsKLSAgICAgICAgd2luZG93RmVhdHVyZXMuaGVpZ2h0U2V0ID0g
dHJ1ZTsKLSAgICAgICAgd2luZG93RmVhdHVyZXMuaGVpZ2h0ID0gdmFsdWU7Ci0gICAgfSBlbHNl
IGlmIChrZXlTdHJpbmcgPT0gIm1lbnViYXIiKQotICAgICAgICB3aW5kb3dGZWF0dXJlcy5tZW51
QmFyVmlzaWJsZSA9IHZhbHVlOwotICAgIGVsc2UgaWYgKGtleVN0cmluZyA9PSAidG9vbGJhciIp
Ci0gICAgICAgIHdpbmRvd0ZlYXR1cmVzLnRvb2xCYXJWaXNpYmxlID0gdmFsdWU7Ci0gICAgZWxz
ZSBpZiAoa2V5U3RyaW5nID09ICJsb2NhdGlvbiIpCi0gICAgICAgIHdpbmRvd0ZlYXR1cmVzLmxv
Y2F0aW9uQmFyVmlzaWJsZSA9IHZhbHVlOwotICAgIGVsc2UgaWYgKGtleVN0cmluZyA9PSAic3Rh
dHVzIikKLSAgICAgICAgd2luZG93RmVhdHVyZXMuc3RhdHVzQmFyVmlzaWJsZSA9IHZhbHVlOwot
ICAgIGVsc2UgaWYgKGtleVN0cmluZyA9PSAiZnVsbHNjcmVlbiIpCi0gICAgICAgIHdpbmRvd0Zl
YXR1cmVzLmZ1bGxzY3JlZW4gPSB2YWx1ZTsKLSAgICBlbHNlIGlmIChrZXlTdHJpbmcgPT0gInNj
cm9sbGJhcnMiKQotICAgICAgICB3aW5kb3dGZWF0dXJlcy5zY3JvbGxiYXJzVmlzaWJsZSA9IHZh
bHVlOwotfQotCi0vLyBUaG91Z2ggaXNzcGFjZSgpIGNvbnNpZGVycyBcdCBhbmQgXHYgdG8gYmUg
d2hpdGVzcGFjZSwgV2luIElFIGRvZXNuJ3QuCi1zdGF0aWMgYm9vbCBpc1NlcGFyYXRvcig6OlVD
aGFyIGMpCi17Ci0gICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicg
fHwgYyA9PSAnXHInIHx8IGMgPT0gJz0nIHx8IGMgPT0gJywnIHx8IGMgPT0gJ1wwJzsKLX0KLQot
c3RhdGljIHZvaWQgcGFyc2VXaW5kb3dGZWF0dXJlcyhjb25zdCBTdHJpbmcmIGZlYXR1cmVzLCBX
aW5kb3dGZWF0dXJlcyYgd2luZG93RmVhdHVyZXMpCi17Ci0gICAgLyoKLSAgICAgVGhlIElFIHJ1
bGUgaXM6IGFsbCBmZWF0dXJlcyBleGNlcHQgZm9yIGNoYW5uZWxtb2RlIGFuZCBmdWxsc2NyZWVu
IGRlZmF1bHQgdG8gWUVTLCBidXQKLSAgICAgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEgZmVhdHVy
ZSBzdHJpbmcsIGFsbCBmZWF0dXJlcyBkZWZhdWx0IHRvIE5PLiAoVGhlcmUgaXMgbm8gcHVibGlj
Ci0gICAgIHN0YW5kYXJkIHRoYXQgYXBwbGllcyB0byB0aGlzIG1ldGhvZC4pCi0gICAgIAotICAg
ICA8aHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS93b3Jrc2hvcC9hdXRob3IvZGh0bWwvcmVmZXJl
bmNlL21ldGhvZHMvb3Blbl8wLmFzcD4KLSAgICAgV2UgYWx3YXlzIGFsbG93IGEgd2luZG93IHRv
IGJlIHJlc2l6ZWQsIHdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aCBGaXJlZm94LgotICAgICAqLwot
ICAgIAotICAgIHdpbmRvd0ZlYXR1cmVzLmRpYWxvZyA9IGZhbHNlOwotICAgIHdpbmRvd0ZlYXR1
cmVzLmZ1bGxzY3JlZW4gPSBmYWxzZTsKLSAgICAKLSAgICB3aW5kb3dGZWF0dXJlcy54U2V0ID0g
ZmFsc2U7Ci0gICAgd2luZG93RmVhdHVyZXMueVNldCA9IGZhbHNlOwotICAgIHdpbmRvd0ZlYXR1
cmVzLndpZHRoU2V0ID0gZmFsc2U7Ci0gICAgd2luZG93RmVhdHVyZXMuaGVpZ2h0U2V0ID0gZmFs
c2U7Ci0gICAgCi0gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgd2lu
ZG93RmVhdHVyZXMubWVudUJhclZpc2libGUgPSB0cnVlOwotICAgICAgICB3aW5kb3dGZWF0dXJl
cy5zdGF0dXNCYXJWaXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgd2luZG93RmVhdHVyZXMudG9vbEJh
clZpc2libGUgPSB0cnVlOwotICAgICAgICB3aW5kb3dGZWF0dXJlcy5sb2NhdGlvbkJhclZpc2li
bGUgPSB0cnVlOwotICAgICAgICB3aW5kb3dGZWF0dXJlcy5zY3JvbGxiYXJzVmlzaWJsZSA9IHRy
dWU7Ci0gICAgICAgIHdpbmRvd0ZlYXR1cmVzLnJlc2l6YWJsZSA9IHRydWU7Ci0gICAgICAgIAot
ICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHdpbmRvd0ZlYXR1cmVzLm1lbnVCYXJW
aXNpYmxlID0gZmFsc2U7Ci0gICAgd2luZG93RmVhdHVyZXMuc3RhdHVzQmFyVmlzaWJsZSA9IGZh
bHNlOwotICAgIHdpbmRvd0ZlYXR1cmVzLnRvb2xCYXJWaXNpYmxlID0gZmFsc2U7Ci0gICAgd2lu
ZG93RmVhdHVyZXMubG9jYXRpb25CYXJWaXNpYmxlID0gZmFsc2U7Ci0gICAgd2luZG93RmVhdHVy
ZXMuc2Nyb2xsYmFyc1Zpc2libGUgPSBmYWxzZTsKLSAgICB3aW5kb3dGZWF0dXJlcy5yZXNpemFi
bGUgPSB0cnVlOwotICAgIAotICAgIC8vIFRyZWFkIGxpZ2h0bHkgaW4gdGhpcyBjb2RlIC0tIGl0
IHdhcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gbWltaWMgV2luIElFJ3MgcGFyc2luZyBiZWhh
dmlvci4KLSAgICBpbnQga2V5QmVnaW4sIGtleUVuZDsKLSAgICBpbnQgdmFsdWVCZWdpbiwgdmFs
dWVFbmQ7Ci0gICAgCi0gICAgaW50IGkgPSAwOwotICAgIGludCBsZW5ndGggPSBmZWF0dXJlcy5s
ZW5ndGgoKTsKLSAgICBTdHJpbmcgYnVmZmVyID0gZmVhdHVyZXMubG93ZXIoKTsKLSAgICB3aGls
ZSAoaSA8IGxlbmd0aCkgewotICAgICAgICAvLyBza2lwIHRvIGZpcnN0IG5vbi1zZXBhcmF0b3Is
IGJ1dCBkb24ndCBza2lwIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCi0gICAgICAgIHdoaWxl
IChpc1NlcGFyYXRvcihidWZmZXJbaV0pKSB7Ci0gICAgICAgICAgICBpZiAoaSA+PSBsZW5ndGgp
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAg
ICAgICAga2V5QmVnaW4gPSBpOwotICAgICAgICAKLSAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBz
ZXBhcmF0b3IKLSAgICAgICAgd2hpbGUgKCFpc1NlcGFyYXRvcihidWZmZXJbaV0pKQotICAgICAg
ICAgICAgaSsrOwotICAgICAgICBrZXlFbmQgPSBpOwotICAgICAgICAKLSAgICAgICAgLy8gc2tp
cCB0byBmaXJzdCAnPScsIGJ1dCBkb24ndCBza2lwIHBhc3QgYSAnLCcgb3IgdGhlIGVuZCBvZiB0
aGUgc3RyaW5nCi0gICAgICAgIHdoaWxlIChidWZmZXJbaV0gIT0gJz0nKSB7Ci0gICAgICAgICAg
ICBpZiAoYnVmZmVyW2ldID09ICcsJyB8fCBpID49IGxlbmd0aCkKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8g
c2tpcCB0byBmaXJzdCBub24tc2VwYXJhdG9yLCBidXQgZG9uJ3Qgc2tpcCBwYXN0IGEgJywnIG9y
IHRoZSBlbmQgb2YgdGhlIHN0cmluZwotICAgICAgICB3aGlsZSAoaXNTZXBhcmF0b3IoYnVmZmVy
W2ldKSkgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAnLCcgfHwgaSA+PSBsZW5ndGgp
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAg
ICAgICAgdmFsdWVCZWdpbiA9IGk7Ci0gICAgICAgIAotICAgICAgICAvLyBza2lwIHRvIGZpcnN0
IHNlcGFyYXRvcgotICAgICAgICB3aGlsZSAoIWlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpCi0gICAg
ICAgICAgICBpKys7Ci0gICAgICAgIHZhbHVlRW5kID0gaTsKLSAgICAgICAgCi0gICAgICAgIEFT
U0VSVChpIDw9IGxlbmd0aCk7Ci0KLSAgICAgICAgU3RyaW5nIGtleVN0cmluZyhidWZmZXIuc3Vi
c3RyaW5nKGtleUJlZ2luLCBrZXlFbmQgLSBrZXlCZWdpbikpOwotICAgICAgICBTdHJpbmcgdmFs
dWVTdHJpbmcoYnVmZmVyLnN1YnN0cmluZyh2YWx1ZUJlZ2luLCB2YWx1ZUVuZCAtIHZhbHVlQmVn
aW4pKTsKLSAgICAgICAgc2V0V2luZG93RmVhdHVyZShrZXlTdHJpbmcsIHZhbHVlU3RyaW5nLCB3
aW5kb3dGZWF0dXJlcyk7Ci0gICAgfQotfQotCiBKU1ZhbHVlKiBXaW5kb3dQcm90b0Z1bmNBVG9C
OjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25z
dCBMaXN0JiBhcmdzKQogewogICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJldpbmRvdzo6aW5m
bykpCkBAIC0xMTQ0LDcgKzk4Niw3IEBAIEpTVmFsdWUqIFdpbmRvd1Byb3RvRnVuY0FUb0I6OmNh
bGxBc0Z1bmMKICAgICBKU1ZhbHVlKiB2ID0gYXJnc1swXTsKICAgICBpZiAodi0+aXNOdWxsKCkp
CiAgICAgICAgIHJldHVybiBqc1N0cmluZygpOwotICAgIAorCiAgICAgVVN0cmluZyBzID0gdi0+
dG9TdHJpbmcoZXhlYyk7CiAgICAgaWYgKCFzLmlzOEJpdCgpKSB7CiAgICAgICAgIHNldERPTUV4
Y2VwdGlvbihleGVjLCBJTlZBTElEX0NIQVJBQ1RFUl9FUlIpOwpAQCAtMTIxMiw3ICsxMDU0LDcg
QEAgSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jT3Blbjo6Y2FsbEFzRnVuYwogICAgIGlmICghYWxs
b3dQb3BVcChmcmFtZSkgJiYgKGZyYW1lTmFtZS5pc0VtcHR5KCkgfHwgIWZyYW1lLT50cmVlKCkt
PmZpbmQoZnJhbWVOYW1lKSkpCiAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwogCi0gICAg
Ly8gR2V0IHRoZSB0YXJnZXQgZnJhbWUgZm9yIHRoZSBzcGVjaWFsIGNhc2VzIG9mIF90b3AgYW5k
IF9wYXJlbnQuICBJbiB0aG9zZSAKKyAgICAvLyBHZXQgdGhlIHRhcmdldCBmcmFtZSBmb3IgdGhl
IHNwZWNpYWwgY2FzZXMgb2YgX3RvcCBhbmQgX3BhcmVudC4gIEluIHRob3NlCiAgICAgLy8gY2Fz
ZXMsIHdlIGNhbiBzY2hlZHVsZSBhIGxvY2F0aW9uIGNoYW5nZSByaWdodCBub3cgYW5kIHJldHVy
biBlYXJseS4KICAgICBib29sIHRvcE9yUGFyZW50ID0gZmFsc2U7CiAgICAgaWYgKGZyYW1lTmFt
ZSA9PSAiX3RvcCIpIHsKQEAgLTEyMzcsMTEgKzEwNzksOSBAQCBKU1ZhbHVlKiBXaW5kb3dQcm90
b0Z1bmNPcGVuOjpjYWxsQXNGdW5jCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFdpbmRvdzo6
cmV0cmlldmUoZnJhbWUpOwogICAgIH0KLSAgICAKKwogICAgIC8vIEluIHRoZSBjYXNlIG9mIGEg
bmFtZWQgZnJhbWUgb3IgYSBuZXcgd2luZG93LCB3ZSdsbCB1c2UgdGhlIGNyZWF0ZVdpbmRvdygp
IGhlbHBlcgotICAgIFdpbmRvd0ZlYXR1cmVzIHdpbmRvd0ZlYXR1cmVzOwotICAgIFN0cmluZyBm
ZWF0dXJlcyA9IHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JOdWxsQ2hlY2soZXhlYywgYXJn
c1syXSk7Ci0gICAgcGFyc2VXaW5kb3dGZWF0dXJlcyhmZWF0dXJlcywgd2luZG93RmVhdHVyZXMp
OworICAgIFdpbmRvd0ZlYXR1cmVzIHdpbmRvd0ZlYXR1cmVzKHZhbHVlVG9TdHJpbmdXaXRoVW5k
ZWZpbmVkT3JOdWxsQ2hlY2soZXhlYywgYXJnc1syXSkpOwogICAgIEZsb2F0UmVjdCB3aW5kb3dS
ZWN0KHdpbmRvd0ZlYXR1cmVzLngsIHdpbmRvd0ZlYXR1cmVzLnksIHdpbmRvd0ZlYXR1cmVzLndp
ZHRoLCB3aW5kb3dGZWF0dXJlcy5oZWlnaHQpOwogICAgIFdlYkNvcmU6OkRPTVdpbmRvdzo6YWRq
dXN0V2luZG93UmVjdChzY3JlZW5BdmFpbGFibGVSZWN0KHBhZ2UtPm1haW5GcmFtZSgpLT52aWV3
KCkpLCB3aW5kb3dSZWN0LCB3aW5kb3dSZWN0KTsKIApAQCAtMTM2NSw4ICsxMjA1LDggQEAgSlNW
YWx1ZSogV2luZG93UHJvdG9GdW5jTm90SW1wbGVtZW50ZWQ6OgogfQogCiB2b2lkIFdpbmRvdzo6
c2V0UmV0dXJuVmFsdWVTbG90KEpTVmFsdWUqKiBzbG90KQoteyAKLSAgICBkLT5tX3JldHVyblZh
bHVlU2xvdCA9IHNsb3Q7IAoreworICAgIGQtPm1fcmV0dXJuVmFsdWVTbG90ID0gc2xvdDsKIH0K
IAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTY2hlZHVsZWRBY3Rpb24gLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vCkBAIC0xMzkwLDcgKzEyMzAsNyBAQCB2b2lkIFNjaGVkdWxlZEFjdGlvbjo6ZXhl
Y3V0ZShXaW5kb3cqIHdpCiAgICAgICAgIGlmIChmdW5jLT5pc09iamVjdCgpICYmIHN0YXRpY19j
YXN0PEpTT2JqZWN0Kj4oZnVuYyktPmltcGxlbWVudHNDYWxsKCkpIHsKICAgICAgICAgICAgIEV4
ZWNTdGF0ZSogZXhlYyA9IHdpbmRvdy0+Z2xvYmFsRXhlYygpOwogICAgICAgICAgICAgQVNTRVJU
KHdpbmRvdyA9PSBnbG9iYWxPYmplY3QpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIExp
c3QgYXJnczsKICAgICAgICAgICAgIHNpemVfdCBzaXplID0gbV9hcmdzLnNpemUoKTsKICAgICAg
ICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CkBAIC0xNDIxLDcgKzEy
NjEsNyBAQCB2b2lkIFNjaGVkdWxlZEFjdGlvbjo6ZXhlY3V0ZShXaW5kb3cqIHdpCiAgICAgLy8g
dG8gYmUgYSBiaXQgdG9vIGxvdy1sZXZlbC4KICAgICBpZiAoRG9jdW1lbnQqIGRvYyA9IGZyYW1l
LT5kb2N1bWVudCgpKQogICAgICAgICBkb2MtPnVwZGF0ZVJlbmRlcmluZygpOwotICAKKwogICAg
IHNjcmlwdFByb3h5LT5zZXRQcm9jZXNzaW5nVGltZXJDYWxsYmFjayhmYWxzZSk7CiB9CiAKQEAg
LTE1NDksNyArMTM4OSw3IEBAIHZvaWQgV2luZG93Ojp0aW1lckZpcmVkKERPTVdpbmRvd1RpbWVy
KiAKICAgICBkLT5tX3RpbWVvdXRzLnJlbW92ZSh0aW1lci0+dGltZW91dElkKCkpOwogICAgIGRl
bGV0ZSB0aW1lcjsKICAgICBhY3Rpb24tPmV4ZWN1dGUodGhpcyk7Ci0gICAgCisKICAgICBKU0xv
Y2sgbG9jazsKICAgICBkZWxldGUgYWN0aW9uOwogfQpAQCAtMTYwMSwxMSArMTQ0MSwxMiBAQCBj
b25zdCBDbGFzc0luZm8gTG9jYXRpb246OmluZm8gPSB7ICJMb2NhCiBAZW5kCiAqLwogCi1Mb2Nh
dGlvbjo6TG9jYXRpb24oRnJhbWUgKnApIDogbV9mcmFtZShwKQorTG9jYXRpb246OkxvY2F0aW9u
KEZyYW1lKiBmcmFtZSkKKyAgICA6IG1fZnJhbWUoZnJhbWUpCiB7CiB9CiAKLUpTVmFsdWUgKkxv
Y2F0aW9uOjpnZXRWYWx1ZVByb3BlcnR5KEV4ZWNTdGF0ZSAqZXhlYywgaW50IHRva2VuKSBjb25z
dAorSlNWYWx1ZSAqTG9jYXRpb246OmdldFZhbHVlUHJvcGVydHkoRXhlY1N0YXRlKiBleGVjLCBp
bnQgdG9rZW4pIGNvbnN0CiB7CiAgIEtVUkwgdXJsID0gbV9mcmFtZS0+bG9hZGVyKCktPnVybCgp
OwogICBzd2l0Y2ggKHRva2VuKSB7CkBAIC0xNjM1LDE5ICsxNDc2LDE5IEBAIEpTVmFsdWUgKkxv
Y2F0aW9uOjpnZXRWYWx1ZVByb3BlcnR5KEV4ZWMKICAgY2FzZSBTZWFyY2g6CiAgICAgcmV0dXJu
IGpzU3RyaW5nKHVybC5xdWVyeSgpKTsKICAgZGVmYXVsdDoKLSAgICBBU1NFUlQoMCk7CisgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CiAgIH0KIH0K
IAotYm9vbCBMb2NhdGlvbjo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSAqZXhlYywgY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpIAorYm9vbCBM
b2NhdGlvbjo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRp
ZmllciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7CiAgIGlmICghbV9mcmFt
ZSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIAorCiAgIGNvbnN0IFdpbmRvdyogd2luZG93ID0gV2lu
ZG93OjpyZXRyaWV2ZVdpbmRvdyhtX2ZyYW1lKTsKLSAgCi0gIGNvbnN0IEhhc2hFbnRyeSAqZW50
cnkgPSBMb29rdXA6OmZpbmRFbnRyeSgmTG9jYXRpb25UYWJsZSwgcHJvcGVydHlOYW1lKTsKKwor
ICBjb25zdCBIYXNoRW50cnkqIGVudHJ5ID0gTG9va3VwOjpmaW5kRW50cnkoJkxvY2F0aW9uVGFi
bGUsIHByb3BlcnR5TmFtZSk7CiAgIGlmICghZW50cnkgfHwgIShlbnRyeS0+YXR0ciAmIEtKUzo6
RnVuY3Rpb24pIHx8IChlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9jYXRpb25Qcm90
b0Z1bmNSZXBsYWNlOjpjcmVhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICYmIGVudHJ5LT52YWx1ZS5mdW5jdGlvblZhbHVlICE9ICZMb2NhdGlv
blByb3RvRnVuY1JlbG9hZDo6Y3JlYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAmJiBlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9j
YXRpb25Qcm90b0Z1bmNBc3NpZ246OmNyZWF0ZSkpICB7CkBAIC0xNjYwLDE3ICsxNTAxLDE3IEBA
IGJvb2wgTG9jYXRpb246OmdldE93blByb3BlcnR5U2xvdChFeGVjU3QKICAgcmV0dXJuIGdldFN0
YXRpY1Byb3BlcnR5U2xvdDxMb2NhdGlvbiwgSlNPYmplY3Q+KGV4ZWMsICZMb2NhdGlvblRhYmxl
LCB0aGlzLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOwogfQogCi12b2lkIExvY2F0aW9uOjpwdXQoRXhl
Y1N0YXRlICpleGVjLCBjb25zdCBJZGVudGlmaWVyICZwLCBKU1ZhbHVlICp2LCBpbnQgYXR0cikK
K3ZvaWQgTG9jYXRpb246OnB1dChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHBy
b3BlcnR5TmFtZSwgSlNWYWx1ZSogdmFsdWUsIGludCBhdHRyKQogewogICBpZiAoIW1fZnJhbWUp
CiAgICAgcmV0dXJuOwogCi0gIERlcHJlY2F0ZWRTdHJpbmcgc3RyID0gdi0+dG9TdHJpbmcoZXhl
Yyk7CisgIERlcHJlY2F0ZWRTdHJpbmcgc3RyID0gdmFsdWUtPnRvU3RyaW5nKGV4ZWMpOwogICBL
VVJMIHVybCA9IG1fZnJhbWUtPmxvYWRlcigpLT51cmwoKTsKICAgY29uc3QgV2luZG93KiB3aW5k
b3cgPSBXaW5kb3c6OnJldHJpZXZlV2luZG93KG1fZnJhbWUpOwogICBib29sIHNhbWVEb21haW5B
Y2Nlc3MgPSB3aW5kb3cgJiYgd2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpOwogCi0gIGNv
bnN0IEhhc2hFbnRyeSAqZW50cnkgPSBMb29rdXA6OmZpbmRFbnRyeSgmTG9jYXRpb25UYWJsZSwg
cCk7CisgIGNvbnN0IEhhc2hFbnRyeSogZW50cnkgPSBMb29rdXA6OmZpbmRFbnRyeSgmTG9jYXRp
b25UYWJsZSwgcHJvcGVydHlOYW1lKTsKIAogICBpZiAoZW50cnkpIHsKICAgICAgIC8vIGNyb3Nz
LWRvbWFpbiBhY2Nlc3MgdG8gdGhlIGxvY2F0aW9uIGlzIGFsbG93ZWQgd2hlbiBhc3NpZ25pbmcg
dGhlIHdob2xlIGxvY2F0aW9uLApAQCAtMTY4OCwxNCArMTUyOSwxMiBAQCB2b2lkIExvY2F0aW9u
OjpwdXQoRXhlY1N0YXRlICpleGVjLCBjb25zCiAgICAgICAgICAgICAgIHJldHVybjsKICAgICAg
ICAgICB1cmwgPSBmcmFtZS0+bG9hZGVyKCktPmNvbXBsZXRlVVJMKHN0cikudXJsKCk7CiAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICB9IAorICAgICAgfQogICAgICAgY2FzZSBIYXNoOiB7CiAgICAg
ICAgICAgaWYgKHN0ci5zdGFydHNXaXRoKCIjIikpCiAgICAgICAgICAgICAgIHN0ciA9IHN0ci5t
aWQoMSk7Ci0gICAgICAgICAgCiAgICAgICAgICAgaWYgKHVybC5yZWYoKSA9PSBzdHIpCiAgICAg
ICAgICAgICAgIHJldHVybjsKLQogICAgICAgICAgIHVybC5zZXRSZWYoc3RyKTsKICAgICAgICAg
ICBicmVhazsKICAgICAgIH0KQEAgLTE3MjUsNyArMTU2NCw3IEBAIHZvaWQgTG9jYXRpb246OnB1
dChFeGVjU3RhdGUgKmV4ZWMsIGNvbnMKICAgICAgIH0KICAgfSBlbHNlIHsKICAgICAgIGlmIChz
YW1lRG9tYWluQWNjZXNzKQotICAgICAgICAgIEpTT2JqZWN0OjpwdXQoZXhlYywgcCwgdiwgYXR0
cik7CisgICAgICAgICAgSlNPYmplY3Q6OnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBh
dHRyKTsKICAgICAgIHJldHVybjsKICAgfQogCkBAIC0xNzQ1LDE2ICsxNTg0LDE2IEBAIEpTVmFs
dWUqIExvY2F0aW9uUHJvdG9GdW5jUmVwbGFjZTo6Y2FsbEEKICAgICBpZiAoIWZyYW1lKQogICAg
ICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKIAotICAgIEZyYW1lKiBwID0gV2luZG93OjpyZXRy
aWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmIChwKSB7Ci0gICAgICBp
ZiAoIXAtPmxvYWRlcigpLT5zaG91bGRBbGxvd05hdmlnYXRpb24oZnJhbWUpKQotICAgICAgICBy
ZXR1cm4ganNVbmRlZmluZWQoKTsKLSAgICAgIERlcHJlY2F0ZWRTdHJpbmcgc3RyID0gYXJnc1sw
XS0+dG9TdHJpbmcoZXhlYyk7Ci0gICAgICBjb25zdCBXaW5kb3cqIHdpbmRvdyA9IFdpbmRvdzo6
cmV0cmlldmVXaW5kb3coZnJhbWUpOwotICAgICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiamF2YXNj
cmlwdDoiLCBmYWxzZSkgfHwgKHdpbmRvdyAmJiB3aW5kb3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhl
YykpKSB7Ci0gICAgICAgIGJvb2wgdXNlckdlc3R1cmUgPSBwLT5zY3JpcHRQcm94eSgpLT5wcm9j
ZXNzaW5nVXNlckdlc3R1cmUoKTsKLSAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5zY2hlZHVsZUxv
Y2F0aW9uQ2hhbmdlKHAtPmxvYWRlcigpLT5jb21wbGV0ZVVSTChzdHIpLnVybCgpLCBwLT5sb2Fk
ZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCB0cnVlLCB1c2VyR2VzdHVyZSk7Ci0gICAgICB9Cisg
ICAgRnJhbWUqIGFjdGl2ZUZyYW1lID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1w
bCgpLT5mcmFtZSgpOworICAgIGlmIChhY3RpdmVGcmFtZSkgeworICAgICAgICBpZiAoIWFjdGl2
ZUZyYW1lLT5sb2FkZXIoKS0+c2hvdWxkQWxsb3dOYXZpZ2F0aW9uKGZyYW1lKSkKKyAgICAgICAg
ICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAgICBEZXByZWNhdGVkU3RyaW5nIHN0ciA9
IGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpOworICAgICAgICBjb25zdCBXaW5kb3cqIHdpbmRvdyA9
IFdpbmRvdzo6cmV0cmlldmVXaW5kb3coZnJhbWUpOworICAgICAgICBpZiAoIXN0ci5zdGFydHNX
aXRoKCJqYXZhc2NyaXB0OiIsIGZhbHNlKSB8fCAod2luZG93ICYmIHdpbmRvdy0+YWxsb3dzQWNj
ZXNzRnJvbShleGVjKSkpIHsKKyAgICAgICAgICAgIGJvb2wgdXNlckdlc3R1cmUgPSBhY3RpdmVG
cmFtZS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCk7CisgICAgICAgICAg
ICBmcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxlTG9jYXRpb25DaGFuZ2UoYWN0aXZlRnJhbWUtPmxv
YWRlcigpLT5jb21wbGV0ZVVSTChzdHIpLnVybCgpLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91
dGdvaW5nUmVmZXJyZXIoKSwgdHJ1ZSwgdXNlckdlc3R1cmUpOworICAgICAgICB9CiAgICAgfQog
CiAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CkBAIC0xNzg5LDE2ICsxNjI4LDE2IEBAIEpTVmFs
dWUqIExvY2F0aW9uUHJvdG9GdW5jQXNzaWduOjpjYWxsQXMKICAgICBpZiAoIWZyYW1lKQogICAg
ICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKIAotICAgIEZyYW1lICpwID0gV2luZG93OjpyZXRy
aWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmIChwKSB7Ci0gICAgICAg
IGlmICghcC0+bG9hZGVyKCktPnNob3VsZEFsbG93TmF2aWdhdGlvbihmcmFtZSkpCi0gICAgICAg
ICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0gICAgICAgIGNvbnN0IFdpbmRvdyAqd2luZG93ID0g
V2luZG93OjpyZXRyaWV2ZVdpbmRvdyhmcmFtZSk7Ci0gICAgICAgIERlcHJlY2F0ZWRTdHJpbmcg
ZHN0VXJsID0gcC0+bG9hZGVyKCktPmNvbXBsZXRlVVJMKERlcHJlY2F0ZWRTdHJpbmcoYXJnc1sw
XS0+dG9TdHJpbmcoZXhlYykpKS51cmwoKTsKKyAgICBGcmFtZSogYWN0aXZlRnJhbWUgPSBXaW5k
b3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5pbXBsKCktPmZyYW1lKCk7CisgICAgaWYgKGFjdGl2
ZUZyYW1lKSB7CisgICAgICAgIGlmICghYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5zaG91bGRBbGxv
d05hdmlnYXRpb24oZnJhbWUpKQorICAgICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Cisg
ICAgICAgIGNvbnN0IFdpbmRvdyogd2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdpbmRvdyhmcmFt
ZSk7CisgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgZHN0VXJsID0gYWN0aXZlRnJhbWUtPmxvYWRl
cigpLT5jb21wbGV0ZVVSTChEZXByZWNhdGVkU3RyaW5nKGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMp
KSkudXJsKCk7CiAgICAgICAgIGlmICghZHN0VXJsLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6Iiwg
ZmFsc2UpIHx8ICh3aW5kb3cgJiYgd2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSkgewot
ICAgICAgICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IHAtPnNjcmlwdFByb3h5KCktPnByb2Nlc3Np
bmdVc2VyR2VzdHVyZSgpOworICAgICAgICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IGFjdGl2ZUZy
YW1lLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKTsKICAgICAgICAgICAg
IC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBpdGVtIGlmIHRoaXMgSlMgd2FzIGNhbGxlZCB2aWEg
YSB1c2VyIGdlc3R1cmUKLSAgICAgICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2Nh
dGlvbkNoYW5nZShkc3RVcmwsIHAtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNl
LCB1c2VyR2VzdHVyZSk7CisgICAgICAgICAgICBmcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxlTG9j
YXRpb25DaGFuZ2UoZHN0VXJsLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJy
ZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTgxNCwy
MyArMTY1MywxNyBAQCBKU1ZhbHVlKiBMb2NhdGlvblByb3RvRnVuY1RvU3RyaW5nOjpjYWxsCiAg
ICAgaWYgKCFmcmFtZSkKICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CiAKLSAgICBXaW5k
b3cqIHdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5kb3coZnJhbWUpOwotICAgIGlmICghd2lu
ZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKLQotICAgIGlmICghZnJhbWUgfHwgIVdpbmRvdzo6cmV0cmlldmVXaW5kb3coZnJhbWUpLT5h
bGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICByZXR1cm4ganNTdHJpbmcoKTsKLQotICAg
IGlmICghZnJhbWUtPmxvYWRlcigpLT51cmwoKS5oYXNQYXRoKCkpCi0gICAgICAgIHJldHVybiBq
c1N0cmluZyhmcmFtZS0+bG9hZGVyKCktPnVybCgpLnByZXR0eVVSTCgpICsgIi8iKTsKLSAgICBy
ZXR1cm4ganNTdHJpbmcoZnJhbWUtPmxvYWRlcigpLT51cmwoKS5wcmV0dHlVUkwoKSk7CisgICAg
Y29uc3QgS1VSTCYgdXJsID0gZnJhbWUtPmxvYWRlcigpLT51cmwoKTsKKyAgICBpZiAoIXVybC5o
YXNQYXRoKCkpCisgICAgICAgIHJldHVybiBqc1N0cmluZyh1cmwucHJldHR5VVJMKCkgKyAiLyIp
OworICAgIHJldHVybiBqc1N0cmluZyh1cmwucHJldHR5VVJMKCkpOwogfQogCiAvLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLwogCiBQYXVzZWRUaW1lb3V0czo6flBhdXNlZFRpbWVvdXRzKCkKIHsKLSAgICBQ
YXVzZWRUaW1lb3V0ICphcnJheSA9IG1fYXJyYXk7CisgICAgUGF1c2VkVGltZW91dCogYXJyYXkg
PSBtX2FycmF5OwogICAgIGlmICghYXJyYXkpCiAgICAgICAgIHJldHVybjsKICAgICBzaXplX3Qg
Y291bnQgPSBtX2xlbmd0aDsKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL1dpbmRvd0ZlYXR1cmVzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2UvV2luZG93RmVhdHVyZXMuaAkocmV2aXNpb24g
Mjg1ODkpCisrKyBXZWJDb3JlL2JyaWRnZS9XaW5kb3dGZWF0dXJlcy5oCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0g
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNpZm5kZWYgV2luZG93RmVh
dHVyZXNfaAotI2RlZmluZSBXaW5kb3dGZWF0dXJlc19oCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LQotc3RydWN0IFdpbmRvd0ZlYXR1cmVzIHsKLSAgICBXaW5kb3dGZWF0dXJlcygpCi0gICAgICAg
IDogeFNldChmYWxzZSksIHlTZXQoZmFsc2UpLCB3aWR0aFNldChmYWxzZSksIGhlaWdodFNldChm
YWxzZSksCi0gICAgICAgICAgbWVudUJhclZpc2libGUodHJ1ZSksIHN0YXR1c0JhclZpc2libGUo
dHJ1ZSksIHRvb2xCYXJWaXNpYmxlKHRydWUpLAotICAgICAgICAgIGxvY2F0aW9uQmFyVmlzaWJs
ZSh0cnVlKSwgc2Nyb2xsYmFyc1Zpc2libGUodHJ1ZSksIHJlc2l6YWJsZSh0cnVlKSwKLSAgICAg
ICAgICBmdWxsc2NyZWVuKGZhbHNlKSwgZGlhbG9nKGZhbHNlKQotICAgIHt9Ci0KLSAgICBmbG9h
dCB4OwotICAgIGJvb2wgeFNldDsKLSAgICBmbG9hdCB5OwotICAgIGJvb2wgeVNldDsKLSAgICBm
bG9hdCB3aWR0aDsKLSAgICBib29sIHdpZHRoU2V0OwotICAgIGZsb2F0IGhlaWdodDsKLSAgICBi
b29sIGhlaWdodFNldDsKLQotICAgIGJvb2wgbWVudUJhclZpc2libGU7Ci0gICAgYm9vbCBzdGF0
dXNCYXJWaXNpYmxlOwotICAgIGJvb2wgdG9vbEJhclZpc2libGU7Ci0gICAgYm9vbCBsb2NhdGlv
bkJhclZpc2libGU7Ci0gICAgYm9vbCBzY3JvbGxiYXJzVmlzaWJsZTsKLSAgICBib29sIHJlc2l6
YWJsZTsKLQotICAgIGJvb2wgZnVsbHNjcmVlbjsKLSAgICBib29sIGRpYWxvZzsKLX07Ci0KLX0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmIC8vIFdpbmRvd0ZlYXR1cmVzX2gKSW5kZXg6
IFdlYkNvcmUvcGFnZS9XaW5kb3dGZWF0dXJlcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
YWdlL1dpbmRvd0ZlYXR1cmVzLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGFnZS9XaW5k
b3dGZWF0dXJlcy5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogIENv
cHlyaWdodCAoQykgMjAwMCBIYXJyaSBQb3J0ZW4gKHBvcnRlbkBrZGUub3JnKQorICogIENvcHly
aWdodCAoQykgMjAwNiBKb24gU2hpZXIgKGpzaGllckBpYXN0YXRlLmVkdSkKKyAqICBDb3B5cmln
aHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2V2ZWQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFw
QHdlYmtpdC5vcmcpCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
ICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy
ZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxCisgKiAgVVNBCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldpbmRvd0ZlYXR1cmVzLmgiCisKKyNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKyNpbmNsdWRlIDx3dGYv
QXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworLy8gVGhvdWdoIGlzc3BhY2UoKSBjb25zaWRlcnMgXHQgYW5kIFx2IHRvIGJlIHdo
aXRlc3BhY2UsIFdpbiBJRSBkb2Vzbid0Lgorc3RhdGljIGJvb2wgaXNTZXBhcmF0b3IoOjpVQ2hh
ciBjKQoreworICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXG4nIHx8
IGMgPT0gJ1xyJyB8fCBjID09ICc9JyB8fCBjID09ICcsJyB8fCBjID09ICdcMCc7Cit9CisKK1dp
bmRvd0ZlYXR1cmVzOjpXaW5kb3dGZWF0dXJlcyhjb25zdCBTdHJpbmcmIGZlYXR1cmVzKQorICAg
IDogeFNldChmYWxzZSkKKyAgICAsIHlTZXQoZmFsc2UpCisgICAgLCB3aWR0aFNldChmYWxzZSkK
KyAgICAsIGhlaWdodFNldChmYWxzZSkKKyAgICAsIGZ1bGxzY3JlZW4oZmFsc2UpCisgICAgLCBk
aWFsb2coZmFsc2UpCit7CisgICAgLyoKKyAgICAgVGhlIElFIHJ1bGUgaXM6IGFsbCBmZWF0dXJl
cyBleGNlcHQgZm9yIGNoYW5uZWxtb2RlIGFuZCBmdWxsc2NyZWVuIGRlZmF1bHQgdG8gWUVTLCBi
dXQKKyAgICAgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEgZmVhdHVyZSBzdHJpbmcsIGFsbCBmZWF0
dXJlcyBkZWZhdWx0IHRvIE5PLiAoVGhlcmUgaXMgbm8gcHVibGljCisgICAgIHN0YW5kYXJkIHRo
YXQgYXBwbGllcyB0byB0aGlzIG1ldGhvZC4pCisKKyAgICAgPGh0dHA6Ly9tc2RuLm1pY3Jvc29m
dC5jb20vd29ya3Nob3AvYXV0aG9yL2RodG1sL3JlZmVyZW5jZS9tZXRob2RzL29wZW5fMC5hc3A+
CisgICAgIFdlIGFsd2F5cyBhbGxvdyBhIHdpbmRvdyB0byBiZSByZXNpemVkLCB3aGljaCBpcyBj
b25zaXN0ZW50IHdpdGggRmlyZWZveC4KKyAgICAgKi8KKworICAgIGlmIChmZWF0dXJlcy5sZW5n
dGgoKSA9PSAwKSB7CisgICAgICAgIG1lbnVCYXJWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgc3Rh
dHVzQmFyVmlzaWJsZSA9IHRydWU7CisgICAgICAgIHRvb2xCYXJWaXNpYmxlID0gdHJ1ZTsKKyAg
ICAgICAgbG9jYXRpb25CYXJWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgc2Nyb2xsYmFyc1Zpc2li
bGUgPSB0cnVlOworICAgICAgICByZXNpemFibGUgPSB0cnVlOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgbWVudUJhclZpc2libGUgPSBmYWxzZTsKKyAgICBzdGF0dXNCYXJWaXNpYmxl
ID0gZmFsc2U7CisgICAgdG9vbEJhclZpc2libGUgPSBmYWxzZTsKKyAgICBsb2NhdGlvbkJhclZp
c2libGUgPSBmYWxzZTsKKyAgICBzY3JvbGxiYXJzVmlzaWJsZSA9IGZhbHNlOworICAgIHJlc2l6
YWJsZSA9IHRydWU7CisKKyAgICAvLyBUcmVhZCBsaWdodGx5IGluIHRoaXMgY29kZSAtLSBpdCB3
YXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIG1pbWljIFdpbiBJRSdzIHBhcnNpbmcgYmVoYXZp
b3IuCisgICAgaW50IGtleUJlZ2luLCBrZXlFbmQ7CisgICAgaW50IHZhbHVlQmVnaW4sIHZhbHVl
RW5kOworCisgICAgaW50IGkgPSAwOworICAgIGludCBsZW5ndGggPSBmZWF0dXJlcy5sZW5ndGgo
KTsKKyAgICBTdHJpbmcgYnVmZmVyID0gZmVhdHVyZXMubG93ZXIoKTsKKyAgICB3aGlsZSAoaSA8
IGxlbmd0aCkgeworICAgICAgICAvLyBza2lwIHRvIGZpcnN0IG5vbi1zZXBhcmF0b3IsIGJ1dCBk
b24ndCBza2lwIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgIHdoaWxlIChpc1Nl
cGFyYXRvcihidWZmZXJbaV0pKSB7CisgICAgICAgICAgICBpZiAoaSA+PSBsZW5ndGgpCisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAg
a2V5QmVnaW4gPSBpOworCisgICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgc2VwYXJhdG9yCisgICAg
ICAgIHdoaWxlICghaXNTZXBhcmF0b3IoYnVmZmVyW2ldKSkKKyAgICAgICAgICAgIGkrKzsKKyAg
ICAgICAga2V5RW5kID0gaTsKKworICAgICAgICAvLyBza2lwIHRvIGZpcnN0ICc9JywgYnV0IGRv
bid0IHNraXAgcGFzdCBhICcsJyBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgd2hp
bGUgKGJ1ZmZlcltpXSAhPSAnPScpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gJywn
IHx8IGkgPj0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaSsr
OworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBub24tc2VwYXJhdG9yLCBi
dXQgZG9uJ3Qgc2tpcCBwYXN0IGEgJywnIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAg
ICB3aGlsZSAoaXNTZXBhcmF0b3IoYnVmZmVyW2ldKSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZl
cltpXSA9PSAnLCcgfHwgaSA+PSBsZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWVCZWdpbiA9IGk7CisKKyAgICAg
ICAgLy8gc2tpcCB0byBmaXJzdCBzZXBhcmF0b3IKKyAgICAgICAgd2hpbGUgKCFpc1NlcGFyYXRv
cihidWZmZXJbaV0pKQorICAgICAgICAgICAgaSsrOworICAgICAgICB2YWx1ZUVuZCA9IGk7CisK
KyAgICAgICAgQVNTRVJUKGkgPD0gbGVuZ3RoKTsKKworICAgICAgICBTdHJpbmcga2V5U3RyaW5n
KGJ1ZmZlci5zdWJzdHJpbmcoa2V5QmVnaW4sIGtleUVuZCAtIGtleUJlZ2luKSk7CisgICAgICAg
IFN0cmluZyB2YWx1ZVN0cmluZyhidWZmZXIuc3Vic3RyaW5nKHZhbHVlQmVnaW4sIHZhbHVlRW5k
IC0gdmFsdWVCZWdpbikpOworICAgICAgICBzZXRXaW5kb3dGZWF0dXJlKGtleVN0cmluZywgdmFs
dWVTdHJpbmcpOworICAgIH0KK30KKwordm9pZCBXaW5kb3dGZWF0dXJlczo6c2V0V2luZG93RmVh
dHVyZShjb25zdCBTdHJpbmcmIGtleVN0cmluZywgY29uc3QgU3RyaW5nJiB2YWx1ZVN0cmluZykK
K3sKKyAgICBpbnQgdmFsdWU7CisKKyAgICAvLyBMaXN0aW5nIGEga2V5IHdpdGggbm8gdmFsdWUg
aXMgc2hvcnRoYW5kIGZvciBrZXk9eWVzCisgICAgaWYgKHZhbHVlU3RyaW5nLmxlbmd0aCgpID09
IDAgfHwgdmFsdWVTdHJpbmcgPT0gInllcyIpCisgICAgICAgIHZhbHVlID0gMTsKKyAgICBlbHNl
CisgICAgICAgIHZhbHVlID0gdmFsdWVTdHJpbmcudG9JbnQoKTsKKworICAgIC8vIFdlIGlnbm9y
ZSBhIGtleVN0cmluZyBvZiAicmVzaXphYmxlIiwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIEZp
cmVmb3guCisgICAgaWYgKGtleVN0cmluZyA9PSAibGVmdCIgfHwga2V5U3RyaW5nID09ICJzY3Jl
ZW54IikgeworICAgICAgICB4U2V0ID0gdHJ1ZTsKKyAgICAgICAgeCA9IHZhbHVlOworICAgIH0g
ZWxzZSBpZiAoa2V5U3RyaW5nID09ICJ0b3AiIHx8IGtleVN0cmluZyA9PSAic2NyZWVueSIpIHsK
KyAgICAgICAgeVNldCA9IHRydWU7CisgICAgICAgIHkgPSB2YWx1ZTsKKyAgICB9IGVsc2UgaWYg
KGtleVN0cmluZyA9PSAid2lkdGgiIHx8IGtleVN0cmluZyA9PSAiaW5uZXJ3aWR0aCIpIHsKKyAg
ICAgICAgd2lkdGhTZXQgPSB0cnVlOworICAgICAgICB3aWR0aCA9IHZhbHVlOworICAgIH0gZWxz
ZSBpZiAoa2V5U3RyaW5nID09ICJoZWlnaHQiIHx8IGtleVN0cmluZyA9PSAiaW5uZXJoZWlnaHQi
KSB7CisgICAgICAgIGhlaWdodFNldCA9IHRydWU7CisgICAgICAgIGhlaWdodCA9IHZhbHVlOwor
ICAgIH0gZWxzZSBpZiAoa2V5U3RyaW5nID09ICJtZW51YmFyIikKKyAgICAgICAgbWVudUJhclZp
c2libGUgPSB2YWx1ZTsKKyAgICBlbHNlIGlmIChrZXlTdHJpbmcgPT0gInRvb2xiYXIiKQorICAg
ICAgICB0b29sQmFyVmlzaWJsZSA9IHZhbHVlOworICAgIGVsc2UgaWYgKGtleVN0cmluZyA9PSAi
bG9jYXRpb24iKQorICAgICAgICBsb2NhdGlvbkJhclZpc2libGUgPSB2YWx1ZTsKKyAgICBlbHNl
IGlmIChrZXlTdHJpbmcgPT0gInN0YXR1cyIpCisgICAgICAgIHN0YXR1c0JhclZpc2libGUgPSB2
YWx1ZTsKKyAgICBlbHNlIGlmIChrZXlTdHJpbmcgPT0gImZ1bGxzY3JlZW4iKQorICAgICAgICBm
dWxsc2NyZWVuID0gdmFsdWU7CisgICAgZWxzZSBpZiAoa2V5U3RyaW5nID09ICJzY3JvbGxiYXJz
IikKKyAgICAgICAgc2Nyb2xsYmFyc1Zpc2libGUgPSB2YWx1ZTsKK30KKworYm9vbCBXaW5kb3dG
ZWF0dXJlczo6Ym9vbEZlYXR1cmUoY29uc3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4mIGZlYXR1
cmVzLCBjb25zdCBjaGFyKiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlKQoreworICAgIEhhc2hNYXA8
U3RyaW5nLCBTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZlYXR1cmVzLmZpbmQoa2V5KTsK
KyAgICBpZiAoaXQgPT0gZmVhdHVyZXMuZW5kKCkpCisgICAgICAgIHJldHVybiBkZWZhdWx0VmFs
dWU7CisgICAgY29uc3QgU3RyaW5nJiB2YWx1ZSA9IGl0LT5zZWNvbmQ7CisgICAgcmV0dXJuIHZh
bHVlLmlzTnVsbCgpIHx8IHZhbHVlID09ICIxIiB8fCB2YWx1ZSA9PSAieWVzIiB8fCB2YWx1ZSA9
PSAib24iOworfQorCitmbG9hdCBXaW5kb3dGZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGNvbnN0IEhh
c2hNYXA8U3RyaW5nLCBTdHJpbmc+JiBmZWF0dXJlcywgY29uc3QgY2hhcioga2V5LCBmbG9hdCBt
aW4sIGZsb2F0IG1heCwgZmxvYXQgZGVmYXVsdFZhbHVlKQoreworICAgIEhhc2hNYXA8U3RyaW5n
LCBTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZlYXR1cmVzLmZpbmQoa2V5KTsKKyAgICBp
ZiAoaXQgPT0gZmVhdHVyZXMuZW5kKCkpCisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Cisg
ICAgLy8gRklYTUU6IENhbid0IGRpc3Rpbmd1aXNoICIwcSIgZnJvbSBzdHJpbmcgd2l0aCBubyBk
aWdpdHMgaW4gaXQgLS0gYm90aCByZXR1cm4gZCA9PSAwIGFuZCBvayA9PSBmYWxzZS4KKyAgICAv
LyBXb3VsZCBiZSBnb29kIHRvIHRlbGwgdGhlbSBhcGFydCBzb21laG93IHNpbmNlIHN0cmluZyB3
aXRoIG5vIGRpZ2l0cyBzaG91bGQgYmUgZGVmYXVsdCB2YWx1ZSBhbmQKKyAgICAvLyAiMHEiIHNo
b3VsZCBiZSBtaW5pbXVtIHZhbHVlLgorICAgIGJvb2wgb2s7CisgICAgZG91YmxlIGQgPSBpdC0+
c2Vjb25kLnRvRG91YmxlKCZvayk7CisgICAgaWYgKChkID09IDAgJiYgIW9rKSB8fCBpc25hbihk
KSkKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICBpZiAoZCA8IG1pbiB8fCBtYXgg
PD0gbWluKQorICAgICAgICByZXR1cm4gbWluOworICAgIGlmIChkID4gbWF4KQorICAgICAgICBy
ZXR1cm4gbWF4OworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BhZ2UvV2luZG93RmVhdHVyZXMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvV2luZG93RmVhdHVyZXMuaAkocmV2aXNpb24gMjg1Njkp
CShmcm9tIFdlYkNvcmUvYnJpZGdlL1dpbmRvd0ZlYXR1cmVzLmg6Mjg1NjkpCisrKyBXZWJDb3Jl
L3BhZ2UvV2luZG93RmVhdHVyZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDAzIEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFdpbmRvd0ZlYXR1cmVzX2gKKyNkZWZpbmUgV2lu
ZG93RmVhdHVyZXNfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBXaW5kb3dGZWF0
dXJlcyB7CisgICAgV2luZG93RmVhdHVyZXMoKQorICAgICAgICA6IHhTZXQoZmFsc2UpLCB5U2V0
KGZhbHNlKSwgd2lkdGhTZXQoZmFsc2UpLCBoZWlnaHRTZXQoZmFsc2UpLAorICAgICAgICAgIG1l
bnVCYXJWaXNpYmxlKHRydWUpLCBzdGF0dXNCYXJWaXNpYmxlKHRydWUpLCB0b29sQmFyVmlzaWJs
ZSh0cnVlKSwKKyAgICAgICAgICBsb2NhdGlvbkJhclZpc2libGUodHJ1ZSksIHNjcm9sbGJhcnNW
aXNpYmxlKHRydWUpLCByZXNpemFibGUodHJ1ZSksCisgICAgICAgICAgZnVsbHNjcmVlbihmYWxz
ZSksIGRpYWxvZyhmYWxzZSkKKyAgICB7fQorCisgICAgZmxvYXQgeDsKKyAgICBib29sIHhTZXQ7
CisgICAgZmxvYXQgeTsKKyAgICBib29sIHlTZXQ7CisgICAgZmxvYXQgd2lkdGg7CisgICAgYm9v
bCB3aWR0aFNldDsKKyAgICBmbG9hdCBoZWlnaHQ7CisgICAgYm9vbCBoZWlnaHRTZXQ7CisKKyAg
ICBib29sIG1lbnVCYXJWaXNpYmxlOworICAgIGJvb2wgc3RhdHVzQmFyVmlzaWJsZTsKKyAgICBi
b29sIHRvb2xCYXJWaXNpYmxlOworICAgIGJvb2wgbG9jYXRpb25CYXJWaXNpYmxlOworICAgIGJv
b2wgc2Nyb2xsYmFyc1Zpc2libGU7CisgICAgYm9vbCByZXNpemFibGU7CisKKyAgICBib29sIGZ1
bGxzY3JlZW47CisgICAgYm9vbCBkaWFsb2c7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZiAvLyBXaW5kb3dGZWF0dXJlc19oCkluZGV4OiBXZWJDb3JlL3BhZ2UvV2luZG93
RmVhdHVyZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvV2luZG93RmVhdHVyZXMuaAko
cmV2aXNpb24gMjg1NjkpCisrKyBXZWJDb3JlL3BhZ2UvV2luZG93RmVhdHVyZXMuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMSw2MCArMSw4MiBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBBcHBs
ZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwMywgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKICAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAgKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0g
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwg
SW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAg
ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAogI2lmbmRl
ZiBXaW5kb3dGZWF0dXJlc19oCiAjZGVmaW5lIFdpbmRvd0ZlYXR1cmVzX2gKIAorI2luY2x1ZGUg
IlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKwogbmFtZXNwYWNl
IFdlYkNvcmUgewogCi1zdHJ1Y3QgV2luZG93RmVhdHVyZXMgewotICAgIFdpbmRvd0ZlYXR1cmVz
KCkKLSAgICAgICAgOiB4U2V0KGZhbHNlKSwgeVNldChmYWxzZSksIHdpZHRoU2V0KGZhbHNlKSwg
aGVpZ2h0U2V0KGZhbHNlKSwKLSAgICAgICAgICBtZW51QmFyVmlzaWJsZSh0cnVlKSwgc3RhdHVz
QmFyVmlzaWJsZSh0cnVlKSwgdG9vbEJhclZpc2libGUodHJ1ZSksCi0gICAgICAgICAgbG9jYXRp
b25CYXJWaXNpYmxlKHRydWUpLCBzY3JvbGxiYXJzVmlzaWJsZSh0cnVlKSwgcmVzaXphYmxlKHRy
dWUpLAotICAgICAgICAgIGZ1bGxzY3JlZW4oZmFsc2UpLCBkaWFsb2coZmFsc2UpCi0gICAge30K
LQotICAgIGZsb2F0IHg7Ci0gICAgYm9vbCB4U2V0OwotICAgIGZsb2F0IHk7Ci0gICAgYm9vbCB5
U2V0OwotICAgIGZsb2F0IHdpZHRoOwotICAgIGJvb2wgd2lkdGhTZXQ7Ci0gICAgZmxvYXQgaGVp
Z2h0OwotICAgIGJvb2wgaGVpZ2h0U2V0OwotCi0gICAgYm9vbCBtZW51QmFyVmlzaWJsZTsKLSAg
ICBib29sIHN0YXR1c0JhclZpc2libGU7Ci0gICAgYm9vbCB0b29sQmFyVmlzaWJsZTsKLSAgICBi
b29sIGxvY2F0aW9uQmFyVmlzaWJsZTsKLSAgICBib29sIHNjcm9sbGJhcnNWaXNpYmxlOwotICAg
IGJvb2wgcmVzaXphYmxlOwotCi0gICAgYm9vbCBmdWxsc2NyZWVuOwotICAgIGJvb2wgZGlhbG9n
OwotfTsKKyAgICBzdHJ1Y3QgV2luZG93RmVhdHVyZXMgeworICAgICAgICBXaW5kb3dGZWF0dXJl
cygpCisgICAgICAgICAgICA6IHhTZXQoZmFsc2UpCisgICAgICAgICAgICAsIHlTZXQoZmFsc2Up
CisgICAgICAgICAgICAsIHdpZHRoU2V0KGZhbHNlKQorICAgICAgICAgICAgLCBoZWlnaHRTZXQo
ZmFsc2UpCisgICAgICAgICAgICAsIG1lbnVCYXJWaXNpYmxlKHRydWUpCisgICAgICAgICAgICAs
IHN0YXR1c0JhclZpc2libGUodHJ1ZSkKKyAgICAgICAgICAgICwgdG9vbEJhclZpc2libGUodHJ1
ZSkKKyAgICAgICAgICAgICwgbG9jYXRpb25CYXJWaXNpYmxlKHRydWUpCisgICAgICAgICAgICAs
IHNjcm9sbGJhcnNWaXNpYmxlKHRydWUpCisgICAgICAgICAgICAsIHJlc2l6YWJsZSh0cnVlKQor
ICAgICAgICAgICAgLCBmdWxsc2NyZWVuKGZhbHNlKQorICAgICAgICAgICAgLCBkaWFsb2coZmFs
c2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIFdpbmRvd0ZlYXR1cmVzKGNvbnN0
IFN0cmluZyYgZmVhdHVyZXMpOworCisgICAgICAgIHZvaWQgc2V0V2luZG93RmVhdHVyZShjb25z
dCBTdHJpbmcmIGtleVN0cmluZywgY29uc3QgU3RyaW5nJiB2YWx1ZVN0cmluZyk7CisKKyAgICAg
ICAgc3RhdGljIGJvb2wgYm9vbEZlYXR1cmUoY29uc3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4m
IGZlYXR1cmVzLCBjb25zdCBjaGFyKiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlID0gZmFsc2UpOwor
ICAgICAgICBzdGF0aWMgZmxvYXQgZmxvYXRGZWF0dXJlKGNvbnN0IEhhc2hNYXA8U3RyaW5nLCBT
dHJpbmc+JiBmZWF0dXJlcywgY29uc3QgY2hhcioga2V5LCBmbG9hdCBtaW4sIGZsb2F0IG1heCwg
ZmxvYXQgZGVmYXVsdFZhbHVlKTsKKworICAgICAgICBmbG9hdCB4OworICAgICAgICBib29sIHhT
ZXQ7CisgICAgICAgIGZsb2F0IHk7CisgICAgICAgIGJvb2wgeVNldDsKKyAgICAgICAgZmxvYXQg
d2lkdGg7CisgICAgICAgIGJvb2wgd2lkdGhTZXQ7CisgICAgICAgIGZsb2F0IGhlaWdodDsKKyAg
ICAgICAgYm9vbCBoZWlnaHRTZXQ7CisKKyAgICAgICAgYm9vbCBtZW51QmFyVmlzaWJsZTsKKyAg
ICAgICAgYm9vbCBzdGF0dXNCYXJWaXNpYmxlOworICAgICAgICBib29sIHRvb2xCYXJWaXNpYmxl
OworICAgICAgICBib29sIGxvY2F0aW9uQmFyVmlzaWJsZTsKKyAgICAgICAgYm9vbCBzY3JvbGxi
YXJzVmlzaWJsZTsKKyAgICAgICAgYm9vbCByZXNpemFibGU7CisKKyAgICAgICAgYm9vbCBmdWxs
c2NyZWVuOworICAgICAgICBib29sIGRpYWxvZzsKKyAgICB9OwogCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiAK
</data>
<flag name="review"
          id="7690"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17937</attachid>
            <date>2007-12-16 13:40:50 -0800</date>
            <delta_ts>2007-12-16 16:48:11 -0800</delta_ts>
            <desc>move PausedTimeouts</desc>
            <filename>pausedTimeouts.diff</filename>
            <type>text/plain</type>
            <size>149070</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyODc3NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjIgQEAKKzIwMDctMTItMTYgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3ZlIFBh
dXNlZFRpbWVvdXRzIGludG8gaXRzIG93biBmaWxlIGFuZCBwdXQgaXQgaW4gdGhlIFdlYkNvcmUg
bmFtZXNwYWNlLgorCisgICAgICAgICogV2ViQ29yZS5wcm86CisgICAgICAgICogV2ViQ29yZS52
Y3Byb2ovV2ViQ29yZS52Y3Byb2o6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qOgorICAgICAgICAqIFdlYkNvcmVTb3VyY2VzLmJrbDoKKyAgICAgICAgKiBiaW5k
aW5ncy9qcy9QYXVzZWRUaW1lb3V0cy5jcHA6IENvcGllZCBmcm9tIGJpbmRpbmdzL2pzL2tqc193
aW5kb3cuY3BwLgorICAgICAgICAqIGJpbmRpbmdzL2pzL1BhdXNlZFRpbWVvdXRzLmg6IENvcGll
ZCBmcm9tIGJpbmRpbmdzL2pzL2tqc193aW5kb3cuaC4KKyAgICAgICAgKiBiaW5kaW5ncy9qcy9r
anNfd2luZG93LmNwcDoKKyAgICAgICAgKEtKUzo6V2luZG93OjpwYXVzZVRpbWVvdXRzKToKKyAg
ICAgICAgKiBiaW5kaW5ncy9qcy9ranNfd2luZG93Lmg6CisgICAgICAgICogaGlzdG9yeS9DYWNo
ZWRQYWdlLmNwcDoKKyAgICAgICAgKiBoaXN0b3J5L0NhY2hlZFBhZ2UuaDoKKyAgICAgICAgKiBw
YWdlL0Nocm9tZS5jcHA6CisKIDIwMDctMTItMTYgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUu
Y29tPgogCiAgICAgICAgIC0gZml4IFRpZ2VyIGJ1aWxkIChteSBmYXVsdCBpdCB3YXMgYnJva2Vu
KQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNv
cmUucHJvCShyZXZpc2lvbiAyODc3NikKKysrIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHdvcmtpbmcg
Y29weSkKQEAgLTQxOCw2ICs0MTgsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBiaW5kaW5ncy9qcy9r
anNfbmF2aWdhdG9yLmNwcCBcCiAgICAgYmluZGluZ3MvanMva2pzX3Byb3h5LmNwcCBcCiAgICAg
YmluZGluZ3MvanMva2pzX3dpbmRvdy5jcHAgXAorICAgIGJpbmRpbmdzL2pzL1BhdXNlZFRpbWVv
dXRzLmNwcCBcCiAgICAgY3NzL0NTU0JvcmRlckltYWdlVmFsdWUuY3BwIFwKICAgICBjc3MvQ1NT
Q2hhcnNldFJ1bGUuY3BwIFwKICAgICBjc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNw
cCBcCkluZGV4OiBXZWJDb3JlL1dlYkNvcmVTb3VyY2VzLmJrbAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL1dlYkNvcmVTb3VyY2VzLmJrbAkocmV2aXNpb24gMjg3NzYpCisrKyBXZWJDb3JlL1dlYkNv
cmVTb3VyY2VzLmJrbAkod29ya2luZyBjb3B5KQpAQCAtOTIsNiArOTIsNyBAQCBUaGlzIGZpbGUg
Y29udGFpbnMgdGhlIGxpc3Qgb2YgZmlsZXMgbmVlCiAgICAgICAgIGJpbmRpbmdzL2pzL2tqc19u
YXZpZ2F0b3IuY3BwCiAgICAgICAgIGJpbmRpbmdzL2pzL2tqc19wcm94eS5jcHAKICAgICAgICAg
YmluZGluZ3MvanMva2pzX3dpbmRvdy5jcHAKKyAgICAgICAgYmluZGluZ3MvanMvUGF1c2VkVGlt
ZW91dHMuY3BwCiAgICAgPC9zZXQ+CiAgICAgCiAgICAgPHNldCBhcHBlbmQ9IjEiIHZhcj0iV0VC
Q09SRV9TT1VSQ0VTX0NTUyI+CkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3By
b2oJKHJldmlzaW9uIDI4Nzc2KQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvagkod29ya2luZyBjb3B5KQpAQCAtNzY0Nyw2ICs3NjQ3LDE0IEBACiAJCQkJCVJlbGF0aXZl
UGF0aD0iLi5cYmluZGluZ3NcanNca2pzX3dpbmRvdy5oIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+
DQorCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGJpbmRpbmdzXGpzXFBhdXNlZFRp
bWVvdXRzLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KKwkJCQkJUmVs
YXRpdmVQYXRoPSIuLlxiaW5kaW5nc1xqc1xQYXVzZWRUaW1lb3V0cy5oIg0KKwkJCQkJPg0KKwkJ
CQk8L0ZpbGU+DQogCQkJPC9GaWx0ZXI+DQogCQk8L0ZpbHRlcj4NCiAJCTxGaWx0ZXINCkluZGV4
OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjg3
NzYpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2lu
ZyBjb3B5KQpAQCAtMzY0Miw2ICszNjQyLDggQEAKIAkJQkM5QUREODAwQ0M0MDkyMjAwMDk4QzRD
IC8qIENTU1RyYW5zZm9ybVZhbHVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDOUFERDdGMENDNDA5MjIwMDA5OEM0QyAvKiBDU1NUcmFuc2Zvcm1W
YWx1ZS5jcHAgKi87IH07CiAJCUJDQTE2OUEyMEJGRDU1QjQwMDE5Q0E3NiAvKiBKU0hUTUxUYWJs
ZUNhcHRpb25FbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDQTE2OUEwMEJGRDU1QjQwMDE5Q0E3NiAvKiBKU0hUTUxUYWJsZUNhcHRpb25F
bGVtZW50LmNwcCAqLzsgfTsKIAkJQkNBMTY5QTMwQkZENTVCNDAwMTlDQTc2IC8qIEpTSFRNTFRh
YmxlQ2FwdGlvbkVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDQTE2OUExMEJGRDU1QjQwMDE5Q0E3NiAvKiBKU0hUTUxUYWJsZUNhcHRpb25F
bGVtZW50LmggKi87IH07CisJCUJDQTM3ODE2MEQxNUM2NDYwMEI3OTNENiAvKiBQYXVzZWRUaW1l
b3V0cy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBC
Q0EzNzgxNDBEMTVDNjQ2MDBCNzkzRDYgLyogUGF1c2VkVGltZW91dHMuY3BwICovOyB9OworCQlC
Q0EzNzgxNzBEMTVDNjQ2MDBCNzkzRDYgLyogUGF1c2VkVGltZW91dHMuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDQTM3ODE1MEQxNUM2NDYwMEI3OTNE
NiAvKiBQYXVzZWRUaW1lb3V0cy5oICovOyB9OwogCQlCQ0E4NUExMDBDM0FFQUY0MDA2RjgzMDgg
LyogRE9NU1ZHTnVtYmVySW50ZXJuYWwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDQTg1QTBGMEMzQUVBRjQwMDZGODMwOCAvKiBET01TVkdOdW1iZXJJ
bnRlcm5hbC5oICovOyB9OwogCQlCQ0FBOTBDMzBBN0VCQTYwMDA4QjEyMjkgLyogU2Nyb2xsQmFy
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDQUE5
MEMyMEE3RUJBNjAwMDhCMTIyOSAvKiBTY3JvbGxCYXIuY3BwICovOyB9OwogCQlCQ0IxNkI4QjA5
NzlCMDE0MDA0Njc3NDEgLyogRGVwcmVjYXRlZEFycmF5LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0IxNkI4ODA5NzlCMDE0MDA0Njc3NDEgLyogRGVw
cmVjYXRlZEFycmF5LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsg
fTsgfTsKQEAgLTc2NTEsNiArNzY1Myw4IEBACiAJCUJDOUFERDdGMENDNDA5MjIwMDA5OEM0QyAv
KiBDU1NUcmFuc2Zvcm1WYWx1ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gQ1NTVHJhbnNmb3JtVmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQlCQ0ExNjlBMDBCRkQ1NUI0MDAxOUNBNzYgLyogSlNIVE1MVGFibGVDYXB0aW9uRWxlbWVudC5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNIVE1MVGFibGVDYXB0
aW9uRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDQTE2OUExMEJG
RDU1QjQwMDE5Q0E3NiAvKiBKU0hUTUxUYWJsZUNhcHRpb25FbGVtZW50LmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBKU0hUTUxUYWJsZUNhcHRpb25FbGVtZW50Lmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUJDQTM3ODE0MEQxNUM2NDYwMEI3OTNENiAvKiBQYXVz
ZWRUaW1lb3V0cy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBQYXVz
ZWRUaW1lb3V0cy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUJDQTM3ODE1MEQx
NUM2NDYwMEI3OTNENiAvKiBQYXVzZWRUaW1lb3V0cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBQYXVzZWRUaW1lb3V0cy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQlCQ0E4NUEwRjBDM0FFQUY0MDA2RjgzMDggLyogRE9NU1ZHTnVtYmVySW50ZXJuYWwuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERPTVNWR051bWJlckludGVybmFsLmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDQUE5MEMyMEE3RUJBNjAwMDhCMTIyOSAvKiBT
Y3JvbGxCYXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IFNjcm9s
bEJhci5jcHA7IHBhdGggPSBwbGF0Zm9ybS9TY3JvbGxCYXIuY3BwOyBzb3VyY2VUcmVlID0gU09V
UkNFX1JPT1Q7IH07CiAJCUJDQjE2Qjg4MDk3OUIwMTQwMDQ2Nzc0MSAvKiBEZXByZWNhdGVkQXJy
YXkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERlcHJlY2F0ZWRBcnJheS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTE0MDQsNiArMTE0MDgsOCBAQAogCQkJ
CTkzQjcwRDU0MDlFQjBDN0MwMDlEODQ2OCAvKiBranNfcHJveHkuaCAqLywKIAkJCQk5M0I3MEQ1
OTA5RUIwQzdDMDA5RDg0NjggLyoga2pzX3dpbmRvdy5jcHAgKi8sCiAJCQkJOTNCNzBENUEwOUVC
MEM3QzAwOUQ4NDY4IC8qIGtqc193aW5kb3cuaCAqLywKKwkJCQlCQ0EzNzgxNDBEMTVDNjQ2MDBC
NzkzRDYgLyogUGF1c2VkVGltZW91dHMuY3BwICovLAorCQkJCUJDQTM3ODE1MEQxNUM2NDYwMEI3
OTNENiAvKiBQYXVzZWRUaW1lb3V0cy5oICovLAogCQkJKTsKIAkJCXBhdGggPSBqczsKIAkJCXNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC0xNDEwMCw2ICsxNDEwNiw3IEBACiAJCQkJQkM5MDRC
NzcwRDEwOTk4RjAwNjgwRDMyIC8qIENsYXNzTm9kZUxpc3QuaCBpbiBIZWFkZXJzICovLAogCQkJ
CUJDNEJGOUU1MEQxMUUxMzMwMDdEMjQ3RiAvKiBDbGFzc05hbWVzLmggaW4gSGVhZGVycyAqLywK
IAkJCQlCMjhCQzMxQTBEMTM1RTU0MDBDREJBMjcgLyogSlNFdmVudFRhcmdldEJhc2UubHV0Lmgg
aW4gSGVhZGVycyAqLywKKwkJCQlCQ0EzNzgxNzBEMTVDNjQ2MDBCNzkzRDYgLyogUGF1c2VkVGlt
ZW91dHMuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9z
dHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMTU4MTIsNiArMTU4MTksNyBAQAogCQkJCTkzQTM4
QjRCMEQwRTU4MDgwMDY4NzJDMiAvKiBFZGl0b3JDb21tYW5kLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCUJDOTA0Qjc2MEQxMDk5OEYwMDY4MEQzMiAvKiBDbGFzc05vZGVMaXN0LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCUJDNEJGOUU0MEQxMUUxMzMwMDdEMjQ3RiAvKiBDbGFzc05hbWVzLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCUJDQTM3ODE2MEQxNUM2NDYwMEI3OTNENiAvKiBQYXVzZWRUaW1l
b3V0cy5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBv
c3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvanMvUGF1c2Vk
VGltZW91dHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvanMvUGF1c2VkVGlt
ZW91dHMuY3BwCShyZXZpc2lvbiAyODc3NikJKGZyb20gV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNf
d2luZG93LmNwcDoyODc3NikKKysrIFdlYkNvcmUvYmluZGluZ3MvanMvUGF1c2VkVGltZW91dHMu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTY5OSBAQAorLy8gLSotIGMtYmFzaWMtb2Zm
c2V0OiA0IC0qLQorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgSGFycmkgUG9ydGVuIChwb3J0
ZW5Aa2RlLm9yZykKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgSm9uIFNoaWVyIChqc2hpZXJAaWFz
dGF0ZS5lZHUpCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNldmVkLgorICogIENvcHlyaWdodCAoQykgMjAwNiBB
bGV4ZXkgUHJvc2t1cnlha292IChhcEB3ZWJraXQub3JnKQorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBp
ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMQor
ICogIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJranNfd2luZG93
LmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVk
ZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiRE9NV2luZG93LmgiCisjaW5jbHVkZSAiRWxlbWVudC5o
IgorI2luY2x1ZGUgIkV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisj
aW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1
ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgorI2luY2x1ZGUgIkZy
YW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVUcmVlLmgiCisjaW5jbHVkZSAiR0NDb250cm9s
bGVyLmgiCisjaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiSlNET01FeGNlcHRp
b25Db25zdHJ1Y3Rvci5oIgorI2luY2x1ZGUgIkpTRE9NV2luZG93LmgiCisjaW5jbHVkZSAiSlNF
dmVudC5oIgorI2luY2x1ZGUgIkpTSFRNTEF1ZGlvRWxlbWVudENvbnN0cnVjdG9yLmgiCisjaW5j
bHVkZSAiSlNIVE1MQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkpTSFRNTE9wdGlvbkVsZW1lbnRD
b25zdHJ1Y3Rvci5oIgorI2luY2x1ZGUgIkpTWE1MSHR0cFJlcXVlc3QuaCIKKyNpbmNsdWRlICJM
b2dnaW5nLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU2NyZWVuLmgi
CisjaW5jbHVkZSAiUGx1Z0luSW5mb1N0b3JlLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgor
I2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNs
dWRlICJXaW5kb3dGZWF0dXJlcy5oIgorI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVk
ZSAia2pzX2Nzcy5oIgorI2luY2x1ZGUgImtqc19ldmVudHMuaCIKKyNpbmNsdWRlICJranNfbmF2
aWdhdG9yLmgiCisjaW5jbHVkZSAia2pzX3Byb3h5LmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRy
YXMuaD4KKworI2lmIEVOQUJMRShYU0xUKQorI2luY2x1ZGUgIkpTWFNMVFByb2Nlc3Nvci5oIgor
I2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIEV2ZW50
TmFtZXM7CisKK25hbWVzcGFjZSBLSlMgeworCitzdGF0aWMgaW50IGxhc3RVc2VkVGltZW91dElk
OworCitzdGF0aWMgaW50IHRpbWVyTmVzdGluZ0xldmVsID0gMDsKK2NvbnN0IGludCBjTWF4VGlt
ZXJOZXN0aW5nTGV2ZWwgPSA1OworY29uc3QgZG91YmxlIGNNaW5pbXVtVGltZXJJbnRlcnZhbCA9
IDAuMDEwOworCitzdHJ1Y3QgV2luZG93UHJpdmF0ZSB7CisgICAgV2luZG93UHJpdmF0ZSgpCisg
ICAgICAgIDogbG9jKDApCisgICAgICAgICwgbV9ldnQoMCkKKyAgICAgICAgLCBtX3JldHVyblZh
bHVlU2xvdCgwKQorICAgIHsKKyAgICB9CisKKyAgICBXaW5kb3c6Okxpc3RlbmVyc01hcCBqc0V2
ZW50TGlzdGVuZXJzOworICAgIFdpbmRvdzo6TGlzdGVuZXJzTWFwIGpzSFRNTEV2ZW50TGlzdGVu
ZXJzOworICAgIFdpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAganNVbnByb3RlY3RlZEV2
ZW50TGlzdGVuZXJzOworICAgIFdpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAganNVbnBy
b3RlY3RlZEhUTUxFdmVudExpc3RlbmVyczsKKyAgICBtdXRhYmxlIExvY2F0aW9uKiBsb2M7Cisg
ICAgV2ViQ29yZTo6RXZlbnQqIG1fZXZ0OworICAgIEpTVmFsdWUqKiBtX3JldHVyblZhbHVlU2xv
dDsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxpbnQsIERPTVdpbmRvd1RpbWVyKj4gVGltZW91dHNN
YXA7CisgICAgVGltZW91dHNNYXAgbV90aW1lb3V0czsKK307CisKK2NsYXNzIERPTVdpbmRvd1Rp
bWVyIDogcHVibGljIFRpbWVyQmFzZSB7CitwdWJsaWM6CisgICAgRE9NV2luZG93VGltZXIoaW50
IHRpbWVvdXRJZCwgaW50IG5lc3RpbmdMZXZlbCwgV2luZG93KiBvYmplY3QsIFNjaGVkdWxlZEFj
dGlvbiogYWN0aW9uKQorICAgICAgICA6IG1fdGltZW91dElkKHRpbWVvdXRJZCkKKyAgICAgICAg
LCBtX25lc3RpbmdMZXZlbChuZXN0aW5nTGV2ZWwpCisgICAgICAgICwgbV9vYmplY3Qob2JqZWN0
KQorICAgICAgICAsIG1fYWN0aW9uKGFjdGlvbikKKyAgICB7CisgICAgfQorCisgICAgdmlydHVh
bCB+RE9NV2luZG93VGltZXIoKQorICAgIHsKKyAgICAgICAgSlNMb2NrIGxvY2s7CisgICAgICAg
IGRlbGV0ZSBtX2FjdGlvbjsKKyAgICB9CisKKyAgICBpbnQgdGltZW91dElkKCkgY29uc3QgeyBy
ZXR1cm4gbV90aW1lb3V0SWQ7IH0KKworICAgIGludCBuZXN0aW5nTGV2ZWwoKSBjb25zdCB7IHJl
dHVybiBtX25lc3RpbmdMZXZlbDsgfQorICAgIHZvaWQgc2V0TmVzdGluZ0xldmVsKGludCBuKSB7
IG1fbmVzdGluZ0xldmVsID0gbjsgfQorCisgICAgU2NoZWR1bGVkQWN0aW9uKiBhY3Rpb24oKSBj
b25zdCB7IHJldHVybiBtX2FjdGlvbjsgfQorICAgIFNjaGVkdWxlZEFjdGlvbiogdGFrZUFjdGlv
bigpIHsgU2NoZWR1bGVkQWN0aW9uKiBhID0gbV9hY3Rpb247IG1fYWN0aW9uID0gMDsgcmV0dXJu
IGE7IH0KKworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgZmlyZWQoKTsKKworICAgIGludCBt
X3RpbWVvdXRJZDsKKyAgICBpbnQgbV9uZXN0aW5nTGV2ZWw7CisgICAgV2luZG93KiBtX29iamVj
dDsKKyAgICBTY2hlZHVsZWRBY3Rpb24qIG1fYWN0aW9uOworfTsKKworY2xhc3MgUGF1c2VkVGlt
ZW91dCB7CitwdWJsaWM6CisgICAgaW50IHRpbWVvdXRJZDsKKyAgICBpbnQgbmVzdGluZ0xldmVs
OworICAgIGRvdWJsZSBuZXh0RmlyZUludGVydmFsOworICAgIGRvdWJsZSByZXBlYXRJbnRlcnZh
bDsKKyAgICBTY2hlZHVsZWRBY3Rpb24gKmFjdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIEtK
UworCisjaW5jbHVkZSAia2pzX3dpbmRvdy5sdXQuaCIKKworbmFtZXNwYWNlIEtKUyB7CisKKy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8gV2luZG93IE9iamVjdCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8KKworY29uc3QgQ2xhc3NJbmZvIFdpbmRvdzo6aW5mbyA9IHsgIldpbmRvdyIsIDAsICZXaW5k
b3dUYWJsZSB9OworCisvKgorQGJlZ2luIFdpbmRvd1RhYmxlIDExOAorIyBXYXJuaW5nLCB3aGVu
IGFkZGluZyBhIGZ1bmN0aW9uIHRvIHRoaXMgb2JqZWN0IHlvdSBuZWVkIHRvIGFkZCBhIGNhc2Ug
aW4gV2luZG93OjpnZXQKKyMgLS0gRnVuY3Rpb25zIC0tCisgIGF0b2IgICAgICAgICAgICAgICAg
ICAmV2luZG93UHJvdG9GdW5jQVRvQjo6Y3JlYXRlICAgICAgICAgICAgICAgIERvbnREZWxldGV8
RnVuY3Rpb24gMQorICBidG9hICAgICAgICAgICAgICAgICAgJldpbmRvd1Byb3RvRnVuY0JUb0E6
OmNyZWF0ZSAgICAgICAgICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDEKKyAgb3BlbiAgICAg
ICAgICAgICAgICAgICZXaW5kb3dQcm90b0Z1bmNPcGVuOjpjcmVhdGUgICAgICAgICAgICAgICAg
RG9udERlbGV0ZXxGdW5jdGlvbiAzCisgIHNldFRpbWVvdXQgICAgICAgICAgICAmV2luZG93UHJv
dG9GdW5jU2V0VGltZW91dDo6Y3JlYXRlICAgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMgor
ICBjbGVhclRpbWVvdXQgICAgICAgICAgJldpbmRvd1Byb3RvRnVuY0NsZWFyVGltZW91dDo6Y3Jl
YXRlICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDEKKyAgc2V0SW50ZXJ2YWwgICAgICAgICAg
ICZXaW5kb3dQcm90b0Z1bmNTZXRJbnRlcnZhbDo6Y3JlYXRlICAgICAgICAgRG9udERlbGV0ZXxG
dW5jdGlvbiAyCisgIGNsZWFySW50ZXJ2YWwgICAgICAgICAmV2luZG93UHJvdG9GdW5jQ2xlYXJU
aW1lb3V0OjpjcmVhdGUgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQorICBhZGRFdmVudExp
c3RlbmVyICAgICAgJldpbmRvd1Byb3RvRnVuY0FkZEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSAgICBE
b250RGVsZXRlfEZ1bmN0aW9uIDMKKyAgcmVtb3ZlRXZlbnRMaXN0ZW5lciAgICZXaW5kb3dQcm90
b0Z1bmNSZW1vdmVFdmVudExpc3RlbmVyOjpjcmVhdGUgRG9udERlbGV0ZXxGdW5jdGlvbiAzCisg
IHNob3dNb2RhbERpYWxvZyAgICAgICAmV2luZG93UHJvdG9GdW5jU2hvd01vZGFsRGlhbG9nOjpj
cmVhdGUgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQorIyBOb3QgaW1wbGVtZW50ZWQKKyAgY2Fw
dHVyZUV2ZW50cyAgICAgICAgICZXaW5kb3dQcm90b0Z1bmNOb3RJbXBsZW1lbnRlZDo6Y3JlYXRl
ICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAwCisgIHJlbGVhc2VFdmVudHMgICAgICAgICAmV2lu
ZG93UHJvdG9GdW5jTm90SW1wbGVtZW50ZWQ6OmNyZWF0ZSAgICAgIERvbnREZWxldGV8RnVuY3Rp
b24gMAorCisjIC0tIEF0dHJpYnV0ZXMgLS0KKyAgY3J5cHRvICAgICAgICAgICAgICAgIFdpbmRv
dzo6Q3J5cHRvICAgICAgICAgICAgICBEb250RGVsZXRlfFJlYWRPbmx5CisgIGV2ZW50ICAgICAg
ICAgICAgICAgICBXaW5kb3c6OkV2ZW50XyAgICAgICAgICAgICAgRG9udERlbGV0ZQorICBsb2Nh
dGlvbiAgICAgICAgICAgICAgV2luZG93OjpMb2NhdGlvbl8gICAgICAgICAgIERvbnREZWxldGUK
KyAgbmF2aWdhdG9yICAgICAgICAgICAgIFdpbmRvdzo6TmF2aWdhdG9yXyAgICAgICAgICBEb250
RGVsZXRlfFJlYWRPbmx5CisgIGNsaWVudEluZm9ybWF0aW9uICAgICBXaW5kb3c6OkNsaWVudElu
Zm9ybWF0aW9uICAgRG9udERlbGV0ZXxSZWFkT25seQorIyAtLSBFdmVudCBMaXN0ZW5lcnMgLS0K
KyAgb25hYm9ydCAgICAgICAgICAgICAgIFdpbmRvdzo6T25hYm9ydCAgICAgICAgICAgICBEb250
RGVsZXRlCisgIG9uYmx1ciAgICAgICAgICAgICAgICBXaW5kb3c6Ok9uYmx1ciAgICAgICAgICAg
ICAgRG9udERlbGV0ZQorICBvbmNoYW5nZSAgICAgICAgICAgICAgV2luZG93OjpPbmNoYW5nZSAg
ICAgICAgICAgIERvbnREZWxldGUKKyAgb25jbGljayAgICAgICAgICAgICAgIFdpbmRvdzo6T25j
bGljayAgICAgICAgICAgICBEb250RGVsZXRlCisgIG9uZGJsY2xpY2sgICAgICAgICAgICBXaW5k
b3c6Ok9uZGJsY2xpY2sgICAgICAgICAgRG9udERlbGV0ZQorICBvbmVycm9yICAgICAgICAgICAg
ICAgV2luZG93OjpPbmVycm9yICAgICAgICAgICAgIERvbnREZWxldGUKKyAgb25mb2N1cyAgICAg
ICAgICAgICAgIFdpbmRvdzo6T25mb2N1cyAgICAgICAgICAgICBEb250RGVsZXRlCisgIG9ua2V5
ZG93biAgICAgICAgICAgICBXaW5kb3c6Ok9ua2V5ZG93biAgICAgICAgICAgRG9udERlbGV0ZQor
ICBvbmtleXByZXNzICAgICAgICAgICAgV2luZG93OjpPbmtleXByZXNzICAgICAgICAgIERvbnRE
ZWxldGUKKyAgb25rZXl1cCAgICAgICAgICAgICAgIFdpbmRvdzo6T25rZXl1cCAgICAgICAgICAg
ICBEb250RGVsZXRlCisgIG9ubG9hZCAgICAgICAgICAgICAgICBXaW5kb3c6Ok9ubG9hZCAgICAg
ICAgICAgICAgRG9udERlbGV0ZQorICBvbm1vdXNlZG93biAgICAgICAgICAgV2luZG93OjpPbm1v
dXNlZG93biAgICAgICAgIERvbnREZWxldGUKKyAgb25tb3VzZW1vdmUgICAgICAgICAgIFdpbmRv
dzo6T25tb3VzZW1vdmUgICAgICAgICBEb250RGVsZXRlCisgIG9ubW91c2VvdXQgICAgICAgICAg
ICBXaW5kb3c6Ok9ubW91c2VvdXQgICAgICAgICAgRG9udERlbGV0ZQorICBvbm1vdXNlb3ZlciAg
ICAgICAgICAgV2luZG93OjpPbm1vdXNlb3ZlciAgICAgICAgIERvbnREZWxldGUKKyAgb25tb3Vz
ZXVwICAgICAgICAgICAgIFdpbmRvdzo6T25tb3VzZXVwICAgICAgICAgICBEb250RGVsZXRlCisg
IG9ubW91c2V3aGVlbCAgICAgICAgICBXaW5kb3c6Ok9uV2luZG93TW91c2VXaGVlbCAgRG9udERl
bGV0ZQorICBvbnJlc2V0ICAgICAgICAgICAgICAgV2luZG93OjpPbnJlc2V0ICAgICAgICAgICAg
IERvbnREZWxldGUKKyAgb25yZXNpemUgICAgICAgICAgICAgIFdpbmRvdzo6T25yZXNpemUgICAg
ICAgICAgICBEb250RGVsZXRlCisgIG9uc2Nyb2xsICAgICAgICAgICAgICBXaW5kb3c6Ok9uc2Ny
b2xsICAgICAgICAgICAgRG9udERlbGV0ZQorICBvbnNlYXJjaCAgICAgICAgICAgICAgV2luZG93
OjpPbnNlYXJjaCAgICAgICAgICAgIERvbnREZWxldGUKKyAgb25zZWxlY3QgICAgICAgICAgICAg
IFdpbmRvdzo6T25zZWxlY3QgICAgICAgICAgICBEb250RGVsZXRlCisgIG9uc3VibWl0ICAgICAg
ICAgICAgICBXaW5kb3c6Ok9uc3VibWl0ICAgICAgICAgICAgRG9udERlbGV0ZQorICBvbnVubG9h
ZCAgICAgICAgICAgICAgV2luZG93OjpPbnVubG9hZCAgICAgICAgICAgIERvbnREZWxldGUKKyAg
b25iZWZvcmV1bmxvYWQgICAgICAgIFdpbmRvdzo6T25iZWZvcmV1bmxvYWQgICAgICBEb250RGVs
ZXRlCisjIC0tIENvbnN0cnVjdG9ycyAtLQorICBBdWRpbyAgICAgICAgICAgICAgICAgV2luZG93
OjpBdWRpbyAgICAgICAgICAgICAgIERvbnREZWxldGUKKyAgRE9NRXhjZXB0aW9uICAgICAgICAg
IFdpbmRvdzo6RE9NRXhjZXB0aW9uICAgICAgICBEb250RGVsZXRlCisgIEltYWdlICAgICAgICAg
ICAgICAgICBXaW5kb3c6OkltYWdlICAgICAgICAgICAgICAgRG9udERlbGV0ZQorICBPcHRpb24g
ICAgICAgICAgICAgICAgV2luZG93OjpPcHRpb24gICAgICAgICAgICAgIERvbnREZWxldGUKKyAg
WE1MSHR0cFJlcXVlc3QgICAgICAgIFdpbmRvdzo6WE1MSHR0cFJlcXVlc3QgICAgICBEb250RGVs
ZXRlCisgIFhTTFRQcm9jZXNzb3IgICAgICAgICBXaW5kb3c6OlhTTFRQcm9jZXNzb3JfICAgICAg
RG9udERlbGV0ZQorQGVuZAorKi8KKworV2luZG93OjpXaW5kb3coRE9NV2luZG93KiB3aW5kb3cp
CisgICAgOiBtX2ltcGwod2luZG93KQorICAgICwgZChuZXcgV2luZG93UHJpdmF0ZSkKK3sKKyAg
ICAvLyBXaW5kb3cgZGVzdHJ1Y3Rpb24gaXMgbm90IHRocmVhZC1zYWZlIGJlY2F1c2Ugb2YKKyAg
ICAvLyB0aGUgbm9uLXRocmVhZC1zYWZlIFdlYkNvcmUgc3RydWN0dXJlcyBpdCByZWZlcmVuY2Vz
LgorICAgIENvbGxlY3Rvcjo6Y29sbGVjdE9uTWFpblRocmVhZE9ubHkodGhpcyk7CisKKyAgICAv
LyBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjcmlwdCB0aW1lb3V0IGhhbmRsZXIg
a2lja3MgaW4uCisgICAgc2V0VGltZW91dFRpbWUoMTAwMDApOworfQorCitXaW5kb3c6On5XaW5k
b3coKQoreworICAgIGNsZWFyQWxsVGltZW91dHMoKTsKKworICAgIC8vIENsZWFyIGFueSBiYWNr
cG9pbnRlcnMgdG8gdGhlIHdpbmRvdworCisgICAgTGlzdGVuZXJzTWFwOjppdGVyYXRvciBpMiA9
IGQtPmpzRXZlbnRMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICBMaXN0ZW5lcnNNYXA6Oml0ZXJhdG9y
IGUyID0gZC0+anNFdmVudExpc3RlbmVycy5lbmQoKTsKKyAgICBmb3IgKDsgaTIgIT0gZTI7ICsr
aTIpCisgICAgICAgIGkyLT5zZWNvbmQtPmNsZWFyV2luZG93T2JqKCk7CisgICAgaTIgPSBkLT5q
c0hUTUxFdmVudExpc3RlbmVycy5iZWdpbigpOworICAgIGUyID0gZC0+anNIVE1MRXZlbnRMaXN0
ZW5lcnMuZW5kKCk7CisgICAgZm9yICg7IGkyICE9IGUyOyArK2kyKQorICAgICAgICBpMi0+c2Vj
b25kLT5jbGVhcldpbmRvd09iaigpOworCisgICAgVW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXA6Oml0
ZXJhdG9yIGkxID0gZC0+anNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXJzLmJlZ2luKCk7CisgICAg
VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXA6Oml0ZXJhdG9yIGUxID0gZC0+anNVbnByb3RlY3RlZEV2
ZW50TGlzdGVuZXJzLmVuZCgpOworICAgIGZvciAoOyBpMSAhPSBlMTsgKytpMSkKKyAgICAgICAg
aTEtPnNlY29uZC0+Y2xlYXJXaW5kb3dPYmooKTsKKyAgICBpMSA9IGQtPmpzVW5wcm90ZWN0ZWRI
VE1MRXZlbnRMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICBlMSA9IGQtPmpzVW5wcm90ZWN0ZWRIVE1M
RXZlbnRMaXN0ZW5lcnMuZW5kKCk7CisgICAgZm9yICg7IGkxICE9IGUxOyArK2kxKQorICAgICAg
ICBpMS0+c2Vjb25kLT5jbGVhcldpbmRvd09iaigpOworfQorCitXaW5kb3cqIFdpbmRvdzo6cmV0
cmlldmVXaW5kb3coRnJhbWUqIGZyYW1lKQoreworICAgIEpTT2JqZWN0KiBvID0gcmV0cmlldmUo
ZnJhbWUpLT5nZXRPYmplY3QoKTsKKworICAgIEFTU0VSVChvIHx8ICFmcmFtZS0+c2V0dGluZ3Mo
KSB8fCAhZnJhbWUtPnNldHRpbmdzKCktPmlzSmF2YVNjcmlwdEVuYWJsZWQoKSk7CisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PFdpbmRvdyo+KG8pOworfQorCitXaW5kb3cqIFdpbmRvdzo6cmV0cmll
dmVBY3RpdmUoRXhlY1N0YXRlKiBleGVjKQoreworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QgPSBleGVjLT5keW5hbWljR2xvYmFsT2JqZWN0KCk7CisgICAgQVNTRVJUKGdsb2JhbE9i
amVjdCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFdpbmRvdyo+KGdsb2JhbE9iamVjdCk7Cit9
CisKK0pTVmFsdWUqIFdpbmRvdzo6cmV0cmlldmUoRnJhbWUqIGZyYW1lKQoreworICAgIEFTU0VS
VChmcmFtZSk7CisgICAgaWYgKEtKU1Byb3h5KiBwcm94eSA9IGZyYW1lLT5zY3JpcHRQcm94eSgp
KQorICAgICAgICByZXR1cm4gcHJveHktPmdsb2JhbE9iamVjdCgpOyAvLyB0aGUgR2xvYmFsIG9i
amVjdCBpcyB0aGUgIndpbmRvdyIKKworICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOyAvLyBUaGlz
IGNhbiBoYXBwZW4gd2l0aCBKUyBkaXNhYmxlZCBvbiB0aGUgZG9tYWluIG9mIHRoYXQgd2luZG93
Cit9CisKK0xvY2F0aW9uKiBXaW5kb3c6OmxvY2F0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoIWQt
PmxvYykKKyAgICAgICAgZC0+bG9jID0gbmV3IExvY2F0aW9uKGltcGwoKS0+ZnJhbWUoKSk7Cisg
ICAgcmV0dXJuIGQtPmxvYzsKK30KKworLy8gcmVmZXJlbmNlIG91ciBzcGVjaWFsIG9iamVjdHMg
ZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbgordm9pZCBXaW5kb3c6Om1hcmsoKQoreworICAgIEpT
R2xvYmFsT2JqZWN0OjptYXJrKCk7CisgICAgaWYgKGQtPmxvYyAmJiAhZC0+bG9jLT5tYXJrZWQo
KSkKKyAgICAgICAgZC0+bG9jLT5tYXJrKCk7Cit9CisKK3N0YXRpYyBib29sIGFsbG93UG9wVXAo
RnJhbWUqIGZyYW1lKQoreworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAoZnJhbWUtPnNjcmlwdFByb3h5KCktPnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBmcmFtZS0+c2V0
dGluZ3MoKTsKKyAgICByZXR1cm4gc2V0dGluZ3MgJiYgc2V0dGluZ3MtPkphdmFTY3JpcHRDYW5P
cGVuV2luZG93c0F1dG9tYXRpY2FsbHkoKTsKK30KKworc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBT
dHJpbmc+IHBhcnNlTW9kYWxEaWFsb2dGZWF0dXJlcyhjb25zdCBTdHJpbmcmIGZlYXR1cmVzQXJn
KQoreworICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcDsKKworICAgIFZlY3RvcjxTdHJp
bmc+IGZlYXR1cmVzID0gZmVhdHVyZXNBcmcuc3BsaXQoJzsnKTsKKyAgICBWZWN0b3I8U3RyaW5n
Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gZmVhdHVyZXMuZW5kKCk7CisgICAgZm9yIChWZWN0b3I8
U3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAqaXQ7CisgICAgICAgIGludCBwb3MgPSBzLmZp
bmQoJz0nKTsKKyAgICAgICAgaW50IGNvbG9uUG9zID0gcy5maW5kKCc6Jyk7CisgICAgICAgIGlm
IChwb3MgPj0gMCAmJiBjb2xvblBvcyA+PSAwKQorICAgICAgICAgICAgY29udGludWU7IC8vIGln
bm9yZSBhbnkgc3RyaW5ncyB0aGF0IGhhdmUgYm90aCA9IGFuZCA6CisgICAgICAgIGlmIChwb3Mg
PCAwKQorICAgICAgICAgICAgcG9zID0gY29sb25Qb3M7CisgICAgICAgIGlmIChwb3MgPCAwKSB7
CisgICAgICAgICAgICAvLyBudWxsIHN0cmluZyBmb3IgdmFsdWUgbWVhbnMga2V5IHdpdGhvdXQg
dmFsdWUKKyAgICAgICAgICAgIG1hcC5zZXQocy5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpLCBT
dHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gcy5s
ZWZ0KHBvcykuc3RyaXBXaGl0ZVNwYWNlKCkubG93ZXIoKTsKKyAgICAgICAgICAgIFN0cmluZyB2
YWwgPSBzLnN1YnN0cmluZyhwb3MgKyAxKS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpOworICAg
ICAgICAgICAgaW50IHNwYWNlUG9zID0gdmFsLmZpbmQoJyAnKTsKKyAgICAgICAgICAgIGlmIChz
cGFjZVBvcyAhPSAtMSkKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWwubGVmdChzcGFjZVBvcyk7
CisgICAgICAgICAgICBtYXAuc2V0KGtleSwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHJldHVybiBtYXA7Cit9CisKK3N0YXRpYyBGcmFtZSogY3JlYXRlV2luZG93KEV4ZWNTdGF0ZSog
ZXhlYywgRnJhbWUqIG9wZW5lckZyYW1lLCBjb25zdCBTdHJpbmcmIHVybCwKKyAgICBjb25zdCBT
dHJpbmcmIGZyYW1lTmFtZSwgY29uc3QgV2luZG93RmVhdHVyZXMmIHdpbmRvd0ZlYXR1cmVzLCBK
U1ZhbHVlKiBkaWFsb2dBcmdzKQoreworICAgIEZyYW1lKiBhY3RpdmVGcmFtZSA9IFdpbmRvdzo6
cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwoKS0+ZnJhbWUoKTsKKworICAgIFJlc291cmNlUmVx
dWVzdCByZXF1ZXN0OworICAgIGlmIChhY3RpdmVGcmFtZSkKKyAgICAgICAgcmVxdWVzdC5zZXRI
VFRQUmVmZXJyZXIoYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCkpOwor
ICAgIEZyYW1lTG9hZFJlcXVlc3QgZnJhbWVSZXF1ZXN0KHJlcXVlc3QsIGZyYW1lTmFtZSk7CisK
KyAgICAvLyBGSVhNRTogSXQncyBtdWNoIGJldHRlciBmb3IgY2xpZW50IEFQSSBpZiBhIG5ldyB3
aW5kb3cgc3RhcnRzIHdpdGggYSBVUkwsIGhlcmUgd2hlcmUgd2UKKyAgICAvLyBrbm93IHdoYXQg
VVJMIHdlIGFyZSBnb2luZyB0byBvcGVuLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGNvZGUgcGFzc2Vz
IHRoZSBlbXB0eSBzdHJpbmcKKyAgICAvLyBmb3IgdGhlIFVSTCwgYnV0IHRoZXJlJ3MgYSByZWFz
b24gZm9yIHRoYXQuIEJlZm9yZSBsb2FkaW5nIHdlIGhhdmUgdG8gc2V0IHVwIHRoZSBvcGVuZXIs
CisgICAgLy8gb3BlbmVkQnlET00sIGFuZCBkaWFsb2dBcmd1bWVudHMgdmFsdWVzLiBBbHNvLCB0
byBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIFVSTCB3ZSBjdXJyZW50bHkKKyAgICAvLyBkbyBh
biBhbGxvd3NBY2Nlc3NGcm9tIGNhbGwgdXNpbmcgdGhlIHdpbmRvdyB3ZSBjcmVhdGUsIHdoaWNo
IGNhbid0IGJlIGRvbmUgYmVmb3JlIGNyZWF0aW5nIGl0LgorICAgIC8vIFdlJ2QgaGF2ZSB0byBy
ZXNvbHZlIGFsbCB0aG9zZSBpc3N1ZXMgdG8gcGFzcyB0aGUgVVJMIGluc3RlYWQgb2YgIiIuCisK
KyAgICBib29sIGNyZWF0ZWQ7CisgICAgRnJhbWUqIG5ld0ZyYW1lID0gb3BlbmVyRnJhbWUtPmxv
YWRlcigpLT5jcmVhdGVXaW5kb3coZnJhbWVSZXF1ZXN0LCB3aW5kb3dGZWF0dXJlcywgY3JlYXRl
ZCk7CisgICAgaWYgKCFuZXdGcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBuZXdGcmFt
ZS0+bG9hZGVyKCktPnNldE9wZW5lcihvcGVuZXJGcmFtZSk7CisgICAgbmV3RnJhbWUtPmxvYWRl
cigpLT5zZXRPcGVuZWRCeURPTSgpOworCisgICAgV2luZG93KiBuZXdXaW5kb3cgPSBXaW5kb3c6
OnJldHJpZXZlV2luZG93KG5ld0ZyYW1lKTsKKworICAgIGlmIChkaWFsb2dBcmdzKQorICAgICAg
ICBuZXdXaW5kb3ctPnB1dERpcmVjdCgiZGlhbG9nQXJndW1lbnRzIiwgZGlhbG9nQXJncyk7CisK
KyAgICBpZiAoIXVybC5zdGFydHNXaXRoKCJqYXZhc2NyaXB0OiIsIGZhbHNlKSB8fCBuZXdXaW5k
b3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpIHsKKyAgICAgICAgU3RyaW5nIGNvbXBsZXRlZFVS
TCA9IHVybC5pc0VtcHR5KCkgPyB1cmwgOiBhY3RpdmVGcmFtZS0+ZG9jdW1lbnQoKS0+Y29tcGxl
dGVVUkwodXJsKTsKKyAgICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IGFjdGl2ZUZyYW1lLT5zY3Jp
cHRQcm94eSgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKTsKKworICAgICAgICBpZiAoY3JlYXRl
ZCkgeworICAgICAgICAgICAgbmV3RnJhbWUtPmxvYWRlcigpLT5jaGFuZ2VMb2NhdGlvbihLVVJM
KGNvbXBsZXRlZFVSTC5kZXByZWNhdGVkU3RyaW5nKCkpLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCkt
Pm91dGdvaW5nUmVmZXJyZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKKyAgICAgICAgICAgIGlm
IChEb2N1bWVudCogb2xkRG9jID0gb3BlbmVyRnJhbWUtPmRvY3VtZW50KCkpIHsKKyAgICAgICAg
ICAgICAgICBuZXdGcmFtZS0+ZG9jdW1lbnQoKS0+c2V0RG9tYWluSW50ZXJuYWwob2xkRG9jLT5k
b21haW4oKSk7CisgICAgICAgICAgICAgICAgbmV3RnJhbWUtPmRvY3VtZW50KCktPnNldEJhc2VV
Ukwob2xkRG9jLT5iYXNlVVJMKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYg
KCF1cmwuaXNFbXB0eSgpKQorICAgICAgICAgICAgbmV3RnJhbWUtPmxvYWRlcigpLT5zY2hlZHVs
ZUxvY2F0aW9uQ2hhbmdlKGNvbXBsZXRlZFVSTCwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRn
b2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2VyR2VzdHVyZSk7CisgICAgfQorCisgICAgcmV0dXJu
IG5ld0ZyYW1lOworfQorCitzdGF0aWMgYm9vbCBjYW5TaG93TW9kYWxEaWFsb2coY29uc3QgRnJh
bWUqIGZyYW1lKQoreworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNhblJ1bk1vZGFsKCk7Cit9CisKK3N0
YXRpYyBib29sIGNhblNob3dNb2RhbERpYWxvZ05vdyhjb25zdCBGcmFtZSogZnJhbWUpCit7Cisg
ICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBmcmFtZS0+
cGFnZSgpLT5jaHJvbWUoKS0+Y2FuUnVuTW9kYWxOb3coKTsKK30KKworc3RhdGljIEpTVmFsdWUq
IHNob3dNb2RhbERpYWxvZyhFeGVjU3RhdGUqIGV4ZWMsIEZyYW1lKiBmcmFtZSwgY29uc3QgU3Ry
aW5nJiB1cmwsIEpTVmFsdWUqIGRpYWxvZ0FyZ3MsIGNvbnN0IFN0cmluZyYgZmVhdHVyZUFyZ3Mp
Cit7CisgICAgaWYgKCFjYW5TaG93TW9kYWxEaWFsb2dOb3coZnJhbWUpIHx8ICFhbGxvd1BvcFVw
KGZyYW1lKSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisKKyAgICBjb25zdCBIYXNo
TWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlcyA9IHBhcnNlTW9kYWxEaWFsb2dGZWF0dXJlcyhm
ZWF0dXJlQXJncyk7CisKKyAgICBjb25zdCBib29sIHRydXN0ZWQgPSBmYWxzZTsKKworICAgIC8v
IFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgZnJvbSBNaWNyb3NvZnQncyBkb2N1bWVudGF0aW9uIGFy
ZSBub3QgaW1wbGVtZW50ZWQ6CisgICAgLy8gLSBkZWZhdWx0IGZvbnQgc2V0dGluZ3MKKyAgICAv
LyAtIHdpZHRoLCBoZWlnaHQsIGxlZnQsIGFuZCB0b3Agc3BlY2lmaWVkIGluIHVuaXRzIG90aGVy
IHRoYW4gInB4IgorICAgIC8vIC0gZWRnZSAoc3Vua2VuIG9yIHJhaXNlZCwgZGVmYXVsdCBpcyBy
YWlzZWQpCisgICAgLy8gLSBkaWFsb2dIaWRlOiB0cnVzdGVkICYmIGJvb2xGZWF0dXJlKGZlYXR1
cmVzLCAiZGlhbG9naGlkZSIpLCBtYWtlcyBkaWFsb2cgaGlkZSB3aGVuIHlvdSBwcmludAorICAg
IC8vIC0gaGVscDogYm9vbEZlYXR1cmUoZmVhdHVyZXMsICJoZWxwIiwgdHJ1ZSksIG1ha2VzIGhl
bHAgaWNvbiBhcHBlYXIgaW4gZGlhbG9nICh3aGF0IGRvZXMgaXQgZG8gb24gV2luZG93cz8pCisg
ICAgLy8gLSB1bmFkb3JuZWQ6IHRydXN0ZWQgJiYgYm9vbEZlYXR1cmUoZmVhdHVyZXMsICJ1bmFk
b3JuZWQiKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgp
OworCisgICAgRmxvYXRSZWN0IHNjcmVlblJlY3QgPSBzY3JlZW5BdmFpbGFibGVSZWN0KGZyYW1l
LT52aWV3KCkpOworCisgICAgV2luZG93RmVhdHVyZXMgd2FyZ3M7CisgICAgd2FyZ3Mud2lkdGgg
PSBXaW5kb3dGZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9nd2lkdGgiLCAx
MDAsIHNjcmVlblJlY3Qud2lkdGgoKSwgNjIwKTsgLy8gZGVmYXVsdCBoZXJlIGNhbWUgZnJvbSBm
cmFtZSBzaXplIG9mIGRpYWxvZyBpbiBNYWNJRQorICAgIHdhcmdzLndpZHRoU2V0ID0gdHJ1ZTsK
KyAgICB3YXJncy5oZWlnaHQgPSBXaW5kb3dGZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGZlYXR1cmVz
LCAiZGlhbG9naGVpZ2h0IiwgMTAwLCBzY3JlZW5SZWN0LmhlaWdodCgpLCA0NTApOyAvLyBkZWZh
dWx0IGhlcmUgY2FtZSBmcm9tIGZyYW1lIHNpemUgb2YgZGlhbG9nIGluIE1hY0lFCisgICAgd2Fy
Z3MuaGVpZ2h0U2V0ID0gdHJ1ZTsKKworICAgIHdhcmdzLnggPSBXaW5kb3dGZWF0dXJlczo6Zmxv
YXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9nbGVmdCIsIHNjcmVlblJlY3QueCgpLCBzY3JlZW5S
ZWN0LnJpZ2h0KCkgLSB3YXJncy53aWR0aCwgLTEpOworICAgIHdhcmdzLnhTZXQgPSB3YXJncy54
ID4gMDsKKyAgICB3YXJncy55ID0gV2luZG93RmVhdHVyZXM6OmZsb2F0RmVhdHVyZShmZWF0dXJl
cywgImRpYWxvZ3RvcCIsIHNjcmVlblJlY3QueSgpLCBzY3JlZW5SZWN0LmJvdHRvbSgpIC0gd2Fy
Z3MuaGVpZ2h0LCAtMSk7CisgICAgd2FyZ3MueVNldCA9IHdhcmdzLnkgPiAwOworCisgICAgaWYg
KFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgImNlbnRlciIsIHRydWUpKSB7
CisgICAgICAgIGlmICghd2FyZ3MueFNldCkgeworICAgICAgICAgICAgd2FyZ3MueCA9IHNjcmVl
blJlY3QueCgpICsgKHNjcmVlblJlY3Qud2lkdGgoKSAtIHdhcmdzLndpZHRoKSAvIDI7CisgICAg
ICAgICAgICB3YXJncy54U2V0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXdhcmdz
LnlTZXQpIHsKKyAgICAgICAgICAgIHdhcmdzLnkgPSBzY3JlZW5SZWN0LnkoKSArIChzY3JlZW5S
ZWN0LmhlaWdodCgpIC0gd2FyZ3MuaGVpZ2h0KSAvIDI7CisgICAgICAgICAgICB3YXJncy55U2V0
ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdhcmdzLmRpYWxvZyA9IHRydWU7Cisg
ICAgd2FyZ3MucmVzaXphYmxlID0gV2luZG93RmVhdHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVz
LCAicmVzaXphYmxlIik7CisgICAgd2FyZ3Muc2Nyb2xsYmFyc1Zpc2libGUgPSBXaW5kb3dGZWF0
dXJlczo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJzY3JvbGwiLCB0cnVlKTsKKyAgICB3YXJncy5z
dGF0dXNCYXJWaXNpYmxlID0gV2luZG93RmVhdHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVzLCAi
c3RhdHVzIiwgIXRydXN0ZWQpOworICAgIHdhcmdzLm1lbnVCYXJWaXNpYmxlID0gZmFsc2U7Cisg
ICAgd2FyZ3MudG9vbEJhclZpc2libGUgPSBmYWxzZTsKKyAgICB3YXJncy5sb2NhdGlvbkJhclZp
c2libGUgPSBmYWxzZTsKKyAgICB3YXJncy5mdWxsc2NyZWVuID0gZmFsc2U7CisKKyAgICBGcmFt
ZSogZGlhbG9nRnJhbWUgPSBjcmVhdGVXaW5kb3coZXhlYywgZnJhbWUsIHVybCwgIiIsIHdhcmdz
LCBkaWFsb2dBcmdzKTsKKyAgICBpZiAoIWRpYWxvZ0ZyYW1lKQorICAgICAgICByZXR1cm4ganNV
bmRlZmluZWQoKTsKKworICAgIFdpbmRvdyogZGlhbG9nV2luZG93ID0gV2luZG93OjpyZXRyaWV2
ZVdpbmRvdyhkaWFsb2dGcmFtZSk7CisKKyAgICAvLyBHZXQgdGhlIHJldHVybiB2YWx1ZSBlaXRo
ZXIganVzdCBiZWZvcmUgY2xlYXJpbmcgdGhlIGRpYWxvZyB3aW5kb3cncworICAgIC8vIHByb3Bl
cnRpZXMgKGluIFdpbmRvdzo6Y2xlYXIpLCBvciB3aGVuIG9uIHJldHVybiBmcm9tIHJ1bk1vZGFs
LgorICAgIEpTVmFsdWUqIHJldHVyblZhbHVlID0gMDsKKyAgICBkaWFsb2dXaW5kb3ctPnNldFJl
dHVyblZhbHVlU2xvdCgmcmV0dXJuVmFsdWUpOworICAgIGRpYWxvZ0ZyYW1lLT5wYWdlKCktPmNo
cm9tZSgpLT5ydW5Nb2RhbCgpOworICAgIGRpYWxvZ1dpbmRvdy0+c2V0UmV0dXJuVmFsdWVTbG90
KDApOworCisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybiB2YWx1ZSwgZ2V0IGl0IG5v
dy4KKyAgICAvLyBFaXRoZXIgV2luZG93OjpjbGVhciB3YXMgbm90IGNhbGxlZCB5ZXQsIG9yIHRo
ZXJlIHdhcyBubyByZXR1cm4gdmFsdWUsCisgICAgLy8gYW5kIGluIHRoYXQgY2FzZSwgdGhlcmUn
cyBubyBoYXJtIGluIHRyeWluZyBhZ2FpbiAobm8gYmVuZWZpdCBlaXRoZXIpLgorICAgIGlmICgh
cmV0dXJuVmFsdWUpCisgICAgICAgIHJldHVyblZhbHVlID0gZGlhbG9nV2luZG93LT5nZXREaXJl
Y3QoInJldHVyblZhbHVlIik7CisKKyAgICByZXR1cm4gcmV0dXJuVmFsdWUgPyByZXR1cm5WYWx1
ZSA6IGpzVW5kZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUgKldpbmRvdzo6Z2V0VmFsdWVQcm9wZXJ0
eShFeGVjU3RhdGUgKmV4ZWMsIGludCB0b2tlbikgY29uc3QKK3sKKyAgIEFTU0VSVChpbXBsKCkt
PmZyYW1lKCkpOworCisgICBzd2l0Y2ggKHRva2VuKSB7CisgICBjYXNlIENyeXB0bzoKKyAgICAg
IHJldHVybiBqc1VuZGVmaW5lZCgpOyAvLyBGSVhNRTogaW1wbGVtZW50IHRoaXMKKyAgIGNhc2Ug
RE9NRXhjZXB0aW9uOgorICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAg
ICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgIHJldHVybiBnZXRET01FeGNlcHRpb25Db25z
dHJ1Y3RvcihleGVjKTsKKyAgICBjYXNlIEV2ZW50XzoKKyAgICAgIGlmICghYWxsb3dzQWNjZXNz
RnJvbShleGVjKSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICBpZiAoIWQt
Pm1fZXZ0KQorICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgIHJldHVybiB0b0pT
KGV4ZWMsIGQtPm1fZXZ0KTsKKyAgICBjYXNlIExvY2F0aW9uXzoKKyAgICAgIHJldHVybiBsb2Nh
dGlvbigpOworICAgIGNhc2UgTmF2aWdhdG9yXzoKKyAgICBjYXNlIENsaWVudEluZm9ybWF0aW9u
OiB7CisgICAgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHJldHVybiBq
c1VuZGVmaW5lZCgpOworICAgICAgLy8gU3RvcmUgdGhlIG5hdmlnYXRvciBpbiB0aGUgb2JqZWN0
IHNvIHdlIGdldCB0aGUgc2FtZSBvbmUgZWFjaCB0aW1lLgorICAgICAgTmF2aWdhdG9yICpuID0g
bmV3IE5hdmlnYXRvcihleGVjLCBpbXBsKCktPmZyYW1lKCkpOworICAgICAgLy8gRklYTUU6IHRo
aXMgd2lsbCBtYWtlIHRoZSAibmF2aWdhdG9yIiBvYmplY3QgYWNjZXNzaWJsZSBmcm9tIHdpbmRv
d3MgdGhhdCBmYWlsCisgICAgICAvLyB0aGUgc2VjdXJpdHkgY2hlY2sgdGhlIGZpcnN0IHRpbWUs
IGJ1dCBub3Qgc3Vic2VxdWVudCB0aW1lcywgc2VlbXMgd2VpcmQuCisgICAgICBjb25zdF9jYXN0
PFdpbmRvdyAqPih0aGlzKS0+cHV0RGlyZWN0KCJuYXZpZ2F0b3IiLCBuLCBEb250RGVsZXRlfFJl
YWRPbmx5KTsKKyAgICAgIGNvbnN0X2Nhc3Q8V2luZG93ICo+KHRoaXMpLT5wdXREaXJlY3QoImNs
aWVudEluZm9ybWF0aW9uIiwgbiwgRG9udERlbGV0ZXxSZWFkT25seSk7CisgICAgICByZXR1cm4g
bjsKKyAgICB9CisgICAgY2FzZSBJbWFnZToKKyAgICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShl
eGVjKSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICAvLyBGSVhNRTogdGhp
cyBwcm9wZXJ0eSAoYW5kIHRoZSBmZXcgYmVsb3cpIHByb2JhYmx5IHNob3VsZG4ndCBjcmVhdGUg
YSBuZXcgb2JqZWN0IGV2ZXJ5CisgICAgICAvLyB0aW1lCisgICAgICByZXR1cm4gbmV3IEltYWdl
Q29uc3RydWN0b3JJbXAoZXhlYywgaW1wbCgpLT5mcmFtZSgpLT5kb2N1bWVudCgpKTsKKyAgICBj
YXNlIE9wdGlvbjoKKyAgICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICByZXR1cm4gbmV3IEpTSFRNTE9wdGlvbkVsZW1l
bnRDb25zdHJ1Y3RvcihleGVjLCBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCkpOworICAgIGNh
c2UgWE1MSHR0cFJlcXVlc3Q6CisgICAgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisg
ICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAgcmV0dXJuIG5ldyBKU1hNTEh0dHBS
ZXF1ZXN0Q29uc3RydWN0b3JJbXAoZXhlYywgaW1wbCgpLT5mcmFtZSgpLT5kb2N1bWVudCgpKTsK
KyAgICBjYXNlIEF1ZGlvOgorI2lmIEVOQUJMRShWSURFTykKKyAgICAgIHJldHVybiBuZXcgSlNI
VE1MQXVkaW9FbGVtZW50Q29uc3RydWN0b3IoZXhlYywgaW1wbCgpLT5mcmFtZSgpLT5kb2N1bWVu
dCgpKTsKKyNlbHNlCisgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyNlbmRpZgorI2lmIEVO
QUJMRShYU0xUKQorICAgIGNhc2UgWFNMVFByb2Nlc3Nvcl86CisgICAgICBpZiAoIWFsbG93c0Fj
Y2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAgcmV0
dXJuIG5ldyBYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3JJbXAoZXhlYyk7CisjZWxzZQorICAgIGNh
c2UgWFNMVFByb2Nlc3Nvcl86CisgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyNlbmRpZgor
ICAgfQorCisgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgIHJldHVybiBqc1Vu
ZGVmaW5lZCgpOworCisgICBzd2l0Y2ggKHRva2VuKSB7CisgICBjYXNlIE9uYWJvcnQ6CisgICAg
IHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBhYm9ydEV2ZW50KTsKKyAgIGNhc2UgT25ibHVyOgor
ICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgYmx1ckV2ZW50KTsKKyAgIGNhc2UgT25jaGFu
Z2U6CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBjaGFuZ2VFdmVudCk7CisgICBjYXNl
IE9uY2xpY2s6CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBjbGlja0V2ZW50KTsKKyAg
IGNhc2UgT25kYmxjbGljazoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGRibGNsaWNr
RXZlbnQpOworICAgY2FzZSBPbmVycm9yOgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywg
ZXJyb3JFdmVudCk7CisgICBjYXNlIE9uZm9jdXM6CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihl
eGVjLCBmb2N1c0V2ZW50KTsKKyAgIGNhc2UgT25rZXlkb3duOgorICAgICByZXR1cm4gZ2V0TGlz
dGVuZXIoZXhlYywga2V5ZG93bkV2ZW50KTsKKyAgIGNhc2UgT25rZXlwcmVzczoKKyAgICAgcmV0
dXJuIGdldExpc3RlbmVyKGV4ZWMsIGtleXByZXNzRXZlbnQpOworICAgY2FzZSBPbmtleXVwOgor
ICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywga2V5dXBFdmVudCk7CisgICBjYXNlIE9ubG9h
ZDoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGxvYWRFdmVudCk7CisgICBjYXNlIE9u
bW91c2Vkb3duOgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgbW91c2Vkb3duRXZlbnQp
OworICAgY2FzZSBPbm1vdXNlbW92ZToKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIG1v
dXNlbW92ZUV2ZW50KTsKKyAgIGNhc2UgT25tb3VzZW91dDoKKyAgICAgcmV0dXJuIGdldExpc3Rl
bmVyKGV4ZWMsIG1vdXNlb3V0RXZlbnQpOworICAgY2FzZSBPbm1vdXNlb3ZlcjoKKyAgICAgcmV0
dXJuIGdldExpc3RlbmVyKGV4ZWMsIG1vdXNlb3ZlckV2ZW50KTsKKyAgIGNhc2UgT25tb3VzZXVw
OgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgbW91c2V1cEV2ZW50KTsKKyAgIGNhc2Ug
T25XaW5kb3dNb3VzZVdoZWVsOgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgbW91c2V3
aGVlbEV2ZW50KTsKKyAgIGNhc2UgT25yZXNldDoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4
ZWMsIHJlc2V0RXZlbnQpOworICAgY2FzZSBPbnJlc2l6ZToKKyAgICAgcmV0dXJuIGdldExpc3Rl
bmVyKGV4ZWMscmVzaXplRXZlbnQpOworICAgY2FzZSBPbnNjcm9sbDoKKyAgICAgcmV0dXJuIGdl
dExpc3RlbmVyKGV4ZWMsc2Nyb2xsRXZlbnQpOworICAgY2FzZSBPbnNlYXJjaDoKKyAgICAgcmV0
dXJuIGdldExpc3RlbmVyKGV4ZWMsc2VhcmNoRXZlbnQpOworICAgY2FzZSBPbnNlbGVjdDoKKyAg
ICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsc2VsZWN0RXZlbnQpOworICAgY2FzZSBPbnN1Ym1p
dDoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsc3VibWl0RXZlbnQpOworICAgY2FzZSBP
bmJlZm9yZXVubG9hZDoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGJlZm9yZXVubG9h
ZEV2ZW50KTsKKyAgIGNhc2UgT251bmxvYWQ6CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVj
LCB1bmxvYWRFdmVudCk7CisgICB9CisgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOworfQorCitKU1ZhbHVlKiBXaW5kb3c6OmNoaWxkRnJhbWVHZXR0ZXIo
RXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIGNv
bnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgICByZXR1cm4gcmV0cmlldmUoc3RhdGljX2Nh
c3Q8V2luZG93Kj4oc2xvdC5zbG90QmFzZSgpKS0+aW1wbCgpLT5mcmFtZSgpLT50cmVlKCktPmNo
aWxkKEF0b21pY1N0cmluZyhwcm9wZXJ0eU5hbWUpKSk7Cit9CisKK0pTVmFsdWUqIFdpbmRvdzo6
aW5kZXhHZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwgY29u
c3QgUHJvcGVydHlTbG90JiBzbG90KQoreworICAgIHJldHVybiByZXRyaWV2ZShzdGF0aWNfY2Fz
dDxXaW5kb3cqPihzbG90LnNsb3RCYXNlKCkpLT5pbXBsKCktPmZyYW1lKCktPnRyZWUoKS0+Y2hp
bGQoc2xvdC5pbmRleCgpKSk7Cit9CisKK0pTVmFsdWUgKldpbmRvdzo6bmFtZWRJdGVtR2V0dGVy
KEV4ZWNTdGF0ZSAqZXhlYywgSlNPYmplY3QgKm9yaWdpbmFsT2JqZWN0LCBjb25zdCBJZGVudGlm
aWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgV2luZG93
ICp0aGlzT2JqID0gc3RhdGljX2Nhc3Q8V2luZG93ICo+KHNsb3Quc2xvdEJhc2UoKSk7CisgIERv
Y3VtZW50ICpkb2MgPSB0aGlzT2JqLT5pbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCk7CisgIEFT
U0VSVCh0aGlzT2JqLT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpICYmIGRvYyAmJiBkb2MtPmlzSFRN
TERvY3VtZW50KCkpOworCisgIFN0cmluZyBuYW1lID0gcHJvcGVydHlOYW1lOworICBSZWZQdHI8
V2ViQ29yZTo6SFRNTENvbGxlY3Rpb24+IGNvbGxlY3Rpb24gPSBkb2MtPndpbmRvd05hbWVkSXRl
bXMobmFtZSk7CisgIGlmIChjb2xsZWN0aW9uLT5sZW5ndGgoKSA9PSAxKQorICAgIHJldHVybiB0
b0pTKGV4ZWMsIGNvbGxlY3Rpb24tPmZpcnN0SXRlbSgpKTsKKyAgcmV0dXJuIHRvSlMoZXhlYywg
Y29sbGVjdGlvbi5nZXQoKSk7Cit9CisKK2Jvb2wgV2luZG93OjpnZXRPd25Qcm9wZXJ0eVNsb3Qo
RXhlY1N0YXRlICpleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5
U2xvdCYgc2xvdCkKK3sKKyAgLy8gQ2hlY2sgZm9yIGNoaWxkIGZyYW1lcyBieSBuYW1lIGJlZm9y
ZSBidWlsdC1pbiBwcm9wZXJ0aWVzIHRvCisgIC8vIG1hdGNoIE1vemlsbGEuIFRoaXMgZG9lcyBu
b3QgbWF0Y2ggSUUsIGJ1dCBzb21lIHNpdGVzIGVuZCB1cAorICAvLyBuYW1pbmcgZnJhbWVzIHRo
aW5ncyB0aGF0IGNvbmZsaWN0IHdpdGggd2luZG93IHByb3BlcnRpZXMgdGhhdAorICAvLyBhcmUg
aW4gTW96IGJ1dCBub3QgSUUuIFNpbmNlIHdlIGhhdmUgc29tZSBvZiB0aGVzZSwgd2UgaGF2ZSB0
byBkbworICAvLyBpdCB0aGUgTW96IHdheS4KKyAgaWYgKGltcGwoKS0+ZnJhbWUoKS0+dHJlZSgp
LT5jaGlsZChwcm9wZXJ0eU5hbWUpKSB7CisgICAgc2xvdC5zZXRDdXN0b20odGhpcywgY2hpbGRG
cmFtZUdldHRlcik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBIYXNoRW50cnkq
IGVudHJ5ID0gTG9va3VwOjpmaW5kRW50cnkoJldpbmRvd1RhYmxlLCBwcm9wZXJ0eU5hbWUpOwor
ICBpZiAoZW50cnkpIHsKKyAgICBpZiAoZW50cnktPmF0dHIgJiBGdW5jdGlvbikgeworICAgICAg
aWYgKGVudHJ5LT52YWx1ZS5mdW5jdGlvblZhbHVlID09ICZXaW5kb3dQcm90b0Z1bmNTaG93TW9k
YWxEaWFsb2c6OmNyZWF0ZSkgeworICAgICAgICBpZiAoIWNhblNob3dNb2RhbERpYWxvZyhpbXBs
KCktPmZyYW1lKCkpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlm
IChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzbG90LnNldFN0YXRpY0VudHJ5KHRo
aXMsIGVudHJ5LCBzdGF0aWNGdW5jdGlvbkdldHRlcik7CisgICAgICBlbHNlCisgICAgICAgIHNs
b3Quc2V0VW5kZWZpbmVkKHRoaXMpOworICAgIH0gZWxzZQorICAgICAgc2xvdC5zZXRTdGF0aWNF
bnRyeSh0aGlzLCBlbnRyeSwgc3RhdGljVmFsdWVHZXR0ZXI8V2luZG93Pik7CisgICAgcmV0dXJu
IHRydWU7CisgIH0KKworICAvLyBGSVhNRTogU2VhcmNoIHRoZSB3aG9sZSBmcmFtZSBoaWVyYWNo
eSBzb21ld2hlcmUgYXJvdW5kIGhlcmUuCisgIC8vIFdlIG5lZWQgdG8gdGVzdCB0aGUgY29ycmVj
dCBwcmlvcml0eSBvcmRlci4KKworICAvLyBhbGxvdyB3aW5kb3dbMV0gb3IgcGFyZW50WzFdIGV0
Yy4gKCM1Njk4MykKKyAgYm9vbCBvazsKKyAgdW5zaWduZWQgaSA9IHByb3BlcnR5TmFtZS50b0Fy
cmF5SW5kZXgoJm9rKTsKKyAgaWYgKG9rICYmIGkgPCBpbXBsKCktPmZyYW1lKCktPnRyZWUoKS0+
Y2hpbGRDb3VudCgpKSB7CisgICAgc2xvdC5zZXRDdXN0b21JbmRleCh0aGlzLCBpLCBpbmRleEdl
dHRlcik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBhbGxvdyBzaG9ydGN1dHMgbGlr
ZSAnSW1hZ2UxJyBpbnN0ZWFkIG9mIGRvY3VtZW50LmltYWdlcy5JbWFnZTEKKyAgRG9jdW1lbnQq
IGRvYyA9IGltcGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgaWYgKGRvYyAmJiBkb2MtPmlz
SFRNTERvY3VtZW50KCkpIHsKKyAgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpIHsKKyAg
ICAgIHNsb3Quc2V0VW5kZWZpbmVkKHRoaXMpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgQXRvbWljU3RyaW5nIGF0b21pY1Byb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAg
ICBpZiAoc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50Kj4oZG9jKS0+aGFzTmFtZWRJdGVtKGF0b21p
Y1Byb3BlcnR5TmFtZSkgfHwgZG9jLT5nZXRFbGVtZW50QnlJZChhdG9taWNQcm9wZXJ0eU5hbWUp
KSB7CisgICAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBuYW1lZEl0ZW1HZXR0ZXIpOworICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMp
KSB7CisgICAgc2xvdC5zZXRVbmRlZmluZWQodGhpcyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0K
KworICByZXR1cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChleGVjLCBwcm9wZXJ0eU5h
bWUsIHNsb3QpOworfQorCit2b2lkIFdpbmRvdzo6cHV0KEV4ZWNTdGF0ZSogZXhlYywgY29uc3Qg
SWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBKU1ZhbHVlKiB2YWx1ZSwgaW50IGF0dHIpCit7Cisg
IGNvbnN0IEhhc2hFbnRyeSogZW50cnkgPSBMb29rdXA6OmZpbmRFbnRyeSgmV2luZG93VGFibGUs
IHByb3BlcnR5TmFtZSk7CisgIGlmIChlbnRyeSkgeworICAgICBpZiAoZW50cnktPmF0dHIgJiBG
dW5jdGlvbikgeworICAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICAg
SlNPYmplY3Q6OnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBhdHRyKTsKKyAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIGlmIChlbnRyeS0+YXR0ciAmIFJlYWRPbmx5KQorICAgICAgcmV0
dXJuOworCisgICAgc3dpdGNoIChlbnRyeS0+dmFsdWUuaW50VmFsdWUpIHsKKyAgICBjYXNlIExv
Y2F0aW9uXzogeworICAgICAgRnJhbWUqIHAgPSBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMp
LT5pbXBsKCktPmZyYW1lKCk7CisgICAgICBpZiAocCkgeworICAgICAgICBpZiAoIXAtPmxvYWRl
cigpLT5zaG91bGRBbGxvd05hdmlnYXRpb24oaW1wbCgpLT5mcmFtZSgpKSkKKyAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIFN0cmluZyBkc3RVcmwgPSBwLT5sb2FkZXIoKS0+Y29tcGxldGVVUkwo
dmFsdWUtPnRvU3RyaW5nKGV4ZWMpKS5zdHJpbmcoKTsKKyAgICAgICAgaWYgKCFkc3RVcmwuc3Rh
cnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkgfHwgYWxsb3dzQWNjZXNzRnJvbShleGVjKSkg
eworICAgICAgICAgIGJvb2wgdXNlckdlc3R1cmUgPSBwLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNz
aW5nVXNlckdlc3R1cmUoKTsKKyAgICAgICAgICAvLyBXZSB3YW50IGEgbmV3IGhpc3RvcnkgaXRl
bSBpZiB0aGlzIEpTIHdhcyBjYWxsZWQgdmlhIGEgdXNlciBnZXN0dXJlCisgICAgICAgICAgaW1w
bCgpLT5mcmFtZSgpLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShkc3RVcmwsIHAt
PmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2VyR2VzdHVyZSk7CisgICAg
ICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBPbmFib3J0Ogor
ICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4
ZWMsIGFib3J0RXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgT25ibHVyOgor
ICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4
ZWMsIGJsdXJFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbmNoYW5nZToK
KyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRMaXN0ZW5lcihl
eGVjLCBjaGFuZ2VFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbmNsaWNr
OgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVy
KGV4ZWMsY2xpY2tFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbmRibGNs
aWNrOgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3Rl
bmVyKGV4ZWMsIGRibGNsaWNrRXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNhc2Ug
T25lcnJvcjoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRM
aXN0ZW5lcihleGVjLCBlcnJvckV2ZW50LCB2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2Fz
ZSBPbmZvY3VzOgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNl
dExpc3RlbmVyKGV4ZWMsZm9jdXNFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2Fz
ZSBPbmtleWRvd246CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAg
c2V0TGlzdGVuZXIoZXhlYyxrZXlkb3duRXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJuOworICAg
IGNhc2UgT25rZXlwcmVzczoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAg
ICAgICBzZXRMaXN0ZW5lcihleGVjLGtleXByZXNzRXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJu
OworICAgIGNhc2UgT25rZXl1cDoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQor
ICAgICAgICBzZXRMaXN0ZW5lcihleGVjLGtleXVwRXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJu
OworICAgIGNhc2UgT25sb2FkOgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisg
ICAgICAgIHNldExpc3RlbmVyKGV4ZWMsbG9hZEV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsK
KyAgICBjYXNlIE9ubW91c2Vkb3duOgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykp
CisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsbW91c2Vkb3duRXZlbnQsdmFsdWUpOworICAgICAg
cmV0dXJuOworICAgIGNhc2UgT25tb3VzZW1vdmU6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxtb3VzZW1vdmVFdmVudCx2YWx1ZSk7
CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbm1vdXNlb3V0OgorICAgICAgaWYgKGFsbG93c0Fj
Y2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsbW91c2VvdXRFdmVudCx2
YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbm1vdXNlb3ZlcjoKKyAgICAgIGlmIChh
bGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRMaXN0ZW5lcihleGVjLG1vdXNlb3Zl
ckV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9ubW91c2V1cDoKKyAgICAg
IGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRMaXN0ZW5lcihleGVjLG1v
dXNldXBFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbldpbmRvd01vdXNl
V2hlZWw6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgc2V0TGlz
dGVuZXIoZXhlYywgbW91c2V3aGVlbEV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBj
YXNlIE9ucmVzZXQ6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAg
c2V0TGlzdGVuZXIoZXhlYyxyZXNldEV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBj
YXNlIE9ucmVzaXplOgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAg
IHNldExpc3RlbmVyKGV4ZWMscmVzaXplRXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJuOworICAg
IGNhc2UgT25zY3JvbGw6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAg
ICAgc2V0TGlzdGVuZXIoZXhlYyxzY3JvbGxFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47Cisg
ICAgY2FzZSBPbnNlYXJjaDoKKyAgICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisg
ICAgICAgICAgICBzZXRMaXN0ZW5lcihleGVjLHNlYXJjaEV2ZW50LHZhbHVlKTsKKyAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgT25zZWxlY3Q6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShl
eGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxzZWxlY3RFdmVudCx2YWx1ZSk7CisgICAg
ICByZXR1cm47CisgICAgY2FzZSBPbnN1Ym1pdDoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9t
KGV4ZWMpKQorICAgICAgICBzZXRMaXN0ZW5lcihleGVjLHN1Ym1pdEV2ZW50LHZhbHVlKTsKKyAg
ICAgIHJldHVybjsKKyAgICBjYXNlIE9uYmVmb3JldW5sb2FkOgorICAgICAgaWYgKGFsbG93c0Fj
Y2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsIGJlZm9yZXVubG9hZEV2
ZW50LCB2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbnVubG9hZDoKKyAgICAgIGlm
IChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRMaXN0ZW5lcihleGVjLCB1bmxv
YWRFdmVudCwgdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBicmVh
azsKKyAgICB9CisgIH0KKyAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgSlNPYmpl
Y3Q6OnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBhdHRyKTsKK30KKworYm9vbCBXaW5k
b3c6OmFsbG93c0FjY2Vzc0Zyb20oY29uc3QgSlNHbG9iYWxPYmplY3QqIG90aGVyKSBjb25zdAor
eworICAgIGNvbnN0IEZyYW1lKiBvcmlnaW5GcmFtZSA9IHN0YXRpY19jYXN0PGNvbnN0IFdpbmRv
dyo+KG90aGVyKS0+aW1wbCgpLT5mcmFtZSgpOworICAgIGlmICghb3JpZ2luRnJhbWUpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IEZyYW1lKiB0YXJnZXRGcmFtZSA9IGltcGwo
KS0+ZnJhbWUoKTsKKyAgICBpZiAoIXRhcmdldEZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBpZiAob3JpZ2luRnJhbWUgPT0gdGFyZ2V0RnJhbWUpCisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgV2ViQ29yZTo6RG9jdW1lbnQqIHRhcmdldERvY3VtZW50ID0gdGFyZ2V0RnJh
bWUtPmRvY3VtZW50KCk7CisKKyAgICAvLyBKUyBtYXkgYmUgYXR0ZW1wdGluZyB0byBhY2Nlc3Mg
dGhlICJ3aW5kb3ciIG9iamVjdCwgd2hpY2ggc2hvdWxkIGJlIHZhbGlkLAorICAgIC8vIGV2ZW4g
aWYgdGhlIGRvY3VtZW50IGhhc24ndCBiZWVuIGNvbnN0cnVjdGVkIHlldC4gIElmIHRoZSBkb2N1
bWVudCBkb2Vzbid0CisgICAgLy8gZXhpc3QgeWV0IGFsbG93IEpTIHRvIGFjY2VzcyB0aGUgd2lu
ZG93IG9iamVjdC4KKyAgICBpZiAoIXRhcmdldERvY3VtZW50KQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKworICAgIFdlYkNvcmU6OkRvY3VtZW50KiBvcmlnaW5Eb2N1bWVudCA9IG9yaWdpbkZyYW1l
LT5kb2N1bWVudCgpOworCisgICAgY29uc3QgU2VjdXJpdHlPcmlnaW4mIG9yaWdpblNlY3VyaXR5
T3JpZ2luID0gb3JpZ2luRG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7CisgICAgY29uc3QgU2Vj
dXJpdHlPcmlnaW4mIHRhcmdldFNlY3VyaXR5T3JpZ2luID0gdGFyZ2V0RG9jdW1lbnQtPnNlY3Vy
aXR5T3JpZ2luKCk7CisKKyAgICBpZiAob3JpZ2luU2VjdXJpdHlPcmlnaW4uY2FuQWNjZXNzKHRh
cmdldFNlY3VyaXR5T3JpZ2luKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIXRh
cmdldEZyYW1lLT5zZXR0aW5ncygpLT5wcml2YXRlQnJvd3NpbmdFbmFibGVkKCkpIHsKKyAgICAg
ICAgLy8gRklYTUU6IHRoaXMgZXJyb3IgbWVzc2FnZSBzaG91bGQgY29udGFpbiBtb3JlIHNwZWNp
ZmljcyBvZiB3aHkgdGhlIHNhbWUgb3JpZ2luIGNoZWNrIGhhcyBmYWlsZWQuCisgICAgICAgIFN0
cmluZyBtZXNzYWdlID0gU3RyaW5nOjpmb3JtYXQoIlVuc2FmZSBKYXZhU2NyaXB0IGF0dGVtcHQg
dG8gYWNjZXNzIGZyYW1lIHdpdGggVVJMICVzIGZyb20gZnJhbWUgd2l0aCBVUkwgJXMuIERvbWFp
bnMsIHByb3RvY29scyBhbmQgcG9ydHMgbXVzdCBtYXRjaC5cbiIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RG9jdW1lbnQtPnVybCgpLnV0ZjgoKS5kYXRh
KCksIG9yaWdpbkRvY3VtZW50LT51cmwoKS51dGY4KCkuZGF0YSgpKTsKKworICAgICAgICBpZiAo
SW50ZXJwcmV0ZXI6OnNob3VsZFByaW50RXhjZXB0aW9ucygpKQorICAgICAgICAgICAgcHJpbnRm
KCIlcyIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7CisKKyAgICAgICAgaWYgKFBhZ2UqIHBhZ2Ug
PSB0YXJnZXRGcmFtZS0+cGFnZSgpKQorICAgICAgICAgICAgcGFnZS0+Y2hyb21lKCktPmFkZE1l
c3NhZ2VUb0NvbnNvbGUoSlNNZXNzYWdlU291cmNlLCBFcnJvck1lc3NhZ2VMZXZlbCwgbWVzc2Fn
ZSwgMSwgU3RyaW5nKCkpOyAvLyBGSVhNRTogcHJvdmlkZSBhIHJlYWwgbGluZSBudW1iZXIgYW5k
IHNvdXJjZSBVUkwuCisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitFeGVjU3RhdGUq
IFdpbmRvdzo6Z2xvYmFsRXhlYygpCit7CisgICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhh
dCBhbnkgc2NyaXB0IGV4ZWN1dGlvbiBoYXBwZW5pbmcgaW4gdGhpcworICAgIC8vIGZyYW1lIGRv
ZXMgbm90IGRlc3Ryb3kgaXQKKyAgICBBU1NFUlQoaW1wbCgpLT5mcmFtZSgpKTsKKyAgICBpbXBs
KCktPmZyYW1lKCktPmtlZXBBbGl2ZSgpOworICAgIHJldHVybiBKU0dsb2JhbE9iamVjdDo6Z2xv
YmFsRXhlYygpOworfQorCitib29sIFdpbmRvdzo6c2hvdWxkSW50ZXJydXB0U2NyaXB0KCkgY29u
c3QKK3sKKyAgICBBU1NFUlQoaW1wbCgpLT5mcmFtZSgpKTsKKyAgICBQYWdlKiBwYWdlID0gaW1w
bCgpLT5mcmFtZSgpLT5wYWdlKCk7CisKKyAgICAvLyBTZWUgPHJkYXI6Ly9wcm9ibGVtLzU0Nzk0
NDM+LiBXZSBkb24ndCB0aGluayB0aGF0IHBhZ2UgY2FuIGV2ZXIgYmUgTlVMTAorICAgIC8vIGlu
IHRoaXMgY2FzZSwgYnV0IGlmIGl0IGlzLCB3ZSd2ZSBnb3R0ZW4gaW50byBhIHN0YXRlIHdoZXJl
IHdlIG1heSBoYXZlCisgICAgLy8gaHVuZyB0aGUgVUksIHdpdGggbm8gd2F5IHRvIGFzayB0aGUg
Y2xpZW50IHdoZXRoZXIgdG8gY2FuY2VsIGV4ZWN1dGlvbi4KKyAgICAvLyBGb3Igbm93LCBvdXIg
c29sdXRpb24gaXMganVzdCB0byBjYW5jZWwgZXhlY3V0aW9uIG5vIG1hdHRlciB3aGF0LAorICAg
IC8vIGVuc3VyaW5nIHRoYXQgd2UgbmV2ZXIgaGFuZy4gV2UgbWlnaHQgd2FudCB0byBjb25zaWRl
ciBvdGhlciBzb2x1dGlvbnMKKyAgICAvLyBpZiB3ZSBkaXNjb3ZlciBwcm9ibGVtcyB3aXRoIHRo
aXMgb25lLgorICAgIEFTU0VSVChwYWdlKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgcmV0dXJuIHBhZ2UtPmNocm9tZSgpLT5zaG91bGRJbnRlcnJ1cHRKYXZh
U2NyaXB0KCk7Cit9CisKK3ZvaWQgV2luZG93OjpzZXRMaXN0ZW5lcihFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBKU1ZhbHVlKiBmdW5jKQoreworICAgIEFT
U0VSVChpbXBsKCktPmZyYW1lKCkpOworICAgIERvY3VtZW50KiBkb2MgPSBpbXBsKCktPmZyYW1l
KCktPmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2MpCisgICAgICAgIHJldHVybjsKKworICAgIGRv
Yy0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBmaW5kT3JDcmVhdGVKU0V2
ZW50TGlzdGVuZXIoZnVuYywgdHJ1ZSkpOworfQorCitKU1ZhbHVlKiBXaW5kb3c6OmdldExpc3Rl
bmVyKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUpIGNvbnN0
Cit7CisgICAgQVNTRVJUKGltcGwoKS0+ZnJhbWUoKSk7CisgICAgRG9jdW1lbnQqIGRvYyA9IGlt
cGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJu
IGpzVW5kZWZpbmVkKCk7CisKKyAgICBXZWJDb3JlOjpFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9
IGRvYy0+Z2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKTsKKyAgICBpZiAobGlz
dGVuZXIgJiYgc3RhdGljX2Nhc3Q8SlNFdmVudExpc3RlbmVyKj4obGlzdGVuZXIpLT5saXN0ZW5l
ck9iaigpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNFdmVudExpc3RlbmVyKj4obGlz
dGVuZXIpLT5saXN0ZW5lck9iaigpOworICAgIHJldHVybiBqc051bGwoKTsKK30KKworSlNFdmVu
dExpc3RlbmVyKiBXaW5kb3c6OmZpbmRKU0V2ZW50TGlzdGVuZXIoSlNWYWx1ZSogdmFsLCBib29s
IGh0bWwpCit7CisgICAgaWYgKCF2YWwtPmlzT2JqZWN0KCkpCisgICAgICAgIHJldHVybiAwOwor
ICAgIEpTT2JqZWN0KiBvYmplY3QgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHZhbCk7CisgICAg
TGlzdGVuZXJzTWFwJiBsaXN0ZW5lcnMgPSBodG1sID8gZC0+anNIVE1MRXZlbnRMaXN0ZW5lcnMg
OiBkLT5qc0V2ZW50TGlzdGVuZXJzOworICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KG9iamVjdCk7
Cit9CisKK0pTRXZlbnRMaXN0ZW5lciogV2luZG93OjpmaW5kT3JDcmVhdGVKU0V2ZW50TGlzdGVu
ZXIoSlNWYWx1ZSogdmFsLCBib29sIGh0bWwpCit7CisgICAgSlNFdmVudExpc3RlbmVyKiBsaXN0
ZW5lciA9IGZpbmRKU0V2ZW50TGlzdGVuZXIodmFsLCBodG1sKTsKKyAgICBpZiAobGlzdGVuZXIp
CisgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKKworICAgIGlmICghdmFsLT5pc09iamVjdCgpKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICBKU09iamVjdCogb2JqZWN0ID0gc3RhdGljX2Nhc3Q8SlNP
YmplY3QqPih2YWwpOworCisgICAgLy8gTm90ZSB0aGF0IHRoZSBKU0V2ZW50TGlzdGVuZXIgY29u
c3RydWN0b3IgYWRkcyBpdCB0byBvdXIganNFdmVudExpc3RlbmVycyBsaXN0CisgICAgcmV0dXJu
IG5ldyBKU0V2ZW50TGlzdGVuZXIob2JqZWN0LCB0aGlzLCBodG1sKTsKK30KKworSlNVbnByb3Rl
Y3RlZEV2ZW50TGlzdGVuZXIqIFdpbmRvdzo6ZmluZEpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVy
KEpTVmFsdWUqIHZhbCwgYm9vbCBodG1sKQoreworICAgIGlmICghdmFsLT5pc09iamVjdCgpKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICBKU09iamVjdCogb2JqZWN0ID0gc3RhdGljX2Nhc3Q8SlNP
YmplY3QqPih2YWwpOworICAgIFVucHJvdGVjdGVkTGlzdGVuZXJzTWFwJiBsaXN0ZW5lcnMgPSBo
dG1sID8gZC0+anNVbnByb3RlY3RlZEhUTUxFdmVudExpc3RlbmVycyA6IGQtPmpzVW5wcm90ZWN0
ZWRFdmVudExpc3RlbmVyczsKKyAgICByZXR1cm4gbGlzdGVuZXJzLmdldChvYmplY3QpOworfQor
CitKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lciogV2luZG93OjpmaW5kT3JDcmVhdGVKU1VucHJv
dGVjdGVkRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiB2YWwsIGJvb2wgaHRtbCkKK3sKKyAgICBKU1Vu
cHJvdGVjdGVkRXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBmaW5kSlNVbnByb3RlY3RlZEV2ZW50
TGlzdGVuZXIodmFsLCBodG1sKTsKKyAgICBpZiAobGlzdGVuZXIpCisgICAgICAgIHJldHVybiBs
aXN0ZW5lcjsKKyAgICBpZiAoIXZhbC0+aXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgSlNPYmplY3QqIG9iamVjdCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odmFsKTsKKworICAg
IC8vIFRoZSBKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lciBjb25zdHJ1Y3RvciBhZGRzIGl0IHRv
IG91ciBqc1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcnMgbWFwLgorICAgIHJldHVybiBuZXcgSlNV
bnByb3RlY3RlZEV2ZW50TGlzdGVuZXIob2JqZWN0LCB0aGlzLCBodG1sKTsKK30KKwordm9pZCBX
aW5kb3c6OmNsZWFySGVscGVyT2JqZWN0UHJvcGVydGllcygpCit7CisgICAgZC0+bG9jID0gMDsK
KyAgICBkLT5tX2V2dCA9IDA7Cit9CisKK3ZvaWQgV2luZG93OjpjbGVhcigpCit7CisgIEpTTG9j
ayBsb2NrOworCisgIGlmIChkLT5tX3JldHVyblZhbHVlU2xvdCAmJiAhKmQtPm1fcmV0dXJuVmFs
dWVTbG90KQorICAgICpkLT5tX3JldHVyblZhbHVlU2xvdCA9IGdldERpcmVjdCgicmV0dXJuVmFs
dWUiKTsKKworICBjbGVhckFsbFRpbWVvdXRzKCk7CisgIGNsZWFyUHJvcGVydGllcygpOworICBj
bGVhckhlbHBlck9iamVjdFByb3BlcnRpZXMoKTsKKworICAvLyBOb3cgcmVjcmVhdGUgYSB3b3Jr
aW5nIGdsb2JhbCBvYmplY3QgZm9yIHRoZSBuZXh0IFVSTCB0aGF0IHdpbGwgdXNlIHVzOyBidXQg
b25seSBpZiB3ZSBoYXZlbid0IGJlZW4KKyAgLy8gZGlzY29ubmVjdGVkIHlldAorICBpZiAoRnJh
bWUqIGZyYW1lID0gaW1wbCgpLT5mcmFtZSgpKQorICAgIGZyYW1lLT5zY3JpcHRQcm94eSgpLT5n
bG9iYWxPYmplY3QoKS0+cmVzZXQoSlNET01XaW5kb3dQcm90b3R5cGU6OnNlbGYoKSk7CisKKyAg
Ly8gdGhlcmUncyBsaWtlbHkgdG8gYmUgbG90cyBvZiBnYXJiYWdlIG5vdworICBnY0NvbnRyb2xs
ZXIoKS5nYXJiYWdlQ29sbGVjdFNvb24oKTsKK30KKwordm9pZCBXaW5kb3c6OnNldEN1cnJlbnRF
dmVudChFdmVudCogZXZ0KQoreworICAgIGQtPm1fZXZ0ID0gZXZ0OworfQorCitFdmVudCogV2lu
ZG93OjpjdXJyZW50RXZlbnQoKQoreworICAgIHJldHVybiBkLT5tX2V2dDsKK30KKworSlNWYWx1
ZSogV2luZG93UHJvdG9GdW5jQVRvQjo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBK
U09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKK3sKKyAgICBpZiAoIXRoaXNPYmot
PmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVj
LCBUeXBlRXJyb3IpOworCisgICAgaWYgKGFyZ3Muc2l6ZSgpIDwgMSkKKyAgICAgICAgcmV0dXJu
IHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3IsICJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpOwor
CisgICAgSlNWYWx1ZSogdiA9IGFyZ3NbMF07CisgICAgaWYgKHYtPmlzTnVsbCgpKQorICAgICAg
ICByZXR1cm4ganNTdHJpbmcoKTsKKworICAgIFVTdHJpbmcgcyA9IHYtPnRvU3RyaW5nKGV4ZWMp
OworICAgIGlmICghcy5pczhCaXQoKSkgeworICAgICAgICBzZXRET01FeGNlcHRpb24oZXhlYywg
SU5WQUxJRF9DSEFSQUNURVJfRVJSKTsKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Cisg
ICAgfQorCisgICAgVmVjdG9yPGNoYXI+IGluKHMuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0g
MDsgaSA8IHMuc2l6ZSgpOyArK2kpCisgICAgICAgIGluW2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4o
cy5kYXRhKClbaV0udW5pY29kZSgpKTsKKyAgICBWZWN0b3I8Y2hhcj4gb3V0OworCisgICAgaWYg
KCFiYXNlNjREZWNvZGUoaW4sIG91dCkpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMs
IEdlbmVyYWxFcnJvciwgIkNhbm5vdCBkZWNvZGUgYmFzZTY0Iik7CisKKyAgICByZXR1cm4ganNT
dHJpbmcoU3RyaW5nKG91dC5kYXRhKCksIG91dC5zaXplKCkpKTsKK30KKworSlNWYWx1ZSogV2lu
ZG93UHJvdG9GdW5jQlRvQTo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVj
dCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKK3sKKyAgICBpZiAoIXRoaXNPYmotPmluaGVy
aXRzKCZXaW5kb3c6OmluZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBl
RXJyb3IpOworCisgICAgaWYgKGFyZ3Muc2l6ZSgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93
RXJyb3IoZXhlYywgU3ludGF4RXJyb3IsICJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpOworCisgICAg
SlNWYWx1ZSogdiA9IGFyZ3NbMF07CisgICAgaWYgKHYtPmlzTnVsbCgpKQorICAgICAgICByZXR1
cm4ganNTdHJpbmcoKTsKKworICAgIFVTdHJpbmcgcyA9IHYtPnRvU3RyaW5nKGV4ZWMpOworICAg
IGlmICghcy5pczhCaXQoKSkgeworICAgICAgICBzZXRET01FeGNlcHRpb24oZXhlYywgSU5WQUxJ
RF9DSEFSQUNURVJfRVJSKTsKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgfQor
CisgICAgVmVjdG9yPGNoYXI+IGluKHMuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8
IHMuc2l6ZSgpOyArK2kpCisgICAgICAgIGluW2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4ocy5kYXRh
KClbaV0udW5pY29kZSgpKTsKKyAgICBWZWN0b3I8Y2hhcj4gb3V0OworCisgICAgYmFzZTY0RW5j
b2RlKGluLCBvdXQpOworCisgICAgcmV0dXJuIGpzU3RyaW5nKFN0cmluZyhvdXQuZGF0YSgpLCBv
dXQuc2l6ZSgpKSk7Cit9CisKK0pTVmFsdWUqIFdpbmRvd1Byb3RvRnVuY09wZW46OmNhbGxBc0Z1
bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmosIGNvbnN0IExpc3QmIGFy
Z3MpCit7CisgICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmV2luZG93OjppbmZvKSkKKyAgICAg
ICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKKyAgICBXaW5kb3cqIHdpbmRv
dyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmopOworICAgIEZyYW1lKiBmcmFtZSA9IHdp
bmRvdy0+aW1wbCgpLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBq
c1VuZGVmaW5lZCgpOworICAgIEZyYW1lKiBhY3RpdmVGcmFtZSA9IFdpbmRvdzo6cmV0cmlldmVB
Y3RpdmUoZXhlYyktPmltcGwoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWFjdGl2ZUZyYW1lKQorICAg
ICAgICByZXR1cm4gIGpzVW5kZWZpbmVkKCk7CisKKyAgICBQYWdlKiBwYWdlID0gZnJhbWUtPnBh
Z2UoKTsKKworICAgIFN0cmluZyB1cmxTdHJpbmcgPSB2YWx1ZVRvU3RyaW5nV2l0aFVuZGVmaW5l
ZE9yTnVsbENoZWNrKGV4ZWMsIGFyZ3NbMF0pOworICAgIEF0b21pY1N0cmluZyBmcmFtZU5hbWUg
PSBhcmdzWzFdLT5pc1VuZGVmaW5lZE9yTnVsbCgpID8gIl9ibGFuayIgOiBBdG9taWNTdHJpbmco
YXJnc1sxXS0+dG9TdHJpbmcoZXhlYykpOworCisgICAgLy8gQmVjYXVzZSBGcmFtZVRyZWU6OmZp
bmQoKSByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZ3MsIHdlIG11c3QgY2hlY2sgZm9yIGVt
cHR5IGZyYW1lbmFtZXMuCisgICAgLy8gT3RoZXJ3aXNlLCBpbGxlZ2l0aW1hdGUgd2luZG93Lm9w
ZW4oKSBjYWxscyB3aXRoIG5vIG5hbWUgd2lsbCBwYXNzIHJpZ2h0IHRocm91Z2ggdGhlIHBvcHVw
IGJsb2NrZXIuCisgICAgaWYgKCFhbGxvd1BvcFVwKGZyYW1lKSAmJiAoZnJhbWVOYW1lLmlzRW1w
dHkoKSB8fCAhZnJhbWUtPnRyZWUoKS0+ZmluZChmcmFtZU5hbWUpKSkKKyAgICAgICAgcmV0dXJu
IGpzVW5kZWZpbmVkKCk7CisKKyAgICAvLyBHZXQgdGhlIHRhcmdldCBmcmFtZSBmb3IgdGhlIHNw
ZWNpYWwgY2FzZXMgb2YgX3RvcCBhbmQgX3BhcmVudC4gIEluIHRob3NlCisgICAgLy8gY2FzZXMs
IHdlIGNhbiBzY2hlZHVsZSBhIGxvY2F0aW9uIGNoYW5nZSByaWdodCBub3cgYW5kIHJldHVybiBl
YXJseS4KKyAgICBib29sIHRvcE9yUGFyZW50ID0gZmFsc2U7CisgICAgaWYgKGZyYW1lTmFtZSA9
PSAiX3RvcCIpIHsKKyAgICAgICAgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50b3AoKTsKKyAgICAg
ICAgdG9wT3JQYXJlbnQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoZnJhbWVOYW1lID09ICJfcGFy
ZW50IikgeworICAgICAgICBpZiAoRnJhbWUqIHBhcmVudCA9IGZyYW1lLT50cmVlKCktPnBhcmVu
dCgpKQorICAgICAgICAgICAgZnJhbWUgPSBwYXJlbnQ7CisgICAgICAgIGlmICghYWN0aXZlRnJh
bWUtPmxvYWRlcigpLT5zaG91bGRBbGxvd05hdmlnYXRpb24oZnJhbWUpKQorICAgICAgICAgICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICAgIHRvcE9yUGFyZW50ID0gdHJ1ZTsKKyAgICB9
CisgICAgaWYgKHRvcE9yUGFyZW50KSB7CisgICAgICAgIFN0cmluZyBjb21wbGV0ZWRVUkw7Cisg
ICAgICAgIGlmICghdXJsU3RyaW5nLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbXBsZXRlZFVS
TCA9IGFjdGl2ZUZyYW1lLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmxTdHJpbmcpOworCisg
ICAgICAgIGNvbnN0IFdpbmRvdyogdGFyZ2V0ZWRXaW5kb3cgPSBXaW5kb3c6OnJldHJpZXZlV2lu
ZG93KGZyYW1lKTsKKyAgICAgICAgaWYgKCFjb21wbGV0ZWRVUkwuaXNFbXB0eSgpICYmICghY29t
cGxldGVkVVJMLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8ICh0YXJnZXRlZFdp
bmRvdyAmJiB0YXJnZXRlZFdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkpKSB7CisgICAg
ICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCktPnBy
b2Nlc3NpbmdVc2VyR2VzdHVyZSgpOworICAgICAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5zY2hl
ZHVsZUxvY2F0aW9uQ2hhbmdlKGNvbXBsZXRlZFVSTCwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5v
dXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2VyR2VzdHVyZSk7CisgICAgICAgIH0KKyAgICAg
ICAgcmV0dXJuIFdpbmRvdzo6cmV0cmlldmUoZnJhbWUpOworICAgIH0KKworICAgIC8vIEluIHRo
ZSBjYXNlIG9mIGEgbmFtZWQgZnJhbWUgb3IgYSBuZXcgd2luZG93LCB3ZSdsbCB1c2UgdGhlIGNy
ZWF0ZVdpbmRvdygpIGhlbHBlcgorICAgIFdpbmRvd0ZlYXR1cmVzIHdpbmRvd0ZlYXR1cmVzKHZh
bHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JOdWxsQ2hlY2soZXhlYywgYXJnc1syXSkpOworICAg
IEZsb2F0UmVjdCB3aW5kb3dSZWN0KHdpbmRvd0ZlYXR1cmVzLngsIHdpbmRvd0ZlYXR1cmVzLnks
IHdpbmRvd0ZlYXR1cmVzLndpZHRoLCB3aW5kb3dGZWF0dXJlcy5oZWlnaHQpOworICAgIFdlYkNv
cmU6OkRPTVdpbmRvdzo6YWRqdXN0V2luZG93UmVjdChzY3JlZW5BdmFpbGFibGVSZWN0KHBhZ2Ut
Pm1haW5GcmFtZSgpLT52aWV3KCkpLCB3aW5kb3dSZWN0LCB3aW5kb3dSZWN0KTsKKworICAgIHdp
bmRvd0ZlYXR1cmVzLnggPSB3aW5kb3dSZWN0LngoKTsKKyAgICB3aW5kb3dGZWF0dXJlcy55ID0g
d2luZG93UmVjdC55KCk7CisgICAgd2luZG93RmVhdHVyZXMuaGVpZ2h0ID0gd2luZG93UmVjdC5o
ZWlnaHQoKTsKKyAgICB3aW5kb3dGZWF0dXJlcy53aWR0aCA9IHdpbmRvd1JlY3Qud2lkdGgoKTsK
KworICAgIGZyYW1lID0gY3JlYXRlV2luZG93KGV4ZWMsIGZyYW1lLCB1cmxTdHJpbmcsIGZyYW1l
TmFtZSwgd2luZG93RmVhdHVyZXMsIDApOworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0
dXJuIGpzVW5kZWZpbmVkKCk7CisKKyAgICByZXR1cm4gV2luZG93OjpyZXRyaWV2ZShmcmFtZSk7
IC8vIGdsb2JhbCBvYmplY3QKK30KKworSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jU2V0VGltZW91
dDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29u
c3QgTGlzdCYgYXJncykKK3sKKyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6Omlu
Zm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOworICAgIFdp
bmRvdyogd2luZG93ID0gc3RhdGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7CisKKyAgICBKU1Zh
bHVlKiB2ID0gYXJnc1swXTsKKyAgICBpZiAodi0+aXNTdHJpbmcoKSkKKyAgICAgICAgcmV0dXJu
IGpzTnVtYmVyKHdpbmRvdy0+aW5zdGFsbFRpbWVvdXQodi0+dG9TdHJpbmcoZXhlYyksIGFyZ3Nb
MV0tPnRvSW50MzIoZXhlYyksIHRydWUgLypzaW5nbGUgc2hvdCovKSk7CisgICAgaWYgKHYtPmlz
T2JqZWN0KCkgJiYgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih2KS0+aW1wbGVtZW50c0NhbGwoKSkg
eworICAgICAgICBMaXN0IGFyZ3NUYWlsOworICAgICAgICBhcmdzLmdldFNsaWNlKDIsIGFyZ3NU
YWlsKTsKKyAgICAgICAgcmV0dXJuIGpzTnVtYmVyKHdpbmRvdy0+aW5zdGFsbFRpbWVvdXQodiwg
YXJnc1RhaWwsIGFyZ3NbMV0tPnRvSW50MzIoZXhlYyksIHRydWUgLypzaW5nbGUgc2hvdCovKSk7
CisgICAgfQorCisgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUqIFdpbmRv
d1Byb3RvRnVuY0NsZWFyVGltZW91dDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBK
U09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKK3sKKyAgICAvLyBBbHNvIHRoZSBp
bXBsZW1lbnRhdGlvbiBmb3Igd2luZG93LmNsZWFySW50ZXJ2YWwoKQorCisgICAgaWYgKCF0aGlz
T2JqLT5pbmhlcml0cygmV2luZG93OjppbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3Io
ZXhlYywgVHlwZUVycm9yKTsKKyAgICBXaW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdpbmRv
dyo+KHRoaXNPYmopOworCisgICAgd2luZG93LT5jbGVhclRpbWVvdXQoYXJnc1swXS0+dG9JbnQz
MihleGVjKSk7CisgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUqIFdpbmRv
d1Byb3RvRnVuY1NldEludGVydmFsOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpT
T2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+
aW5oZXJpdHMoJldpbmRvdzo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMs
IFR5cGVFcnJvcik7CisgICAgV2luZG93KiB3aW5kb3cgPSBzdGF0aWNfY2FzdDxXaW5kb3cqPih0
aGlzT2JqKTsKKworICAgIGlmIChhcmdzLnNpemUoKSA+PSAyKSB7CisgICAgICAgIEpTVmFsdWUq
IHYgPSBhcmdzWzBdOworICAgICAgICBpbnQgZGVsYXkgPSBhcmdzWzFdLT50b0ludDMyKGV4ZWMp
OworICAgICAgICBpZiAodi0+aXNTdHJpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiBqc051bWJl
cih3aW5kb3ctPmluc3RhbGxUaW1lb3V0KHYtPnRvU3RyaW5nKGV4ZWMpLCBkZWxheSwgZmFsc2Up
KTsKKyAgICAgICAgaWYgKHYtPmlzT2JqZWN0KCkgJiYgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih2
KS0+aW1wbGVtZW50c0NhbGwoKSkgeworICAgICAgICAgICAgTGlzdCBhcmdzVGFpbDsKKyAgICAg
ICAgICAgIGFyZ3MuZ2V0U2xpY2UoMiwgYXJnc1RhaWwpOworICAgICAgICAgICAgcmV0dXJuIGpz
TnVtYmVyKHdpbmRvdy0+aW5zdGFsbFRpbWVvdXQodiwgYXJnc1RhaWwsIGRlbGF5LCBmYWxzZSkp
OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisKK30KKwor
SlNWYWx1ZSogV2luZG93UHJvdG9GdW5jQWRkRXZlbnRMaXN0ZW5lcjo6Y2FsbEFzRnVuY3Rpb24o
RXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKK3sK
KyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQorICAgICAgICByZXR1
cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOworICAgIFdpbmRvdyogd2luZG93ID0gc3Rh
dGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7CisgICAgRnJhbWUqIGZyYW1lID0gd2luZG93LT5p
bXBsKCktPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZp
bmVkKCk7CisKKyAgICBpZiAoSlNFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHdpbmRvdy0+Zmlu
ZE9yQ3JlYXRlSlNFdmVudExpc3RlbmVyKGFyZ3NbMV0pKSB7CisgICAgICAgIGlmIChEb2N1bWVu
dCogZG9jID0gZnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgICAgICBkb2MtPmFkZFdpbmRvd0V2
ZW50TGlzdGVuZXIoQXRvbWljU3RyaW5nKGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpKSwgbGlzdGVu
ZXIsIGFyZ3NbMl0tPnRvQm9vbGVhbihleGVjKSk7CisgICAgfQorCisgICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUqIFdpbmRvd1Byb3RvRnVuY1JlbW92ZUV2ZW50TGlzdGVu
ZXI6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmosIGNv
bnN0IExpc3QmIGFyZ3MpCit7CisgICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmV2luZG93Ojpp
bmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKKyAgICBX
aW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmopOworICAgIEZyYW1l
KiBmcmFtZSA9IHdpbmRvdy0+aW1wbCgpLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAg
ICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworCisgICAgaWYgKEpTRXZlbnRMaXN0ZW5lciogbGlz
dGVuZXIgPSB3aW5kb3ctPmZpbmRKU0V2ZW50TGlzdGVuZXIoYXJnc1sxXSkpIHsKKyAgICAgICAg
aWYgKERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgICAgIGRvYy0+
cmVtb3ZlV2luZG93RXZlbnRMaXN0ZW5lcihBdG9taWNTdHJpbmcoYXJnc1swXS0+dG9TdHJpbmco
ZXhlYykpLCBsaXN0ZW5lciwgYXJnc1syXS0+dG9Cb29sZWFuKGV4ZWMpKTsKKyAgICB9CisKKyAg
ICByZXR1cm4ganNVbmRlZmluZWQoKTsKK30KKworSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jU2hv
d01vZGFsRGlhbG9nOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0
aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMo
JldpbmRvdzo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJv
cik7CisgICAgV2luZG93KiB3aW5kb3cgPSBzdGF0aWNfY2FzdDxXaW5kb3cqPih0aGlzT2JqKTsK
KyAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3ctPmltcGwoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZy
YW1lKQorICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKworICAgIHJldHVybiBzaG93TW9k
YWxEaWFsb2coZXhlYywgZnJhbWUsIHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JOdWxsQ2hl
Y2soZXhlYywgYXJnc1swXSksIGFyZ3NbMV0sIHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JO
dWxsQ2hlY2soZXhlYywgYXJnc1syXSkpOworfQorCitKU1ZhbHVlKiBXaW5kb3dQcm90b0Z1bmNO
b3RJbXBsZW1lbnRlZDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCog
dGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKK3sKKyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRz
KCZXaW5kb3c6OmluZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJy
b3IpOworCisgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Cit9CisKK3ZvaWQgV2luZG93OjpzZXRS
ZXR1cm5WYWx1ZVNsb3QoSlNWYWx1ZSoqIHNsb3QpCit7CisgICAgZC0+bV9yZXR1cm5WYWx1ZVNs
b3QgPSBzbG90OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFNjaGVkdWxlZEFjdGlvbiAv
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBTY2hlZHVsZWRBY3Rpb246OmV4ZWN1dGUo
V2luZG93KiB3aW5kb3cpCit7CisgICAgUmVmUHRyPEZyYW1lPiBmcmFtZSA9IHdpbmRvdy0+aW1w
bCgpLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIEtK
U1Byb3h5KiBzY3JpcHRQcm94eSA9IGZyYW1lLT5zY3JpcHRQcm94eSgpOworICAgIGlmICghc2Ny
aXB0UHJveHkpCisgICAgICAgIHJldHVybjsKKworICAgIFdpbmRvdyogZ2xvYmFsT2JqZWN0ID0g
c2NyaXB0UHJveHktPmdsb2JhbE9iamVjdCgpOworCisgICAgc2NyaXB0UHJveHktPnNldFByb2Nl
c3NpbmdUaW1lckNhbGxiYWNrKHRydWUpOworCisgICAgaWYgKEpTVmFsdWUqIGZ1bmMgPSBtX2Z1
bmMuZ2V0KCkpIHsKKyAgICAgICAgSlNMb2NrIGxvY2s7CisgICAgICAgIGlmIChmdW5jLT5pc09i
amVjdCgpICYmIHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oZnVuYyktPmltcGxlbWVudHNDYWxsKCkp
IHsKKyAgICAgICAgICAgIEV4ZWNTdGF0ZSogZXhlYyA9IHdpbmRvdy0+Z2xvYmFsRXhlYygpOwor
ICAgICAgICAgICAgQVNTRVJUKHdpbmRvdyA9PSBnbG9iYWxPYmplY3QpOworCisgICAgICAgICAg
ICBMaXN0IGFyZ3M7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1fYXJncy5zaXplKCk7Cisg
ICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAg
ICAgICAgIGFyZ3MuYXBwZW5kKG1fYXJnc1tpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGdsb2JhbE9iamVjdC0+c3RhcnRUaW1lb3V0Q2hlY2soKTsKKyAgICAgICAgICAgIHN0YXRp
Y19jYXN0PEpTT2JqZWN0Kj4oZnVuYyktPmNhbGwoZXhlYywgd2luZG93LCBhcmdzKTsKKyAgICAg
ICAgICAgIGdsb2JhbE9iamVjdC0+c3RvcFRpbWVvdXRDaGVjaygpOworICAgICAgICAgICAgaWYg
KGV4ZWMtPmhhZEV4Y2VwdGlvbigpKSB7CisgICAgICAgICAgICAgICAgSlNPYmplY3QqIGV4Y2Vw
dGlvbiA9IGV4ZWMtPmV4Y2VwdGlvbigpLT50b09iamVjdChleGVjKTsKKyAgICAgICAgICAgICAg
ICBleGVjLT5jbGVhckV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdl
ID0gZXhjZXB0aW9uLT5nZXQoZXhlYywgZXhlYy0+cHJvcGVydHlOYW1lcygpLm1lc3NhZ2UpLT50
b1N0cmluZyhleGVjKTsKKyAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IGV4Y2VwdGlv
bi0+Z2V0KGV4ZWMsICJsaW5lIiktPnRvSW50MzIoZXhlYyk7CisgICAgICAgICAgICAgICAgaWYg
KEludGVycHJldGVyOjpzaG91bGRQcmludEV4Y2VwdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAg
ICAgcHJpbnRmKCIodGltZXIpOiVzXG4iLCBtZXNzYWdlLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICAgICAgICAgIGlmIChQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKSkKKyAgICAgICAgICAgICAg
ICAgICAgcGFnZS0+Y2hyb21lKCktPmFkZE1lc3NhZ2VUb0NvbnNvbGUoSlNNZXNzYWdlU291cmNl
LCBFcnJvck1lc3NhZ2VMZXZlbCwgbWVzc2FnZSwgbGluZU51bWJlciwgU3RyaW5nKCkpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGZyYW1lLT5sb2FkZXIo
KS0+ZXhlY3V0ZVNjcmlwdChtX2NvZGUpOworCisgICAgLy8gVXBkYXRlIG91ciBkb2N1bWVudCdz
IHJlbmRlcmluZyBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGltZW91dCBjYWxsYmFj
ay4KKyAgICAvLyBGSVhNRTogV2h5IG5vdCB1c2UgdXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5nIHRv
IHVwZGF0ZSByZW5kZXJpbmcgb2YgYWxsIGRvY3VtZW50cz8KKyAgICAvLyBGSVhNRTogSXMgdGhp
cyByZWFsbHkgdGhlIHJpZ2h0IHBvaW50IHRvIGRvIHRoZSB1cGRhdGU/IFdlIG5lZWQgYSBwbGFj
ZSB0aGF0IHdvcmtzCisgICAgLy8gZm9yIGFsbCBwb3NzaWJsZSBlbnRyeSBwb2ludHMgdGhhdCBt
aWdodCBwb3NzaWJseSBleGVjdXRlIHNjcmlwdCwgYnV0IHRoaXMgc2VlbXMKKyAgICAvLyB0byBi
ZSBhIGJpdCB0b28gbG93LWxldmVsLgorICAgIGlmIChEb2N1bWVudCogZG9jID0gZnJhbWUtPmRv
Y3VtZW50KCkpCisgICAgICAgIGRvYy0+dXBkYXRlUmVuZGVyaW5nKCk7CisKKyAgICBzY3JpcHRQ
cm94eS0+c2V0UHJvY2Vzc2luZ1RpbWVyQ2FsbGJhY2soZmFsc2UpOworfQorCisvLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vIHRpbWVvdXRzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFdp
bmRvdzo6Y2xlYXJBbGxUaW1lb3V0cygpCit7CisgICAgZGVsZXRlQWxsVmFsdWVzKGQtPm1fdGlt
ZW91dHMpOworICAgIGQtPm1fdGltZW91dHMuY2xlYXIoKTsKK30KKworaW50IFdpbmRvdzo6aW5z
dGFsbFRpbWVvdXQoU2NoZWR1bGVkQWN0aW9uKiBhLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90KQor
eworICAgIGludCB0aW1lb3V0SWQgPSArK2xhc3RVc2VkVGltZW91dElkOworCisgICAgLy8gYXZv
aWQgd3JhcGFyb3VuZCBnb2luZyBuZWdhdGl2ZSBvbiB1cworICAgIGlmICh0aW1lb3V0SWQgPD0g
MCkKKyAgICAgICAgdGltZW91dElkID0gMTsKKworICAgIGludCBuZXN0TGV2ZWwgPSB0aW1lck5l
c3RpbmdMZXZlbCArIDE7CisgICAgRE9NV2luZG93VGltZXIqIHRpbWVyID0gbmV3IERPTVdpbmRv
d1RpbWVyKHRpbWVvdXRJZCwgbmVzdExldmVsLCB0aGlzLCBhKTsKKyAgICBBU1NFUlQoIWQtPm1f
dGltZW91dHMuZ2V0KHRpbWVvdXRJZCkpOworICAgIGQtPm1fdGltZW91dHMuc2V0KHRpbWVvdXRJ
ZCwgdGltZXIpOworICAgIC8vIFVzZSBhIG1pbmltdW0gaW50ZXJ2YWwgb2YgMTAgbXMgdG8gbWF0
Y2ggb3RoZXIgYnJvd3NlcnMsIGJ1dCBvbmx5IG9uY2Ugd2UndmUKKyAgICAvLyBuZXN0ZWQgZW5v
dWdoIHRvIG5vdGljZSB0aGF0IHdlJ3JlIHJlcGVhdGluZy4KKyAgICAvLyBGYXN0ZXIgdGltZXJz
IG1pZ2h0IGJlICJiZXR0ZXIiLCBidXQgdGhleSdyZSBpbmNvbXBhdGlibGUuCisgICAgZG91Ymxl
IGludGVydmFsID0gbWF4KDAuMDAxLCB0ICogMC4wMDEpOworICAgIGlmIChpbnRlcnZhbCA8IGNN
aW5pbXVtVGltZXJJbnRlcnZhbCAmJiBuZXN0TGV2ZWwgPj0gY01heFRpbWVyTmVzdGluZ0xldmVs
KQorICAgICAgICBpbnRlcnZhbCA9IGNNaW5pbXVtVGltZXJJbnRlcnZhbDsKKyAgICBpZiAoc2lu
Z2xlU2hvdCkKKyAgICAgICAgdGltZXItPnN0YXJ0T25lU2hvdChpbnRlcnZhbCk7CisgICAgZWxz
ZQorICAgICAgICB0aW1lci0+c3RhcnRSZXBlYXRpbmcoaW50ZXJ2YWwpOworICAgIHJldHVybiB0
aW1lb3V0SWQ7Cit9CisKK1NjaGVkdWxlZEFjdGlvbjo6U2NoZWR1bGVkQWN0aW9uKEpTVmFsdWUq
IGZ1bmMsIGNvbnN0IExpc3QmIGFyZ3MpCisgICAgOiBtX2Z1bmMoZnVuYykKK3sKKyAgICBMaXN0
Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBhcmdzLmVuZCgpOworICAgIGZvciAoTGlzdDo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBhcmdzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgbV9h
cmdzLmFwcGVuZCgqaXQpOworfQorCitpbnQgV2luZG93OjppbnN0YWxsVGltZW91dChjb25zdCBV
U3RyaW5nJiBoYW5kbGVyLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90KQoreworICAgIHJldHVybiBp
bnN0YWxsVGltZW91dChuZXcgU2NoZWR1bGVkQWN0aW9uKGhhbmRsZXIpLCB0LCBzaW5nbGVTaG90
KTsKK30KKworaW50IFdpbmRvdzo6aW5zdGFsbFRpbWVvdXQoSlNWYWx1ZSogZnVuYywgY29uc3Qg
TGlzdCYgYXJncywgaW50IHQsIGJvb2wgc2luZ2xlU2hvdCkKK3sKKyAgICByZXR1cm4gaW5zdGFs
bFRpbWVvdXQobmV3IFNjaGVkdWxlZEFjdGlvbihmdW5jLCBhcmdzKSwgdCwgc2luZ2xlU2hvdCk7
Cit9CisKK1BhdXNlZFRpbWVvdXRzKiBXaW5kb3c6OnBhdXNlVGltZW91dHMoKQoreworICAgIHNp
emVfdCBjb3VudCA9IGQtPm1fdGltZW91dHMuc2l6ZSgpOworICAgIGlmIChjb3VudCA9PSAwKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIFBhdXNlZFRpbWVvdXQqIHQgPSBuZXcgUGF1c2VkVGlt
ZW91dCBbY291bnRdOworICAgIFBhdXNlZFRpbWVvdXRzKiByZXN1bHQgPSBuZXcgUGF1c2VkVGlt
ZW91dHModCwgY291bnQpOworCisgICAgV2luZG93UHJpdmF0ZTo6VGltZW91dHNNYXA6Oml0ZXJh
dG9yIGl0ID0gZC0+bV90aW1lb3V0cy5iZWdpbigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
ICE9IGNvdW50OyArK2ksICsraXQpIHsKKyAgICAgICAgaW50IHRpbWVvdXRJZCA9IGl0LT5maXJz
dDsKKyAgICAgICAgRE9NV2luZG93VGltZXIqIHRpbWVyID0gaXQtPnNlY29uZDsKKyAgICAgICAg
dFtpXS50aW1lb3V0SWQgPSB0aW1lb3V0SWQ7CisgICAgICAgIHRbaV0ubmVzdGluZ0xldmVsID0g
dGltZXItPm5lc3RpbmdMZXZlbCgpOworICAgICAgICB0W2ldLm5leHRGaXJlSW50ZXJ2YWwgPSB0
aW1lci0+bmV4dEZpcmVJbnRlcnZhbCgpOworICAgICAgICB0W2ldLnJlcGVhdEludGVydmFsID0g
dGltZXItPnJlcGVhdEludGVydmFsKCk7CisgICAgICAgIHRbaV0uYWN0aW9uID0gdGltZXItPnRh
a2VBY3Rpb24oKTsKKyAgICB9CisgICAgQVNTRVJUKGl0ID09IGQtPm1fdGltZW91dHMuZW5kKCkp
OworCisgICAgZGVsZXRlQWxsVmFsdWVzKGQtPm1fdGltZW91dHMpOworICAgIGQtPm1fdGltZW91
dHMuY2xlYXIoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgV2luZG93OjpyZXN1
bWVUaW1lb3V0cyhQYXVzZWRUaW1lb3V0cyogdGltZW91dHMpCit7CisgICAgaWYgKCF0aW1lb3V0
cykKKyAgICAgICAgcmV0dXJuOworICAgIHNpemVfdCBjb3VudCA9IHRpbWVvdXRzLT5udW1UaW1l
b3V0cygpOworICAgIFBhdXNlZFRpbWVvdXQqIGFycmF5ID0gdGltZW91dHMtPnRha2VUaW1lb3V0
cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50OyArK2kpIHsKKyAgICAgICAg
aW50IHRpbWVvdXRJZCA9IGFycmF5W2ldLnRpbWVvdXRJZDsKKyAgICAgICAgRE9NV2luZG93VGlt
ZXIqIHRpbWVyID0gbmV3IERPTVdpbmRvd1RpbWVyKHRpbWVvdXRJZCwgYXJyYXlbaV0ubmVzdGlu
Z0xldmVsLCB0aGlzLCBhcnJheVtpXS5hY3Rpb24pOworICAgICAgICBkLT5tX3RpbWVvdXRzLnNl
dCh0aW1lb3V0SWQsIHRpbWVyKTsKKyAgICAgICAgdGltZXItPnN0YXJ0KGFycmF5W2ldLm5leHRG
aXJlSW50ZXJ2YWwsIGFycmF5W2ldLnJlcGVhdEludGVydmFsKTsKKyAgICB9CisgICAgZGVsZXRl
IFtdIGFycmF5OworfQorCit2b2lkIFdpbmRvdzo6Y2xlYXJUaW1lb3V0KGludCB0aW1lb3V0SWQs
IGJvb2wgZGVsQWN0aW9uKQoreworICAgIC8vIHRpbWVvdXQgSURzIGhhdmUgdG8gYmUgcG9zaXRp
dmUsIGFuZCAwIGFuZCAtMSBhcmUgdW5zYWZlIHRvCisgICAgLy8gZXZlbiBsb29rIHVwIHNpbmNl
IHRoZXkgYXJlIHRoZSBlbXB0eSBhbmQgZGVsZXRlZCB2YWx1ZQorICAgIC8vIHJlc3BlY3RpdmVs
eQorICAgIGlmICh0aW1lb3V0SWQgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZGVsZXRl
IGQtPm1fdGltZW91dHMudGFrZSh0aW1lb3V0SWQpOworfQorCit2b2lkIFdpbmRvdzo6dGltZXJG
aXJlZChET01XaW5kb3dUaW1lciogdGltZXIpCit7CisgICAgLy8gU2ltcGxlIGNhc2UgZm9yIG5v
bi1vbmUtc2hvdCB0aW1lcnMuCisgICAgaWYgKHRpbWVyLT5pc0FjdGl2ZSgpKSB7CisgICAgICAg
IGludCB0aW1lb3V0SWQgPSB0aW1lci0+dGltZW91dElkKCk7CisKKyAgICAgICAgdGltZXItPmFj
dGlvbigpLT5leGVjdXRlKHRoaXMpOworICAgICAgICBpZiAoZC0+bV90aW1lb3V0cy5jb250YWlu
cyh0aW1lb3V0SWQpICYmIHRpbWVyLT5yZXBlYXRJbnRlcnZhbCgpICYmIHRpbWVyLT5yZXBlYXRJ
bnRlcnZhbCgpIDwgY01pbmltdW1UaW1lckludGVydmFsKSB7CisgICAgICAgICAgICB0aW1lci0+
c2V0TmVzdGluZ0xldmVsKHRpbWVyLT5uZXN0aW5nTGV2ZWwoKSArIDEpOworICAgICAgICAgICAg
aWYgKHRpbWVyLT5uZXN0aW5nTGV2ZWwoKSA+PSBjTWF4VGltZXJOZXN0aW5nTGV2ZWwpCisgICAg
ICAgICAgICAgICAgdGltZXItPmF1Z21lbnRSZXBlYXRJbnRlcnZhbChjTWluaW11bVRpbWVySW50
ZXJ2YWwgLSB0aW1lci0+cmVwZWF0SW50ZXJ2YWwoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIC8vIERlbGV0ZSB0aW1lciBiZWZvcmUgZXhlY3V0aW5nIHRoZSBh
Y3Rpb24gZm9yIG9uZS1zaG90IHRpbWVycy4KKyAgICBTY2hlZHVsZWRBY3Rpb24qIGFjdGlvbiA9
IHRpbWVyLT50YWtlQWN0aW9uKCk7CisgICAgZC0+bV90aW1lb3V0cy5yZW1vdmUodGltZXItPnRp
bWVvdXRJZCgpKTsKKyAgICBkZWxldGUgdGltZXI7CisgICAgYWN0aW9uLT5leGVjdXRlKHRoaXMp
OworCisgICAgSlNMb2NrIGxvY2s7CisgICAgZGVsZXRlIGFjdGlvbjsKK30KKwordm9pZCBXaW5k
b3c6OmRpc2Nvbm5lY3RGcmFtZSgpCit7CisgICAgY2xlYXJBbGxUaW1lb3V0cygpOworICAgIGlm
IChkLT5sb2MpCisgICAgICAgIGQtPmxvYy0+bV9mcmFtZSA9IDA7Cit9CisKK1dpbmRvdzo6TGlz
dGVuZXJzTWFwJiBXaW5kb3c6OmpzRXZlbnRMaXN0ZW5lcnMoKQoreworICAgIHJldHVybiBkLT5q
c0V2ZW50TGlzdGVuZXJzOworfQorCitXaW5kb3c6Okxpc3RlbmVyc01hcCYgV2luZG93Ojpqc0hU
TUxFdmVudExpc3RlbmVycygpCit7CisgICAgcmV0dXJuIGQtPmpzSFRNTEV2ZW50TGlzdGVuZXJz
OworfQorCitXaW5kb3c6OlVucHJvdGVjdGVkTGlzdGVuZXJzTWFwJiBXaW5kb3c6OmpzVW5wcm90
ZWN0ZWRFdmVudExpc3RlbmVycygpCit7CisgICAgcmV0dXJuIGQtPmpzVW5wcm90ZWN0ZWRFdmVu
dExpc3RlbmVyczsKK30KKworV2luZG93OjpVbnByb3RlY3RlZExpc3RlbmVyc01hcCYgV2luZG93
Ojpqc1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzKCkKK3sKKyAgICByZXR1cm4gZC0+anNV
bnByb3RlY3RlZEhUTUxFdmVudExpc3RlbmVyczsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8v
LyBMb2NhdGlvbiBPYmplY3QgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IENsYXNz
SW5mbyBMb2NhdGlvbjo6aW5mbyA9IHsgIkxvY2F0aW9uIiwgMCwgJkxvY2F0aW9uVGFibGUgfTsK
Ky8qCitAYmVnaW4gTG9jYXRpb25UYWJsZSAxMgorICBhc3NpZ24gICAgICAgICZMb2NhdGlvblBy
b3RvRnVuY0Fzc2lnbjo6Y3JlYXRlICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDEKKyAgaGFz
aCAgICAgICAgICBMb2NhdGlvbjo6SGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgRG9udERl
bGV0ZQorICBob3N0ICAgICAgICAgIExvY2F0aW9uOjpIb3N0ICAgICAgICAgICAgICAgICAgICAg
ICAgICBEb250RGVsZXRlCisgIGhvc3RuYW1lICAgICAgTG9jYXRpb246Okhvc3RuYW1lICAgICAg
ICAgICAgICAgICAgICAgIERvbnREZWxldGUKKyAgaHJlZiAgICAgICAgICBMb2NhdGlvbjo6SHJl
ZiAgICAgICAgICAgICAgICAgICAgICAgICAgRG9udERlbGV0ZQorICBwYXRobmFtZSAgICAgIExv
Y2F0aW9uOjpQYXRobmFtZSAgICAgICAgICAgICAgICAgICAgICBEb250RGVsZXRlCisgIHBvcnQg
ICAgICAgICAgTG9jYXRpb246OlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIERvbnREZWxl
dGUKKyAgcHJvdG9jb2wgICAgICBMb2NhdGlvbjo6UHJvdG9jb2wgICAgICAgICAgICAgICAgICAg
ICAgRG9udERlbGV0ZQorICBzZWFyY2ggICAgICAgIExvY2F0aW9uOjpTZWFyY2ggICAgICAgICAg
ICAgICAgICAgICAgICBEb250RGVsZXRlCisgIHRvU3RyaW5nICAgICAgJkxvY2F0aW9uUHJvdG9G
dW5jVG9TdHJpbmc6OmNyZWF0ZSAgICAgIERvbnRFbnVtfERvbnREZWxldGV8RnVuY3Rpb24gMAor
ICByZXBsYWNlICAgICAgICZMb2NhdGlvblByb3RvRnVuY1JlcGxhY2U6OmNyZWF0ZSAgICAgICBE
b250RGVsZXRlfEZ1bmN0aW9uIDEKKyAgcmVsb2FkICAgICAgICAmTG9jYXRpb25Qcm90b0Z1bmNS
ZWxvYWQ6OmNyZWF0ZSAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAwCitAZW5kCisqLworCitM
b2NhdGlvbjo6TG9jYXRpb24oRnJhbWUqIGZyYW1lKQorICAgIDogbV9mcmFtZShmcmFtZSkKK3sK
K30KKworSlNWYWx1ZSAqTG9jYXRpb246OmdldFZhbHVlUHJvcGVydHkoRXhlY1N0YXRlKiBleGVj
LCBpbnQgdG9rZW4pIGNvbnN0Cit7CisgIEtVUkwgdXJsID0gbV9mcmFtZS0+bG9hZGVyKCktPnVy
bCgpOworICBzd2l0Y2ggKHRva2VuKSB7CisgIGNhc2UgSGFzaDoKKyAgICByZXR1cm4ganNTdHJp
bmcodXJsLnJlZigpLmlzTnVsbCgpID8gIiIgOiAiIyIgKyB1cmwucmVmKCkpOworICBjYXNlIEhv
c3Q6IHsKKyAgICAvLyBOb3RlOiB0aGlzIGlzIHRoZSBJRSBzcGVjLiBUaGUgTlMgc3BlYyBzd2Fw
cyB0aGUgdHdvLCBpdCBzYXlzCisgICAgLy8gIlRoZSBob3N0bmFtZSBwcm9wZXJ0eSBpcyB0aGUg
Y29uY2F0ZW5hdGlvbiBvZiB0aGUgaG9zdCBhbmQgcG9ydCBwcm9wZXJ0aWVzLCBzZXBhcmF0ZWQg
YnkgYSBjb2xvbi4iCisgICAgLy8gQmxlaC4KKyAgICBVU3RyaW5nIHN0ciA9IHVybC5ob3N0KCk7
CisgICAgaWYgKHVybC5wb3J0KCkpCisgICAgICAgIHN0ciArPSAiOiIgKyBTdHJpbmc6Om51bWJl
cigoaW50KXVybC5wb3J0KCkpOworICAgIHJldHVybiBqc1N0cmluZyhzdHIpOworICB9CisgIGNh
c2UgSG9zdG5hbWU6CisgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5ob3N0KCkpOworICBjYXNlIEhy
ZWY6CisgICAgaWYgKCF1cmwuaGFzUGF0aCgpKQorICAgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5w
cmV0dHlVUkwoKSArICIvIik7CisgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcmV0dHlVUkwoKSk7
CisgIGNhc2UgUGF0aG5hbWU6CisgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wYXRoKCkuaXNFbXB0
eSgpID8gIi8iIDogdXJsLnBhdGgoKSk7CisgIGNhc2UgUG9ydDoKKyAgICByZXR1cm4ganNTdHJp
bmcodXJsLnBvcnQoKSA/IFN0cmluZzo6bnVtYmVyKChpbnQpdXJsLnBvcnQoKSkgOiAiIik7Cisg
IGNhc2UgUHJvdG9jb2w6CisgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcm90b2NvbCgpICsgIjoi
KTsKKyAgY2FzZSBTZWFyY2g6CisgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5xdWVyeSgpKTsKKyAg
ZGVmYXVsdDoKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4ganNVbmRlZmlu
ZWQoKTsKKyAgfQorfQorCitib29sIExvY2F0aW9uOjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0
YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYg
c2xvdCkKK3sKKyAgaWYgKCFtX2ZyYW1lKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBX
aW5kb3cqIHdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5kb3cobV9mcmFtZSk7CisKKyAgY29u
c3QgSGFzaEVudHJ5KiBlbnRyeSA9IExvb2t1cDo6ZmluZEVudHJ5KCZMb2NhdGlvblRhYmxlLCBw
cm9wZXJ0eU5hbWUpOworICBpZiAoIWVudHJ5IHx8ICEoZW50cnktPmF0dHIgJiBLSlM6OkZ1bmN0
aW9uKSB8fCAoZW50cnktPnZhbHVlLmZ1bmN0aW9uVmFsdWUgIT0gJkxvY2F0aW9uUHJvdG9GdW5j
UmVwbGFjZTo6Y3JlYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAmJiBlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9jYXRpb25Qcm90
b0Z1bmNSZWxvYWQ6OmNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJiYgZW50cnktPnZhbHVlLmZ1bmN0aW9uVmFsdWUgIT0gJkxvY2F0aW9u
UHJvdG9GdW5jQXNzaWduOjpjcmVhdGUpKSAgeworICAgIGlmICghd2luZG93IHx8ICF3aW5kb3ct
PmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpIHsKKyAgICAgIHNsb3Quc2V0VW5kZWZpbmVkKHRoaXMp
OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGdldFN0YXRpY1By
b3BlcnR5U2xvdDxMb2NhdGlvbiwgSlNPYmplY3Q+KGV4ZWMsICZMb2NhdGlvblRhYmxlLCB0aGlz
LCBwcm9wZXJ0eU5hbWUsIHNsb3QpOworfQorCit2b2lkIExvY2F0aW9uOjpwdXQoRXhlY1N0YXRl
KiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBp
bnQgYXR0cikKK3sKKyAgaWYgKCFtX2ZyYW1lKQorICAgIHJldHVybjsKKworICBEZXByZWNhdGVk
U3RyaW5nIHN0ciA9IHZhbHVlLT50b1N0cmluZyhleGVjKTsKKyAgS1VSTCB1cmwgPSBtX2ZyYW1l
LT5sb2FkZXIoKS0+dXJsKCk7CisgIGNvbnN0IFdpbmRvdyogd2luZG93ID0gV2luZG93OjpyZXRy
aWV2ZVdpbmRvdyhtX2ZyYW1lKTsKKyAgYm9vbCBzYW1lRG9tYWluQWNjZXNzID0gd2luZG93ICYm
IHdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKTsKKworICBjb25zdCBIYXNoRW50cnkqIGVu
dHJ5ID0gTG9va3VwOjpmaW5kRW50cnkoJkxvY2F0aW9uVGFibGUsIHByb3BlcnR5TmFtZSk7CisK
KyAgaWYgKGVudHJ5KSB7CisgICAgICAvLyBjcm9zcy1kb21haW4gYWNjZXNzIHRvIHRoZSBsb2Nh
dGlvbiBpcyBhbGxvd2VkIHdoZW4gYXNzaWduaW5nIHRoZSB3aG9sZSBsb2NhdGlvbiwKKyAgICAg
IC8vIGJ1dCBub3Qgd2hlbiBhc3NpZ25pbmcgdGhlIGluZGl2aWR1YWwgcGllY2VzLCBzaW5jZSB0
aGF0IG1pZ2h0IGluYWR2ZXJ0ZW50bHkKKyAgICAgIC8vIGRpc2Nsb3NlIG90aGVyIHBhcnRzIG9m
IHRoZSBvcmlnaW5hbCBsb2NhdGlvbi4KKyAgICAgIGlmIChlbnRyeS0+dmFsdWUuaW50VmFsdWUg
IT0gSHJlZiAmJiAhc2FtZURvbWFpbkFjY2VzcykKKyAgICAgICAgICByZXR1cm47CisKKyAgICAg
IHN3aXRjaCAoZW50cnktPnZhbHVlLmludFZhbHVlKSB7CisgICAgICBjYXNlIEhyZWY6IHsKKyAg
ICAgICAgICBGcmFtZSogZnJhbWUgPSBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5pbXBs
KCktPmZyYW1lKCk7CisgICAgICAgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgIGlmICghZnJhbWUtPmxvYWRlcigpLT5zaG91bGRBbGxvd05hdmlnYXRpb24o
bV9mcmFtZSkpCisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB1cmwgPSBmcmFtZS0+
bG9hZGVyKCktPmNvbXBsZXRlVVJMKHN0cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9Cisg
ICAgICBjYXNlIEhhc2g6IHsKKyAgICAgICAgICBpZiAoc3RyLnN0YXJ0c1dpdGgoIiMiKSkKKyAg
ICAgICAgICAgICAgc3RyID0gc3RyLm1pZCgxKTsKKyAgICAgICAgICBpZiAodXJsLnJlZigpID09
IHN0cikKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIHVybC5zZXRSZWYoc3RyKTsK
KyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgSG9zdDogeworICAgICAgICAg
IHVybC5zZXRIb3N0QW5kUG9ydChzdHIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAg
ICAgY2FzZSBIb3N0bmFtZToKKyAgICAgICAgICB1cmwuc2V0SG9zdChzdHIpOworICAgICAgICAg
IGJyZWFrOworICAgICAgY2FzZSBQYXRobmFtZToKKyAgICAgICAgICB1cmwuc2V0UGF0aChzdHIp
OworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQb3J0OgorICAgICAgICAgIHVybC5zZXRQ
b3J0KHN0ci50b1VJbnQoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFByb3RvY29s
OgorICAgICAgICAgIHVybC5zZXRQcm90b2NvbChzdHIpOworICAgICAgICAgIGJyZWFrOworICAg
ICAgY2FzZSBTZWFyY2g6CisgICAgICAgICAgdXJsLnNldFF1ZXJ5KHN0cik7CisgICAgICAgICAg
YnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8vIERpc2FsbG93IGNoYW5naW5nIG90
aGVyIHByb3BlcnRpZXMgaW4gTG9jYXRpb25UYWJsZS4gZS5nLiwgIndpbmRvdy5sb2NhdGlvbi50
b1N0cmluZyA9IC4uLiIuCisgICAgICAgICAgLy8gPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTEyNzIwPgorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgfSBlbHNl
IHsKKyAgICAgIGlmIChzYW1lRG9tYWluQWNjZXNzKQorICAgICAgICAgIEpTT2JqZWN0OjpwdXQo
ZXhlYywgcHJvcGVydHlOYW1lLCB2YWx1ZSwgYXR0cik7CisgICAgICByZXR1cm47CisgIH0KKwor
ICBGcmFtZSogYWN0aXZlRnJhbWUgPSBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5pbXBs
KCktPmZyYW1lKCk7CisgIGlmICghdXJsLmRlcHJlY2F0ZWRTdHJpbmcoKS5zdGFydHNXaXRoKCJq
YXZhc2NyaXB0OiIsIGZhbHNlKSB8fCBzYW1lRG9tYWluQWNjZXNzKSB7CisgICAgYm9vbCB1c2Vy
R2VzdHVyZSA9IGFjdGl2ZUZyYW1lLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNzaW5nVXNlckdlc3R1
cmUoKTsKKyAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZSh1cmwu
c3RyaW5nKCksIGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxz
ZSwgdXNlckdlc3R1cmUpOworICB9Cit9CisKK0pTVmFsdWUqIExvY2F0aW9uUHJvdG9GdW5jUmVw
bGFjZTo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwg
Y29uc3QgTGlzdCYgYXJncykKK3sKKyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZMb2NhdGlv
bjo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7Cisg
ICAgTG9jYXRpb24qIGxvY2F0aW9uID0gc3RhdGljX2Nhc3Q8TG9jYXRpb24qPih0aGlzT2JqKTsK
KyAgICBGcmFtZSogZnJhbWUgPSBsb2NhdGlvbi0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQor
ICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKworICAgIEZyYW1lKiBhY3RpdmVGcmFtZSA9
IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwoKS0+ZnJhbWUoKTsKKyAgICBpZiAo
YWN0aXZlRnJhbWUpIHsKKyAgICAgICAgaWYgKCFhY3RpdmVGcmFtZS0+bG9hZGVyKCktPnNob3Vs
ZEFsbG93TmF2aWdhdGlvbihmcmFtZSkpCisgICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKKyAgICAgICAgRGVwcmVjYXRlZFN0cmluZyBzdHIgPSBhcmdzWzBdLT50b1N0cmluZyhleGVj
KTsKKyAgICAgICAgY29uc3QgV2luZG93KiB3aW5kb3cgPSBXaW5kb3c6OnJldHJpZXZlV2luZG93
KGZyYW1lKTsKKyAgICAgICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxz
ZSkgfHwgKHdpbmRvdyAmJiB3aW5kb3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpKSB7CisgICAg
ICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCktPnBy
b2Nlc3NpbmdVc2VyR2VzdHVyZSgpOworICAgICAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5zY2hl
ZHVsZUxvY2F0aW9uQ2hhbmdlKGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+Y29tcGxldGVVUkwoc3Ry
KS5zdHJpbmcoKSwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIHRy
dWUsIHVzZXJHZXN0dXJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBqc1VuZGVm
aW5lZCgpOworfQorCitKU1ZhbHVlKiBMb2NhdGlvblByb3RvRnVuY1JlbG9hZDo6Y2FsbEFzRnVu
Y3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJn
cykKK3sKKyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZMb2NhdGlvbjo6aW5mbykpCisgICAg
ICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7CisgICAgTG9jYXRpb24qIGxv
Y2F0aW9uID0gc3RhdGljX2Nhc3Q8TG9jYXRpb24qPih0aGlzT2JqKTsKKyAgICBGcmFtZSogZnJh
bWUgPSBsb2NhdGlvbi0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKKworICAgIFdpbmRvdyogd2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdp
bmRvdyhmcmFtZSk7CisgICAgaWYgKCF3aW5kb3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisg
ICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworCisgICAgaWYgKCFmcmFtZS0+bG9hZGVyKCkt
PnVybCgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5zdGFydHNXaXRoKCJqYXZhc2NyaXB0OiIsIGZhbHNl
KSB8fCAod2luZG93ICYmIHdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkpIHsKKyAgICAg
ICAgYm9vbCB1c2VyR2VzdHVyZSA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwo
KS0+ZnJhbWUoKS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCk7CisgICAg
ICAgIGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVSZWZyZXNoKHVzZXJHZXN0dXJlKTsKKyAgICB9
CisgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUqIExvY2F0aW9uUHJvdG9G
dW5jQXNzaWduOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlz
T2JqLCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJkxv
Y2F0aW9uOjppbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9y
KTsKKyAgICBMb2NhdGlvbiogbG9jYXRpb24gPSBzdGF0aWNfY2FzdDxMb2NhdGlvbio+KHRoaXNP
YmopOworICAgIEZyYW1lKiBmcmFtZSA9IGxvY2F0aW9uLT5mcmFtZSgpOworICAgIGlmICghZnJh
bWUpCisgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworCisgICAgRnJhbWUqIGFjdGl2ZUZy
YW1lID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOworICAg
IGlmIChhY3RpdmVGcmFtZSkgeworICAgICAgICBpZiAoIWFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+
c2hvdWxkQWxsb3dOYXZpZ2F0aW9uKGZyYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBqc1VuZGVm
aW5lZCgpOworICAgICAgICBjb25zdCBXaW5kb3cqIHdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVX
aW5kb3coZnJhbWUpOworICAgICAgICBTdHJpbmcgZHN0VXJsID0gYWN0aXZlRnJhbWUtPmxvYWRl
cigpLT5jb21wbGV0ZVVSTChhcmdzWzBdLT50b1N0cmluZyhleGVjKSkuc3RyaW5nKCk7CisgICAg
ICAgIGlmICghZHN0VXJsLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8ICh3aW5k
b3cgJiYgd2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSkgeworICAgICAgICAgICAgYm9v
bCB1c2VyR2VzdHVyZSA9IGFjdGl2ZUZyYW1lLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNzaW5nVXNl
ckdlc3R1cmUoKTsKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBpdGVtIGlm
IHRoaXMgSlMgd2FzIGNhbGxlZCB2aWEgYSB1c2VyIGdlc3R1cmUKKyAgICAgICAgICAgIGZyYW1l
LT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShkc3RVcmwsIGFjdGl2ZUZyYW1lLT5s
b2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1cmUpOworICAgICAg
ICB9CisgICAgfQorCisgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUqIExv
Y2F0aW9uUHJvdG9GdW5jVG9TdHJpbmc6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywg
SlNPYmplY3QqIHRoaXNPYmosIGNvbnN0IExpc3QmIGFyZ3MpCit7CisgICAgaWYgKCF0aGlzT2Jq
LT5pbmhlcml0cygmTG9jYXRpb246OmluZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihl
eGVjLCBUeXBlRXJyb3IpOworICAgIExvY2F0aW9uKiBsb2NhdGlvbiA9IHN0YXRpY19jYXN0PExv
Y2F0aW9uKj4odGhpc09iaik7CisgICAgRnJhbWUqIGZyYW1lID0gbG9jYXRpb24tPmZyYW1lKCk7
CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisKKyAgICBj
b25zdCBLVVJMJiB1cmwgPSBmcmFtZS0+bG9hZGVyKCktPnVybCgpOworICAgIGlmICghdXJsLmhh
c1BhdGgoKSkKKyAgICAgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcmV0dHlVUkwoKSArICIvIik7
CisgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcmV0dHlVUkwoKSk7Cit9CisKKy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vCisKK1BhdXNlZFRpbWVvdXRzOjp+UGF1c2VkVGltZW91dHMoKQoreworICAgIFBh
dXNlZFRpbWVvdXQqIGFycmF5ID0gbV9hcnJheTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICBy
ZXR1cm47CisgICAgc2l6ZV90IGNvdW50ID0gbV9sZW5ndGg7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgIT0gY291bnQ7ICsraSkKKyAgICAgICAgZGVsZXRlIGFycmF5W2ldLmFjdGlvbjsKKyAg
ICBkZWxldGUgW10gYXJyYXk7Cit9CisKK3ZvaWQgRE9NV2luZG93VGltZXI6OmZpcmVkKCkKK3sK
KyAgICB0aW1lck5lc3RpbmdMZXZlbCA9IG1fbmVzdGluZ0xldmVsOworICAgIG1fb2JqZWN0LT50
aW1lckZpcmVkKHRoaXMpOworICAgIHRpbWVyTmVzdGluZ0xldmVsID0gMDsKK30KKworfSAvLyBu
YW1lc3BhY2UgS0pTCisKK3VzaW5nIG5hbWVzcGFjZSBLSlM7CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworSlNWYWx1ZSogdG9KUyhFeGVjU3RhdGUqLCBET01XaW5kb3cqIGRvbVdpbmRvdykKK3sK
KyAgICBpZiAoIWRvbVdpbmRvdykKKyAgICAgICAgcmV0dXJuIGpzTnVsbCgpOworICAgIEZyYW1l
KiBmcmFtZSA9IGRvbVdpbmRvdy0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICBy
ZXR1cm4ganNOdWxsKCk7CisgICAgcmV0dXJuIFdpbmRvdzo6cmV0cmlldmUoZnJhbWUpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pzL1BhdXNl
ZFRpbWVvdXRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL1BhdXNlZFRp
bWVvdXRzLmNwcAkocmV2aXNpb24gMjg3NzYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL1BhdXNl
ZFRpbWVvdXRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw0ICsxLDMgQEAKLS8vIC0qLSBjLWJh
c2ljLW9mZnNldDogNCAtKi0KIC8qCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAwIEhhcnJpIFBvcnRl
biAocG9ydGVuQGtkZS5vcmcpCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEpvbiBTaGllciAoanNo
aWVyQGlhc3RhdGUuZWR1KQpAQCAtMjIsMTY0NSArMjEsMTEgQEAKICAqLwogCiAjaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaW5jbHVkZSAia2pzX3dpbmRvdy5oIgotCi0jaW5jbHVkZSAiQmFzZTY0Lmgi
Ci0jaW5jbHVkZSAiQ1N0cmluZy5oIgotI2luY2x1ZGUgIkNocm9tZS5oIgotI2luY2x1ZGUgIkRP
TVdpbmRvdy5oIgotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlICJFdmVudExpc3RlbmVy
LmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIK
LSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZy
YW1lTG9hZFJlcXVlc3QuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZy
YW1lVHJlZS5oIgotI2luY2x1ZGUgIkdDQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkhUTUxEb2N1
bWVudC5oIgotI2luY2x1ZGUgIkpTRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IuaCIKLSNpbmNsdWRl
ICJKU0RPTVdpbmRvdy5oIgotI2luY2x1ZGUgIkpTRXZlbnQuaCIKLSNpbmNsdWRlICJKU0hUTUxB
dWRpb0VsZW1lbnRDb25zdHJ1Y3Rvci5oIgotI2luY2x1ZGUgIkpTSFRNTENvbGxlY3Rpb24uaCIK
LSNpbmNsdWRlICJKU0hUTUxPcHRpb25FbGVtZW50Q29uc3RydWN0b3IuaCIKLSNpbmNsdWRlICJK
U1hNTEh0dHBSZXF1ZXN0LmgiCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgotI2luY2x1ZGUgIlBhZ2Uu
aCIKLSNpbmNsdWRlICJQbGF0Zm9ybVNjcmVlbi5oIgotI2luY2x1ZGUgIlBsdWdJbkluZm9TdG9y
ZS5oIgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5o
IgotI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVkZSAiV2luZG93RmVhdHVyZXMuaCIKLSNp
bmNsdWRlICJodG1sZWRpdGluZy5oIgotI2luY2x1ZGUgImtqc19jc3MuaCIKLSNpbmNsdWRlICJr
anNfZXZlbnRzLmgiCi0jaW5jbHVkZSAia2pzX25hdmlnYXRvci5oIgotI2luY2x1ZGUgImtqc19w
cm94eS5oIgotI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+Ci0KLSNpZiBFTkFCTEUoWFNMVCkK
LSNpbmNsdWRlICJKU1hTTFRQcm9jZXNzb3IuaCIKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2Ug
V2ViQ29yZTsKLXVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwotCi1uYW1lc3BhY2UgS0pTIHsK
LQotc3RhdGljIGludCBsYXN0VXNlZFRpbWVvdXRJZDsKLQotc3RhdGljIGludCB0aW1lck5lc3Rp
bmdMZXZlbCA9IDA7Ci1jb25zdCBpbnQgY01heFRpbWVyTmVzdGluZ0xldmVsID0gNTsKLWNvbnN0
IGRvdWJsZSBjTWluaW11bVRpbWVySW50ZXJ2YWwgPSAwLjAxMDsKLQotc3RydWN0IFdpbmRvd1By
aXZhdGUgewotICAgIFdpbmRvd1ByaXZhdGUoKQotICAgICAgICA6IGxvYygwKQotICAgICAgICAs
IG1fZXZ0KDApCi0gICAgICAgICwgbV9yZXR1cm5WYWx1ZVNsb3QoMCkKLSAgICB7Ci0gICAgfQot
Ci0gICAgV2luZG93OjpMaXN0ZW5lcnNNYXAganNFdmVudExpc3RlbmVyczsKLSAgICBXaW5kb3c6
Okxpc3RlbmVyc01hcCBqc0hUTUxFdmVudExpc3RlbmVyczsKLSAgICBXaW5kb3c6OlVucHJvdGVj
dGVkTGlzdGVuZXJzTWFwIGpzVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyczsKLSAgICBXaW5kb3c6
OlVucHJvdGVjdGVkTGlzdGVuZXJzTWFwIGpzVW5wcm90ZWN0ZWRIVE1MRXZlbnRMaXN0ZW5lcnM7
Ci0gICAgbXV0YWJsZSBMb2NhdGlvbiogbG9jOwotICAgIFdlYkNvcmU6OkV2ZW50KiBtX2V2dDsK
LSAgICBKU1ZhbHVlKiogbV9yZXR1cm5WYWx1ZVNsb3Q7Ci0KLSAgICB0eXBlZGVmIEhhc2hNYXA8
aW50LCBET01XaW5kb3dUaW1lcio+IFRpbWVvdXRzTWFwOwotICAgIFRpbWVvdXRzTWFwIG1fdGlt
ZW91dHM7Ci19OwotCi1jbGFzcyBET01XaW5kb3dUaW1lciA6IHB1YmxpYyBUaW1lckJhc2Ugewot
cHVibGljOgotICAgIERPTVdpbmRvd1RpbWVyKGludCB0aW1lb3V0SWQsIGludCBuZXN0aW5nTGV2
ZWwsIFdpbmRvdyogb2JqZWN0LCBTY2hlZHVsZWRBY3Rpb24qIGFjdGlvbikKLSAgICAgICAgOiBt
X3RpbWVvdXRJZCh0aW1lb3V0SWQpCi0gICAgICAgICwgbV9uZXN0aW5nTGV2ZWwobmVzdGluZ0xl
dmVsKQotICAgICAgICAsIG1fb2JqZWN0KG9iamVjdCkKLSAgICAgICAgLCBtX2FjdGlvbihhY3Rp
b24pCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgfkRPTVdpbmRvd1RpbWVyKCkKLSAgICB7
Ci0gICAgICAgIEpTTG9jayBsb2NrOwotICAgICAgICBkZWxldGUgbV9hY3Rpb247Ci0gICAgfQot
Ci0gICAgaW50IHRpbWVvdXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1fdGltZW91dElkOyB9Ci0KLSAg
ICBpbnQgbmVzdGluZ0xldmVsKCkgY29uc3QgeyByZXR1cm4gbV9uZXN0aW5nTGV2ZWw7IH0KLSAg
ICB2b2lkIHNldE5lc3RpbmdMZXZlbChpbnQgbikgeyBtX25lc3RpbmdMZXZlbCA9IG47IH0KLQot
ICAgIFNjaGVkdWxlZEFjdGlvbiogYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9hY3Rpb247IH0K
LSAgICBTY2hlZHVsZWRBY3Rpb24qIHRha2VBY3Rpb24oKSB7IFNjaGVkdWxlZEFjdGlvbiogYSA9
IG1fYWN0aW9uOyBtX2FjdGlvbiA9IDA7IHJldHVybiBhOyB9Ci0KLXByaXZhdGU6Ci0gICAgdmly
dHVhbCB2b2lkIGZpcmVkKCk7Ci0KLSAgICBpbnQgbV90aW1lb3V0SWQ7Ci0gICAgaW50IG1fbmVz
dGluZ0xldmVsOwotICAgIFdpbmRvdyogbV9vYmplY3Q7Ci0gICAgU2NoZWR1bGVkQWN0aW9uKiBt
X2FjdGlvbjsKLX07Ci0KLWNsYXNzIFBhdXNlZFRpbWVvdXQgewotcHVibGljOgotICAgIGludCB0
aW1lb3V0SWQ7Ci0gICAgaW50IG5lc3RpbmdMZXZlbDsKLSAgICBkb3VibGUgbmV4dEZpcmVJbnRl
cnZhbDsKLSAgICBkb3VibGUgcmVwZWF0SW50ZXJ2YWw7Ci0gICAgU2NoZWR1bGVkQWN0aW9uICph
Y3Rpb247Ci19OwotCi19IC8vIG5hbWVzcGFjZSBLSlMKLQotI2luY2x1ZGUgImtqc193aW5kb3cu
bHV0LmgiCi0KLW5hbWVzcGFjZSBLSlMgewotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFdpbmRv
dyBPYmplY3QgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWNvbnN0IENsYXNzSW5mbyBXaW5k
b3c6OmluZm8gPSB7ICJXaW5kb3ciLCAwLCAmV2luZG93VGFibGUgfTsKLQotLyoKLUBiZWdpbiBX
aW5kb3dUYWJsZSAxMTgKLSMgV2FybmluZywgd2hlbiBhZGRpbmcgYSBmdW5jdGlvbiB0byB0aGlz
IG9iamVjdCB5b3UgbmVlZCB0byBhZGQgYSBjYXNlIGluIFdpbmRvdzo6Z2V0Ci0jIC0tIEZ1bmN0
aW9ucyAtLQotICBhdG9iICAgICAgICAgICAgICAgICAgJldpbmRvd1Byb3RvRnVuY0FUb0I6OmNy
ZWF0ZSAgICAgICAgICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDEKLSAgYnRvYSAgICAgICAg
ICAgICAgICAgICZXaW5kb3dQcm90b0Z1bmNCVG9BOjpjcmVhdGUgICAgICAgICAgICAgICAgRG9u
dERlbGV0ZXxGdW5jdGlvbiAxCi0gIG9wZW4gICAgICAgICAgICAgICAgICAmV2luZG93UHJvdG9G
dW5jT3Blbjo6Y3JlYXRlICAgICAgICAgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMwotICBz
ZXRUaW1lb3V0ICAgICAgICAgICAgJldpbmRvd1Byb3RvRnVuY1NldFRpbWVvdXQ6OmNyZWF0ZSAg
ICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDIKLSAgY2xlYXJUaW1lb3V0ICAgICAgICAgICZX
aW5kb3dQcm90b0Z1bmNDbGVhclRpbWVvdXQ6OmNyZWF0ZSAgICAgICAgRG9udERlbGV0ZXxGdW5j
dGlvbiAxCi0gIHNldEludGVydmFsICAgICAgICAgICAmV2luZG93UHJvdG9GdW5jU2V0SW50ZXJ2
YWw6OmNyZWF0ZSAgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMgotICBjbGVhckludGVydmFs
ICAgICAgICAgJldpbmRvd1Byb3RvRnVuY0NsZWFyVGltZW91dDo6Y3JlYXRlICAgICAgICBEb250
RGVsZXRlfEZ1bmN0aW9uIDEKLSAgYWRkRXZlbnRMaXN0ZW5lciAgICAgICZXaW5kb3dQcm90b0Z1
bmNBZGRFdmVudExpc3RlbmVyOjpjcmVhdGUgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAzCi0gIHJl
bW92ZUV2ZW50TGlzdGVuZXIgICAmV2luZG93UHJvdG9GdW5jUmVtb3ZlRXZlbnRMaXN0ZW5lcjo6
Y3JlYXRlIERvbnREZWxldGV8RnVuY3Rpb24gMwotICBzaG93TW9kYWxEaWFsb2cgICAgICAgJldp
bmRvd1Byb3RvRnVuY1Nob3dNb2RhbERpYWxvZzo6Y3JlYXRlICAgICBEb250RGVsZXRlfEZ1bmN0
aW9uIDEKLSMgTm90IGltcGxlbWVudGVkCi0gIGNhcHR1cmVFdmVudHMgICAgICAgICAmV2luZG93
UHJvdG9GdW5jTm90SW1wbGVtZW50ZWQ6OmNyZWF0ZSAgICAgIERvbnREZWxldGV8RnVuY3Rpb24g
MAotICByZWxlYXNlRXZlbnRzICAgICAgICAgJldpbmRvd1Byb3RvRnVuY05vdEltcGxlbWVudGVk
OjpjcmVhdGUgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDAKLQotIyAtLSBBdHRyaWJ1dGVzIC0t
Ci0gIGNyeXB0byAgICAgICAgICAgICAgICBXaW5kb3c6OkNyeXB0byAgICAgICAgICAgICAgRG9u
dERlbGV0ZXxSZWFkT25seQotICBldmVudCAgICAgICAgICAgICAgICAgV2luZG93OjpFdmVudF8g
ICAgICAgICAgICAgIERvbnREZWxldGUKLSAgbG9jYXRpb24gICAgICAgICAgICAgIFdpbmRvdzo6
TG9jYXRpb25fICAgICAgICAgICBEb250RGVsZXRlCi0gIG5hdmlnYXRvciAgICAgICAgICAgICBX
aW5kb3c6Ok5hdmlnYXRvcl8gICAgICAgICAgRG9udERlbGV0ZXxSZWFkT25seQotICBjbGllbnRJ
bmZvcm1hdGlvbiAgICAgV2luZG93OjpDbGllbnRJbmZvcm1hdGlvbiAgIERvbnREZWxldGV8UmVh
ZE9ubHkKLSMgLS0gRXZlbnQgTGlzdGVuZXJzIC0tCi0gIG9uYWJvcnQgICAgICAgICAgICAgICBX
aW5kb3c6Ok9uYWJvcnQgICAgICAgICAgICAgRG9udERlbGV0ZQotICBvbmJsdXIgICAgICAgICAg
ICAgICAgV2luZG93OjpPbmJsdXIgICAgICAgICAgICAgIERvbnREZWxldGUKLSAgb25jaGFuZ2Ug
ICAgICAgICAgICAgIFdpbmRvdzo6T25jaGFuZ2UgICAgICAgICAgICBEb250RGVsZXRlCi0gIG9u
Y2xpY2sgICAgICAgICAgICAgICBXaW5kb3c6Ok9uY2xpY2sgICAgICAgICAgICAgRG9udERlbGV0
ZQotICBvbmRibGNsaWNrICAgICAgICAgICAgV2luZG93OjpPbmRibGNsaWNrICAgICAgICAgIERv
bnREZWxldGUKLSAgb25lcnJvciAgICAgICAgICAgICAgIFdpbmRvdzo6T25lcnJvciAgICAgICAg
ICAgICBEb250RGVsZXRlCi0gIG9uZm9jdXMgICAgICAgICAgICAgICBXaW5kb3c6Ok9uZm9jdXMg
ICAgICAgICAgICAgRG9udERlbGV0ZQotICBvbmtleWRvd24gICAgICAgICAgICAgV2luZG93OjpP
bmtleWRvd24gICAgICAgICAgIERvbnREZWxldGUKLSAgb25rZXlwcmVzcyAgICAgICAgICAgIFdp
bmRvdzo6T25rZXlwcmVzcyAgICAgICAgICBEb250RGVsZXRlCi0gIG9ua2V5dXAgICAgICAgICAg
ICAgICBXaW5kb3c6Ok9ua2V5dXAgICAgICAgICAgICAgRG9udERlbGV0ZQotICBvbmxvYWQgICAg
ICAgICAgICAgICAgV2luZG93OjpPbmxvYWQgICAgICAgICAgICAgIERvbnREZWxldGUKLSAgb25t
b3VzZWRvd24gICAgICAgICAgIFdpbmRvdzo6T25tb3VzZWRvd24gICAgICAgICBEb250RGVsZXRl
Ci0gIG9ubW91c2Vtb3ZlICAgICAgICAgICBXaW5kb3c6Ok9ubW91c2Vtb3ZlICAgICAgICAgRG9u
dERlbGV0ZQotICBvbm1vdXNlb3V0ICAgICAgICAgICAgV2luZG93OjpPbm1vdXNlb3V0ICAgICAg
ICAgIERvbnREZWxldGUKLSAgb25tb3VzZW92ZXIgICAgICAgICAgIFdpbmRvdzo6T25tb3VzZW92
ZXIgICAgICAgICBEb250RGVsZXRlCi0gIG9ubW91c2V1cCAgICAgICAgICAgICBXaW5kb3c6Ok9u
bW91c2V1cCAgICAgICAgICAgRG9udERlbGV0ZQotICBvbm1vdXNld2hlZWwgICAgICAgICAgV2lu
ZG93OjpPbldpbmRvd01vdXNlV2hlZWwgIERvbnREZWxldGUKLSAgb25yZXNldCAgICAgICAgICAg
ICAgIFdpbmRvdzo6T25yZXNldCAgICAgICAgICAgICBEb250RGVsZXRlCi0gIG9ucmVzaXplICAg
ICAgICAgICAgICBXaW5kb3c6Ok9ucmVzaXplICAgICAgICAgICAgRG9udERlbGV0ZQotICBvbnNj
cm9sbCAgICAgICAgICAgICAgV2luZG93OjpPbnNjcm9sbCAgICAgICAgICAgIERvbnREZWxldGUK
LSAgb25zZWFyY2ggICAgICAgICAgICAgIFdpbmRvdzo6T25zZWFyY2ggICAgICAgICAgICBEb250
RGVsZXRlCi0gIG9uc2VsZWN0ICAgICAgICAgICAgICBXaW5kb3c6Ok9uc2VsZWN0ICAgICAgICAg
ICAgRG9udERlbGV0ZQotICBvbnN1Ym1pdCAgICAgICAgICAgICAgV2luZG93OjpPbnN1Ym1pdCAg
ICAgICAgICAgIERvbnREZWxldGUKLSAgb251bmxvYWQgICAgICAgICAgICAgIFdpbmRvdzo6T251
bmxvYWQgICAgICAgICAgICBEb250RGVsZXRlCi0gIG9uYmVmb3JldW5sb2FkICAgICAgICBXaW5k
b3c6Ok9uYmVmb3JldW5sb2FkICAgICAgRG9udERlbGV0ZQotIyAtLSBDb25zdHJ1Y3RvcnMgLS0K
LSAgQXVkaW8gICAgICAgICAgICAgICAgIFdpbmRvdzo6QXVkaW8gICAgICAgICAgICAgICBEb250
RGVsZXRlCi0gIERPTUV4Y2VwdGlvbiAgICAgICAgICBXaW5kb3c6OkRPTUV4Y2VwdGlvbiAgICAg
ICAgRG9udERlbGV0ZQotICBJbWFnZSAgICAgICAgICAgICAgICAgV2luZG93OjpJbWFnZSAgICAg
ICAgICAgICAgIERvbnREZWxldGUKLSAgT3B0aW9uICAgICAgICAgICAgICAgIFdpbmRvdzo6T3B0
aW9uICAgICAgICAgICAgICBEb250RGVsZXRlCi0gIFhNTEh0dHBSZXF1ZXN0ICAgICAgICBXaW5k
b3c6OlhNTEh0dHBSZXF1ZXN0ICAgICAgRG9udERlbGV0ZQotICBYU0xUUHJvY2Vzc29yICAgICAg
ICAgV2luZG93OjpYU0xUUHJvY2Vzc29yXyAgICAgIERvbnREZWxldGUKLUBlbmQKLSovCi0KLVdp
bmRvdzo6V2luZG93KERPTVdpbmRvdyogd2luZG93KQotICAgIDogbV9pbXBsKHdpbmRvdykKLSAg
ICAsIGQobmV3IFdpbmRvd1ByaXZhdGUpCi17Ci0gICAgLy8gV2luZG93IGRlc3RydWN0aW9uIGlz
IG5vdCB0aHJlYWQtc2FmZSBiZWNhdXNlIG9mCi0gICAgLy8gdGhlIG5vbi10aHJlYWQtc2FmZSBX
ZWJDb3JlIHN0cnVjdHVyZXMgaXQgcmVmZXJlbmNlcy4KLSAgICBDb2xsZWN0b3I6OmNvbGxlY3RP
bk1haW5UaHJlYWRPbmx5KHRoaXMpOwotCi0gICAgLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYmVm
b3JlIHRoZSBzY3JpcHQgdGltZW91dCBoYW5kbGVyIGtpY2tzIGluLgotICAgIHNldFRpbWVvdXRU
aW1lKDEwMDAwKTsKLX0KLQotV2luZG93Ojp+V2luZG93KCkKLXsKLSAgICBjbGVhckFsbFRpbWVv
dXRzKCk7Ci0KLSAgICAvLyBDbGVhciBhbnkgYmFja3BvaW50ZXJzIHRvIHRoZSB3aW5kb3cKLQot
ICAgIExpc3RlbmVyc01hcDo6aXRlcmF0b3IgaTIgPSBkLT5qc0V2ZW50TGlzdGVuZXJzLmJlZ2lu
KCk7Ci0gICAgTGlzdGVuZXJzTWFwOjppdGVyYXRvciBlMiA9IGQtPmpzRXZlbnRMaXN0ZW5lcnMu
ZW5kKCk7Ci0gICAgZm9yICg7IGkyICE9IGUyOyArK2kyKQotICAgICAgICBpMi0+c2Vjb25kLT5j
bGVhcldpbmRvd09iaigpOwotICAgIGkyID0gZC0+anNIVE1MRXZlbnRMaXN0ZW5lcnMuYmVnaW4o
KTsKLSAgICBlMiA9IGQtPmpzSFRNTEV2ZW50TGlzdGVuZXJzLmVuZCgpOwotICAgIGZvciAoOyBp
MiAhPSBlMjsgKytpMikKLSAgICAgICAgaTItPnNlY29uZC0+Y2xlYXJXaW5kb3dPYmooKTsKLQot
ICAgIFVucHJvdGVjdGVkTGlzdGVuZXJzTWFwOjppdGVyYXRvciBpMSA9IGQtPmpzVW5wcm90ZWN0
ZWRFdmVudExpc3RlbmVycy5iZWdpbigpOwotICAgIFVucHJvdGVjdGVkTGlzdGVuZXJzTWFwOjpp
dGVyYXRvciBlMSA9IGQtPmpzVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVycy5lbmQoKTsKLSAgICBm
b3IgKDsgaTEgIT0gZTE7ICsraTEpCi0gICAgICAgIGkxLT5zZWNvbmQtPmNsZWFyV2luZG93T2Jq
KCk7Ci0gICAgaTEgPSBkLT5qc1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzLmJlZ2luKCk7
Ci0gICAgZTEgPSBkLT5qc1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzLmVuZCgpOwotICAg
IGZvciAoOyBpMSAhPSBlMTsgKytpMSkKLSAgICAgICAgaTEtPnNlY29uZC0+Y2xlYXJXaW5kb3dP
YmooKTsKLX0KLQotV2luZG93KiBXaW5kb3c6OnJldHJpZXZlV2luZG93KEZyYW1lKiBmcmFtZSkK
LXsKLSAgICBKU09iamVjdCogbyA9IHJldHJpZXZlKGZyYW1lKS0+Z2V0T2JqZWN0KCk7Ci0KLSAg
ICBBU1NFUlQobyB8fCAhZnJhbWUtPnNldHRpbmdzKCkgfHwgIWZyYW1lLT5zZXR0aW5ncygpLT5p
c0phdmFTY3JpcHRFbmFibGVkKCkpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxXaW5kb3cqPihv
KTsKLX0KLQotV2luZG93KiBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKEV4ZWNTdGF0ZSogZXhlYykK
LXsKLSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+ZHluYW1pY0dsb2Jh
bE9iamVjdCgpOwotICAgIEFTU0VSVChnbG9iYWxPYmplY3QpOwotICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxXaW5kb3cqPihnbG9iYWxPYmplY3QpOwotfQotCi1KU1ZhbHVlKiBXaW5kb3c6OnJldHJp
ZXZlKEZyYW1lKiBmcmFtZSkKLXsKLSAgICBBU1NFUlQoZnJhbWUpOwotICAgIGlmIChLSlNQcm94
eSogcHJveHkgPSBmcmFtZS0+c2NyaXB0UHJveHkoKSkKLSAgICAgICAgcmV0dXJuIHByb3h5LT5n
bG9iYWxPYmplY3QoKTsgLy8gdGhlIEdsb2JhbCBvYmplY3QgaXMgdGhlICJ3aW5kb3ciCi0KLSAg
ICByZXR1cm4ganNVbmRlZmluZWQoKTsgLy8gVGhpcyBjYW4gaGFwcGVuIHdpdGggSlMgZGlzYWJs
ZWQgb24gdGhlIGRvbWFpbiBvZiB0aGF0IHdpbmRvdwotfQotCi1Mb2NhdGlvbiogV2luZG93Ojps
b2NhdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFkLT5sb2MpCi0gICAgICAgIGQtPmxvYyA9IG5l
dyBMb2NhdGlvbihpbXBsKCktPmZyYW1lKCkpOwotICAgIHJldHVybiBkLT5sb2M7Ci19Ci0KLS8v
IHJlZmVyZW5jZSBvdXIgc3BlY2lhbCBvYmplY3RzIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24K
LXZvaWQgV2luZG93OjptYXJrKCkKLXsKLSAgICBKU0dsb2JhbE9iamVjdDo6bWFyaygpOwotICAg
IGlmIChkLT5sb2MgJiYgIWQtPmxvYy0+bWFya2VkKCkpCi0gICAgICAgIGQtPmxvYy0+bWFyaygp
OwotfQotCi1zdGF0aWMgYm9vbCBhbGxvd1BvcFVwKEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAo
IWZyYW1lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGZyYW1lLT5zY3JpcHRQcm94
eSgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
U2V0dGluZ3MqIHNldHRpbmdzID0gZnJhbWUtPnNldHRpbmdzKCk7Ci0gICAgcmV0dXJuIHNldHRp
bmdzICYmIHNldHRpbmdzLT5KYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KCk7
Ci19Ci0KLXN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJzZU1vZGFsRGlhbG9nRmVh
dHVyZXMoY29uc3QgU3RyaW5nJiBmZWF0dXJlc0FyZykKLXsKLSAgICBIYXNoTWFwPFN0cmluZywg
U3RyaW5nPiBtYXA7Ci0KLSAgICBWZWN0b3I8U3RyaW5nPiBmZWF0dXJlcyA9IGZlYXR1cmVzQXJn
LnNwbGl0KCc7Jyk7Ci0gICAgVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGZl
YXR1cmVzLmVuZCgpOwotICAgIGZvciAoVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gZmVhdHVyZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIFN0cmluZyBz
ID0gKml0OwotICAgICAgICBpbnQgcG9zID0gcy5maW5kKCc9Jyk7Ci0gICAgICAgIGludCBjb2xv
blBvcyA9IHMuZmluZCgnOicpOwotICAgICAgICBpZiAocG9zID49IDAgJiYgY29sb25Qb3MgPj0g
MCkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmUgYW55IHN0cmluZ3MgdGhhdCBoYXZl
IGJvdGggPSBhbmQgOgotICAgICAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgICAgIHBvcyA9IGNv
bG9uUG9zOwotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgLy8gbnVsbCBzdHJp
bmcgZm9yIHZhbHVlIG1lYW5zIGtleSB3aXRob3V0IHZhbHVlCi0gICAgICAgICAgICBtYXAuc2V0
KHMuc3RyaXBXaGl0ZVNwYWNlKCkubG93ZXIoKSwgU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IHMubGVmdChwb3MpLnN0cmlwV2hpdGVTcGFjZSgp
Lmxvd2VyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsID0gcy5zdWJzdHJpbmcocG9zICsgMSku
c3RyaXBXaGl0ZVNwYWNlKCkubG93ZXIoKTsKLSAgICAgICAgICAgIGludCBzcGFjZVBvcyA9IHZh
bC5maW5kKCcgJyk7Ci0gICAgICAgICAgICBpZiAoc3BhY2VQb3MgIT0gLTEpCi0gICAgICAgICAg
ICAgICAgdmFsID0gdmFsLmxlZnQoc3BhY2VQb3MpOwotICAgICAgICAgICAgbWFwLnNldChrZXks
IHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWFwOwotfQotCi1zdGF0aWMg
RnJhbWUqIGNyZWF0ZVdpbmRvdyhFeGVjU3RhdGUqIGV4ZWMsIEZyYW1lKiBvcGVuZXJGcmFtZSwg
Y29uc3QgU3RyaW5nJiB1cmwsCi0gICAgY29uc3QgU3RyaW5nJiBmcmFtZU5hbWUsIGNvbnN0IFdp
bmRvd0ZlYXR1cmVzJiB3aW5kb3dGZWF0dXJlcywgSlNWYWx1ZSogZGlhbG9nQXJncykKLXsKLSAg
ICBGcmFtZSogYWN0aXZlRnJhbWUgPSBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5pbXBs
KCktPmZyYW1lKCk7Ci0KLSAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdDsKLSAgICBpZiAoYWN0
aXZlRnJhbWUpCi0gICAgICAgIHJlcXVlc3Quc2V0SFRUUFJlZmVycmVyKGFjdGl2ZUZyYW1lLT5s
b2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpKTsKLSAgICBGcmFtZUxvYWRSZXF1ZXN0IGZyYW1l
UmVxdWVzdChyZXF1ZXN0LCBmcmFtZU5hbWUpOwotCi0gICAgLy8gRklYTUU6IEl0J3MgbXVjaCBi
ZXR0ZXIgZm9yIGNsaWVudCBBUEkgaWYgYSBuZXcgd2luZG93IHN0YXJ0cyB3aXRoIGEgVVJMLCBo
ZXJlIHdoZXJlIHdlCi0gICAgLy8ga25vdyB3aGF0IFVSTCB3ZSBhcmUgZ29pbmcgdG8gb3Blbi4g
VW5mb3J0dW5hdGVseSwgdGhpcyBjb2RlIHBhc3NlcyB0aGUgZW1wdHkgc3RyaW5nCi0gICAgLy8g
Zm9yIHRoZSBVUkwsIGJ1dCB0aGVyZSdzIGEgcmVhc29uIGZvciB0aGF0LiBCZWZvcmUgbG9hZGlu
ZyB3ZSBoYXZlIHRvIHNldCB1cCB0aGUgb3BlbmVyLAotICAgIC8vIG9wZW5lZEJ5RE9NLCBhbmQg
ZGlhbG9nQXJndW1lbnRzIHZhbHVlcy4gQWxzbywgdG8gZGVjaWRlIHdoZXRoZXIgdG8gdXNlIHRo
ZSBVUkwgd2UgY3VycmVudGx5Ci0gICAgLy8gZG8gYW4gYWxsb3dzQWNjZXNzRnJvbSBjYWxsIHVz
aW5nIHRoZSB3aW5kb3cgd2UgY3JlYXRlLCB3aGljaCBjYW4ndCBiZSBkb25lIGJlZm9yZSBjcmVh
dGluZyBpdC4KLSAgICAvLyBXZSdkIGhhdmUgdG8gcmVzb2x2ZSBhbGwgdGhvc2UgaXNzdWVzIHRv
IHBhc3MgdGhlIFVSTCBpbnN0ZWFkIG9mICIiLgotCi0gICAgYm9vbCBjcmVhdGVkOwotICAgIEZy
YW1lKiBuZXdGcmFtZSA9IG9wZW5lckZyYW1lLT5sb2FkZXIoKS0+Y3JlYXRlV2luZG93KGZyYW1l
UmVxdWVzdCwgd2luZG93RmVhdHVyZXMsIGNyZWF0ZWQpOwotICAgIGlmICghbmV3RnJhbWUpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgbmV3RnJhbWUtPmxvYWRlcigpLT5zZXRPcGVuZXIob3Bl
bmVyRnJhbWUpOwotICAgIG5ld0ZyYW1lLT5sb2FkZXIoKS0+c2V0T3BlbmVkQnlET00oKTsKLQot
ICAgIFdpbmRvdyogbmV3V2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdpbmRvdyhuZXdGcmFtZSk7
Ci0KLSAgICBpZiAoZGlhbG9nQXJncykKLSAgICAgICAgbmV3V2luZG93LT5wdXREaXJlY3QoImRp
YWxvZ0FyZ3VtZW50cyIsIGRpYWxvZ0FyZ3MpOwotCi0gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgi
amF2YXNjcmlwdDoiLCBmYWxzZSkgfHwgbmV3V2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMp
KSB7Ci0gICAgICAgIFN0cmluZyBjb21wbGV0ZWRVUkwgPSB1cmwuaXNFbXB0eSgpID8gdXJsIDog
YWN0aXZlRnJhbWUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybCk7Ci0gICAgICAgIGJvb2wg
dXNlckdlc3R1cmUgPSBhY3RpdmVGcmFtZS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2luZ1VzZXJH
ZXN0dXJlKCk7Ci0KLSAgICAgICAgaWYgKGNyZWF0ZWQpIHsKLSAgICAgICAgICAgIG5ld0ZyYW1l
LT5sb2FkZXIoKS0+Y2hhbmdlTG9jYXRpb24oS1VSTChjb21wbGV0ZWRVUkwuZGVwcmVjYXRlZFN0
cmluZygpKSwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNl
LCB1c2VyR2VzdHVyZSk7Ci0gICAgICAgICAgICBpZiAoRG9jdW1lbnQqIG9sZERvYyA9IG9wZW5l
ckZyYW1lLT5kb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RnJhbWUtPmRvY3VtZW50
KCktPnNldERvbWFpbkludGVybmFsKG9sZERvYy0+ZG9tYWluKCkpOwotICAgICAgICAgICAgICAg
IG5ld0ZyYW1lLT5kb2N1bWVudCgpLT5zZXRCYXNlVVJMKG9sZERvYy0+YmFzZVVSTCgpKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghdXJsLmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgIG5ld0ZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRV
UkwsIGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNl
ckdlc3R1cmUpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdGcmFtZTsKLX0KLQotc3RhdGljIGJv
b2wgY2FuU2hvd01vZGFsRGlhbG9nKGNvbnN0IEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAoIWZy
YW1lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGZyYW1lLT5wYWdlKCktPmNo
cm9tZSgpLT5jYW5SdW5Nb2RhbCgpOwotfQotCi1zdGF0aWMgYm9vbCBjYW5TaG93TW9kYWxEaWFs
b2dOb3coY29uc3QgRnJhbWUqIGZyYW1lKQotewotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICByZXR1cm4gZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNhblJ1bk1v
ZGFsTm93KCk7Ci19Ci0KLXN0YXRpYyBKU1ZhbHVlKiBzaG93TW9kYWxEaWFsb2coRXhlY1N0YXRl
KiBleGVjLCBGcmFtZSogZnJhbWUsIGNvbnN0IFN0cmluZyYgdXJsLCBKU1ZhbHVlKiBkaWFsb2dB
cmdzLCBjb25zdCBTdHJpbmcmIGZlYXR1cmVBcmdzKQotewotICAgIGlmICghY2FuU2hvd01vZGFs
RGlhbG9nTm93KGZyYW1lKSB8fCAhYWxsb3dQb3BVcChmcmFtZSkpCi0gICAgICAgIHJldHVybiBq
c1VuZGVmaW5lZCgpOwotCi0gICAgY29uc3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVy
ZXMgPSBwYXJzZU1vZGFsRGlhbG9nRmVhdHVyZXMoZmVhdHVyZUFyZ3MpOwotCi0gICAgY29uc3Qg
Ym9vbCB0cnVzdGVkID0gZmFsc2U7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGZy
b20gTWljcm9zb2Z0J3MgZG9jdW1lbnRhdGlvbiBhcmUgbm90IGltcGxlbWVudGVkOgotICAgIC8v
IC0gZGVmYXVsdCBmb250IHNldHRpbmdzCi0gICAgLy8gLSB3aWR0aCwgaGVpZ2h0LCBsZWZ0LCBh
bmQgdG9wIHNwZWNpZmllZCBpbiB1bml0cyBvdGhlciB0aGFuICJweCIKLSAgICAvLyAtIGVkZ2Ug
KHN1bmtlbiBvciByYWlzZWQsIGRlZmF1bHQgaXMgcmFpc2VkKQotICAgIC8vIC0gZGlhbG9nSGlk
ZTogdHJ1c3RlZCAmJiBib29sRmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ2hpZGUiKSwgbWFrZXMg
ZGlhbG9nIGhpZGUgd2hlbiB5b3UgcHJpbnQKLSAgICAvLyAtIGhlbHA6IGJvb2xGZWF0dXJlKGZl
YXR1cmVzLCAiaGVscCIsIHRydWUpLCBtYWtlcyBoZWxwIGljb24gYXBwZWFyIGluIGRpYWxvZyAo
d2hhdCBkb2VzIGl0IGRvIG9uIFdpbmRvd3M/KQotICAgIC8vIC0gdW5hZG9ybmVkOiB0cnVzdGVk
ICYmIGJvb2xGZWF0dXJlKGZlYXR1cmVzLCAidW5hZG9ybmVkIik7Ci0KLSAgICBpZiAoIWZyYW1l
KQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAgIEZsb2F0UmVjdCBzY3JlZW5S
ZWN0ID0gc2NyZWVuQXZhaWxhYmxlUmVjdChmcmFtZS0+dmlldygpKTsKLQotICAgIFdpbmRvd0Zl
YXR1cmVzIHdhcmdzOwotICAgIHdhcmdzLndpZHRoID0gV2luZG93RmVhdHVyZXM6OmZsb2F0RmVh
dHVyZShmZWF0dXJlcywgImRpYWxvZ3dpZHRoIiwgMTAwLCBzY3JlZW5SZWN0LndpZHRoKCksIDYy
MCk7IC8vIGRlZmF1bHQgaGVyZSBjYW1lIGZyb20gZnJhbWUgc2l6ZSBvZiBkaWFsb2cgaW4gTWFj
SUUKLSAgICB3YXJncy53aWR0aFNldCA9IHRydWU7Ci0gICAgd2FyZ3MuaGVpZ2h0ID0gV2luZG93
RmVhdHVyZXM6OmZsb2F0RmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ2hlaWdodCIsIDEwMCwgc2Ny
ZWVuUmVjdC5oZWlnaHQoKSwgNDUwKTsgLy8gZGVmYXVsdCBoZXJlIGNhbWUgZnJvbSBmcmFtZSBz
aXplIG9mIGRpYWxvZyBpbiBNYWNJRQotICAgIHdhcmdzLmhlaWdodFNldCA9IHRydWU7Ci0KLSAg
ICB3YXJncy54ID0gV2luZG93RmVhdHVyZXM6OmZsb2F0RmVhdHVyZShmZWF0dXJlcywgImRpYWxv
Z2xlZnQiLCBzY3JlZW5SZWN0LngoKSwgc2NyZWVuUmVjdC5yaWdodCgpIC0gd2FyZ3Mud2lkdGgs
IC0xKTsKLSAgICB3YXJncy54U2V0ID0gd2FyZ3MueCA+IDA7Ci0gICAgd2FyZ3MueSA9IFdpbmRv
d0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2d0b3AiLCBzY3JlZW5SZWN0
LnkoKSwgc2NyZWVuUmVjdC5ib3R0b20oKSAtIHdhcmdzLmhlaWdodCwgLTEpOwotICAgIHdhcmdz
LnlTZXQgPSB3YXJncy55ID4gMDsKLQotICAgIGlmIChXaW5kb3dGZWF0dXJlczo6Ym9vbEZlYXR1
cmUoZmVhdHVyZXMsICJjZW50ZXIiLCB0cnVlKSkgewotICAgICAgICBpZiAoIXdhcmdzLnhTZXQp
IHsKLSAgICAgICAgICAgIHdhcmdzLnggPSBzY3JlZW5SZWN0LngoKSArIChzY3JlZW5SZWN0Lndp
ZHRoKCkgLSB3YXJncy53aWR0aCkgLyAyOwotICAgICAgICAgICAgd2FyZ3MueFNldCA9IHRydWU7
Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF3YXJncy55U2V0KSB7Ci0gICAgICAgICAgICB3YXJn
cy55ID0gc2NyZWVuUmVjdC55KCkgKyAoc2NyZWVuUmVjdC5oZWlnaHQoKSAtIHdhcmdzLmhlaWdo
dCkgLyAyOwotICAgICAgICAgICAgd2FyZ3MueVNldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICB3YXJncy5kaWFsb2cgPSB0cnVlOwotICAgIHdhcmdzLnJlc2l6YWJsZSA9IFdpbmRv
d0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgInJlc2l6YWJsZSIpOwotICAgIHdhcmdz
LnNjcm9sbGJhcnNWaXNpYmxlID0gV2luZG93RmVhdHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVz
LCAic2Nyb2xsIiwgdHJ1ZSk7Ci0gICAgd2FyZ3Muc3RhdHVzQmFyVmlzaWJsZSA9IFdpbmRvd0Zl
YXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgInN0YXR1cyIsICF0cnVzdGVkKTsKLSAgICB3
YXJncy5tZW51QmFyVmlzaWJsZSA9IGZhbHNlOwotICAgIHdhcmdzLnRvb2xCYXJWaXNpYmxlID0g
ZmFsc2U7Ci0gICAgd2FyZ3MubG9jYXRpb25CYXJWaXNpYmxlID0gZmFsc2U7Ci0gICAgd2FyZ3Mu
ZnVsbHNjcmVlbiA9IGZhbHNlOwotCi0gICAgRnJhbWUqIGRpYWxvZ0ZyYW1lID0gY3JlYXRlV2lu
ZG93KGV4ZWMsIGZyYW1lLCB1cmwsICIiLCB3YXJncywgZGlhbG9nQXJncyk7Ci0gICAgaWYgKCFk
aWFsb2dGcmFtZSkKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAgICBXaW5kb3cq
IGRpYWxvZ1dpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5kb3coZGlhbG9nRnJhbWUpOwotCi0g
ICAgLy8gR2V0IHRoZSByZXR1cm4gdmFsdWUgZWl0aGVyIGp1c3QgYmVmb3JlIGNsZWFyaW5nIHRo
ZSBkaWFsb2cgd2luZG93J3MKLSAgICAvLyBwcm9wZXJ0aWVzIChpbiBXaW5kb3c6OmNsZWFyKSwg
b3Igd2hlbiBvbiByZXR1cm4gZnJvbSBydW5Nb2RhbC4KLSAgICBKU1ZhbHVlKiByZXR1cm5WYWx1
ZSA9IDA7Ci0gICAgZGlhbG9nV2luZG93LT5zZXRSZXR1cm5WYWx1ZVNsb3QoJnJldHVyblZhbHVl
KTsKLSAgICBkaWFsb2dGcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+cnVuTW9kYWwoKTsKLSAgICBk
aWFsb2dXaW5kb3ctPnNldFJldHVyblZhbHVlU2xvdCgwKTsKLQotICAgIC8vIElmIHdlIGRvbid0
IGhhdmUgYSByZXR1cm4gdmFsdWUsIGdldCBpdCBub3cuCi0gICAgLy8gRWl0aGVyIFdpbmRvdzo6
Y2xlYXIgd2FzIG5vdCBjYWxsZWQgeWV0LCBvciB0aGVyZSB3YXMgbm8gcmV0dXJuIHZhbHVlLAot
ICAgIC8vIGFuZCBpbiB0aGF0IGNhc2UsIHRoZXJlJ3Mgbm8gaGFybSBpbiB0cnlpbmcgYWdhaW4g
KG5vIGJlbmVmaXQgZWl0aGVyKS4KLSAgICBpZiAoIXJldHVyblZhbHVlKQotICAgICAgICByZXR1
cm5WYWx1ZSA9IGRpYWxvZ1dpbmRvdy0+Z2V0RGlyZWN0KCJyZXR1cm5WYWx1ZSIpOwotCi0gICAg
cmV0dXJuIHJldHVyblZhbHVlID8gcmV0dXJuVmFsdWUgOiBqc1VuZGVmaW5lZCgpOwotfQotCi1K
U1ZhbHVlICpXaW5kb3c6OmdldFZhbHVlUHJvcGVydHkoRXhlY1N0YXRlICpleGVjLCBpbnQgdG9r
ZW4pIGNvbnN0Ci17Ci0gICBBU1NFUlQoaW1wbCgpLT5mcmFtZSgpKTsKLQotICAgc3dpdGNoICh0
b2tlbikgewotICAgY2FzZSBDcnlwdG86Ci0gICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsgLy8g
RklYTUU6IGltcGxlbWVudCB0aGlzCi0gICBjYXNlIERPTUV4Y2VwdGlvbjoKLSAgICAgIGlmICgh
YWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0g
ICAgICByZXR1cm4gZ2V0RE9NRXhjZXB0aW9uQ29uc3RydWN0b3IoZXhlYyk7Ci0gICAgY2FzZSBF
dmVudF86Ci0gICAgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOwotICAgICAgaWYgKCFkLT5tX2V2dCkKLSAgICAgICAgcmV0dXJuIGpz
VW5kZWZpbmVkKCk7Ci0gICAgICByZXR1cm4gdG9KUyhleGVjLCBkLT5tX2V2dCk7Ci0gICAgY2Fz
ZSBMb2NhdGlvbl86Ci0gICAgICByZXR1cm4gbG9jYXRpb24oKTsKLSAgICBjYXNlIE5hdmlnYXRv
cl86Ci0gICAgY2FzZSBDbGllbnRJbmZvcm1hdGlvbjogewotICAgICAgaWYgKCFhbGxvd3NBY2Nl
c3NGcm9tKGV4ZWMpKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLSAgICAgIC8vIFN0
b3JlIHRoZSBuYXZpZ2F0b3IgaW4gdGhlIG9iamVjdCBzbyB3ZSBnZXQgdGhlIHNhbWUgb25lIGVh
Y2ggdGltZS4KLSAgICAgIE5hdmlnYXRvciAqbiA9IG5ldyBOYXZpZ2F0b3IoZXhlYywgaW1wbCgp
LT5mcmFtZSgpKTsKLSAgICAgIC8vIEZJWE1FOiB0aGlzIHdpbGwgbWFrZSB0aGUgIm5hdmlnYXRv
ciIgb2JqZWN0IGFjY2Vzc2libGUgZnJvbSB3aW5kb3dzIHRoYXQgZmFpbAotICAgICAgLy8gdGhl
IHNlY3VyaXR5IGNoZWNrIHRoZSBmaXJzdCB0aW1lLCBidXQgbm90IHN1YnNlcXVlbnQgdGltZXMs
IHNlZW1zIHdlaXJkLgotICAgICAgY29uc3RfY2FzdDxXaW5kb3cgKj4odGhpcyktPnB1dERpcmVj
dCgibmF2aWdhdG9yIiwgbiwgRG9udERlbGV0ZXxSZWFkT25seSk7Ci0gICAgICBjb25zdF9jYXN0
PFdpbmRvdyAqPih0aGlzKS0+cHV0RGlyZWN0KCJjbGllbnRJbmZvcm1hdGlvbiIsIG4sIERvbnRE
ZWxldGV8UmVhZE9ubHkpOwotICAgICAgcmV0dXJuIG47Ci0gICAgfQotICAgIGNhc2UgSW1hZ2U6
Ci0gICAgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHJldHVybiBqc1Vu
ZGVmaW5lZCgpOwotICAgICAgLy8gRklYTUU6IHRoaXMgcHJvcGVydHkgKGFuZCB0aGUgZmV3IGJl
bG93KSBwcm9iYWJseSBzaG91bGRuJ3QgY3JlYXRlIGEgbmV3IG9iamVjdCBldmVyeQotICAgICAg
Ly8gdGltZQotICAgICAgcmV0dXJuIG5ldyBJbWFnZUNvbnN0cnVjdG9ySW1wKGV4ZWMsIGltcGwo
KS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKSk7Ci0gICAgY2FzZSBPcHRpb246Ci0gICAgICBpZiAoIWFs
bG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotICAg
ICAgcmV0dXJuIG5ldyBKU0hUTUxPcHRpb25FbGVtZW50Q29uc3RydWN0b3IoZXhlYywgaW1wbCgp
LT5mcmFtZSgpLT5kb2N1bWVudCgpKTsKLSAgICBjYXNlIFhNTEh0dHBSZXF1ZXN0OgotICAgICAg
aWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKLSAgICAgIHJldHVybiBuZXcgSlNYTUxIdHRwUmVxdWVzdENvbnN0cnVjdG9ySW1wKGV4ZWMs
IGltcGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKSk7Ci0gICAgY2FzZSBBdWRpbzoKLSNpZiBFTkFC
TEUoVklERU8pCi0gICAgICByZXR1cm4gbmV3IEpTSFRNTEF1ZGlvRWxlbWVudENvbnN0cnVjdG9y
KGV4ZWMsIGltcGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKSk7Ci0jZWxzZQotICAgICAgcmV0dXJu
IGpzVW5kZWZpbmVkKCk7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoWFNMVCkKLSAgICBjYXNlIFhTTFRQ
cm9jZXNzb3JfOgotICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBy
ZXR1cm4ganNVbmRlZmluZWQoKTsKLSAgICAgIHJldHVybiBuZXcgWFNMVFByb2Nlc3NvckNvbnN0
cnVjdG9ySW1wKGV4ZWMpOwotI2Vsc2UKLSAgICBjYXNlIFhTTFRQcm9jZXNzb3JfOgotICAgICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0jZW5kaWYKLSAgIH0KLQotICAgaWYgKCFhbGxvd3NBY2Nl
c3NGcm9tKGV4ZWMpKQotICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAgc3dpdGNoICh0
b2tlbikgewotICAgY2FzZSBPbmFib3J0OgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywg
YWJvcnRFdmVudCk7Ci0gICBjYXNlIE9uYmx1cjoKLSAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4
ZWMsIGJsdXJFdmVudCk7Ci0gICBjYXNlIE9uY2hhbmdlOgotICAgICByZXR1cm4gZ2V0TGlzdGVu
ZXIoZXhlYywgY2hhbmdlRXZlbnQpOwotICAgY2FzZSBPbmNsaWNrOgotICAgICByZXR1cm4gZ2V0
TGlzdGVuZXIoZXhlYywgY2xpY2tFdmVudCk7Ci0gICBjYXNlIE9uZGJsY2xpY2s6Ci0gICAgIHJl
dHVybiBnZXRMaXN0ZW5lcihleGVjLCBkYmxjbGlja0V2ZW50KTsKLSAgIGNhc2UgT25lcnJvcjoK
LSAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGVycm9yRXZlbnQpOwotICAgY2FzZSBPbmZv
Y3VzOgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgZm9jdXNFdmVudCk7Ci0gICBjYXNl
IE9ua2V5ZG93bjoKLSAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGtleWRvd25FdmVudCk7
Ci0gICBjYXNlIE9ua2V5cHJlc3M6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBrZXlw
cmVzc0V2ZW50KTsKLSAgIGNhc2UgT25rZXl1cDoKLSAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4
ZWMsIGtleXVwRXZlbnQpOwotICAgY2FzZSBPbmxvYWQ6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5l
cihleGVjLCBsb2FkRXZlbnQpOwotICAgY2FzZSBPbm1vdXNlZG93bjoKLSAgICAgcmV0dXJuIGdl
dExpc3RlbmVyKGV4ZWMsIG1vdXNlZG93bkV2ZW50KTsKLSAgIGNhc2UgT25tb3VzZW1vdmU6Ci0g
ICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZW1vdmVFdmVudCk7Ci0gICBjYXNlIE9u
bW91c2VvdXQ6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZW91dEV2ZW50KTsK
LSAgIGNhc2UgT25tb3VzZW92ZXI6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3Vz
ZW92ZXJFdmVudCk7Ci0gICBjYXNlIE9ubW91c2V1cDoKLSAgICAgcmV0dXJuIGdldExpc3RlbmVy
KGV4ZWMsIG1vdXNldXBFdmVudCk7Ci0gICBjYXNlIE9uV2luZG93TW91c2VXaGVlbDoKLSAgICAg
cmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIG1vdXNld2hlZWxFdmVudCk7Ci0gICBjYXNlIE9ucmVz
ZXQ6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCByZXNldEV2ZW50KTsKLSAgIGNhc2Ug
T25yZXNpemU6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLHJlc2l6ZUV2ZW50KTsKLSAg
IGNhc2UgT25zY3JvbGw6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLHNjcm9sbEV2ZW50
KTsKLSAgIGNhc2UgT25zZWFyY2g6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLHNlYXJj
aEV2ZW50KTsKLSAgIGNhc2UgT25zZWxlY3Q6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVj
LHNlbGVjdEV2ZW50KTsKLSAgIGNhc2UgT25zdWJtaXQ6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5l
cihleGVjLHN1Ym1pdEV2ZW50KTsKLSAgIGNhc2UgT25iZWZvcmV1bmxvYWQ6Ci0gICAgIHJldHVy
biBnZXRMaXN0ZW5lcihleGVjLCBiZWZvcmV1bmxvYWRFdmVudCk7Ci0gICBjYXNlIE9udW5sb2Fk
OgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgdW5sb2FkRXZlbnQpOwotICAgfQotICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICByZXR1cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNW
YWx1ZSogV2luZG93OjpjaGlsZEZyYW1lR2V0dGVyKEV4ZWNTdGF0ZSosIEpTT2JqZWN0KiwgY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCi17
Ci0gICAgcmV0dXJuIHJldHJpZXZlKHN0YXRpY19jYXN0PFdpbmRvdyo+KHNsb3Quc2xvdEJhc2Uo
KSktPmltcGwoKS0+ZnJhbWUoKS0+dHJlZSgpLT5jaGlsZChBdG9taWNTdHJpbmcocHJvcGVydHlO
YW1lKSkpOwotfQotCi1KU1ZhbHVlKiBXaW5kb3c6OmluZGV4R2V0dGVyKEV4ZWNTdGF0ZSosIEpT
T2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKLXsK
LSAgICByZXR1cm4gcmV0cmlldmUoc3RhdGljX2Nhc3Q8V2luZG93Kj4oc2xvdC5zbG90QmFzZSgp
KS0+aW1wbCgpLT5mcmFtZSgpLT50cmVlKCktPmNoaWxkKHNsb3QuaW5kZXgoKSkpOwotfQotCi1K
U1ZhbHVlICpXaW5kb3c6Om5hbWVkSXRlbUdldHRlcihFeGVjU3RhdGUgKmV4ZWMsIEpTT2JqZWN0
ICpvcmlnaW5hbE9iamVjdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQ
cm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gIFdpbmRvdyAqdGhpc09iaiA9IHN0YXRpY19jYXN0PFdp
bmRvdyAqPihzbG90LnNsb3RCYXNlKCkpOwotICBEb2N1bWVudCAqZG9jID0gdGhpc09iai0+aW1w
bCgpLT5mcmFtZSgpLT5kb2N1bWVudCgpOwotICBBU1NFUlQodGhpc09iai0+YWxsb3dzQWNjZXNz
RnJvbShleGVjKSAmJiBkb2MgJiYgZG9jLT5pc0hUTUxEb2N1bWVudCgpKTsKLQotICBTdHJpbmcg
bmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgUmVmUHRyPFdlYkNvcmU6OkhUTUxDb2xsZWN0aW9uPiBj
b2xsZWN0aW9uID0gZG9jLT53aW5kb3dOYW1lZEl0ZW1zKG5hbWUpOwotICBpZiAoY29sbGVjdGlv
bi0+bGVuZ3RoKCkgPT0gMSkKLSAgICByZXR1cm4gdG9KUyhleGVjLCBjb2xsZWN0aW9uLT5maXJz
dEl0ZW0oKSk7Ci0gIHJldHVybiB0b0pTKGV4ZWMsIGNvbGxlY3Rpb24uZ2V0KCkpOwotfQotCi1i
b29sIFdpbmRvdzo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSAqZXhlYywgY29uc3QgSWRl
bnRpZmllciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gIC8vIENoZWNr
IGZvciBjaGlsZCBmcmFtZXMgYnkgbmFtZSBiZWZvcmUgYnVpbHQtaW4gcHJvcGVydGllcyB0bwot
ICAvLyBtYXRjaCBNb3ppbGxhLiBUaGlzIGRvZXMgbm90IG1hdGNoIElFLCBidXQgc29tZSBzaXRl
cyBlbmQgdXAKLSAgLy8gbmFtaW5nIGZyYW1lcyB0aGluZ3MgdGhhdCBjb25mbGljdCB3aXRoIHdp
bmRvdyBwcm9wZXJ0aWVzIHRoYXQKLSAgLy8gYXJlIGluIE1veiBidXQgbm90IElFLiBTaW5jZSB3
ZSBoYXZlIHNvbWUgb2YgdGhlc2UsIHdlIGhhdmUgdG8gZG8KLSAgLy8gaXQgdGhlIE1veiB3YXku
Ci0gIGlmIChpbXBsKCktPmZyYW1lKCktPnRyZWUoKS0+Y2hpbGQocHJvcGVydHlOYW1lKSkgewot
ICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIGNoaWxkRnJhbWVHZXR0ZXIpOwotICAgIHJldHVybiB0
cnVlOwotICB9Ci0KLSAgY29uc3QgSGFzaEVudHJ5KiBlbnRyeSA9IExvb2t1cDo6ZmluZEVudHJ5
KCZXaW5kb3dUYWJsZSwgcHJvcGVydHlOYW1lKTsKLSAgaWYgKGVudHJ5KSB7Ci0gICAgaWYgKGVu
dHJ5LT5hdHRyICYgRnVuY3Rpb24pIHsKLSAgICAgIGlmIChlbnRyeS0+dmFsdWUuZnVuY3Rpb25W
YWx1ZSA9PSAmV2luZG93UHJvdG9GdW5jU2hvd01vZGFsRGlhbG9nOjpjcmVhdGUpIHsKLSAgICAg
ICAgaWYgKCFjYW5TaG93TW9kYWxEaWFsb2coaW1wbCgpLT5mcmFtZSgpKSkKLSAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkK
LSAgICAgICAgc2xvdC5zZXRTdGF0aWNFbnRyeSh0aGlzLCBlbnRyeSwgc3RhdGljRnVuY3Rpb25H
ZXR0ZXIpOwotICAgICAgZWxzZQotICAgICAgICBzbG90LnNldFVuZGVmaW5lZCh0aGlzKTsKLSAg
ICB9IGVsc2UKLSAgICAgIHNsb3Quc2V0U3RhdGljRW50cnkodGhpcywgZW50cnksIHN0YXRpY1Zh
bHVlR2V0dGVyPFdpbmRvdz4pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gRklYTUU6
IFNlYXJjaCB0aGUgd2hvbGUgZnJhbWUgaGllcmFjaHkgc29tZXdoZXJlIGFyb3VuZCBoZXJlLgot
ICAvLyBXZSBuZWVkIHRvIHRlc3QgdGhlIGNvcnJlY3QgcHJpb3JpdHkgb3JkZXIuCi0KLSAgLy8g
YWxsb3cgd2luZG93WzFdIG9yIHBhcmVudFsxXSBldGMuICgjNTY5ODMpCi0gIGJvb2wgb2s7Ci0g
IHVuc2lnbmVkIGkgPSBwcm9wZXJ0eU5hbWUudG9BcnJheUluZGV4KCZvayk7Ci0gIGlmIChvayAm
JiBpIDwgaW1wbCgpLT5mcmFtZSgpLT50cmVlKCktPmNoaWxkQ291bnQoKSkgewotICAgIHNsb3Qu
c2V0Q3VzdG9tSW5kZXgodGhpcywgaSwgaW5kZXhHZXR0ZXIpOwotICAgIHJldHVybiB0cnVlOwot
ICB9Ci0KLSAgLy8gYWxsb3cgc2hvcnRjdXRzIGxpa2UgJ0ltYWdlMScgaW5zdGVhZCBvZiBkb2N1
bWVudC5pbWFnZXMuSW1hZ2UxCi0gIERvY3VtZW50KiBkb2MgPSBpbXBsKCktPmZyYW1lKCktPmRv
Y3VtZW50KCk7Ci0gIGlmIChkb2MgJiYgZG9jLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0gICAgaWYg
KCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSB7Ci0gICAgICBzbG90LnNldFVuZGVmaW5lZCh0aGlz
KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEF0b21pY1N0cmluZyBhdG9taWNQ
cm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgaWYgKHN0YXRpY19jYXN0PEhUTUxEb2N1
bWVudCo+KGRvYyktPmhhc05hbWVkSXRlbShhdG9taWNQcm9wZXJ0eU5hbWUpIHx8IGRvYy0+Z2V0
RWxlbWVudEJ5SWQoYXRvbWljUHJvcGVydHlOYW1lKSkgewotICAgICAgc2xvdC5zZXRDdXN0b20o
dGhpcywgbmFtZWRJdGVtR2V0dGVyKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQot
Ci0gIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkgewotICAgIHNsb3Quc2V0VW5kZWZpbmVk
KHRoaXMpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIEpTT2JqZWN0OjpnZXRP
d25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KTsKLX0KLQotdm9pZCBXaW5k
b3c6OnB1dChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwg
SlNWYWx1ZSogdmFsdWUsIGludCBhdHRyKQotewotICBjb25zdCBIYXNoRW50cnkqIGVudHJ5ID0g
TG9va3VwOjpmaW5kRW50cnkoJldpbmRvd1RhYmxlLCBwcm9wZXJ0eU5hbWUpOwotICBpZiAoZW50
cnkpIHsKLSAgICAgaWYgKGVudHJ5LT5hdHRyICYgRnVuY3Rpb24pIHsKLSAgICAgICBpZiAoYWxs
b3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgIEpTT2JqZWN0OjpwdXQoZXhlYywgcHJvcGVy
dHlOYW1lLCB2YWx1ZSwgYXR0cik7Ci0gICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZW50
cnktPmF0dHIgJiBSZWFkT25seSkKLSAgICAgIHJldHVybjsKLQotICAgIHN3aXRjaCAoZW50cnkt
PnZhbHVlLmludFZhbHVlKSB7Ci0gICAgY2FzZSBMb2NhdGlvbl86IHsKLSAgICAgIEZyYW1lKiBw
ID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOwotICAgICAg
aWYgKHApIHsKLSAgICAgICAgaWYgKCFwLT5sb2FkZXIoKS0+c2hvdWxkQWxsb3dOYXZpZ2F0aW9u
KGltcGwoKS0+ZnJhbWUoKSkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBTdHJpbmcgZHN0
VXJsID0gcC0+bG9hZGVyKCktPmNvbXBsZXRlVVJMKHZhbHVlLT50b1N0cmluZyhleGVjKSkuc3Ry
aW5nKCk7Ci0gICAgICAgIGlmICghZHN0VXJsLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFs
c2UpIHx8IGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpIHsKLSAgICAgICAgICBib29sIHVzZXJHZXN0
dXJlID0gcC0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCk7Ci0gICAgICAg
ICAgLy8gV2Ugd2FudCBhIG5ldyBoaXN0b3J5IGl0ZW0gaWYgdGhpcyBKUyB3YXMgY2FsbGVkIHZp
YSBhIHVzZXIgZ2VzdHVyZQotICAgICAgICAgIGltcGwoKS0+ZnJhbWUoKS0+bG9hZGVyKCktPnNj
aGVkdWxlTG9jYXRpb25DaGFuZ2UoZHN0VXJsLCBwLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJl
cigpLCBmYWxzZSwgdXNlckdlc3R1cmUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1
cm47Ci0gICAgfQotICAgIGNhc2UgT25hYm9ydDoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9t
KGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLCBhYm9ydEV2ZW50LHZhbHVlKTsKLSAg
ICAgIHJldHVybjsKLSAgICBjYXNlIE9uYmx1cjoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9t
KGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLCBibHVyRXZlbnQsdmFsdWUpOwotICAg
ICAgcmV0dXJuOwotICAgIGNhc2UgT25jaGFuZ2U6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgY2hhbmdlRXZlbnQsdmFsdWUpOwot
ICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25jbGljazoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NG
cm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLGNsaWNrRXZlbnQsdmFsdWUpOwot
ICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25kYmxjbGljazoKLSAgICAgIGlmIChhbGxvd3NBY2Nl
c3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLCBkYmxjbGlja0V2ZW50LHZh
bHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uZXJyb3I6Ci0gICAgICBpZiAoYWxsb3dz
QWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgZXJyb3JFdmVudCwg
dmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25mb2N1czoKLSAgICAgIGlmIChhbGxv
d3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLGZvY3VzRXZlbnQs
dmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25rZXlkb3duOgotICAgICAgaWYgKGFs
bG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsa2V5ZG93bkV2
ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9ua2V5cHJlc3M6Ci0gICAgICBp
ZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxrZXlw
cmVzc0V2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9ua2V5dXA6Ci0gICAg
ICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxr
ZXl1cEV2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9ubG9hZDoKLSAgICAg
IGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLGxv
YWRFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBPbm1vdXNlZG93bjoKLSAg
ICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVj
LG1vdXNlZG93bkV2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9ubW91c2Vt
b3ZlOgotICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3Rl
bmVyKGV4ZWMsbW91c2Vtb3ZlRXZlbnQsdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2Ug
T25tb3VzZW91dDoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBz
ZXRMaXN0ZW5lcihleGVjLG1vdXNlb3V0RXZlbnQsdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAg
IGNhc2UgT25tb3VzZW92ZXI6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAg
ICAgICAgc2V0TGlzdGVuZXIoZXhlYyxtb3VzZW92ZXJFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1
cm47Ci0gICAgY2FzZSBPbm1vdXNldXA6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVj
KSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxtb3VzZXVwRXZlbnQsdmFsdWUpOwotICAgICAg
cmV0dXJuOwotICAgIGNhc2UgT25XaW5kb3dNb3VzZVdoZWVsOgotICAgICAgaWYgKGFsbG93c0Fj
Y2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsIG1vdXNld2hlZWxFdmVu
dCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBPbnJlc2V0OgotICAgICAgaWYgKGFs
bG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMscmVzZXRFdmVu
dCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBPbnJlc2l6ZToKLSAgICAgIGlmIChh
bGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLHJlc2l6ZUV2
ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uc2Nyb2xsOgotICAgICAgaWYg
KGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsc2Nyb2xs
RXZlbnQsdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25zZWFyY2g6Ci0gICAgICAg
IGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICAgICAgc2V0TGlzdGVuZXIoZXhl
YyxzZWFyY2hFdmVudCx2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uc2VsZWN0
OgotICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVy
KGV4ZWMsc2VsZWN0RXZlbnQsdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25zdWJt
aXQ6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVu
ZXIoZXhlYyxzdWJtaXRFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBPbmJl
Zm9yZXVubG9hZDoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBz
ZXRMaXN0ZW5lcihleGVjLCBiZWZvcmV1bmxvYWRFdmVudCwgdmFsdWUpOwotICAgICAgcmV0dXJu
OwotICAgIGNhc2UgT251bmxvYWQ6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkK
LSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgdW5sb2FkRXZlbnQsIHZhbHVlKTsKLSAgICAgIHJl
dHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChhbGxv
d3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgIEpTT2JqZWN0OjpwdXQoZXhlYywgcHJvcGVydHlOYW1l
LCB2YWx1ZSwgYXR0cik7Ci19Ci0KLWJvb2wgV2luZG93OjphbGxvd3NBY2Nlc3NGcm9tKGNvbnN0
IEpTR2xvYmFsT2JqZWN0KiBvdGhlcikgY29uc3QKLXsKLSAgICBjb25zdCBGcmFtZSogb3JpZ2lu
RnJhbWUgPSBzdGF0aWNfY2FzdDxjb25zdCBXaW5kb3cqPihvdGhlciktPmltcGwoKS0+ZnJhbWUo
KTsKLSAgICBpZiAoIW9yaWdpbkZyYW1lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBj
b25zdCBGcmFtZSogdGFyZ2V0RnJhbWUgPSBpbXBsKCktPmZyYW1lKCk7Ci0gICAgaWYgKCF0YXJn
ZXRGcmFtZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG9yaWdpbkZyYW1lID09
IHRhcmdldEZyYW1lKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFdlYkNvcmU6OkRvY3Vt
ZW50KiB0YXJnZXREb2N1bWVudCA9IHRhcmdldEZyYW1lLT5kb2N1bWVudCgpOwotCi0gICAgLy8g
SlMgbWF5IGJlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSAid2luZG93IiBvYmplY3QsIHdoaWNo
IHNob3VsZCBiZSB2YWxpZCwKLSAgICAvLyBldmVuIGlmIHRoZSBkb2N1bWVudCBoYXNuJ3QgYmVl
biBjb25zdHJ1Y3RlZCB5ZXQuICBJZiB0aGUgZG9jdW1lbnQgZG9lc24ndAotICAgIC8vIGV4aXN0
IHlldCBhbGxvdyBKUyB0byBhY2Nlc3MgdGhlIHdpbmRvdyBvYmplY3QuCi0gICAgaWYgKCF0YXJn
ZXREb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBXZWJDb3JlOjpEb2N1bWVu
dCogb3JpZ2luRG9jdW1lbnQgPSBvcmlnaW5GcmFtZS0+ZG9jdW1lbnQoKTsKLQotICAgIGNvbnN0
IFNlY3VyaXR5T3JpZ2luJiBvcmlnaW5TZWN1cml0eU9yaWdpbiA9IG9yaWdpbkRvY3VtZW50LT5z
ZWN1cml0eU9yaWdpbigpOwotICAgIGNvbnN0IFNlY3VyaXR5T3JpZ2luJiB0YXJnZXRTZWN1cml0
eU9yaWdpbiA9IHRhcmdldERvY3VtZW50LT5zZWN1cml0eU9yaWdpbigpOwotCi0gICAgaWYgKG9y
aWdpblNlY3VyaXR5T3JpZ2luLmNhbkFjY2Vzcyh0YXJnZXRTZWN1cml0eU9yaWdpbikpCi0gICAg
ICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKCF0YXJnZXRGcmFtZS0+c2V0dGluZ3MoKS0+cHJp
dmF0ZUJyb3dzaW5nRW5hYmxlZCgpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiB0aGlzIGVycm9yIG1l
c3NhZ2Ugc2hvdWxkIGNvbnRhaW4gbW9yZSBzcGVjaWZpY3Mgb2Ygd2h5IHRoZSBzYW1lIG9yaWdp
biBjaGVjayBoYXMgZmFpbGVkLgotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZzo6Zm9y
bWF0KCJVbnNhZmUgSmF2YVNjcmlwdCBhdHRlbXB0IHRvIGFjY2VzcyBmcmFtZSB3aXRoIFVSTCAl
cyBmcm9tIGZyYW1lIHdpdGggVVJMICVzLiBEb21haW5zLCBwcm90b2NvbHMgYW5kIHBvcnRzIG11
c3QgbWF0Y2guXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRh
cmdldERvY3VtZW50LT51cmwoKS51dGY4KCkuZGF0YSgpLCBvcmlnaW5Eb2N1bWVudC0+dXJsKCku
dXRmOCgpLmRhdGEoKSk7Ci0KLSAgICAgICAgaWYgKEludGVycHJldGVyOjpzaG91bGRQcmludEV4
Y2VwdGlvbnMoKSkKLSAgICAgICAgICAgIHByaW50ZigiJXMiLCBtZXNzYWdlLnV0ZjgoKS5kYXRh
KCkpOwotCi0gICAgICAgIGlmIChQYWdlKiBwYWdlID0gdGFyZ2V0RnJhbWUtPnBhZ2UoKSkKLSAg
ICAgICAgICAgIHBhZ2UtPmNocm9tZSgpLT5hZGRNZXNzYWdlVG9Db25zb2xlKEpTTWVzc2FnZVNv
dXJjZSwgRXJyb3JNZXNzYWdlTGV2ZWwsIG1lc3NhZ2UsIDEsIFN0cmluZygpKTsgLy8gRklYTUU6
IHByb3ZpZGUgYSByZWFsIGxpbmUgbnVtYmVyIGFuZCBzb3VyY2UgVVJMLgotICAgIH0KLQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotRXhlY1N0YXRlKiBXaW5kb3c6Omdsb2JhbEV4ZWMoKQotewot
ICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYW55IHNjcmlwdCBleGVjdXRpb24gaGFw
cGVuaW5nIGluIHRoaXMKLSAgICAvLyBmcmFtZSBkb2VzIG5vdCBkZXN0cm95IGl0Ci0gICAgQVNT
RVJUKGltcGwoKS0+ZnJhbWUoKSk7Ci0gICAgaW1wbCgpLT5mcmFtZSgpLT5rZWVwQWxpdmUoKTsK
LSAgICByZXR1cm4gSlNHbG9iYWxPYmplY3Q6Omdsb2JhbEV4ZWMoKTsKLX0KLQotYm9vbCBXaW5k
b3c6OnNob3VsZEludGVycnVwdFNjcmlwdCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGltcGwoKS0+
ZnJhbWUoKSk7Ci0gICAgUGFnZSogcGFnZSA9IGltcGwoKS0+ZnJhbWUoKS0+cGFnZSgpOwotCi0g
ICAgLy8gU2VlIDxyZGFyOi8vcHJvYmxlbS81NDc5NDQzPi4gV2UgZG9uJ3QgdGhpbmsgdGhhdCBw
YWdlIGNhbiBldmVyIGJlIE5VTEwKLSAgICAvLyBpbiB0aGlzIGNhc2UsIGJ1dCBpZiBpdCBpcywg
d2UndmUgZ290dGVuIGludG8gYSBzdGF0ZSB3aGVyZSB3ZSBtYXkgaGF2ZQotICAgIC8vIGh1bmcg
dGhlIFVJLCB3aXRoIG5vIHdheSB0byBhc2sgdGhlIGNsaWVudCB3aGV0aGVyIHRvIGNhbmNlbCBl
eGVjdXRpb24uCi0gICAgLy8gRm9yIG5vdywgb3VyIHNvbHV0aW9uIGlzIGp1c3QgdG8gY2FuY2Vs
IGV4ZWN1dGlvbiBubyBtYXR0ZXIgd2hhdCwKLSAgICAvLyBlbnN1cmluZyB0aGF0IHdlIG5ldmVy
IGhhbmcuIFdlIG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgb3RoZXIgc29sdXRpb25zCi0gICAgLy8g
aWYgd2UgZGlzY292ZXIgcHJvYmxlbXMgd2l0aCB0aGlzIG9uZS4KLSAgICBBU1NFUlQocGFnZSk7
Ci0gICAgaWYgKCFwYWdlKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBwYWdl
LT5jaHJvbWUoKS0+c2hvdWxkSW50ZXJydXB0SmF2YVNjcmlwdCgpOwotfQotCi12b2lkIFdpbmRv
dzo6c2V0TGlzdGVuZXIoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50
VHlwZSwgSlNWYWx1ZSogZnVuYykKLXsKLSAgICBBU1NFUlQoaW1wbCgpLT5mcmFtZSgpKTsKLSAg
ICBEb2N1bWVudCogZG9jID0gaW1wbCgpLT5mcmFtZSgpLT5kb2N1bWVudCgpOwotICAgIGlmICgh
ZG9jKQotICAgICAgICByZXR1cm47Ci0KLSAgICBkb2MtPnNldEhUTUxXaW5kb3dFdmVudExpc3Rl
bmVyKGV2ZW50VHlwZSwgZmluZE9yQ3JlYXRlSlNFdmVudExpc3RlbmVyKGZ1bmMsIHRydWUpKTsK
LX0KLQotSlNWYWx1ZSogV2luZG93OjpnZXRMaXN0ZW5lcihFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0
IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlKSBjb25zdAotewotICAgIEFTU0VSVChpbXBsKCktPmZy
YW1lKCkpOwotICAgIERvY3VtZW50KiBkb2MgPSBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCk7
Ci0gICAgaWYgKCFkb2MpCi0gICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgV2Vi
Q29yZTo6RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBkb2MtPmdldEhUTUxXaW5kb3dFdmVudExp
c3RlbmVyKGV2ZW50VHlwZSk7Ci0gICAgaWYgKGxpc3RlbmVyICYmIHN0YXRpY19jYXN0PEpTRXZl
bnRMaXN0ZW5lcio+KGxpc3RlbmVyKS0+bGlzdGVuZXJPYmooKSkKLSAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PEpTRXZlbnRMaXN0ZW5lcio+KGxpc3RlbmVyKS0+bGlzdGVuZXJPYmooKTsKLSAg
ICByZXR1cm4ganNOdWxsKCk7Ci19Ci0KLUpTRXZlbnRMaXN0ZW5lciogV2luZG93OjpmaW5kSlNF
dmVudExpc3RlbmVyKEpTVmFsdWUqIHZhbCwgYm9vbCBodG1sKQotewotICAgIGlmICghdmFsLT5p
c09iamVjdCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBKU09iamVjdCogb2JqZWN0ID0gc3Rh
dGljX2Nhc3Q8SlNPYmplY3QqPih2YWwpOwotICAgIExpc3RlbmVyc01hcCYgbGlzdGVuZXJzID0g
aHRtbCA/IGQtPmpzSFRNTEV2ZW50TGlzdGVuZXJzIDogZC0+anNFdmVudExpc3RlbmVyczsKLSAg
ICByZXR1cm4gbGlzdGVuZXJzLmdldChvYmplY3QpOwotfQotCi1KU0V2ZW50TGlzdGVuZXIqIFdp
bmRvdzo6ZmluZE9yQ3JlYXRlSlNFdmVudExpc3RlbmVyKEpTVmFsdWUqIHZhbCwgYm9vbCBodG1s
KQotewotICAgIEpTRXZlbnRMaXN0ZW5lciogbGlzdGVuZXIgPSBmaW5kSlNFdmVudExpc3RlbmVy
KHZhbCwgaHRtbCk7Ci0gICAgaWYgKGxpc3RlbmVyKQotICAgICAgICByZXR1cm4gbGlzdGVuZXI7
Ci0KLSAgICBpZiAoIXZhbC0+aXNPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgSlNP
YmplY3QqIG9iamVjdCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odmFsKTsKLQotICAgIC8vIE5v
dGUgdGhhdCB0aGUgSlNFdmVudExpc3RlbmVyIGNvbnN0cnVjdG9yIGFkZHMgaXQgdG8gb3VyIGpz
RXZlbnRMaXN0ZW5lcnMgbGlzdAotICAgIHJldHVybiBuZXcgSlNFdmVudExpc3RlbmVyKG9iamVj
dCwgdGhpcywgaHRtbCk7Ci19Ci0KLUpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyKiBXaW5kb3c6
OmZpbmRKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiB2YWwsIGJvb2wgaHRtbCkK
LXsKLSAgICBpZiAoIXZhbC0+aXNPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgSlNP
YmplY3QqIG9iamVjdCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odmFsKTsKLSAgICBVbnByb3Rl
Y3RlZExpc3RlbmVyc01hcCYgbGlzdGVuZXJzID0gaHRtbCA/IGQtPmpzVW5wcm90ZWN0ZWRIVE1M
RXZlbnRMaXN0ZW5lcnMgOiBkLT5qc1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcnM7Ci0gICAgcmV0
dXJuIGxpc3RlbmVycy5nZXQob2JqZWN0KTsKLX0KLQotSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVu
ZXIqIFdpbmRvdzo6ZmluZE9yQ3JlYXRlSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIoSlNWYWx1
ZSogdmFsLCBib29sIGh0bWwpCi17Ci0gICAgSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIqIGxp
c3RlbmVyID0gZmluZEpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyKHZhbCwgaHRtbCk7Ci0gICAg
aWYgKGxpc3RlbmVyKQotICAgICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgaWYgKCF2YWwtPmlz
T2JqZWN0KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIEpTT2JqZWN0KiBvYmplY3QgPSBzdGF0
aWNfY2FzdDxKU09iamVjdCo+KHZhbCk7Ci0KLSAgICAvLyBUaGUgSlNVbnByb3RlY3RlZEV2ZW50
TGlzdGVuZXIgY29uc3RydWN0b3IgYWRkcyBpdCB0byBvdXIganNVbnByb3RlY3RlZEV2ZW50TGlz
dGVuZXJzIG1hcC4KLSAgICByZXR1cm4gbmV3IEpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyKG9i
amVjdCwgdGhpcywgaHRtbCk7Ci19Ci0KLXZvaWQgV2luZG93OjpjbGVhckhlbHBlck9iamVjdFBy
b3BlcnRpZXMoKQotewotICAgIGQtPmxvYyA9IDA7Ci0gICAgZC0+bV9ldnQgPSAwOwotfQotCi12
b2lkIFdpbmRvdzo6Y2xlYXIoKQotewotICBKU0xvY2sgbG9jazsKLQotICBpZiAoZC0+bV9yZXR1
cm5WYWx1ZVNsb3QgJiYgISpkLT5tX3JldHVyblZhbHVlU2xvdCkKLSAgICAqZC0+bV9yZXR1cm5W
YWx1ZVNsb3QgPSBnZXREaXJlY3QoInJldHVyblZhbHVlIik7Ci0KLSAgY2xlYXJBbGxUaW1lb3V0
cygpOwotICBjbGVhclByb3BlcnRpZXMoKTsKLSAgY2xlYXJIZWxwZXJPYmplY3RQcm9wZXJ0aWVz
KCk7Ci0KLSAgLy8gTm93IHJlY3JlYXRlIGEgd29ya2luZyBnbG9iYWwgb2JqZWN0IGZvciB0aGUg
bmV4dCBVUkwgdGhhdCB3aWxsIHVzZSB1czsgYnV0IG9ubHkgaWYgd2UgaGF2ZW4ndCBiZWVuCi0g
IC8vIGRpc2Nvbm5lY3RlZCB5ZXQKLSAgaWYgKEZyYW1lKiBmcmFtZSA9IGltcGwoKS0+ZnJhbWUo
KSkKLSAgICBmcmFtZS0+c2NyaXB0UHJveHkoKS0+Z2xvYmFsT2JqZWN0KCktPnJlc2V0KEpTRE9N
V2luZG93UHJvdG90eXBlOjpzZWxmKCkpOwotCi0gIC8vIHRoZXJlJ3MgbGlrZWx5IHRvIGJlIGxv
dHMgb2YgZ2FyYmFnZSBub3cKLSAgZ2NDb250cm9sbGVyKCkuZ2FyYmFnZUNvbGxlY3RTb29uKCk7
Ci19Ci0KLXZvaWQgV2luZG93OjpzZXRDdXJyZW50RXZlbnQoRXZlbnQqIGV2dCkKLXsKLSAgICBk
LT5tX2V2dCA9IGV2dDsKLX0KLQotRXZlbnQqIFdpbmRvdzo6Y3VycmVudEV2ZW50KCkKLXsKLSAg
ICByZXR1cm4gZC0+bV9ldnQ7Ci19Ci0KLUpTVmFsdWUqIFdpbmRvd1Byb3RvRnVuY0FUb0I6OmNh
bGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmosIGNvbnN0IExp
c3QmIGFyZ3MpCi17Ci0gICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmV2luZG93OjppbmZvKSkK
LSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKKyNpbmNsdWRlICJQ
YXVzZWRUaW1lb3V0cy5oIgogCi0gICAgaWYgKGFyZ3Muc2l6ZSgpIDwgMSkKLSAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3IsICJOb3QgZW5vdWdoIGFyZ3VtZW50cyIp
OwotCi0gICAgSlNWYWx1ZSogdiA9IGFyZ3NbMF07Ci0gICAgaWYgKHYtPmlzTnVsbCgpKQotICAg
ICAgICByZXR1cm4ganNTdHJpbmcoKTsKLQotICAgIFVTdHJpbmcgcyA9IHYtPnRvU3RyaW5nKGV4
ZWMpOwotICAgIGlmICghcy5pczhCaXQoKSkgewotICAgICAgICBzZXRET01FeGNlcHRpb24oZXhl
YywgSU5WQUxJRF9DSEFSQUNURVJfRVJSKTsKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7
Ci0gICAgfQotCi0gICAgVmVjdG9yPGNoYXI+IGluKHMuc2l6ZSgpKTsKLSAgICBmb3IgKGludCBp
ID0gMDsgaSA8IHMuc2l6ZSgpOyArK2kpCi0gICAgICAgIGluW2ldID0gc3RhdGljX2Nhc3Q8Y2hh
cj4ocy5kYXRhKClbaV0udW5pY29kZSgpKTsKLSAgICBWZWN0b3I8Y2hhcj4gb3V0OwotCi0gICAg
aWYgKCFiYXNlNjREZWNvZGUoaW4sIG91dCkpCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4
ZWMsIEdlbmVyYWxFcnJvciwgIkNhbm5vdCBkZWNvZGUgYmFzZTY0Iik7Ci0KLSAgICByZXR1cm4g
anNTdHJpbmcoU3RyaW5nKG91dC5kYXRhKCksIG91dC5zaXplKCkpKTsKLX0KLQotSlNWYWx1ZSog
V2luZG93UHJvdG9GdW5jQlRvQTo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09i
amVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKLXsKLSAgICBpZiAoIXRoaXNPYmotPmlu
aGVyaXRzKCZXaW5kb3c6OmluZm8pKQotICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBU
eXBlRXJyb3IpOwotCi0gICAgaWYgKGFyZ3Muc2l6ZSgpIDwgMSkKLSAgICAgICAgcmV0dXJuIHRo
cm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3IsICJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpOwotCi0g
ICAgSlNWYWx1ZSogdiA9IGFyZ3NbMF07Ci0gICAgaWYgKHYtPmlzTnVsbCgpKQotICAgICAgICBy
ZXR1cm4ganNTdHJpbmcoKTsKLQotICAgIFVTdHJpbmcgcyA9IHYtPnRvU3RyaW5nKGV4ZWMpOwot
ICAgIGlmICghcy5pczhCaXQoKSkgewotICAgICAgICBzZXRET01FeGNlcHRpb24oZXhlYywgSU5W
QUxJRF9DSEFSQUNURVJfRVJSKTsKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0gICAg
fQotCi0gICAgVmVjdG9yPGNoYXI+IGluKHMuc2l6ZSgpKTsKLSAgICBmb3IgKGludCBpID0gMDsg
aSA8IHMuc2l6ZSgpOyArK2kpCi0gICAgICAgIGluW2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4ocy5k
YXRhKClbaV0udW5pY29kZSgpKTsKLSAgICBWZWN0b3I8Y2hhcj4gb3V0OwotCi0gICAgYmFzZTY0
RW5jb2RlKGluLCBvdXQpOwotCi0gICAgcmV0dXJuIGpzU3RyaW5nKFN0cmluZyhvdXQuZGF0YSgp
LCBvdXQuc2l6ZSgpKSk7Ci19Ci0KLUpTVmFsdWUqIFdpbmRvd1Byb3RvRnVuY09wZW46OmNhbGxB
c0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmosIGNvbnN0IExpc3Qm
IGFyZ3MpCi17Ci0gICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmV2luZG93OjppbmZvKSkKLSAg
ICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBXaW5kb3cqIHdp
bmRvdyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmopOwotICAgIEZyYW1lKiBmcmFtZSA9
IHdpbmRvdy0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOwotICAgIEZyYW1lKiBhY3RpdmVGcmFtZSA9IFdpbmRvdzo6cmV0cmll
dmVBY3RpdmUoZXhlYyktPmltcGwoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIWFjdGl2ZUZyYW1lKQot
ICAgICAgICByZXR1cm4gIGpzVW5kZWZpbmVkKCk7Ci0KLSAgICBQYWdlKiBwYWdlID0gZnJhbWUt
PnBhZ2UoKTsKLQotICAgIFN0cmluZyB1cmxTdHJpbmcgPSB2YWx1ZVRvU3RyaW5nV2l0aFVuZGVm
aW5lZE9yTnVsbENoZWNrKGV4ZWMsIGFyZ3NbMF0pOwotICAgIEF0b21pY1N0cmluZyBmcmFtZU5h
bWUgPSBhcmdzWzFdLT5pc1VuZGVmaW5lZE9yTnVsbCgpID8gIl9ibGFuayIgOiBBdG9taWNTdHJp
bmcoYXJnc1sxXS0+dG9TdHJpbmcoZXhlYykpOwotCi0gICAgLy8gQmVjYXVzZSBGcmFtZVRyZWU6
OmZpbmQoKSByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZ3MsIHdlIG11c3QgY2hlY2sgZm9y
IGVtcHR5IGZyYW1lbmFtZXMuCi0gICAgLy8gT3RoZXJ3aXNlLCBpbGxlZ2l0aW1hdGUgd2luZG93
Lm9wZW4oKSBjYWxscyB3aXRoIG5vIG5hbWUgd2lsbCBwYXNzIHJpZ2h0IHRocm91Z2ggdGhlIHBv
cHVwIGJsb2NrZXIuCi0gICAgaWYgKCFhbGxvd1BvcFVwKGZyYW1lKSAmJiAoZnJhbWVOYW1lLmlz
RW1wdHkoKSB8fCAhZnJhbWUtPnRyZWUoKS0+ZmluZChmcmFtZU5hbWUpKSkKLSAgICAgICAgcmV0
dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAgICAvLyBHZXQgdGhlIHRhcmdldCBmcmFtZSBmb3IgdGhl
IHNwZWNpYWwgY2FzZXMgb2YgX3RvcCBhbmQgX3BhcmVudC4gIEluIHRob3NlCi0gICAgLy8gY2Fz
ZXMsIHdlIGNhbiBzY2hlZHVsZSBhIGxvY2F0aW9uIGNoYW5nZSByaWdodCBub3cgYW5kIHJldHVy
biBlYXJseS4KLSAgICBib29sIHRvcE9yUGFyZW50ID0gZmFsc2U7Ci0gICAgaWYgKGZyYW1lTmFt
ZSA9PSAiX3RvcCIpIHsKLSAgICAgICAgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50b3AoKTsKLSAg
ICAgICAgdG9wT3JQYXJlbnQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoZnJhbWVOYW1lID09ICJf
cGFyZW50IikgewotICAgICAgICBpZiAoRnJhbWUqIHBhcmVudCA9IGZyYW1lLT50cmVlKCktPnBh
cmVudCgpKQotICAgICAgICAgICAgZnJhbWUgPSBwYXJlbnQ7Ci0gICAgICAgIGlmICghYWN0aXZl
RnJhbWUtPmxvYWRlcigpLT5zaG91bGRBbGxvd05hdmlnYXRpb24oZnJhbWUpKQotICAgICAgICAg
ICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0gICAgICAgIHRvcE9yUGFyZW50ID0gdHJ1ZTsKLSAg
ICB9Ci0gICAgaWYgKHRvcE9yUGFyZW50KSB7Ci0gICAgICAgIFN0cmluZyBjb21wbGV0ZWRVUkw7
Ci0gICAgICAgIGlmICghdXJsU3RyaW5nLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGNvbXBsZXRl
ZFVSTCA9IGFjdGl2ZUZyYW1lLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmxTdHJpbmcpOwot
Ci0gICAgICAgIGNvbnN0IFdpbmRvdyogdGFyZ2V0ZWRXaW5kb3cgPSBXaW5kb3c6OnJldHJpZXZl
V2luZG93KGZyYW1lKTsKLSAgICAgICAgaWYgKCFjb21wbGV0ZWRVUkwuaXNFbXB0eSgpICYmICgh
Y29tcGxldGVkVVJMLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8ICh0YXJnZXRl
ZFdpbmRvdyAmJiB0YXJnZXRlZFdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkpKSB7Ci0g
ICAgICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCkt
PnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpOwotICAgICAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5z
Y2hlZHVsZUxvY2F0aW9uQ2hhbmdlKGNvbXBsZXRlZFVSTCwgYWN0aXZlRnJhbWUtPmxvYWRlcigp
LT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2VyR2VzdHVyZSk7Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIFdpbmRvdzo6cmV0cmlldmUoZnJhbWUpOwotICAgIH0KLQotICAgIC8vIElu
IHRoZSBjYXNlIG9mIGEgbmFtZWQgZnJhbWUgb3IgYSBuZXcgd2luZG93LCB3ZSdsbCB1c2UgdGhl
IGNyZWF0ZVdpbmRvdygpIGhlbHBlcgotICAgIFdpbmRvd0ZlYXR1cmVzIHdpbmRvd0ZlYXR1cmVz
KHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JOdWxsQ2hlY2soZXhlYywgYXJnc1syXSkpOwot
ICAgIEZsb2F0UmVjdCB3aW5kb3dSZWN0KHdpbmRvd0ZlYXR1cmVzLngsIHdpbmRvd0ZlYXR1cmVz
LnksIHdpbmRvd0ZlYXR1cmVzLndpZHRoLCB3aW5kb3dGZWF0dXJlcy5oZWlnaHQpOwotICAgIFdl
YkNvcmU6OkRPTVdpbmRvdzo6YWRqdXN0V2luZG93UmVjdChzY3JlZW5BdmFpbGFibGVSZWN0KHBh
Z2UtPm1haW5GcmFtZSgpLT52aWV3KCkpLCB3aW5kb3dSZWN0LCB3aW5kb3dSZWN0KTsKLQotICAg
IHdpbmRvd0ZlYXR1cmVzLnggPSB3aW5kb3dSZWN0LngoKTsKLSAgICB3aW5kb3dGZWF0dXJlcy55
ID0gd2luZG93UmVjdC55KCk7Ci0gICAgd2luZG93RmVhdHVyZXMuaGVpZ2h0ID0gd2luZG93UmVj
dC5oZWlnaHQoKTsKLSAgICB3aW5kb3dGZWF0dXJlcy53aWR0aCA9IHdpbmRvd1JlY3Qud2lkdGgo
KTsKLQotICAgIGZyYW1lID0gY3JlYXRlV2luZG93KGV4ZWMsIGZyYW1lLCB1cmxTdHJpbmcsIGZy
YW1lTmFtZSwgd2luZG93RmVhdHVyZXMsIDApOwotCi0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAgICByZXR1cm4gV2luZG93OjpyZXRyaWV2ZShmcmFt
ZSk7IC8vIGdsb2JhbCBvYmplY3QKLX0KLQotSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jU2V0VGlt
ZW91dDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwg
Y29uc3QgTGlzdCYgYXJncykKLXsKLSAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6
OmluZm8pKQotICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOwotICAg
IFdpbmRvdyogd2luZG93ID0gc3RhdGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7Ci0KLSAgICBK
U1ZhbHVlKiB2ID0gYXJnc1swXTsKLSAgICBpZiAodi0+aXNTdHJpbmcoKSkKLSAgICAgICAgcmV0
dXJuIGpzTnVtYmVyKHdpbmRvdy0+aW5zdGFsbFRpbWVvdXQodi0+dG9TdHJpbmcoZXhlYyksIGFy
Z3NbMV0tPnRvSW50MzIoZXhlYyksIHRydWUgLypzaW5nbGUgc2hvdCovKSk7Ci0gICAgaWYgKHYt
PmlzT2JqZWN0KCkgJiYgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih2KS0+aW1wbGVtZW50c0NhbGwo
KSkgewotICAgICAgICBMaXN0IGFyZ3NUYWlsOwotICAgICAgICBhcmdzLmdldFNsaWNlKDIsIGFy
Z3NUYWlsKTsKLSAgICAgICAgcmV0dXJuIGpzTnVtYmVyKHdpbmRvdy0+aW5zdGFsbFRpbWVvdXQo
diwgYXJnc1RhaWwsIGFyZ3NbMV0tPnRvSW50MzIoZXhlYyksIHRydWUgLypzaW5nbGUgc2hvdCov
KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUqIFdp
bmRvd1Byb3RvRnVuY0NsZWFyVGltZW91dDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVj
LCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKLXsKLSAgICAvLyBBbHNvIHRo
ZSBpbXBsZW1lbnRhdGlvbiBmb3Igd2luZG93LmNsZWFySW50ZXJ2YWwoKQotCi0gICAgaWYgKCF0
aGlzT2JqLT5pbmhlcml0cygmV2luZG93OjppbmZvKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJy
b3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBXaW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdp
bmRvdyo+KHRoaXNPYmopOwotCi0gICAgd2luZG93LT5jbGVhclRpbWVvdXQoYXJnc1swXS0+dG9J
bnQzMihleGVjKSk7Ci0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUqIFdp
bmRvd1Byb3RvRnVuY1NldEludGVydmFsOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMs
IEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewotICAgIGlmICghdGhpc09i
ai0+aW5oZXJpdHMoJldpbmRvdzo6aW5mbykpCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4
ZWMsIFR5cGVFcnJvcik7Ci0gICAgV2luZG93KiB3aW5kb3cgPSBzdGF0aWNfY2FzdDxXaW5kb3cq
Pih0aGlzT2JqKTsKLQotICAgIGlmIChhcmdzLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgIEpTVmFs
dWUqIHYgPSBhcmdzWzBdOwotICAgICAgICBpbnQgZGVsYXkgPSBhcmdzWzFdLT50b0ludDMyKGV4
ZWMpOwotICAgICAgICBpZiAodi0+aXNTdHJpbmcoKSkKLSAgICAgICAgICAgIHJldHVybiBqc051
bWJlcih3aW5kb3ctPmluc3RhbGxUaW1lb3V0KHYtPnRvU3RyaW5nKGV4ZWMpLCBkZWxheSwgZmFs
c2UpKTsKLSAgICAgICAgaWYgKHYtPmlzT2JqZWN0KCkgJiYgc3RhdGljX2Nhc3Q8SlNPYmplY3Qq
Pih2KS0+aW1wbGVtZW50c0NhbGwoKSkgewotICAgICAgICAgICAgTGlzdCBhcmdzVGFpbDsKLSAg
ICAgICAgICAgIGFyZ3MuZ2V0U2xpY2UoMiwgYXJnc1RhaWwpOwotICAgICAgICAgICAgcmV0dXJu
IGpzTnVtYmVyKHdpbmRvdy0+aW5zdGFsbFRpbWVvdXQodiwgYXJnc1RhaWwsIGRlbGF5LCBmYWxz
ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLX0K
LQotSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jQWRkRXZlbnRMaXN0ZW5lcjo6Y2FsbEFzRnVuY3Rp
b24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykK
LXsKLSAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQotICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOwotICAgIFdpbmRvdyogd2luZG93ID0g
c3RhdGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7Ci0gICAgRnJhbWUqIGZyYW1lID0gd2luZG93
LT5pbXBsKCktPmZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Ci0KLSAgICBpZiAoSlNFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IHdpbmRvdy0+
ZmluZE9yQ3JlYXRlSlNFdmVudExpc3RlbmVyKGFyZ3NbMV0pKSB7Ci0gICAgICAgIGlmIChEb2N1
bWVudCogZG9jID0gZnJhbWUtPmRvY3VtZW50KCkpCi0gICAgICAgICAgICBkb2MtPmFkZFdpbmRv
d0V2ZW50TGlzdGVuZXIoQXRvbWljU3RyaW5nKGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpKSwgbGlz
dGVuZXIsIGFyZ3NbMl0tPnRvQm9vbGVhbihleGVjKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGpz
VW5kZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUqIFdpbmRvd1Byb3RvRnVuY1JlbW92ZUV2ZW50TGlz
dGVuZXI6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmos
IGNvbnN0IExpc3QmIGFyZ3MpCi17Ci0gICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmV2luZG93
OjppbmZvKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAg
ICBXaW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmopOwotICAgIEZy
YW1lKiBmcmFtZSA9IHdpbmRvdy0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0g
ICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgaWYgKEpTRXZlbnRMaXN0ZW5lciog
bGlzdGVuZXIgPSB3aW5kb3ctPmZpbmRKU0V2ZW50TGlzdGVuZXIoYXJnc1sxXSkpIHsKLSAgICAg
ICAgaWYgKERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGRv
Yy0+cmVtb3ZlV2luZG93RXZlbnRMaXN0ZW5lcihBdG9taWNTdHJpbmcoYXJnc1swXS0+dG9TdHJp
bmcoZXhlYykpLCBsaXN0ZW5lciwgYXJnc1syXS0+dG9Cb29sZWFuKGV4ZWMpKTsKLSAgICB9Ci0K
LSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSogV2luZG93UHJvdG9GdW5j
U2hvd01vZGFsRGlhbG9nOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0
KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewotICAgIGlmICghdGhpc09iai0+aW5oZXJp
dHMoJldpbmRvdzo6aW5mbykpCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVF
cnJvcik7Ci0gICAgV2luZG93KiB3aW5kb3cgPSBzdGF0aWNfY2FzdDxXaW5kb3cqPih0aGlzT2Jq
KTsKLSAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3ctPmltcGwoKS0+ZnJhbWUoKTsKLSAgICBpZiAo
IWZyYW1lKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAgIHJldHVybiBzaG93
TW9kYWxEaWFsb2coZXhlYywgZnJhbWUsIHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JOdWxs
Q2hlY2soZXhlYywgYXJnc1swXSksIGFyZ3NbMV0sIHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVk
T3JOdWxsQ2hlY2soZXhlYywgYXJnc1syXSkpOwotfQotCi1KU1ZhbHVlKiBXaW5kb3dQcm90b0Z1
bmNOb3RJbXBsZW1lbnRlZDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVj
dCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKLXsKLSAgICBpZiAoIXRoaXNPYmotPmluaGVy
aXRzKCZXaW5kb3c6OmluZm8pKQotICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBl
RXJyb3IpOwotCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci19Ci0KLXZvaWQgV2luZG93Ojpz
ZXRSZXR1cm5WYWx1ZVNsb3QoSlNWYWx1ZSoqIHNsb3QpCi17Ci0gICAgZC0+bV9yZXR1cm5WYWx1
ZVNsb3QgPSBzbG90OwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFNjaGVkdWxlZEFjdGlv
biAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBTY2hlZHVsZWRBY3Rpb246OmV4ZWN1
dGUoV2luZG93KiB3aW5kb3cpCi17Ci0gICAgUmVmUHRyPEZyYW1lPiBmcmFtZSA9IHdpbmRvdy0+
aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybjsKLQotICAg
IEtKU1Byb3h5KiBzY3JpcHRQcm94eSA9IGZyYW1lLT5zY3JpcHRQcm94eSgpOwotICAgIGlmICgh
c2NyaXB0UHJveHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFdpbmRvdyogZ2xvYmFsT2JqZWN0
ID0gc2NyaXB0UHJveHktPmdsb2JhbE9iamVjdCgpOwotCi0gICAgc2NyaXB0UHJveHktPnNldFBy
b2Nlc3NpbmdUaW1lckNhbGxiYWNrKHRydWUpOwotCi0gICAgaWYgKEpTVmFsdWUqIGZ1bmMgPSBt
X2Z1bmMuZ2V0KCkpIHsKLSAgICAgICAgSlNMb2NrIGxvY2s7Ci0gICAgICAgIGlmIChmdW5jLT5p
c09iamVjdCgpICYmIHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oZnVuYyktPmltcGxlbWVudHNDYWxs
KCkpIHsKLSAgICAgICAgICAgIEV4ZWNTdGF0ZSogZXhlYyA9IHdpbmRvdy0+Z2xvYmFsRXhlYygp
OwotICAgICAgICAgICAgQVNTRVJUKHdpbmRvdyA9PSBnbG9iYWxPYmplY3QpOwotCi0gICAgICAg
ICAgICBMaXN0IGFyZ3M7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1fYXJncy5zaXplKCk7
Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAg
ICAgICAgICAgIGFyZ3MuYXBwZW5kKG1fYXJnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIGdsb2JhbE9iamVjdC0+c3RhcnRUaW1lb3V0Q2hlY2soKTsKLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PEpTT2JqZWN0Kj4oZnVuYyktPmNhbGwoZXhlYywgd2luZG93LCBhcmdzKTsKLSAg
ICAgICAgICAgIGdsb2JhbE9iamVjdC0+c3RvcFRpbWVvdXRDaGVjaygpOwotICAgICAgICAgICAg
aWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgSlNPYmplY3QqIGV4
Y2VwdGlvbiA9IGV4ZWMtPmV4Y2VwdGlvbigpLT50b09iamVjdChleGVjKTsKLSAgICAgICAgICAg
ICAgICBleGVjLT5jbGVhckV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNz
YWdlID0gZXhjZXB0aW9uLT5nZXQoZXhlYywgZXhlYy0+cHJvcGVydHlOYW1lcygpLm1lc3NhZ2Up
LT50b1N0cmluZyhleGVjKTsKLSAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IGV4Y2Vw
dGlvbi0+Z2V0KGV4ZWMsICJsaW5lIiktPnRvSW50MzIoZXhlYyk7Ci0gICAgICAgICAgICAgICAg
aWYgKEludGVycHJldGVyOjpzaG91bGRQcmludEV4Y2VwdGlvbnMoKSkKLSAgICAgICAgICAgICAg
ICAgICAgcHJpbnRmKCIodGltZXIpOiVzXG4iLCBtZXNzYWdlLnV0ZjgoKS5kYXRhKCkpOwotICAg
ICAgICAgICAgICAgIGlmIChQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKSkKLSAgICAgICAgICAg
ICAgICAgICAgcGFnZS0+Y2hyb21lKCktPmFkZE1lc3NhZ2VUb0NvbnNvbGUoSlNNZXNzYWdlU291
cmNlLCBFcnJvck1lc3NhZ2VMZXZlbCwgbWVzc2FnZSwgbGluZU51bWJlciwgU3RyaW5nKCkpOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIGZyYW1lLT5sb2Fk
ZXIoKS0+ZXhlY3V0ZVNjcmlwdChtX2NvZGUpOwotCi0gICAgLy8gVXBkYXRlIG91ciBkb2N1bWVu
dCdzIHJlbmRlcmluZyBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGltZW91dCBjYWxs
YmFjay4KLSAgICAvLyBGSVhNRTogV2h5IG5vdCB1c2UgdXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5n
IHRvIHVwZGF0ZSByZW5kZXJpbmcgb2YgYWxsIGRvY3VtZW50cz8KLSAgICAvLyBGSVhNRTogSXMg
dGhpcyByZWFsbHkgdGhlIHJpZ2h0IHBvaW50IHRvIGRvIHRoZSB1cGRhdGU/IFdlIG5lZWQgYSBw
bGFjZSB0aGF0IHdvcmtzCi0gICAgLy8gZm9yIGFsbCBwb3NzaWJsZSBlbnRyeSBwb2ludHMgdGhh
dCBtaWdodCBwb3NzaWJseSBleGVjdXRlIHNjcmlwdCwgYnV0IHRoaXMgc2VlbXMKLSAgICAvLyB0
byBiZSBhIGJpdCB0b28gbG93LWxldmVsLgotICAgIGlmIChEb2N1bWVudCogZG9jID0gZnJhbWUt
PmRvY3VtZW50KCkpCi0gICAgICAgIGRvYy0+dXBkYXRlUmVuZGVyaW5nKCk7Ci0KLSAgICBzY3Jp
cHRQcm94eS0+c2V0UHJvY2Vzc2luZ1RpbWVyQ2FsbGJhY2soZmFsc2UpOwotfQotCi0vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vIHRpbWVvdXRzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi12b2lk
IFdpbmRvdzo6Y2xlYXJBbGxUaW1lb3V0cygpCi17Ci0gICAgZGVsZXRlQWxsVmFsdWVzKGQtPm1f
dGltZW91dHMpOwotICAgIGQtPm1fdGltZW91dHMuY2xlYXIoKTsKLX0KLQotaW50IFdpbmRvdzo6
aW5zdGFsbFRpbWVvdXQoU2NoZWR1bGVkQWN0aW9uKiBhLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90
KQotewotICAgIGludCB0aW1lb3V0SWQgPSArK2xhc3RVc2VkVGltZW91dElkOwotCi0gICAgLy8g
YXZvaWQgd3JhcGFyb3VuZCBnb2luZyBuZWdhdGl2ZSBvbiB1cwotICAgIGlmICh0aW1lb3V0SWQg
PD0gMCkKLSAgICAgICAgdGltZW91dElkID0gMTsKLQotICAgIGludCBuZXN0TGV2ZWwgPSB0aW1l
ck5lc3RpbmdMZXZlbCArIDE7Ci0gICAgRE9NV2luZG93VGltZXIqIHRpbWVyID0gbmV3IERPTVdp
bmRvd1RpbWVyKHRpbWVvdXRJZCwgbmVzdExldmVsLCB0aGlzLCBhKTsKLSAgICBBU1NFUlQoIWQt
Pm1fdGltZW91dHMuZ2V0KHRpbWVvdXRJZCkpOwotICAgIGQtPm1fdGltZW91dHMuc2V0KHRpbWVv
dXRJZCwgdGltZXIpOwotICAgIC8vIFVzZSBhIG1pbmltdW0gaW50ZXJ2YWwgb2YgMTAgbXMgdG8g
bWF0Y2ggb3RoZXIgYnJvd3NlcnMsIGJ1dCBvbmx5IG9uY2Ugd2UndmUKLSAgICAvLyBuZXN0ZWQg
ZW5vdWdoIHRvIG5vdGljZSB0aGF0IHdlJ3JlIHJlcGVhdGluZy4KLSAgICAvLyBGYXN0ZXIgdGlt
ZXJzIG1pZ2h0IGJlICJiZXR0ZXIiLCBidXQgdGhleSdyZSBpbmNvbXBhdGlibGUuCi0gICAgZG91
YmxlIGludGVydmFsID0gbWF4KDAuMDAxLCB0ICogMC4wMDEpOwotICAgIGlmIChpbnRlcnZhbCA8
IGNNaW5pbXVtVGltZXJJbnRlcnZhbCAmJiBuZXN0TGV2ZWwgPj0gY01heFRpbWVyTmVzdGluZ0xl
dmVsKQotICAgICAgICBpbnRlcnZhbCA9IGNNaW5pbXVtVGltZXJJbnRlcnZhbDsKLSAgICBpZiAo
c2luZ2xlU2hvdCkKLSAgICAgICAgdGltZXItPnN0YXJ0T25lU2hvdChpbnRlcnZhbCk7Ci0gICAg
ZWxzZQotICAgICAgICB0aW1lci0+c3RhcnRSZXBlYXRpbmcoaW50ZXJ2YWwpOwotICAgIHJldHVy
biB0aW1lb3V0SWQ7Ci19Ci0KLVNjaGVkdWxlZEFjdGlvbjo6U2NoZWR1bGVkQWN0aW9uKEpTVmFs
dWUqIGZ1bmMsIGNvbnN0IExpc3QmIGFyZ3MpCi0gICAgOiBtX2Z1bmMoZnVuYykKLXsKLSAgICBM
aXN0Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBhcmdzLmVuZCgpOwotICAgIGZvciAoTGlzdDo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBhcmdzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAg
bV9hcmdzLmFwcGVuZCgqaXQpOwotfQotCi1pbnQgV2luZG93OjppbnN0YWxsVGltZW91dChjb25z
dCBVU3RyaW5nJiBoYW5kbGVyLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90KQotewotICAgIHJldHVy
biBpbnN0YWxsVGltZW91dChuZXcgU2NoZWR1bGVkQWN0aW9uKGhhbmRsZXIpLCB0LCBzaW5nbGVT
aG90KTsKLX0KLQotaW50IFdpbmRvdzo6aW5zdGFsbFRpbWVvdXQoSlNWYWx1ZSogZnVuYywgY29u
c3QgTGlzdCYgYXJncywgaW50IHQsIGJvb2wgc2luZ2xlU2hvdCkKLXsKLSAgICByZXR1cm4gaW5z
dGFsbFRpbWVvdXQobmV3IFNjaGVkdWxlZEFjdGlvbihmdW5jLCBhcmdzKSwgdCwgc2luZ2xlU2hv
dCk7Ci19Ci0KLVBhdXNlZFRpbWVvdXRzKiBXaW5kb3c6OnBhdXNlVGltZW91dHMoKQotewotICAg
IHNpemVfdCBjb3VudCA9IGQtPm1fdGltZW91dHMuc2l6ZSgpOwotICAgIGlmIChjb3VudCA9PSAw
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFBhdXNlZFRpbWVvdXQqIHQgPSBuZXcgUGF1c2Vk
VGltZW91dCBbY291bnRdOwotICAgIFBhdXNlZFRpbWVvdXRzKiByZXN1bHQgPSBuZXcgUGF1c2Vk
VGltZW91dHModCwgY291bnQpOwotCi0gICAgV2luZG93UHJpdmF0ZTo6VGltZW91dHNNYXA6Oml0
ZXJhdG9yIGl0ID0gZC0+bV90aW1lb3V0cy5iZWdpbigpOwotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpICE9IGNvdW50OyArK2ksICsraXQpIHsKLSAgICAgICAgaW50IHRpbWVvdXRJZCA9IGl0LT5m
aXJzdDsKLSAgICAgICAgRE9NV2luZG93VGltZXIqIHRpbWVyID0gaXQtPnNlY29uZDsKLSAgICAg
ICAgdFtpXS50aW1lb3V0SWQgPSB0aW1lb3V0SWQ7Ci0gICAgICAgIHRbaV0ubmVzdGluZ0xldmVs
ID0gdGltZXItPm5lc3RpbmdMZXZlbCgpOwotICAgICAgICB0W2ldLm5leHRGaXJlSW50ZXJ2YWwg
PSB0aW1lci0+bmV4dEZpcmVJbnRlcnZhbCgpOwotICAgICAgICB0W2ldLnJlcGVhdEludGVydmFs
ID0gdGltZXItPnJlcGVhdEludGVydmFsKCk7Ci0gICAgICAgIHRbaV0uYWN0aW9uID0gdGltZXIt
PnRha2VBY3Rpb24oKTsKLSAgICB9Ci0gICAgQVNTRVJUKGl0ID09IGQtPm1fdGltZW91dHMuZW5k
KCkpOwotCi0gICAgZGVsZXRlQWxsVmFsdWVzKGQtPm1fdGltZW91dHMpOwotICAgIGQtPm1fdGlt
ZW91dHMuY2xlYXIoKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgV2luZG93Ojpy
ZXN1bWVUaW1lb3V0cyhQYXVzZWRUaW1lb3V0cyogdGltZW91dHMpCi17Ci0gICAgaWYgKCF0aW1l
b3V0cykKLSAgICAgICAgcmV0dXJuOwotICAgIHNpemVfdCBjb3VudCA9IHRpbWVvdXRzLT5udW1U
aW1lb3V0cygpOwotICAgIFBhdXNlZFRpbWVvdXQqIGFycmF5ID0gdGltZW91dHMtPnRha2VUaW1l
b3V0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50OyArK2kpIHsKLSAgICAg
ICAgaW50IHRpbWVvdXRJZCA9IGFycmF5W2ldLnRpbWVvdXRJZDsKLSAgICAgICAgRE9NV2luZG93
VGltZXIqIHRpbWVyID0gbmV3IERPTVdpbmRvd1RpbWVyKHRpbWVvdXRJZCwgYXJyYXlbaV0ubmVz
dGluZ0xldmVsLCB0aGlzLCBhcnJheVtpXS5hY3Rpb24pOwotICAgICAgICBkLT5tX3RpbWVvdXRz
LnNldCh0aW1lb3V0SWQsIHRpbWVyKTsKLSAgICAgICAgdGltZXItPnN0YXJ0KGFycmF5W2ldLm5l
eHRGaXJlSW50ZXJ2YWwsIGFycmF5W2ldLnJlcGVhdEludGVydmFsKTsKLSAgICB9Ci0gICAgZGVs
ZXRlIFtdIGFycmF5OwotfQotCi12b2lkIFdpbmRvdzo6Y2xlYXJUaW1lb3V0KGludCB0aW1lb3V0
SWQsIGJvb2wgZGVsQWN0aW9uKQotewotICAgIC8vIHRpbWVvdXQgSURzIGhhdmUgdG8gYmUgcG9z
aXRpdmUsIGFuZCAwIGFuZCAtMSBhcmUgdW5zYWZlIHRvCi0gICAgLy8gZXZlbiBsb29rIHVwIHNp
bmNlIHRoZXkgYXJlIHRoZSBlbXB0eSBhbmQgZGVsZXRlZCB2YWx1ZQotICAgIC8vIHJlc3BlY3Rp
dmVseQotICAgIGlmICh0aW1lb3V0SWQgPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZGVs
ZXRlIGQtPm1fdGltZW91dHMudGFrZSh0aW1lb3V0SWQpOwotfQotCi12b2lkIFdpbmRvdzo6dGlt
ZXJGaXJlZChET01XaW5kb3dUaW1lciogdGltZXIpCi17Ci0gICAgLy8gU2ltcGxlIGNhc2UgZm9y
IG5vbi1vbmUtc2hvdCB0aW1lcnMuCi0gICAgaWYgKHRpbWVyLT5pc0FjdGl2ZSgpKSB7Ci0gICAg
ICAgIGludCB0aW1lb3V0SWQgPSB0aW1lci0+dGltZW91dElkKCk7Ci0KLSAgICAgICAgdGltZXIt
PmFjdGlvbigpLT5leGVjdXRlKHRoaXMpOwotICAgICAgICBpZiAoZC0+bV90aW1lb3V0cy5jb250
YWlucyh0aW1lb3V0SWQpICYmIHRpbWVyLT5yZXBlYXRJbnRlcnZhbCgpICYmIHRpbWVyLT5yZXBl
YXRJbnRlcnZhbCgpIDwgY01pbmltdW1UaW1lckludGVydmFsKSB7Ci0gICAgICAgICAgICB0aW1l
ci0+c2V0TmVzdGluZ0xldmVsKHRpbWVyLT5uZXN0aW5nTGV2ZWwoKSArIDEpOwotICAgICAgICAg
ICAgaWYgKHRpbWVyLT5uZXN0aW5nTGV2ZWwoKSA+PSBjTWF4VGltZXJOZXN0aW5nTGV2ZWwpCi0g
ICAgICAgICAgICAgICAgdGltZXItPmF1Z21lbnRSZXBlYXRJbnRlcnZhbChjTWluaW11bVRpbWVy
SW50ZXJ2YWwgLSB0aW1lci0+cmVwZWF0SW50ZXJ2YWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIC8vIERlbGV0ZSB0aW1lciBiZWZvcmUgZXhlY3V0aW5nIHRo
ZSBhY3Rpb24gZm9yIG9uZS1zaG90IHRpbWVycy4KLSAgICBTY2hlZHVsZWRBY3Rpb24qIGFjdGlv
biA9IHRpbWVyLT50YWtlQWN0aW9uKCk7Ci0gICAgZC0+bV90aW1lb3V0cy5yZW1vdmUodGltZXIt
PnRpbWVvdXRJZCgpKTsKLSAgICBkZWxldGUgdGltZXI7Ci0gICAgYWN0aW9uLT5leGVjdXRlKHRo
aXMpOwotCi0gICAgSlNMb2NrIGxvY2s7Ci0gICAgZGVsZXRlIGFjdGlvbjsKLX0KLQotdm9pZCBX
aW5kb3c6OmRpc2Nvbm5lY3RGcmFtZSgpCi17Ci0gICAgY2xlYXJBbGxUaW1lb3V0cygpOwotICAg
IGlmIChkLT5sb2MpCi0gICAgICAgIGQtPmxvYy0+bV9mcmFtZSA9IDA7Ci19Ci0KLVdpbmRvdzo6
TGlzdGVuZXJzTWFwJiBXaW5kb3c6OmpzRXZlbnRMaXN0ZW5lcnMoKQotewotICAgIHJldHVybiBk
LT5qc0V2ZW50TGlzdGVuZXJzOwotfQotCi1XaW5kb3c6Okxpc3RlbmVyc01hcCYgV2luZG93Ojpq
c0hUTUxFdmVudExpc3RlbmVycygpCi17Ci0gICAgcmV0dXJuIGQtPmpzSFRNTEV2ZW50TGlzdGVu
ZXJzOwotfQotCi1XaW5kb3c6OlVucHJvdGVjdGVkTGlzdGVuZXJzTWFwJiBXaW5kb3c6OmpzVW5w
cm90ZWN0ZWRFdmVudExpc3RlbmVycygpCi17Ci0gICAgcmV0dXJuIGQtPmpzVW5wcm90ZWN0ZWRF
dmVudExpc3RlbmVyczsKLX0KLQotV2luZG93OjpVbnByb3RlY3RlZExpc3RlbmVyc01hcCYgV2lu
ZG93Ojpqc1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzKCkKLXsKLSAgICByZXR1cm4gZC0+
anNVbnByb3RlY3RlZEhUTUxFdmVudExpc3RlbmVyczsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLyBMb2NhdGlvbiBPYmplY3QgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWNvbnN0IENs
YXNzSW5mbyBMb2NhdGlvbjo6aW5mbyA9IHsgIkxvY2F0aW9uIiwgMCwgJkxvY2F0aW9uVGFibGUg
fTsKLS8qCi1AYmVnaW4gTG9jYXRpb25UYWJsZSAxMgotICBhc3NpZ24gICAgICAgICZMb2NhdGlv
blByb3RvRnVuY0Fzc2lnbjo6Y3JlYXRlICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDEKLSAg
aGFzaCAgICAgICAgICBMb2NhdGlvbjo6SGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgRG9u
dERlbGV0ZQotICBob3N0ICAgICAgICAgIExvY2F0aW9uOjpIb3N0ICAgICAgICAgICAgICAgICAg
ICAgICAgICBEb250RGVsZXRlCi0gIGhvc3RuYW1lICAgICAgTG9jYXRpb246Okhvc3RuYW1lICAg
ICAgICAgICAgICAgICAgICAgIERvbnREZWxldGUKLSAgaHJlZiAgICAgICAgICBMb2NhdGlvbjo6
SHJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgRG9udERlbGV0ZQotICBwYXRobmFtZSAgICAg
IExvY2F0aW9uOjpQYXRobmFtZSAgICAgICAgICAgICAgICAgICAgICBEb250RGVsZXRlCi0gIHBv
cnQgICAgICAgICAgTG9jYXRpb246OlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIERvbnRE
ZWxldGUKLSAgcHJvdG9jb2wgICAgICBMb2NhdGlvbjo6UHJvdG9jb2wgICAgICAgICAgICAgICAg
ICAgICAgRG9udERlbGV0ZQotICBzZWFyY2ggICAgICAgIExvY2F0aW9uOjpTZWFyY2ggICAgICAg
ICAgICAgICAgICAgICAgICBEb250RGVsZXRlCi0gIHRvU3RyaW5nICAgICAgJkxvY2F0aW9uUHJv
dG9GdW5jVG9TdHJpbmc6OmNyZWF0ZSAgICAgIERvbnRFbnVtfERvbnREZWxldGV8RnVuY3Rpb24g
MAotICByZXBsYWNlICAgICAgICZMb2NhdGlvblByb3RvRnVuY1JlcGxhY2U6OmNyZWF0ZSAgICAg
ICBEb250RGVsZXRlfEZ1bmN0aW9uIDEKLSAgcmVsb2FkICAgICAgICAmTG9jYXRpb25Qcm90b0Z1
bmNSZWxvYWQ6OmNyZWF0ZSAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAwCi1AZW5kCi0qLwot
Ci1Mb2NhdGlvbjo6TG9jYXRpb24oRnJhbWUqIGZyYW1lKQotICAgIDogbV9mcmFtZShmcmFtZSkK
LXsKLX0KLQotSlNWYWx1ZSAqTG9jYXRpb246OmdldFZhbHVlUHJvcGVydHkoRXhlY1N0YXRlKiBl
eGVjLCBpbnQgdG9rZW4pIGNvbnN0Ci17Ci0gIEtVUkwgdXJsID0gbV9mcmFtZS0+bG9hZGVyKCkt
PnVybCgpOwotICBzd2l0Y2ggKHRva2VuKSB7Ci0gIGNhc2UgSGFzaDoKLSAgICByZXR1cm4ganNT
dHJpbmcodXJsLnJlZigpLmlzTnVsbCgpID8gIiIgOiAiIyIgKyB1cmwucmVmKCkpOwotICBjYXNl
IEhvc3Q6IHsKLSAgICAvLyBOb3RlOiB0aGlzIGlzIHRoZSBJRSBzcGVjLiBUaGUgTlMgc3BlYyBz
d2FwcyB0aGUgdHdvLCBpdCBzYXlzCi0gICAgLy8gIlRoZSBob3N0bmFtZSBwcm9wZXJ0eSBpcyB0
aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaG9zdCBhbmQgcG9ydCBwcm9wZXJ0aWVzLCBzZXBhcmF0
ZWQgYnkgYSBjb2xvbi4iCi0gICAgLy8gQmxlaC4KLSAgICBVU3RyaW5nIHN0ciA9IHVybC5ob3N0
KCk7Ci0gICAgaWYgKHVybC5wb3J0KCkpCi0gICAgICAgIHN0ciArPSAiOiIgKyBTdHJpbmc6Om51
bWJlcigoaW50KXVybC5wb3J0KCkpOwotICAgIHJldHVybiBqc1N0cmluZyhzdHIpOwotICB9Ci0g
IGNhc2UgSG9zdG5hbWU6Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHVybC5ob3N0KCkpOwotICBjYXNl
IEhyZWY6Ci0gICAgaWYgKCF1cmwuaGFzUGF0aCgpKQotICAgICAgcmV0dXJuIGpzU3RyaW5nKHVy
bC5wcmV0dHlVUkwoKSArICIvIik7Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcmV0dHlVUkwo
KSk7Ci0gIGNhc2UgUGF0aG5hbWU6Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wYXRoKCkuaXNF
bXB0eSgpID8gIi8iIDogdXJsLnBhdGgoKSk7Ci0gIGNhc2UgUG9ydDoKLSAgICByZXR1cm4ganNT
dHJpbmcodXJsLnBvcnQoKSA/IFN0cmluZzo6bnVtYmVyKChpbnQpdXJsLnBvcnQoKSkgOiAiIik7
Ci0gIGNhc2UgUHJvdG9jb2w6Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcm90b2NvbCgpICsg
IjoiKTsKLSAgY2FzZSBTZWFyY2g6Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHVybC5xdWVyeSgpKTsK
LSAgZGVmYXVsdDoKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4ganNVbmRl
ZmluZWQoKTsKLSAgfQotfQotCi1ib29sIExvY2F0aW9uOjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xv
dCYgc2xvdCkKLXsKLSAgaWYgKCFtX2ZyYW1lKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25z
dCBXaW5kb3cqIHdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5kb3cobV9mcmFtZSk7Ci0KLSAg
Y29uc3QgSGFzaEVudHJ5KiBlbnRyeSA9IExvb2t1cDo6ZmluZEVudHJ5KCZMb2NhdGlvblRhYmxl
LCBwcm9wZXJ0eU5hbWUpOwotICBpZiAoIWVudHJ5IHx8ICEoZW50cnktPmF0dHIgJiBLSlM6OkZ1
bmN0aW9uKSB8fCAoZW50cnktPnZhbHVlLmZ1bmN0aW9uVmFsdWUgIT0gJkxvY2F0aW9uUHJvdG9G
dW5jUmVwbGFjZTo6Y3JlYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAmJiBlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9jYXRpb25Q
cm90b0Z1bmNSZWxvYWQ6OmNyZWF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJiYgZW50cnktPnZhbHVlLmZ1bmN0aW9uVmFsdWUgIT0gJkxvY2F0
aW9uUHJvdG9GdW5jQXNzaWduOjpjcmVhdGUpKSAgewotICAgIGlmICghd2luZG93IHx8ICF3aW5k
b3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpIHsKLSAgICAgIHNsb3Quc2V0VW5kZWZpbmVkKHRo
aXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGdldFN0YXRp
Y1Byb3BlcnR5U2xvdDxMb2NhdGlvbiwgSlNPYmplY3Q+KGV4ZWMsICZMb2NhdGlvblRhYmxlLCB0
aGlzLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOwotfQotCi12b2lkIExvY2F0aW9uOjpwdXQoRXhlY1N0
YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVl
LCBpbnQgYXR0cikKLXsKLSAgaWYgKCFtX2ZyYW1lKQotICAgIHJldHVybjsKLQotICBEZXByZWNh
dGVkU3RyaW5nIHN0ciA9IHZhbHVlLT50b1N0cmluZyhleGVjKTsKLSAgS1VSTCB1cmwgPSBtX2Zy
YW1lLT5sb2FkZXIoKS0+dXJsKCk7Ci0gIGNvbnN0IFdpbmRvdyogd2luZG93ID0gV2luZG93Ojpy
ZXRyaWV2ZVdpbmRvdyhtX2ZyYW1lKTsKLSAgYm9vbCBzYW1lRG9tYWluQWNjZXNzID0gd2luZG93
ICYmIHdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKTsKLQotICBjb25zdCBIYXNoRW50cnkq
IGVudHJ5ID0gTG9va3VwOjpmaW5kRW50cnkoJkxvY2F0aW9uVGFibGUsIHByb3BlcnR5TmFtZSk7
Ci0KLSAgaWYgKGVudHJ5KSB7Ci0gICAgICAvLyBjcm9zcy1kb21haW4gYWNjZXNzIHRvIHRoZSBs
b2NhdGlvbiBpcyBhbGxvd2VkIHdoZW4gYXNzaWduaW5nIHRoZSB3aG9sZSBsb2NhdGlvbiwKLSAg
ICAgIC8vIGJ1dCBub3Qgd2hlbiBhc3NpZ25pbmcgdGhlIGluZGl2aWR1YWwgcGllY2VzLCBzaW5j
ZSB0aGF0IG1pZ2h0IGluYWR2ZXJ0ZW50bHkKLSAgICAgIC8vIGRpc2Nsb3NlIG90aGVyIHBhcnRz
IG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbi4KLSAgICAgIGlmIChlbnRyeS0+dmFsdWUuaW50VmFs
dWUgIT0gSHJlZiAmJiAhc2FtZURvbWFpbkFjY2VzcykKLSAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgIHN3aXRjaCAoZW50cnktPnZhbHVlLmludFZhbHVlKSB7Ci0gICAgICBjYXNlIEhyZWY6IHsK
LSAgICAgICAgICBGcmFtZSogZnJhbWUgPSBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5p
bXBsKCktPmZyYW1lKCk7Ci0gICAgICAgICAgaWYgKCFmcmFtZSkKLSAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgIGlmICghZnJhbWUtPmxvYWRlcigpLT5zaG91bGRBbGxvd05hdmlnYXRp
b24obV9mcmFtZSkpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB1cmwgPSBmcmFt
ZS0+bG9hZGVyKCktPmNvbXBsZXRlVVJMKHN0cik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9
Ci0gICAgICBjYXNlIEhhc2g6IHsKLSAgICAgICAgICBpZiAoc3RyLnN0YXJ0c1dpdGgoIiMiKSkK
LSAgICAgICAgICAgICAgc3RyID0gc3RyLm1pZCgxKTsKLSAgICAgICAgICBpZiAodXJsLnJlZigp
ID09IHN0cikKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIHVybC5zZXRSZWYoc3Ry
KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSG9zdDogewotICAgICAg
ICAgIHVybC5zZXRIb3N0QW5kUG9ydChzdHIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQot
ICAgICAgY2FzZSBIb3N0bmFtZToKLSAgICAgICAgICB1cmwuc2V0SG9zdChzdHIpOwotICAgICAg
ICAgIGJyZWFrOwotICAgICAgY2FzZSBQYXRobmFtZToKLSAgICAgICAgICB1cmwuc2V0UGF0aChz
dHIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQb3J0OgotICAgICAgICAgIHVybC5z
ZXRQb3J0KHN0ci50b1VJbnQoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFByb3Rv
Y29sOgotICAgICAgICAgIHVybC5zZXRQcm90b2NvbChzdHIpOwotICAgICAgICAgIGJyZWFrOwot
ICAgICAgY2FzZSBTZWFyY2g6Ci0gICAgICAgICAgdXJsLnNldFF1ZXJ5KHN0cik7Ci0gICAgICAg
ICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgIC8vIERpc2FsbG93IGNoYW5naW5n
IG90aGVyIHByb3BlcnRpZXMgaW4gTG9jYXRpb25UYWJsZS4gZS5nLiwgIndpbmRvdy5sb2NhdGlv
bi50b1N0cmluZyA9IC4uLiIuCi0gICAgICAgICAgLy8gPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTEyNzIwPgotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgfSBl
bHNlIHsKLSAgICAgIGlmIChzYW1lRG9tYWluQWNjZXNzKQotICAgICAgICAgIEpTT2JqZWN0Ojpw
dXQoZXhlYywgcHJvcGVydHlOYW1lLCB2YWx1ZSwgYXR0cik7Ci0gICAgICByZXR1cm47Ci0gIH0K
LQotICBGcmFtZSogYWN0aXZlRnJhbWUgPSBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5p
bXBsKCktPmZyYW1lKCk7Ci0gIGlmICghdXJsLmRlcHJlY2F0ZWRTdHJpbmcoKS5zdGFydHNXaXRo
KCJqYXZhc2NyaXB0OiIsIGZhbHNlKSB8fCBzYW1lRG9tYWluQWNjZXNzKSB7Ci0gICAgYm9vbCB1
c2VyR2VzdHVyZSA9IGFjdGl2ZUZyYW1lLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNzaW5nVXNlckdl
c3R1cmUoKTsKLSAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZSh1
cmwuc3RyaW5nKCksIGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBm
YWxzZSwgdXNlckdlc3R1cmUpOwotICB9Ci19Ci0KLUpTVmFsdWUqIExvY2F0aW9uUHJvdG9GdW5j
UmVwbGFjZTo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09i
aiwgY29uc3QgTGlzdCYgYXJncykKLXsKLSAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZMb2Nh
dGlvbjo6aW5mbykpCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7
Ci0gICAgTG9jYXRpb24qIGxvY2F0aW9uID0gc3RhdGljX2Nhc3Q8TG9jYXRpb24qPih0aGlzT2Jq
KTsKLSAgICBGcmFtZSogZnJhbWUgPSBsb2NhdGlvbi0+ZnJhbWUoKTsKLSAgICBpZiAoIWZyYW1l
KQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAgIEZyYW1lKiBhY3RpdmVGcmFt
ZSA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwoKS0+ZnJhbWUoKTsKLSAgICBp
ZiAoYWN0aXZlRnJhbWUpIHsKLSAgICAgICAgaWYgKCFhY3RpdmVGcmFtZS0+bG9hZGVyKCktPnNo
b3VsZEFsbG93TmF2aWdhdGlvbihmcmFtZSkpCi0gICAgICAgICAgICByZXR1cm4ganNVbmRlZmlu
ZWQoKTsKLSAgICAgICAgRGVwcmVjYXRlZFN0cmluZyBzdHIgPSBhcmdzWzBdLT50b1N0cmluZyhl
eGVjKTsKLSAgICAgICAgY29uc3QgV2luZG93KiB3aW5kb3cgPSBXaW5kb3c6OnJldHJpZXZlV2lu
ZG93KGZyYW1lKTsKLSAgICAgICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBm
YWxzZSkgfHwgKHdpbmRvdyAmJiB3aW5kb3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpKSB7Ci0g
ICAgICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCkt
PnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpOwotICAgICAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5z
Y2hlZHVsZUxvY2F0aW9uQ2hhbmdlKGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+Y29tcGxldGVVUkwo
c3RyKS5zdHJpbmcoKSwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCks
IHRydWUsIHVzZXJHZXN0dXJlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBqc1Vu
ZGVmaW5lZCgpOwotfQotCi1KU1ZhbHVlKiBMb2NhdGlvblByb3RvRnVuY1JlbG9hZDo6Y2FsbEFz
RnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYg
YXJncykKLXsKLSAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZMb2NhdGlvbjo6aW5mbykpCi0g
ICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7Ci0gICAgTG9jYXRpb24q
IGxvY2F0aW9uID0gc3RhdGljX2Nhc3Q8TG9jYXRpb24qPih0aGlzT2JqKTsKLSAgICBGcmFtZSog
ZnJhbWUgPSBsb2NhdGlvbi0+ZnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1
cm4ganNVbmRlZmluZWQoKTsKLQotICAgIFdpbmRvdyogd2luZG93ID0gV2luZG93OjpyZXRyaWV2
ZVdpbmRvdyhmcmFtZSk7Ci0gICAgaWYgKCF3aW5kb3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykp
Ci0gICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgaWYgKCFmcmFtZS0+bG9hZGVy
KCktPnVybCgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5zdGFydHNXaXRoKCJqYXZhc2NyaXB0OiIsIGZh
bHNlKSB8fCAod2luZG93ICYmIHdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkpIHsKLSAg
ICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmlt
cGwoKS0+ZnJhbWUoKS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCk7Ci0g
ICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVSZWZyZXNoKHVzZXJHZXN0dXJlKTsKLSAg
ICB9Ci0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUqIExvY2F0aW9uUHJv
dG9GdW5jQXNzaWduOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0
aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewotICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMo
JkxvY2F0aW9uOjppbmZvKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVy
cm9yKTsKLSAgICBMb2NhdGlvbiogbG9jYXRpb24gPSBzdGF0aWNfY2FzdDxMb2NhdGlvbio+KHRo
aXNPYmopOwotICAgIEZyYW1lKiBmcmFtZSA9IGxvY2F0aW9uLT5mcmFtZSgpOwotICAgIGlmICgh
ZnJhbWUpCi0gICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgRnJhbWUqIGFjdGl2
ZUZyYW1lID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOwot
ICAgIGlmIChhY3RpdmVGcmFtZSkgewotICAgICAgICBpZiAoIWFjdGl2ZUZyYW1lLT5sb2FkZXIo
KS0+c2hvdWxkQWxsb3dOYXZpZ2F0aW9uKGZyYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBqc1Vu
ZGVmaW5lZCgpOwotICAgICAgICBjb25zdCBXaW5kb3cqIHdpbmRvdyA9IFdpbmRvdzo6cmV0cmll
dmVXaW5kb3coZnJhbWUpOwotICAgICAgICBTdHJpbmcgZHN0VXJsID0gYWN0aXZlRnJhbWUtPmxv
YWRlcigpLT5jb21wbGV0ZVVSTChhcmdzWzBdLT50b1N0cmluZyhleGVjKSkuc3RyaW5nKCk7Ci0g
ICAgICAgIGlmICghZHN0VXJsLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8ICh3
aW5kb3cgJiYgd2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSkgewotICAgICAgICAgICAg
Ym9vbCB1c2VyR2VzdHVyZSA9IGFjdGl2ZUZyYW1lLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNzaW5n
VXNlckdlc3R1cmUoKTsKLSAgICAgICAgICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBpdGVt
IGlmIHRoaXMgSlMgd2FzIGNhbGxlZCB2aWEgYSB1c2VyIGdlc3R1cmUKLSAgICAgICAgICAgIGZy
YW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShkc3RVcmwsIGFjdGl2ZUZyYW1l
LT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1cmUpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUq
IExvY2F0aW9uUHJvdG9GdW5jVG9TdHJpbmc6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhl
YywgSlNPYmplY3QqIHRoaXNPYmosIGNvbnN0IExpc3QmIGFyZ3MpCi17Ci0gICAgaWYgKCF0aGlz
T2JqLT5pbmhlcml0cygmTG9jYXRpb246OmluZm8pKQotICAgICAgICByZXR1cm4gdGhyb3dFcnJv
cihleGVjLCBUeXBlRXJyb3IpOwotICAgIExvY2F0aW9uKiBsb2NhdGlvbiA9IHN0YXRpY19jYXN0
PExvY2F0aW9uKj4odGhpc09iaik7Ci0gICAgRnJhbWUqIGZyYW1lID0gbG9jYXRpb24tPmZyYW1l
KCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAg
ICBjb25zdCBLVVJMJiB1cmwgPSBmcmFtZS0+bG9hZGVyKCktPnVybCgpOwotICAgIGlmICghdXJs
Lmhhc1BhdGgoKSkKLSAgICAgICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcmV0dHlVUkwoKSArICIv
Iik7Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHVybC5wcmV0dHlVUkwoKSk7Ci19CisjaW5jbHVkZSAi
a2pzX3dpbmRvdy5oIgogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiBQYXVzZWRUaW1lb3V0czo6flBhdXNlZFRpbWVvdXRzKCkKIHsKQEAgLTE2NzMsMjcgKzM4
LDQgQEAgUGF1c2VkVGltZW91dHM6On5QYXVzZWRUaW1lb3V0cygpCiAgICAgZGVsZXRlIFtdIGFy
cmF5OwogfQogCi12b2lkIERPTVdpbmRvd1RpbWVyOjpmaXJlZCgpCi17Ci0gICAgdGltZXJOZXN0
aW5nTGV2ZWwgPSBtX25lc3RpbmdMZXZlbDsKLSAgICBtX29iamVjdC0+dGltZXJGaXJlZCh0aGlz
KTsKLSAgICB0aW1lck5lc3RpbmdMZXZlbCA9IDA7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIEtKUwot
Ci11c2luZyBuYW1lc3BhY2UgS0pTOwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLUpTVmFsdWUq
IHRvSlMoRXhlY1N0YXRlKiwgRE9NV2luZG93KiBkb21XaW5kb3cpCi17Ci0gICAgaWYgKCFkb21X
aW5kb3cpCi0gICAgICAgIHJldHVybiBqc051bGwoKTsKLSAgICBGcmFtZSogZnJhbWUgPSBkb21X
aW5kb3ctPmZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIGpzTnVsbCgp
OwotICAgIHJldHVybiBXaW5kb3c6OnJldHJpZXZlKGZyYW1lKTsKLX0KLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9qcy9QYXVzZWRUaW1lb3V0cy5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvanMvUGF1c2VkVGltZW91dHMuaAkocmV2aXNp
b24gMjg3NzYpCShmcm9tIFdlYkNvcmUvYmluZGluZ3MvanMva2pzX3dpbmRvdy5oOjI4Nzc2KQor
KysgV2ViQ29yZS9iaW5kaW5ncy9qcy9QYXVzZWRUaW1lb3V0cy5oCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMjU2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMCBIYXJyaSBQb3J0ZW4g
KHBvcnRlbkBrZGUub3JnKQorICogIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAw
NiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXZlZC4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKyNpZm5kZWYga2pzX3dpbmRvd19oCisjZGVmaW5lIGtqc193aW5kb3df
aAorCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJranNfYmluZGluZy5o
IgorI2luY2x1ZGUgPGtqcy9wcm90ZWN0Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNp
bmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKyAgICBjbGFzcyBBdG9taWNTdHJpbmc7CisgICAgY2xhc3MgRE9N
V2luZG93OworICAgIGNsYXNzIEZyYW1lOworICAgIGNsYXNzIEpTRXZlbnRMaXN0ZW5lcjsKKyAg
ICBjbGFzcyBKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcjsKK30KKworbmFtZXNwYWNlIEtKUyB7
CisKKyAgICBjbGFzcyBET01XaW5kb3dUaW1lcjsKKyAgICBjbGFzcyBMb2NhdGlvbjsKKyAgICBj
bGFzcyBQYXVzZWRUaW1lb3V0OworICAgIGNsYXNzIFNjaGVkdWxlZEFjdGlvbjsKKyAgICBjbGFz
cyBXaW5kb3c7CisgICAgY2xhc3MgV2luZG93RnVuYzsKKyAgICBjbGFzcyBXaW5kb3dQcml2YXRl
OworCisgICAgY2xhc3MgUGF1c2VkVGltZW91dHMgOiBOb25jb3B5YWJsZSB7CisgICAgcHVibGlj
OgorICAgICAgICBQYXVzZWRUaW1lb3V0cyhQYXVzZWRUaW1lb3V0KiBhcnJheSwgc2l6ZV90IGxl
bmd0aCkKKyAgICAgICAgICAgIDogbV9hcnJheShhcnJheSkKKyAgICAgICAgICAgICwgbV9sZW5n
dGgobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB+UGF1c2VkVGltZW91
dHMoKTsKKworICAgICAgICBzaXplX3QgbnVtVGltZW91dHMoKSBjb25zdCB7IHJldHVybiBtX2xl
bmd0aDsgfQorICAgICAgICBQYXVzZWRUaW1lb3V0KiB0YWtlVGltZW91dHMoKSB7IFBhdXNlZFRp
bWVvdXQqIGEgPSBtX2FycmF5OyBtX2FycmF5ID0gMDsgcmV0dXJuIGE7IH0KKworICAgIHByaXZh
dGU6CisgICAgICAgIFBhdXNlZFRpbWVvdXQqIG1fYXJyYXk7CisgICAgICAgIHNpemVfdCBtX2xl
bmd0aDsKKyAgICB9OworCisKKyAgLy8gVGhpcyBpcyB0aGUgb25seSBXZWJDb3JlIEpTIGJpbmRp
bmcgd2hpY2ggZG9lcyBub3QgaW5oZXJpdCBmcm9tIERPTU9iamVjdAorICBjbGFzcyBXaW5kb3cg
OiBwdWJsaWMgSlNHbG9iYWxPYmplY3QgeworICAgIGZyaWVuZCBjbGFzcyBMb2NhdGlvbjsKKyAg
ICBmcmllbmQgY2xhc3MgU2NoZWR1bGVkQWN0aW9uOworICBwcm90ZWN0ZWQ6CisgICAgV2luZG93
KFdlYkNvcmU6OkRPTVdpbmRvdyopOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5XaW5kb3co
KTsKKworICAgIFdlYkNvcmU6OkRPTVdpbmRvdyogaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1faW1w
bC5nZXQoKTsgfQorCisgICAgdm9pZCBkaXNjb25uZWN0RnJhbWUoKTsKKworICAgIC8vIFJldHVy
bnMgYW5kIHJlZ2lzdGVycyBhIHdpbmRvdyBvYmplY3QuIEluIGNhc2UgdGhlcmUncyBhbHJlYWR5
IGEgV2luZG93CisgICAgLy8gZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUgcCB0aGlzIHdpbGwgYmUg
cmV0dXJuZWQgaW4gb3JkZXIgdG8gaGF2ZSB1bmlxdWUKKyAgICAvLyBiaW5kaW5ncy4KKyAgICBz
dGF0aWMgSlNWYWx1ZSogcmV0cmlldmUoV2ViQ29yZTo6RnJhbWUqKTsKKworICAgIC8vIFJldHVy
bnMgdGhlIFdpbmRvdyBvYmplY3QgZm9yIGEgZ2l2ZW4gSFRNTCBmcmFtZQorICAgIHN0YXRpYyBX
aW5kb3cqIHJldHJpZXZlV2luZG93KFdlYkNvcmU6OkZyYW1lKik7CisKKyAgICAvLyBSZXR1cm5z
IGEgcG9pbnRlciB0byB0aGUgV2luZG93IG9iamVjdCB0aGlzIGphdmFzY3JpcHQgaW50ZXJwcmV0
aW5nIGluc3RhbmNlIAorICAgIC8vIHdhcyBjYWxsZWQgZnJvbS4KKyAgICBzdGF0aWMgV2luZG93
KiByZXRyaWV2ZUFjdGl2ZShFeGVjU3RhdGUqKTsKKworICAgIHZpcnR1YWwgdm9pZCBtYXJrKCk7
CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSosIGNvbnN0
IElkZW50aWZpZXImLCBQcm9wZXJ0eVNsb3QmKTsKKyAgICBKU1ZhbHVlKiBnZXRWYWx1ZVByb3Bl
cnR5KEV4ZWNTdGF0ZSosIGludCB0b2tlbikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHB1dChF
eGVjU3RhdGUqLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqLCBpbnQg
YXR0ciA9IE5vbmUpOworCisgICAgaW50IGluc3RhbGxUaW1lb3V0KGNvbnN0IFVTdHJpbmcmIGhh
bmRsZXIsIGludCB0LCBib29sIHNpbmdsZVNob3QpOworICAgIGludCBpbnN0YWxsVGltZW91dChK
U1ZhbHVlKiBmdW5jdGlvbiwgY29uc3QgTGlzdCYgYXJncywgaW50IHQsIGJvb2wgc2luZ2xlU2hv
dCk7CisgICAgdm9pZCBjbGVhclRpbWVvdXQoaW50IHRpbWVySWQsIGJvb2wgZGVsQWN0aW9uID0g
dHJ1ZSk7CisgICAgUGF1c2VkVGltZW91dHMqIHBhdXNlVGltZW91dHMoKTsKKyAgICB2b2lkIHJl
c3VtZVRpbWVvdXRzKFBhdXNlZFRpbWVvdXRzKik7CisKKyAgICB2b2lkIHRpbWVyRmlyZWQoRE9N
V2luZG93VGltZXIqKTsKKworICAgIExvY2F0aW9uKiBsb2NhdGlvbigpIGNvbnN0OworCisgICAg
Ly8gRmluZHMgYSB3cmFwcGVyIG9mIGEgSlMgRXZlbnRMaXN0ZW5lciwgcmV0dXJucyAwIGlmIG5v
IGV4aXN0aW5nIG9uZS4KKyAgICBXZWJDb3JlOjpKU0V2ZW50TGlzdGVuZXIqIGZpbmRKU0V2ZW50
TGlzdGVuZXIoSlNWYWx1ZSosIGJvb2wgaHRtbCA9IGZhbHNlKTsKKworICAgIC8vIEZpbmRzIG9y
IGNyZWF0ZXMgYSB3cmFwcGVyIG9mIGEgSlMgRXZlbnRMaXN0ZW5lci4gSlMgRXZlbnRMaXN0ZW5l
ciBvYmplY3QgaXMgR0MtcHJvdGVjdGVkLgorICAgIFdlYkNvcmU6OkpTRXZlbnRMaXN0ZW5lciAq
ZmluZE9yQ3JlYXRlSlNFdmVudExpc3RlbmVyKEpTVmFsdWUqLCBib29sIGh0bWwgPSBmYWxzZSk7
CisKKyAgICAvLyBGaW5kcyBhIHdyYXBwZXIgb2YgYSBHQy11bnByb3RlY3RlZCBKUyBFdmVudExp
c3RlbmVyLCByZXR1cm5zIDAgaWYgbm8gZXhpc3Rpbmcgb25lLgorICAgIFdlYkNvcmU6OkpTVW5w
cm90ZWN0ZWRFdmVudExpc3RlbmVyKiBmaW5kSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIoSlNW
YWx1ZSosIGJvb2wgaHRtbCA9IGZhbHNlKTsKKworICAgIC8vIEZpbmRzIG9yIGNyZWF0ZXMgYSB3
cmFwcGVyIG9mIGEgSlMgRXZlbnRMaXN0ZW5lci4gSlMgRXZlbnRMaXN0ZW5lciBvYmplY3QgaXMg
Kk5PVCogR0MtcHJvdGVjdGVkLgorICAgIFdlYkNvcmU6OkpTVW5wcm90ZWN0ZWRFdmVudExpc3Rl
bmVyICpmaW5kT3JDcmVhdGVKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiwgYm9v
bCBodG1sID0gZmFsc2UpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzZXRDdXJy
ZW50RXZlbnQoV2ViQ29yZTo6RXZlbnQqKTsKKyAgICBXZWJDb3JlOjpFdmVudCogY3VycmVudEV2
ZW50KCk7CisKKyAgICAvLyBTZXQgYSBwbGFjZSB0byBwdXQgYSBkaWFsb2cgcmV0dXJuIHZhbHVl
IHdoZW4gdGhlIHdpbmRvdyBpcyBjbGVhcmVkLgorICAgIHZvaWQgc2V0UmV0dXJuVmFsdWVTbG90
KEpTVmFsdWUqKiBzbG90KTsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxKU09iamVjdCosIFdlYkNv
cmU6OkpTRXZlbnRMaXN0ZW5lcio+IExpc3RlbmVyc01hcDsKKyAgICB0eXBlZGVmIEhhc2hNYXA8
SlNPYmplY3QqLCBXZWJDb3JlOjpKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcio+IFVucHJvdGVj
dGVkTGlzdGVuZXJzTWFwOworICAgIAorICAgIExpc3RlbmVyc01hcCYganNFdmVudExpc3RlbmVy
cygpOworICAgIExpc3RlbmVyc01hcCYganNIVE1MRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICBVbnBy
b3RlY3RlZExpc3RlbmVyc01hcCYganNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXJzKCk7CisgICAg
VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAmIGpzVW5wcm90ZWN0ZWRIVE1MRXZlbnRMaXN0ZW5lcnMo
KTsKKyAgICAKKyAgICB2aXJ0dWFsIGNvbnN0IENsYXNzSW5mbyogY2xhc3NJbmZvKCkgY29uc3Qg
eyByZXR1cm4gJmluZm87IH0KKyAgICBzdGF0aWMgY29uc3QgQ2xhc3NJbmZvIGluZm87CisKKyAg
ICB2aXJ0dWFsIEV4ZWNTdGF0ZSogZ2xvYmFsRXhlYygpOworCisgICAgdmlydHVhbCBib29sIHNo
b3VsZEludGVycnVwdFNjcmlwdCgpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGFsbG93c0Fj
Y2Vzc0Zyb20oY29uc3QgSlNHbG9iYWxPYmplY3QqKSBjb25zdDsKKyAgICBib29sIGFsbG93c0Fj
Y2Vzc0Zyb20oRXhlY1N0YXRlKiBleGVjKSBjb25zdCB7IHJldHVybiBhbGxvd3NBY2Nlc3NGcm9t
KGV4ZWMtPmR5bmFtaWNHbG9iYWxPYmplY3QoKSk7IH0KKworICAgIGVudW0geworICAgICAgICAv
LyBBdHRyaWJ1dGVzCisgICAgICAgIENyeXB0bywgRXZlbnRfLCBMb2NhdGlvbl8sIE5hdmlnYXRv
cl8sCisgICAgICAgIENsaWVudEluZm9ybWF0aW9uLAorCisgICAgICAgIC8vIEV2ZW50IExpc3Rl
bmVycworICAgICAgICBPbmFib3J0LCBPbmJsdXIsIE9uY2hhbmdlLCBPbmNsaWNrLAorICAgICAg
ICBPbmRibGNsaWNrLCBPbmVycm9yLCBPbmZvY3VzLCBPbmtleWRvd24sCisgICAgICAgIE9ua2V5
cHJlc3MsIE9ua2V5dXAsIE9ubG9hZCwgT25tb3VzZWRvd24sCisgICAgICAgIE9ubW91c2Vtb3Zl
LCBPbm1vdXNlb3V0LCBPbm1vdXNlb3ZlciwgT25tb3VzZXVwLAorICAgICAgICBPbldpbmRvd01v
dXNlV2hlZWwsIE9ucmVzZXQsIE9ucmVzaXplLCBPbnNjcm9sbCwKKyAgICAgICAgT25zZWFyY2gs
IE9uc2VsZWN0LCBPbnN1Ym1pdCwgT251bmxvYWQsCisgICAgICAgIE9uYmVmb3JldW5sb2FkLAor
CisgICAgICAgIC8vIENvbnN0cnVjdG9ycworICAgICAgICBET01FeGNlcHRpb24sIEF1ZGlvLCBJ
bWFnZSwgT3B0aW9uLCBYTUxIdHRwUmVxdWVzdCwKKyAgICAgICAgWFNMVFByb2Nlc3Nvcl8KKyAg
ICB9OworCisgIHByaXZhdGU6CisgICAgSlNWYWx1ZSogZ2V0TGlzdGVuZXIoRXhlY1N0YXRlKiwg
Y29uc3QgV2ViQ29yZTo6QXRvbWljU3RyaW5nJiBldmVudFR5cGUpIGNvbnN0OworICAgIHZvaWQg
c2V0TGlzdGVuZXIoRXhlY1N0YXRlKiwgY29uc3QgV2ViQ29yZTo6QXRvbWljU3RyaW5nJiBldmVu
dFR5cGUsIEpTVmFsdWUqIGZ1bmMpOworCisgICAgc3RhdGljIEpTVmFsdWUqIGNoaWxkRnJhbWVH
ZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwgY29uc3QgUHJv
cGVydHlTbG90Jik7CisgICAgc3RhdGljIEpTVmFsdWUqIG5hbWVkRnJhbWVHZXR0ZXIoRXhlY1N0
YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwgY29uc3QgUHJvcGVydHlTbG90Jik7
CisgICAgc3RhdGljIEpTVmFsdWUqIGluZGV4R2V0dGVyKEV4ZWNTdGF0ZSosIEpTT2JqZWN0Kiwg
Y29uc3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYpOworICAgIHN0YXRpYyBKU1Zh
bHVlKiBuYW1lZEl0ZW1HZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlm
aWVyJiwgY29uc3QgUHJvcGVydHlTbG90Jik7CisKKyAgICB2b2lkIGNsZWFySGVscGVyT2JqZWN0
UHJvcGVydGllcygpOworICAgIHZvaWQgY2xlYXJBbGxUaW1lb3V0cygpOworICAgIGludCBpbnN0
YWxsVGltZW91dChTY2hlZHVsZWRBY3Rpb24qLCBpbnQgaW50ZXJ2YWwsIGJvb2wgc2luZ2xlU2hv
dCk7CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6RE9NV2luZG93PiBtX2ltcGw7CisgICAgT3duUHRy
PFdpbmRvd1ByaXZhdGU+IGQ7CisgIH07CisKKyNkZWZpbmUgRk9SX0VBQ0hfQ0xBU1MobWFjcm8p
IFwKKyAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNBVG9CKSBcCisgICAgbWFjcm8oV2luZG93UHJv
dG9GdW5jQlRvQSkgXAorICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY09wZW4pIFwKKyAgICBtYWNy
byhXaW5kb3dQcm90b0Z1bmNTZXRUaW1lb3V0KSBcCisgICAgbWFjcm8oV2luZG93UHJvdG9GdW5j
Q2xlYXJUaW1lb3V0KSBcCisgICAgbWFjcm8oV2luZG93UHJvdG9GdW5jU2V0SW50ZXJ2YWwpIFwK
KyAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNBZGRFdmVudExpc3RlbmVyKSBcCisgICAgbWFjcm8o
V2luZG93UHJvdG9GdW5jUmVtb3ZlRXZlbnRMaXN0ZW5lcikgXAorICAgIG1hY3JvKFdpbmRvd1By
b3RvRnVuY1Nob3dNb2RhbERpYWxvZykgXAorICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY05vdElt
cGxlbWVudGVkKSBcCisKK0ZPUl9FQUNIX0NMQVNTKEtKU19JTVBMRU1FTlRfUFJPVE9UWVBFX0ZV
TkNUSU9OX1dJVEhfQ1JFQVRFKQorI3VuZGVmIEZPUl9FQUNIX0NMQVNTCisKKworICAvKioKKyAg
ICogQW4gYWN0aW9uIChlaXRoZXIgZnVuY3Rpb24gb3Igc3RyaW5nKSB0byBiZSBleGVjdXRlZCBh
ZnRlciBhIHNwZWNpZmllZAorICAgKiB0aW1lIGludGVydmFsLCBlaXRoZXIgb25jZSBvciByZXBl
YXRlZGx5LiBVc2VkIGZvciB3aW5kb3cuc2V0VGltZW91dCgpCisgICAqIGFuZCB3aW5kb3cuc2V0
SW50ZXJ2YWwoKQorICAgKi8KKyAgICBjbGFzcyBTY2hlZHVsZWRBY3Rpb24geworICAgIHB1Ymxp
YzoKKyAgICAgICAgU2NoZWR1bGVkQWN0aW9uKEpTVmFsdWUqIGZ1bmMsIGNvbnN0IExpc3QmIGFy
Z3MpOworICAgICAgICBTY2hlZHVsZWRBY3Rpb24oY29uc3QgV2ViQ29yZTo6U3RyaW5nJiBjb2Rl
KQorICAgICAgICAgICAgOiBtX2NvZGUoY29kZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAg
ICAgICAgdm9pZCBleGVjdXRlKFdpbmRvdyAqKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFBy
b3RlY3RlZFB0cjxKU1ZhbHVlPiBtX2Z1bmM7CisgICAgICAgIFZlY3RvcjxQcm90ZWN0ZWRQdHI8
SlNWYWx1ZT4gPiBtX2FyZ3M7CisgICAgICAgIFdlYkNvcmU6OlN0cmluZyBtX2NvZGU7CisgICAg
fTsKKworICBjbGFzcyBMb2NhdGlvbiA6IHB1YmxpYyBET01PYmplY3QgeworICAgIGZyaWVuZCBj
bGFzcyBXaW5kb3c7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0T3duUHJvcGVydHlT
bG90KEV4ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXImLCBQcm9wZXJ0eVNsb3QmKTsKKyAgICBK
U1ZhbHVlKiBnZXRWYWx1ZVByb3BlcnR5KEV4ZWNTdGF0ZSosIGludCB0b2tlbikgY29uc3Q7Cisg
ICAgdmlydHVhbCB2b2lkIHB1dChFeGVjU3RhdGUqLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0
eU5hbWUsIEpTVmFsdWUqLCBpbnQgYXR0ciA9IE5vbmUpOworCisgICAgZW51bSB7IEhhc2gsIEhy
ZWYsIEhvc3RuYW1lLCBIb3N0LCBQYXRobmFtZSwgUG9ydCwgUHJvdG9jb2wsIFNlYXJjaCwgCisg
ICAgICAgICAgIFJlcGxhY2UsIFJlbG9hZCwgVG9TdHJpbmcsIEFzc2lnbiB9OworCisgICAgV2Vi
Q29yZTo6RnJhbWUqIGZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9mcmFtZTsgfQorCisgICAgdmly
dHVhbCBjb25zdCBDbGFzc0luZm8qIGNsYXNzSW5mbygpIGNvbnN0IHsgcmV0dXJuICZpbmZvOyB9
CisgICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBpbmZvOworCisgIHByaXZhdGU6CisgICAgTG9j
YXRpb24oV2ViQ29yZTo6RnJhbWUqKTsKKworICAgIFdlYkNvcmU6OkZyYW1lKiBtX2ZyYW1lOwor
ICB9OworCisjZGVmaW5lIEZPUl9FQUNIX0NMQVNTKG1hY3JvKSBcCisgICAgbWFjcm8oTG9jYXRp
b25Qcm90b0Z1bmNBc3NpZ24pIFwKKyAgICBtYWNybyhMb2NhdGlvblByb3RvRnVuY1RvU3RyaW5n
KSBcCisgICAgbWFjcm8oTG9jYXRpb25Qcm90b0Z1bmNSZXBsYWNlKSBcCisgICAgbWFjcm8oTG9j
YXRpb25Qcm90b0Z1bmNSZWxvYWQpIFwKKworRk9SX0VBQ0hfQ0xBU1MoS0pTX0lNUExFTUVOVF9Q
Uk9UT1RZUEVfRlVOQ1RJT05fV0lUSF9DUkVBVEUpCisjdW5kZWYgRk9SX0VBQ0hfQ0xBU1MKKwor
fSAvLyBuYW1lc3BhY2UgS0pTCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBLSlM6OkpTVmFs
dWUqIHRvSlMoS0pTOjpFeGVjU3RhdGUqLCBET01XaW5kb3cqKTsKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKworI2VuZGlmIC8vIGtqc193aW5kb3dfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9q
cy9QYXVzZWRUaW1lb3V0cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvanMvUGF1
c2VkVGltZW91dHMuaAkocmV2aXNpb24gMjg3NzYpCisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL1Bh
dXNlZFRpbWVvdXRzLmgJKHdvcmtpbmcgY29weSkKQEAgLTE3LDMzICsxNywyNCBAQAogICogIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rvbiwg
TUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAKLSNpZm5kZWYga2pzX3dpbmRvd19oCi0jZGVmaW5l
IGtqc193aW5kb3dfaAorI2lmbmRlZiBQYXVzZWRUaW1lb3V0c19oCisjZGVmaW5lIFBhdXNlZFRp
bWVvdXRzX2gKIAotI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAia2pzX2Jp
bmRpbmcuaCIKLSNpbmNsdWRlIDxranMvcHJvdGVjdC5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFw
Lmg+CiAjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+Ci0jaW5jbHVkZSA8d3RmL093blB0ci5o
PgogCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgY2xhc3MgQXRvbWljU3RyaW5nOwotICAgIGNs
YXNzIERPTVdpbmRvdzsKLSAgICBjbGFzcyBGcmFtZTsKLSAgICBjbGFzcyBKU0V2ZW50TGlzdGVu
ZXI7Ci0gICAgY2xhc3MgSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXI7CituYW1lc3BhY2UgS0pT
IHsKKyAgICBjbGFzcyBTY2hlZHVsZWRBY3Rpb247CiB9CiAKLW5hbWVzcGFjZSBLSlMgeworbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi0gICAgY2xhc3MgRE9NV2luZG93VGltZXI7Ci0gICAgY2xhc3Mg
TG9jYXRpb247Ci0gICAgY2xhc3MgUGF1c2VkVGltZW91dDsKLSAgICBjbGFzcyBTY2hlZHVsZWRB
Y3Rpb247Ci0gICAgY2xhc3MgV2luZG93OwotICAgIGNsYXNzIFdpbmRvd0Z1bmM7Ci0gICAgY2xh
c3MgV2luZG93UHJpdmF0ZTsKKyAgICBzdHJ1Y3QgUGF1c2VkVGltZW91dCB7CisgICAgICAgIGlu
dCB0aW1lb3V0SWQ7CisgICAgICAgIGludCBuZXN0aW5nTGV2ZWw7CisgICAgICAgIGRvdWJsZSBu
ZXh0RmlyZUludGVydmFsOworICAgICAgICBkb3VibGUgcmVwZWF0SW50ZXJ2YWw7CisgICAgICAg
IEtKUzo6U2NoZWR1bGVkQWN0aW9uKiBhY3Rpb247CisgICAgfTsKIAogICAgIGNsYXNzIFBhdXNl
ZFRpbWVvdXRzIDogTm9uY29weWFibGUgewogICAgIHB1YmxpYzoKQEAgLTYzLDE5NCArNTQsNiBA
QCBuYW1lc3BhY2UgS0pTIHsKICAgICAgICAgc2l6ZV90IG1fbGVuZ3RoOwogICAgIH07CiAKLQot
ICAvLyBUaGlzIGlzIHRoZSBvbmx5IFdlYkNvcmUgSlMgYmluZGluZyB3aGljaCBkb2VzIG5vdCBp
bmhlcml0IGZyb20gRE9NT2JqZWN0Ci0gIGNsYXNzIFdpbmRvdyA6IHB1YmxpYyBKU0dsb2JhbE9i
amVjdCB7Ci0gICAgZnJpZW5kIGNsYXNzIExvY2F0aW9uOwotICAgIGZyaWVuZCBjbGFzcyBTY2hl
ZHVsZWRBY3Rpb247Ci0gIHByb3RlY3RlZDoKLSAgICBXaW5kb3coV2ViQ29yZTo6RE9NV2luZG93
Kik7Ci0KLSAgcHVibGljOgotICAgIHZpcnR1YWwgfldpbmRvdygpOwotCi0gICAgV2ViQ29yZTo6
RE9NV2luZG93KiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsLmdldCgpOyB9Ci0KLSAgICB2
b2lkIGRpc2Nvbm5lY3RGcmFtZSgpOwotCi0gICAgLy8gUmV0dXJucyBhbmQgcmVnaXN0ZXJzIGEg
d2luZG93IG9iamVjdC4gSW4gY2FzZSB0aGVyZSdzIGFscmVhZHkgYSBXaW5kb3cKLSAgICAvLyBm
b3IgdGhlIHNwZWNpZmllZCBmcmFtZSBwIHRoaXMgd2lsbCBiZSByZXR1cm5lZCBpbiBvcmRlciB0
byBoYXZlIHVuaXF1ZQotICAgIC8vIGJpbmRpbmdzLgotICAgIHN0YXRpYyBKU1ZhbHVlKiByZXRy
aWV2ZShXZWJDb3JlOjpGcmFtZSopOwotCi0gICAgLy8gUmV0dXJucyB0aGUgV2luZG93IG9iamVj
dCBmb3IgYSBnaXZlbiBIVE1MIGZyYW1lCi0gICAgc3RhdGljIFdpbmRvdyogcmV0cmlldmVXaW5k
b3coV2ViQ29yZTo6RnJhbWUqKTsKLQotICAgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBX
aW5kb3cgb2JqZWN0IHRoaXMgamF2YXNjcmlwdCBpbnRlcnByZXRpbmcgaW5zdGFuY2UgCi0gICAg
Ly8gd2FzIGNhbGxlZCBmcm9tLgotICAgIHN0YXRpYyBXaW5kb3cqIHJldHJpZXZlQWN0aXZlKEV4
ZWNTdGF0ZSopOwotCi0gICAgdmlydHVhbCB2b2lkIG1hcmsoKTsKLQotICAgIHZpcnR1YWwgYm9v
bCBnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRlKiwgY29uc3QgSWRlbnRpZmllciYsIFByb3Bl
cnR5U2xvdCYpOwotICAgIEpTVmFsdWUqIGdldFZhbHVlUHJvcGVydHkoRXhlY1N0YXRlKiwgaW50
IHRva2VuKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcHV0KEV4ZWNTdGF0ZSosIGNvbnN0IElk
ZW50aWZpZXImIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSosIGludCBhdHRyID0gTm9uZSk7Ci0KLSAg
ICBpbnQgaW5zdGFsbFRpbWVvdXQoY29uc3QgVVN0cmluZyYgaGFuZGxlciwgaW50IHQsIGJvb2wg
c2luZ2xlU2hvdCk7Ci0gICAgaW50IGluc3RhbGxUaW1lb3V0KEpTVmFsdWUqIGZ1bmN0aW9uLCBj
b25zdCBMaXN0JiBhcmdzLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90KTsKLSAgICB2b2lkIGNsZWFy
VGltZW91dChpbnQgdGltZXJJZCwgYm9vbCBkZWxBY3Rpb24gPSB0cnVlKTsKLSAgICBQYXVzZWRU
aW1lb3V0cyogcGF1c2VUaW1lb3V0cygpOwotICAgIHZvaWQgcmVzdW1lVGltZW91dHMoUGF1c2Vk
VGltZW91dHMqKTsKLQotICAgIHZvaWQgdGltZXJGaXJlZChET01XaW5kb3dUaW1lciopOwotCi0g
ICAgTG9jYXRpb24qIGxvY2F0aW9uKCkgY29uc3Q7Ci0KLSAgICAvLyBGaW5kcyBhIHdyYXBwZXIg
b2YgYSBKUyBFdmVudExpc3RlbmVyLCByZXR1cm5zIDAgaWYgbm8gZXhpc3Rpbmcgb25lLgotICAg
IFdlYkNvcmU6OkpTRXZlbnRMaXN0ZW5lciogZmluZEpTRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiwg
Ym9vbCBodG1sID0gZmFsc2UpOwotCi0gICAgLy8gRmluZHMgb3IgY3JlYXRlcyBhIHdyYXBwZXIg
b2YgYSBKUyBFdmVudExpc3RlbmVyLiBKUyBFdmVudExpc3RlbmVyIG9iamVjdCBpcyBHQy1wcm90
ZWN0ZWQuCi0gICAgV2ViQ29yZTo6SlNFdmVudExpc3RlbmVyICpmaW5kT3JDcmVhdGVKU0V2ZW50
TGlzdGVuZXIoSlNWYWx1ZSosIGJvb2wgaHRtbCA9IGZhbHNlKTsKLQotICAgIC8vIEZpbmRzIGEg
d3JhcHBlciBvZiBhIEdDLXVucHJvdGVjdGVkIEpTIEV2ZW50TGlzdGVuZXIsIHJldHVybnMgMCBp
ZiBubyBleGlzdGluZyBvbmUuCi0gICAgV2ViQ29yZTo6SlNVbnByb3RlY3RlZEV2ZW50TGlzdGVu
ZXIqIGZpbmRKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiwgYm9vbCBodG1sID0g
ZmFsc2UpOwotCi0gICAgLy8gRmluZHMgb3IgY3JlYXRlcyBhIHdyYXBwZXIgb2YgYSBKUyBFdmVu
dExpc3RlbmVyLiBKUyBFdmVudExpc3RlbmVyIG9iamVjdCBpcyAqTk9UKiBHQy1wcm90ZWN0ZWQu
Ci0gICAgV2ViQ29yZTo6SlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIgKmZpbmRPckNyZWF0ZUpT
VW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyKEpTVmFsdWUqLCBib29sIGh0bWwgPSBmYWxzZSk7Ci0K
LSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICB2b2lkIHNldEN1cnJlbnRFdmVudChXZWJDb3JlOjpF
dmVudCopOwotICAgIFdlYkNvcmU6OkV2ZW50KiBjdXJyZW50RXZlbnQoKTsKLQotICAgIC8vIFNl
dCBhIHBsYWNlIHRvIHB1dCBhIGRpYWxvZyByZXR1cm4gdmFsdWUgd2hlbiB0aGUgd2luZG93IGlz
IGNsZWFyZWQuCi0gICAgdm9pZCBzZXRSZXR1cm5WYWx1ZVNsb3QoSlNWYWx1ZSoqIHNsb3QpOwot
Ci0gICAgdHlwZWRlZiBIYXNoTWFwPEpTT2JqZWN0KiwgV2ViQ29yZTo6SlNFdmVudExpc3RlbmVy
Kj4gTGlzdGVuZXJzTWFwOwotICAgIHR5cGVkZWYgSGFzaE1hcDxKU09iamVjdCosIFdlYkNvcmU6
OkpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyKj4gVW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXA7Ci0g
ICAgCi0gICAgTGlzdGVuZXJzTWFwJiBqc0V2ZW50TGlzdGVuZXJzKCk7Ci0gICAgTGlzdGVuZXJz
TWFwJiBqc0hUTUxFdmVudExpc3RlbmVycygpOwotICAgIFVucHJvdGVjdGVkTGlzdGVuZXJzTWFw
JiBqc1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcnMoKTsKLSAgICBVbnByb3RlY3RlZExpc3RlbmVy
c01hcCYganNVbnByb3RlY3RlZEhUTUxFdmVudExpc3RlbmVycygpOwotICAgIAotICAgIHZpcnR1
YWwgY29uc3QgQ2xhc3NJbmZvKiBjbGFzc0luZm8oKSBjb25zdCB7IHJldHVybiAmaW5mbzsgfQot
ICAgIHN0YXRpYyBjb25zdCBDbGFzc0luZm8gaW5mbzsKLQotICAgIHZpcnR1YWwgRXhlY1N0YXRl
KiBnbG9iYWxFeGVjKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkSW50ZXJydXB0U2NyaXB0
KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgYWxsb3dzQWNjZXNzRnJvbShjb25zdCBKU0ds
b2JhbE9iamVjdCopIGNvbnN0OwotICAgIGJvb2wgYWxsb3dzQWNjZXNzRnJvbShFeGVjU3RhdGUq
IGV4ZWMpIGNvbnN0IHsgcmV0dXJuIGFsbG93c0FjY2Vzc0Zyb20oZXhlYy0+ZHluYW1pY0dsb2Jh
bE9iamVjdCgpKTsgfQotCi0gICAgZW51bSB7Ci0gICAgICAgIC8vIEF0dHJpYnV0ZXMKLSAgICAg
ICAgQ3J5cHRvLCBFdmVudF8sIExvY2F0aW9uXywgTmF2aWdhdG9yXywKLSAgICAgICAgQ2xpZW50
SW5mb3JtYXRpb24sCi0KLSAgICAgICAgLy8gRXZlbnQgTGlzdGVuZXJzCi0gICAgICAgIE9uYWJv
cnQsIE9uYmx1ciwgT25jaGFuZ2UsIE9uY2xpY2ssCi0gICAgICAgIE9uZGJsY2xpY2ssIE9uZXJy
b3IsIE9uZm9jdXMsIE9ua2V5ZG93biwKLSAgICAgICAgT25rZXlwcmVzcywgT25rZXl1cCwgT25s
b2FkLCBPbm1vdXNlZG93biwKLSAgICAgICAgT25tb3VzZW1vdmUsIE9ubW91c2VvdXQsIE9ubW91
c2VvdmVyLCBPbm1vdXNldXAsCi0gICAgICAgIE9uV2luZG93TW91c2VXaGVlbCwgT25yZXNldCwg
T25yZXNpemUsIE9uc2Nyb2xsLAotICAgICAgICBPbnNlYXJjaCwgT25zZWxlY3QsIE9uc3VibWl0
LCBPbnVubG9hZCwKLSAgICAgICAgT25iZWZvcmV1bmxvYWQsCi0KLSAgICAgICAgLy8gQ29uc3Ry
dWN0b3JzCi0gICAgICAgIERPTUV4Y2VwdGlvbiwgQXVkaW8sIEltYWdlLCBPcHRpb24sIFhNTEh0
dHBSZXF1ZXN0LAotICAgICAgICBYU0xUUHJvY2Vzc29yXwotICAgIH07Ci0KLSAgcHJpdmF0ZToK
LSAgICBKU1ZhbHVlKiBnZXRMaXN0ZW5lcihFeGVjU3RhdGUqLCBjb25zdCBXZWJDb3JlOjpBdG9t
aWNTdHJpbmcmIGV2ZW50VHlwZSkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMaXN0ZW5lcihFeGVjU3Rh
dGUqLCBjb25zdCBXZWJDb3JlOjpBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgSlNWYWx1ZSogZnVu
Yyk7Ci0KLSAgICBzdGF0aWMgSlNWYWx1ZSogY2hpbGRGcmFtZUdldHRlcihFeGVjU3RhdGUqLCBK
U09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBjb25zdCBQcm9wZXJ0eVNsb3QmKTsKLSAgICBz
dGF0aWMgSlNWYWx1ZSogbmFtZWRGcmFtZUdldHRlcihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNv
bnN0IElkZW50aWZpZXImLCBjb25zdCBQcm9wZXJ0eVNsb3QmKTsKLSAgICBzdGF0aWMgSlNWYWx1
ZSogaW5kZXhHZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwg
Y29uc3QgUHJvcGVydHlTbG90Jik7Ci0gICAgc3RhdGljIEpTVmFsdWUqIG5hbWVkSXRlbUdldHRl
cihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBjb25zdCBQcm9wZXJ0
eVNsb3QmKTsKLQotICAgIHZvaWQgY2xlYXJIZWxwZXJPYmplY3RQcm9wZXJ0aWVzKCk7Ci0gICAg
dm9pZCBjbGVhckFsbFRpbWVvdXRzKCk7Ci0gICAgaW50IGluc3RhbGxUaW1lb3V0KFNjaGVkdWxl
ZEFjdGlvbiosIGludCBpbnRlcnZhbCwgYm9vbCBzaW5nbGVTaG90KTsKLQotICAgIFJlZlB0cjxX
ZWJDb3JlOjpET01XaW5kb3c+IG1faW1wbDsKLSAgICBPd25QdHI8V2luZG93UHJpdmF0ZT4gZDsK
LSAgfTsKLQotI2RlZmluZSBGT1JfRUFDSF9DTEFTUyhtYWNybykgXAotICAgIG1hY3JvKFdpbmRv
d1Byb3RvRnVuY0FUb0IpIFwKLSAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNCVG9BKSBcCi0gICAg
bWFjcm8oV2luZG93UHJvdG9GdW5jT3BlbikgXAotICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY1Nl
dFRpbWVvdXQpIFwKLSAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNDbGVhclRpbWVvdXQpIFwKLSAg
ICBtYWNybyhXaW5kb3dQcm90b0Z1bmNTZXRJbnRlcnZhbCkgXAotICAgIG1hY3JvKFdpbmRvd1By
b3RvRnVuY0FkZEV2ZW50TGlzdGVuZXIpIFwKLSAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNSZW1v
dmVFdmVudExpc3RlbmVyKSBcCi0gICAgbWFjcm8oV2luZG93UHJvdG9GdW5jU2hvd01vZGFsRGlh
bG9nKSBcCi0gICAgbWFjcm8oV2luZG93UHJvdG9GdW5jTm90SW1wbGVtZW50ZWQpIFwKLQotRk9S
X0VBQ0hfQ0xBU1MoS0pTX0lNUExFTUVOVF9QUk9UT1RZUEVfRlVOQ1RJT05fV0lUSF9DUkVBVEUp
Ci0jdW5kZWYgRk9SX0VBQ0hfQ0xBU1MKLQotCi0gIC8qKgotICAgKiBBbiBhY3Rpb24gKGVpdGhl
ciBmdW5jdGlvbiBvciBzdHJpbmcpIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGEgc3BlY2lmaWVkCi0g
ICAqIHRpbWUgaW50ZXJ2YWwsIGVpdGhlciBvbmNlIG9yIHJlcGVhdGVkbHkuIFVzZWQgZm9yIHdp
bmRvdy5zZXRUaW1lb3V0KCkKLSAgICogYW5kIHdpbmRvdy5zZXRJbnRlcnZhbCgpCi0gICAqLwot
ICAgIGNsYXNzIFNjaGVkdWxlZEFjdGlvbiB7Ci0gICAgcHVibGljOgotICAgICAgICBTY2hlZHVs
ZWRBY3Rpb24oSlNWYWx1ZSogZnVuYywgY29uc3QgTGlzdCYgYXJncyk7Ci0gICAgICAgIFNjaGVk
dWxlZEFjdGlvbihjb25zdCBXZWJDb3JlOjpTdHJpbmcmIGNvZGUpCi0gICAgICAgICAgICA6IG1f
Y29kZShjb2RlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGV4ZWN1dGUo
V2luZG93ICopOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgUHJvdGVjdGVkUHRyPEpTVmFsdWU+
IG1fZnVuYzsKLSAgICAgICAgVmVjdG9yPFByb3RlY3RlZFB0cjxKU1ZhbHVlPiA+IG1fYXJnczsK
LSAgICAgICAgV2ViQ29yZTo6U3RyaW5nIG1fY29kZTsKLSAgICB9OwotCi0gIGNsYXNzIExvY2F0
aW9uIDogcHVibGljIERPTU9iamVjdCB7Ci0gICAgZnJpZW5kIGNsYXNzIFdpbmRvdzsKLSAgcHVi
bGljOgotICAgIHZpcnR1YWwgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRlKiwgY29u
c3QgSWRlbnRpZmllciYsIFByb3BlcnR5U2xvdCYpOwotICAgIEpTVmFsdWUqIGdldFZhbHVlUHJv
cGVydHkoRXhlY1N0YXRlKiwgaW50IHRva2VuKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcHV0
KEV4ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSosIGlu
dCBhdHRyID0gTm9uZSk7Ci0KLSAgICBlbnVtIHsgSGFzaCwgSHJlZiwgSG9zdG5hbWUsIEhvc3Qs
IFBhdGhuYW1lLCBQb3J0LCBQcm90b2NvbCwgU2VhcmNoLCAKLSAgICAgICAgICAgUmVwbGFjZSwg
UmVsb2FkLCBUb1N0cmluZywgQXNzaWduIH07Ci0KLSAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUo
KSBjb25zdCB7IHJldHVybiBtX2ZyYW1lOyB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IENsYXNzSW5m
byogY2xhc3NJbmZvKCkgY29uc3QgeyByZXR1cm4gJmluZm87IH0KLSAgICBzdGF0aWMgY29uc3Qg
Q2xhc3NJbmZvIGluZm87Ci0KLSAgcHJpdmF0ZToKLSAgICBMb2NhdGlvbihXZWJDb3JlOjpGcmFt
ZSopOwotCi0gICAgV2ViQ29yZTo6RnJhbWUqIG1fZnJhbWU7Ci0gIH07Ci0KLSNkZWZpbmUgRk9S
X0VBQ0hfQ0xBU1MobWFjcm8pIFwKLSAgICBtYWNybyhMb2NhdGlvblByb3RvRnVuY0Fzc2lnbikg
XAotICAgIG1hY3JvKExvY2F0aW9uUHJvdG9GdW5jVG9TdHJpbmcpIFwKLSAgICBtYWNybyhMb2Nh
dGlvblByb3RvRnVuY1JlcGxhY2UpIFwKLSAgICBtYWNybyhMb2NhdGlvblByb3RvRnVuY1JlbG9h
ZCkgXAotCi1GT1JfRUFDSF9DTEFTUyhLSlNfSU1QTEVNRU5UX1BST1RPVFlQRV9GVU5DVElPTl9X
SVRIX0NSRUFURSkKLSN1bmRlZiBGT1JfRUFDSF9DTEFTUwotCi19IC8vIG5hbWVzcGFjZSBLSlMK
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIEtKUzo6SlNWYWx1ZSogdG9KUyhLSlM6OkV4ZWNT
dGF0ZSosIERPTVdpbmRvdyopOwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCi0jZW5kaWYgLy8g
a2pzX3dpbmRvd19oCisjZW5kaWYgLy8gUGF1c2VkVGltZW91dHNfaApJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy9qcy9ranNfd2luZG93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L2pzL2tqc193aW5kb3cuY3BwCShyZXZpc2lvbiAyODc3NikKKysrIFdlYkNvcmUvYmluZGluZ3Mv
anMva2pzX3dpbmRvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNs
dWRlICJKU1hNTEh0dHBSZXF1ZXN0LmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUg
IlBhZ2UuaCIKKyNpbmNsdWRlICJQYXVzZWRUaW1lb3V0cy5oIgogI2luY2x1ZGUgIlBsYXRmb3Jt
U2NyZWVuLmgiCiAjaW5jbHVkZSAiUGx1Z0luSW5mb1N0b3JlLmgiCiAjaW5jbHVkZSAiUmVuZGVy
Vmlldy5oIgpAQCAtMTI5LDE1ICsxMzAsNiBAQCBwcml2YXRlOgogICAgIFNjaGVkdWxlZEFjdGlv
biogbV9hY3Rpb247CiB9OwogCi1jbGFzcyBQYXVzZWRUaW1lb3V0IHsKLXB1YmxpYzoKLSAgICBp
bnQgdGltZW91dElkOwotICAgIGludCBuZXN0aW5nTGV2ZWw7Ci0gICAgZG91YmxlIG5leHRGaXJl
SW50ZXJ2YWw7Ci0gICAgZG91YmxlIHJlcGVhdEludGVydmFsOwotICAgIFNjaGVkdWxlZEFjdGlv
biAqYWN0aW9uOwotfTsKLQogfSAvLyBuYW1lc3BhY2UgS0pTCiAKICNpbmNsdWRlICJranNfd2lu
ZG93Lmx1dC5oIgpAQCAtMTMxNyw3ICsxMzA5LDcgQEAgaW50IFdpbmRvdzo6aW5zdGFsbFRpbWVv
dXQoSlNWYWx1ZSogZnVuYwogICAgIHJldHVybiBpbnN0YWxsVGltZW91dChuZXcgU2NoZWR1bGVk
QWN0aW9uKGZ1bmMsIGFyZ3MpLCB0LCBzaW5nbGVTaG90KTsKIH0KIAotUGF1c2VkVGltZW91dHMq
IFdpbmRvdzo6cGF1c2VUaW1lb3V0cygpCitXZWJDb3JlOjpQYXVzZWRUaW1lb3V0cyogV2luZG93
OjpwYXVzZVRpbWVvdXRzKCkKIHsKICAgICBzaXplX3QgY291bnQgPSBkLT5tX3RpbWVvdXRzLnNp
emUoKTsKICAgICBpZiAoY291bnQgPT0gMCkKQEAgLTE2NjIsMTcgKzE2NTQsNiBAQCBKU1ZhbHVl
KiBMb2NhdGlvblByb3RvRnVuY1RvU3RyaW5nOjpjYWxsCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
CiAKLVBhdXNlZFRpbWVvdXRzOjp+UGF1c2VkVGltZW91dHMoKQotewotICAgIFBhdXNlZFRpbWVv
dXQqIGFycmF5ID0gbV9hcnJheTsKLSAgICBpZiAoIWFycmF5KQotICAgICAgICByZXR1cm47Ci0g
ICAgc2l6ZV90IGNvdW50ID0gbV9sZW5ndGg7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0g
Y291bnQ7ICsraSkKLSAgICAgICAgZGVsZXRlIGFycmF5W2ldLmFjdGlvbjsKLSAgICBkZWxldGUg
W10gYXJyYXk7Ci19Ci0KIHZvaWQgRE9NV2luZG93VGltZXI6OmZpcmVkKCkKIHsKICAgICB0aW1l
ck5lc3RpbmdMZXZlbCA9IG1fbmVzdGluZ0xldmVsOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9q
cy9ranNfd2luZG93LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2lu
ZG93LmgJKHJldmlzaW9uIDI4Nzc2KQorKysgV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93
LmgJKHdvcmtpbmcgY29weSkKQEAgLTMzLDM3ICszMywxOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAgICAgY2xhc3MgRnJhbWU7CiAgICAgY2xhc3MgSlNFdmVudExpc3RlbmVyOwogICAgIGNsYXNz
IEpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyOworICAgIGNsYXNzIFBhdXNlZFRpbWVvdXRzOwog
fQogCiBuYW1lc3BhY2UgS0pTIHsKIAogICAgIGNsYXNzIERPTVdpbmRvd1RpbWVyOwogICAgIGNs
YXNzIExvY2F0aW9uOwotICAgIGNsYXNzIFBhdXNlZFRpbWVvdXQ7CiAgICAgY2xhc3MgU2NoZWR1
bGVkQWN0aW9uOwogICAgIGNsYXNzIFdpbmRvdzsKICAgICBjbGFzcyBXaW5kb3dGdW5jOwogICAg
IGNsYXNzIFdpbmRvd1ByaXZhdGU7CiAKLSAgICBjbGFzcyBQYXVzZWRUaW1lb3V0cyA6IE5vbmNv
cHlhYmxlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFBhdXNlZFRpbWVvdXRzKFBhdXNlZFRpbWVv
dXQqIGFycmF5LCBzaXplX3QgbGVuZ3RoKQotICAgICAgICAgICAgOiBtX2FycmF5KGFycmF5KQot
ICAgICAgICAgICAgLCBtX2xlbmd0aChsZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0g
ICAgICAgIH5QYXVzZWRUaW1lb3V0cygpOwotCi0gICAgICAgIHNpemVfdCBudW1UaW1lb3V0cygp
IGNvbnN0IHsgcmV0dXJuIG1fbGVuZ3RoOyB9Ci0gICAgICAgIFBhdXNlZFRpbWVvdXQqIHRha2VU
aW1lb3V0cygpIHsgUGF1c2VkVGltZW91dCogYSA9IG1fYXJyYXk7IG1fYXJyYXkgPSAwOyByZXR1
cm4gYTsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgUGF1c2VkVGltZW91dCogbV9hcnJheTsK
LSAgICAgICAgc2l6ZV90IG1fbGVuZ3RoOwotICAgIH07Ci0KLQogICAvLyBUaGlzIGlzIHRoZSBv
bmx5IFdlYkNvcmUgSlMgYmluZGluZyB3aGljaCBkb2VzIG5vdCBpbmhlcml0IGZyb20gRE9NT2Jq
ZWN0CiAgIGNsYXNzIFdpbmRvdyA6IHB1YmxpYyBKU0dsb2JhbE9iamVjdCB7CiAgICAgZnJpZW5k
IGNsYXNzIExvY2F0aW9uOwpAQCAtOTksOCArODAsOCBAQCBuYW1lc3BhY2UgS0pTIHsKICAgICBp
bnQgaW5zdGFsbFRpbWVvdXQoY29uc3QgVVN0cmluZyYgaGFuZGxlciwgaW50IHQsIGJvb2wgc2lu
Z2xlU2hvdCk7CiAgICAgaW50IGluc3RhbGxUaW1lb3V0KEpTVmFsdWUqIGZ1bmN0aW9uLCBjb25z
dCBMaXN0JiBhcmdzLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90KTsKICAgICB2b2lkIGNsZWFyVGlt
ZW91dChpbnQgdGltZXJJZCwgYm9vbCBkZWxBY3Rpb24gPSB0cnVlKTsKLSAgICBQYXVzZWRUaW1l
b3V0cyogcGF1c2VUaW1lb3V0cygpOwotICAgIHZvaWQgcmVzdW1lVGltZW91dHMoUGF1c2VkVGlt
ZW91dHMqKTsKKyAgICBXZWJDb3JlOjpQYXVzZWRUaW1lb3V0cyogcGF1c2VUaW1lb3V0cygpOwor
ICAgIHZvaWQgcmVzdW1lVGltZW91dHMoV2ViQ29yZTo6UGF1c2VkVGltZW91dHMqKTsKIAogICAg
IHZvaWQgdGltZXJGaXJlZChET01XaW5kb3dUaW1lciopOwogCkluZGV4OiBXZWJDb3JlL2hpc3Rv
cnkvQ2FjaGVkUGFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9oaXN0b3J5L0NhY2hlZFBh
Z2UuY3BwCShyZXZpc2lvbiAyODc3NikKKysrIFdlYkNvcmUvaGlzdG9yeS9DYWNoZWRQYWdlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgIkdDQ29udHJvbGxl
ci5oIgogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAi
UGF1c2VkVGltZW91dHMuaCIKICNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCiAjaWYgRU5BQkxFKFNW
RykKICNpbmNsdWRlICJTVkdEb2N1bWVudEV4dGVuc2lvbnMuaCIKQEAgLTQ1LDcgKzQ2LDYgQEAK
IAogI2luY2x1ZGUgImtqc19wcm94eS5oIgogI2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNpbmNs
dWRlICJranNfd2luZG93LmgiCiAjaW5jbHVkZSA8a2pzL0pTTG9jay5oPgogI2luY2x1ZGUgPGtq
cy9TYXZlZEJ1aWx0aW5zLmg+CiAjaW5jbHVkZSA8a2pzL3Byb3BlcnR5X21hcC5oPgpJbmRleDog
V2ViQ29yZS9oaXN0b3J5L0NhY2hlZFBhZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2hpc3Rv
cnkvQ2FjaGVkUGFnZS5oCShyZXZpc2lvbiAyODc3NikKKysrIFdlYkNvcmUvaGlzdG9yeS9DYWNo
ZWRQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM5LDcgKzM5LDYgQEAgdHlwZWRlZiBzdHJ1Y3Qg
b2JqY19vYmplY3QqIGlkOwogCiBuYW1lc3BhY2UgS0pTIHsKICAgICAKLSAgICBjbGFzcyBQYXVz
ZWRUaW1lb3V0czsKICAgICBjbGFzcyBTYXZlZEJ1aWx0aW5zOwogICAgIGNsYXNzIFNhdmVkUHJv
cGVydGllczsKIH0KQEAgLTUxLDYgKzUwLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIGNs
YXNzIEZyYW1lVmlldzsKICAgICBjbGFzcyBOb2RlOwogICAgIGNsYXNzIFBhZ2U7CisgICAgY2xh
c3MgUGF1c2VkVGltZW91dHM7CiAKIGNsYXNzIENhY2hlZFBhZ2UgOiBwdWJsaWMgUmVmQ291bnRl
ZDxDYWNoZWRQYWdlPiB7CiBwdWJsaWM6CkBAIC04NCw3ICs4NCw3IEBAIHByaXZhdGU6CiAgICAg
T3duUHRyPEtKUzo6U2F2ZWRQcm9wZXJ0aWVzPiBtX3dpbmRvd1Byb3BlcnRpZXM7CiAgICAgT3du
UHRyPEtKUzo6U2F2ZWRQcm9wZXJ0aWVzPiBtX2xvY2F0aW9uUHJvcGVydGllczsKICAgICBPd25Q
dHI8S0pTOjpTYXZlZEJ1aWx0aW5zPiBtX3dpbmRvd0J1aWx0aW5zOwotICAgIE93blB0cjxLSlM6
OlBhdXNlZFRpbWVvdXRzPiBtX3BhdXNlZFRpbWVvdXRzOworICAgIE93blB0cjxQYXVzZWRUaW1l
b3V0cz4gbV9wYXVzZWRUaW1lb3V0czsKICAgICBPd25QdHI8Q2FjaGVkUGFnZVBsYXRmb3JtRGF0
YT4gbV9jYWNoZWRQYWdlUGxhdGZvcm1EYXRhOwogfTsKIApJbmRleDogV2ViQ29yZS9wYWdlL0No
cm9tZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL0Nocm9tZS5jcHAJKHJldmlzaW9u
IDI4Nzc2KQorKysgV2ViQ29yZS9wYWdlL0Nocm9tZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2
LDYgKzM2LDcgQEAKICNpbmNsdWRlICJTZXR0aW5ncy5oIgogI2luY2x1ZGUgIldpbmRvd0ZlYXR1
cmVzLmgiCiAjaW5jbHVkZSAia2pzX3dpbmRvdy5oIgorI2luY2x1ZGUgIlBhdXNlZFRpbWVvdXRz
LmgiCiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgpAQCAtNDMsNyArNDQsNiBAQAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotdXNpbmcgbmFtZXNwYWNlIEtK
UzsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIGNsYXNzIFBhZ2VHcm91cExvYWREZWZlcnJlciA6
IE5vbmNvcHlhYmxlIHsK
</data>
<flag name="review"
          id="7770"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17943</attachid>
            <date>2007-12-16 16:48:11 -0800</date>
            <delta_ts>2007-12-16 19:26:52 -0800</delta_ts>
            <desc>move ScheduledAction</desc>
            <filename>ScheduledAction.diff</filename>
            <type>text/plain</type>
            <size>150288</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyODc4MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzEgQEAKKzIwMDctMTItMTYgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBZZXQgbW9y
ZSBvZiBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM4NQorICAgICAg
ICBDbGVhbnVwIGtqc193aW5kb3cKKworICAgICAgICAtIE1vdmUgU2NoZWR1bGVkQWN0aW9uIGlu
dG8gaXRzIG93biBmaWxlIGFuZCBwdXQgaXQgaW4gdGhlIFdlYkNvcmUgbmFtZXNwYWNlLgorCisg
ICAgICAgICogV2ViQ29yZS5wcm86CisgICAgICAgICogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52
Y3Byb2o6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAg
ICAgICAqIFdlYkNvcmVTb3VyY2VzLmJrbDoKKyAgICAgICAgKiBiaW5kaW5ncy9qcy9QYXVzZWRU
aW1lb3V0cy5jcHA6CisgICAgICAgICogYmluZGluZ3MvanMvUGF1c2VkVGltZW91dHMuaDoKKyAg
ICAgICAgKiBiaW5kaW5ncy9qcy9TY2hlZHVsZWRBY3Rpb24uY3BwOiBDb3BpZWQgZnJvbSBiaW5k
aW5ncy9qcy9ranNfd2luZG93LmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlv
bjo6U2NoZWR1bGVkQWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlvbjo6
ZXhlY3V0ZSk6CisgICAgICAgICogYmluZGluZ3MvanMvU2NoZWR1bGVkQWN0aW9uLmg6IENvcGll
ZCBmcm9tIGJpbmRpbmdzL2pzL2tqc193aW5kb3cuaC4KKyAgICAgICAgKFdlYkNvcmU6OlNjaGVk
dWxlZEFjdGlvbjo6U2NoZWR1bGVkQWN0aW9uKToKKyAgICAgICAgKiBiaW5kaW5ncy9qcy9ranNf
d2luZG93LmNwcDoKKyAgICAgICAgKEtKUzo6RE9NV2luZG93VGltZXI6OkRPTVdpbmRvd1RpbWVy
KToKKyAgICAgICAgKEtKUzo6RE9NV2luZG93VGltZXI6OmFjdGlvbik6CisgICAgICAgIChLSlM6
OkRPTVdpbmRvd1RpbWVyOjp0YWtlQWN0aW9uKToKKyAgICAgICAgKEtKUzo6V2luZG93OjppbnN0
YWxsVGltZW91dCk6CisgICAgICAgIChLSlM6OldpbmRvdzo6dGltZXJGaXJlZCk6CisgICAgICAg
ICogYmluZGluZ3MvanMva2pzX3dpbmRvdy5oOgorCiAyMDA3LTEyLTE2ICBTYW0gV2VpbmlnICA8
c2FtQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4uCkluZGV4OiBXZWJD
b3JlL1dlYkNvcmUucHJvCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHJldmlz
aW9uIDI4Nzc5KQorKysgV2ViQ29yZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtNDE5
LDYgKzQxOSw3IEBAIFNPVVJDRVMgKz0gXAogICAgIGJpbmRpbmdzL2pzL2tqc19wcm94eS5jcHAg
XAogICAgIGJpbmRpbmdzL2pzL2tqc193aW5kb3cuY3BwIFwKICAgICBiaW5kaW5ncy9qcy9QYXVz
ZWRUaW1lb3V0cy5jcHAgXAorICAgIGJpbmRpbmdzL2pzL1NjaGVkdWxlZEFjdGlvbi5jcHAgXAog
ICAgIGNzcy9DU1NCb3JkZXJJbWFnZVZhbHVlLmNwcCBcCiAgICAgY3NzL0NTU0NoYXJzZXRSdWxl
LmNwcCBcCiAgICAgY3NzL0NTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHAgXApJbmRleDog
V2ViQ29yZS9XZWJDb3JlU291cmNlcy5ia2wKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3Jl
U291cmNlcy5ia2wJKHJldmlzaW9uIDI4Nzc5KQorKysgV2ViQ29yZS9XZWJDb3JlU291cmNlcy5i
a2wJKHdvcmtpbmcgY29weSkKQEAgLTkzLDYgKzkzLDcgQEAgVGhpcyBmaWxlIGNvbnRhaW5zIHRo
ZSBsaXN0IG9mIGZpbGVzIG5lZQogICAgICAgICBiaW5kaW5ncy9qcy9ranNfcHJveHkuY3BwCiAg
ICAgICAgIGJpbmRpbmdzL2pzL2tqc193aW5kb3cuY3BwCiAgICAgICAgIGJpbmRpbmdzL2pzL1Bh
dXNlZFRpbWVvdXRzLmNwcAorICAgICAgICBiaW5kaW5ncy9qcy9TY2hlZHVsZWRBY3Rpb24uY3Bw
CiAgICAgPC9zZXQ+CiAgICAgCiAgICAgPHNldCBhcHBlbmQ9IjEiIHZhcj0iV0VCQ09SRV9TT1VS
Q0VTX0NTUyI+CkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlz
aW9uIDI4Nzc5KQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29y
a2luZyBjb3B5KQpAQCAtNzY1NSw2ICs3NjU1LDE0IEBACiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5c
YmluZGluZ3NcanNcUGF1c2VkVGltZW91dHMuaCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KKwkJ
CQk8RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxiaW5kaW5nc1xqc1xTY2hlZHVsZWRBY3Rp
b24uY3BwIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXGJpbmRpbmdzXGpzXFNjaGVkdWxlZEFjdGlvbi5oIg0KKwkJCQkJPg0KKwkJCQk8
L0ZpbGU+DQogCQkJPC9GaWx0ZXI+DQogCQk8L0ZpbHRlcj4NCiAJCTxGaWx0ZXINCkluZGV4OiBX
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjg3Nzkp
CisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBj
b3B5KQpAQCAtMzY0NCw2ICszNjQ0LDggQEAKIAkJQkNBMTY5QTMwQkZENTVCNDAwMTlDQTc2IC8q
IEpTSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEJDQTE2OUExMEJGRDU1QjQwMDE5Q0E3NiAvKiBKU0hUTUxUYWJs
ZUNhcHRpb25FbGVtZW50LmggKi87IH07CiAJCUJDQTM3ODE2MEQxNUM2NDYwMEI3OTNENiAvKiBQ
YXVzZWRUaW1lb3V0cy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBCQ0EzNzgxNDBEMTVDNjQ2MDBCNzkzRDYgLyogUGF1c2VkVGltZW91dHMuY3BwICov
OyB9OwogCQlCQ0EzNzgxNzBEMTVDNjQ2MDBCNzkzRDYgLyogUGF1c2VkVGltZW91dHMuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDQTM3ODE1MEQxNUM2
NDYwMEI3OTNENiAvKiBQYXVzZWRUaW1lb3V0cy5oICovOyB9OworCQlCQ0EzNzhCQzBEMTVGNjQy
MDBCNzkzRDYgLyogU2NoZWR1bGVkQWN0aW9uLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDQTM3OEJBMEQxNUY2NDIwMEI3OTNENiAvKiBTY2hlZHVs
ZWRBY3Rpb24uY3BwICovOyB9OworCQlCQ0EzNzhCRDBEMTVGNjQyMDBCNzkzRDYgLyogU2NoZWR1
bGVkQWN0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBCQ0EzNzhCQjBEMTVGNjQyMDBCNzkzRDYgLyogU2NoZWR1bGVkQWN0aW9uLmggKi87IH07CiAJ
CUJDQTg1QTEwMEMzQUVBRjQwMDZGODMwOCAvKiBET01TVkdOdW1iZXJJbnRlcm5hbC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNBODVBMEYwQzNBRUFG
NDAwNkY4MzA4IC8qIERPTVNWR051bWJlckludGVybmFsLmggKi87IH07CiAJCUJDQUE5MEMzMEE3
RUJBNjAwMDhCMTIyOSAvKiBTY3JvbGxCYXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkNBQTkwQzIwQTdFQkE2MDAwOEIxMjI5IC8qIFNjcm9sbEJh
ci5jcHAgKi87IH07CiAJCUJDQjE2QjhCMDk3OUIwMTQwMDQ2Nzc0MSAvKiBEZXByZWNhdGVkQXJy
YXkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDQjE2
Qjg4MDk3OUIwMTQwMDQ2Nzc0MSAvKiBEZXByZWNhdGVkQXJyYXkuaCAqLzsgc2V0dGluZ3MgPSB7
QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAtNzY1NSw2ICs3NjU3LDggQEAKIAkJ
QkNBMTY5QTEwQkZENTVCNDAwMTlDQTc2IC8qIEpTSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTSFRNTFRhYmxlQ2FwdGlvbkVsZW1l
bnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNBMzc4MTQwRDE1QzY0NjAwQjc5
M0Q2IC8qIFBhdXNlZFRpbWVvdXRzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IFBhdXNlZFRpbWVvdXRzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
QkNBMzc4MTUwRDE1QzY0NjAwQjc5M0Q2IC8qIFBhdXNlZFRpbWVvdXRzLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBhdXNlZFRpbWVvdXRzLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCUJDQTM3OEJBMEQxNUY2NDIwMEI3OTNENiAvKiBTY2hlZHVsZWRBY3Rpb24u
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU2NoZWR1bGVkQWN0aW9u
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQkNBMzc4QkIwRDE1RjY0MjAwQjc5
M0Q2IC8qIFNjaGVkdWxlZEFjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBTY2hlZHVsZWRBY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNBODVB
MEYwQzNBRUFGNDAwNkY4MzA4IC8qIERPTVNWR051bWJlckludGVybmFsLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBET01TVkdOdW1iZXJJbnRlcm5hbC5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQlCQ0FBOTBDMjBBN0VCQTYwMDA4QjEyMjkgLyogU2Nyb2xsQmFy
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBTY3JvbGxCYXIuY3Bw
OyBwYXRoID0gcGxhdGZvcm0vU2Nyb2xsQmFyLmNwcDsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09U
OyB9OwogCQlCQ0IxNkI4ODA5NzlCMDE0MDA0Njc3NDEgLyogRGVwcmVjYXRlZEFycmF5LmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBEZXByZWNhdGVkQXJyYXkuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTExNDEwLDYgKzExNDE0LDggQEAKIAkJCQk5M0I3MEQ1
QTA5RUIwQzdDMDA5RDg0NjggLyoga2pzX3dpbmRvdy5oICovLAogCQkJCUJDQTM3ODE0MEQxNUM2
NDYwMEI3OTNENiAvKiBQYXVzZWRUaW1lb3V0cy5jcHAgKi8sCiAJCQkJQkNBMzc4MTUwRDE1QzY0
NjAwQjc5M0Q2IC8qIFBhdXNlZFRpbWVvdXRzLmggKi8sCisJCQkJQkNBMzc4QkEwRDE1RjY0MjAw
Qjc5M0Q2IC8qIFNjaGVkdWxlZEFjdGlvbi5jcHAgKi8sCisJCQkJQkNBMzc4QkIwRDE1RjY0MjAw
Qjc5M0Q2IC8qIFNjaGVkdWxlZEFjdGlvbi5oICovLAogCQkJKTsKIAkJCXBhdGggPSBqczsKIAkJ
CXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC0xNDEwNyw2ICsxNDExMyw3IEBACiAJCQkJQkM0
QkY5RTUwRDExRTEzMzAwN0QyNDdGIC8qIENsYXNzTmFtZXMuaCBpbiBIZWFkZXJzICovLAogCQkJ
CUIyOEJDMzFBMEQxMzVFNTQwMENEQkEyNyAvKiBKU0V2ZW50VGFyZ2V0QmFzZS5sdXQuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUJDQTM3ODE3MEQxNUM2NDYwMEI3OTNENiAvKiBQYXVzZWRUaW1lb3V0
cy5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkNBMzc4QkQwRDE1RjY0MjAwQjc5M0Q2IC8qIFNjaGVk
dWxlZEFjdGlvbi5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1l
bnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xNTgyMCw2ICsxNTgyNyw3IEBACiAJCQkJ
QkM5MDRCNzYwRDEwOTk4RjAwNjgwRDMyIC8qIENsYXNzTm9kZUxpc3QuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJQkM0QkY5RTQwRDExRTEzMzAwN0QyNDdGIC8qIENsYXNzTmFtZXMuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJQkNBMzc4MTYwRDE1QzY0NjAwQjc5M0Q2IC8qIFBhdXNlZFRpbWVvdXRz
LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUJDQTM3OEJDMEQxNUY2NDIwMEI3OTNENiAvKiBTY2hl
ZHVsZWRBY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxv
eW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pz
L1BhdXNlZFRpbWVvdXRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL1Bh
dXNlZFRpbWVvdXRzLmNwcAkocmV2aXNpb24gMjg3NzkpCisrKyBXZWJDb3JlL2JpbmRpbmdzL2pz
L1BhdXNlZFRpbWVvdXRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2lu
Y2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlBhdXNlZFRpbWVvdXRzLmgiCiAKLSNpbmNsdWRl
ICJranNfd2luZG93LmgiCisjaW5jbHVkZSAiU2NoZWR1bGVkQWN0aW9uLmgiCiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9qcy9QYXVzZWRUaW1lb3V0cy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvanMvUGF1c2VkVGltZW91dHMuaAkocmV2
aXNpb24gMjg3NzkpCisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL1BhdXNlZFRpbWVvdXRzLmgJKHdv
cmtpbmcgY29weSkKQEAgLTIyLDE4ICsyMiwxNiBAQAogCiAjaW5jbHVkZSA8d3RmL05vbmNvcHlh
YmxlLmg+CiAKLW5hbWVzcGFjZSBLSlMgewotICAgIGNsYXNzIFNjaGVkdWxlZEFjdGlvbjsKLX0K
LQogbmFtZXNwYWNlIFdlYkNvcmUgewogCisgICAgY2xhc3MgU2NoZWR1bGVkQWN0aW9uOworCiAg
ICAgc3RydWN0IFBhdXNlZFRpbWVvdXQgewogICAgICAgICBpbnQgdGltZW91dElkOwogICAgICAg
ICBpbnQgbmVzdGluZ0xldmVsOwogICAgICAgICBkb3VibGUgbmV4dEZpcmVJbnRlcnZhbDsKICAg
ICAgICAgZG91YmxlIHJlcGVhdEludGVydmFsOwotICAgICAgICBLSlM6OlNjaGVkdWxlZEFjdGlv
biogYWN0aW9uOworICAgICAgICBTY2hlZHVsZWRBY3Rpb24qIGFjdGlvbjsKICAgICB9OwogCiAg
ICAgY2xhc3MgUGF1c2VkVGltZW91dHMgOiBOb25jb3B5YWJsZSB7CkluZGV4OiBXZWJDb3JlL2Jp
bmRpbmdzL2pzL1NjaGVkdWxlZEFjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5k
aW5ncy9qcy9TY2hlZHVsZWRBY3Rpb24uY3BwCShyZXZpc2lvbiAyODc3OSkJKGZyb20gV2ViQ29y
ZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmNwcDoyODc3OSkKKysrIFdlYkNvcmUvYmluZGluZ3Mv
anMvU2NoZWR1bGVkQWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2ODAgQEAK
Ky8vIC0qLSBjLWJhc2ljLW9mZnNldDogNCAtKi0KKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAw
IEhhcnJpIFBvcnRlbiAocG9ydGVuQGtkZS5vcmcpCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEpv
biBTaGllciAoanNoaWVyQGlhc3RhdGUuZWR1KQorICogIENvcHlyaWdodCAoQykgMjAwMywgMjAw
NCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXZlZC4KKyAqICBD
b3B5cmlnaHQgKEMpIDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAd2Via2l0Lm9yZykKKyAq
CisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICog
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rv
biwgTUEgIDAyMTEwLTEzMDEKKyAqICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAia2pzX3dpbmRvdy5oIgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAi
Q1N0cmluZy5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgor
I2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJFdmVudExpc3RlbmVyLmgiCisjaW5jbHVk
ZSAiRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlICJG
bG9hdFJlY3QuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZFJlcXVl
c3QuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgorI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgor
I2luY2x1ZGUgIkdDQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgorI2lu
Y2x1ZGUgIkpTRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IuaCIKKyNpbmNsdWRlICJKU0RPTVdpbmRv
dy5oIgorI2luY2x1ZGUgIkpTRXZlbnQuaCIKKyNpbmNsdWRlICJKU0hUTUxBdWRpb0VsZW1lbnRD
b25zdHJ1Y3Rvci5oIgorI2luY2x1ZGUgIkpTSFRNTENvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJK
U0hUTUxPcHRpb25FbGVtZW50Q29uc3RydWN0b3IuaCIKKyNpbmNsdWRlICJKU1hNTEh0dHBSZXF1
ZXN0LmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRl
ICJQYXVzZWRUaW1lb3V0cy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU2NyZWVuLmgiCisjaW5jbHVk
ZSAiUGx1Z0luSW5mb1N0b3JlLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUg
IlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJXaW5k
b3dGZWF0dXJlcy5oIgorI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAia2pzX2Nz
cy5oIgorI2luY2x1ZGUgImtqc19ldmVudHMuaCIKKyNpbmNsdWRlICJranNfbmF2aWdhdG9yLmgi
CisjaW5jbHVkZSAia2pzX3Byb3h5LmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKwor
I2lmIEVOQUJMRShYU0xUKQorI2luY2x1ZGUgIkpTWFNMVFByb2Nlc3Nvci5oIgorI2VuZGlmCisK
K3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CisK
K25hbWVzcGFjZSBLSlMgeworCitzdGF0aWMgaW50IGxhc3RVc2VkVGltZW91dElkOworCitzdGF0
aWMgaW50IHRpbWVyTmVzdGluZ0xldmVsID0gMDsKK2NvbnN0IGludCBjTWF4VGltZXJOZXN0aW5n
TGV2ZWwgPSA1OworY29uc3QgZG91YmxlIGNNaW5pbXVtVGltZXJJbnRlcnZhbCA9IDAuMDEwOwor
CitzdHJ1Y3QgV2luZG93UHJpdmF0ZSB7CisgICAgV2luZG93UHJpdmF0ZSgpCisgICAgICAgIDog
bG9jKDApCisgICAgICAgICwgbV9ldnQoMCkKKyAgICAgICAgLCBtX3JldHVyblZhbHVlU2xvdCgw
KQorICAgIHsKKyAgICB9CisKKyAgICBXaW5kb3c6Okxpc3RlbmVyc01hcCBqc0V2ZW50TGlzdGVu
ZXJzOworICAgIFdpbmRvdzo6TGlzdGVuZXJzTWFwIGpzSFRNTEV2ZW50TGlzdGVuZXJzOworICAg
IFdpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAganNVbnByb3RlY3RlZEV2ZW50TGlzdGVu
ZXJzOworICAgIFdpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAganNVbnByb3RlY3RlZEhU
TUxFdmVudExpc3RlbmVyczsKKyAgICBtdXRhYmxlIExvY2F0aW9uKiBsb2M7CisgICAgV2ViQ29y
ZTo6RXZlbnQqIG1fZXZ0OworICAgIEpTVmFsdWUqKiBtX3JldHVyblZhbHVlU2xvdDsKKworICAg
IHR5cGVkZWYgSGFzaE1hcDxpbnQsIERPTVdpbmRvd1RpbWVyKj4gVGltZW91dHNNYXA7CisgICAg
VGltZW91dHNNYXAgbV90aW1lb3V0czsKK307CisKK2NsYXNzIERPTVdpbmRvd1RpbWVyIDogcHVi
bGljIFRpbWVyQmFzZSB7CitwdWJsaWM6CisgICAgRE9NV2luZG93VGltZXIoaW50IHRpbWVvdXRJ
ZCwgaW50IG5lc3RpbmdMZXZlbCwgV2luZG93KiBvYmplY3QsIFNjaGVkdWxlZEFjdGlvbiogYWN0
aW9uKQorICAgICAgICA6IG1fdGltZW91dElkKHRpbWVvdXRJZCkKKyAgICAgICAgLCBtX25lc3Rp
bmdMZXZlbChuZXN0aW5nTGV2ZWwpCisgICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQorICAgICAg
ICAsIG1fYWN0aW9uKGFjdGlvbikKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB+RE9NV2lu
ZG93VGltZXIoKQorICAgIHsKKyAgICAgICAgSlNMb2NrIGxvY2s7CisgICAgICAgIGRlbGV0ZSBt
X2FjdGlvbjsKKyAgICB9CisKKyAgICBpbnQgdGltZW91dElkKCkgY29uc3QgeyByZXR1cm4gbV90
aW1lb3V0SWQ7IH0KKworICAgIGludCBuZXN0aW5nTGV2ZWwoKSBjb25zdCB7IHJldHVybiBtX25l
c3RpbmdMZXZlbDsgfQorICAgIHZvaWQgc2V0TmVzdGluZ0xldmVsKGludCBuKSB7IG1fbmVzdGlu
Z0xldmVsID0gbjsgfQorCisgICAgU2NoZWR1bGVkQWN0aW9uKiBhY3Rpb24oKSBjb25zdCB7IHJl
dHVybiBtX2FjdGlvbjsgfQorICAgIFNjaGVkdWxlZEFjdGlvbiogdGFrZUFjdGlvbigpIHsgU2No
ZWR1bGVkQWN0aW9uKiBhID0gbV9hY3Rpb247IG1fYWN0aW9uID0gMDsgcmV0dXJuIGE7IH0KKwor
cHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgZmlyZWQoKTsKKworICAgIGludCBtX3RpbWVvdXRJ
ZDsKKyAgICBpbnQgbV9uZXN0aW5nTGV2ZWw7CisgICAgV2luZG93KiBtX29iamVjdDsKKyAgICBT
Y2hlZHVsZWRBY3Rpb24qIG1fYWN0aW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgS0pTCisKKyNp
bmNsdWRlICJranNfd2luZG93Lmx1dC5oIgorCituYW1lc3BhY2UgS0pTIHsKKworLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLyBXaW5kb3cgT2JqZWN0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitj
b25zdCBDbGFzc0luZm8gV2luZG93OjppbmZvID0geyAiV2luZG93IiwgMCwgJldpbmRvd1RhYmxl
IH07CisKKy8qCitAYmVnaW4gV2luZG93VGFibGUgMTE4CisjIFdhcm5pbmcsIHdoZW4gYWRkaW5n
IGEgZnVuY3Rpb24gdG8gdGhpcyBvYmplY3QgeW91IG5lZWQgdG8gYWRkIGEgY2FzZSBpbiBXaW5k
b3c6OmdldAorIyAtLSBGdW5jdGlvbnMgLS0KKyAgYXRvYiAgICAgICAgICAgICAgICAgICZXaW5k
b3dQcm90b0Z1bmNBVG9COjpjcmVhdGUgICAgICAgICAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlv
biAxCisgIGJ0b2EgICAgICAgICAgICAgICAgICAmV2luZG93UHJvdG9GdW5jQlRvQTo6Y3JlYXRl
ICAgICAgICAgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQorICBvcGVuICAgICAgICAgICAg
ICAgICAgJldpbmRvd1Byb3RvRnVuY09wZW46OmNyZWF0ZSAgICAgICAgICAgICAgICBEb250RGVs
ZXRlfEZ1bmN0aW9uIDMKKyAgc2V0VGltZW91dCAgICAgICAgICAgICZXaW5kb3dQcm90b0Z1bmNT
ZXRUaW1lb3V0OjpjcmVhdGUgICAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAyCisgIGNsZWFy
VGltZW91dCAgICAgICAgICAmV2luZG93UHJvdG9GdW5jQ2xlYXJUaW1lb3V0OjpjcmVhdGUgICAg
ICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQorICBzZXRJbnRlcnZhbCAgICAgICAgICAgJldpbmRv
d1Byb3RvRnVuY1NldEludGVydmFsOjpjcmVhdGUgICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9u
IDIKKyAgY2xlYXJJbnRlcnZhbCAgICAgICAgICZXaW5kb3dQcm90b0Z1bmNDbGVhclRpbWVvdXQ6
OmNyZWF0ZSAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAxCisgIGFkZEV2ZW50TGlzdGVuZXIg
ICAgICAmV2luZG93UHJvdG9GdW5jQWRkRXZlbnRMaXN0ZW5lcjo6Y3JlYXRlICAgIERvbnREZWxl
dGV8RnVuY3Rpb24gMworICByZW1vdmVFdmVudExpc3RlbmVyICAgJldpbmRvd1Byb3RvRnVuY1Jl
bW92ZUV2ZW50TGlzdGVuZXI6OmNyZWF0ZSBEb250RGVsZXRlfEZ1bmN0aW9uIDMKKyAgc2hvd01v
ZGFsRGlhbG9nICAgICAgICZXaW5kb3dQcm90b0Z1bmNTaG93TW9kYWxEaWFsb2c6OmNyZWF0ZSAg
ICAgRG9udERlbGV0ZXxGdW5jdGlvbiAxCisjIE5vdCBpbXBsZW1lbnRlZAorICBjYXB0dXJlRXZl
bnRzICAgICAgICAgJldpbmRvd1Byb3RvRnVuY05vdEltcGxlbWVudGVkOjpjcmVhdGUgICAgICBE
b250RGVsZXRlfEZ1bmN0aW9uIDAKKyAgcmVsZWFzZUV2ZW50cyAgICAgICAgICZXaW5kb3dQcm90
b0Z1bmNOb3RJbXBsZW1lbnRlZDo6Y3JlYXRlICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAwCisK
KyMgLS0gQXR0cmlidXRlcyAtLQorICBjcnlwdG8gICAgICAgICAgICAgICAgV2luZG93OjpDcnlw
dG8gICAgICAgICAgICAgIERvbnREZWxldGV8UmVhZE9ubHkKKyAgZXZlbnQgICAgICAgICAgICAg
ICAgIFdpbmRvdzo6RXZlbnRfICAgICAgICAgICAgICBEb250RGVsZXRlCisgIGxvY2F0aW9uICAg
ICAgICAgICAgICBXaW5kb3c6OkxvY2F0aW9uXyAgICAgICAgICAgRG9udERlbGV0ZQorICBuYXZp
Z2F0b3IgICAgICAgICAgICAgV2luZG93OjpOYXZpZ2F0b3JfICAgICAgICAgIERvbnREZWxldGV8
UmVhZE9ubHkKKyAgY2xpZW50SW5mb3JtYXRpb24gICAgIFdpbmRvdzo6Q2xpZW50SW5mb3JtYXRp
b24gICBEb250RGVsZXRlfFJlYWRPbmx5CisjIC0tIEV2ZW50IExpc3RlbmVycyAtLQorICBvbmFi
b3J0ICAgICAgICAgICAgICAgV2luZG93OjpPbmFib3J0ICAgICAgICAgICAgIERvbnREZWxldGUK
KyAgb25ibHVyICAgICAgICAgICAgICAgIFdpbmRvdzo6T25ibHVyICAgICAgICAgICAgICBEb250
RGVsZXRlCisgIG9uY2hhbmdlICAgICAgICAgICAgICBXaW5kb3c6Ok9uY2hhbmdlICAgICAgICAg
ICAgRG9udERlbGV0ZQorICBvbmNsaWNrICAgICAgICAgICAgICAgV2luZG93OjpPbmNsaWNrICAg
ICAgICAgICAgIERvbnREZWxldGUKKyAgb25kYmxjbGljayAgICAgICAgICAgIFdpbmRvdzo6T25k
YmxjbGljayAgICAgICAgICBEb250RGVsZXRlCisgIG9uZXJyb3IgICAgICAgICAgICAgICBXaW5k
b3c6Ok9uZXJyb3IgICAgICAgICAgICAgRG9udERlbGV0ZQorICBvbmZvY3VzICAgICAgICAgICAg
ICAgV2luZG93OjpPbmZvY3VzICAgICAgICAgICAgIERvbnREZWxldGUKKyAgb25rZXlkb3duICAg
ICAgICAgICAgIFdpbmRvdzo6T25rZXlkb3duICAgICAgICAgICBEb250RGVsZXRlCisgIG9ua2V5
cHJlc3MgICAgICAgICAgICBXaW5kb3c6Ok9ua2V5cHJlc3MgICAgICAgICAgRG9udERlbGV0ZQor
ICBvbmtleXVwICAgICAgICAgICAgICAgV2luZG93OjpPbmtleXVwICAgICAgICAgICAgIERvbnRE
ZWxldGUKKyAgb25sb2FkICAgICAgICAgICAgICAgIFdpbmRvdzo6T25sb2FkICAgICAgICAgICAg
ICBEb250RGVsZXRlCisgIG9ubW91c2Vkb3duICAgICAgICAgICBXaW5kb3c6Ok9ubW91c2Vkb3du
ICAgICAgICAgRG9udERlbGV0ZQorICBvbm1vdXNlbW92ZSAgICAgICAgICAgV2luZG93OjpPbm1v
dXNlbW92ZSAgICAgICAgIERvbnREZWxldGUKKyAgb25tb3VzZW91dCAgICAgICAgICAgIFdpbmRv
dzo6T25tb3VzZW91dCAgICAgICAgICBEb250RGVsZXRlCisgIG9ubW91c2VvdmVyICAgICAgICAg
ICBXaW5kb3c6Ok9ubW91c2VvdmVyICAgICAgICAgRG9udERlbGV0ZQorICBvbm1vdXNldXAgICAg
ICAgICAgICAgV2luZG93OjpPbm1vdXNldXAgICAgICAgICAgIERvbnREZWxldGUKKyAgb25tb3Vz
ZXdoZWVsICAgICAgICAgIFdpbmRvdzo6T25XaW5kb3dNb3VzZVdoZWVsICBEb250RGVsZXRlCisg
IG9ucmVzZXQgICAgICAgICAgICAgICBXaW5kb3c6Ok9ucmVzZXQgICAgICAgICAgICAgRG9udERl
bGV0ZQorICBvbnJlc2l6ZSAgICAgICAgICAgICAgV2luZG93OjpPbnJlc2l6ZSAgICAgICAgICAg
IERvbnREZWxldGUKKyAgb25zY3JvbGwgICAgICAgICAgICAgIFdpbmRvdzo6T25zY3JvbGwgICAg
ICAgICAgICBEb250RGVsZXRlCisgIG9uc2VhcmNoICAgICAgICAgICAgICBXaW5kb3c6Ok9uc2Vh
cmNoICAgICAgICAgICAgRG9udERlbGV0ZQorICBvbnNlbGVjdCAgICAgICAgICAgICAgV2luZG93
OjpPbnNlbGVjdCAgICAgICAgICAgIERvbnREZWxldGUKKyAgb25zdWJtaXQgICAgICAgICAgICAg
IFdpbmRvdzo6T25zdWJtaXQgICAgICAgICAgICBEb250RGVsZXRlCisgIG9udW5sb2FkICAgICAg
ICAgICAgICBXaW5kb3c6Ok9udW5sb2FkICAgICAgICAgICAgRG9udERlbGV0ZQorICBvbmJlZm9y
ZXVubG9hZCAgICAgICAgV2luZG93OjpPbmJlZm9yZXVubG9hZCAgICAgIERvbnREZWxldGUKKyMg
LS0gQ29uc3RydWN0b3JzIC0tCisgIEF1ZGlvICAgICAgICAgICAgICAgICBXaW5kb3c6OkF1ZGlv
ICAgICAgICAgICAgICAgRG9udERlbGV0ZQorICBET01FeGNlcHRpb24gICAgICAgICAgV2luZG93
OjpET01FeGNlcHRpb24gICAgICAgIERvbnREZWxldGUKKyAgSW1hZ2UgICAgICAgICAgICAgICAg
IFdpbmRvdzo6SW1hZ2UgICAgICAgICAgICAgICBEb250RGVsZXRlCisgIE9wdGlvbiAgICAgICAg
ICAgICAgICBXaW5kb3c6Ok9wdGlvbiAgICAgICAgICAgICAgRG9udERlbGV0ZQorICBYTUxIdHRw
UmVxdWVzdCAgICAgICAgV2luZG93OjpYTUxIdHRwUmVxdWVzdCAgICAgIERvbnREZWxldGUKKyAg
WFNMVFByb2Nlc3NvciAgICAgICAgIFdpbmRvdzo6WFNMVFByb2Nlc3Nvcl8gICAgICBEb250RGVs
ZXRlCitAZW5kCisqLworCitXaW5kb3c6OldpbmRvdyhET01XaW5kb3cqIHdpbmRvdykKKyAgICA6
IG1faW1wbCh3aW5kb3cpCisgICAgLCBkKG5ldyBXaW5kb3dQcml2YXRlKQoreworICAgIC8vIFdp
bmRvdyBkZXN0cnVjdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUgYmVjYXVzZSBvZgorICAgIC8vIHRo
ZSBub24tdGhyZWFkLXNhZmUgV2ViQ29yZSBzdHJ1Y3R1cmVzIGl0IHJlZmVyZW5jZXMuCisgICAg
Q29sbGVjdG9yOjpjb2xsZWN0T25NYWluVGhyZWFkT25seSh0aGlzKTsKKworICAgIC8vIFRpbWUg
aW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NyaXB0IHRpbWVvdXQgaGFuZGxlciBraWNrcyBp
bi4KKyAgICBzZXRUaW1lb3V0VGltZSgxMDAwMCk7Cit9CisKK1dpbmRvdzo6fldpbmRvdygpCit7
CisgICAgY2xlYXJBbGxUaW1lb3V0cygpOworCisgICAgLy8gQ2xlYXIgYW55IGJhY2twb2ludGVy
cyB0byB0aGUgd2luZG93CisKKyAgICBMaXN0ZW5lcnNNYXA6Oml0ZXJhdG9yIGkyID0gZC0+anNF
dmVudExpc3RlbmVycy5iZWdpbigpOworICAgIExpc3RlbmVyc01hcDo6aXRlcmF0b3IgZTIgPSBk
LT5qc0V2ZW50TGlzdGVuZXJzLmVuZCgpOworICAgIGZvciAoOyBpMiAhPSBlMjsgKytpMikKKyAg
ICAgICAgaTItPnNlY29uZC0+Y2xlYXJXaW5kb3dPYmooKTsKKyAgICBpMiA9IGQtPmpzSFRNTEV2
ZW50TGlzdGVuZXJzLmJlZ2luKCk7CisgICAgZTIgPSBkLT5qc0hUTUxFdmVudExpc3RlbmVycy5l
bmQoKTsKKyAgICBmb3IgKDsgaTIgIT0gZTI7ICsraTIpCisgICAgICAgIGkyLT5zZWNvbmQtPmNs
ZWFyV2luZG93T2JqKCk7CisKKyAgICBVbnByb3RlY3RlZExpc3RlbmVyc01hcDo6aXRlcmF0b3Ig
aTEgPSBkLT5qc1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICBVbnByb3Rl
Y3RlZExpc3RlbmVyc01hcDo6aXRlcmF0b3IgZTEgPSBkLT5qc1VucHJvdGVjdGVkRXZlbnRMaXN0
ZW5lcnMuZW5kKCk7CisgICAgZm9yICg7IGkxICE9IGUxOyArK2kxKQorICAgICAgICBpMS0+c2Vj
b25kLT5jbGVhcldpbmRvd09iaigpOworICAgIGkxID0gZC0+anNVbnByb3RlY3RlZEhUTUxFdmVu
dExpc3RlbmVycy5iZWdpbigpOworICAgIGUxID0gZC0+anNVbnByb3RlY3RlZEhUTUxFdmVudExp
c3RlbmVycy5lbmQoKTsKKyAgICBmb3IgKDsgaTEgIT0gZTE7ICsraTEpCisgICAgICAgIGkxLT5z
ZWNvbmQtPmNsZWFyV2luZG93T2JqKCk7Cit9CisKK1dpbmRvdyogV2luZG93OjpyZXRyaWV2ZVdp
bmRvdyhGcmFtZSogZnJhbWUpCit7CisgICAgSlNPYmplY3QqIG8gPSByZXRyaWV2ZShmcmFtZSkt
PmdldE9iamVjdCgpOworCisgICAgQVNTRVJUKG8gfHwgIWZyYW1lLT5zZXR0aW5ncygpIHx8ICFm
cmFtZS0+c2V0dGluZ3MoKS0+aXNKYXZhU2NyaXB0RW5hYmxlZCgpKTsKKyAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8V2luZG93Kj4obyk7Cit9CisKK1dpbmRvdyogV2luZG93OjpyZXRyaWV2ZUFjdGl2
ZShFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9
IGV4ZWMtPmR5bmFtaWNHbG9iYWxPYmplY3QoKTsKKyAgICBBU1NFUlQoZ2xvYmFsT2JqZWN0KTsK
KyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2luZG93Kj4oZ2xvYmFsT2JqZWN0KTsKK30KKworSlNW
YWx1ZSogV2luZG93OjpyZXRyaWV2ZShGcmFtZSogZnJhbWUpCit7CisgICAgQVNTRVJUKGZyYW1l
KTsKKyAgICBpZiAoS0pTUHJveHkqIHByb3h5ID0gZnJhbWUtPnNjcmlwdFByb3h5KCkpCisgICAg
ICAgIHJldHVybiBwcm94eS0+Z2xvYmFsT2JqZWN0KCk7IC8vIHRoZSBHbG9iYWwgb2JqZWN0IGlz
IHRoZSAid2luZG93IgorCisgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7IC8vIFRoaXMgY2FuIGhh
cHBlbiB3aXRoIEpTIGRpc2FibGVkIG9uIHRoZSBkb21haW4gb2YgdGhhdCB3aW5kb3cKK30KKwor
TG9jYXRpb24qIFdpbmRvdzo6bG9jYXRpb24oKSBjb25zdAoreworICAgIGlmICghZC0+bG9jKQor
ICAgICAgICBkLT5sb2MgPSBuZXcgTG9jYXRpb24oaW1wbCgpLT5mcmFtZSgpKTsKKyAgICByZXR1
cm4gZC0+bG9jOworfQorCisvLyByZWZlcmVuY2Ugb3VyIHNwZWNpYWwgb2JqZWN0cyBkdXJpbmcg
Z2FyYmFnZSBjb2xsZWN0aW9uCit2b2lkIFdpbmRvdzo6bWFyaygpCit7CisgICAgSlNHbG9iYWxP
YmplY3Q6Om1hcmsoKTsKKyAgICBpZiAoZC0+bG9jICYmICFkLT5sb2MtPm1hcmtlZCgpKQorICAg
ICAgICBkLT5sb2MtPm1hcmsoKTsKK30KKworc3RhdGljIGJvb2wgYWxsb3dQb3BVcChGcmFtZSog
ZnJhbWUpCit7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
IChmcmFtZS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCkpCisgICAgICAg
IHJldHVybiB0cnVlOworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGZyYW1lLT5zZXR0aW5ncygp
OworICAgIHJldHVybiBzZXR0aW5ncyAmJiBzZXR0aW5ncy0+SmF2YVNjcmlwdENhbk9wZW5XaW5k
b3dzQXV0b21hdGljYWxseSgpOworfQorCitzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4g
cGFyc2VNb2RhbERpYWxvZ0ZlYXR1cmVzKGNvbnN0IFN0cmluZyYgZmVhdHVyZXNBcmcpCit7Cisg
ICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwOworCisgICAgVmVjdG9yPFN0cmluZz4gZmVh
dHVyZXMgPSBmZWF0dXJlc0FyZy5zcGxpdCgnOycpOworICAgIFZlY3RvcjxTdHJpbmc+Ojpjb25z
dF9pdGVyYXRvciBlbmQgPSBmZWF0dXJlcy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZlYXR1cmVzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICBTdHJpbmcgcyA9ICppdDsKKyAgICAgICAgaW50IHBvcyA9IHMuZmluZCgnPScp
OworICAgICAgICBpbnQgY29sb25Qb3MgPSBzLmZpbmQoJzonKTsKKyAgICAgICAgaWYgKHBvcyA+
PSAwICYmIGNvbG9uUG9zID49IDApCisgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGFu
eSBzdHJpbmdzIHRoYXQgaGF2ZSBib3RoID0gYW5kIDoKKyAgICAgICAgaWYgKHBvcyA8IDApCisg
ICAgICAgICAgICBwb3MgPSBjb2xvblBvczsKKyAgICAgICAgaWYgKHBvcyA8IDApIHsKKyAgICAg
ICAgICAgIC8vIG51bGwgc3RyaW5nIGZvciB2YWx1ZSBtZWFucyBrZXkgd2l0aG91dCB2YWx1ZQor
ICAgICAgICAgICAgbWFwLnNldChzLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCksIFN0cmluZygp
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBzLmxlZnQocG9z
KS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpOworICAgICAgICAgICAgU3RyaW5nIHZhbCA9IHMu
c3Vic3RyaW5nKHBvcyArIDEpLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCk7CisgICAgICAgICAg
ICBpbnQgc3BhY2VQb3MgPSB2YWwuZmluZCgnICcpOworICAgICAgICAgICAgaWYgKHNwYWNlUG9z
ICE9IC0xKQorICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5sZWZ0KHNwYWNlUG9zKTsKKyAgICAg
ICAgICAgIG1hcC5zZXQoa2V5LCB2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IG1hcDsKK30KKworc3RhdGljIEZyYW1lKiBjcmVhdGVXaW5kb3coRXhlY1N0YXRlKiBleGVjLCBG
cmFtZSogb3BlbmVyRnJhbWUsIGNvbnN0IFN0cmluZyYgdXJsLAorICAgIGNvbnN0IFN0cmluZyYg
ZnJhbWVOYW1lLCBjb25zdCBXaW5kb3dGZWF0dXJlcyYgd2luZG93RmVhdHVyZXMsIEpTVmFsdWUq
IGRpYWxvZ0FyZ3MpCit7CisgICAgRnJhbWUqIGFjdGl2ZUZyYW1lID0gV2luZG93OjpyZXRyaWV2
ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOworCisgICAgUmVzb3VyY2VSZXF1ZXN0IHJl
cXVlc3Q7CisgICAgaWYgKGFjdGl2ZUZyYW1lKQorICAgICAgICByZXF1ZXN0LnNldEhUVFBSZWZl
cnJlcihhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJyZXIoKSk7CisgICAgRnJh
bWVMb2FkUmVxdWVzdCBmcmFtZVJlcXVlc3QocmVxdWVzdCwgZnJhbWVOYW1lKTsKKworICAgIC8v
IEZJWE1FOiBJdCdzIG11Y2ggYmV0dGVyIGZvciBjbGllbnQgQVBJIGlmIGEgbmV3IHdpbmRvdyBz
dGFydHMgd2l0aCBhIFVSTCwgaGVyZSB3aGVyZSB3ZQorICAgIC8vIGtub3cgd2hhdCBVUkwgd2Ug
YXJlIGdvaW5nIHRvIG9wZW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgY29kZSBwYXNzZXMgdGhlIGVt
cHR5IHN0cmluZworICAgIC8vIGZvciB0aGUgVVJMLCBidXQgdGhlcmUncyBhIHJlYXNvbiBmb3Ig
dGhhdC4gQmVmb3JlIGxvYWRpbmcgd2UgaGF2ZSB0byBzZXQgdXAgdGhlIG9wZW5lciwKKyAgICAv
LyBvcGVuZWRCeURPTSwgYW5kIGRpYWxvZ0FyZ3VtZW50cyB2YWx1ZXMuIEFsc28sIHRvIGRlY2lk
ZSB3aGV0aGVyIHRvIHVzZSB0aGUgVVJMIHdlIGN1cnJlbnRseQorICAgIC8vIGRvIGFuIGFsbG93
c0FjY2Vzc0Zyb20gY2FsbCB1c2luZyB0aGUgd2luZG93IHdlIGNyZWF0ZSwgd2hpY2ggY2FuJ3Qg
YmUgZG9uZSBiZWZvcmUgY3JlYXRpbmcgaXQuCisgICAgLy8gV2UnZCBoYXZlIHRvIHJlc29sdmUg
YWxsIHRob3NlIGlzc3VlcyB0byBwYXNzIHRoZSBVUkwgaW5zdGVhZCBvZiAiIi4KKworICAgIGJv
b2wgY3JlYXRlZDsKKyAgICBGcmFtZSogbmV3RnJhbWUgPSBvcGVuZXJGcmFtZS0+bG9hZGVyKCkt
PmNyZWF0ZVdpbmRvdyhmcmFtZVJlcXVlc3QsIHdpbmRvd0ZlYXR1cmVzLCBjcmVhdGVkKTsKKyAg
ICBpZiAoIW5ld0ZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5ld0ZyYW1lLT5sb2Fk
ZXIoKS0+c2V0T3BlbmVyKG9wZW5lckZyYW1lKTsKKyAgICBuZXdGcmFtZS0+bG9hZGVyKCktPnNl
dE9wZW5lZEJ5RE9NKCk7CisKKyAgICBXaW5kb3cqIG5ld1dpbmRvdyA9IFdpbmRvdzo6cmV0cmll
dmVXaW5kb3cobmV3RnJhbWUpOworCisgICAgaWYgKGRpYWxvZ0FyZ3MpCisgICAgICAgIG5ld1dp
bmRvdy0+cHV0RGlyZWN0KCJkaWFsb2dBcmd1bWVudHMiLCBkaWFsb2dBcmdzKTsKKworICAgIGlm
ICghdXJsLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8IG5ld1dpbmRvdy0+YWxs
b3dzQWNjZXNzRnJvbShleGVjKSkgeworICAgICAgICBTdHJpbmcgY29tcGxldGVkVVJMID0gdXJs
LmlzRW1wdHkoKSA/IHVybCA6IGFjdGl2ZUZyYW1lLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1
cmwpOworICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5
KCktPnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpOworCisgICAgICAgIGlmIChjcmVhdGVkKSB7Cisg
ICAgICAgICAgICBuZXdGcmFtZS0+bG9hZGVyKCktPmNoYW5nZUxvY2F0aW9uKEtVUkwoY29tcGxl
dGVkVVJMLmRlcHJlY2F0ZWRTdHJpbmcoKSksIGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29p
bmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1cmUpOworICAgICAgICAgICAgaWYgKERvY3Vt
ZW50KiBvbGREb2MgPSBvcGVuZXJGcmFtZS0+ZG9jdW1lbnQoKSkgeworICAgICAgICAgICAgICAg
IG5ld0ZyYW1lLT5kb2N1bWVudCgpLT5zZXREb21haW5JbnRlcm5hbChvbGREb2MtPmRvbWFpbigp
KTsKKyAgICAgICAgICAgICAgICBuZXdGcmFtZS0+ZG9jdW1lbnQoKS0+c2V0QmFzZVVSTChvbGRE
b2MtPmJhc2VVUkwoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXVybC5p
c0VtcHR5KCkpCisgICAgICAgICAgICBuZXdGcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxlTG9jYXRp
b25DaGFuZ2UoY29tcGxldGVkVVJMLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVm
ZXJyZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3RnJh
bWU7Cit9CisKK3N0YXRpYyBib29sIGNhblNob3dNb2RhbERpYWxvZyhjb25zdCBGcmFtZSogZnJh
bWUpCit7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVy
biBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2FuUnVuTW9kYWwoKTsKK30KKworc3RhdGljIGJv
b2wgY2FuU2hvd01vZGFsRGlhbG9nTm93KGNvbnN0IEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAo
IWZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGZyYW1lLT5wYWdlKCkt
PmNocm9tZSgpLT5jYW5SdW5Nb2RhbE5vdygpOworfQorCitzdGF0aWMgSlNWYWx1ZSogc2hvd01v
ZGFsRGlhbG9nKEV4ZWNTdGF0ZSogZXhlYywgRnJhbWUqIGZyYW1lLCBjb25zdCBTdHJpbmcmIHVy
bCwgSlNWYWx1ZSogZGlhbG9nQXJncywgY29uc3QgU3RyaW5nJiBmZWF0dXJlQXJncykKK3sKKyAg
ICBpZiAoIWNhblNob3dNb2RhbERpYWxvZ05vdyhmcmFtZSkgfHwgIWFsbG93UG9wVXAoZnJhbWUp
KQorICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKworICAgIGNvbnN0IEhhc2hNYXA8U3Ry
aW5nLCBTdHJpbmc+IGZlYXR1cmVzID0gcGFyc2VNb2RhbERpYWxvZ0ZlYXR1cmVzKGZlYXR1cmVB
cmdzKTsKKworICAgIGNvbnN0IGJvb2wgdHJ1c3RlZCA9IGZhbHNlOworCisgICAgLy8gVGhlIGZv
bGxvd2luZyBmZWF0dXJlcyBmcm9tIE1pY3Jvc29mdCdzIGRvY3VtZW50YXRpb24gYXJlIG5vdCBp
bXBsZW1lbnRlZDoKKyAgICAvLyAtIGRlZmF1bHQgZm9udCBzZXR0aW5ncworICAgIC8vIC0gd2lk
dGgsIGhlaWdodCwgbGVmdCwgYW5kIHRvcCBzcGVjaWZpZWQgaW4gdW5pdHMgb3RoZXIgdGhhbiAi
cHgiCisgICAgLy8gLSBlZGdlIChzdW5rZW4gb3IgcmFpc2VkLCBkZWZhdWx0IGlzIHJhaXNlZCkK
KyAgICAvLyAtIGRpYWxvZ0hpZGU6IHRydXN0ZWQgJiYgYm9vbEZlYXR1cmUoZmVhdHVyZXMsICJk
aWFsb2doaWRlIiksIG1ha2VzIGRpYWxvZyBoaWRlIHdoZW4geW91IHByaW50CisgICAgLy8gLSBo
ZWxwOiBib29sRmVhdHVyZShmZWF0dXJlcywgImhlbHAiLCB0cnVlKSwgbWFrZXMgaGVscCBpY29u
IGFwcGVhciBpbiBkaWFsb2cgKHdoYXQgZG9lcyBpdCBkbyBvbiBXaW5kb3dzPykKKyAgICAvLyAt
IHVuYWRvcm5lZDogdHJ1c3RlZCAmJiBib29sRmVhdHVyZShmZWF0dXJlcywgInVuYWRvcm5lZCIp
OworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisKKyAg
ICBGbG9hdFJlY3Qgc2NyZWVuUmVjdCA9IHNjcmVlbkF2YWlsYWJsZVJlY3QoZnJhbWUtPnZpZXco
KSk7CisKKyAgICBXaW5kb3dGZWF0dXJlcyB3YXJnczsKKyAgICB3YXJncy53aWR0aCA9IFdpbmRv
d0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2d3aWR0aCIsIDEwMCwgc2Ny
ZWVuUmVjdC53aWR0aCgpLCA2MjApOyAvLyBkZWZhdWx0IGhlcmUgY2FtZSBmcm9tIGZyYW1lIHNp
emUgb2YgZGlhbG9nIGluIE1hY0lFCisgICAgd2FyZ3Mud2lkdGhTZXQgPSB0cnVlOworICAgIHdh
cmdzLmhlaWdodCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFs
b2doZWlnaHQiLCAxMDAsIHNjcmVlblJlY3QuaGVpZ2h0KCksIDQ1MCk7IC8vIGRlZmF1bHQgaGVy
ZSBjYW1lIGZyb20gZnJhbWUgc2l6ZSBvZiBkaWFsb2cgaW4gTWFjSUUKKyAgICB3YXJncy5oZWln
aHRTZXQgPSB0cnVlOworCisgICAgd2FyZ3MueCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1
cmUoZmVhdHVyZXMsICJkaWFsb2dsZWZ0Iiwgc2NyZWVuUmVjdC54KCksIHNjcmVlblJlY3Qucmln
aHQoKSAtIHdhcmdzLndpZHRoLCAtMSk7CisgICAgd2FyZ3MueFNldCA9IHdhcmdzLnggPiAwOwor
ICAgIHdhcmdzLnkgPSBXaW5kb3dGZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlh
bG9ndG9wIiwgc2NyZWVuUmVjdC55KCksIHNjcmVlblJlY3QuYm90dG9tKCkgLSB3YXJncy5oZWln
aHQsIC0xKTsKKyAgICB3YXJncy55U2V0ID0gd2FyZ3MueSA+IDA7CisKKyAgICBpZiAoV2luZG93
RmVhdHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVzLCAiY2VudGVyIiwgdHJ1ZSkpIHsKKyAgICAg
ICAgaWYgKCF3YXJncy54U2V0KSB7CisgICAgICAgICAgICB3YXJncy54ID0gc2NyZWVuUmVjdC54
KCkgKyAoc2NyZWVuUmVjdC53aWR0aCgpIC0gd2FyZ3Mud2lkdGgpIC8gMjsKKyAgICAgICAgICAg
IHdhcmdzLnhTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghd2FyZ3MueVNldCkg
eworICAgICAgICAgICAgd2FyZ3MueSA9IHNjcmVlblJlY3QueSgpICsgKHNjcmVlblJlY3QuaGVp
Z2h0KCkgLSB3YXJncy5oZWlnaHQpIC8gMjsKKyAgICAgICAgICAgIHdhcmdzLnlTZXQgPSB0cnVl
OworICAgICAgICB9CisgICAgfQorCisgICAgd2FyZ3MuZGlhbG9nID0gdHJ1ZTsKKyAgICB3YXJn
cy5yZXNpemFibGUgPSBXaW5kb3dGZWF0dXJlczo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJyZXNp
emFibGUiKTsKKyAgICB3YXJncy5zY3JvbGxiYXJzVmlzaWJsZSA9IFdpbmRvd0ZlYXR1cmVzOjpi
b29sRmVhdHVyZShmZWF0dXJlcywgInNjcm9sbCIsIHRydWUpOworICAgIHdhcmdzLnN0YXR1c0Jh
clZpc2libGUgPSBXaW5kb3dGZWF0dXJlczo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJzdGF0dXMi
LCAhdHJ1c3RlZCk7CisgICAgd2FyZ3MubWVudUJhclZpc2libGUgPSBmYWxzZTsKKyAgICB3YXJn
cy50b29sQmFyVmlzaWJsZSA9IGZhbHNlOworICAgIHdhcmdzLmxvY2F0aW9uQmFyVmlzaWJsZSA9
IGZhbHNlOworICAgIHdhcmdzLmZ1bGxzY3JlZW4gPSBmYWxzZTsKKworICAgIEZyYW1lKiBkaWFs
b2dGcmFtZSA9IGNyZWF0ZVdpbmRvdyhleGVjLCBmcmFtZSwgdXJsLCAiIiwgd2FyZ3MsIGRpYWxv
Z0FyZ3MpOworICAgIGlmICghZGlhbG9nRnJhbWUpCisgICAgICAgIHJldHVybiBqc1VuZGVmaW5l
ZCgpOworCisgICAgV2luZG93KiBkaWFsb2dXaW5kb3cgPSBXaW5kb3c6OnJldHJpZXZlV2luZG93
KGRpYWxvZ0ZyYW1lKTsKKworICAgIC8vIEdldCB0aGUgcmV0dXJuIHZhbHVlIGVpdGhlciBqdXN0
IGJlZm9yZSBjbGVhcmluZyB0aGUgZGlhbG9nIHdpbmRvdydzCisgICAgLy8gcHJvcGVydGllcyAo
aW4gV2luZG93OjpjbGVhciksIG9yIHdoZW4gb24gcmV0dXJuIGZyb20gcnVuTW9kYWwuCisgICAg
SlNWYWx1ZSogcmV0dXJuVmFsdWUgPSAwOworICAgIGRpYWxvZ1dpbmRvdy0+c2V0UmV0dXJuVmFs
dWVTbG90KCZyZXR1cm5WYWx1ZSk7CisgICAgZGlhbG9nRnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCkt
PnJ1bk1vZGFsKCk7CisgICAgZGlhbG9nV2luZG93LT5zZXRSZXR1cm5WYWx1ZVNsb3QoMCk7CisK
KyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuIHZhbHVlLCBnZXQgaXQgbm93LgorICAg
IC8vIEVpdGhlciBXaW5kb3c6OmNsZWFyIHdhcyBub3QgY2FsbGVkIHlldCwgb3IgdGhlcmUgd2Fz
IG5vIHJldHVybiB2YWx1ZSwKKyAgICAvLyBhbmQgaW4gdGhhdCBjYXNlLCB0aGVyZSdzIG5vIGhh
cm0gaW4gdHJ5aW5nIGFnYWluIChubyBiZW5lZml0IGVpdGhlcikuCisgICAgaWYgKCFyZXR1cm5W
YWx1ZSkKKyAgICAgICAgcmV0dXJuVmFsdWUgPSBkaWFsb2dXaW5kb3ctPmdldERpcmVjdCgicmV0
dXJuVmFsdWUiKTsKKworICAgIHJldHVybiByZXR1cm5WYWx1ZSA/IHJldHVyblZhbHVlIDoganNV
bmRlZmluZWQoKTsKK30KKworSlNWYWx1ZSAqV2luZG93OjpnZXRWYWx1ZVByb3BlcnR5KEV4ZWNT
dGF0ZSAqZXhlYywgaW50IHRva2VuKSBjb25zdAoreworICAgQVNTRVJUKGltcGwoKS0+ZnJhbWUo
KSk7CisKKyAgIHN3aXRjaCAodG9rZW4pIHsKKyAgIGNhc2UgQ3J5cHRvOgorICAgICAgcmV0dXJu
IGpzVW5kZWZpbmVkKCk7IC8vIEZJWE1FOiBpbXBsZW1lbnQgdGhpcworICAgY2FzZSBET01FeGNl
cHRpb246CisgICAgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOworICAgICAgcmV0dXJuIGdldERPTUV4Y2VwdGlvbkNvbnN0cnVjdG9y
KGV4ZWMpOworICAgIGNhc2UgRXZlbnRfOgorICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4
ZWMpKQorICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgIGlmICghZC0+bV9ldnQp
CisgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAgcmV0dXJuIHRvSlMoZXhlYywg
ZC0+bV9ldnQpOworICAgIGNhc2UgTG9jYXRpb25fOgorICAgICAgcmV0dXJuIGxvY2F0aW9uKCk7
CisgICAgY2FzZSBOYXZpZ2F0b3JfOgorICAgIGNhc2UgQ2xpZW50SW5mb3JtYXRpb246IHsKKyAg
ICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZp
bmVkKCk7CisgICAgICAvLyBTdG9yZSB0aGUgbmF2aWdhdG9yIGluIHRoZSBvYmplY3Qgc28gd2Ug
Z2V0IHRoZSBzYW1lIG9uZSBlYWNoIHRpbWUuCisgICAgICBOYXZpZ2F0b3IgKm4gPSBuZXcgTmF2
aWdhdG9yKGV4ZWMsIGltcGwoKS0+ZnJhbWUoKSk7CisgICAgICAvLyBGSVhNRTogdGhpcyB3aWxs
IG1ha2UgdGhlICJuYXZpZ2F0b3IiIG9iamVjdCBhY2Nlc3NpYmxlIGZyb20gd2luZG93cyB0aGF0
IGZhaWwKKyAgICAgIC8vIHRoZSBzZWN1cml0eSBjaGVjayB0aGUgZmlyc3QgdGltZSwgYnV0IG5v
dCBzdWJzZXF1ZW50IHRpbWVzLCBzZWVtcyB3ZWlyZC4KKyAgICAgIGNvbnN0X2Nhc3Q8V2luZG93
ICo+KHRoaXMpLT5wdXREaXJlY3QoIm5hdmlnYXRvciIsIG4sIERvbnREZWxldGV8UmVhZE9ubHkp
OworICAgICAgY29uc3RfY2FzdDxXaW5kb3cgKj4odGhpcyktPnB1dERpcmVjdCgiY2xpZW50SW5m
b3JtYXRpb24iLCBuLCBEb250RGVsZXRlfFJlYWRPbmx5KTsKKyAgICAgIHJldHVybiBuOworICAg
IH0KKyAgICBjYXNlIEltYWdlOgorICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQor
ICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgIC8vIEZJWE1FOiB0aGlzIHByb3Bl
cnR5IChhbmQgdGhlIGZldyBiZWxvdykgcHJvYmFibHkgc2hvdWxkbid0IGNyZWF0ZSBhIG5ldyBv
YmplY3QgZXZlcnkKKyAgICAgIC8vIHRpbWUKKyAgICAgIHJldHVybiBuZXcgSW1hZ2VDb25zdHJ1
Y3RvckltcChleGVjLCBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCkpOworICAgIGNhc2UgT3B0
aW9uOgorICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKKyAgICAgIHJldHVybiBuZXcgSlNIVE1MT3B0aW9uRWxlbWVudENvbnN0
cnVjdG9yKGV4ZWMsIGltcGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKSk7CisgICAgY2FzZSBYTUxI
dHRwUmVxdWVzdDoKKyAgICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICByZXR1cm4gbmV3IEpTWE1MSHR0cFJlcXVlc3RD
b25zdHJ1Y3RvckltcChleGVjLCBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCkpOworICAgIGNh
c2UgQXVkaW86CisjaWYgRU5BQkxFKFZJREVPKQorICAgICAgcmV0dXJuIG5ldyBKU0hUTUxBdWRp
b0VsZW1lbnRDb25zdHJ1Y3RvcihleGVjLCBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCkpOwor
I2Vsc2UKKyAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworI2VuZGlmCisjaWYgRU5BQkxFKFhT
TFQpCisgICAgY2FzZSBYU0xUUHJvY2Vzc29yXzoKKyAgICAgIGlmICghYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICByZXR1cm4gbmV3
IFhTTFRQcm9jZXNzb3JDb25zdHJ1Y3RvckltcChleGVjKTsKKyNlbHNlCisgICAgY2FzZSBYU0xU
UHJvY2Vzc29yXzoKKyAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworI2VuZGlmCisgICB9CisK
KyAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgcmV0dXJuIGpzVW5kZWZpbmVk
KCk7CisKKyAgIHN3aXRjaCAodG9rZW4pIHsKKyAgIGNhc2UgT25hYm9ydDoKKyAgICAgcmV0dXJu
IGdldExpc3RlbmVyKGV4ZWMsIGFib3J0RXZlbnQpOworICAgY2FzZSBPbmJsdXI6CisgICAgIHJl
dHVybiBnZXRMaXN0ZW5lcihleGVjLCBibHVyRXZlbnQpOworICAgY2FzZSBPbmNoYW5nZToKKyAg
ICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGNoYW5nZUV2ZW50KTsKKyAgIGNhc2UgT25jbGlj
azoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGNsaWNrRXZlbnQpOworICAgY2FzZSBP
bmRibGNsaWNrOgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgZGJsY2xpY2tFdmVudCk7
CisgICBjYXNlIE9uZXJyb3I6CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBlcnJvckV2
ZW50KTsKKyAgIGNhc2UgT25mb2N1czoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGZv
Y3VzRXZlbnQpOworICAgY2FzZSBPbmtleWRvd246CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihl
eGVjLCBrZXlkb3duRXZlbnQpOworICAgY2FzZSBPbmtleXByZXNzOgorICAgICByZXR1cm4gZ2V0
TGlzdGVuZXIoZXhlYywga2V5cHJlc3NFdmVudCk7CisgICBjYXNlIE9ua2V5dXA6CisgICAgIHJl
dHVybiBnZXRMaXN0ZW5lcihleGVjLCBrZXl1cEV2ZW50KTsKKyAgIGNhc2UgT25sb2FkOgorICAg
ICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgbG9hZEV2ZW50KTsKKyAgIGNhc2UgT25tb3VzZWRv
d246CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZWRvd25FdmVudCk7CisgICBj
YXNlIE9ubW91c2Vtb3ZlOgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgbW91c2Vtb3Zl
RXZlbnQpOworICAgY2FzZSBPbm1vdXNlb3V0OgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhl
YywgbW91c2VvdXRFdmVudCk7CisgICBjYXNlIE9ubW91c2VvdmVyOgorICAgICByZXR1cm4gZ2V0
TGlzdGVuZXIoZXhlYywgbW91c2VvdmVyRXZlbnQpOworICAgY2FzZSBPbm1vdXNldXA6CisgICAg
IHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZXVwRXZlbnQpOworICAgY2FzZSBPbldpbmRv
d01vdXNlV2hlZWw6CisgICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZXdoZWVsRXZl
bnQpOworICAgY2FzZSBPbnJlc2V0OgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgcmVz
ZXRFdmVudCk7CisgICBjYXNlIE9ucmVzaXplOgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhl
YyxyZXNpemVFdmVudCk7CisgICBjYXNlIE9uc2Nyb2xsOgorICAgICByZXR1cm4gZ2V0TGlzdGVu
ZXIoZXhlYyxzY3JvbGxFdmVudCk7CisgICBjYXNlIE9uc2VhcmNoOgorICAgICByZXR1cm4gZ2V0
TGlzdGVuZXIoZXhlYyxzZWFyY2hFdmVudCk7CisgICBjYXNlIE9uc2VsZWN0OgorICAgICByZXR1
cm4gZ2V0TGlzdGVuZXIoZXhlYyxzZWxlY3RFdmVudCk7CisgICBjYXNlIE9uc3VibWl0OgorICAg
ICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYyxzdWJtaXRFdmVudCk7CisgICBjYXNlIE9uYmVmb3Jl
dW5sb2FkOgorICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgYmVmb3JldW5sb2FkRXZlbnQp
OworICAgY2FzZSBPbnVubG9hZDoKKyAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIHVubG9h
ZEV2ZW50KTsKKyAgIH0KKyAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUqIFdpbmRvdzo6Y2hpbGRGcmFtZUdldHRlcihFeGVjU3Rh
dGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJv
cGVydHlTbG90JiBzbG90KQoreworICAgIHJldHVybiByZXRyaWV2ZShzdGF0aWNfY2FzdDxXaW5k
b3cqPihzbG90LnNsb3RCYXNlKCkpLT5pbXBsKCktPmZyYW1lKCktPnRyZWUoKS0+Y2hpbGQoQXRv
bWljU3RyaW5nKHByb3BlcnR5TmFtZSkpKTsKK30KKworSlNWYWx1ZSogV2luZG93OjppbmRleEdl
dHRlcihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBjb25zdCBQcm9w
ZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgcmV0dXJuIHJldHJpZXZlKHN0YXRpY19jYXN0PFdpbmRv
dyo+KHNsb3Quc2xvdEJhc2UoKSktPmltcGwoKS0+ZnJhbWUoKS0+dHJlZSgpLT5jaGlsZChzbG90
LmluZGV4KCkpKTsKK30KKworSlNWYWx1ZSAqV2luZG93OjpuYW1lZEl0ZW1HZXR0ZXIoRXhlY1N0
YXRlICpleGVjLCBKU09iamVjdCAqb3JpZ2luYWxPYmplY3QsIGNvbnN0IElkZW50aWZpZXImIHBy
b3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQoreworICBXaW5kb3cgKnRoaXNP
YmogPSBzdGF0aWNfY2FzdDxXaW5kb3cgKj4oc2xvdC5zbG90QmFzZSgpKTsKKyAgRG9jdW1lbnQg
KmRvYyA9IHRoaXNPYmotPmltcGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgQVNTRVJUKHRo
aXNPYmotPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykgJiYgZG9jICYmIGRvYy0+aXNIVE1MRG9jdW1l
bnQoKSk7CisKKyAgU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgIFJlZlB0cjxXZWJDb3Jl
OjpIVE1MQ29sbGVjdGlvbj4gY29sbGVjdGlvbiA9IGRvYy0+d2luZG93TmFtZWRJdGVtcyhuYW1l
KTsKKyAgaWYgKGNvbGxlY3Rpb24tPmxlbmd0aCgpID09IDEpCisgICAgcmV0dXJuIHRvSlMoZXhl
YywgY29sbGVjdGlvbi0+Zmlyc3RJdGVtKCkpOworICByZXR1cm4gdG9KUyhleGVjLCBjb2xsZWN0
aW9uLmdldCgpKTsKK30KKworYm9vbCBXaW5kb3c6OmdldE93blByb3BlcnR5U2xvdChFeGVjU3Rh
dGUgKmV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBz
bG90KQoreworICAvLyBDaGVjayBmb3IgY2hpbGQgZnJhbWVzIGJ5IG5hbWUgYmVmb3JlIGJ1aWx0
LWluIHByb3BlcnRpZXMgdG8KKyAgLy8gbWF0Y2ggTW96aWxsYS4gVGhpcyBkb2VzIG5vdCBtYXRj
aCBJRSwgYnV0IHNvbWUgc2l0ZXMgZW5kIHVwCisgIC8vIG5hbWluZyBmcmFtZXMgdGhpbmdzIHRo
YXQgY29uZmxpY3Qgd2l0aCB3aW5kb3cgcHJvcGVydGllcyB0aGF0CisgIC8vIGFyZSBpbiBNb3og
YnV0IG5vdCBJRS4gU2luY2Ugd2UgaGF2ZSBzb21lIG9mIHRoZXNlLCB3ZSBoYXZlIHRvIGRvCisg
IC8vIGl0IHRoZSBNb3ogd2F5LgorICBpZiAoaW1wbCgpLT5mcmFtZSgpLT50cmVlKCktPmNoaWxk
KHByb3BlcnR5TmFtZSkpIHsKKyAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBjaGlsZEZyYW1lR2V0
dGVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IEhhc2hFbnRyeSogZW50cnkg
PSBMb29rdXA6OmZpbmRFbnRyeSgmV2luZG93VGFibGUsIHByb3BlcnR5TmFtZSk7CisgIGlmIChl
bnRyeSkgeworICAgIGlmIChlbnRyeS0+YXR0ciAmIEZ1bmN0aW9uKSB7CisgICAgICBpZiAoZW50
cnktPnZhbHVlLmZ1bmN0aW9uVmFsdWUgPT0gJldpbmRvd1Byb3RvRnVuY1Nob3dNb2RhbERpYWxv
Zzo6Y3JlYXRlKSB7CisgICAgICAgIGlmICghY2FuU2hvd01vZGFsRGlhbG9nKGltcGwoKS0+ZnJh
bWUoKSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKGFsbG93
c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNsb3Quc2V0U3RhdGljRW50cnkodGhpcywgZW50
cnksIHN0YXRpY0Z1bmN0aW9uR2V0dGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc2xvdC5zZXRV
bmRlZmluZWQodGhpcyk7CisgICAgfSBlbHNlCisgICAgICBzbG90LnNldFN0YXRpY0VudHJ5KHRo
aXMsIGVudHJ5LCBzdGF0aWNWYWx1ZUdldHRlcjxXaW5kb3c+KTsKKyAgICByZXR1cm4gdHJ1ZTsK
KyAgfQorCisgIC8vIEZJWE1FOiBTZWFyY2ggdGhlIHdob2xlIGZyYW1lIGhpZXJhY2h5IHNvbWV3
aGVyZSBhcm91bmQgaGVyZS4KKyAgLy8gV2UgbmVlZCB0byB0ZXN0IHRoZSBjb3JyZWN0IHByaW9y
aXR5IG9yZGVyLgorCisgIC8vIGFsbG93IHdpbmRvd1sxXSBvciBwYXJlbnRbMV0gZXRjLiAoIzU2
OTgzKQorICBib29sIG9rOworICB1bnNpZ25lZCBpID0gcHJvcGVydHlOYW1lLnRvQXJyYXlJbmRl
eCgmb2spOworICBpZiAob2sgJiYgaSA8IGltcGwoKS0+ZnJhbWUoKS0+dHJlZSgpLT5jaGlsZENv
dW50KCkpIHsKKyAgICBzbG90LnNldEN1c3RvbUluZGV4KHRoaXMsIGksIGluZGV4R2V0dGVyKTsK
KyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIGFsbG93IHNob3J0Y3V0cyBsaWtlICdJbWFn
ZTEnIGluc3RlYWQgb2YgZG9jdW1lbnQuaW1hZ2VzLkltYWdlMQorICBEb2N1bWVudCogZG9jID0g
aW1wbCgpLT5mcmFtZSgpLT5kb2N1bWVudCgpOworICBpZiAoZG9jICYmIGRvYy0+aXNIVE1MRG9j
dW1lbnQoKSkgeworICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkgeworICAgICAgc2xv
dC5zZXRVbmRlZmluZWQodGhpcyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBB
dG9taWNTdHJpbmcgYXRvbWljUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgIGlmIChz
dGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPihkb2MpLT5oYXNOYW1lZEl0ZW0oYXRvbWljUHJvcGVy
dHlOYW1lKSB8fCBkb2MtPmdldEVsZW1lbnRCeUlkKGF0b21pY1Byb3BlcnR5TmFtZSkpIHsKKyAg
ICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIG5hbWVkSXRlbUdldHRlcik7CisgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpIHsKKyAg
ICBzbG90LnNldFVuZGVmaW5lZCh0aGlzKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJl
dHVybiBKU09iamVjdDo6Z2V0T3duUHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xv
dCk7Cit9CisKK3ZvaWQgV2luZG93OjpwdXQoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlm
aWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKK3sKKyAgY29uc3Qg
SGFzaEVudHJ5KiBlbnRyeSA9IExvb2t1cDo6ZmluZEVudHJ5KCZXaW5kb3dUYWJsZSwgcHJvcGVy
dHlOYW1lKTsKKyAgaWYgKGVudHJ5KSB7CisgICAgIGlmIChlbnRyeS0+YXR0ciAmIEZ1bmN0aW9u
KSB7CisgICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgICBKU09iamVj
dDo6cHV0KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHIpOworICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgaWYgKGVudHJ5LT5hdHRyICYgUmVhZE9ubHkpCisgICAgICByZXR1cm47CisK
KyAgICBzd2l0Y2ggKGVudHJ5LT52YWx1ZS5pbnRWYWx1ZSkgeworICAgIGNhc2UgTG9jYXRpb25f
OiB7CisgICAgICBGcmFtZSogcCA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwo
KS0+ZnJhbWUoKTsKKyAgICAgIGlmIChwKSB7CisgICAgICAgIGlmICghcC0+bG9hZGVyKCktPnNo
b3VsZEFsbG93TmF2aWdhdGlvbihpbXBsKCktPmZyYW1lKCkpKQorICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgU3RyaW5nIGRzdFVybCA9IHAtPmxvYWRlcigpLT5jb21wbGV0ZVVSTCh2YWx1ZS0+
dG9TdHJpbmcoZXhlYykpLnN0cmluZygpOworICAgICAgICBpZiAoIWRzdFVybC5zdGFydHNXaXRo
KCJqYXZhc2NyaXB0OiIsIGZhbHNlKSB8fCBhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSB7CisgICAg
ICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IHAtPnNjcmlwdFByb3h5KCktPnByb2Nlc3NpbmdVc2Vy
R2VzdHVyZSgpOworICAgICAgICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBpdGVtIGlmIHRo
aXMgSlMgd2FzIGNhbGxlZCB2aWEgYSB1c2VyIGdlc3R1cmUKKyAgICAgICAgICBpbXBsKCktPmZy
YW1lKCktPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKGRzdFVybCwgcC0+bG9hZGVy
KCktPm91dGdvaW5nUmVmZXJyZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKKyAgICAgICAgfQor
ICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIE9uYWJvcnQ6CisgICAgICBp
ZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgYWJv
cnRFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbmJsdXI6CisgICAgICBp
ZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgYmx1
ckV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9uY2hhbmdlOgorICAgICAg
aWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsIGNo
YW5nZUV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9uY2xpY2s6CisgICAg
ICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxj
bGlja0V2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9uZGJsY2xpY2s6Cisg
ICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhl
YywgZGJsY2xpY2tFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBPbmVycm9y
OgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVy
KGV4ZWMsIGVycm9yRXZlbnQsIHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9uZm9j
dXM6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVu
ZXIoZXhlYyxmb2N1c0V2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9ua2V5
ZG93bjoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRMaXN0
ZW5lcihleGVjLGtleWRvd25FdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBP
bmtleXByZXNzOgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNl
dExpc3RlbmVyKGV4ZWMsa2V5cHJlc3NFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAg
Y2FzZSBPbmtleXVwOgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAg
IHNldExpc3RlbmVyKGV4ZWMsa2V5dXBFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAg
Y2FzZSBPbmxvYWQ6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAg
c2V0TGlzdGVuZXIoZXhlYyxsb2FkRXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNh
c2UgT25tb3VzZWRvd246CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAg
ICAgc2V0TGlzdGVuZXIoZXhlYyxtb3VzZWRvd25FdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47
CisgICAgY2FzZSBPbm1vdXNlbW92ZToKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMp
KQorICAgICAgICBzZXRMaXN0ZW5lcihleGVjLG1vdXNlbW92ZUV2ZW50LHZhbHVlKTsKKyAgICAg
IHJldHVybjsKKyAgICBjYXNlIE9ubW91c2VvdXQ6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxtb3VzZW91dEV2ZW50LHZhbHVlKTsK
KyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9ubW91c2VvdmVyOgorICAgICAgaWYgKGFsbG93c0Fj
Y2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsbW91c2VvdmVyRXZlbnQs
dmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgT25tb3VzZXVwOgorICAgICAgaWYgKGFs
bG93c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsbW91c2V1cEV2
ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9uV2luZG93TW91c2VXaGVlbDoK
KyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRMaXN0ZW5lcihl
eGVjLCBtb3VzZXdoZWVsRXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgT25y
ZXNldDoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRMaXN0
ZW5lcihleGVjLHJlc2V0RXZlbnQsdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgT25y
ZXNpemU6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAgc2V0TGlz
dGVuZXIoZXhlYyxyZXNpemVFdmVudCx2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBP
bnNjcm9sbDoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQorICAgICAgICBzZXRM
aXN0ZW5lcihleGVjLHNjcm9sbEV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNl
IE9uc2VhcmNoOgorICAgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICAgICAg
ICAgIHNldExpc3RlbmVyKGV4ZWMsc2VhcmNoRXZlbnQsdmFsdWUpOworICAgICAgICByZXR1cm47
CisgICAgY2FzZSBPbnNlbGVjdDoKKyAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQor
ICAgICAgICBzZXRMaXN0ZW5lcihleGVjLHNlbGVjdEV2ZW50LHZhbHVlKTsKKyAgICAgIHJldHVy
bjsKKyAgICBjYXNlIE9uc3VibWl0OgorICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykp
CisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsc3VibWl0RXZlbnQsdmFsdWUpOworICAgICAgcmV0
dXJuOworICAgIGNhc2UgT25iZWZvcmV1bmxvYWQ6CisgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKKyAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgYmVmb3JldW5sb2FkRXZlbnQsIHZh
bHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIE9udW5sb2FkOgorICAgICAgaWYgKGFsbG93
c0FjY2Vzc0Zyb20oZXhlYykpCisgICAgICAgIHNldExpc3RlbmVyKGV4ZWMsIHVubG9hZEV2ZW50
LCB2YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAg
IH0KKyAgfQorICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKKyAgICBKU09iamVjdDo6cHV0
KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHIpOworfQorCitib29sIFdpbmRvdzo6YWxs
b3dzQWNjZXNzRnJvbShjb25zdCBKU0dsb2JhbE9iamVjdCogb3RoZXIpIGNvbnN0Cit7CisgICAg
Y29uc3QgRnJhbWUqIG9yaWdpbkZyYW1lID0gc3RhdGljX2Nhc3Q8Y29uc3QgV2luZG93Kj4ob3Ro
ZXIpLT5pbXBsKCktPmZyYW1lKCk7CisgICAgaWYgKCFvcmlnaW5GcmFtZSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgY29uc3QgRnJhbWUqIHRhcmdldEZyYW1lID0gaW1wbCgpLT5mcmFt
ZSgpOworICAgIGlmICghdGFyZ2V0RnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGlmIChvcmlnaW5GcmFtZSA9PSB0YXJnZXRGcmFtZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICBXZWJDb3JlOjpEb2N1bWVudCogdGFyZ2V0RG9jdW1lbnQgPSB0YXJnZXRGcmFtZS0+ZG9j
dW1lbnQoKTsKKworICAgIC8vIEpTIG1heSBiZSBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgIndp
bmRvdyIgb2JqZWN0LCB3aGljaCBzaG91bGQgYmUgdmFsaWQsCisgICAgLy8gZXZlbiBpZiB0aGUg
ZG9jdW1lbnQgaGFzbid0IGJlZW4gY29uc3RydWN0ZWQgeWV0LiAgSWYgdGhlIGRvY3VtZW50IGRv
ZXNuJ3QKKyAgICAvLyBleGlzdCB5ZXQgYWxsb3cgSlMgdG8gYWNjZXNzIHRoZSB3aW5kb3cgb2Jq
ZWN0LgorICAgIGlmICghdGFyZ2V0RG9jdW1lbnQpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgV2ViQ29yZTo6RG9jdW1lbnQqIG9yaWdpbkRvY3VtZW50ID0gb3JpZ2luRnJhbWUtPmRvY3Vt
ZW50KCk7CisKKyAgICBjb25zdCBTZWN1cml0eU9yaWdpbiYgb3JpZ2luU2VjdXJpdHlPcmlnaW4g
PSBvcmlnaW5Eb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBjb25zdCBTZWN1cml0eU9y
aWdpbiYgdGFyZ2V0U2VjdXJpdHlPcmlnaW4gPSB0YXJnZXREb2N1bWVudC0+c2VjdXJpdHlPcmln
aW4oKTsKKworICAgIGlmIChvcmlnaW5TZWN1cml0eU9yaWdpbi5jYW5BY2Nlc3ModGFyZ2V0U2Vj
dXJpdHlPcmlnaW4pKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghdGFyZ2V0RnJh
bWUtPnNldHRpbmdzKCktPnByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSkgeworICAgICAgICAvLyBG
SVhNRTogdGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lmaWNzIG9m
IHdoeSB0aGUgc2FtZSBvcmlnaW4gY2hlY2sgaGFzIGZhaWxlZC4KKyAgICAgICAgU3RyaW5nIG1l
c3NhZ2UgPSBTdHJpbmc6OmZvcm1hdCgiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0byBhY2Nl
c3MgZnJhbWUgd2l0aCBVUkwgJXMgZnJvbSBmcmFtZSB3aXRoIFVSTCAlcy4gRG9tYWlucywgcHJv
dG9jb2xzIGFuZCBwb3J0cyBtdXN0IG1hdGNoLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0YXJnZXREb2N1bWVudC0+dXJsKCkudXRmOCgpLmRhdGEoKSwgb3Jp
Z2luRG9jdW1lbnQtPnVybCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgIGlmIChJbnRlcnBy
ZXRlcjo6c2hvdWxkUHJpbnRFeGNlcHRpb25zKCkpCisgICAgICAgICAgICBwcmludGYoIiVzIiwg
bWVzc2FnZS51dGY4KCkuZGF0YSgpKTsKKworICAgICAgICBpZiAoUGFnZSogcGFnZSA9IHRhcmdl
dEZyYW1lLT5wYWdlKCkpCisgICAgICAgICAgICBwYWdlLT5jaHJvbWUoKS0+YWRkTWVzc2FnZVRv
Q29uc29sZShKU01lc3NhZ2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCBtZXNzYWdlLCAxLCBT
dHJpbmcoKSk7IC8vIEZJWE1FOiBwcm92aWRlIGEgcmVhbCBsaW5lIG51bWJlciBhbmQgc291cmNl
IFVSTC4KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0V4ZWNTdGF0ZSogV2luZG93
OjpnbG9iYWxFeGVjKCkKK3sKKyAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSBz
Y3JpcHQgZXhlY3V0aW9uIGhhcHBlbmluZyBpbiB0aGlzCisgICAgLy8gZnJhbWUgZG9lcyBub3Qg
ZGVzdHJveSBpdAorICAgIEFTU0VSVChpbXBsKCktPmZyYW1lKCkpOworICAgIGltcGwoKS0+ZnJh
bWUoKS0+a2VlcEFsaXZlKCk7CisgICAgcmV0dXJuIEpTR2xvYmFsT2JqZWN0OjpnbG9iYWxFeGVj
KCk7Cit9CisKK2Jvb2wgV2luZG93OjpzaG91bGRJbnRlcnJ1cHRTY3JpcHQoKSBjb25zdAorewor
ICAgIEFTU0VSVChpbXBsKCktPmZyYW1lKCkpOworICAgIFBhZ2UqIHBhZ2UgPSBpbXBsKCktPmZy
YW1lKCktPnBhZ2UoKTsKKworICAgIC8vIFNlZSA8cmRhcjovL3Byb2JsZW0vNTQ3OTQ0Mz4uIFdl
IGRvbid0IHRoaW5rIHRoYXQgcGFnZSBjYW4gZXZlciBiZSBOVUxMCisgICAgLy8gaW4gdGhpcyBj
YXNlLCBidXQgaWYgaXQgaXMsIHdlJ3ZlIGdvdHRlbiBpbnRvIGEgc3RhdGUgd2hlcmUgd2UgbWF5
IGhhdmUKKyAgICAvLyBodW5nIHRoZSBVSSwgd2l0aCBubyB3YXkgdG8gYXNrIHRoZSBjbGllbnQg
d2hldGhlciB0byBjYW5jZWwgZXhlY3V0aW9uLgorICAgIC8vIEZvciBub3csIG91ciBzb2x1dGlv
biBpcyBqdXN0IHRvIGNhbmNlbCBleGVjdXRpb24gbm8gbWF0dGVyIHdoYXQsCisgICAgLy8gZW5z
dXJpbmcgdGhhdCB3ZSBuZXZlciBoYW5nLiBXZSBtaWdodCB3YW50IHRvIGNvbnNpZGVyIG90aGVy
IHNvbHV0aW9ucworICAgIC8vIGlmIHdlIGRpc2NvdmVyIHByb2JsZW1zIHdpdGggdGhpcyBvbmUu
CisgICAgQVNTRVJUKHBhZ2UpOworICAgIGlmICghcGFnZSkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICByZXR1cm4gcGFnZS0+Y2hyb21lKCktPnNob3VsZEludGVycnVwdEphdmFTY3JpcHQo
KTsKK30KKwordm9pZCBXaW5kb3c6OnNldExpc3RlbmVyKEV4ZWNTdGF0ZSogZXhlYywgY29uc3Qg
QXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEpTVmFsdWUqIGZ1bmMpCit7CisgICAgQVNTRVJUKGlt
cGwoKS0+ZnJhbWUoKSk7CisgICAgRG9jdW1lbnQqIGRvYyA9IGltcGwoKS0+ZnJhbWUoKS0+ZG9j
dW1lbnQoKTsKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJuOworCisgICAgZG9jLT5zZXRI
VE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGZpbmRPckNyZWF0ZUpTRXZlbnRMaXN0
ZW5lcihmdW5jLCB0cnVlKSk7Cit9CisKK0pTVmFsdWUqIFdpbmRvdzo6Z2V0TGlzdGVuZXIoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSkgY29uc3QKK3sKKyAg
ICBBU1NFUlQoaW1wbCgpLT5mcmFtZSgpKTsKKyAgICBEb2N1bWVudCogZG9jID0gaW1wbCgpLT5m
cmFtZSgpLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jKQorICAgICAgICByZXR1cm4ganNVbmRl
ZmluZWQoKTsKKworICAgIFdlYkNvcmU6OkV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gZG9jLT5n
ZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUpOworICAgIGlmIChsaXN0ZW5lciAm
JiBzdGF0aWNfY2FzdDxKU0V2ZW50TGlzdGVuZXIqPihsaXN0ZW5lciktPmxpc3RlbmVyT2JqKCkp
CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxKU0V2ZW50TGlzdGVuZXIqPihsaXN0ZW5lcikt
Pmxpc3RlbmVyT2JqKCk7CisgICAgcmV0dXJuIGpzTnVsbCgpOworfQorCitKU0V2ZW50TGlzdGVu
ZXIqIFdpbmRvdzo6ZmluZEpTRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiB2YWwsIGJvb2wgaHRtbCkK
K3sKKyAgICBpZiAoIXZhbC0+aXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgSlNP
YmplY3QqIG9iamVjdCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odmFsKTsKKyAgICBMaXN0ZW5l
cnNNYXAmIGxpc3RlbmVycyA9IGh0bWwgPyBkLT5qc0hUTUxFdmVudExpc3RlbmVycyA6IGQtPmpz
RXZlbnRMaXN0ZW5lcnM7CisgICAgcmV0dXJuIGxpc3RlbmVycy5nZXQob2JqZWN0KTsKK30KKwor
SlNFdmVudExpc3RlbmVyKiBXaW5kb3c6OmZpbmRPckNyZWF0ZUpTRXZlbnRMaXN0ZW5lcihKU1Zh
bHVlKiB2YWwsIGJvb2wgaHRtbCkKK3sKKyAgICBKU0V2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0g
ZmluZEpTRXZlbnRMaXN0ZW5lcih2YWwsIGh0bWwpOworICAgIGlmIChsaXN0ZW5lcikKKyAgICAg
ICAgcmV0dXJuIGxpc3RlbmVyOworCisgICAgaWYgKCF2YWwtPmlzT2JqZWN0KCkpCisgICAgICAg
IHJldHVybiAwOworICAgIEpTT2JqZWN0KiBvYmplY3QgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+
KHZhbCk7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlIEpTRXZlbnRMaXN0ZW5lciBjb25zdHJ1Y3Rv
ciBhZGRzIGl0IHRvIG91ciBqc0V2ZW50TGlzdGVuZXJzIGxpc3QKKyAgICByZXR1cm4gbmV3IEpT
RXZlbnRMaXN0ZW5lcihvYmplY3QsIHRoaXMsIGh0bWwpOworfQorCitKU1VucHJvdGVjdGVkRXZl
bnRMaXN0ZW5lciogV2luZG93OjpmaW5kSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIoSlNWYWx1
ZSogdmFsLCBib29sIGh0bWwpCit7CisgICAgaWYgKCF2YWwtPmlzT2JqZWN0KCkpCisgICAgICAg
IHJldHVybiAwOworICAgIEpTT2JqZWN0KiBvYmplY3QgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+
KHZhbCk7CisgICAgVW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAmIGxpc3RlbmVycyA9IGh0bWwgPyBk
LT5qc1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzIDogZC0+anNVbnByb3RlY3RlZEV2ZW50
TGlzdGVuZXJzOworICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KG9iamVjdCk7Cit9CisKK0pTVW5w
cm90ZWN0ZWRFdmVudExpc3RlbmVyKiBXaW5kb3c6OmZpbmRPckNyZWF0ZUpTVW5wcm90ZWN0ZWRF
dmVudExpc3RlbmVyKEpTVmFsdWUqIHZhbCwgYm9vbCBodG1sKQoreworICAgIEpTVW5wcm90ZWN0
ZWRFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IGZpbmRKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5l
cih2YWwsIGh0bWwpOworICAgIGlmIChsaXN0ZW5lcikKKyAgICAgICAgcmV0dXJuIGxpc3RlbmVy
OworICAgIGlmICghdmFsLT5pc09iamVjdCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBKU09i
amVjdCogb2JqZWN0ID0gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih2YWwpOworCisgICAgLy8gVGhl
IEpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyIGNvbnN0cnVjdG9yIGFkZHMgaXQgdG8gb3VyIGpz
VW5wcm90ZWN0ZWRFdmVudExpc3RlbmVycyBtYXAuCisgICAgcmV0dXJuIG5ldyBKU1VucHJvdGVj
dGVkRXZlbnRMaXN0ZW5lcihvYmplY3QsIHRoaXMsIGh0bWwpOworfQorCit2b2lkIFdpbmRvdzo6
Y2xlYXJIZWxwZXJPYmplY3RQcm9wZXJ0aWVzKCkKK3sKKyAgICBkLT5sb2MgPSAwOworICAgIGQt
Pm1fZXZ0ID0gMDsKK30KKwordm9pZCBXaW5kb3c6OmNsZWFyKCkKK3sKKyAgSlNMb2NrIGxvY2s7
CisKKyAgaWYgKGQtPm1fcmV0dXJuVmFsdWVTbG90ICYmICEqZC0+bV9yZXR1cm5WYWx1ZVNsb3Qp
CisgICAgKmQtPm1fcmV0dXJuVmFsdWVTbG90ID0gZ2V0RGlyZWN0KCJyZXR1cm5WYWx1ZSIpOwor
CisgIGNsZWFyQWxsVGltZW91dHMoKTsKKyAgY2xlYXJQcm9wZXJ0aWVzKCk7CisgIGNsZWFySGVs
cGVyT2JqZWN0UHJvcGVydGllcygpOworCisgIC8vIE5vdyByZWNyZWF0ZSBhIHdvcmtpbmcgZ2xv
YmFsIG9iamVjdCBmb3IgdGhlIG5leHQgVVJMIHRoYXQgd2lsbCB1c2UgdXM7IGJ1dCBvbmx5IGlm
IHdlIGhhdmVuJ3QgYmVlbgorICAvLyBkaXNjb25uZWN0ZWQgeWV0CisgIGlmIChGcmFtZSogZnJh
bWUgPSBpbXBsKCktPmZyYW1lKCkpCisgICAgZnJhbWUtPnNjcmlwdFByb3h5KCktPmdsb2JhbE9i
amVjdCgpLT5yZXNldChKU0RPTVdpbmRvd1Byb3RvdHlwZTo6c2VsZigpKTsKKworICAvLyB0aGVy
ZSdzIGxpa2VseSB0byBiZSBsb3RzIG9mIGdhcmJhZ2Ugbm93CisgIGdjQ29udHJvbGxlcigpLmdh
cmJhZ2VDb2xsZWN0U29vbigpOworfQorCit2b2lkIFdpbmRvdzo6c2V0Q3VycmVudEV2ZW50KEV2
ZW50KiBldnQpCit7CisgICAgZC0+bV9ldnQgPSBldnQ7Cit9CisKK0V2ZW50KiBXaW5kb3c6OmN1
cnJlbnRFdmVudCgpCit7CisgICAgcmV0dXJuIGQtPm1fZXZ0OworfQorCitKU1ZhbHVlKiBXaW5k
b3dQcm90b0Z1bmNBVG9COjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0
KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJp
dHMoJldpbmRvdzo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVF
cnJvcik7CisKKyAgICBpZiAoYXJncy5zaXplKCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dF
cnJvcihleGVjLCBTeW50YXhFcnJvciwgIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7CisKKyAgICBK
U1ZhbHVlKiB2ID0gYXJnc1swXTsKKyAgICBpZiAodi0+aXNOdWxsKCkpCisgICAgICAgIHJldHVy
biBqc1N0cmluZygpOworCisgICAgVVN0cmluZyBzID0gdi0+dG9TdHJpbmcoZXhlYyk7CisgICAg
aWYgKCFzLmlzOEJpdCgpKSB7CisgICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBJTlZBTElE
X0NIQVJBQ1RFUl9FUlIpOworICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CisK
KyAgICBWZWN0b3I8Y2hhcj4gaW4ocy5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
cy5zaXplKCk7ICsraSkKKyAgICAgICAgaW5baV0gPSBzdGF0aWNfY2FzdDxjaGFyPihzLmRhdGEo
KVtpXS51bmljb2RlKCkpOworICAgIFZlY3RvcjxjaGFyPiBvdXQ7CisKKyAgICBpZiAoIWJhc2U2
NERlY29kZShpbiwgb3V0KSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgR2VuZXJh
bEVycm9yLCAiQ2Fubm90IGRlY29kZSBiYXNlNjQiKTsKKworICAgIHJldHVybiBqc1N0cmluZyhT
dHJpbmcob3V0LmRhdGEoKSwgb3V0LnNpemUoKSkpOworfQorCitKU1ZhbHVlKiBXaW5kb3dQcm90
b0Z1bmNCVG9BOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlz
T2JqLCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJldp
bmRvdzo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7
CisKKyAgICBpZiAoYXJncy5zaXplKCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihl
eGVjLCBTeW50YXhFcnJvciwgIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7CisKKyAgICBKU1ZhbHVl
KiB2ID0gYXJnc1swXTsKKyAgICBpZiAodi0+aXNOdWxsKCkpCisgICAgICAgIHJldHVybiBqc1N0
cmluZygpOworCisgICAgVVN0cmluZyBzID0gdi0+dG9TdHJpbmcoZXhlYyk7CisgICAgaWYgKCFz
LmlzOEJpdCgpKSB7CisgICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBJTlZBTElEX0NIQVJB
Q1RFUl9FUlIpOworICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBW
ZWN0b3I8Y2hhcj4gaW4ocy5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5zaXpl
KCk7ICsraSkKKyAgICAgICAgaW5baV0gPSBzdGF0aWNfY2FzdDxjaGFyPihzLmRhdGEoKVtpXS51
bmljb2RlKCkpOworICAgIFZlY3RvcjxjaGFyPiBvdXQ7CisKKyAgICBiYXNlNjRFbmNvZGUoaW4s
IG91dCk7CisKKyAgICByZXR1cm4ganNTdHJpbmcoU3RyaW5nKG91dC5kYXRhKCksIG91dC5zaXpl
KCkpKTsKK30KKworSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jT3Blbjo6Y2FsbEFzRnVuY3Rpb24o
RXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKK3sK
KyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQorICAgICAgICByZXR1
cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOworICAgIFdpbmRvdyogd2luZG93ID0gc3Rh
dGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7CisgICAgRnJhbWUqIGZyYW1lID0gd2luZG93LT5p
bXBsKCktPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZp
bmVkKCk7CisgICAgRnJhbWUqIGFjdGl2ZUZyYW1lID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShl
eGVjKS0+aW1wbCgpLT5mcmFtZSgpOworICAgIGlmICghYWN0aXZlRnJhbWUpCisgICAgICAgIHJl
dHVybiAganNVbmRlZmluZWQoKTsKKworICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpOwor
CisgICAgU3RyaW5nIHVybFN0cmluZyA9IHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JOdWxs
Q2hlY2soZXhlYywgYXJnc1swXSk7CisgICAgQXRvbWljU3RyaW5nIGZyYW1lTmFtZSA9IGFyZ3Nb
MV0tPmlzVW5kZWZpbmVkT3JOdWxsKCkgPyAiX2JsYW5rIiA6IEF0b21pY1N0cmluZyhhcmdzWzFd
LT50b1N0cmluZyhleGVjKSk7CisKKyAgICAvLyBCZWNhdXNlIEZyYW1lVHJlZTo6ZmluZCgpIHJl
dHVybnMgdHJ1ZSBmb3IgZW1wdHkgc3RyaW5ncywgd2UgbXVzdCBjaGVjayBmb3IgZW1wdHkgZnJh
bWVuYW1lcy4KKyAgICAvLyBPdGhlcndpc2UsIGlsbGVnaXRpbWF0ZSB3aW5kb3cub3BlbigpIGNh
bGxzIHdpdGggbm8gbmFtZSB3aWxsIHBhc3MgcmlnaHQgdGhyb3VnaCB0aGUgcG9wdXAgYmxvY2tl
ci4KKyAgICBpZiAoIWFsbG93UG9wVXAoZnJhbWUpICYmIChmcmFtZU5hbWUuaXNFbXB0eSgpIHx8
ICFmcmFtZS0+dHJlZSgpLT5maW5kKGZyYW1lTmFtZSkpKQorICAgICAgICByZXR1cm4ganNVbmRl
ZmluZWQoKTsKKworICAgIC8vIEdldCB0aGUgdGFyZ2V0IGZyYW1lIGZvciB0aGUgc3BlY2lhbCBj
YXNlcyBvZiBfdG9wIGFuZCBfcGFyZW50LiAgSW4gdGhvc2UKKyAgICAvLyBjYXNlcywgd2UgY2Fu
IHNjaGVkdWxlIGEgbG9jYXRpb24gY2hhbmdlIHJpZ2h0IG5vdyBhbmQgcmV0dXJuIGVhcmx5Lgor
ICAgIGJvb2wgdG9wT3JQYXJlbnQgPSBmYWxzZTsKKyAgICBpZiAoZnJhbWVOYW1lID09ICJfdG9w
IikgeworICAgICAgICBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRvcCgpOworICAgICAgICB0b3BP
clBhcmVudCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChmcmFtZU5hbWUgPT0gIl9wYXJlbnQiKSB7
CisgICAgICAgIGlmIChGcmFtZSogcGFyZW50ID0gZnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpCisg
ICAgICAgICAgICBmcmFtZSA9IHBhcmVudDsKKyAgICAgICAgaWYgKCFhY3RpdmVGcmFtZS0+bG9h
ZGVyKCktPnNob3VsZEFsbG93TmF2aWdhdGlvbihmcmFtZSkpCisgICAgICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKKyAgICAgICAgdG9wT3JQYXJlbnQgPSB0cnVlOworICAgIH0KKyAgICBp
ZiAodG9wT3JQYXJlbnQpIHsKKyAgICAgICAgU3RyaW5nIGNvbXBsZXRlZFVSTDsKKyAgICAgICAg
aWYgKCF1cmxTdHJpbmcuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29tcGxldGVkVVJMID0gYWN0
aXZlRnJhbWUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybFN0cmluZyk7CisKKyAgICAgICAg
Y29uc3QgV2luZG93KiB0YXJnZXRlZFdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5kb3coZnJh
bWUpOworICAgICAgICBpZiAoIWNvbXBsZXRlZFVSTC5pc0VtcHR5KCkgJiYgKCFjb21wbGV0ZWRV
Ukwuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkgfHwgKHRhcmdldGVkV2luZG93ICYm
IHRhcmdldGVkV2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSkpIHsKKyAgICAgICAgICAg
IGJvb2wgdXNlckdlc3R1cmUgPSBhY3RpdmVGcmFtZS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKCk7CisgICAgICAgICAgICBmcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxlTG9j
YXRpb25DaGFuZ2UoY29tcGxldGVkVVJMLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5n
UmVmZXJyZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gV2luZG93OjpyZXRyaWV2ZShmcmFtZSk7CisgICAgfQorCisgICAgLy8gSW4gdGhlIGNhc2Ug
b2YgYSBuYW1lZCBmcmFtZSBvciBhIG5ldyB3aW5kb3csIHdlJ2xsIHVzZSB0aGUgY3JlYXRlV2lu
ZG93KCkgaGVscGVyCisgICAgV2luZG93RmVhdHVyZXMgd2luZG93RmVhdHVyZXModmFsdWVUb1N0
cmluZ1dpdGhVbmRlZmluZWRPck51bGxDaGVjayhleGVjLCBhcmdzWzJdKSk7CisgICAgRmxvYXRS
ZWN0IHdpbmRvd1JlY3Qod2luZG93RmVhdHVyZXMueCwgd2luZG93RmVhdHVyZXMueSwgd2luZG93
RmVhdHVyZXMud2lkdGgsIHdpbmRvd0ZlYXR1cmVzLmhlaWdodCk7CisgICAgV2ViQ29yZTo6RE9N
V2luZG93OjphZGp1c3RXaW5kb3dSZWN0KHNjcmVlbkF2YWlsYWJsZVJlY3QocGFnZS0+bWFpbkZy
YW1lKCktPnZpZXcoKSksIHdpbmRvd1JlY3QsIHdpbmRvd1JlY3QpOworCisgICAgd2luZG93RmVh
dHVyZXMueCA9IHdpbmRvd1JlY3QueCgpOworICAgIHdpbmRvd0ZlYXR1cmVzLnkgPSB3aW5kb3dS
ZWN0LnkoKTsKKyAgICB3aW5kb3dGZWF0dXJlcy5oZWlnaHQgPSB3aW5kb3dSZWN0LmhlaWdodCgp
OworICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRoID0gd2luZG93UmVjdC53aWR0aCgpOworCisgICAg
ZnJhbWUgPSBjcmVhdGVXaW5kb3coZXhlYywgZnJhbWUsIHVybFN0cmluZywgZnJhbWVOYW1lLCB3
aW5kb3dGZWF0dXJlcywgMCk7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4ganNV
bmRlZmluZWQoKTsKKworICAgIHJldHVybiBXaW5kb3c6OnJldHJpZXZlKGZyYW1lKTsgLy8gZ2xv
YmFsIG9iamVjdAorfQorCitKU1ZhbHVlKiBXaW5kb3dQcm90b0Z1bmNTZXRUaW1lb3V0OjpjYWxs
QXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0
JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJldpbmRvdzo6aW5mbykpCisg
ICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7CisgICAgV2luZG93KiB3
aW5kb3cgPSBzdGF0aWNfY2FzdDxXaW5kb3cqPih0aGlzT2JqKTsKKworICAgIEpTVmFsdWUqIHYg
PSBhcmdzWzBdOworICAgIGlmICh2LT5pc1N0cmluZygpKQorICAgICAgICByZXR1cm4ganNOdW1i
ZXIod2luZG93LT5pbnN0YWxsVGltZW91dCh2LT50b1N0cmluZyhleGVjKSwgYXJnc1sxXS0+dG9J
bnQzMihleGVjKSwgdHJ1ZSAvKnNpbmdsZSBzaG90Ki8pKTsKKyAgICBpZiAodi0+aXNPYmplY3Qo
KSAmJiBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYpLT5pbXBsZW1lbnRzQ2FsbCgpKSB7CisgICAg
ICAgIExpc3QgYXJnc1RhaWw7CisgICAgICAgIGFyZ3MuZ2V0U2xpY2UoMiwgYXJnc1RhaWwpOwor
ICAgICAgICByZXR1cm4ganNOdW1iZXIod2luZG93LT5pbnN0YWxsVGltZW91dCh2LCBhcmdzVGFp
bCwgYXJnc1sxXS0+dG9JbnQzMihleGVjKSwgdHJ1ZSAvKnNpbmdsZSBzaG90Ki8pKTsKKyAgICB9
CisKKyAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKK30KKworSlNWYWx1ZSogV2luZG93UHJvdG9G
dW5jQ2xlYXJUaW1lb3V0OjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0
KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIC8vIEFsc28gdGhlIGltcGxlbWVu
dGF0aW9uIGZvciB3aW5kb3cuY2xlYXJJbnRlcnZhbCgpCisKKyAgICBpZiAoIXRoaXNPYmotPmlu
aGVyaXRzKCZXaW5kb3c6OmluZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBU
eXBlRXJyb3IpOworICAgIFdpbmRvdyogd2luZG93ID0gc3RhdGljX2Nhc3Q8V2luZG93Kj4odGhp
c09iaik7CisKKyAgICB3aW5kb3ctPmNsZWFyVGltZW91dChhcmdzWzBdLT50b0ludDMyKGV4ZWMp
KTsKKyAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKK30KKworSlNWYWx1ZSogV2luZG93UHJvdG9G
dW5jU2V0SW50ZXJ2YWw6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3Qq
IHRoaXNPYmosIGNvbnN0IExpc3QmIGFyZ3MpCit7CisgICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0
cygmV2luZG93OjppbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVy
cm9yKTsKKyAgICBXaW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmop
OworCisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDIpIHsKKyAgICAgICAgSlNWYWx1ZSogdiA9IGFy
Z3NbMF07CisgICAgICAgIGludCBkZWxheSA9IGFyZ3NbMV0tPnRvSW50MzIoZXhlYyk7CisgICAg
ICAgIGlmICh2LT5pc1N0cmluZygpKQorICAgICAgICAgICAgcmV0dXJuIGpzTnVtYmVyKHdpbmRv
dy0+aW5zdGFsbFRpbWVvdXQodi0+dG9TdHJpbmcoZXhlYyksIGRlbGF5LCBmYWxzZSkpOworICAg
ICAgICBpZiAodi0+aXNPYmplY3QoKSAmJiBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYpLT5pbXBs
ZW1lbnRzQ2FsbCgpKSB7CisgICAgICAgICAgICBMaXN0IGFyZ3NUYWlsOworICAgICAgICAgICAg
YXJncy5nZXRTbGljZSgyLCBhcmdzVGFpbCk7CisgICAgICAgICAgICByZXR1cm4ganNOdW1iZXIo
d2luZG93LT5pbnN0YWxsVGltZW91dCh2LCBhcmdzVGFpbCwgZGVsYXksIGZhbHNlKSk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKworfQorCitKU1ZhbHVl
KiBXaW5kb3dQcm90b0Z1bmNBZGRFdmVudExpc3RlbmVyOjpjYWxsQXNGdW5jdGlvbihFeGVjU3Rh
dGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlm
ICghdGhpc09iai0+aW5oZXJpdHMoJldpbmRvdzo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJv
d0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7CisgICAgV2luZG93KiB3aW5kb3cgPSBzdGF0aWNfY2Fz
dDxXaW5kb3cqPih0aGlzT2JqKTsKKyAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3ctPmltcGwoKS0+
ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsK
KworICAgIGlmIChKU0V2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gd2luZG93LT5maW5kT3JDcmVh
dGVKU0V2ZW50TGlzdGVuZXIoYXJnc1sxXSkpIHsKKyAgICAgICAgaWYgKERvY3VtZW50KiBkb2Mg
PSBmcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgICAgIGRvYy0+YWRkV2luZG93RXZlbnRMaXN0
ZW5lcihBdG9taWNTdHJpbmcoYXJnc1swXS0+dG9TdHJpbmcoZXhlYykpLCBsaXN0ZW5lciwgYXJn
c1syXS0+dG9Cb29sZWFuKGV4ZWMpKTsKKyAgICB9CisKKyAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKK30KKworSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jUmVtb3ZlRXZlbnRMaXN0ZW5lcjo6Y2Fs
bEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlz
dCYgYXJncykKK3sKKyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQor
ICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOworICAgIFdpbmRvdyog
d2luZG93ID0gc3RhdGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7CisgICAgRnJhbWUqIGZyYW1l
ID0gd2luZG93LT5pbXBsKCktPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0
dXJuIGpzVW5kZWZpbmVkKCk7CisKKyAgICBpZiAoSlNFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9
IHdpbmRvdy0+ZmluZEpTRXZlbnRMaXN0ZW5lcihhcmdzWzFdKSkgeworICAgICAgICBpZiAoRG9j
dW1lbnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICAgICAgZG9jLT5yZW1vdmVX
aW5kb3dFdmVudExpc3RlbmVyKEF0b21pY1N0cmluZyhhcmdzWzBdLT50b1N0cmluZyhleGVjKSks
IGxpc3RlbmVyLCBhcmdzWzJdLT50b0Jvb2xlYW4oZXhlYykpOworICAgIH0KKworICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOworfQorCitKU1ZhbHVlKiBXaW5kb3dQcm90b0Z1bmNTaG93TW9kYWxE
aWFsb2c6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmos
IGNvbnN0IExpc3QmIGFyZ3MpCit7CisgICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmV2luZG93
OjppbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKKyAg
ICBXaW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmopOworICAgIEZy
YW1lKiBmcmFtZSA9IHdpbmRvdy0+aW1wbCgpLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisg
ICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworCisgICAgcmV0dXJuIHNob3dNb2RhbERpYWxv
ZyhleGVjLCBmcmFtZSwgdmFsdWVUb1N0cmluZ1dpdGhVbmRlZmluZWRPck51bGxDaGVjayhleGVj
LCBhcmdzWzBdKSwgYXJnc1sxXSwgdmFsdWVUb1N0cmluZ1dpdGhVbmRlZmluZWRPck51bGxDaGVj
ayhleGVjLCBhcmdzWzJdKSk7Cit9CisKK0pTVmFsdWUqIFdpbmRvd1Byb3RvRnVuY05vdEltcGxl
bWVudGVkOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2Jq
LCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJldpbmRv
dzo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7CisK
KyAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKK30KKwordm9pZCBXaW5kb3c6OnNldFJldHVyblZh
bHVlU2xvdChKU1ZhbHVlKiogc2xvdCkKK3sKKyAgICBkLT5tX3JldHVyblZhbHVlU2xvdCA9IHNs
b3Q7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gU2NoZWR1bGVkQWN0aW9uIC8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLworCit2b2lkIFNjaGVkdWxlZEFjdGlvbjo6ZXhlY3V0ZShXaW5kb3cq
IHdpbmRvdykKK3sKKyAgICBSZWZQdHI8RnJhbWU+IGZyYW1lID0gd2luZG93LT5pbXBsKCktPmZy
YW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgS0pTUHJveHkq
IHNjcmlwdFByb3h5ID0gZnJhbWUtPnNjcmlwdFByb3h5KCk7CisgICAgaWYgKCFzY3JpcHRQcm94
eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2luZG93KiBnbG9iYWxPYmplY3QgPSBzY3JpcHRQ
cm94eS0+Z2xvYmFsT2JqZWN0KCk7CisKKyAgICBzY3JpcHRQcm94eS0+c2V0UHJvY2Vzc2luZ1Rp
bWVyQ2FsbGJhY2sodHJ1ZSk7CisKKyAgICBpZiAoSlNWYWx1ZSogZnVuYyA9IG1fZnVuYy5nZXQo
KSkgeworICAgICAgICBKU0xvY2sgbG9jazsKKyAgICAgICAgaWYgKGZ1bmMtPmlzT2JqZWN0KCkg
JiYgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihmdW5jKS0+aW1wbGVtZW50c0NhbGwoKSkgeworICAg
ICAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gd2luZG93LT5nbG9iYWxFeGVjKCk7CisgICAgICAg
ICAgICBBU1NFUlQod2luZG93ID09IGdsb2JhbE9iamVjdCk7CisKKyAgICAgICAgICAgIExpc3Qg
YXJnczsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gbV9hcmdzLnNpemUoKTsKKyAgICAgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAg
YXJncy5hcHBlbmQobV9hcmdzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2xv
YmFsT2JqZWN0LT5zdGFydFRpbWVvdXRDaGVjaygpOworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
SlNPYmplY3QqPihmdW5jKS0+Y2FsbChleGVjLCB3aW5kb3csIGFyZ3MpOworICAgICAgICAgICAg
Z2xvYmFsT2JqZWN0LT5zdG9wVGltZW91dENoZWNrKCk7CisgICAgICAgICAgICBpZiAoZXhlYy0+
aGFkRXhjZXB0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBKU09iamVjdCogZXhjZXB0aW9uID0g
ZXhlYy0+ZXhjZXB0aW9uKCktPnRvT2JqZWN0KGV4ZWMpOworICAgICAgICAgICAgICAgIGV4ZWMt
PmNsZWFyRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBleGNl
cHRpb24tPmdldChleGVjLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkubWVzc2FnZSktPnRvU3RyaW5n
KGV4ZWMpOworICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyID0gZXhjZXB0aW9uLT5nZXQo
ZXhlYywgImxpbmUiKS0+dG9JbnQzMihleGVjKTsKKyAgICAgICAgICAgICAgICBpZiAoSW50ZXJw
cmV0ZXI6OnNob3VsZFByaW50RXhjZXB0aW9ucygpKQorICAgICAgICAgICAgICAgICAgICBwcmlu
dGYoIih0aW1lcik6JXNcbiIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7CisgICAgICAgICAgICAg
ICAgaWYgKFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpKQorICAgICAgICAgICAgICAgICAgICBw
YWdlLT5jaHJvbWUoKS0+YWRkTWVzc2FnZVRvQ29uc29sZShKU01lc3NhZ2VTb3VyY2UsIEVycm9y
TWVzc2FnZUxldmVsLCBtZXNzYWdlLCBsaW5lTnVtYmVyLCBTdHJpbmcoKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5leGVj
dXRlU2NyaXB0KG1fY29kZSk7CisKKyAgICAvLyBVcGRhdGUgb3VyIGRvY3VtZW50J3MgcmVuZGVy
aW5nIGZvbGxvd2luZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0aW1lb3V0IGNhbGxiYWNrLgorICAg
IC8vIEZJWE1FOiBXaHkgbm90IHVzZSB1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcgdG8gdXBkYXRl
IHJlbmRlcmluZyBvZiBhbGwgZG9jdW1lbnRzPworICAgIC8vIEZJWE1FOiBJcyB0aGlzIHJlYWxs
eSB0aGUgcmlnaHQgcG9pbnQgdG8gZG8gdGhlIHVwZGF0ZT8gV2UgbmVlZCBhIHBsYWNlIHRoYXQg
d29ya3MKKyAgICAvLyBmb3IgYWxsIHBvc3NpYmxlIGVudHJ5IHBvaW50cyB0aGF0IG1pZ2h0IHBv
c3NpYmx5IGV4ZWN1dGUgc2NyaXB0LCBidXQgdGhpcyBzZWVtcworICAgIC8vIHRvIGJlIGEgYml0
IHRvbyBsb3ctbGV2ZWwuCisgICAgaWYgKERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQo
KSkKKyAgICAgICAgZG9jLT51cGRhdGVSZW5kZXJpbmcoKTsKKworICAgIHNjcmlwdFByb3h5LT5z
ZXRQcm9jZXNzaW5nVGltZXJDYWxsYmFjayhmYWxzZSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8gdGltZW91dHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgV2luZG93Ojpj
bGVhckFsbFRpbWVvdXRzKCkKK3sKKyAgICBkZWxldGVBbGxWYWx1ZXMoZC0+bV90aW1lb3V0cyk7
CisgICAgZC0+bV90aW1lb3V0cy5jbGVhcigpOworfQorCitpbnQgV2luZG93OjppbnN0YWxsVGlt
ZW91dChTY2hlZHVsZWRBY3Rpb24qIGEsIGludCB0LCBib29sIHNpbmdsZVNob3QpCit7CisgICAg
aW50IHRpbWVvdXRJZCA9ICsrbGFzdFVzZWRUaW1lb3V0SWQ7CisKKyAgICAvLyBhdm9pZCB3cmFw
YXJvdW5kIGdvaW5nIG5lZ2F0aXZlIG9uIHVzCisgICAgaWYgKHRpbWVvdXRJZCA8PSAwKQorICAg
ICAgICB0aW1lb3V0SWQgPSAxOworCisgICAgaW50IG5lc3RMZXZlbCA9IHRpbWVyTmVzdGluZ0xl
dmVsICsgMTsKKyAgICBET01XaW5kb3dUaW1lciogdGltZXIgPSBuZXcgRE9NV2luZG93VGltZXIo
dGltZW91dElkLCBuZXN0TGV2ZWwsIHRoaXMsIGEpOworICAgIEFTU0VSVCghZC0+bV90aW1lb3V0
cy5nZXQodGltZW91dElkKSk7CisgICAgZC0+bV90aW1lb3V0cy5zZXQodGltZW91dElkLCB0aW1l
cik7CisgICAgLy8gVXNlIGEgbWluaW11bSBpbnRlcnZhbCBvZiAxMCBtcyB0byBtYXRjaCBvdGhl
ciBicm93c2VycywgYnV0IG9ubHkgb25jZSB3ZSd2ZQorICAgIC8vIG5lc3RlZCBlbm91Z2ggdG8g
bm90aWNlIHRoYXQgd2UncmUgcmVwZWF0aW5nLgorICAgIC8vIEZhc3RlciB0aW1lcnMgbWlnaHQg
YmUgImJldHRlciIsIGJ1dCB0aGV5J3JlIGluY29tcGF0aWJsZS4KKyAgICBkb3VibGUgaW50ZXJ2
YWwgPSBtYXgoMC4wMDEsIHQgKiAwLjAwMSk7CisgICAgaWYgKGludGVydmFsIDwgY01pbmltdW1U
aW1lckludGVydmFsICYmIG5lc3RMZXZlbCA+PSBjTWF4VGltZXJOZXN0aW5nTGV2ZWwpCisgICAg
ICAgIGludGVydmFsID0gY01pbmltdW1UaW1lckludGVydmFsOworICAgIGlmIChzaW5nbGVTaG90
KQorICAgICAgICB0aW1lci0+c3RhcnRPbmVTaG90KGludGVydmFsKTsKKyAgICBlbHNlCisgICAg
ICAgIHRpbWVyLT5zdGFydFJlcGVhdGluZyhpbnRlcnZhbCk7CisgICAgcmV0dXJuIHRpbWVvdXRJ
ZDsKK30KKworU2NoZWR1bGVkQWN0aW9uOjpTY2hlZHVsZWRBY3Rpb24oSlNWYWx1ZSogZnVuYywg
Y29uc3QgTGlzdCYgYXJncykKKyAgICA6IG1fZnVuYyhmdW5jKQoreworICAgIExpc3Q6OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IGFyZ3MuZW5kKCk7CisgICAgZm9yIChMaXN0Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IGFyZ3MuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICBtX2FyZ3MuYXBw
ZW5kKCppdCk7Cit9CisKK2ludCBXaW5kb3c6Omluc3RhbGxUaW1lb3V0KGNvbnN0IFVTdHJpbmcm
IGhhbmRsZXIsIGludCB0LCBib29sIHNpbmdsZVNob3QpCit7CisgICAgcmV0dXJuIGluc3RhbGxU
aW1lb3V0KG5ldyBTY2hlZHVsZWRBY3Rpb24oaGFuZGxlciksIHQsIHNpbmdsZVNob3QpOworfQor
CitpbnQgV2luZG93OjppbnN0YWxsVGltZW91dChKU1ZhbHVlKiBmdW5jLCBjb25zdCBMaXN0JiBh
cmdzLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90KQoreworICAgIHJldHVybiBpbnN0YWxsVGltZW91
dChuZXcgU2NoZWR1bGVkQWN0aW9uKGZ1bmMsIGFyZ3MpLCB0LCBzaW5nbGVTaG90KTsKK30KKwor
V2ViQ29yZTo6UGF1c2VkVGltZW91dHMqIFdpbmRvdzo6cGF1c2VUaW1lb3V0cygpCit7CisgICAg
c2l6ZV90IGNvdW50ID0gZC0+bV90aW1lb3V0cy5zaXplKCk7CisgICAgaWYgKGNvdW50ID09IDAp
CisgICAgICAgIHJldHVybiAwOworCisgICAgUGF1c2VkVGltZW91dCogdCA9IG5ldyBQYXVzZWRU
aW1lb3V0IFtjb3VudF07CisgICAgUGF1c2VkVGltZW91dHMqIHJlc3VsdCA9IG5ldyBQYXVzZWRU
aW1lb3V0cyh0LCBjb3VudCk7CisKKyAgICBXaW5kb3dQcml2YXRlOjpUaW1lb3V0c01hcDo6aXRl
cmF0b3IgaXQgPSBkLT5tX3RpbWVvdXRzLmJlZ2luKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgIT0gY291bnQ7ICsraSwgKytpdCkgeworICAgICAgICBpbnQgdGltZW91dElkID0gaXQtPmZp
cnN0OworICAgICAgICBET01XaW5kb3dUaW1lciogdGltZXIgPSBpdC0+c2Vjb25kOworICAgICAg
ICB0W2ldLnRpbWVvdXRJZCA9IHRpbWVvdXRJZDsKKyAgICAgICAgdFtpXS5uZXN0aW5nTGV2ZWwg
PSB0aW1lci0+bmVzdGluZ0xldmVsKCk7CisgICAgICAgIHRbaV0ubmV4dEZpcmVJbnRlcnZhbCA9
IHRpbWVyLT5uZXh0RmlyZUludGVydmFsKCk7CisgICAgICAgIHRbaV0ucmVwZWF0SW50ZXJ2YWwg
PSB0aW1lci0+cmVwZWF0SW50ZXJ2YWwoKTsKKyAgICAgICAgdFtpXS5hY3Rpb24gPSB0aW1lci0+
dGFrZUFjdGlvbigpOworICAgIH0KKyAgICBBU1NFUlQoaXQgPT0gZC0+bV90aW1lb3V0cy5lbmQo
KSk7CisKKyAgICBkZWxldGVBbGxWYWx1ZXMoZC0+bV90aW1lb3V0cyk7CisgICAgZC0+bV90aW1l
b3V0cy5jbGVhcigpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBXaW5kb3c6OnJl
c3VtZVRpbWVvdXRzKFBhdXNlZFRpbWVvdXRzKiB0aW1lb3V0cykKK3sKKyAgICBpZiAoIXRpbWVv
dXRzKQorICAgICAgICByZXR1cm47CisgICAgc2l6ZV90IGNvdW50ID0gdGltZW91dHMtPm51bVRp
bWVvdXRzKCk7CisgICAgUGF1c2VkVGltZW91dCogYXJyYXkgPSB0aW1lb3V0cy0+dGFrZVRpbWVv
dXRzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQ7ICsraSkgeworICAgICAg
ICBpbnQgdGltZW91dElkID0gYXJyYXlbaV0udGltZW91dElkOworICAgICAgICBET01XaW5kb3dU
aW1lciogdGltZXIgPSBuZXcgRE9NV2luZG93VGltZXIodGltZW91dElkLCBhcnJheVtpXS5uZXN0
aW5nTGV2ZWwsIHRoaXMsIGFycmF5W2ldLmFjdGlvbik7CisgICAgICAgIGQtPm1fdGltZW91dHMu
c2V0KHRpbWVvdXRJZCwgdGltZXIpOworICAgICAgICB0aW1lci0+c3RhcnQoYXJyYXlbaV0ubmV4
dEZpcmVJbnRlcnZhbCwgYXJyYXlbaV0ucmVwZWF0SW50ZXJ2YWwpOworICAgIH0KKyAgICBkZWxl
dGUgW10gYXJyYXk7Cit9CisKK3ZvaWQgV2luZG93OjpjbGVhclRpbWVvdXQoaW50IHRpbWVvdXRJ
ZCwgYm9vbCBkZWxBY3Rpb24pCit7CisgICAgLy8gdGltZW91dCBJRHMgaGF2ZSB0byBiZSBwb3Np
dGl2ZSwgYW5kIDAgYW5kIC0xIGFyZSB1bnNhZmUgdG8KKyAgICAvLyBldmVuIGxvb2sgdXAgc2lu
Y2UgdGhleSBhcmUgdGhlIGVtcHR5IGFuZCBkZWxldGVkIHZhbHVlCisgICAgLy8gcmVzcGVjdGl2
ZWx5CisgICAgaWYgKHRpbWVvdXRJZCA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBkZWxl
dGUgZC0+bV90aW1lb3V0cy50YWtlKHRpbWVvdXRJZCk7Cit9CisKK3ZvaWQgV2luZG93Ojp0aW1l
ckZpcmVkKERPTVdpbmRvd1RpbWVyKiB0aW1lcikKK3sKKyAgICAvLyBTaW1wbGUgY2FzZSBmb3Ig
bm9uLW9uZS1zaG90IHRpbWVycy4KKyAgICBpZiAodGltZXItPmlzQWN0aXZlKCkpIHsKKyAgICAg
ICAgaW50IHRpbWVvdXRJZCA9IHRpbWVyLT50aW1lb3V0SWQoKTsKKworICAgICAgICB0aW1lci0+
YWN0aW9uKCktPmV4ZWN1dGUodGhpcyk7CisgICAgICAgIGlmIChkLT5tX3RpbWVvdXRzLmNvbnRh
aW5zKHRpbWVvdXRJZCkgJiYgdGltZXItPnJlcGVhdEludGVydmFsKCkgJiYgdGltZXItPnJlcGVh
dEludGVydmFsKCkgPCBjTWluaW11bVRpbWVySW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIHRpbWVy
LT5zZXROZXN0aW5nTGV2ZWwodGltZXItPm5lc3RpbmdMZXZlbCgpICsgMSk7CisgICAgICAgICAg
ICBpZiAodGltZXItPm5lc3RpbmdMZXZlbCgpID49IGNNYXhUaW1lck5lc3RpbmdMZXZlbCkKKyAg
ICAgICAgICAgICAgICB0aW1lci0+YXVnbWVudFJlcGVhdEludGVydmFsKGNNaW5pbXVtVGltZXJJ
bnRlcnZhbCAtIHRpbWVyLT5yZXBlYXRJbnRlcnZhbCgpKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gRGVsZXRlIHRpbWVyIGJlZm9yZSBleGVjdXRpbmcgdGhl
IGFjdGlvbiBmb3Igb25lLXNob3QgdGltZXJzLgorICAgIFNjaGVkdWxlZEFjdGlvbiogYWN0aW9u
ID0gdGltZXItPnRha2VBY3Rpb24oKTsKKyAgICBkLT5tX3RpbWVvdXRzLnJlbW92ZSh0aW1lci0+
dGltZW91dElkKCkpOworICAgIGRlbGV0ZSB0aW1lcjsKKyAgICBhY3Rpb24tPmV4ZWN1dGUodGhp
cyk7CisKKyAgICBKU0xvY2sgbG9jazsKKyAgICBkZWxldGUgYWN0aW9uOworfQorCit2b2lkIFdp
bmRvdzo6ZGlzY29ubmVjdEZyYW1lKCkKK3sKKyAgICBjbGVhckFsbFRpbWVvdXRzKCk7CisgICAg
aWYgKGQtPmxvYykKKyAgICAgICAgZC0+bG9jLT5tX2ZyYW1lID0gMDsKK30KKworV2luZG93OjpM
aXN0ZW5lcnNNYXAmIFdpbmRvdzo6anNFdmVudExpc3RlbmVycygpCit7CisgICAgcmV0dXJuIGQt
PmpzRXZlbnRMaXN0ZW5lcnM7Cit9CisKK1dpbmRvdzo6TGlzdGVuZXJzTWFwJiBXaW5kb3c6Ompz
SFRNTEV2ZW50TGlzdGVuZXJzKCkKK3sKKyAgICByZXR1cm4gZC0+anNIVE1MRXZlbnRMaXN0ZW5l
cnM7Cit9CisKK1dpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAmIFdpbmRvdzo6anNVbnBy
b3RlY3RlZEV2ZW50TGlzdGVuZXJzKCkKK3sKKyAgICByZXR1cm4gZC0+anNVbnByb3RlY3RlZEV2
ZW50TGlzdGVuZXJzOworfQorCitXaW5kb3c6OlVucHJvdGVjdGVkTGlzdGVuZXJzTWFwJiBXaW5k
b3c6OmpzVW5wcm90ZWN0ZWRIVE1MRXZlbnRMaXN0ZW5lcnMoKQoreworICAgIHJldHVybiBkLT5q
c1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vIExvY2F0aW9uIE9iamVjdCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgQ2xh
c3NJbmZvIExvY2F0aW9uOjppbmZvID0geyAiTG9jYXRpb24iLCAwLCAmTG9jYXRpb25UYWJsZSB9
OworLyoKK0BiZWdpbiBMb2NhdGlvblRhYmxlIDEyCisgIGFzc2lnbiAgICAgICAgJkxvY2F0aW9u
UHJvdG9GdW5jQXNzaWduOjpjcmVhdGUgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQorICBo
YXNoICAgICAgICAgIExvY2F0aW9uOjpIYXNoICAgICAgICAgICAgICAgICAgICAgICAgICBEb250
RGVsZXRlCisgIGhvc3QgICAgICAgICAgTG9jYXRpb246Okhvc3QgICAgICAgICAgICAgICAgICAg
ICAgICAgIERvbnREZWxldGUKKyAgaG9zdG5hbWUgICAgICBMb2NhdGlvbjo6SG9zdG5hbWUgICAg
ICAgICAgICAgICAgICAgICAgRG9udERlbGV0ZQorICBocmVmICAgICAgICAgIExvY2F0aW9uOjpI
cmVmICAgICAgICAgICAgICAgICAgICAgICAgICBEb250RGVsZXRlCisgIHBhdGhuYW1lICAgICAg
TG9jYXRpb246OlBhdGhuYW1lICAgICAgICAgICAgICAgICAgICAgIERvbnREZWxldGUKKyAgcG9y
dCAgICAgICAgICBMb2NhdGlvbjo6UG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgRG9udERl
bGV0ZQorICBwcm90b2NvbCAgICAgIExvY2F0aW9uOjpQcm90b2NvbCAgICAgICAgICAgICAgICAg
ICAgICBEb250RGVsZXRlCisgIHNlYXJjaCAgICAgICAgTG9jYXRpb246OlNlYXJjaCAgICAgICAg
ICAgICAgICAgICAgICAgIERvbnREZWxldGUKKyAgdG9TdHJpbmcgICAgICAmTG9jYXRpb25Qcm90
b0Z1bmNUb1N0cmluZzo6Y3JlYXRlICAgICAgRG9udEVudW18RG9udERlbGV0ZXxGdW5jdGlvbiAw
CisgIHJlcGxhY2UgICAgICAgJkxvY2F0aW9uUHJvdG9GdW5jUmVwbGFjZTo6Y3JlYXRlICAgICAg
IERvbnREZWxldGV8RnVuY3Rpb24gMQorICByZWxvYWQgICAgICAgICZMb2NhdGlvblByb3RvRnVu
Y1JlbG9hZDo6Y3JlYXRlICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDAKK0BlbmQKKyovCisK
K0xvY2F0aW9uOjpMb2NhdGlvbihGcmFtZSogZnJhbWUpCisgICAgOiBtX2ZyYW1lKGZyYW1lKQor
eworfQorCitKU1ZhbHVlICpMb2NhdGlvbjo6Z2V0VmFsdWVQcm9wZXJ0eShFeGVjU3RhdGUqIGV4
ZWMsIGludCB0b2tlbikgY29uc3QKK3sKKyAgS1VSTCB1cmwgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+
dXJsKCk7CisgIHN3aXRjaCAodG9rZW4pIHsKKyAgY2FzZSBIYXNoOgorICAgIHJldHVybiBqc1N0
cmluZyh1cmwucmVmKCkuaXNOdWxsKCkgPyAiIiA6ICIjIiArIHVybC5yZWYoKSk7CisgIGNhc2Ug
SG9zdDogeworICAgIC8vIE5vdGU6IHRoaXMgaXMgdGhlIElFIHNwZWMuIFRoZSBOUyBzcGVjIHN3
YXBzIHRoZSB0d28sIGl0IHNheXMKKyAgICAvLyAiVGhlIGhvc3RuYW1lIHByb3BlcnR5IGlzIHRo
ZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBob3N0IGFuZCBwb3J0IHByb3BlcnRpZXMsIHNlcGFyYXRl
ZCBieSBhIGNvbG9uLiIKKyAgICAvLyBCbGVoLgorICAgIFVTdHJpbmcgc3RyID0gdXJsLmhvc3Qo
KTsKKyAgICBpZiAodXJsLnBvcnQoKSkKKyAgICAgICAgc3RyICs9ICI6IiArIFN0cmluZzo6bnVt
YmVyKChpbnQpdXJsLnBvcnQoKSk7CisgICAgcmV0dXJuIGpzU3RyaW5nKHN0cik7CisgIH0KKyAg
Y2FzZSBIb3N0bmFtZToKKyAgICByZXR1cm4ganNTdHJpbmcodXJsLmhvc3QoKSk7CisgIGNhc2Ug
SHJlZjoKKyAgICBpZiAoIXVybC5oYXNQYXRoKCkpCisgICAgICByZXR1cm4ganNTdHJpbmcodXJs
LnByZXR0eVVSTCgpICsgIi8iKTsKKyAgICByZXR1cm4ganNTdHJpbmcodXJsLnByZXR0eVVSTCgp
KTsKKyAgY2FzZSBQYXRobmFtZToKKyAgICByZXR1cm4ganNTdHJpbmcodXJsLnBhdGgoKS5pc0Vt
cHR5KCkgPyAiLyIgOiB1cmwucGF0aCgpKTsKKyAgY2FzZSBQb3J0OgorICAgIHJldHVybiBqc1N0
cmluZyh1cmwucG9ydCgpID8gU3RyaW5nOjpudW1iZXIoKGludCl1cmwucG9ydCgpKSA6ICIiKTsK
KyAgY2FzZSBQcm90b2NvbDoKKyAgICByZXR1cm4ganNTdHJpbmcodXJsLnByb3RvY29sKCkgKyAi
OiIpOworICBjYXNlIFNlYXJjaDoKKyAgICByZXR1cm4ganNTdHJpbmcodXJsLnF1ZXJ5KCkpOwor
ICBkZWZhdWx0OgorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBqc1VuZGVm
aW5lZCgpOworICB9Cit9CisKK2Jvb2wgTG9jYXRpb246OmdldE93blByb3BlcnR5U2xvdChFeGVj
U3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90
JiBzbG90KQoreworICBpZiAoIW1fZnJhbWUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0
IFdpbmRvdyogd2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdpbmRvdyhtX2ZyYW1lKTsKKworICBj
b25zdCBIYXNoRW50cnkqIGVudHJ5ID0gTG9va3VwOjpmaW5kRW50cnkoJkxvY2F0aW9uVGFibGUs
IHByb3BlcnR5TmFtZSk7CisgIGlmICghZW50cnkgfHwgIShlbnRyeS0+YXR0ciAmIEtKUzo6RnVu
Y3Rpb24pIHx8IChlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9jYXRpb25Qcm90b0Z1
bmNSZXBsYWNlOjpjcmVhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICYmIGVudHJ5LT52YWx1ZS5mdW5jdGlvblZhbHVlICE9ICZMb2NhdGlvblBy
b3RvRnVuY1JlbG9hZDo6Y3JlYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAmJiBlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9jYXRp
b25Qcm90b0Z1bmNBc3NpZ246OmNyZWF0ZSkpICB7CisgICAgaWYgKCF3aW5kb3cgfHwgIXdpbmRv
dy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkgeworICAgICAgc2xvdC5zZXRVbmRlZmluZWQodGhp
cyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ2V0U3RhdGlj
UHJvcGVydHlTbG90PExvY2F0aW9uLCBKU09iamVjdD4oZXhlYywgJkxvY2F0aW9uVGFibGUsIHRo
aXMsIHByb3BlcnR5TmFtZSwgc2xvdCk7Cit9CisKK3ZvaWQgTG9jYXRpb246OnB1dChFeGVjU3Rh
dGUqIGV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSogdmFsdWUs
IGludCBhdHRyKQoreworICBpZiAoIW1fZnJhbWUpCisgICAgcmV0dXJuOworCisgIERlcHJlY2F0
ZWRTdHJpbmcgc3RyID0gdmFsdWUtPnRvU3RyaW5nKGV4ZWMpOworICBLVVJMIHVybCA9IG1fZnJh
bWUtPmxvYWRlcigpLT51cmwoKTsKKyAgY29uc3QgV2luZG93KiB3aW5kb3cgPSBXaW5kb3c6OnJl
dHJpZXZlV2luZG93KG1fZnJhbWUpOworICBib29sIHNhbWVEb21haW5BY2Nlc3MgPSB3aW5kb3cg
JiYgd2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpOworCisgIGNvbnN0IEhhc2hFbnRyeSog
ZW50cnkgPSBMb29rdXA6OmZpbmRFbnRyeSgmTG9jYXRpb25UYWJsZSwgcHJvcGVydHlOYW1lKTsK
KworICBpZiAoZW50cnkpIHsKKyAgICAgIC8vIGNyb3NzLWRvbWFpbiBhY2Nlc3MgdG8gdGhlIGxv
Y2F0aW9uIGlzIGFsbG93ZWQgd2hlbiBhc3NpZ25pbmcgdGhlIHdob2xlIGxvY2F0aW9uLAorICAg
ICAgLy8gYnV0IG5vdCB3aGVuIGFzc2lnbmluZyB0aGUgaW5kaXZpZHVhbCBwaWVjZXMsIHNpbmNl
IHRoYXQgbWlnaHQgaW5hZHZlcnRlbnRseQorICAgICAgLy8gZGlzY2xvc2Ugb3RoZXIgcGFydHMg
b2YgdGhlIG9yaWdpbmFsIGxvY2F0aW9uLgorICAgICAgaWYgKGVudHJ5LT52YWx1ZS5pbnRWYWx1
ZSAhPSBIcmVmICYmICFzYW1lRG9tYWluQWNjZXNzKQorICAgICAgICAgIHJldHVybjsKKworICAg
ICAgc3dpdGNoIChlbnRyeS0+dmFsdWUuaW50VmFsdWUpIHsKKyAgICAgIGNhc2UgSHJlZjogewor
ICAgICAgICAgIEZyYW1lKiBmcmFtZSA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmlt
cGwoKS0+ZnJhbWUoKTsKKyAgICAgICAgICBpZiAoIWZyYW1lKQorICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgaWYgKCFmcmFtZS0+bG9hZGVyKCktPnNob3VsZEFsbG93TmF2aWdhdGlv
bihtX2ZyYW1lKSkKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIHVybCA9IGZyYW1l
LT5sb2FkZXIoKS0+Y29tcGxldGVVUkwoc3RyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0K
KyAgICAgIGNhc2UgSGFzaDogeworICAgICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aCgiIyIpKQor
ICAgICAgICAgICAgICBzdHIgPSBzdHIubWlkKDEpOworICAgICAgICAgIGlmICh1cmwucmVmKCkg
PT0gc3RyKQorICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgdXJsLnNldFJlZihzdHIp
OworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBIb3N0OiB7CisgICAgICAg
ICAgdXJsLnNldEhvc3RBbmRQb3J0KHN0cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9Cisg
ICAgICBjYXNlIEhvc3RuYW1lOgorICAgICAgICAgIHVybC5zZXRIb3N0KHN0cik7CisgICAgICAg
ICAgYnJlYWs7CisgICAgICBjYXNlIFBhdGhuYW1lOgorICAgICAgICAgIHVybC5zZXRQYXRoKHN0
cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBvcnQ6CisgICAgICAgICAgdXJsLnNl
dFBvcnQoc3RyLnRvVUludCgpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUHJvdG9j
b2w6CisgICAgICAgICAgdXJsLnNldFByb3RvY29sKHN0cik7CisgICAgICAgICAgYnJlYWs7Cisg
ICAgICBjYXNlIFNlYXJjaDoKKyAgICAgICAgICB1cmwuc2V0UXVlcnkoc3RyKTsKKyAgICAgICAg
ICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gRGlzYWxsb3cgY2hhbmdpbmcg
b3RoZXIgcHJvcGVydGllcyBpbiBMb2NhdGlvblRhYmxlLiBlLmcuLCAid2luZG93LmxvY2F0aW9u
LnRvU3RyaW5nID0gLi4uIi4KKyAgICAgICAgICAvLyA8aHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTI3MjA+CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICB9IGVs
c2UgeworICAgICAgaWYgKHNhbWVEb21haW5BY2Nlc3MpCisgICAgICAgICAgSlNPYmplY3Q6OnB1
dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBhdHRyKTsKKyAgICAgIHJldHVybjsKKyAgfQor
CisgIEZyYW1lKiBhY3RpdmVGcmFtZSA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmlt
cGwoKS0+ZnJhbWUoKTsKKyAgaWYgKCF1cmwuZGVwcmVjYXRlZFN0cmluZygpLnN0YXJ0c1dpdGgo
ImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8IHNhbWVEb21haW5BY2Nlc3MpIHsKKyAgICBib29sIHVz
ZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCktPnByb2Nlc3NpbmdVc2VyR2Vz
dHVyZSgpOworICAgIG1fZnJhbWUtPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKHVy
bC5zdHJpbmcoKSwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZh
bHNlLCB1c2VyR2VzdHVyZSk7CisgIH0KK30KKworSlNWYWx1ZSogTG9jYXRpb25Qcm90b0Z1bmNS
ZXBsYWNlOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2Jq
LCBjb25zdCBMaXN0JiBhcmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJkxvY2F0
aW9uOjppbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsK
KyAgICBMb2NhdGlvbiogbG9jYXRpb24gPSBzdGF0aWNfY2FzdDxMb2NhdGlvbio+KHRoaXNPYmop
OworICAgIEZyYW1lKiBmcmFtZSA9IGxvY2F0aW9uLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUp
CisgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworCisgICAgRnJhbWUqIGFjdGl2ZUZyYW1l
ID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOworICAgIGlm
IChhY3RpdmVGcmFtZSkgeworICAgICAgICBpZiAoIWFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+c2hv
dWxkQWxsb3dOYXZpZ2F0aW9uKGZyYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5l
ZCgpOworICAgICAgICBEZXByZWNhdGVkU3RyaW5nIHN0ciA9IGFyZ3NbMF0tPnRvU3RyaW5nKGV4
ZWMpOworICAgICAgICBjb25zdCBXaW5kb3cqIHdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5k
b3coZnJhbWUpOworICAgICAgICBpZiAoIXN0ci5zdGFydHNXaXRoKCJqYXZhc2NyaXB0OiIsIGZh
bHNlKSB8fCAod2luZG93ICYmIHdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkpIHsKKyAg
ICAgICAgICAgIGJvb2wgdXNlckdlc3R1cmUgPSBhY3RpdmVGcmFtZS0+c2NyaXB0UHJveHkoKS0+
cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCk7CisgICAgICAgICAgICBmcmFtZS0+bG9hZGVyKCktPnNj
aGVkdWxlTG9jYXRpb25DaGFuZ2UoYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5jb21wbGV0ZVVSTChz
dHIpLnN0cmluZygpLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJyZXIoKSwg
dHJ1ZSwgdXNlckdlc3R1cmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Cit9CisKK0pTVmFsdWUqIExvY2F0aW9uUHJvdG9GdW5jUmVsb2FkOjpjYWxsQXNG
dW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBh
cmdzKQoreworICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJkxvY2F0aW9uOjppbmZvKSkKKyAg
ICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKKyAgICBMb2NhdGlvbiog
bG9jYXRpb24gPSBzdGF0aWNfY2FzdDxMb2NhdGlvbio+KHRoaXNPYmopOworICAgIEZyYW1lKiBm
cmFtZSA9IGxvY2F0aW9uLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOworCisgICAgV2luZG93KiB3aW5kb3cgPSBXaW5kb3c6OnJldHJpZXZl
V2luZG93KGZyYW1lKTsKKyAgICBpZiAoIXdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkK
KyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisKKyAgICBpZiAoIWZyYW1lLT5sb2FkZXIo
KS0+dXJsKCkuZGVwcmVjYXRlZFN0cmluZygpLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFs
c2UpIHx8ICh3aW5kb3cgJiYgd2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSkgeworICAg
ICAgICBib29sIHVzZXJHZXN0dXJlID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1w
bCgpLT5mcmFtZSgpLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKTsKKyAg
ICAgICAgZnJhbWUtPmxvYWRlcigpLT5zY2hlZHVsZVJlZnJlc2godXNlckdlc3R1cmUpOworICAg
IH0KKyAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKK30KKworSlNWYWx1ZSogTG9jYXRpb25Qcm90
b0Z1bmNBc3NpZ246OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRo
aXNPYmosIGNvbnN0IExpc3QmIGFyZ3MpCit7CisgICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygm
TG9jYXRpb246OmluZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJy
b3IpOworICAgIExvY2F0aW9uKiBsb2NhdGlvbiA9IHN0YXRpY19jYXN0PExvY2F0aW9uKj4odGhp
c09iaik7CisgICAgRnJhbWUqIGZyYW1lID0gbG9jYXRpb24tPmZyYW1lKCk7CisgICAgaWYgKCFm
cmFtZSkKKyAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisKKyAgICBGcmFtZSogYWN0aXZl
RnJhbWUgPSBXaW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5pbXBsKCktPmZyYW1lKCk7Cisg
ICAgaWYgKGFjdGl2ZUZyYW1lKSB7CisgICAgICAgIGlmICghYWN0aXZlRnJhbWUtPmxvYWRlcigp
LT5zaG91bGRBbGxvd05hdmlnYXRpb24oZnJhbWUpKQorICAgICAgICAgICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7CisgICAgICAgIGNvbnN0IFdpbmRvdyogd2luZG93ID0gV2luZG93OjpyZXRyaWV2
ZVdpbmRvdyhmcmFtZSk7CisgICAgICAgIFN0cmluZyBkc3RVcmwgPSBhY3RpdmVGcmFtZS0+bG9h
ZGVyKCktPmNvbXBsZXRlVVJMKGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpKS5zdHJpbmcoKTsKKyAg
ICAgICAgaWYgKCFkc3RVcmwuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkgfHwgKHdp
bmRvdyAmJiB3aW5kb3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpKSB7CisgICAgICAgICAgICBi
b29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCktPnByb2Nlc3NpbmdV
c2VyR2VzdHVyZSgpOworICAgICAgICAgICAgLy8gV2Ugd2FudCBhIG5ldyBoaXN0b3J5IGl0ZW0g
aWYgdGhpcyBKUyB3YXMgY2FsbGVkIHZpYSBhIHVzZXIgZ2VzdHVyZQorICAgICAgICAgICAgZnJh
bWUtPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKGRzdFVybCwgYWN0aXZlRnJhbWUt
PmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2VyR2VzdHVyZSk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKK30KKworSlNWYWx1ZSog
TG9jYXRpb25Qcm90b0Z1bmNUb1N0cmluZzo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVj
LCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKK3sKKyAgICBpZiAoIXRoaXNP
YmotPmluaGVyaXRzKCZMb2NhdGlvbjo6aW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd0Vycm9y
KGV4ZWMsIFR5cGVFcnJvcik7CisgICAgTG9jYXRpb24qIGxvY2F0aW9uID0gc3RhdGljX2Nhc3Q8
TG9jYXRpb24qPih0aGlzT2JqKTsKKyAgICBGcmFtZSogZnJhbWUgPSBsb2NhdGlvbi0+ZnJhbWUo
KTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKworICAg
IGNvbnN0IEtVUkwmIHVybCA9IGZyYW1lLT5sb2FkZXIoKS0+dXJsKCk7CisgICAgaWYgKCF1cmwu
aGFzUGF0aCgpKQorICAgICAgICByZXR1cm4ganNTdHJpbmcodXJsLnByZXR0eVVSTCgpICsgIi8i
KTsKKyAgICByZXR1cm4ganNTdHJpbmcodXJsLnByZXR0eVVSTCgpKTsKK30KKworLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8KKwordm9pZCBET01XaW5kb3dUaW1lcjo6ZmlyZWQoKQoreworICAgIHRpbWVy
TmVzdGluZ0xldmVsID0gbV9uZXN0aW5nTGV2ZWw7CisgICAgbV9vYmplY3QtPnRpbWVyRmlyZWQo
dGhpcyk7CisgICAgdGltZXJOZXN0aW5nTGV2ZWwgPSAwOworfQorCit9IC8vIG5hbWVzcGFjZSBL
SlMKKwordXNpbmcgbmFtZXNwYWNlIEtKUzsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitKU1Zh
bHVlKiB0b0pTKEV4ZWNTdGF0ZSosIERPTVdpbmRvdyogZG9tV2luZG93KQoreworICAgIGlmICgh
ZG9tV2luZG93KQorICAgICAgICByZXR1cm4ganNOdWxsKCk7CisgICAgRnJhbWUqIGZyYW1lID0g
ZG9tV2luZG93LT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBqc051
bGwoKTsKKyAgICByZXR1cm4gV2luZG93OjpyZXRyaWV2ZShmcmFtZSk7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvanMvU2NoZWR1bGVkQWN0aW9u
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL1NjaGVkdWxlZEFjdGlvbi5j
cHAJKHJldmlzaW9uIDI4Nzc4KQorKysgV2ViQ29yZS9iaW5kaW5ncy9qcy9TY2hlZHVsZWRBY3Rp
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDQgKzEsMyBAQAotLy8gLSotIGMtYmFzaWMtb2Zm
c2V0OiA0IC0qLQogLyoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDAgSGFycmkgUG9ydGVuIChwb3J0
ZW5Aa2RlLm9yZykKICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgSm9uIFNoaWVyIChqc2hpZXJAaWFz
dGF0ZS5lZHUpCkBAIC0yMiwxMTg3ICsyMSwyOSBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJranNfd2luZG93LmgiCisjaW5jbHVkZSAiU2NoZWR1bGVkQWN0aW9uLmgi
CiAKLSNpbmNsdWRlICJCYXNlNjQuaCIKLSNpbmNsdWRlICJDU3RyaW5nLmgiCiAjaW5jbHVkZSAi
Q2hyb21lLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgogI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgot
I2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlICJFdmVudExpc3RlbmVyLmgiCi0jaW5jbHVk
ZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKLSNpbmNsdWRlICJG
bG9hdFJlY3QuaCIKICNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZFJlcXVl
c3QuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgot
I2luY2x1ZGUgIkdDQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgotI2lu
Y2x1ZGUgIkpTRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IuaCIKLSNpbmNsdWRlICJKU0RPTVdpbmRv
dy5oIgotI2luY2x1ZGUgIkpTRXZlbnQuaCIKLSNpbmNsdWRlICJKU0hUTUxBdWRpb0VsZW1lbnRD
b25zdHJ1Y3Rvci5oIgotI2luY2x1ZGUgIkpTSFRNTENvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJK
U0hUTUxPcHRpb25FbGVtZW50Q29uc3RydWN0b3IuaCIKLSNpbmNsdWRlICJKU1hNTEh0dHBSZXF1
ZXN0LmgiCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRl
ICJQYXVzZWRUaW1lb3V0cy5oIgotI2luY2x1ZGUgIlBsYXRmb3JtU2NyZWVuLmgiCi0jaW5jbHVk
ZSAiUGx1Z0luSW5mb1N0b3JlLmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUg
IlNlY3VyaXR5T3JpZ2luLmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJXaW5k
b3dGZWF0dXJlcy5oIgotI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCi0jaW5jbHVkZSAia2pzX2Nz
cy5oIgotI2luY2x1ZGUgImtqc19ldmVudHMuaCIKLSNpbmNsdWRlICJranNfbmF2aWdhdG9yLmgi
CiAjaW5jbHVkZSAia2pzX3Byb3h5LmgiCi0jaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KLQot
I2lmIEVOQUJMRShYU0xUKQotI2luY2x1ZGUgIkpTWFNMVFByb2Nlc3Nvci5oIgotI2VuZGlmCi0K
LXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Ci0K
LW5hbWVzcGFjZSBLSlMgewotCi1zdGF0aWMgaW50IGxhc3RVc2VkVGltZW91dElkOwotCi1zdGF0
aWMgaW50IHRpbWVyTmVzdGluZ0xldmVsID0gMDsKLWNvbnN0IGludCBjTWF4VGltZXJOZXN0aW5n
TGV2ZWwgPSA1OwotY29uc3QgZG91YmxlIGNNaW5pbXVtVGltZXJJbnRlcnZhbCA9IDAuMDEwOwot
Ci1zdHJ1Y3QgV2luZG93UHJpdmF0ZSB7Ci0gICAgV2luZG93UHJpdmF0ZSgpCi0gICAgICAgIDog
bG9jKDApCi0gICAgICAgICwgbV9ldnQoMCkKLSAgICAgICAgLCBtX3JldHVyblZhbHVlU2xvdCgw
KQotICAgIHsKLSAgICB9Ci0KLSAgICBXaW5kb3c6Okxpc3RlbmVyc01hcCBqc0V2ZW50TGlzdGVu
ZXJzOwotICAgIFdpbmRvdzo6TGlzdGVuZXJzTWFwIGpzSFRNTEV2ZW50TGlzdGVuZXJzOwotICAg
IFdpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAganNVbnByb3RlY3RlZEV2ZW50TGlzdGVu
ZXJzOwotICAgIFdpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAganNVbnByb3RlY3RlZEhU
TUxFdmVudExpc3RlbmVyczsKLSAgICBtdXRhYmxlIExvY2F0aW9uKiBsb2M7Ci0gICAgV2ViQ29y
ZTo6RXZlbnQqIG1fZXZ0OwotICAgIEpTVmFsdWUqKiBtX3JldHVyblZhbHVlU2xvdDsKLQotICAg
IHR5cGVkZWYgSGFzaE1hcDxpbnQsIERPTVdpbmRvd1RpbWVyKj4gVGltZW91dHNNYXA7Ci0gICAg
VGltZW91dHNNYXAgbV90aW1lb3V0czsKLX07Ci0KLWNsYXNzIERPTVdpbmRvd1RpbWVyIDogcHVi
bGljIFRpbWVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgRE9NV2luZG93VGltZXIoaW50IHRpbWVvdXRJ
ZCwgaW50IG5lc3RpbmdMZXZlbCwgV2luZG93KiBvYmplY3QsIFNjaGVkdWxlZEFjdGlvbiogYWN0
aW9uKQotICAgICAgICA6IG1fdGltZW91dElkKHRpbWVvdXRJZCkKLSAgICAgICAgLCBtX25lc3Rp
bmdMZXZlbChuZXN0aW5nTGV2ZWwpCi0gICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQotICAgICAg
ICAsIG1fYWN0aW9uKGFjdGlvbikKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+RE9NV2lu
ZG93VGltZXIoKQotICAgIHsKLSAgICAgICAgSlNMb2NrIGxvY2s7Ci0gICAgICAgIGRlbGV0ZSBt
X2FjdGlvbjsKLSAgICB9Ci0KLSAgICBpbnQgdGltZW91dElkKCkgY29uc3QgeyByZXR1cm4gbV90
aW1lb3V0SWQ7IH0KLQotICAgIGludCBuZXN0aW5nTGV2ZWwoKSBjb25zdCB7IHJldHVybiBtX25l
c3RpbmdMZXZlbDsgfQotICAgIHZvaWQgc2V0TmVzdGluZ0xldmVsKGludCBuKSB7IG1fbmVzdGlu
Z0xldmVsID0gbjsgfQotCi0gICAgU2NoZWR1bGVkQWN0aW9uKiBhY3Rpb24oKSBjb25zdCB7IHJl
dHVybiBtX2FjdGlvbjsgfQotICAgIFNjaGVkdWxlZEFjdGlvbiogdGFrZUFjdGlvbigpIHsgU2No
ZWR1bGVkQWN0aW9uKiBhID0gbV9hY3Rpb247IG1fYWN0aW9uID0gMDsgcmV0dXJuIGE7IH0KLQot
cHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgZmlyZWQoKTsKLQotICAgIGludCBtX3RpbWVvdXRJ
ZDsKLSAgICBpbnQgbV9uZXN0aW5nTGV2ZWw7Ci0gICAgV2luZG93KiBtX29iamVjdDsKLSAgICBT
Y2hlZHVsZWRBY3Rpb24qIG1fYWN0aW9uOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgS0pTCi0KLSNp
bmNsdWRlICJranNfd2luZG93Lmx1dC5oIgotCi1uYW1lc3BhY2UgS0pTIHsKLQotLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLyBXaW5kb3cgT2JqZWN0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1j
b25zdCBDbGFzc0luZm8gV2luZG93OjppbmZvID0geyAiV2luZG93IiwgMCwgJldpbmRvd1RhYmxl
IH07Ci0KLS8qCi1AYmVnaW4gV2luZG93VGFibGUgMTE4Ci0jIFdhcm5pbmcsIHdoZW4gYWRkaW5n
IGEgZnVuY3Rpb24gdG8gdGhpcyBvYmplY3QgeW91IG5lZWQgdG8gYWRkIGEgY2FzZSBpbiBXaW5k
b3c6OmdldAotIyAtLSBGdW5jdGlvbnMgLS0KLSAgYXRvYiAgICAgICAgICAgICAgICAgICZXaW5k
b3dQcm90b0Z1bmNBVG9COjpjcmVhdGUgICAgICAgICAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlv
biAxCi0gIGJ0b2EgICAgICAgICAgICAgICAgICAmV2luZG93UHJvdG9GdW5jQlRvQTo6Y3JlYXRl
ICAgICAgICAgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQotICBvcGVuICAgICAgICAgICAg
ICAgICAgJldpbmRvd1Byb3RvRnVuY09wZW46OmNyZWF0ZSAgICAgICAgICAgICAgICBEb250RGVs
ZXRlfEZ1bmN0aW9uIDMKLSAgc2V0VGltZW91dCAgICAgICAgICAgICZXaW5kb3dQcm90b0Z1bmNT
ZXRUaW1lb3V0OjpjcmVhdGUgICAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAyCi0gIGNsZWFy
VGltZW91dCAgICAgICAgICAmV2luZG93UHJvdG9GdW5jQ2xlYXJUaW1lb3V0OjpjcmVhdGUgICAg
ICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQotICBzZXRJbnRlcnZhbCAgICAgICAgICAgJldpbmRv
d1Byb3RvRnVuY1NldEludGVydmFsOjpjcmVhdGUgICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9u
IDIKLSAgY2xlYXJJbnRlcnZhbCAgICAgICAgICZXaW5kb3dQcm90b0Z1bmNDbGVhclRpbWVvdXQ6
OmNyZWF0ZSAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAxCi0gIGFkZEV2ZW50TGlzdGVuZXIg
ICAgICAmV2luZG93UHJvdG9GdW5jQWRkRXZlbnRMaXN0ZW5lcjo6Y3JlYXRlICAgIERvbnREZWxl
dGV8RnVuY3Rpb24gMwotICByZW1vdmVFdmVudExpc3RlbmVyICAgJldpbmRvd1Byb3RvRnVuY1Jl
bW92ZUV2ZW50TGlzdGVuZXI6OmNyZWF0ZSBEb250RGVsZXRlfEZ1bmN0aW9uIDMKLSAgc2hvd01v
ZGFsRGlhbG9nICAgICAgICZXaW5kb3dQcm90b0Z1bmNTaG93TW9kYWxEaWFsb2c6OmNyZWF0ZSAg
ICAgRG9udERlbGV0ZXxGdW5jdGlvbiAxCi0jIE5vdCBpbXBsZW1lbnRlZAotICBjYXB0dXJlRXZl
bnRzICAgICAgICAgJldpbmRvd1Byb3RvRnVuY05vdEltcGxlbWVudGVkOjpjcmVhdGUgICAgICBE
b250RGVsZXRlfEZ1bmN0aW9uIDAKLSAgcmVsZWFzZUV2ZW50cyAgICAgICAgICZXaW5kb3dQcm90
b0Z1bmNOb3RJbXBsZW1lbnRlZDo6Y3JlYXRlICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAwCi0K
LSMgLS0gQXR0cmlidXRlcyAtLQotICBjcnlwdG8gICAgICAgICAgICAgICAgV2luZG93OjpDcnlw
dG8gICAgICAgICAgICAgIERvbnREZWxldGV8UmVhZE9ubHkKLSAgZXZlbnQgICAgICAgICAgICAg
ICAgIFdpbmRvdzo6RXZlbnRfICAgICAgICAgICAgICBEb250RGVsZXRlCi0gIGxvY2F0aW9uICAg
ICAgICAgICAgICBXaW5kb3c6OkxvY2F0aW9uXyAgICAgICAgICAgRG9udERlbGV0ZQotICBuYXZp
Z2F0b3IgICAgICAgICAgICAgV2luZG93OjpOYXZpZ2F0b3JfICAgICAgICAgIERvbnREZWxldGV8
UmVhZE9ubHkKLSAgY2xpZW50SW5mb3JtYXRpb24gICAgIFdpbmRvdzo6Q2xpZW50SW5mb3JtYXRp
b24gICBEb250RGVsZXRlfFJlYWRPbmx5Ci0jIC0tIEV2ZW50IExpc3RlbmVycyAtLQotICBvbmFi
b3J0ICAgICAgICAgICAgICAgV2luZG93OjpPbmFib3J0ICAgICAgICAgICAgIERvbnREZWxldGUK
LSAgb25ibHVyICAgICAgICAgICAgICAgIFdpbmRvdzo6T25ibHVyICAgICAgICAgICAgICBEb250
RGVsZXRlCi0gIG9uY2hhbmdlICAgICAgICAgICAgICBXaW5kb3c6Ok9uY2hhbmdlICAgICAgICAg
ICAgRG9udERlbGV0ZQotICBvbmNsaWNrICAgICAgICAgICAgICAgV2luZG93OjpPbmNsaWNrICAg
ICAgICAgICAgIERvbnREZWxldGUKLSAgb25kYmxjbGljayAgICAgICAgICAgIFdpbmRvdzo6T25k
YmxjbGljayAgICAgICAgICBEb250RGVsZXRlCi0gIG9uZXJyb3IgICAgICAgICAgICAgICBXaW5k
b3c6Ok9uZXJyb3IgICAgICAgICAgICAgRG9udERlbGV0ZQotICBvbmZvY3VzICAgICAgICAgICAg
ICAgV2luZG93OjpPbmZvY3VzICAgICAgICAgICAgIERvbnREZWxldGUKLSAgb25rZXlkb3duICAg
ICAgICAgICAgIFdpbmRvdzo6T25rZXlkb3duICAgICAgICAgICBEb250RGVsZXRlCi0gIG9ua2V5
cHJlc3MgICAgICAgICAgICBXaW5kb3c6Ok9ua2V5cHJlc3MgICAgICAgICAgRG9udERlbGV0ZQot
ICBvbmtleXVwICAgICAgICAgICAgICAgV2luZG93OjpPbmtleXVwICAgICAgICAgICAgIERvbnRE
ZWxldGUKLSAgb25sb2FkICAgICAgICAgICAgICAgIFdpbmRvdzo6T25sb2FkICAgICAgICAgICAg
ICBEb250RGVsZXRlCi0gIG9ubW91c2Vkb3duICAgICAgICAgICBXaW5kb3c6Ok9ubW91c2Vkb3du
ICAgICAgICAgRG9udERlbGV0ZQotICBvbm1vdXNlbW92ZSAgICAgICAgICAgV2luZG93OjpPbm1v
dXNlbW92ZSAgICAgICAgIERvbnREZWxldGUKLSAgb25tb3VzZW91dCAgICAgICAgICAgIFdpbmRv
dzo6T25tb3VzZW91dCAgICAgICAgICBEb250RGVsZXRlCi0gIG9ubW91c2VvdmVyICAgICAgICAg
ICBXaW5kb3c6Ok9ubW91c2VvdmVyICAgICAgICAgRG9udERlbGV0ZQotICBvbm1vdXNldXAgICAg
ICAgICAgICAgV2luZG93OjpPbm1vdXNldXAgICAgICAgICAgIERvbnREZWxldGUKLSAgb25tb3Vz
ZXdoZWVsICAgICAgICAgIFdpbmRvdzo6T25XaW5kb3dNb3VzZVdoZWVsICBEb250RGVsZXRlCi0g
IG9ucmVzZXQgICAgICAgICAgICAgICBXaW5kb3c6Ok9ucmVzZXQgICAgICAgICAgICAgRG9udERl
bGV0ZQotICBvbnJlc2l6ZSAgICAgICAgICAgICAgV2luZG93OjpPbnJlc2l6ZSAgICAgICAgICAg
IERvbnREZWxldGUKLSAgb25zY3JvbGwgICAgICAgICAgICAgIFdpbmRvdzo6T25zY3JvbGwgICAg
ICAgICAgICBEb250RGVsZXRlCi0gIG9uc2VhcmNoICAgICAgICAgICAgICBXaW5kb3c6Ok9uc2Vh
cmNoICAgICAgICAgICAgRG9udERlbGV0ZQotICBvbnNlbGVjdCAgICAgICAgICAgICAgV2luZG93
OjpPbnNlbGVjdCAgICAgICAgICAgIERvbnREZWxldGUKLSAgb25zdWJtaXQgICAgICAgICAgICAg
IFdpbmRvdzo6T25zdWJtaXQgICAgICAgICAgICBEb250RGVsZXRlCi0gIG9udW5sb2FkICAgICAg
ICAgICAgICBXaW5kb3c6Ok9udW5sb2FkICAgICAgICAgICAgRG9udERlbGV0ZQotICBvbmJlZm9y
ZXVubG9hZCAgICAgICAgV2luZG93OjpPbmJlZm9yZXVubG9hZCAgICAgIERvbnREZWxldGUKLSMg
LS0gQ29uc3RydWN0b3JzIC0tCi0gIEF1ZGlvICAgICAgICAgICAgICAgICBXaW5kb3c6OkF1ZGlv
ICAgICAgICAgICAgICAgRG9udERlbGV0ZQotICBET01FeGNlcHRpb24gICAgICAgICAgV2luZG93
OjpET01FeGNlcHRpb24gICAgICAgIERvbnREZWxldGUKLSAgSW1hZ2UgICAgICAgICAgICAgICAg
IFdpbmRvdzo6SW1hZ2UgICAgICAgICAgICAgICBEb250RGVsZXRlCi0gIE9wdGlvbiAgICAgICAg
ICAgICAgICBXaW5kb3c6Ok9wdGlvbiAgICAgICAgICAgICAgRG9udERlbGV0ZQotICBYTUxIdHRw
UmVxdWVzdCAgICAgICAgV2luZG93OjpYTUxIdHRwUmVxdWVzdCAgICAgIERvbnREZWxldGUKLSAg
WFNMVFByb2Nlc3NvciAgICAgICAgIFdpbmRvdzo6WFNMVFByb2Nlc3Nvcl8gICAgICBEb250RGVs
ZXRlCi1AZW5kCi0qLwotCi1XaW5kb3c6OldpbmRvdyhET01XaW5kb3cqIHdpbmRvdykKLSAgICA6
IG1faW1wbCh3aW5kb3cpCi0gICAgLCBkKG5ldyBXaW5kb3dQcml2YXRlKQotewotICAgIC8vIFdp
bmRvdyBkZXN0cnVjdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUgYmVjYXVzZSBvZgotICAgIC8vIHRo
ZSBub24tdGhyZWFkLXNhZmUgV2ViQ29yZSBzdHJ1Y3R1cmVzIGl0IHJlZmVyZW5jZXMuCi0gICAg
Q29sbGVjdG9yOjpjb2xsZWN0T25NYWluVGhyZWFkT25seSh0aGlzKTsKLQotICAgIC8vIFRpbWUg
aW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NyaXB0IHRpbWVvdXQgaGFuZGxlciBraWNrcyBp
bi4KLSAgICBzZXRUaW1lb3V0VGltZSgxMDAwMCk7Ci19Ci0KLVdpbmRvdzo6fldpbmRvdygpCi17
Ci0gICAgY2xlYXJBbGxUaW1lb3V0cygpOwotCi0gICAgLy8gQ2xlYXIgYW55IGJhY2twb2ludGVy
cyB0byB0aGUgd2luZG93Ci0KLSAgICBMaXN0ZW5lcnNNYXA6Oml0ZXJhdG9yIGkyID0gZC0+anNF
dmVudExpc3RlbmVycy5iZWdpbigpOwotICAgIExpc3RlbmVyc01hcDo6aXRlcmF0b3IgZTIgPSBk
LT5qc0V2ZW50TGlzdGVuZXJzLmVuZCgpOwotICAgIGZvciAoOyBpMiAhPSBlMjsgKytpMikKLSAg
ICAgICAgaTItPnNlY29uZC0+Y2xlYXJXaW5kb3dPYmooKTsKLSAgICBpMiA9IGQtPmpzSFRNTEV2
ZW50TGlzdGVuZXJzLmJlZ2luKCk7Ci0gICAgZTIgPSBkLT5qc0hUTUxFdmVudExpc3RlbmVycy5l
bmQoKTsKLSAgICBmb3IgKDsgaTIgIT0gZTI7ICsraTIpCi0gICAgICAgIGkyLT5zZWNvbmQtPmNs
ZWFyV2luZG93T2JqKCk7Ci0KLSAgICBVbnByb3RlY3RlZExpc3RlbmVyc01hcDo6aXRlcmF0b3Ig
aTEgPSBkLT5qc1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcnMuYmVnaW4oKTsKLSAgICBVbnByb3Rl
Y3RlZExpc3RlbmVyc01hcDo6aXRlcmF0b3IgZTEgPSBkLT5qc1VucHJvdGVjdGVkRXZlbnRMaXN0
ZW5lcnMuZW5kKCk7Ci0gICAgZm9yICg7IGkxICE9IGUxOyArK2kxKQotICAgICAgICBpMS0+c2Vj
b25kLT5jbGVhcldpbmRvd09iaigpOwotICAgIGkxID0gZC0+anNVbnByb3RlY3RlZEhUTUxFdmVu
dExpc3RlbmVycy5iZWdpbigpOwotICAgIGUxID0gZC0+anNVbnByb3RlY3RlZEhUTUxFdmVudExp
c3RlbmVycy5lbmQoKTsKLSAgICBmb3IgKDsgaTEgIT0gZTE7ICsraTEpCi0gICAgICAgIGkxLT5z
ZWNvbmQtPmNsZWFyV2luZG93T2JqKCk7Ci19Ci0KLVdpbmRvdyogV2luZG93OjpyZXRyaWV2ZVdp
bmRvdyhGcmFtZSogZnJhbWUpCi17Ci0gICAgSlNPYmplY3QqIG8gPSByZXRyaWV2ZShmcmFtZSkt
PmdldE9iamVjdCgpOwotCi0gICAgQVNTRVJUKG8gfHwgIWZyYW1lLT5zZXR0aW5ncygpIHx8ICFm
cmFtZS0+c2V0dGluZ3MoKS0+aXNKYXZhU2NyaXB0RW5hYmxlZCgpKTsKLSAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8V2luZG93Kj4obyk7Ci19Ci0KLVdpbmRvdyogV2luZG93OjpyZXRyaWV2ZUFjdGl2
ZShFeGVjU3RhdGUqIGV4ZWMpCi17Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9
IGV4ZWMtPmR5bmFtaWNHbG9iYWxPYmplY3QoKTsKLSAgICBBU1NFUlQoZ2xvYmFsT2JqZWN0KTsK
LSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2luZG93Kj4oZ2xvYmFsT2JqZWN0KTsKLX0KLQotSlNW
YWx1ZSogV2luZG93OjpyZXRyaWV2ZShGcmFtZSogZnJhbWUpCi17Ci0gICAgQVNTRVJUKGZyYW1l
KTsKLSAgICBpZiAoS0pTUHJveHkqIHByb3h5ID0gZnJhbWUtPnNjcmlwdFByb3h5KCkpCi0gICAg
ICAgIHJldHVybiBwcm94eS0+Z2xvYmFsT2JqZWN0KCk7IC8vIHRoZSBHbG9iYWwgb2JqZWN0IGlz
IHRoZSAid2luZG93IgotCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7IC8vIFRoaXMgY2FuIGhh
cHBlbiB3aXRoIEpTIGRpc2FibGVkIG9uIHRoZSBkb21haW4gb2YgdGhhdCB3aW5kb3cKLX0KLQot
TG9jYXRpb24qIFdpbmRvdzo6bG9jYXRpb24oKSBjb25zdAotewotICAgIGlmICghZC0+bG9jKQot
ICAgICAgICBkLT5sb2MgPSBuZXcgTG9jYXRpb24oaW1wbCgpLT5mcmFtZSgpKTsKLSAgICByZXR1
cm4gZC0+bG9jOwotfQotCi0vLyByZWZlcmVuY2Ugb3VyIHNwZWNpYWwgb2JqZWN0cyBkdXJpbmcg
Z2FyYmFnZSBjb2xsZWN0aW9uCi12b2lkIFdpbmRvdzo6bWFyaygpCi17Ci0gICAgSlNHbG9iYWxP
YmplY3Q6Om1hcmsoKTsKLSAgICBpZiAoZC0+bG9jICYmICFkLT5sb2MtPm1hcmtlZCgpKQotICAg
ICAgICBkLT5sb2MtPm1hcmsoKTsKLX0KLQotc3RhdGljIGJvb2wgYWxsb3dQb3BVcChGcmFtZSog
ZnJhbWUpCi17Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlm
IChmcmFtZS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCkpCi0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGZyYW1lLT5zZXR0aW5ncygp
OwotICAgIHJldHVybiBzZXR0aW5ncyAmJiBzZXR0aW5ncy0+SmF2YVNjcmlwdENhbk9wZW5XaW5k
b3dzQXV0b21hdGljYWxseSgpOwotfQotCi1zdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4g
cGFyc2VNb2RhbERpYWxvZ0ZlYXR1cmVzKGNvbnN0IFN0cmluZyYgZmVhdHVyZXNBcmcpCi17Ci0g
ICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwOwotCi0gICAgVmVjdG9yPFN0cmluZz4gZmVh
dHVyZXMgPSBmZWF0dXJlc0FyZy5zcGxpdCgnOycpOwotICAgIFZlY3RvcjxTdHJpbmc+Ojpjb25z
dF9pdGVyYXRvciBlbmQgPSBmZWF0dXJlcy5lbmQoKTsKLSAgICBmb3IgKFZlY3RvcjxTdHJpbmc+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZlYXR1cmVzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkg
ewotICAgICAgICBTdHJpbmcgcyA9ICppdDsKLSAgICAgICAgaW50IHBvcyA9IHMuZmluZCgnPScp
OwotICAgICAgICBpbnQgY29sb25Qb3MgPSBzLmZpbmQoJzonKTsKLSAgICAgICAgaWYgKHBvcyA+
PSAwICYmIGNvbG9uUG9zID49IDApCi0gICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGFu
eSBzdHJpbmdzIHRoYXQgaGF2ZSBib3RoID0gYW5kIDoKLSAgICAgICAgaWYgKHBvcyA8IDApCi0g
ICAgICAgICAgICBwb3MgPSBjb2xvblBvczsKLSAgICAgICAgaWYgKHBvcyA8IDApIHsKLSAgICAg
ICAgICAgIC8vIG51bGwgc3RyaW5nIGZvciB2YWx1ZSBtZWFucyBrZXkgd2l0aG91dCB2YWx1ZQot
ICAgICAgICAgICAgbWFwLnNldChzLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCksIFN0cmluZygp
KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBzLmxlZnQocG9z
KS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpOwotICAgICAgICAgICAgU3RyaW5nIHZhbCA9IHMu
c3Vic3RyaW5nKHBvcyArIDEpLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCk7Ci0gICAgICAgICAg
ICBpbnQgc3BhY2VQb3MgPSB2YWwuZmluZCgnICcpOwotICAgICAgICAgICAgaWYgKHNwYWNlUG9z
ICE9IC0xKQotICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5sZWZ0KHNwYWNlUG9zKTsKLSAgICAg
ICAgICAgIG1hcC5zZXQoa2V5LCB2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu
IG1hcDsKLX0KLQotc3RhdGljIEZyYW1lKiBjcmVhdGVXaW5kb3coRXhlY1N0YXRlKiBleGVjLCBG
cmFtZSogb3BlbmVyRnJhbWUsIGNvbnN0IFN0cmluZyYgdXJsLAotICAgIGNvbnN0IFN0cmluZyYg
ZnJhbWVOYW1lLCBjb25zdCBXaW5kb3dGZWF0dXJlcyYgd2luZG93RmVhdHVyZXMsIEpTVmFsdWUq
IGRpYWxvZ0FyZ3MpCi17Ci0gICAgRnJhbWUqIGFjdGl2ZUZyYW1lID0gV2luZG93OjpyZXRyaWV2
ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOwotCi0gICAgUmVzb3VyY2VSZXF1ZXN0IHJl
cXVlc3Q7Ci0gICAgaWYgKGFjdGl2ZUZyYW1lKQotICAgICAgICByZXF1ZXN0LnNldEhUVFBSZWZl
cnJlcihhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJyZXIoKSk7Ci0gICAgRnJh
bWVMb2FkUmVxdWVzdCBmcmFtZVJlcXVlc3QocmVxdWVzdCwgZnJhbWVOYW1lKTsKLQotICAgIC8v
IEZJWE1FOiBJdCdzIG11Y2ggYmV0dGVyIGZvciBjbGllbnQgQVBJIGlmIGEgbmV3IHdpbmRvdyBz
dGFydHMgd2l0aCBhIFVSTCwgaGVyZSB3aGVyZSB3ZQotICAgIC8vIGtub3cgd2hhdCBVUkwgd2Ug
YXJlIGdvaW5nIHRvIG9wZW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgY29kZSBwYXNzZXMgdGhlIGVt
cHR5IHN0cmluZwotICAgIC8vIGZvciB0aGUgVVJMLCBidXQgdGhlcmUncyBhIHJlYXNvbiBmb3Ig
dGhhdC4gQmVmb3JlIGxvYWRpbmcgd2UgaGF2ZSB0byBzZXQgdXAgdGhlIG9wZW5lciwKLSAgICAv
LyBvcGVuZWRCeURPTSwgYW5kIGRpYWxvZ0FyZ3VtZW50cyB2YWx1ZXMuIEFsc28sIHRvIGRlY2lk
ZSB3aGV0aGVyIHRvIHVzZSB0aGUgVVJMIHdlIGN1cnJlbnRseQotICAgIC8vIGRvIGFuIGFsbG93
c0FjY2Vzc0Zyb20gY2FsbCB1c2luZyB0aGUgd2luZG93IHdlIGNyZWF0ZSwgd2hpY2ggY2FuJ3Qg
YmUgZG9uZSBiZWZvcmUgY3JlYXRpbmcgaXQuCi0gICAgLy8gV2UnZCBoYXZlIHRvIHJlc29sdmUg
YWxsIHRob3NlIGlzc3VlcyB0byBwYXNzIHRoZSBVUkwgaW5zdGVhZCBvZiAiIi4KLQotICAgIGJv
b2wgY3JlYXRlZDsKLSAgICBGcmFtZSogbmV3RnJhbWUgPSBvcGVuZXJGcmFtZS0+bG9hZGVyKCkt
PmNyZWF0ZVdpbmRvdyhmcmFtZVJlcXVlc3QsIHdpbmRvd0ZlYXR1cmVzLCBjcmVhdGVkKTsKLSAg
ICBpZiAoIW5ld0ZyYW1lKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG5ld0ZyYW1lLT5sb2Fk
ZXIoKS0+c2V0T3BlbmVyKG9wZW5lckZyYW1lKTsKLSAgICBuZXdGcmFtZS0+bG9hZGVyKCktPnNl
dE9wZW5lZEJ5RE9NKCk7Ci0KLSAgICBXaW5kb3cqIG5ld1dpbmRvdyA9IFdpbmRvdzo6cmV0cmll
dmVXaW5kb3cobmV3RnJhbWUpOwotCi0gICAgaWYgKGRpYWxvZ0FyZ3MpCi0gICAgICAgIG5ld1dp
bmRvdy0+cHV0RGlyZWN0KCJkaWFsb2dBcmd1bWVudHMiLCBkaWFsb2dBcmdzKTsKLQotICAgIGlm
ICghdXJsLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8IG5ld1dpbmRvdy0+YWxs
b3dzQWNjZXNzRnJvbShleGVjKSkgewotICAgICAgICBTdHJpbmcgY29tcGxldGVkVVJMID0gdXJs
LmlzRW1wdHkoKSA/IHVybCA6IGFjdGl2ZUZyYW1lLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1
cmwpOwotICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5
KCktPnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpOwotCi0gICAgICAgIGlmIChjcmVhdGVkKSB7Ci0g
ICAgICAgICAgICBuZXdGcmFtZS0+bG9hZGVyKCktPmNoYW5nZUxvY2F0aW9uKEtVUkwoY29tcGxl
dGVkVVJMLmRlcHJlY2F0ZWRTdHJpbmcoKSksIGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29p
bmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1cmUpOwotICAgICAgICAgICAgaWYgKERvY3Vt
ZW50KiBvbGREb2MgPSBvcGVuZXJGcmFtZS0+ZG9jdW1lbnQoKSkgewotICAgICAgICAgICAgICAg
IG5ld0ZyYW1lLT5kb2N1bWVudCgpLT5zZXREb21haW5JbnRlcm5hbChvbGREb2MtPmRvbWFpbigp
KTsKLSAgICAgICAgICAgICAgICBuZXdGcmFtZS0+ZG9jdW1lbnQoKS0+c2V0QmFzZVVSTChvbGRE
b2MtPmJhc2VVUkwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXVybC5p
c0VtcHR5KCkpCi0gICAgICAgICAgICBuZXdGcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxlTG9jYXRp
b25DaGFuZ2UoY29tcGxldGVkVVJMLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVm
ZXJyZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RnJh
bWU7Ci19Ci0KLXN0YXRpYyBib29sIGNhblNob3dNb2RhbERpYWxvZyhjb25zdCBGcmFtZSogZnJh
bWUpCi17Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVy
biBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2FuUnVuTW9kYWwoKTsKLX0KLQotc3RhdGljIGJv
b2wgY2FuU2hvd01vZGFsRGlhbG9nTm93KGNvbnN0IEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAo
IWZyYW1lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGZyYW1lLT5wYWdlKCkt
PmNocm9tZSgpLT5jYW5SdW5Nb2RhbE5vdygpOwotfQotCi1zdGF0aWMgSlNWYWx1ZSogc2hvd01v
ZGFsRGlhbG9nKEV4ZWNTdGF0ZSogZXhlYywgRnJhbWUqIGZyYW1lLCBjb25zdCBTdHJpbmcmIHVy
bCwgSlNWYWx1ZSogZGlhbG9nQXJncywgY29uc3QgU3RyaW5nJiBmZWF0dXJlQXJncykKLXsKLSAg
ICBpZiAoIWNhblNob3dNb2RhbERpYWxvZ05vdyhmcmFtZSkgfHwgIWFsbG93UG9wVXAoZnJhbWUp
KQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAgIGNvbnN0IEhhc2hNYXA8U3Ry
aW5nLCBTdHJpbmc+IGZlYXR1cmVzID0gcGFyc2VNb2RhbERpYWxvZ0ZlYXR1cmVzKGZlYXR1cmVB
cmdzKTsKLQotICAgIGNvbnN0IGJvb2wgdHJ1c3RlZCA9IGZhbHNlOwotCi0gICAgLy8gVGhlIGZv
bGxvd2luZyBmZWF0dXJlcyBmcm9tIE1pY3Jvc29mdCdzIGRvY3VtZW50YXRpb24gYXJlIG5vdCBp
bXBsZW1lbnRlZDoKLSAgICAvLyAtIGRlZmF1bHQgZm9udCBzZXR0aW5ncwotICAgIC8vIC0gd2lk
dGgsIGhlaWdodCwgbGVmdCwgYW5kIHRvcCBzcGVjaWZpZWQgaW4gdW5pdHMgb3RoZXIgdGhhbiAi
cHgiCi0gICAgLy8gLSBlZGdlIChzdW5rZW4gb3IgcmFpc2VkLCBkZWZhdWx0IGlzIHJhaXNlZCkK
LSAgICAvLyAtIGRpYWxvZ0hpZGU6IHRydXN0ZWQgJiYgYm9vbEZlYXR1cmUoZmVhdHVyZXMsICJk
aWFsb2doaWRlIiksIG1ha2VzIGRpYWxvZyBoaWRlIHdoZW4geW91IHByaW50Ci0gICAgLy8gLSBo
ZWxwOiBib29sRmVhdHVyZShmZWF0dXJlcywgImhlbHAiLCB0cnVlKSwgbWFrZXMgaGVscCBpY29u
IGFwcGVhciBpbiBkaWFsb2cgKHdoYXQgZG9lcyBpdCBkbyBvbiBXaW5kb3dzPykKLSAgICAvLyAt
IHVuYWRvcm5lZDogdHJ1c3RlZCAmJiBib29sRmVhdHVyZShmZWF0dXJlcywgInVuYWRvcm5lZCIp
OwotCi0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAg
ICBGbG9hdFJlY3Qgc2NyZWVuUmVjdCA9IHNjcmVlbkF2YWlsYWJsZVJlY3QoZnJhbWUtPnZpZXco
KSk7Ci0KLSAgICBXaW5kb3dGZWF0dXJlcyB3YXJnczsKLSAgICB3YXJncy53aWR0aCA9IFdpbmRv
d0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2d3aWR0aCIsIDEwMCwgc2Ny
ZWVuUmVjdC53aWR0aCgpLCA2MjApOyAvLyBkZWZhdWx0IGhlcmUgY2FtZSBmcm9tIGZyYW1lIHNp
emUgb2YgZGlhbG9nIGluIE1hY0lFCi0gICAgd2FyZ3Mud2lkdGhTZXQgPSB0cnVlOwotICAgIHdh
cmdzLmhlaWdodCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFs
b2doZWlnaHQiLCAxMDAsIHNjcmVlblJlY3QuaGVpZ2h0KCksIDQ1MCk7IC8vIGRlZmF1bHQgaGVy
ZSBjYW1lIGZyb20gZnJhbWUgc2l6ZSBvZiBkaWFsb2cgaW4gTWFjSUUKLSAgICB3YXJncy5oZWln
aHRTZXQgPSB0cnVlOwotCi0gICAgd2FyZ3MueCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1
cmUoZmVhdHVyZXMsICJkaWFsb2dsZWZ0Iiwgc2NyZWVuUmVjdC54KCksIHNjcmVlblJlY3Qucmln
aHQoKSAtIHdhcmdzLndpZHRoLCAtMSk7Ci0gICAgd2FyZ3MueFNldCA9IHdhcmdzLnggPiAwOwot
ICAgIHdhcmdzLnkgPSBXaW5kb3dGZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlh
bG9ndG9wIiwgc2NyZWVuUmVjdC55KCksIHNjcmVlblJlY3QuYm90dG9tKCkgLSB3YXJncy5oZWln
aHQsIC0xKTsKLSAgICB3YXJncy55U2V0ID0gd2FyZ3MueSA+IDA7Ci0KLSAgICBpZiAoV2luZG93
RmVhdHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVzLCAiY2VudGVyIiwgdHJ1ZSkpIHsKLSAgICAg
ICAgaWYgKCF3YXJncy54U2V0KSB7Ci0gICAgICAgICAgICB3YXJncy54ID0gc2NyZWVuUmVjdC54
KCkgKyAoc2NyZWVuUmVjdC53aWR0aCgpIC0gd2FyZ3Mud2lkdGgpIC8gMjsKLSAgICAgICAgICAg
IHdhcmdzLnhTZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghd2FyZ3MueVNldCkg
ewotICAgICAgICAgICAgd2FyZ3MueSA9IHNjcmVlblJlY3QueSgpICsgKHNjcmVlblJlY3QuaGVp
Z2h0KCkgLSB3YXJncy5oZWlnaHQpIC8gMjsKLSAgICAgICAgICAgIHdhcmdzLnlTZXQgPSB0cnVl
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2FyZ3MuZGlhbG9nID0gdHJ1ZTsKLSAgICB3YXJn
cy5yZXNpemFibGUgPSBXaW5kb3dGZWF0dXJlczo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJyZXNp
emFibGUiKTsKLSAgICB3YXJncy5zY3JvbGxiYXJzVmlzaWJsZSA9IFdpbmRvd0ZlYXR1cmVzOjpi
b29sRmVhdHVyZShmZWF0dXJlcywgInNjcm9sbCIsIHRydWUpOwotICAgIHdhcmdzLnN0YXR1c0Jh
clZpc2libGUgPSBXaW5kb3dGZWF0dXJlczo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJzdGF0dXMi
LCAhdHJ1c3RlZCk7Ci0gICAgd2FyZ3MubWVudUJhclZpc2libGUgPSBmYWxzZTsKLSAgICB3YXJn
cy50b29sQmFyVmlzaWJsZSA9IGZhbHNlOwotICAgIHdhcmdzLmxvY2F0aW9uQmFyVmlzaWJsZSA9
IGZhbHNlOwotICAgIHdhcmdzLmZ1bGxzY3JlZW4gPSBmYWxzZTsKLQotICAgIEZyYW1lKiBkaWFs
b2dGcmFtZSA9IGNyZWF0ZVdpbmRvdyhleGVjLCBmcmFtZSwgdXJsLCAiIiwgd2FyZ3MsIGRpYWxv
Z0FyZ3MpOwotICAgIGlmICghZGlhbG9nRnJhbWUpCi0gICAgICAgIHJldHVybiBqc1VuZGVmaW5l
ZCgpOwotCi0gICAgV2luZG93KiBkaWFsb2dXaW5kb3cgPSBXaW5kb3c6OnJldHJpZXZlV2luZG93
KGRpYWxvZ0ZyYW1lKTsKLQotICAgIC8vIEdldCB0aGUgcmV0dXJuIHZhbHVlIGVpdGhlciBqdXN0
IGJlZm9yZSBjbGVhcmluZyB0aGUgZGlhbG9nIHdpbmRvdydzCi0gICAgLy8gcHJvcGVydGllcyAo
aW4gV2luZG93OjpjbGVhciksIG9yIHdoZW4gb24gcmV0dXJuIGZyb20gcnVuTW9kYWwuCi0gICAg
SlNWYWx1ZSogcmV0dXJuVmFsdWUgPSAwOwotICAgIGRpYWxvZ1dpbmRvdy0+c2V0UmV0dXJuVmFs
dWVTbG90KCZyZXR1cm5WYWx1ZSk7Ci0gICAgZGlhbG9nRnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCkt
PnJ1bk1vZGFsKCk7Ci0gICAgZGlhbG9nV2luZG93LT5zZXRSZXR1cm5WYWx1ZVNsb3QoMCk7Ci0K
LSAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuIHZhbHVlLCBnZXQgaXQgbm93LgotICAg
IC8vIEVpdGhlciBXaW5kb3c6OmNsZWFyIHdhcyBub3QgY2FsbGVkIHlldCwgb3IgdGhlcmUgd2Fz
IG5vIHJldHVybiB2YWx1ZSwKLSAgICAvLyBhbmQgaW4gdGhhdCBjYXNlLCB0aGVyZSdzIG5vIGhh
cm0gaW4gdHJ5aW5nIGFnYWluIChubyBiZW5lZml0IGVpdGhlcikuCi0gICAgaWYgKCFyZXR1cm5W
YWx1ZSkKLSAgICAgICAgcmV0dXJuVmFsdWUgPSBkaWFsb2dXaW5kb3ctPmdldERpcmVjdCgicmV0
dXJuVmFsdWUiKTsKLQotICAgIHJldHVybiByZXR1cm5WYWx1ZSA/IHJldHVyblZhbHVlIDoganNV
bmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSAqV2luZG93OjpnZXRWYWx1ZVByb3BlcnR5KEV4ZWNT
dGF0ZSAqZXhlYywgaW50IHRva2VuKSBjb25zdAotewotICAgQVNTRVJUKGltcGwoKS0+ZnJhbWUo
KSk7Ci0KLSAgIHN3aXRjaCAodG9rZW4pIHsKLSAgIGNhc2UgQ3J5cHRvOgotICAgICAgcmV0dXJu
IGpzVW5kZWZpbmVkKCk7IC8vIEZJWE1FOiBpbXBsZW1lbnQgdGhpcwotICAgY2FzZSBET01FeGNl
cHRpb246Ci0gICAgICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOwotICAgICAgcmV0dXJuIGdldERPTUV4Y2VwdGlvbkNvbnN0cnVjdG9y
KGV4ZWMpOwotICAgIGNhc2UgRXZlbnRfOgotICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4
ZWMpKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLSAgICAgIGlmICghZC0+bV9ldnQp
Ci0gICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotICAgICAgcmV0dXJuIHRvSlMoZXhlYywg
ZC0+bV9ldnQpOwotICAgIGNhc2UgTG9jYXRpb25fOgotICAgICAgcmV0dXJuIGxvY2F0aW9uKCk7
Ci0gICAgY2FzZSBOYXZpZ2F0b3JfOgotICAgIGNhc2UgQ2xpZW50SW5mb3JtYXRpb246IHsKLSAg
ICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZp
bmVkKCk7Ci0gICAgICAvLyBTdG9yZSB0aGUgbmF2aWdhdG9yIGluIHRoZSBvYmplY3Qgc28gd2Ug
Z2V0IHRoZSBzYW1lIG9uZSBlYWNoIHRpbWUuCi0gICAgICBOYXZpZ2F0b3IgKm4gPSBuZXcgTmF2
aWdhdG9yKGV4ZWMsIGltcGwoKS0+ZnJhbWUoKSk7Ci0gICAgICAvLyBGSVhNRTogdGhpcyB3aWxs
IG1ha2UgdGhlICJuYXZpZ2F0b3IiIG9iamVjdCBhY2Nlc3NpYmxlIGZyb20gd2luZG93cyB0aGF0
IGZhaWwKLSAgICAgIC8vIHRoZSBzZWN1cml0eSBjaGVjayB0aGUgZmlyc3QgdGltZSwgYnV0IG5v
dCBzdWJzZXF1ZW50IHRpbWVzLCBzZWVtcyB3ZWlyZC4KLSAgICAgIGNvbnN0X2Nhc3Q8V2luZG93
ICo+KHRoaXMpLT5wdXREaXJlY3QoIm5hdmlnYXRvciIsIG4sIERvbnREZWxldGV8UmVhZE9ubHkp
OwotICAgICAgY29uc3RfY2FzdDxXaW5kb3cgKj4odGhpcyktPnB1dERpcmVjdCgiY2xpZW50SW5m
b3JtYXRpb24iLCBuLCBEb250RGVsZXRlfFJlYWRPbmx5KTsKLSAgICAgIHJldHVybiBuOwotICAg
IH0KLSAgICBjYXNlIEltYWdlOgotICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQot
ICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLSAgICAgIC8vIEZJWE1FOiB0aGlzIHByb3Bl
cnR5IChhbmQgdGhlIGZldyBiZWxvdykgcHJvYmFibHkgc2hvdWxkbid0IGNyZWF0ZSBhIG5ldyBv
YmplY3QgZXZlcnkKLSAgICAgIC8vIHRpbWUKLSAgICAgIHJldHVybiBuZXcgSW1hZ2VDb25zdHJ1
Y3RvckltcChleGVjLCBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCkpOwotICAgIGNhc2UgT3B0
aW9uOgotICAgICAgaWYgKCFhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKLSAgICAgIHJldHVybiBuZXcgSlNIVE1MT3B0aW9uRWxlbWVudENvbnN0
cnVjdG9yKGV4ZWMsIGltcGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKSk7Ci0gICAgY2FzZSBYTUxI
dHRwUmVxdWVzdDoKLSAgICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0gICAgICByZXR1cm4gbmV3IEpTWE1MSHR0cFJlcXVlc3RD
b25zdHJ1Y3RvckltcChleGVjLCBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCkpOwotICAgIGNh
c2UgQXVkaW86Ci0jaWYgRU5BQkxFKFZJREVPKQotICAgICAgcmV0dXJuIG5ldyBKU0hUTUxBdWRp
b0VsZW1lbnRDb25zdHJ1Y3RvcihleGVjLCBpbXBsKCktPmZyYW1lKCktPmRvY3VtZW50KCkpOwot
I2Vsc2UKLSAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotI2VuZGlmCi0jaWYgRU5BQkxFKFhT
TFQpCi0gICAgY2FzZSBYU0xUUHJvY2Vzc29yXzoKLSAgICAgIGlmICghYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0gICAgICByZXR1cm4gbmV3
IFhTTFRQcm9jZXNzb3JDb25zdHJ1Y3RvckltcChleGVjKTsKLSNlbHNlCi0gICAgY2FzZSBYU0xU
UHJvY2Vzc29yXzoKLSAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotI2VuZGlmCi0gICB9Ci0K
LSAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgcmV0dXJuIGpzVW5kZWZpbmVk
KCk7Ci0KLSAgIHN3aXRjaCAodG9rZW4pIHsKLSAgIGNhc2UgT25hYm9ydDoKLSAgICAgcmV0dXJu
IGdldExpc3RlbmVyKGV4ZWMsIGFib3J0RXZlbnQpOwotICAgY2FzZSBPbmJsdXI6Ci0gICAgIHJl
dHVybiBnZXRMaXN0ZW5lcihleGVjLCBibHVyRXZlbnQpOwotICAgY2FzZSBPbmNoYW5nZToKLSAg
ICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGNoYW5nZUV2ZW50KTsKLSAgIGNhc2UgT25jbGlj
azoKLSAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGNsaWNrRXZlbnQpOwotICAgY2FzZSBP
bmRibGNsaWNrOgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgZGJsY2xpY2tFdmVudCk7
Ci0gICBjYXNlIE9uZXJyb3I6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBlcnJvckV2
ZW50KTsKLSAgIGNhc2UgT25mb2N1czoKLSAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIGZv
Y3VzRXZlbnQpOwotICAgY2FzZSBPbmtleWRvd246Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihl
eGVjLCBrZXlkb3duRXZlbnQpOwotICAgY2FzZSBPbmtleXByZXNzOgotICAgICByZXR1cm4gZ2V0
TGlzdGVuZXIoZXhlYywga2V5cHJlc3NFdmVudCk7Ci0gICBjYXNlIE9ua2V5dXA6Ci0gICAgIHJl
dHVybiBnZXRMaXN0ZW5lcihleGVjLCBrZXl1cEV2ZW50KTsKLSAgIGNhc2UgT25sb2FkOgotICAg
ICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgbG9hZEV2ZW50KTsKLSAgIGNhc2UgT25tb3VzZWRv
d246Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZWRvd25FdmVudCk7Ci0gICBj
YXNlIE9ubW91c2Vtb3ZlOgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgbW91c2Vtb3Zl
RXZlbnQpOwotICAgY2FzZSBPbm1vdXNlb3V0OgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhl
YywgbW91c2VvdXRFdmVudCk7Ci0gICBjYXNlIE9ubW91c2VvdmVyOgotICAgICByZXR1cm4gZ2V0
TGlzdGVuZXIoZXhlYywgbW91c2VvdmVyRXZlbnQpOwotICAgY2FzZSBPbm1vdXNldXA6Ci0gICAg
IHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZXVwRXZlbnQpOwotICAgY2FzZSBPbldpbmRv
d01vdXNlV2hlZWw6Ci0gICAgIHJldHVybiBnZXRMaXN0ZW5lcihleGVjLCBtb3VzZXdoZWVsRXZl
bnQpOwotICAgY2FzZSBPbnJlc2V0OgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgcmVz
ZXRFdmVudCk7Ci0gICBjYXNlIE9ucmVzaXplOgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhl
YyxyZXNpemVFdmVudCk7Ci0gICBjYXNlIE9uc2Nyb2xsOgotICAgICByZXR1cm4gZ2V0TGlzdGVu
ZXIoZXhlYyxzY3JvbGxFdmVudCk7Ci0gICBjYXNlIE9uc2VhcmNoOgotICAgICByZXR1cm4gZ2V0
TGlzdGVuZXIoZXhlYyxzZWFyY2hFdmVudCk7Ci0gICBjYXNlIE9uc2VsZWN0OgotICAgICByZXR1
cm4gZ2V0TGlzdGVuZXIoZXhlYyxzZWxlY3RFdmVudCk7Ci0gICBjYXNlIE9uc3VibWl0OgotICAg
ICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYyxzdWJtaXRFdmVudCk7Ci0gICBjYXNlIE9uYmVmb3Jl
dW5sb2FkOgotICAgICByZXR1cm4gZ2V0TGlzdGVuZXIoZXhlYywgYmVmb3JldW5sb2FkRXZlbnQp
OwotICAgY2FzZSBPbnVubG9hZDoKLSAgICAgcmV0dXJuIGdldExpc3RlbmVyKGV4ZWMsIHVubG9h
ZEV2ZW50KTsKLSAgIH0KLSAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUqIFdpbmRvdzo6Y2hpbGRGcmFtZUdldHRlcihFeGVjU3Rh
dGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJv
cGVydHlTbG90JiBzbG90KQotewotICAgIHJldHVybiByZXRyaWV2ZShzdGF0aWNfY2FzdDxXaW5k
b3cqPihzbG90LnNsb3RCYXNlKCkpLT5pbXBsKCktPmZyYW1lKCktPnRyZWUoKS0+Y2hpbGQoQXRv
bWljU3RyaW5nKHByb3BlcnR5TmFtZSkpKTsKLX0KLQotSlNWYWx1ZSogV2luZG93OjppbmRleEdl
dHRlcihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBjb25zdCBQcm9w
ZXJ0eVNsb3QmIHNsb3QpCi17Ci0gICAgcmV0dXJuIHJldHJpZXZlKHN0YXRpY19jYXN0PFdpbmRv
dyo+KHNsb3Quc2xvdEJhc2UoKSktPmltcGwoKS0+ZnJhbWUoKS0+dHJlZSgpLT5jaGlsZChzbG90
LmluZGV4KCkpKTsKLX0KLQotSlNWYWx1ZSAqV2luZG93OjpuYW1lZEl0ZW1HZXR0ZXIoRXhlY1N0
YXRlICpleGVjLCBKU09iamVjdCAqb3JpZ2luYWxPYmplY3QsIGNvbnN0IElkZW50aWZpZXImIHBy
b3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQotewotICBXaW5kb3cgKnRoaXNP
YmogPSBzdGF0aWNfY2FzdDxXaW5kb3cgKj4oc2xvdC5zbG90QmFzZSgpKTsKLSAgRG9jdW1lbnQg
KmRvYyA9IHRoaXNPYmotPmltcGwoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQoKTsKLSAgQVNTRVJUKHRo
aXNPYmotPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykgJiYgZG9jICYmIGRvYy0+aXNIVE1MRG9jdW1l
bnQoKSk7Ci0KLSAgU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gIFJlZlB0cjxXZWJDb3Jl
OjpIVE1MQ29sbGVjdGlvbj4gY29sbGVjdGlvbiA9IGRvYy0+d2luZG93TmFtZWRJdGVtcyhuYW1l
KTsKLSAgaWYgKGNvbGxlY3Rpb24tPmxlbmd0aCgpID09IDEpCi0gICAgcmV0dXJuIHRvSlMoZXhl
YywgY29sbGVjdGlvbi0+Zmlyc3RJdGVtKCkpOwotICByZXR1cm4gdG9KUyhleGVjLCBjb2xsZWN0
aW9uLmdldCgpKTsKLX0KLQotYm9vbCBXaW5kb3c6OmdldE93blByb3BlcnR5U2xvdChFeGVjU3Rh
dGUgKmV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBz
bG90KQotewotICAvLyBDaGVjayBmb3IgY2hpbGQgZnJhbWVzIGJ5IG5hbWUgYmVmb3JlIGJ1aWx0
LWluIHByb3BlcnRpZXMgdG8KLSAgLy8gbWF0Y2ggTW96aWxsYS4gVGhpcyBkb2VzIG5vdCBtYXRj
aCBJRSwgYnV0IHNvbWUgc2l0ZXMgZW5kIHVwCi0gIC8vIG5hbWluZyBmcmFtZXMgdGhpbmdzIHRo
YXQgY29uZmxpY3Qgd2l0aCB3aW5kb3cgcHJvcGVydGllcyB0aGF0Ci0gIC8vIGFyZSBpbiBNb3og
YnV0IG5vdCBJRS4gU2luY2Ugd2UgaGF2ZSBzb21lIG9mIHRoZXNlLCB3ZSBoYXZlIHRvIGRvCi0g
IC8vIGl0IHRoZSBNb3ogd2F5LgotICBpZiAoaW1wbCgpLT5mcmFtZSgpLT50cmVlKCktPmNoaWxk
KHByb3BlcnR5TmFtZSkpIHsKLSAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBjaGlsZEZyYW1lR2V0
dGVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IEhhc2hFbnRyeSogZW50cnkg
PSBMb29rdXA6OmZpbmRFbnRyeSgmV2luZG93VGFibGUsIHByb3BlcnR5TmFtZSk7Ci0gIGlmIChl
bnRyeSkgewotICAgIGlmIChlbnRyeS0+YXR0ciAmIEZ1bmN0aW9uKSB7Ci0gICAgICBpZiAoZW50
cnktPnZhbHVlLmZ1bmN0aW9uVmFsdWUgPT0gJldpbmRvd1Byb3RvRnVuY1Nob3dNb2RhbERpYWxv
Zzo6Y3JlYXRlKSB7Ci0gICAgICAgIGlmICghY2FuU2hvd01vZGFsRGlhbG9nKGltcGwoKS0+ZnJh
bWUoKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKGFsbG93
c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNsb3Quc2V0U3RhdGljRW50cnkodGhpcywgZW50
cnksIHN0YXRpY0Z1bmN0aW9uR2V0dGVyKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2xvdC5zZXRV
bmRlZmluZWQodGhpcyk7Ci0gICAgfSBlbHNlCi0gICAgICBzbG90LnNldFN0YXRpY0VudHJ5KHRo
aXMsIGVudHJ5LCBzdGF0aWNWYWx1ZUdldHRlcjxXaW5kb3c+KTsKLSAgICByZXR1cm4gdHJ1ZTsK
LSAgfQotCi0gIC8vIEZJWE1FOiBTZWFyY2ggdGhlIHdob2xlIGZyYW1lIGhpZXJhY2h5IHNvbWV3
aGVyZSBhcm91bmQgaGVyZS4KLSAgLy8gV2UgbmVlZCB0byB0ZXN0IHRoZSBjb3JyZWN0IHByaW9y
aXR5IG9yZGVyLgotCi0gIC8vIGFsbG93IHdpbmRvd1sxXSBvciBwYXJlbnRbMV0gZXRjLiAoIzU2
OTgzKQotICBib29sIG9rOwotICB1bnNpZ25lZCBpID0gcHJvcGVydHlOYW1lLnRvQXJyYXlJbmRl
eCgmb2spOwotICBpZiAob2sgJiYgaSA8IGltcGwoKS0+ZnJhbWUoKS0+dHJlZSgpLT5jaGlsZENv
dW50KCkpIHsKLSAgICBzbG90LnNldEN1c3RvbUluZGV4KHRoaXMsIGksIGluZGV4R2V0dGVyKTsK
LSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIGFsbG93IHNob3J0Y3V0cyBsaWtlICdJbWFn
ZTEnIGluc3RlYWQgb2YgZG9jdW1lbnQuaW1hZ2VzLkltYWdlMQotICBEb2N1bWVudCogZG9jID0g
aW1wbCgpLT5mcmFtZSgpLT5kb2N1bWVudCgpOwotICBpZiAoZG9jICYmIGRvYy0+aXNIVE1MRG9j
dW1lbnQoKSkgewotICAgIGlmICghYWxsb3dzQWNjZXNzRnJvbShleGVjKSkgewotICAgICAgc2xv
dC5zZXRVbmRlZmluZWQodGhpcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBB
dG9taWNTdHJpbmcgYXRvbWljUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgIGlmIChz
dGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPihkb2MpLT5oYXNOYW1lZEl0ZW0oYXRvbWljUHJvcGVy
dHlOYW1lKSB8fCBkb2MtPmdldEVsZW1lbnRCeUlkKGF0b21pY1Byb3BlcnR5TmFtZSkpIHsKLSAg
ICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIG5hbWVkSXRlbUdldHRlcik7Ci0gICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWFsbG93c0FjY2Vzc0Zyb20oZXhlYykpIHsKLSAg
ICBzbG90LnNldFVuZGVmaW5lZCh0aGlzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJl
dHVybiBKU09iamVjdDo6Z2V0T3duUHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xv
dCk7Ci19Ci0KLXZvaWQgV2luZG93OjpwdXQoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlm
aWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKLXsKLSAgY29uc3Qg
SGFzaEVudHJ5KiBlbnRyeSA9IExvb2t1cDo6ZmluZEVudHJ5KCZXaW5kb3dUYWJsZSwgcHJvcGVy
dHlOYW1lKTsKLSAgaWYgKGVudHJ5KSB7Ci0gICAgIGlmIChlbnRyeS0+YXR0ciAmIEZ1bmN0aW9u
KSB7Ci0gICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgICBKU09iamVj
dDo6cHV0KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHIpOwotICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgaWYgKGVudHJ5LT5hdHRyICYgUmVhZE9ubHkpCi0gICAgICByZXR1cm47Ci0K
LSAgICBzd2l0Y2ggKGVudHJ5LT52YWx1ZS5pbnRWYWx1ZSkgewotICAgIGNhc2UgTG9jYXRpb25f
OiB7Ci0gICAgICBGcmFtZSogcCA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwo
KS0+ZnJhbWUoKTsKLSAgICAgIGlmIChwKSB7Ci0gICAgICAgIGlmICghcC0+bG9hZGVyKCktPnNo
b3VsZEFsbG93TmF2aWdhdGlvbihpbXBsKCktPmZyYW1lKCkpKQotICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgU3RyaW5nIGRzdFVybCA9IHAtPmxvYWRlcigpLT5jb21wbGV0ZVVSTCh2YWx1ZS0+
dG9TdHJpbmcoZXhlYykpLnN0cmluZygpOwotICAgICAgICBpZiAoIWRzdFVybC5zdGFydHNXaXRo
KCJqYXZhc2NyaXB0OiIsIGZhbHNlKSB8fCBhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSB7Ci0gICAg
ICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IHAtPnNjcmlwdFByb3h5KCktPnByb2Nlc3NpbmdVc2Vy
R2VzdHVyZSgpOwotICAgICAgICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBpdGVtIGlmIHRo
aXMgSlMgd2FzIGNhbGxlZCB2aWEgYSB1c2VyIGdlc3R1cmUKLSAgICAgICAgICBpbXBsKCktPmZy
YW1lKCktPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKGRzdFVybCwgcC0+bG9hZGVy
KCktPm91dGdvaW5nUmVmZXJyZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKLSAgICAgICAgfQot
ICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIE9uYWJvcnQ6Ci0gICAgICBp
ZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgYWJv
cnRFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBPbmJsdXI6Ci0gICAgICBp
ZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgYmx1
ckV2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uY2hhbmdlOgotICAgICAg
aWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsIGNo
YW5nZUV2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uY2xpY2s6Ci0gICAg
ICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxj
bGlja0V2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uZGJsY2xpY2s6Ci0g
ICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhl
YywgZGJsY2xpY2tFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBPbmVycm9y
OgotICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVy
KGV4ZWMsIGVycm9yRXZlbnQsIHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uZm9j
dXM6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVu
ZXIoZXhlYyxmb2N1c0V2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9ua2V5
ZG93bjoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0
ZW5lcihleGVjLGtleWRvd25FdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBP
bmtleXByZXNzOgotICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNl
dExpc3RlbmVyKGV4ZWMsa2V5cHJlc3NFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAg
Y2FzZSBPbmtleXVwOgotICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAg
IHNldExpc3RlbmVyKGV4ZWMsa2V5dXBFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAg
Y2FzZSBPbmxvYWQ6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAg
c2V0TGlzdGVuZXIoZXhlYyxsb2FkRXZlbnQsdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNh
c2UgT25tb3VzZWRvd246Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAg
ICAgc2V0TGlzdGVuZXIoZXhlYyxtb3VzZWRvd25FdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47
Ci0gICAgY2FzZSBPbm1vdXNlbW92ZToKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMp
KQotICAgICAgICBzZXRMaXN0ZW5lcihleGVjLG1vdXNlbW92ZUV2ZW50LHZhbHVlKTsKLSAgICAg
IHJldHVybjsKLSAgICBjYXNlIE9ubW91c2VvdXQ6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYyxtb3VzZW91dEV2ZW50LHZhbHVlKTsK
LSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9ubW91c2VvdmVyOgotICAgICAgaWYgKGFsbG93c0Fj
Y2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsbW91c2VvdmVyRXZlbnQs
dmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25tb3VzZXVwOgotICAgICAgaWYgKGFs
bG93c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsbW91c2V1cEV2
ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9uV2luZG93TW91c2VXaGVlbDoK
LSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0ZW5lcihl
eGVjLCBtb3VzZXdoZWVsRXZlbnQsdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25y
ZXNldDoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRMaXN0
ZW5lcihleGVjLHJlc2V0RXZlbnQsdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgT25y
ZXNpemU6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAgc2V0TGlz
dGVuZXIoZXhlYyxyZXNpemVFdmVudCx2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBP
bnNjcm9sbDoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQotICAgICAgICBzZXRM
aXN0ZW5lcihleGVjLHNjcm9sbEV2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNl
IE9uc2VhcmNoOgotICAgICAgICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAg
ICAgIHNldExpc3RlbmVyKGV4ZWMsc2VhcmNoRXZlbnQsdmFsdWUpOwotICAgICAgICByZXR1cm47
Ci0gICAgY2FzZSBPbnNlbGVjdDoKLSAgICAgIGlmIChhbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKQot
ICAgICAgICBzZXRMaXN0ZW5lcihleGVjLHNlbGVjdEV2ZW50LHZhbHVlKTsKLSAgICAgIHJldHVy
bjsKLSAgICBjYXNlIE9uc3VibWl0OgotICAgICAgaWYgKGFsbG93c0FjY2Vzc0Zyb20oZXhlYykp
Ci0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsc3VibWl0RXZlbnQsdmFsdWUpOwotICAgICAgcmV0
dXJuOwotICAgIGNhc2UgT25iZWZvcmV1bmxvYWQ6Ci0gICAgICBpZiAoYWxsb3dzQWNjZXNzRnJv
bShleGVjKSkKLSAgICAgICAgc2V0TGlzdGVuZXIoZXhlYywgYmVmb3JldW5sb2FkRXZlbnQsIHZh
bHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIE9udW5sb2FkOgotICAgICAgaWYgKGFsbG93
c0FjY2Vzc0Zyb20oZXhlYykpCi0gICAgICAgIHNldExpc3RlbmVyKGV4ZWMsIHVubG9hZEV2ZW50
LCB2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAg
IH0KLSAgfQotICBpZiAoYWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICBKU09iamVjdDo6cHV0
KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHIpOwotfQotCi1ib29sIFdpbmRvdzo6YWxs
b3dzQWNjZXNzRnJvbShjb25zdCBKU0dsb2JhbE9iamVjdCogb3RoZXIpIGNvbnN0Ci17Ci0gICAg
Y29uc3QgRnJhbWUqIG9yaWdpbkZyYW1lID0gc3RhdGljX2Nhc3Q8Y29uc3QgV2luZG93Kj4ob3Ro
ZXIpLT5pbXBsKCktPmZyYW1lKCk7Ci0gICAgaWYgKCFvcmlnaW5GcmFtZSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgY29uc3QgRnJhbWUqIHRhcmdldEZyYW1lID0gaW1wbCgpLT5mcmFt
ZSgpOwotICAgIGlmICghdGFyZ2V0RnJhbWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGlmIChvcmlnaW5GcmFtZSA9PSB0YXJnZXRGcmFtZSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0K
LSAgICBXZWJDb3JlOjpEb2N1bWVudCogdGFyZ2V0RG9jdW1lbnQgPSB0YXJnZXRGcmFtZS0+ZG9j
dW1lbnQoKTsKLQotICAgIC8vIEpTIG1heSBiZSBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgIndp
bmRvdyIgb2JqZWN0LCB3aGljaCBzaG91bGQgYmUgdmFsaWQsCi0gICAgLy8gZXZlbiBpZiB0aGUg
ZG9jdW1lbnQgaGFzbid0IGJlZW4gY29uc3RydWN0ZWQgeWV0LiAgSWYgdGhlIGRvY3VtZW50IGRv
ZXNuJ3QKLSAgICAvLyBleGlzdCB5ZXQgYWxsb3cgSlMgdG8gYWNjZXNzIHRoZSB3aW5kb3cgb2Jq
ZWN0LgotICAgIGlmICghdGFyZ2V0RG9jdW1lbnQpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0g
ICAgV2ViQ29yZTo6RG9jdW1lbnQqIG9yaWdpbkRvY3VtZW50ID0gb3JpZ2luRnJhbWUtPmRvY3Vt
ZW50KCk7Ci0KLSAgICBjb25zdCBTZWN1cml0eU9yaWdpbiYgb3JpZ2luU2VjdXJpdHlPcmlnaW4g
PSBvcmlnaW5Eb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKTsKLSAgICBjb25zdCBTZWN1cml0eU9y
aWdpbiYgdGFyZ2V0U2VjdXJpdHlPcmlnaW4gPSB0YXJnZXREb2N1bWVudC0+c2VjdXJpdHlPcmln
aW4oKTsKLQotICAgIGlmIChvcmlnaW5TZWN1cml0eU9yaWdpbi5jYW5BY2Nlc3ModGFyZ2V0U2Vj
dXJpdHlPcmlnaW4pKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmICghdGFyZ2V0RnJh
bWUtPnNldHRpbmdzKCktPnByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSkgewotICAgICAgICAvLyBG
SVhNRTogdGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lmaWNzIG9m
IHdoeSB0aGUgc2FtZSBvcmlnaW4gY2hlY2sgaGFzIGZhaWxlZC4KLSAgICAgICAgU3RyaW5nIG1l
c3NhZ2UgPSBTdHJpbmc6OmZvcm1hdCgiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0byBhY2Nl
c3MgZnJhbWUgd2l0aCBVUkwgJXMgZnJvbSBmcmFtZSB3aXRoIFVSTCAlcy4gRG9tYWlucywgcHJv
dG9jb2xzIGFuZCBwb3J0cyBtdXN0IG1hdGNoLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0YXJnZXREb2N1bWVudC0+dXJsKCkudXRmOCgpLmRhdGEoKSwgb3Jp
Z2luRG9jdW1lbnQtPnVybCgpLnV0ZjgoKS5kYXRhKCkpOwotCi0gICAgICAgIGlmIChJbnRlcnBy
ZXRlcjo6c2hvdWxkUHJpbnRFeGNlcHRpb25zKCkpCi0gICAgICAgICAgICBwcmludGYoIiVzIiwg
bWVzc2FnZS51dGY4KCkuZGF0YSgpKTsKLQotICAgICAgICBpZiAoUGFnZSogcGFnZSA9IHRhcmdl
dEZyYW1lLT5wYWdlKCkpCi0gICAgICAgICAgICBwYWdlLT5jaHJvbWUoKS0+YWRkTWVzc2FnZVRv
Q29uc29sZShKU01lc3NhZ2VTb3VyY2UsIEVycm9yTWVzc2FnZUxldmVsLCBtZXNzYWdlLCAxLCBT
dHJpbmcoKSk7IC8vIEZJWE1FOiBwcm92aWRlIGEgcmVhbCBsaW5lIG51bWJlciBhbmQgc291cmNl
IFVSTC4KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUV4ZWNTdGF0ZSogV2luZG93
OjpnbG9iYWxFeGVjKCkKLXsKLSAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSBz
Y3JpcHQgZXhlY3V0aW9uIGhhcHBlbmluZyBpbiB0aGlzCi0gICAgLy8gZnJhbWUgZG9lcyBub3Qg
ZGVzdHJveSBpdAotICAgIEFTU0VSVChpbXBsKCktPmZyYW1lKCkpOwotICAgIGltcGwoKS0+ZnJh
bWUoKS0+a2VlcEFsaXZlKCk7Ci0gICAgcmV0dXJuIEpTR2xvYmFsT2JqZWN0OjpnbG9iYWxFeGVj
KCk7Ci19Ci0KLWJvb2wgV2luZG93OjpzaG91bGRJbnRlcnJ1cHRTY3JpcHQoKSBjb25zdAotewot
ICAgIEFTU0VSVChpbXBsKCktPmZyYW1lKCkpOwotICAgIFBhZ2UqIHBhZ2UgPSBpbXBsKCktPmZy
YW1lKCktPnBhZ2UoKTsKLQotICAgIC8vIFNlZSA8cmRhcjovL3Byb2JsZW0vNTQ3OTQ0Mz4uIFdl
IGRvbid0IHRoaW5rIHRoYXQgcGFnZSBjYW4gZXZlciBiZSBOVUxMCi0gICAgLy8gaW4gdGhpcyBj
YXNlLCBidXQgaWYgaXQgaXMsIHdlJ3ZlIGdvdHRlbiBpbnRvIGEgc3RhdGUgd2hlcmUgd2UgbWF5
IGhhdmUKLSAgICAvLyBodW5nIHRoZSBVSSwgd2l0aCBubyB3YXkgdG8gYXNrIHRoZSBjbGllbnQg
d2hldGhlciB0byBjYW5jZWwgZXhlY3V0aW9uLgotICAgIC8vIEZvciBub3csIG91ciBzb2x1dGlv
biBpcyBqdXN0IHRvIGNhbmNlbCBleGVjdXRpb24gbm8gbWF0dGVyIHdoYXQsCi0gICAgLy8gZW5z
dXJpbmcgdGhhdCB3ZSBuZXZlciBoYW5nLiBXZSBtaWdodCB3YW50IHRvIGNvbnNpZGVyIG90aGVy
IHNvbHV0aW9ucwotICAgIC8vIGlmIHdlIGRpc2NvdmVyIHByb2JsZW1zIHdpdGggdGhpcyBvbmUu
Ci0gICAgQVNTRVJUKHBhZ2UpOwotICAgIGlmICghcGFnZSkKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICByZXR1cm4gcGFnZS0+Y2hyb21lKCktPnNob3VsZEludGVycnVwdEphdmFTY3JpcHQo
KTsKLX0KLQotdm9pZCBXaW5kb3c6OnNldExpc3RlbmVyKEV4ZWNTdGF0ZSogZXhlYywgY29uc3Qg
QXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEpTVmFsdWUqIGZ1bmMpCi17Ci0gICAgQVNTRVJUKGlt
cGwoKS0+ZnJhbWUoKSk7Ci0gICAgRG9jdW1lbnQqIGRvYyA9IGltcGwoKS0+ZnJhbWUoKS0+ZG9j
dW1lbnQoKTsKLSAgICBpZiAoIWRvYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZG9jLT5zZXRI
VE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGZpbmRPckNyZWF0ZUpTRXZlbnRMaXN0
ZW5lcihmdW5jLCB0cnVlKSk7Ci19Ci0KLUpTVmFsdWUqIFdpbmRvdzo6Z2V0TGlzdGVuZXIoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSkgY29uc3QKLXsKLSAg
ICBBU1NFUlQoaW1wbCgpLT5mcmFtZSgpKTsKLSAgICBEb2N1bWVudCogZG9jID0gaW1wbCgpLT5m
cmFtZSgpLT5kb2N1bWVudCgpOwotICAgIGlmICghZG9jKQotICAgICAgICByZXR1cm4ganNVbmRl
ZmluZWQoKTsKLQotICAgIFdlYkNvcmU6OkV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gZG9jLT5n
ZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUpOwotICAgIGlmIChsaXN0ZW5lciAm
JiBzdGF0aWNfY2FzdDxKU0V2ZW50TGlzdGVuZXIqPihsaXN0ZW5lciktPmxpc3RlbmVyT2JqKCkp
Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxKU0V2ZW50TGlzdGVuZXIqPihsaXN0ZW5lcikt
Pmxpc3RlbmVyT2JqKCk7Ci0gICAgcmV0dXJuIGpzTnVsbCgpOwotfQotCi1KU0V2ZW50TGlzdGVu
ZXIqIFdpbmRvdzo6ZmluZEpTRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiB2YWwsIGJvb2wgaHRtbCkK
LXsKLSAgICBpZiAoIXZhbC0+aXNPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgSlNP
YmplY3QqIG9iamVjdCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odmFsKTsKLSAgICBMaXN0ZW5l
cnNNYXAmIGxpc3RlbmVycyA9IGh0bWwgPyBkLT5qc0hUTUxFdmVudExpc3RlbmVycyA6IGQtPmpz
RXZlbnRMaXN0ZW5lcnM7Ci0gICAgcmV0dXJuIGxpc3RlbmVycy5nZXQob2JqZWN0KTsKLX0KLQot
SlNFdmVudExpc3RlbmVyKiBXaW5kb3c6OmZpbmRPckNyZWF0ZUpTRXZlbnRMaXN0ZW5lcihKU1Zh
bHVlKiB2YWwsIGJvb2wgaHRtbCkKLXsKLSAgICBKU0V2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0g
ZmluZEpTRXZlbnRMaXN0ZW5lcih2YWwsIGh0bWwpOwotICAgIGlmIChsaXN0ZW5lcikKLSAgICAg
ICAgcmV0dXJuIGxpc3RlbmVyOwotCi0gICAgaWYgKCF2YWwtPmlzT2JqZWN0KCkpCi0gICAgICAg
IHJldHVybiAwOwotICAgIEpTT2JqZWN0KiBvYmplY3QgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+
KHZhbCk7Ci0KLSAgICAvLyBOb3RlIHRoYXQgdGhlIEpTRXZlbnRMaXN0ZW5lciBjb25zdHJ1Y3Rv
ciBhZGRzIGl0IHRvIG91ciBqc0V2ZW50TGlzdGVuZXJzIGxpc3QKLSAgICByZXR1cm4gbmV3IEpT
RXZlbnRMaXN0ZW5lcihvYmplY3QsIHRoaXMsIGh0bWwpOwotfQotCi1KU1VucHJvdGVjdGVkRXZl
bnRMaXN0ZW5lciogV2luZG93OjpmaW5kSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIoSlNWYWx1
ZSogdmFsLCBib29sIGh0bWwpCi17Ci0gICAgaWYgKCF2YWwtPmlzT2JqZWN0KCkpCi0gICAgICAg
IHJldHVybiAwOwotICAgIEpTT2JqZWN0KiBvYmplY3QgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+
KHZhbCk7Ci0gICAgVW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAmIGxpc3RlbmVycyA9IGh0bWwgPyBk
LT5qc1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzIDogZC0+anNVbnByb3RlY3RlZEV2ZW50
TGlzdGVuZXJzOwotICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KG9iamVjdCk7Ci19Ci0KLUpTVW5w
cm90ZWN0ZWRFdmVudExpc3RlbmVyKiBXaW5kb3c6OmZpbmRPckNyZWF0ZUpTVW5wcm90ZWN0ZWRF
dmVudExpc3RlbmVyKEpTVmFsdWUqIHZhbCwgYm9vbCBodG1sKQotewotICAgIEpTVW5wcm90ZWN0
ZWRFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9IGZpbmRKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5l
cih2YWwsIGh0bWwpOwotICAgIGlmIChsaXN0ZW5lcikKLSAgICAgICAgcmV0dXJuIGxpc3RlbmVy
OwotICAgIGlmICghdmFsLT5pc09iamVjdCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBKU09i
amVjdCogb2JqZWN0ID0gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih2YWwpOwotCi0gICAgLy8gVGhl
IEpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyIGNvbnN0cnVjdG9yIGFkZHMgaXQgdG8gb3VyIGpz
VW5wcm90ZWN0ZWRFdmVudExpc3RlbmVycyBtYXAuCi0gICAgcmV0dXJuIG5ldyBKU1VucHJvdGVj
dGVkRXZlbnRMaXN0ZW5lcihvYmplY3QsIHRoaXMsIGh0bWwpOwotfQotCi12b2lkIFdpbmRvdzo6
Y2xlYXJIZWxwZXJPYmplY3RQcm9wZXJ0aWVzKCkKLXsKLSAgICBkLT5sb2MgPSAwOwotICAgIGQt
Pm1fZXZ0ID0gMDsKLX0KLQotdm9pZCBXaW5kb3c6OmNsZWFyKCkKLXsKLSAgSlNMb2NrIGxvY2s7
Ci0KLSAgaWYgKGQtPm1fcmV0dXJuVmFsdWVTbG90ICYmICEqZC0+bV9yZXR1cm5WYWx1ZVNsb3Qp
Ci0gICAgKmQtPm1fcmV0dXJuVmFsdWVTbG90ID0gZ2V0RGlyZWN0KCJyZXR1cm5WYWx1ZSIpOwot
Ci0gIGNsZWFyQWxsVGltZW91dHMoKTsKLSAgY2xlYXJQcm9wZXJ0aWVzKCk7Ci0gIGNsZWFySGVs
cGVyT2JqZWN0UHJvcGVydGllcygpOwotCi0gIC8vIE5vdyByZWNyZWF0ZSBhIHdvcmtpbmcgZ2xv
YmFsIG9iamVjdCBmb3IgdGhlIG5leHQgVVJMIHRoYXQgd2lsbCB1c2UgdXM7IGJ1dCBvbmx5IGlm
IHdlIGhhdmVuJ3QgYmVlbgotICAvLyBkaXNjb25uZWN0ZWQgeWV0Ci0gIGlmIChGcmFtZSogZnJh
bWUgPSBpbXBsKCktPmZyYW1lKCkpCi0gICAgZnJhbWUtPnNjcmlwdFByb3h5KCktPmdsb2JhbE9i
amVjdCgpLT5yZXNldChKU0RPTVdpbmRvd1Byb3RvdHlwZTo6c2VsZigpKTsKLQotICAvLyB0aGVy
ZSdzIGxpa2VseSB0byBiZSBsb3RzIG9mIGdhcmJhZ2Ugbm93Ci0gIGdjQ29udHJvbGxlcigpLmdh
cmJhZ2VDb2xsZWN0U29vbigpOwotfQotCi12b2lkIFdpbmRvdzo6c2V0Q3VycmVudEV2ZW50KEV2
ZW50KiBldnQpCi17Ci0gICAgZC0+bV9ldnQgPSBldnQ7Ci19Ci0KLUV2ZW50KiBXaW5kb3c6OmN1
cnJlbnRFdmVudCgpCi17Ci0gICAgcmV0dXJuIGQtPm1fZXZ0OwotfQotCi1KU1ZhbHVlKiBXaW5k
b3dQcm90b0Z1bmNBVG9COjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0
KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewotICAgIGlmICghdGhpc09iai0+aW5oZXJp
dHMoJldpbmRvdzo6aW5mbykpCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVF
cnJvcik7Ci0KLSAgICBpZiAoYXJncy5zaXplKCkgPCAxKQotICAgICAgICByZXR1cm4gdGhyb3dF
cnJvcihleGVjLCBTeW50YXhFcnJvciwgIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7Ci0KLSAgICBK
U1ZhbHVlKiB2ID0gYXJnc1swXTsKLSAgICBpZiAodi0+aXNOdWxsKCkpCi0gICAgICAgIHJldHVy
biBqc1N0cmluZygpOwotCi0gICAgVVN0cmluZyBzID0gdi0+dG9TdHJpbmcoZXhlYyk7Ci0gICAg
aWYgKCFzLmlzOEJpdCgpKSB7Ci0gICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBJTlZBTElE
X0NIQVJBQ1RFUl9FUlIpOwotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLSAgICB9Ci0K
LSAgICBWZWN0b3I8Y2hhcj4gaW4ocy5zaXplKCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
cy5zaXplKCk7ICsraSkKLSAgICAgICAgaW5baV0gPSBzdGF0aWNfY2FzdDxjaGFyPihzLmRhdGEo
KVtpXS51bmljb2RlKCkpOwotICAgIFZlY3RvcjxjaGFyPiBvdXQ7Ci0KLSAgICBpZiAoIWJhc2U2
NERlY29kZShpbiwgb3V0KSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgR2VuZXJh
bEVycm9yLCAiQ2Fubm90IGRlY29kZSBiYXNlNjQiKTsKLQotICAgIHJldHVybiBqc1N0cmluZyhT
dHJpbmcob3V0LmRhdGEoKSwgb3V0LnNpemUoKSkpOwotfQotCi1KU1ZhbHVlKiBXaW5kb3dQcm90
b0Z1bmNCVG9BOjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlz
T2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewotICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJldp
bmRvdzo6aW5mbykpCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7
Ci0KLSAgICBpZiAoYXJncy5zaXplKCkgPCAxKQotICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihl
eGVjLCBTeW50YXhFcnJvciwgIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7Ci0KLSAgICBKU1ZhbHVl
KiB2ID0gYXJnc1swXTsKLSAgICBpZiAodi0+aXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBqc1N0
cmluZygpOwotCi0gICAgVVN0cmluZyBzID0gdi0+dG9TdHJpbmcoZXhlYyk7Ci0gICAgaWYgKCFz
LmlzOEJpdCgpKSB7Ci0gICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBJTlZBTElEX0NIQVJB
Q1RFUl9FUlIpOwotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLSAgICB9Ci0KLSAgICBW
ZWN0b3I8Y2hhcj4gaW4ocy5zaXplKCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5zaXpl
KCk7ICsraSkKLSAgICAgICAgaW5baV0gPSBzdGF0aWNfY2FzdDxjaGFyPihzLmRhdGEoKVtpXS51
bmljb2RlKCkpOwotICAgIFZlY3RvcjxjaGFyPiBvdXQ7Ci0KLSAgICBiYXNlNjRFbmNvZGUoaW4s
IG91dCk7Ci0KLSAgICByZXR1cm4ganNTdHJpbmcoU3RyaW5nKG91dC5kYXRhKCksIG91dC5zaXpl
KCkpKTsKLX0KLQotSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jT3Blbjo6Y2FsbEFzRnVuY3Rpb24o
RXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKLXsK
LSAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQotICAgICAgICByZXR1
cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOwotICAgIFdpbmRvdyogd2luZG93ID0gc3Rh
dGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7Ci0gICAgRnJhbWUqIGZyYW1lID0gd2luZG93LT5p
bXBsKCktPmZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIGpzVW5kZWZp
bmVkKCk7Ci0gICAgRnJhbWUqIGFjdGl2ZUZyYW1lID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShl
eGVjKS0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmICghYWN0aXZlRnJhbWUpCi0gICAgICAgIHJl
dHVybiAganNVbmRlZmluZWQoKTsKLQotICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpOwot
Ci0gICAgU3RyaW5nIHVybFN0cmluZyA9IHZhbHVlVG9TdHJpbmdXaXRoVW5kZWZpbmVkT3JOdWxs
Q2hlY2soZXhlYywgYXJnc1swXSk7Ci0gICAgQXRvbWljU3RyaW5nIGZyYW1lTmFtZSA9IGFyZ3Nb
MV0tPmlzVW5kZWZpbmVkT3JOdWxsKCkgPyAiX2JsYW5rIiA6IEF0b21pY1N0cmluZyhhcmdzWzFd
LT50b1N0cmluZyhleGVjKSk7Ci0KLSAgICAvLyBCZWNhdXNlIEZyYW1lVHJlZTo6ZmluZCgpIHJl
dHVybnMgdHJ1ZSBmb3IgZW1wdHkgc3RyaW5ncywgd2UgbXVzdCBjaGVjayBmb3IgZW1wdHkgZnJh
bWVuYW1lcy4KLSAgICAvLyBPdGhlcndpc2UsIGlsbGVnaXRpbWF0ZSB3aW5kb3cub3BlbigpIGNh
bGxzIHdpdGggbm8gbmFtZSB3aWxsIHBhc3MgcmlnaHQgdGhyb3VnaCB0aGUgcG9wdXAgYmxvY2tl
ci4KLSAgICBpZiAoIWFsbG93UG9wVXAoZnJhbWUpICYmIChmcmFtZU5hbWUuaXNFbXB0eSgpIHx8
ICFmcmFtZS0+dHJlZSgpLT5maW5kKGZyYW1lTmFtZSkpKQotICAgICAgICByZXR1cm4ganNVbmRl
ZmluZWQoKTsKLQotICAgIC8vIEdldCB0aGUgdGFyZ2V0IGZyYW1lIGZvciB0aGUgc3BlY2lhbCBj
YXNlcyBvZiBfdG9wIGFuZCBfcGFyZW50LiAgSW4gdGhvc2UKLSAgICAvLyBjYXNlcywgd2UgY2Fu
IHNjaGVkdWxlIGEgbG9jYXRpb24gY2hhbmdlIHJpZ2h0IG5vdyBhbmQgcmV0dXJuIGVhcmx5Lgot
ICAgIGJvb2wgdG9wT3JQYXJlbnQgPSBmYWxzZTsKLSAgICBpZiAoZnJhbWVOYW1lID09ICJfdG9w
IikgewotICAgICAgICBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRvcCgpOwotICAgICAgICB0b3BP
clBhcmVudCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChmcmFtZU5hbWUgPT0gIl9wYXJlbnQiKSB7
Ci0gICAgICAgIGlmIChGcmFtZSogcGFyZW50ID0gZnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpCi0g
ICAgICAgICAgICBmcmFtZSA9IHBhcmVudDsKLSAgICAgICAgaWYgKCFhY3RpdmVGcmFtZS0+bG9h
ZGVyKCktPnNob3VsZEFsbG93TmF2aWdhdGlvbihmcmFtZSkpCi0gICAgICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKLSAgICAgICAgdG9wT3JQYXJlbnQgPSB0cnVlOwotICAgIH0KLSAgICBp
ZiAodG9wT3JQYXJlbnQpIHsKLSAgICAgICAgU3RyaW5nIGNvbXBsZXRlZFVSTDsKLSAgICAgICAg
aWYgKCF1cmxTdHJpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAgY29tcGxldGVkVVJMID0gYWN0
aXZlRnJhbWUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybFN0cmluZyk7Ci0KLSAgICAgICAg
Y29uc3QgV2luZG93KiB0YXJnZXRlZFdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5kb3coZnJh
bWUpOwotICAgICAgICBpZiAoIWNvbXBsZXRlZFVSTC5pc0VtcHR5KCkgJiYgKCFjb21wbGV0ZWRV
Ukwuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkgfHwgKHRhcmdldGVkV2luZG93ICYm
IHRhcmdldGVkV2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSkpIHsKLSAgICAgICAgICAg
IGJvb2wgdXNlckdlc3R1cmUgPSBhY3RpdmVGcmFtZS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKCk7Ci0gICAgICAgICAgICBmcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxlTG9j
YXRpb25DaGFuZ2UoY29tcGxldGVkVVJMLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5n
UmVmZXJyZXIoKSwgZmFsc2UsIHVzZXJHZXN0dXJlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm4gV2luZG93OjpyZXRyaWV2ZShmcmFtZSk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGNhc2Ug
b2YgYSBuYW1lZCBmcmFtZSBvciBhIG5ldyB3aW5kb3csIHdlJ2xsIHVzZSB0aGUgY3JlYXRlV2lu
ZG93KCkgaGVscGVyCi0gICAgV2luZG93RmVhdHVyZXMgd2luZG93RmVhdHVyZXModmFsdWVUb1N0
cmluZ1dpdGhVbmRlZmluZWRPck51bGxDaGVjayhleGVjLCBhcmdzWzJdKSk7Ci0gICAgRmxvYXRS
ZWN0IHdpbmRvd1JlY3Qod2luZG93RmVhdHVyZXMueCwgd2luZG93RmVhdHVyZXMueSwgd2luZG93
RmVhdHVyZXMud2lkdGgsIHdpbmRvd0ZlYXR1cmVzLmhlaWdodCk7Ci0gICAgV2ViQ29yZTo6RE9N
V2luZG93OjphZGp1c3RXaW5kb3dSZWN0KHNjcmVlbkF2YWlsYWJsZVJlY3QocGFnZS0+bWFpbkZy
YW1lKCktPnZpZXcoKSksIHdpbmRvd1JlY3QsIHdpbmRvd1JlY3QpOwotCi0gICAgd2luZG93RmVh
dHVyZXMueCA9IHdpbmRvd1JlY3QueCgpOwotICAgIHdpbmRvd0ZlYXR1cmVzLnkgPSB3aW5kb3dS
ZWN0LnkoKTsKLSAgICB3aW5kb3dGZWF0dXJlcy5oZWlnaHQgPSB3aW5kb3dSZWN0LmhlaWdodCgp
OwotICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRoID0gd2luZG93UmVjdC53aWR0aCgpOwotCi0gICAg
ZnJhbWUgPSBjcmVhdGVXaW5kb3coZXhlYywgZnJhbWUsIHVybFN0cmluZywgZnJhbWVOYW1lLCB3
aW5kb3dGZWF0dXJlcywgMCk7Ci0KLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4ganNV
bmRlZmluZWQoKTsKLQotICAgIHJldHVybiBXaW5kb3c6OnJldHJpZXZlKGZyYW1lKTsgLy8gZ2xv
YmFsIG9iamVjdAotfQotCi1KU1ZhbHVlKiBXaW5kb3dQcm90b0Z1bmNTZXRUaW1lb3V0OjpjYWxs
QXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0
JiBhcmdzKQotewotICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJldpbmRvdzo6aW5mbykpCi0g
ICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7Ci0gICAgV2luZG93KiB3
aW5kb3cgPSBzdGF0aWNfY2FzdDxXaW5kb3cqPih0aGlzT2JqKTsKLQotICAgIEpTVmFsdWUqIHYg
PSBhcmdzWzBdOwotICAgIGlmICh2LT5pc1N0cmluZygpKQotICAgICAgICByZXR1cm4ganNOdW1i
ZXIod2luZG93LT5pbnN0YWxsVGltZW91dCh2LT50b1N0cmluZyhleGVjKSwgYXJnc1sxXS0+dG9J
bnQzMihleGVjKSwgdHJ1ZSAvKnNpbmdsZSBzaG90Ki8pKTsKLSAgICBpZiAodi0+aXNPYmplY3Qo
KSAmJiBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYpLT5pbXBsZW1lbnRzQ2FsbCgpKSB7Ci0gICAg
ICAgIExpc3QgYXJnc1RhaWw7Ci0gICAgICAgIGFyZ3MuZ2V0U2xpY2UoMiwgYXJnc1RhaWwpOwot
ICAgICAgICByZXR1cm4ganNOdW1iZXIod2luZG93LT5pbnN0YWxsVGltZW91dCh2LCBhcmdzVGFp
bCwgYXJnc1sxXS0+dG9JbnQzMihleGVjKSwgdHJ1ZSAvKnNpbmdsZSBzaG90Ki8pKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSogV2luZG93UHJvdG9G
dW5jQ2xlYXJUaW1lb3V0OjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0
KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewotICAgIC8vIEFsc28gdGhlIGltcGxlbWVu
dGF0aW9uIGZvciB3aW5kb3cuY2xlYXJJbnRlcnZhbCgpCi0KLSAgICBpZiAoIXRoaXNPYmotPmlu
aGVyaXRzKCZXaW5kb3c6OmluZm8pKQotICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBU
eXBlRXJyb3IpOwotICAgIFdpbmRvdyogd2luZG93ID0gc3RhdGljX2Nhc3Q8V2luZG93Kj4odGhp
c09iaik7Ci0KLSAgICB3aW5kb3ctPmNsZWFyVGltZW91dChhcmdzWzBdLT50b0ludDMyKGV4ZWMp
KTsKLSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSogV2luZG93UHJvdG9G
dW5jU2V0SW50ZXJ2YWw6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3Qq
IHRoaXNPYmosIGNvbnN0IExpc3QmIGFyZ3MpCi17Ci0gICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0
cygmV2luZG93OjppbmZvKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVy
cm9yKTsKLSAgICBXaW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmop
OwotCi0gICAgaWYgKGFyZ3Muc2l6ZSgpID49IDIpIHsKLSAgICAgICAgSlNWYWx1ZSogdiA9IGFy
Z3NbMF07Ci0gICAgICAgIGludCBkZWxheSA9IGFyZ3NbMV0tPnRvSW50MzIoZXhlYyk7Ci0gICAg
ICAgIGlmICh2LT5pc1N0cmluZygpKQotICAgICAgICAgICAgcmV0dXJuIGpzTnVtYmVyKHdpbmRv
dy0+aW5zdGFsbFRpbWVvdXQodi0+dG9TdHJpbmcoZXhlYyksIGRlbGF5LCBmYWxzZSkpOwotICAg
ICAgICBpZiAodi0+aXNPYmplY3QoKSAmJiBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHYpLT5pbXBs
ZW1lbnRzQ2FsbCgpKSB7Ci0gICAgICAgICAgICBMaXN0IGFyZ3NUYWlsOwotICAgICAgICAgICAg
YXJncy5nZXRTbGljZSgyLCBhcmdzVGFpbCk7Ci0gICAgICAgICAgICByZXR1cm4ganNOdW1iZXIo
d2luZG93LT5pbnN0YWxsVGltZW91dCh2LCBhcmdzVGFpbCwgZGVsYXksIGZhbHNlKSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotfQotCi1KU1ZhbHVl
KiBXaW5kb3dQcm90b0Z1bmNBZGRFdmVudExpc3RlbmVyOjpjYWxsQXNGdW5jdGlvbihFeGVjU3Rh
dGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewotICAgIGlm
ICghdGhpc09iai0+aW5oZXJpdHMoJldpbmRvdzo6aW5mbykpCi0gICAgICAgIHJldHVybiB0aHJv
d0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7Ci0gICAgV2luZG93KiB3aW5kb3cgPSBzdGF0aWNfY2Fz
dDxXaW5kb3cqPih0aGlzT2JqKTsKLSAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3ctPmltcGwoKS0+
ZnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsK
LQotICAgIGlmIChKU0V2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gd2luZG93LT5maW5kT3JDcmVh
dGVKU0V2ZW50TGlzdGVuZXIoYXJnc1sxXSkpIHsKLSAgICAgICAgaWYgKERvY3VtZW50KiBkb2Mg
PSBmcmFtZS0+ZG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGRvYy0+YWRkV2luZG93RXZlbnRMaXN0
ZW5lcihBdG9taWNTdHJpbmcoYXJnc1swXS0+dG9TdHJpbmcoZXhlYykpLCBsaXN0ZW5lciwgYXJn
c1syXS0+dG9Cb29sZWFuKGV4ZWMpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKLX0KLQotSlNWYWx1ZSogV2luZG93UHJvdG9GdW5jUmVtb3ZlRXZlbnRMaXN0ZW5lcjo6Y2Fs
bEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlz
dCYgYXJncykKLXsKLSAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQot
ICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOwotICAgIFdpbmRvdyog
d2luZG93ID0gc3RhdGljX2Nhc3Q8V2luZG93Kj4odGhpc09iaik7Ci0gICAgRnJhbWUqIGZyYW1l
ID0gd2luZG93LT5pbXBsKCktPmZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0
dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAgICBpZiAoSlNFdmVudExpc3RlbmVyKiBsaXN0ZW5lciA9
IHdpbmRvdy0+ZmluZEpTRXZlbnRMaXN0ZW5lcihhcmdzWzFdKSkgewotICAgICAgICBpZiAoRG9j
dW1lbnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgpKQotICAgICAgICAgICAgZG9jLT5yZW1vdmVX
aW5kb3dFdmVudExpc3RlbmVyKEF0b21pY1N0cmluZyhhcmdzWzBdLT50b1N0cmluZyhleGVjKSks
IGxpc3RlbmVyLCBhcmdzWzJdLT50b0Jvb2xlYW4oZXhlYykpOwotICAgIH0KLQotICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOwotfQotCi1KU1ZhbHVlKiBXaW5kb3dQcm90b0Z1bmNTaG93TW9kYWxE
aWFsb2c6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmos
IGNvbnN0IExpc3QmIGFyZ3MpCi17Ci0gICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmV2luZG93
OjppbmZvKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAg
ICBXaW5kb3cqIHdpbmRvdyA9IHN0YXRpY19jYXN0PFdpbmRvdyo+KHRoaXNPYmopOwotICAgIEZy
YW1lKiBmcmFtZSA9IHdpbmRvdy0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0g
ICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgcmV0dXJuIHNob3dNb2RhbERpYWxv
ZyhleGVjLCBmcmFtZSwgdmFsdWVUb1N0cmluZ1dpdGhVbmRlZmluZWRPck51bGxDaGVjayhleGVj
LCBhcmdzWzBdKSwgYXJnc1sxXSwgdmFsdWVUb1N0cmluZ1dpdGhVbmRlZmluZWRPck51bGxDaGVj
ayhleGVjLCBhcmdzWzJdKSk7Ci19CisjaW5jbHVkZSAia2pzX3dpbmRvdy5oIgogCi1KU1ZhbHVl
KiBXaW5kb3dQcm90b0Z1bmNOb3RJbXBsZW1lbnRlZDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRl
KiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKLXsKLSAgICBpZiAo
IXRoaXNPYmotPmluaGVyaXRzKCZXaW5kb3c6OmluZm8pKQotICAgICAgICByZXR1cm4gdGhyb3dF
cnJvcihleGVjLCBUeXBlRXJyb3IpOwordXNpbmcgbmFtZXNwYWNlIEtKUzsKIAotICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOwotfQorbmFtZXNwYWNlIFdlYkNvcmUgewogCi12b2lkIFdpbmRvdzo6
c2V0UmV0dXJuVmFsdWVTbG90KEpTVmFsdWUqKiBzbG90KQorU2NoZWR1bGVkQWN0aW9uOjpTY2hl
ZHVsZWRBY3Rpb24oSlNWYWx1ZSogZnVuYywgY29uc3QgTGlzdCYgYXJncykKKyAgICA6IG1fZnVu
YyhmdW5jKQogewotICAgIGQtPm1fcmV0dXJuVmFsdWVTbG90ID0gc2xvdDsKKyAgICBMaXN0Ojpj
b25zdF9pdGVyYXRvciBlbmQgPSBhcmdzLmVuZCgpOworICAgIGZvciAoTGlzdDo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBhcmdzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgbV9hcmdz
LmFwcGVuZCgqaXQpOwogfQogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFNjaGVkdWxlZEFjdGlv
biAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogdm9pZCBTY2hlZHVsZWRBY3Rpb246OmV4ZWN1
dGUoV2luZG93KiB3aW5kb3cpCiB7CkBAIC0xMjI2LDkgKzY3LDggQEAgdm9pZCBTY2hlZHVsZWRB
Y3Rpb246OmV4ZWN1dGUoV2luZG93KiB3aQogCiAgICAgICAgICAgICBMaXN0IGFyZ3M7CiAgICAg
ICAgICAgICBzaXplX3Qgc2l6ZSA9IG1fYXJncy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBzaXplOyArK2kpCiAgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQobV9hcmdzW2ld
KTsKLSAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5zdGFydFRpbWVv
dXRDaGVjaygpOwogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihmdW5jKS0+Y2Fs
bChleGVjLCB3aW5kb3csIGFyZ3MpOwpAQCAtMTI1OCw0MjMgKzk4LDQgQEAgdm9pZCBTY2hlZHVs
ZWRBY3Rpb246OmV4ZWN1dGUoV2luZG93KiB3aQogICAgIHNjcmlwdFByb3h5LT5zZXRQcm9jZXNz
aW5nVGltZXJDYWxsYmFjayhmYWxzZSk7CiB9CiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdGlt
ZW91dHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXZvaWQgV2luZG93OjpjbGVhckFsbFRp
bWVvdXRzKCkKLXsKLSAgICBkZWxldGVBbGxWYWx1ZXMoZC0+bV90aW1lb3V0cyk7Ci0gICAgZC0+
bV90aW1lb3V0cy5jbGVhcigpOwotfQotCi1pbnQgV2luZG93OjppbnN0YWxsVGltZW91dChTY2hl
ZHVsZWRBY3Rpb24qIGEsIGludCB0LCBib29sIHNpbmdsZVNob3QpCi17Ci0gICAgaW50IHRpbWVv
dXRJZCA9ICsrbGFzdFVzZWRUaW1lb3V0SWQ7Ci0KLSAgICAvLyBhdm9pZCB3cmFwYXJvdW5kIGdv
aW5nIG5lZ2F0aXZlIG9uIHVzCi0gICAgaWYgKHRpbWVvdXRJZCA8PSAwKQotICAgICAgICB0aW1l
b3V0SWQgPSAxOwotCi0gICAgaW50IG5lc3RMZXZlbCA9IHRpbWVyTmVzdGluZ0xldmVsICsgMTsK
LSAgICBET01XaW5kb3dUaW1lciogdGltZXIgPSBuZXcgRE9NV2luZG93VGltZXIodGltZW91dElk
LCBuZXN0TGV2ZWwsIHRoaXMsIGEpOwotICAgIEFTU0VSVCghZC0+bV90aW1lb3V0cy5nZXQodGlt
ZW91dElkKSk7Ci0gICAgZC0+bV90aW1lb3V0cy5zZXQodGltZW91dElkLCB0aW1lcik7Ci0gICAg
Ly8gVXNlIGEgbWluaW11bSBpbnRlcnZhbCBvZiAxMCBtcyB0byBtYXRjaCBvdGhlciBicm93c2Vy
cywgYnV0IG9ubHkgb25jZSB3ZSd2ZQotICAgIC8vIG5lc3RlZCBlbm91Z2ggdG8gbm90aWNlIHRo
YXQgd2UncmUgcmVwZWF0aW5nLgotICAgIC8vIEZhc3RlciB0aW1lcnMgbWlnaHQgYmUgImJldHRl
ciIsIGJ1dCB0aGV5J3JlIGluY29tcGF0aWJsZS4KLSAgICBkb3VibGUgaW50ZXJ2YWwgPSBtYXgo
MC4wMDEsIHQgKiAwLjAwMSk7Ci0gICAgaWYgKGludGVydmFsIDwgY01pbmltdW1UaW1lckludGVy
dmFsICYmIG5lc3RMZXZlbCA+PSBjTWF4VGltZXJOZXN0aW5nTGV2ZWwpCi0gICAgICAgIGludGVy
dmFsID0gY01pbmltdW1UaW1lckludGVydmFsOwotICAgIGlmIChzaW5nbGVTaG90KQotICAgICAg
ICB0aW1lci0+c3RhcnRPbmVTaG90KGludGVydmFsKTsKLSAgICBlbHNlCi0gICAgICAgIHRpbWVy
LT5zdGFydFJlcGVhdGluZyhpbnRlcnZhbCk7Ci0gICAgcmV0dXJuIHRpbWVvdXRJZDsKLX0KLQot
U2NoZWR1bGVkQWN0aW9uOjpTY2hlZHVsZWRBY3Rpb24oSlNWYWx1ZSogZnVuYywgY29uc3QgTGlz
dCYgYXJncykKLSAgICA6IG1fZnVuYyhmdW5jKQotewotICAgIExpc3Q6OmNvbnN0X2l0ZXJhdG9y
IGVuZCA9IGFyZ3MuZW5kKCk7Ci0gICAgZm9yIChMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFy
Z3MuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICBtX2FyZ3MuYXBwZW5kKCppdCk7
Ci19Ci0KLWludCBXaW5kb3c6Omluc3RhbGxUaW1lb3V0KGNvbnN0IFVTdHJpbmcmIGhhbmRsZXIs
IGludCB0LCBib29sIHNpbmdsZVNob3QpCi17Ci0gICAgcmV0dXJuIGluc3RhbGxUaW1lb3V0KG5l
dyBTY2hlZHVsZWRBY3Rpb24oaGFuZGxlciksIHQsIHNpbmdsZVNob3QpOwotfQotCi1pbnQgV2lu
ZG93OjppbnN0YWxsVGltZW91dChKU1ZhbHVlKiBmdW5jLCBjb25zdCBMaXN0JiBhcmdzLCBpbnQg
dCwgYm9vbCBzaW5nbGVTaG90KQotewotICAgIHJldHVybiBpbnN0YWxsVGltZW91dChuZXcgU2No
ZWR1bGVkQWN0aW9uKGZ1bmMsIGFyZ3MpLCB0LCBzaW5nbGVTaG90KTsKLX0KLQotV2ViQ29yZTo6
UGF1c2VkVGltZW91dHMqIFdpbmRvdzo6cGF1c2VUaW1lb3V0cygpCi17Ci0gICAgc2l6ZV90IGNv
dW50ID0gZC0+bV90aW1lb3V0cy5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID09IDApCi0gICAgICAg
IHJldHVybiAwOwotCi0gICAgUGF1c2VkVGltZW91dCogdCA9IG5ldyBQYXVzZWRUaW1lb3V0IFtj
b3VudF07Ci0gICAgUGF1c2VkVGltZW91dHMqIHJlc3VsdCA9IG5ldyBQYXVzZWRUaW1lb3V0cyh0
LCBjb3VudCk7Ci0KLSAgICBXaW5kb3dQcml2YXRlOjpUaW1lb3V0c01hcDo6aXRlcmF0b3IgaXQg
PSBkLT5tX3RpbWVvdXRzLmJlZ2luKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291
bnQ7ICsraSwgKytpdCkgewotICAgICAgICBpbnQgdGltZW91dElkID0gaXQtPmZpcnN0OwotICAg
ICAgICBET01XaW5kb3dUaW1lciogdGltZXIgPSBpdC0+c2Vjb25kOwotICAgICAgICB0W2ldLnRp
bWVvdXRJZCA9IHRpbWVvdXRJZDsKLSAgICAgICAgdFtpXS5uZXN0aW5nTGV2ZWwgPSB0aW1lci0+
bmVzdGluZ0xldmVsKCk7Ci0gICAgICAgIHRbaV0ubmV4dEZpcmVJbnRlcnZhbCA9IHRpbWVyLT5u
ZXh0RmlyZUludGVydmFsKCk7Ci0gICAgICAgIHRbaV0ucmVwZWF0SW50ZXJ2YWwgPSB0aW1lci0+
cmVwZWF0SW50ZXJ2YWwoKTsKLSAgICAgICAgdFtpXS5hY3Rpb24gPSB0aW1lci0+dGFrZUFjdGlv
bigpOwotICAgIH0KLSAgICBBU1NFUlQoaXQgPT0gZC0+bV90aW1lb3V0cy5lbmQoKSk7Ci0KLSAg
ICBkZWxldGVBbGxWYWx1ZXMoZC0+bV90aW1lb3V0cyk7Ci0gICAgZC0+bV90aW1lb3V0cy5jbGVh
cigpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBXaW5kb3c6OnJlc3VtZVRpbWVv
dXRzKFBhdXNlZFRpbWVvdXRzKiB0aW1lb3V0cykKLXsKLSAgICBpZiAoIXRpbWVvdXRzKQotICAg
ICAgICByZXR1cm47Ci0gICAgc2l6ZV90IGNvdW50ID0gdGltZW91dHMtPm51bVRpbWVvdXRzKCk7
Ci0gICAgUGF1c2VkVGltZW91dCogYXJyYXkgPSB0aW1lb3V0cy0+dGFrZVRpbWVvdXRzKCk7Ci0g
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQ7ICsraSkgewotICAgICAgICBpbnQgdGlt
ZW91dElkID0gYXJyYXlbaV0udGltZW91dElkOwotICAgICAgICBET01XaW5kb3dUaW1lciogdGlt
ZXIgPSBuZXcgRE9NV2luZG93VGltZXIodGltZW91dElkLCBhcnJheVtpXS5uZXN0aW5nTGV2ZWws
IHRoaXMsIGFycmF5W2ldLmFjdGlvbik7Ci0gICAgICAgIGQtPm1fdGltZW91dHMuc2V0KHRpbWVv
dXRJZCwgdGltZXIpOwotICAgICAgICB0aW1lci0+c3RhcnQoYXJyYXlbaV0ubmV4dEZpcmVJbnRl
cnZhbCwgYXJyYXlbaV0ucmVwZWF0SW50ZXJ2YWwpOwotICAgIH0KLSAgICBkZWxldGUgW10gYXJy
YXk7Ci19Ci0KLXZvaWQgV2luZG93OjpjbGVhclRpbWVvdXQoaW50IHRpbWVvdXRJZCwgYm9vbCBk
ZWxBY3Rpb24pCi17Ci0gICAgLy8gdGltZW91dCBJRHMgaGF2ZSB0byBiZSBwb3NpdGl2ZSwgYW5k
IDAgYW5kIC0xIGFyZSB1bnNhZmUgdG8KLSAgICAvLyBldmVuIGxvb2sgdXAgc2luY2UgdGhleSBh
cmUgdGhlIGVtcHR5IGFuZCBkZWxldGVkIHZhbHVlCi0gICAgLy8gcmVzcGVjdGl2ZWx5Ci0gICAg
aWYgKHRpbWVvdXRJZCA8PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBkZWxldGUgZC0+bV90
aW1lb3V0cy50YWtlKHRpbWVvdXRJZCk7Ci19Ci0KLXZvaWQgV2luZG93Ojp0aW1lckZpcmVkKERP
TVdpbmRvd1RpbWVyKiB0aW1lcikKLXsKLSAgICAvLyBTaW1wbGUgY2FzZSBmb3Igbm9uLW9uZS1z
aG90IHRpbWVycy4KLSAgICBpZiAodGltZXItPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgaW50IHRp
bWVvdXRJZCA9IHRpbWVyLT50aW1lb3V0SWQoKTsKLQotICAgICAgICB0aW1lci0+YWN0aW9uKCkt
PmV4ZWN1dGUodGhpcyk7Ci0gICAgICAgIGlmIChkLT5tX3RpbWVvdXRzLmNvbnRhaW5zKHRpbWVv
dXRJZCkgJiYgdGltZXItPnJlcGVhdEludGVydmFsKCkgJiYgdGltZXItPnJlcGVhdEludGVydmFs
KCkgPCBjTWluaW11bVRpbWVySW50ZXJ2YWwpIHsKLSAgICAgICAgICAgIHRpbWVyLT5zZXROZXN0
aW5nTGV2ZWwodGltZXItPm5lc3RpbmdMZXZlbCgpICsgMSk7Ci0gICAgICAgICAgICBpZiAodGlt
ZXItPm5lc3RpbmdMZXZlbCgpID49IGNNYXhUaW1lck5lc3RpbmdMZXZlbCkKLSAgICAgICAgICAg
ICAgICB0aW1lci0+YXVnbWVudFJlcGVhdEludGVydmFsKGNNaW5pbXVtVGltZXJJbnRlcnZhbCAt
IHRpbWVyLT5yZXBlYXRJbnRlcnZhbCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgLy8gRGVsZXRlIHRpbWVyIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbiBm
b3Igb25lLXNob3QgdGltZXJzLgotICAgIFNjaGVkdWxlZEFjdGlvbiogYWN0aW9uID0gdGltZXIt
PnRha2VBY3Rpb24oKTsKLSAgICBkLT5tX3RpbWVvdXRzLnJlbW92ZSh0aW1lci0+dGltZW91dElk
KCkpOwotICAgIGRlbGV0ZSB0aW1lcjsKLSAgICBhY3Rpb24tPmV4ZWN1dGUodGhpcyk7Ci0KLSAg
ICBKU0xvY2sgbG9jazsKLSAgICBkZWxldGUgYWN0aW9uOwotfQotCi12b2lkIFdpbmRvdzo6ZGlz
Y29ubmVjdEZyYW1lKCkKLXsKLSAgICBjbGVhckFsbFRpbWVvdXRzKCk7Ci0gICAgaWYgKGQtPmxv
YykKLSAgICAgICAgZC0+bG9jLT5tX2ZyYW1lID0gMDsKLX0KLQotV2luZG93OjpMaXN0ZW5lcnNN
YXAmIFdpbmRvdzo6anNFdmVudExpc3RlbmVycygpCi17Ci0gICAgcmV0dXJuIGQtPmpzRXZlbnRM
aXN0ZW5lcnM7Ci19Ci0KLVdpbmRvdzo6TGlzdGVuZXJzTWFwJiBXaW5kb3c6OmpzSFRNTEV2ZW50
TGlzdGVuZXJzKCkKLXsKLSAgICByZXR1cm4gZC0+anNIVE1MRXZlbnRMaXN0ZW5lcnM7Ci19Ci0K
LVdpbmRvdzo6VW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAmIFdpbmRvdzo6anNVbnByb3RlY3RlZEV2
ZW50TGlzdGVuZXJzKCkKLXsKLSAgICByZXR1cm4gZC0+anNVbnByb3RlY3RlZEV2ZW50TGlzdGVu
ZXJzOwotfQotCi1XaW5kb3c6OlVucHJvdGVjdGVkTGlzdGVuZXJzTWFwJiBXaW5kb3c6OmpzVW5w
cm90ZWN0ZWRIVE1MRXZlbnRMaXN0ZW5lcnMoKQotewotICAgIHJldHVybiBkLT5qc1VucHJvdGVj
dGVkSFRNTEV2ZW50TGlzdGVuZXJzOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIExvY2F0
aW9uIE9iamVjdCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotY29uc3QgQ2xhc3NJbmZvIExv
Y2F0aW9uOjppbmZvID0geyAiTG9jYXRpb24iLCAwLCAmTG9jYXRpb25UYWJsZSB9OwotLyoKLUBi
ZWdpbiBMb2NhdGlvblRhYmxlIDEyCi0gIGFzc2lnbiAgICAgICAgJkxvY2F0aW9uUHJvdG9GdW5j
QXNzaWduOjpjcmVhdGUgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQotICBoYXNoICAgICAg
ICAgIExvY2F0aW9uOjpIYXNoICAgICAgICAgICAgICAgICAgICAgICAgICBEb250RGVsZXRlCi0g
IGhvc3QgICAgICAgICAgTG9jYXRpb246Okhvc3QgICAgICAgICAgICAgICAgICAgICAgICAgIERv
bnREZWxldGUKLSAgaG9zdG5hbWUgICAgICBMb2NhdGlvbjo6SG9zdG5hbWUgICAgICAgICAgICAg
ICAgICAgICAgRG9udERlbGV0ZQotICBocmVmICAgICAgICAgIExvY2F0aW9uOjpIcmVmICAgICAg
ICAgICAgICAgICAgICAgICAgICBEb250RGVsZXRlCi0gIHBhdGhuYW1lICAgICAgTG9jYXRpb246
OlBhdGhuYW1lICAgICAgICAgICAgICAgICAgICAgIERvbnREZWxldGUKLSAgcG9ydCAgICAgICAg
ICBMb2NhdGlvbjo6UG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgRG9udERlbGV0ZQotICBw
cm90b2NvbCAgICAgIExvY2F0aW9uOjpQcm90b2NvbCAgICAgICAgICAgICAgICAgICAgICBEb250
RGVsZXRlCi0gIHNlYXJjaCAgICAgICAgTG9jYXRpb246OlNlYXJjaCAgICAgICAgICAgICAgICAg
ICAgICAgIERvbnREZWxldGUKLSAgdG9TdHJpbmcgICAgICAmTG9jYXRpb25Qcm90b0Z1bmNUb1N0
cmluZzo6Y3JlYXRlICAgICAgRG9udEVudW18RG9udERlbGV0ZXxGdW5jdGlvbiAwCi0gIHJlcGxh
Y2UgICAgICAgJkxvY2F0aW9uUHJvdG9GdW5jUmVwbGFjZTo6Y3JlYXRlICAgICAgIERvbnREZWxl
dGV8RnVuY3Rpb24gMQotICByZWxvYWQgICAgICAgICZMb2NhdGlvblByb3RvRnVuY1JlbG9hZDo6
Y3JlYXRlICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDAKLUBlbmQKLSovCi0KLUxvY2F0aW9u
OjpMb2NhdGlvbihGcmFtZSogZnJhbWUpCi0gICAgOiBtX2ZyYW1lKGZyYW1lKQotewotfQotCi1K
U1ZhbHVlICpMb2NhdGlvbjo6Z2V0VmFsdWVQcm9wZXJ0eShFeGVjU3RhdGUqIGV4ZWMsIGludCB0
b2tlbikgY29uc3QKLXsKLSAgS1VSTCB1cmwgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+dXJsKCk7Ci0g
IHN3aXRjaCAodG9rZW4pIHsKLSAgY2FzZSBIYXNoOgotICAgIHJldHVybiBqc1N0cmluZyh1cmwu
cmVmKCkuaXNOdWxsKCkgPyAiIiA6ICIjIiArIHVybC5yZWYoKSk7Ci0gIGNhc2UgSG9zdDogewot
ICAgIC8vIE5vdGU6IHRoaXMgaXMgdGhlIElFIHNwZWMuIFRoZSBOUyBzcGVjIHN3YXBzIHRoZSB0
d28sIGl0IHNheXMKLSAgICAvLyAiVGhlIGhvc3RuYW1lIHByb3BlcnR5IGlzIHRoZSBjb25jYXRl
bmF0aW9uIG9mIHRoZSBob3N0IGFuZCBwb3J0IHByb3BlcnRpZXMsIHNlcGFyYXRlZCBieSBhIGNv
bG9uLiIKLSAgICAvLyBCbGVoLgotICAgIFVTdHJpbmcgc3RyID0gdXJsLmhvc3QoKTsKLSAgICBp
ZiAodXJsLnBvcnQoKSkKLSAgICAgICAgc3RyICs9ICI6IiArIFN0cmluZzo6bnVtYmVyKChpbnQp
dXJsLnBvcnQoKSk7Ci0gICAgcmV0dXJuIGpzU3RyaW5nKHN0cik7Ci0gIH0KLSAgY2FzZSBIb3N0
bmFtZToKLSAgICByZXR1cm4ganNTdHJpbmcodXJsLmhvc3QoKSk7Ci0gIGNhc2UgSHJlZjoKLSAg
ICBpZiAoIXVybC5oYXNQYXRoKCkpCi0gICAgICByZXR1cm4ganNTdHJpbmcodXJsLnByZXR0eVVS
TCgpICsgIi8iKTsKLSAgICByZXR1cm4ganNTdHJpbmcodXJsLnByZXR0eVVSTCgpKTsKLSAgY2Fz
ZSBQYXRobmFtZToKLSAgICByZXR1cm4ganNTdHJpbmcodXJsLnBhdGgoKS5pc0VtcHR5KCkgPyAi
LyIgOiB1cmwucGF0aCgpKTsKLSAgY2FzZSBQb3J0OgotICAgIHJldHVybiBqc1N0cmluZyh1cmwu
cG9ydCgpID8gU3RyaW5nOjpudW1iZXIoKGludCl1cmwucG9ydCgpKSA6ICIiKTsKLSAgY2FzZSBQ
cm90b2NvbDoKLSAgICByZXR1cm4ganNTdHJpbmcodXJsLnByb3RvY29sKCkgKyAiOiIpOwotICBj
YXNlIFNlYXJjaDoKLSAgICByZXR1cm4ganNTdHJpbmcodXJsLnF1ZXJ5KCkpOwotICBkZWZhdWx0
OgotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwot
ICB9Ci19Ci0KLWJvb2wgTG9jYXRpb246OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4
ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQot
ewotICBpZiAoIW1fZnJhbWUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IFdpbmRvdyog
d2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdpbmRvdyhtX2ZyYW1lKTsKLQotICBjb25zdCBIYXNo
RW50cnkqIGVudHJ5ID0gTG9va3VwOjpmaW5kRW50cnkoJkxvY2F0aW9uVGFibGUsIHByb3BlcnR5
TmFtZSk7Ci0gIGlmICghZW50cnkgfHwgIShlbnRyeS0+YXR0ciAmIEtKUzo6RnVuY3Rpb24pIHx8
IChlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9jYXRpb25Qcm90b0Z1bmNSZXBsYWNl
OjpjcmVhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICYmIGVudHJ5LT52YWx1ZS5mdW5jdGlvblZhbHVlICE9ICZMb2NhdGlvblByb3RvRnVuY1Jl
bG9hZDo6Y3JlYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmJiBlbnRyeS0+dmFsdWUuZnVuY3Rpb25WYWx1ZSAhPSAmTG9jYXRpb25Qcm90b0Z1
bmNBc3NpZ246OmNyZWF0ZSkpICB7Ci0gICAgaWYgKCF3aW5kb3cgfHwgIXdpbmRvdy0+YWxsb3dz
QWNjZXNzRnJvbShleGVjKSkgewotICAgICAgc2xvdC5zZXRVbmRlZmluZWQodGhpcyk7Ci0gICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZ2V0U3RhdGljUHJvcGVydHlT
bG90PExvY2F0aW9uLCBKU09iamVjdD4oZXhlYywgJkxvY2F0aW9uVGFibGUsIHRoaXMsIHByb3Bl
cnR5TmFtZSwgc2xvdCk7Ci19Ci0KLXZvaWQgTG9jYXRpb246OnB1dChFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSogdmFsdWUsIGludCBhdHRy
KQotewotICBpZiAoIW1fZnJhbWUpCi0gICAgcmV0dXJuOwotCi0gIERlcHJlY2F0ZWRTdHJpbmcg
c3RyID0gdmFsdWUtPnRvU3RyaW5nKGV4ZWMpOwotICBLVVJMIHVybCA9IG1fZnJhbWUtPmxvYWRl
cigpLT51cmwoKTsKLSAgY29uc3QgV2luZG93KiB3aW5kb3cgPSBXaW5kb3c6OnJldHJpZXZlV2lu
ZG93KG1fZnJhbWUpOwotICBib29sIHNhbWVEb21haW5BY2Nlc3MgPSB3aW5kb3cgJiYgd2luZG93
LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpOwotCi0gIGNvbnN0IEhhc2hFbnRyeSogZW50cnkgPSBM
b29rdXA6OmZpbmRFbnRyeSgmTG9jYXRpb25UYWJsZSwgcHJvcGVydHlOYW1lKTsKLQotICBpZiAo
ZW50cnkpIHsKLSAgICAgIC8vIGNyb3NzLWRvbWFpbiBhY2Nlc3MgdG8gdGhlIGxvY2F0aW9uIGlz
IGFsbG93ZWQgd2hlbiBhc3NpZ25pbmcgdGhlIHdob2xlIGxvY2F0aW9uLAotICAgICAgLy8gYnV0
IG5vdCB3aGVuIGFzc2lnbmluZyB0aGUgaW5kaXZpZHVhbCBwaWVjZXMsIHNpbmNlIHRoYXQgbWln
aHQgaW5hZHZlcnRlbnRseQotICAgICAgLy8gZGlzY2xvc2Ugb3RoZXIgcGFydHMgb2YgdGhlIG9y
aWdpbmFsIGxvY2F0aW9uLgotICAgICAgaWYgKGVudHJ5LT52YWx1ZS5pbnRWYWx1ZSAhPSBIcmVm
ICYmICFzYW1lRG9tYWluQWNjZXNzKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgc3dpdGNo
IChlbnRyeS0+dmFsdWUuaW50VmFsdWUpIHsKLSAgICAgIGNhc2UgSHJlZjogewotICAgICAgICAg
IEZyYW1lKiBmcmFtZSA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwoKS0+ZnJh
bWUoKTsKLSAgICAgICAgICBpZiAoIWZyYW1lKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgICAgaWYgKCFmcmFtZS0+bG9hZGVyKCktPnNob3VsZEFsbG93TmF2aWdhdGlvbihtX2ZyYW1l
KSkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIHVybCA9IGZyYW1lLT5sb2FkZXIo
KS0+Y29tcGxldGVVUkwoc3RyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNh
c2UgSGFzaDogewotICAgICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aCgiIyIpKQotICAgICAgICAg
ICAgICBzdHIgPSBzdHIubWlkKDEpOwotICAgICAgICAgIGlmICh1cmwucmVmKCkgPT0gc3RyKQot
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgdXJsLnNldFJlZihzdHIpOwotICAgICAg
ICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBIb3N0OiB7Ci0gICAgICAgICAgdXJsLnNl
dEhvc3RBbmRQb3J0KHN0cik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNl
IEhvc3RuYW1lOgotICAgICAgICAgIHVybC5zZXRIb3N0KHN0cik7Ci0gICAgICAgICAgYnJlYWs7
Ci0gICAgICBjYXNlIFBhdGhuYW1lOgotICAgICAgICAgIHVybC5zZXRQYXRoKHN0cik7Ci0gICAg
ICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBvcnQ6Ci0gICAgICAgICAgdXJsLnNldFBvcnQoc3Ry
LnRvVUludCgpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUHJvdG9jb2w6Ci0gICAg
ICAgICAgdXJsLnNldFByb3RvY29sKHN0cik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNl
IFNlYXJjaDoKLSAgICAgICAgICB1cmwuc2V0UXVlcnkoc3RyKTsKLSAgICAgICAgICBicmVhazsK
LSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLy8gRGlzYWxsb3cgY2hhbmdpbmcgb3RoZXIgcHJv
cGVydGllcyBpbiBMb2NhdGlvblRhYmxlLiBlLmcuLCAid2luZG93LmxvY2F0aW9uLnRvU3RyaW5n
ID0gLi4uIi4KLSAgICAgICAgICAvLyA8aHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTI3MjA+Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICB9IGVsc2UgewotICAg
ICAgaWYgKHNhbWVEb21haW5BY2Nlc3MpCi0gICAgICAgICAgSlNPYmplY3Q6OnB1dChleGVjLCBw
cm9wZXJ0eU5hbWUsIHZhbHVlLCBhdHRyKTsKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIEZyYW1l
KiBhY3RpdmVGcmFtZSA9IFdpbmRvdzo6cmV0cmlldmVBY3RpdmUoZXhlYyktPmltcGwoKS0+ZnJh
bWUoKTsKLSAgaWYgKCF1cmwuZGVwcmVjYXRlZFN0cmluZygpLnN0YXJ0c1dpdGgoImphdmFzY3Jp
cHQ6IiwgZmFsc2UpIHx8IHNhbWVEb21haW5BY2Nlc3MpIHsKLSAgICBib29sIHVzZXJHZXN0dXJl
ID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCktPnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpOwot
ICAgIG1fZnJhbWUtPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKHVybC5zdHJpbmco
KSwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2Vy
R2VzdHVyZSk7Ci0gIH0KLX0KLQotSlNWYWx1ZSogTG9jYXRpb25Qcm90b0Z1bmNSZXBsYWNlOjpj
YWxsQXNGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBM
aXN0JiBhcmdzKQotewotICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJkxvY2F0aW9uOjppbmZv
KSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBMb2Nh
dGlvbiogbG9jYXRpb24gPSBzdGF0aWNfY2FzdDxMb2NhdGlvbio+KHRoaXNPYmopOwotICAgIEZy
YW1lKiBmcmFtZSA9IGxvY2F0aW9uLT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAg
IHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgRnJhbWUqIGFjdGl2ZUZyYW1lID0gV2luZG93
OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlmIChhY3RpdmVG
cmFtZSkgewotICAgICAgICBpZiAoIWFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+c2hvdWxkQWxsb3dO
YXZpZ2F0aW9uKGZyYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotICAg
ICAgICBEZXByZWNhdGVkU3RyaW5nIHN0ciA9IGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpOwotICAg
ICAgICBjb25zdCBXaW5kb3cqIHdpbmRvdyA9IFdpbmRvdzo6cmV0cmlldmVXaW5kb3coZnJhbWUp
OwotICAgICAgICBpZiAoIXN0ci5zdGFydHNXaXRoKCJqYXZhc2NyaXB0OiIsIGZhbHNlKSB8fCAo
d2luZG93ICYmIHdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkpIHsKLSAgICAgICAgICAg
IGJvb2wgdXNlckdlc3R1cmUgPSBhY3RpdmVGcmFtZS0+c2NyaXB0UHJveHkoKS0+cHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKCk7Ci0gICAgICAgICAgICBmcmFtZS0+bG9hZGVyKCktPnNjaGVkdWxlTG9j
YXRpb25DaGFuZ2UoYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5jb21wbGV0ZVVSTChzdHIpLnN0cmlu
ZygpLCBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJyZXIoKSwgdHJ1ZSwgdXNl
ckdlc3R1cmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7
Ci19Ci0KLUpTVmFsdWUqIExvY2F0aW9uUHJvdG9GdW5jUmVsb2FkOjpjYWxsQXNGdW5jdGlvbihF
eGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0JiBhcmdzKQotewot
ICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJkxvY2F0aW9uOjppbmZvKSkKLSAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBMb2NhdGlvbiogbG9jYXRpb24g
PSBzdGF0aWNfY2FzdDxMb2NhdGlvbio+KHRoaXNPYmopOwotICAgIEZyYW1lKiBmcmFtZSA9IGxv
Y2F0aW9uLT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiBqc1VuZGVm
aW5lZCgpOwotCi0gICAgV2luZG93KiB3aW5kb3cgPSBXaW5kb3c6OnJldHJpZXZlV2luZG93KGZy
YW1lKTsKLSAgICBpZiAoIXdpbmRvdy0+YWxsb3dzQWNjZXNzRnJvbShleGVjKSkKLSAgICAgICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAgICBpZiAoIWZyYW1lLT5sb2FkZXIoKS0+dXJsKCku
ZGVwcmVjYXRlZFN0cmluZygpLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8ICh3
aW5kb3cgJiYgd2luZG93LT5hbGxvd3NBY2Nlc3NGcm9tKGV4ZWMpKSkgewotICAgICAgICBib29s
IHVzZXJHZXN0dXJlID0gV2luZG93OjpyZXRyaWV2ZUFjdGl2ZShleGVjKS0+aW1wbCgpLT5mcmFt
ZSgpLT5zY3JpcHRQcm94eSgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKTsKLSAgICAgICAgZnJh
bWUtPmxvYWRlcigpLT5zY2hlZHVsZVJlZnJlc2godXNlckdlc3R1cmUpOwotICAgIH0KLSAgICBy
ZXR1cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSogTG9jYXRpb25Qcm90b0Z1bmNBc3Np
Z246OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmosIGNv
bnN0IExpc3QmIGFyZ3MpCi17Ci0gICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmTG9jYXRpb246
OmluZm8pKQotICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOwotICAg
IExvY2F0aW9uKiBsb2NhdGlvbiA9IHN0YXRpY19jYXN0PExvY2F0aW9uKj4odGhpc09iaik7Ci0g
ICAgRnJhbWUqIGZyYW1lID0gbG9jYXRpb24tPmZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAg
ICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci0KLSAgICBGcmFtZSogYWN0aXZlRnJhbWUgPSBX
aW5kb3c6OnJldHJpZXZlQWN0aXZlKGV4ZWMpLT5pbXBsKCktPmZyYW1lKCk7Ci0gICAgaWYgKGFj
dGl2ZUZyYW1lKSB7Ci0gICAgICAgIGlmICghYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5zaG91bGRB
bGxvd05hdmlnYXRpb24oZnJhbWUpKQotICAgICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7
Ci0gICAgICAgIGNvbnN0IFdpbmRvdyogd2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdpbmRvdyhm
cmFtZSk7Ci0gICAgICAgIFN0cmluZyBkc3RVcmwgPSBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPmNv
bXBsZXRlVVJMKGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpKS5zdHJpbmcoKTsKLSAgICAgICAgaWYg
KCFkc3RVcmwuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkgfHwgKHdpbmRvdyAmJiB3
aW5kb3ctPmFsbG93c0FjY2Vzc0Zyb20oZXhlYykpKSB7Ci0gICAgICAgICAgICBib29sIHVzZXJH
ZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdFByb3h5KCktPnByb2Nlc3NpbmdVc2VyR2VzdHVy
ZSgpOwotICAgICAgICAgICAgLy8gV2Ugd2FudCBhIG5ldyBoaXN0b3J5IGl0ZW0gaWYgdGhpcyBK
UyB3YXMgY2FsbGVkIHZpYSBhIHVzZXIgZ2VzdHVyZQotICAgICAgICAgICAgZnJhbWUtPmxvYWRl
cigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKGRzdFVybCwgYWN0aXZlRnJhbWUtPmxvYWRlcigp
LT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2VyR2VzdHVyZSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSogTG9jYXRpb25Q
cm90b0Z1bmNUb1N0cmluZzo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVj
dCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJncykKLXsKLSAgICBpZiAoIXRoaXNPYmotPmluaGVy
aXRzKCZMb2NhdGlvbjo6aW5mbykpCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5
cGVFcnJvcik7Ci0gICAgTG9jYXRpb24qIGxvY2F0aW9uID0gc3RhdGljX2Nhc3Q8TG9jYXRpb24q
Pih0aGlzT2JqKTsKLSAgICBGcmFtZSogZnJhbWUgPSBsb2NhdGlvbi0+ZnJhbWUoKTsKLSAgICBp
ZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAgIGNvbnN0IEtV
UkwmIHVybCA9IGZyYW1lLT5sb2FkZXIoKS0+dXJsKCk7Ci0gICAgaWYgKCF1cmwuaGFzUGF0aCgp
KQotICAgICAgICByZXR1cm4ganNTdHJpbmcodXJsLnByZXR0eVVSTCgpICsgIi8iKTsKLSAgICBy
ZXR1cm4ganNTdHJpbmcodXJsLnByZXR0eVVSTCgpKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8KLQotdm9pZCBET01XaW5kb3dUaW1lcjo6ZmlyZWQoKQotewotICAgIHRpbWVyTmVzdGluZ0xl
dmVsID0gbV9uZXN0aW5nTGV2ZWw7Ci0gICAgbV9vYmplY3QtPnRpbWVyRmlyZWQodGhpcyk7Ci0g
ICAgdGltZXJOZXN0aW5nTGV2ZWwgPSAwOwotfQotCi19IC8vIG5hbWVzcGFjZSBLSlMKLQotdXNp
bmcgbmFtZXNwYWNlIEtKUzsKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1KU1ZhbHVlKiB0b0pT
KEV4ZWNTdGF0ZSosIERPTVdpbmRvdyogZG9tV2luZG93KQotewotICAgIGlmICghZG9tV2luZG93
KQotICAgICAgICByZXR1cm4ganNOdWxsKCk7Ci0gICAgRnJhbWUqIGZyYW1lID0gZG9tV2luZG93
LT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiBqc051bGwoKTsKLSAg
ICByZXR1cm4gV2luZG93OjpyZXRyaWV2ZShmcmFtZSk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvanMvU2NoZWR1bGVkQWN0aW9uLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9TY2hlZHVsZWRBY3Rpb24uaAkocmV2aXNpb24g
Mjg3NzkpCShmcm9tIFdlYkNvcmUvYmluZGluZ3MvanMva2pzX3dpbmRvdy5oOjI4Nzc5KQorKysg
V2ViQ29yZS9iaW5kaW5ncy9qcy9TY2hlZHVsZWRBY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDIzNyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgSGFycmkgUG9ydGVuIChw
b3J0ZW5Aa2RlLm9yZykKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYs
IDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2V2ZWQuCisgKgorICogIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj
CisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAx
ICBVU0EKKyAqLworCisjaWZuZGVmIGtqc193aW5kb3dfaAorI2RlZmluZSBranNfd2luZG93X2gK
KworI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAia2pzX2JpbmRpbmcuaCIK
KyNpbmNsdWRlIDxranMvcHJvdGVjdC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5j
bHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgQXRvbWljU3RyaW5nOworICAgIGNsYXNzIERPTVdp
bmRvdzsKKyAgICBjbGFzcyBGcmFtZTsKKyAgICBjbGFzcyBKU0V2ZW50TGlzdGVuZXI7CisgICAg
Y2xhc3MgSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXI7CisgICAgY2xhc3MgUGF1c2VkVGltZW91
dHM7Cit9CisKK25hbWVzcGFjZSBLSlMgeworCisgICAgY2xhc3MgRE9NV2luZG93VGltZXI7Cisg
ICAgY2xhc3MgTG9jYXRpb247CisgICAgY2xhc3MgU2NoZWR1bGVkQWN0aW9uOworICAgIGNsYXNz
IFdpbmRvdzsKKyAgICBjbGFzcyBXaW5kb3dGdW5jOworICAgIGNsYXNzIFdpbmRvd1ByaXZhdGU7
CisKKyAgLy8gVGhpcyBpcyB0aGUgb25seSBXZWJDb3JlIEpTIGJpbmRpbmcgd2hpY2ggZG9lcyBu
b3QgaW5oZXJpdCBmcm9tIERPTU9iamVjdAorICBjbGFzcyBXaW5kb3cgOiBwdWJsaWMgSlNHbG9i
YWxPYmplY3QgeworICAgIGZyaWVuZCBjbGFzcyBMb2NhdGlvbjsKKyAgICBmcmllbmQgY2xhc3Mg
U2NoZWR1bGVkQWN0aW9uOworICBwcm90ZWN0ZWQ6CisgICAgV2luZG93KFdlYkNvcmU6OkRPTVdp
bmRvdyopOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5XaW5kb3coKTsKKworICAgIFdlYkNv
cmU6OkRPTVdpbmRvdyogaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbC5nZXQoKTsgfQorCisg
ICAgdm9pZCBkaXNjb25uZWN0RnJhbWUoKTsKKworICAgIC8vIFJldHVybnMgYW5kIHJlZ2lzdGVy
cyBhIHdpbmRvdyBvYmplY3QuIEluIGNhc2UgdGhlcmUncyBhbHJlYWR5IGEgV2luZG93CisgICAg
Ly8gZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUgcCB0aGlzIHdpbGwgYmUgcmV0dXJuZWQgaW4gb3Jk
ZXIgdG8gaGF2ZSB1bmlxdWUKKyAgICAvLyBiaW5kaW5ncy4KKyAgICBzdGF0aWMgSlNWYWx1ZSog
cmV0cmlldmUoV2ViQ29yZTo6RnJhbWUqKTsKKworICAgIC8vIFJldHVybnMgdGhlIFdpbmRvdyBv
YmplY3QgZm9yIGEgZ2l2ZW4gSFRNTCBmcmFtZQorICAgIHN0YXRpYyBXaW5kb3cqIHJldHJpZXZl
V2luZG93KFdlYkNvcmU6OkZyYW1lKik7CisKKyAgICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0
aGUgV2luZG93IG9iamVjdCB0aGlzIGphdmFzY3JpcHQgaW50ZXJwcmV0aW5nIGluc3RhbmNlIAor
ICAgIC8vIHdhcyBjYWxsZWQgZnJvbS4KKyAgICBzdGF0aWMgV2luZG93KiByZXRyaWV2ZUFjdGl2
ZShFeGVjU3RhdGUqKTsKKworICAgIHZpcnR1YWwgdm9pZCBtYXJrKCk7CisKKyAgICB2aXJ0dWFs
IGJvb2wgZ2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXImLCBQ
cm9wZXJ0eVNsb3QmKTsKKyAgICBKU1ZhbHVlKiBnZXRWYWx1ZVByb3BlcnR5KEV4ZWNTdGF0ZSos
IGludCB0b2tlbikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHB1dChFeGVjU3RhdGUqLCBjb25z
dCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqLCBpbnQgYXR0ciA9IE5vbmUpOwor
CisgICAgaW50IGluc3RhbGxUaW1lb3V0KGNvbnN0IFVTdHJpbmcmIGhhbmRsZXIsIGludCB0LCBi
b29sIHNpbmdsZVNob3QpOworICAgIGludCBpbnN0YWxsVGltZW91dChKU1ZhbHVlKiBmdW5jdGlv
biwgY29uc3QgTGlzdCYgYXJncywgaW50IHQsIGJvb2wgc2luZ2xlU2hvdCk7CisgICAgdm9pZCBj
bGVhclRpbWVvdXQoaW50IHRpbWVySWQsIGJvb2wgZGVsQWN0aW9uID0gdHJ1ZSk7CisgICAgV2Vi
Q29yZTo6UGF1c2VkVGltZW91dHMqIHBhdXNlVGltZW91dHMoKTsKKyAgICB2b2lkIHJlc3VtZVRp
bWVvdXRzKFdlYkNvcmU6OlBhdXNlZFRpbWVvdXRzKik7CisKKyAgICB2b2lkIHRpbWVyRmlyZWQo
RE9NV2luZG93VGltZXIqKTsKKworICAgIExvY2F0aW9uKiBsb2NhdGlvbigpIGNvbnN0OworCisg
ICAgLy8gRmluZHMgYSB3cmFwcGVyIG9mIGEgSlMgRXZlbnRMaXN0ZW5lciwgcmV0dXJucyAwIGlm
IG5vIGV4aXN0aW5nIG9uZS4KKyAgICBXZWJDb3JlOjpKU0V2ZW50TGlzdGVuZXIqIGZpbmRKU0V2
ZW50TGlzdGVuZXIoSlNWYWx1ZSosIGJvb2wgaHRtbCA9IGZhbHNlKTsKKworICAgIC8vIEZpbmRz
IG9yIGNyZWF0ZXMgYSB3cmFwcGVyIG9mIGEgSlMgRXZlbnRMaXN0ZW5lci4gSlMgRXZlbnRMaXN0
ZW5lciBvYmplY3QgaXMgR0MtcHJvdGVjdGVkLgorICAgIFdlYkNvcmU6OkpTRXZlbnRMaXN0ZW5l
ciAqZmluZE9yQ3JlYXRlSlNFdmVudExpc3RlbmVyKEpTVmFsdWUqLCBib29sIGh0bWwgPSBmYWxz
ZSk7CisKKyAgICAvLyBGaW5kcyBhIHdyYXBwZXIgb2YgYSBHQy11bnByb3RlY3RlZCBKUyBFdmVu
dExpc3RlbmVyLCByZXR1cm5zIDAgaWYgbm8gZXhpc3Rpbmcgb25lLgorICAgIFdlYkNvcmU6OkpT
VW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyKiBmaW5kSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIo
SlNWYWx1ZSosIGJvb2wgaHRtbCA9IGZhbHNlKTsKKworICAgIC8vIEZpbmRzIG9yIGNyZWF0ZXMg
YSB3cmFwcGVyIG9mIGEgSlMgRXZlbnRMaXN0ZW5lci4gSlMgRXZlbnRMaXN0ZW5lciBvYmplY3Qg
aXMgKk5PVCogR0MtcHJvdGVjdGVkLgorICAgIFdlYkNvcmU6OkpTVW5wcm90ZWN0ZWRFdmVudExp
c3RlbmVyICpmaW5kT3JDcmVhdGVKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiwg
Ym9vbCBodG1sID0gZmFsc2UpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzZXRD
dXJyZW50RXZlbnQoV2ViQ29yZTo6RXZlbnQqKTsKKyAgICBXZWJDb3JlOjpFdmVudCogY3VycmVu
dEV2ZW50KCk7CisKKyAgICAvLyBTZXQgYSBwbGFjZSB0byBwdXQgYSBkaWFsb2cgcmV0dXJuIHZh
bHVlIHdoZW4gdGhlIHdpbmRvdyBpcyBjbGVhcmVkLgorICAgIHZvaWQgc2V0UmV0dXJuVmFsdWVT
bG90KEpTVmFsdWUqKiBzbG90KTsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxKU09iamVjdCosIFdl
YkNvcmU6OkpTRXZlbnRMaXN0ZW5lcio+IExpc3RlbmVyc01hcDsKKyAgICB0eXBlZGVmIEhhc2hN
YXA8SlNPYmplY3QqLCBXZWJDb3JlOjpKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lcio+IFVucHJv
dGVjdGVkTGlzdGVuZXJzTWFwOworICAgIAorICAgIExpc3RlbmVyc01hcCYganNFdmVudExpc3Rl
bmVycygpOworICAgIExpc3RlbmVyc01hcCYganNIVE1MRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICBV
bnByb3RlY3RlZExpc3RlbmVyc01hcCYganNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXJzKCk7Cisg
ICAgVW5wcm90ZWN0ZWRMaXN0ZW5lcnNNYXAmIGpzVW5wcm90ZWN0ZWRIVE1MRXZlbnRMaXN0ZW5l
cnMoKTsKKyAgICAKKyAgICB2aXJ0dWFsIGNvbnN0IENsYXNzSW5mbyogY2xhc3NJbmZvKCkgY29u
c3QgeyByZXR1cm4gJmluZm87IH0KKyAgICBzdGF0aWMgY29uc3QgQ2xhc3NJbmZvIGluZm87CisK
KyAgICB2aXJ0dWFsIEV4ZWNTdGF0ZSogZ2xvYmFsRXhlYygpOworCisgICAgdmlydHVhbCBib29s
IHNob3VsZEludGVycnVwdFNjcmlwdCgpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGFsbG93
c0FjY2Vzc0Zyb20oY29uc3QgSlNHbG9iYWxPYmplY3QqKSBjb25zdDsKKyAgICBib29sIGFsbG93
c0FjY2Vzc0Zyb20oRXhlY1N0YXRlKiBleGVjKSBjb25zdCB7IHJldHVybiBhbGxvd3NBY2Nlc3NG
cm9tKGV4ZWMtPmR5bmFtaWNHbG9iYWxPYmplY3QoKSk7IH0KKworICAgIGVudW0geworICAgICAg
ICAvLyBBdHRyaWJ1dGVzCisgICAgICAgIENyeXB0bywgRXZlbnRfLCBMb2NhdGlvbl8sIE5hdmln
YXRvcl8sCisgICAgICAgIENsaWVudEluZm9ybWF0aW9uLAorCisgICAgICAgIC8vIEV2ZW50IExp
c3RlbmVycworICAgICAgICBPbmFib3J0LCBPbmJsdXIsIE9uY2hhbmdlLCBPbmNsaWNrLAorICAg
ICAgICBPbmRibGNsaWNrLCBPbmVycm9yLCBPbmZvY3VzLCBPbmtleWRvd24sCisgICAgICAgIE9u
a2V5cHJlc3MsIE9ua2V5dXAsIE9ubG9hZCwgT25tb3VzZWRvd24sCisgICAgICAgIE9ubW91c2Vt
b3ZlLCBPbm1vdXNlb3V0LCBPbm1vdXNlb3ZlciwgT25tb3VzZXVwLAorICAgICAgICBPbldpbmRv
d01vdXNlV2hlZWwsIE9ucmVzZXQsIE9ucmVzaXplLCBPbnNjcm9sbCwKKyAgICAgICAgT25zZWFy
Y2gsIE9uc2VsZWN0LCBPbnN1Ym1pdCwgT251bmxvYWQsCisgICAgICAgIE9uYmVmb3JldW5sb2Fk
LAorCisgICAgICAgIC8vIENvbnN0cnVjdG9ycworICAgICAgICBET01FeGNlcHRpb24sIEF1ZGlv
LCBJbWFnZSwgT3B0aW9uLCBYTUxIdHRwUmVxdWVzdCwKKyAgICAgICAgWFNMVFByb2Nlc3Nvcl8K
KyAgICB9OworCisgIHByaXZhdGU6CisgICAgSlNWYWx1ZSogZ2V0TGlzdGVuZXIoRXhlY1N0YXRl
KiwgY29uc3QgV2ViQ29yZTo6QXRvbWljU3RyaW5nJiBldmVudFR5cGUpIGNvbnN0OworICAgIHZv
aWQgc2V0TGlzdGVuZXIoRXhlY1N0YXRlKiwgY29uc3QgV2ViQ29yZTo6QXRvbWljU3RyaW5nJiBl
dmVudFR5cGUsIEpTVmFsdWUqIGZ1bmMpOworCisgICAgc3RhdGljIEpTVmFsdWUqIGNoaWxkRnJh
bWVHZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwgY29uc3Qg
UHJvcGVydHlTbG90Jik7CisgICAgc3RhdGljIEpTVmFsdWUqIG5hbWVkRnJhbWVHZXR0ZXIoRXhl
Y1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwgY29uc3QgUHJvcGVydHlTbG90
Jik7CisgICAgc3RhdGljIEpTVmFsdWUqIGluZGV4R2V0dGVyKEV4ZWNTdGF0ZSosIEpTT2JqZWN0
KiwgY29uc3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYpOworICAgIHN0YXRpYyBK
U1ZhbHVlKiBuYW1lZEl0ZW1HZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVu
dGlmaWVyJiwgY29uc3QgUHJvcGVydHlTbG90Jik7CisKKyAgICB2b2lkIGNsZWFySGVscGVyT2Jq
ZWN0UHJvcGVydGllcygpOworICAgIHZvaWQgY2xlYXJBbGxUaW1lb3V0cygpOworICAgIGludCBp
bnN0YWxsVGltZW91dChTY2hlZHVsZWRBY3Rpb24qLCBpbnQgaW50ZXJ2YWwsIGJvb2wgc2luZ2xl
U2hvdCk7CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6RE9NV2luZG93PiBtX2ltcGw7CisgICAgT3du
UHRyPFdpbmRvd1ByaXZhdGU+IGQ7CisgIH07CisKKyNkZWZpbmUgRk9SX0VBQ0hfQ0xBU1MobWFj
cm8pIFwKKyAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNBVG9CKSBcCisgICAgbWFjcm8oV2luZG93
UHJvdG9GdW5jQlRvQSkgXAorICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY09wZW4pIFwKKyAgICBt
YWNybyhXaW5kb3dQcm90b0Z1bmNTZXRUaW1lb3V0KSBcCisgICAgbWFjcm8oV2luZG93UHJvdG9G
dW5jQ2xlYXJUaW1lb3V0KSBcCisgICAgbWFjcm8oV2luZG93UHJvdG9GdW5jU2V0SW50ZXJ2YWwp
IFwKKyAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNBZGRFdmVudExpc3RlbmVyKSBcCisgICAgbWFj
cm8oV2luZG93UHJvdG9GdW5jUmVtb3ZlRXZlbnRMaXN0ZW5lcikgXAorICAgIG1hY3JvKFdpbmRv
d1Byb3RvRnVuY1Nob3dNb2RhbERpYWxvZykgXAorICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY05v
dEltcGxlbWVudGVkKSBcCisKK0ZPUl9FQUNIX0NMQVNTKEtKU19JTVBMRU1FTlRfUFJPVE9UWVBF
X0ZVTkNUSU9OX1dJVEhfQ1JFQVRFKQorI3VuZGVmIEZPUl9FQUNIX0NMQVNTCisKKworICAvKioK
KyAgICogQW4gYWN0aW9uIChlaXRoZXIgZnVuY3Rpb24gb3Igc3RyaW5nKSB0byBiZSBleGVjdXRl
ZCBhZnRlciBhIHNwZWNpZmllZAorICAgKiB0aW1lIGludGVydmFsLCBlaXRoZXIgb25jZSBvciBy
ZXBlYXRlZGx5LiBVc2VkIGZvciB3aW5kb3cuc2V0VGltZW91dCgpCisgICAqIGFuZCB3aW5kb3cu
c2V0SW50ZXJ2YWwoKQorICAgKi8KKyAgICBjbGFzcyBTY2hlZHVsZWRBY3Rpb24geworICAgIHB1
YmxpYzoKKyAgICAgICAgU2NoZWR1bGVkQWN0aW9uKEpTVmFsdWUqIGZ1bmMsIGNvbnN0IExpc3Qm
IGFyZ3MpOworICAgICAgICBTY2hlZHVsZWRBY3Rpb24oY29uc3QgV2ViQ29yZTo6U3RyaW5nJiBj
b2RlKQorICAgICAgICAgICAgOiBtX2NvZGUoY29kZSkKKyAgICAgICAgeworICAgICAgICB9CisK
KyAgICAgICAgdm9pZCBleGVjdXRlKFdpbmRvdyAqKTsKKworICAgIHByaXZhdGU6CisgICAgICAg
IFByb3RlY3RlZFB0cjxKU1ZhbHVlPiBtX2Z1bmM7CisgICAgICAgIFZlY3RvcjxQcm90ZWN0ZWRQ
dHI8SlNWYWx1ZT4gPiBtX2FyZ3M7CisgICAgICAgIFdlYkNvcmU6OlN0cmluZyBtX2NvZGU7Cisg
ICAgfTsKKworICBjbGFzcyBMb2NhdGlvbiA6IHB1YmxpYyBET01PYmplY3QgeworICAgIGZyaWVu
ZCBjbGFzcyBXaW5kb3c7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0T3duUHJvcGVy
dHlTbG90KEV4ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXImLCBQcm9wZXJ0eVNsb3QmKTsKKyAg
ICBKU1ZhbHVlKiBnZXRWYWx1ZVByb3BlcnR5KEV4ZWNTdGF0ZSosIGludCB0b2tlbikgY29uc3Q7
CisgICAgdmlydHVhbCB2b2lkIHB1dChFeGVjU3RhdGUqLCBjb25zdCBJZGVudGlmaWVyJiBwcm9w
ZXJ0eU5hbWUsIEpTVmFsdWUqLCBpbnQgYXR0ciA9IE5vbmUpOworCisgICAgZW51bSB7IEhhc2gs
IEhyZWYsIEhvc3RuYW1lLCBIb3N0LCBQYXRobmFtZSwgUG9ydCwgUHJvdG9jb2wsIFNlYXJjaCwg
CisgICAgICAgICAgIFJlcGxhY2UsIFJlbG9hZCwgVG9TdHJpbmcsIEFzc2lnbiB9OworCisgICAg
V2ViQ29yZTo6RnJhbWUqIGZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9mcmFtZTsgfQorCisgICAg
dmlydHVhbCBjb25zdCBDbGFzc0luZm8qIGNsYXNzSW5mbygpIGNvbnN0IHsgcmV0dXJuICZpbmZv
OyB9CisgICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBpbmZvOworCisgIHByaXZhdGU6CisgICAg
TG9jYXRpb24oV2ViQ29yZTo6RnJhbWUqKTsKKworICAgIFdlYkNvcmU6OkZyYW1lKiBtX2ZyYW1l
OworICB9OworCisjZGVmaW5lIEZPUl9FQUNIX0NMQVNTKG1hY3JvKSBcCisgICAgbWFjcm8oTG9j
YXRpb25Qcm90b0Z1bmNBc3NpZ24pIFwKKyAgICBtYWNybyhMb2NhdGlvblByb3RvRnVuY1RvU3Ry
aW5nKSBcCisgICAgbWFjcm8oTG9jYXRpb25Qcm90b0Z1bmNSZXBsYWNlKSBcCisgICAgbWFjcm8o
TG9jYXRpb25Qcm90b0Z1bmNSZWxvYWQpIFwKKworRk9SX0VBQ0hfQ0xBU1MoS0pTX0lNUExFTUVO
VF9QUk9UT1RZUEVfRlVOQ1RJT05fV0lUSF9DUkVBVEUpCisjdW5kZWYgRk9SX0VBQ0hfQ0xBU1MK
KworfSAvLyBuYW1lc3BhY2UgS0pTCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBLSlM6OkpT
VmFsdWUqIHRvSlMoS0pTOjpFeGVjU3RhdGUqLCBET01XaW5kb3cqKTsKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIGtqc193aW5kb3dfaApJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy9qcy9TY2hlZHVsZWRBY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pz
L1NjaGVkdWxlZEFjdGlvbi5oCShyZXZpc2lvbiAyODc3OCkKKysrIFdlYkNvcmUvYmluZGluZ3Mv
anMvU2NoZWR1bGVkQWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTE3LDE2NSArMTcsMjAgQEAK
ICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogCi0jaWZuZGVmIGtqc193aW5kb3dfaAot
I2RlZmluZSBranNfd2luZG93X2gKKyNpZm5kZWYgU2NoZWR1bGVkQWN0aW9uX2gKKyNkZWZpbmUg
U2NoZWR1bGVkQWN0aW9uX2gKIAogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVk
ZSAia2pzX2JpbmRpbmcuaCIKICNpbmNsdWRlIDxranMvcHJvdGVjdC5oPgotI2luY2x1ZGUgPHd0
Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+Ci0jaW5jbHVkZSA8d3Rm
L093blB0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgY2xhc3MgQXRvbWljU3RyaW5n
OwotICAgIGNsYXNzIERPTVdpbmRvdzsKLSAgICBjbGFzcyBGcmFtZTsKLSAgICBjbGFzcyBKU0V2
ZW50TGlzdGVuZXI7Ci0gICAgY2xhc3MgSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXI7Ci0gICAg
Y2xhc3MgUGF1c2VkVGltZW91dHM7Ci19CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1l
c3BhY2UgS0pTIHsKLQotICAgIGNsYXNzIERPTVdpbmRvd1RpbWVyOwotICAgIGNsYXNzIExvY2F0
aW9uOwotICAgIGNsYXNzIFNjaGVkdWxlZEFjdGlvbjsKICAgICBjbGFzcyBXaW5kb3c7Ci0gICAg
Y2xhc3MgV2luZG93RnVuYzsKLSAgICBjbGFzcyBXaW5kb3dQcml2YXRlOwotCi0gIC8vIFRoaXMg
aXMgdGhlIG9ubHkgV2ViQ29yZSBKUyBiaW5kaW5nIHdoaWNoIGRvZXMgbm90IGluaGVyaXQgZnJv
bSBET01PYmplY3QKLSAgY2xhc3MgV2luZG93IDogcHVibGljIEpTR2xvYmFsT2JqZWN0IHsKLSAg
ICBmcmllbmQgY2xhc3MgTG9jYXRpb247Ci0gICAgZnJpZW5kIGNsYXNzIFNjaGVkdWxlZEFjdGlv
bjsKLSAgcHJvdGVjdGVkOgotICAgIFdpbmRvdyhXZWJDb3JlOjpET01XaW5kb3cqKTsKLQotICBw
dWJsaWM6Ci0gICAgdmlydHVhbCB+V2luZG93KCk7Ci0KLSAgICBXZWJDb3JlOjpET01XaW5kb3cq
IGltcGwoKSBjb25zdCB7IHJldHVybiBtX2ltcGwuZ2V0KCk7IH0KLQotICAgIHZvaWQgZGlzY29u
bmVjdEZyYW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIGFuZCByZWdpc3RlcnMgYSB3aW5kb3cgb2Jq
ZWN0LiBJbiBjYXNlIHRoZXJlJ3MgYWxyZWFkeSBhIFdpbmRvdwotICAgIC8vIGZvciB0aGUgc3Bl
Y2lmaWVkIGZyYW1lIHAgdGhpcyB3aWxsIGJlIHJldHVybmVkIGluIG9yZGVyIHRvIGhhdmUgdW5p
cXVlCi0gICAgLy8gYmluZGluZ3MuCi0gICAgc3RhdGljIEpTVmFsdWUqIHJldHJpZXZlKFdlYkNv
cmU6OkZyYW1lKik7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBXaW5kb3cgb2JqZWN0IGZvciBhIGdp
dmVuIEhUTUwgZnJhbWUKLSAgICBzdGF0aWMgV2luZG93KiByZXRyaWV2ZVdpbmRvdyhXZWJDb3Jl
OjpGcmFtZSopOwotCi0gICAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIFdpbmRvdyBvYmpl
Y3QgdGhpcyBqYXZhc2NyaXB0IGludGVycHJldGluZyBpbnN0YW5jZSAKLSAgICAvLyB3YXMgY2Fs
bGVkIGZyb20uCi0gICAgc3RhdGljIFdpbmRvdyogcmV0cmlldmVBY3RpdmUoRXhlY1N0YXRlKik7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbWFyaygpOwotCi0gICAgdmlydHVhbCBib29sIGdldE93blBy
b3BlcnR5U2xvdChFeGVjU3RhdGUqLCBjb25zdCBJZGVudGlmaWVyJiwgUHJvcGVydHlTbG90Jik7
Ci0gICAgSlNWYWx1ZSogZ2V0VmFsdWVQcm9wZXJ0eShFeGVjU3RhdGUqLCBpbnQgdG9rZW4pIGNv
bnN0OwotICAgIHZpcnR1YWwgdm9pZCBwdXQoRXhlY1N0YXRlKiwgY29uc3QgSWRlbnRpZmllciYg
cHJvcGVydHlOYW1lLCBKU1ZhbHVlKiwgaW50IGF0dHIgPSBOb25lKTsKLQotICAgIGludCBpbnN0
YWxsVGltZW91dChjb25zdCBVU3RyaW5nJiBoYW5kbGVyLCBpbnQgdCwgYm9vbCBzaW5nbGVTaG90
KTsKLSAgICBpbnQgaW5zdGFsbFRpbWVvdXQoSlNWYWx1ZSogZnVuY3Rpb24sIGNvbnN0IExpc3Qm
IGFyZ3MsIGludCB0LCBib29sIHNpbmdsZVNob3QpOwotICAgIHZvaWQgY2xlYXJUaW1lb3V0KGlu
dCB0aW1lcklkLCBib29sIGRlbEFjdGlvbiA9IHRydWUpOwotICAgIFdlYkNvcmU6OlBhdXNlZFRp
bWVvdXRzKiBwYXVzZVRpbWVvdXRzKCk7Ci0gICAgdm9pZCByZXN1bWVUaW1lb3V0cyhXZWJDb3Jl
OjpQYXVzZWRUaW1lb3V0cyopOwotCi0gICAgdm9pZCB0aW1lckZpcmVkKERPTVdpbmRvd1RpbWVy
Kik7Ci0KLSAgICBMb2NhdGlvbiogbG9jYXRpb24oKSBjb25zdDsKLQotICAgIC8vIEZpbmRzIGEg
d3JhcHBlciBvZiBhIEpTIEV2ZW50TGlzdGVuZXIsIHJldHVybnMgMCBpZiBubyBleGlzdGluZyBv
bmUuCi0gICAgV2ViQ29yZTo6SlNFdmVudExpc3RlbmVyKiBmaW5kSlNFdmVudExpc3RlbmVyKEpT
VmFsdWUqLCBib29sIGh0bWwgPSBmYWxzZSk7Ci0KLSAgICAvLyBGaW5kcyBvciBjcmVhdGVzIGEg
d3JhcHBlciBvZiBhIEpTIEV2ZW50TGlzdGVuZXIuIEpTIEV2ZW50TGlzdGVuZXIgb2JqZWN0IGlz
IEdDLXByb3RlY3RlZC4KLSAgICBXZWJDb3JlOjpKU0V2ZW50TGlzdGVuZXIgKmZpbmRPckNyZWF0
ZUpTRXZlbnRMaXN0ZW5lcihKU1ZhbHVlKiwgYm9vbCBodG1sID0gZmFsc2UpOwotCi0gICAgLy8g
RmluZHMgYSB3cmFwcGVyIG9mIGEgR0MtdW5wcm90ZWN0ZWQgSlMgRXZlbnRMaXN0ZW5lciwgcmV0
dXJucyAwIGlmIG5vIGV4aXN0aW5nIG9uZS4KLSAgICBXZWJDb3JlOjpKU1VucHJvdGVjdGVkRXZl
bnRMaXN0ZW5lciogZmluZEpTVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVyKEpTVmFsdWUqLCBib29s
IGh0bWwgPSBmYWxzZSk7Ci0KLSAgICAvLyBGaW5kcyBvciBjcmVhdGVzIGEgd3JhcHBlciBvZiBh
IEpTIEV2ZW50TGlzdGVuZXIuIEpTIEV2ZW50TGlzdGVuZXIgb2JqZWN0IGlzICpOT1QqIEdDLXBy
b3RlY3RlZC4KLSAgICBXZWJDb3JlOjpKU1VucHJvdGVjdGVkRXZlbnRMaXN0ZW5lciAqZmluZE9y
Q3JlYXRlSlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIoSlNWYWx1ZSosIGJvb2wgaHRtbCA9IGZh
bHNlKTsKLQotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIHZvaWQgc2V0Q3VycmVudEV2ZW50KFdl
YkNvcmU6OkV2ZW50Kik7Ci0gICAgV2ViQ29yZTo6RXZlbnQqIGN1cnJlbnRFdmVudCgpOwotCi0g
ICAgLy8gU2V0IGEgcGxhY2UgdG8gcHV0IGEgZGlhbG9nIHJldHVybiB2YWx1ZSB3aGVuIHRoZSB3
aW5kb3cgaXMgY2xlYXJlZC4KLSAgICB2b2lkIHNldFJldHVyblZhbHVlU2xvdChKU1ZhbHVlKiog
c2xvdCk7Ci0KLSAgICB0eXBlZGVmIEhhc2hNYXA8SlNPYmplY3QqLCBXZWJDb3JlOjpKU0V2ZW50
TGlzdGVuZXIqPiBMaXN0ZW5lcnNNYXA7Ci0gICAgdHlwZWRlZiBIYXNoTWFwPEpTT2JqZWN0Kiwg
V2ViQ29yZTo6SlNVbnByb3RlY3RlZEV2ZW50TGlzdGVuZXIqPiBVbnByb3RlY3RlZExpc3RlbmVy
c01hcDsKLSAgICAKLSAgICBMaXN0ZW5lcnNNYXAmIGpzRXZlbnRMaXN0ZW5lcnMoKTsKLSAgICBM
aXN0ZW5lcnNNYXAmIGpzSFRNTEV2ZW50TGlzdGVuZXJzKCk7Ci0gICAgVW5wcm90ZWN0ZWRMaXN0
ZW5lcnNNYXAmIGpzVW5wcm90ZWN0ZWRFdmVudExpc3RlbmVycygpOwotICAgIFVucHJvdGVjdGVk
TGlzdGVuZXJzTWFwJiBqc1VucHJvdGVjdGVkSFRNTEV2ZW50TGlzdGVuZXJzKCk7Ci0gICAgCi0g
ICAgdmlydHVhbCBjb25zdCBDbGFzc0luZm8qIGNsYXNzSW5mbygpIGNvbnN0IHsgcmV0dXJuICZp
bmZvOyB9Ci0gICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBpbmZvOwotCi0gICAgdmlydHVhbCBF
eGVjU3RhdGUqIGdsb2JhbEV4ZWMoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRJbnRlcnJ1
cHRTY3JpcHQoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBhbGxvd3NBY2Nlc3NGcm9tKGNv
bnN0IEpTR2xvYmFsT2JqZWN0KikgY29uc3Q7Ci0gICAgYm9vbCBhbGxvd3NBY2Nlc3NGcm9tKEV4
ZWNTdGF0ZSogZXhlYykgY29uc3QgeyByZXR1cm4gYWxsb3dzQWNjZXNzRnJvbShleGVjLT5keW5h
bWljR2xvYmFsT2JqZWN0KCkpOyB9Ci0KLSAgICBlbnVtIHsKLSAgICAgICAgLy8gQXR0cmlidXRl
cwotICAgICAgICBDcnlwdG8sIEV2ZW50XywgTG9jYXRpb25fLCBOYXZpZ2F0b3JfLAotICAgICAg
ICBDbGllbnRJbmZvcm1hdGlvbiwKLQotICAgICAgICAvLyBFdmVudCBMaXN0ZW5lcnMKLSAgICAg
ICAgT25hYm9ydCwgT25ibHVyLCBPbmNoYW5nZSwgT25jbGljaywKLSAgICAgICAgT25kYmxjbGlj
aywgT25lcnJvciwgT25mb2N1cywgT25rZXlkb3duLAotICAgICAgICBPbmtleXByZXNzLCBPbmtl
eXVwLCBPbmxvYWQsIE9ubW91c2Vkb3duLAotICAgICAgICBPbm1vdXNlbW92ZSwgT25tb3VzZW91
dCwgT25tb3VzZW92ZXIsIE9ubW91c2V1cCwKLSAgICAgICAgT25XaW5kb3dNb3VzZVdoZWVsLCBP
bnJlc2V0LCBPbnJlc2l6ZSwgT25zY3JvbGwsCi0gICAgICAgIE9uc2VhcmNoLCBPbnNlbGVjdCwg
T25zdWJtaXQsIE9udW5sb2FkLAotICAgICAgICBPbmJlZm9yZXVubG9hZCwKLQotICAgICAgICAv
LyBDb25zdHJ1Y3RvcnMKLSAgICAgICAgRE9NRXhjZXB0aW9uLCBBdWRpbywgSW1hZ2UsIE9wdGlv
biwgWE1MSHR0cFJlcXVlc3QsCi0gICAgICAgIFhTTFRQcm9jZXNzb3JfCi0gICAgfTsKLQotICBw
cml2YXRlOgotICAgIEpTVmFsdWUqIGdldExpc3RlbmVyKEV4ZWNTdGF0ZSosIGNvbnN0IFdlYkNv
cmU6OkF0b21pY1N0cmluZyYgZXZlbnRUeXBlKSBjb25zdDsKLSAgICB2b2lkIHNldExpc3RlbmVy
KEV4ZWNTdGF0ZSosIGNvbnN0IFdlYkNvcmU6OkF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBKU1Zh
bHVlKiBmdW5jKTsKLQotICAgIHN0YXRpYyBKU1ZhbHVlKiBjaGlsZEZyYW1lR2V0dGVyKEV4ZWNT
dGF0ZSosIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYp
OwotICAgIHN0YXRpYyBKU1ZhbHVlKiBuYW1lZEZyYW1lR2V0dGVyKEV4ZWNTdGF0ZSosIEpTT2Jq
ZWN0KiwgY29uc3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYpOwotICAgIHN0YXRp
YyBKU1ZhbHVlKiBpbmRleEdldHRlcihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50
aWZpZXImLCBjb25zdCBQcm9wZXJ0eVNsb3QmKTsKLSAgICBzdGF0aWMgSlNWYWx1ZSogbmFtZWRJ
dGVtR2V0dGVyKEV4ZWNTdGF0ZSosIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYsIGNvbnN0
IFByb3BlcnR5U2xvdCYpOwotCi0gICAgdm9pZCBjbGVhckhlbHBlck9iamVjdFByb3BlcnRpZXMo
KTsKLSAgICB2b2lkIGNsZWFyQWxsVGltZW91dHMoKTsKLSAgICBpbnQgaW5zdGFsbFRpbWVvdXQo
U2NoZWR1bGVkQWN0aW9uKiwgaW50IGludGVydmFsLCBib29sIHNpbmdsZVNob3QpOwotCi0gICAg
UmVmUHRyPFdlYkNvcmU6OkRPTVdpbmRvdz4gbV9pbXBsOwotICAgIE93blB0cjxXaW5kb3dQcml2
YXRlPiBkOwotICB9OwotCi0jZGVmaW5lIEZPUl9FQUNIX0NMQVNTKG1hY3JvKSBcCi0gICAgbWFj
cm8oV2luZG93UHJvdG9GdW5jQVRvQikgXAotICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY0JUb0Ep
IFwKLSAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNPcGVuKSBcCi0gICAgbWFjcm8oV2luZG93UHJv
dG9GdW5jU2V0VGltZW91dCkgXAotICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY0NsZWFyVGltZW91
dCkgXAotICAgIG1hY3JvKFdpbmRvd1Byb3RvRnVuY1NldEludGVydmFsKSBcCi0gICAgbWFjcm8o
V2luZG93UHJvdG9GdW5jQWRkRXZlbnRMaXN0ZW5lcikgXAotICAgIG1hY3JvKFdpbmRvd1Byb3Rv
RnVuY1JlbW92ZUV2ZW50TGlzdGVuZXIpIFwKLSAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNTaG93
TW9kYWxEaWFsb2cpIFwKLSAgICBtYWNybyhXaW5kb3dQcm90b0Z1bmNOb3RJbXBsZW1lbnRlZCkg
XAotCi1GT1JfRUFDSF9DTEFTUyhLSlNfSU1QTEVNRU5UX1BST1RPVFlQRV9GVU5DVElPTl9XSVRI
X0NSRUFURSkKLSN1bmRlZiBGT1JfRUFDSF9DTEFTUworICAgIGNsYXNzIEpTVmFsdWU7CisgICAg
Y2xhc3MgTGlzdDsKK30KIAorbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgIC8qKgogICAgKiBBbiBh
Y3Rpb24gKGVpdGhlciBmdW5jdGlvbiBvciBzdHJpbmcpIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGEg
c3BlY2lmaWVkCkBAIC0xODQsNTQgKzM5LDIwIEBAIEZPUl9FQUNIX0NMQVNTKEtKU19JTVBMRU1F
TlRfUFJPVE9UWVBFX0YKICAgICovCiAgICAgY2xhc3MgU2NoZWR1bGVkQWN0aW9uIHsKICAgICBw
dWJsaWM6Ci0gICAgICAgIFNjaGVkdWxlZEFjdGlvbihKU1ZhbHVlKiBmdW5jLCBjb25zdCBMaXN0
JiBhcmdzKTsKLSAgICAgICAgU2NoZWR1bGVkQWN0aW9uKGNvbnN0IFdlYkNvcmU6OlN0cmluZyYg
Y29kZSkKKyAgICAgICAgU2NoZWR1bGVkQWN0aW9uKEtKUzo6SlNWYWx1ZSogZnVuYywgY29uc3Qg
S0pTOjpMaXN0JiBhcmdzKTsKKyAgICAgICAgU2NoZWR1bGVkQWN0aW9uKGNvbnN0IFN0cmluZyYg
Y29kZSkKICAgICAgICAgICAgIDogbV9jb2RlKGNvZGUpCiAgICAgICAgIHsKICAgICAgICAgfQog
Ci0gICAgICAgIHZvaWQgZXhlY3V0ZShXaW5kb3cgKik7CisgICAgICAgIHZvaWQgZXhlY3V0ZShL
SlM6OldpbmRvdyopOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgUHJvdGVjdGVkUHRyPEpTVmFs
dWU+IG1fZnVuYzsKLSAgICAgICAgVmVjdG9yPFByb3RlY3RlZFB0cjxKU1ZhbHVlPiA+IG1fYXJn
czsKLSAgICAgICAgV2ViQ29yZTo6U3RyaW5nIG1fY29kZTsKKyAgICAgICAgS0pTOjpQcm90ZWN0
ZWRQdHI8S0pTOjpKU1ZhbHVlPiBtX2Z1bmM7CisgICAgICAgIFZlY3RvcjxLSlM6OlByb3RlY3Rl
ZFB0cjxLSlM6OkpTVmFsdWU+ID4gbV9hcmdzOworICAgICAgICBTdHJpbmcgbV9jb2RlOwogICAg
IH07CiAKLSAgY2xhc3MgTG9jYXRpb24gOiBwdWJsaWMgRE9NT2JqZWN0IHsKLSAgICBmcmllbmQg
Y2xhc3MgV2luZG93OwotICBwdWJsaWM6Ci0gICAgdmlydHVhbCBib29sIGdldE93blByb3BlcnR5
U2xvdChFeGVjU3RhdGUqLCBjb25zdCBJZGVudGlmaWVyJiwgUHJvcGVydHlTbG90Jik7Ci0gICAg
SlNWYWx1ZSogZ2V0VmFsdWVQcm9wZXJ0eShFeGVjU3RhdGUqLCBpbnQgdG9rZW4pIGNvbnN0Owot
ICAgIHZpcnR1YWwgdm9pZCBwdXQoRXhlY1N0YXRlKiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVy
dHlOYW1lLCBKU1ZhbHVlKiwgaW50IGF0dHIgPSBOb25lKTsKLQotICAgIGVudW0geyBIYXNoLCBI
cmVmLCBIb3N0bmFtZSwgSG9zdCwgUGF0aG5hbWUsIFBvcnQsIFByb3RvY29sLCBTZWFyY2gsIAot
ICAgICAgICAgICBSZXBsYWNlLCBSZWxvYWQsIFRvU3RyaW5nLCBBc3NpZ24gfTsKLQotICAgIFdl
YkNvcmU6OkZyYW1lKiBmcmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWU7IH0KLQotICAgIHZp
cnR1YWwgY29uc3QgQ2xhc3NJbmZvKiBjbGFzc0luZm8oKSBjb25zdCB7IHJldHVybiAmaW5mbzsg
fQotICAgIHN0YXRpYyBjb25zdCBDbGFzc0luZm8gaW5mbzsKLQotICBwcml2YXRlOgotICAgIExv
Y2F0aW9uKFdlYkNvcmU6OkZyYW1lKik7Ci0KLSAgICBXZWJDb3JlOjpGcmFtZSogbV9mcmFtZTsK
LSAgfTsKLQotI2RlZmluZSBGT1JfRUFDSF9DTEFTUyhtYWNybykgXAotICAgIG1hY3JvKExvY2F0
aW9uUHJvdG9GdW5jQXNzaWduKSBcCi0gICAgbWFjcm8oTG9jYXRpb25Qcm90b0Z1bmNUb1N0cmlu
ZykgXAotICAgIG1hY3JvKExvY2F0aW9uUHJvdG9GdW5jUmVwbGFjZSkgXAotICAgIG1hY3JvKExv
Y2F0aW9uUHJvdG9GdW5jUmVsb2FkKSBcCi0KLUZPUl9FQUNIX0NMQVNTKEtKU19JTVBMRU1FTlRf
UFJPVE9UWVBFX0ZVTkNUSU9OX1dJVEhfQ1JFQVRFKQotI3VuZGVmIEZPUl9FQUNIX0NMQVNTCi0K
LX0gLy8gbmFtZXNwYWNlIEtKUwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgS0pTOjpKU1Zh
bHVlKiB0b0pTKEtKUzo6RXhlY1N0YXRlKiwgRE9NV2luZG93Kik7CiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiAKLSNlbmRpZiAvLyBranNfd2luZG93X2gKKyNlbmRpZiAvLyBTY2hlZHVsZWRBY3Rp
b25faApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc193aW5kb3cuY3BwCShyZXZpc2lvbiAyODc3OSkK
KysrIFdlYkNvcmUvYmluZGluZ3MvanMva2pzX3dpbmRvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlICJQbGF0Zm9ybVNjcmVlbi5oIgogI2luY2x1ZGUgIlBs
dWdJbkluZm9TdG9yZS5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJTY2hl
ZHVsZWRBY3Rpb24uaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgogI2luY2x1ZGUgIlNl
dHRpbmdzLmgiCiAjaW5jbHVkZSAiV2luZG93RmVhdHVyZXMuaCIKQEAgLTk5LDcgKzEwMCw3IEBA
IHN0cnVjdCBXaW5kb3dQcml2YXRlIHsKIAogY2xhc3MgRE9NV2luZG93VGltZXIgOiBwdWJsaWMg
VGltZXJCYXNlIHsKIHB1YmxpYzoKLSAgICBET01XaW5kb3dUaW1lcihpbnQgdGltZW91dElkLCBp
bnQgbmVzdGluZ0xldmVsLCBXaW5kb3cqIG9iamVjdCwgU2NoZWR1bGVkQWN0aW9uKiBhY3Rpb24p
CisgICAgRE9NV2luZG93VGltZXIoaW50IHRpbWVvdXRJZCwgaW50IG5lc3RpbmdMZXZlbCwgV2lu
ZG93KiBvYmplY3QsIFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlvbiogYWN0aW9uKQogICAgICAgICA6
IG1fdGltZW91dElkKHRpbWVvdXRJZCkKICAgICAgICAgLCBtX25lc3RpbmdMZXZlbChuZXN0aW5n
TGV2ZWwpCiAgICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQpAQCAtMTE4LDggKzExOSw4IEBAIHB1
YmxpYzoKICAgICBpbnQgbmVzdGluZ0xldmVsKCkgY29uc3QgeyByZXR1cm4gbV9uZXN0aW5nTGV2
ZWw7IH0KICAgICB2b2lkIHNldE5lc3RpbmdMZXZlbChpbnQgbikgeyBtX25lc3RpbmdMZXZlbCA9
IG47IH0KIAotICAgIFNjaGVkdWxlZEFjdGlvbiogYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9h
Y3Rpb247IH0KLSAgICBTY2hlZHVsZWRBY3Rpb24qIHRha2VBY3Rpb24oKSB7IFNjaGVkdWxlZEFj
dGlvbiogYSA9IG1fYWN0aW9uOyBtX2FjdGlvbiA9IDA7IHJldHVybiBhOyB9CisgICAgV2ViQ29y
ZTo6U2NoZWR1bGVkQWN0aW9uKiBhY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX2FjdGlvbjsgfQor
ICAgIFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlvbiogdGFrZUFjdGlvbigpIHsgV2ViQ29yZTo6U2No
ZWR1bGVkQWN0aW9uKiBhID0gbV9hY3Rpb247IG1fYWN0aW9uID0gMDsgcmV0dXJuIGE7IH0KIAog
cHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgZmlyZWQoKTsKQEAgLTEyNyw3ICsxMjgsNyBAQCBw
cml2YXRlOgogICAgIGludCBtX3RpbWVvdXRJZDsKICAgICBpbnQgbV9uZXN0aW5nTGV2ZWw7CiAg
ICAgV2luZG93KiBtX29iamVjdDsKLSAgICBTY2hlZHVsZWRBY3Rpb24qIG1fYWN0aW9uOworICAg
IFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlvbiogbV9hY3Rpb247CiB9OwogCiB9IC8vIG5hbWVzcGFj
ZSBLSlMKQEAgLTEyMDIsNjIgKzEyMDMsNiBAQCB2b2lkIFdpbmRvdzo6c2V0UmV0dXJuVmFsdWVT
bG90KEpTVmFsdWUqCiAgICAgZC0+bV9yZXR1cm5WYWx1ZVNsb3QgPSBzbG90OwogfQogCi0vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vIFNjaGVkdWxlZEFjdGlvbiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8KLQotdm9pZCBTY2hlZHVsZWRBY3Rpb246OmV4ZWN1dGUoV2luZG93KiB3aW5kb3cpCi17Ci0g
ICAgUmVmUHRyPEZyYW1lPiBmcmFtZSA9IHdpbmRvdy0+aW1wbCgpLT5mcmFtZSgpOwotICAgIGlm
ICghZnJhbWUpCi0gICAgICAgIHJldHVybjsKLQotICAgIEtKU1Byb3h5KiBzY3JpcHRQcm94eSA9
IGZyYW1lLT5zY3JpcHRQcm94eSgpOwotICAgIGlmICghc2NyaXB0UHJveHkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIFdpbmRvdyogZ2xvYmFsT2JqZWN0ID0gc2NyaXB0UHJveHktPmdsb2JhbE9i
amVjdCgpOwotCi0gICAgc2NyaXB0UHJveHktPnNldFByb2Nlc3NpbmdUaW1lckNhbGxiYWNrKHRy
dWUpOwotCi0gICAgaWYgKEpTVmFsdWUqIGZ1bmMgPSBtX2Z1bmMuZ2V0KCkpIHsKLSAgICAgICAg
SlNMb2NrIGxvY2s7Ci0gICAgICAgIGlmIChmdW5jLT5pc09iamVjdCgpICYmIHN0YXRpY19jYXN0
PEpTT2JqZWN0Kj4oZnVuYyktPmltcGxlbWVudHNDYWxsKCkpIHsKLSAgICAgICAgICAgIEV4ZWNT
dGF0ZSogZXhlYyA9IHdpbmRvdy0+Z2xvYmFsRXhlYygpOwotICAgICAgICAgICAgQVNTRVJUKHdp
bmRvdyA9PSBnbG9iYWxPYmplY3QpOwotCi0gICAgICAgICAgICBMaXN0IGFyZ3M7Ci0gICAgICAg
ICAgICBzaXplX3Qgc2l6ZSA9IG1fYXJncy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgIGFyZ3MuYXBwZW5kKG1f
YXJnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGdsb2JhbE9iamVjdC0+c3Rh
cnRUaW1lb3V0Q2hlY2soKTsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oZnVu
YyktPmNhbGwoZXhlYywgd2luZG93LCBhcmdzKTsKLSAgICAgICAgICAgIGdsb2JhbE9iamVjdC0+
c3RvcFRpbWVvdXRDaGVjaygpOwotICAgICAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigp
KSB7Ci0gICAgICAgICAgICAgICAgSlNPYmplY3QqIGV4Y2VwdGlvbiA9IGV4ZWMtPmV4Y2VwdGlv
bigpLT50b09iamVjdChleGVjKTsKLSAgICAgICAgICAgICAgICBleGVjLT5jbGVhckV4Y2VwdGlv
bigpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLT5nZXQoZXhl
YywgZXhlYy0+cHJvcGVydHlOYW1lcygpLm1lc3NhZ2UpLT50b1N0cmluZyhleGVjKTsKLSAgICAg
ICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IGV4Y2VwdGlvbi0+Z2V0KGV4ZWMsICJsaW5lIikt
PnRvSW50MzIoZXhlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKEludGVycHJldGVyOjpzaG91bGRQ
cmludEV4Y2VwdGlvbnMoKSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIodGltZXIpOiVz
XG4iLCBtZXNzYWdlLnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICAgICAgICAgIGlmIChQYWdlKiBw
YWdlID0gZnJhbWUtPnBhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgcGFnZS0+Y2hyb21lKCkt
PmFkZE1lc3NhZ2VUb0NvbnNvbGUoSlNNZXNzYWdlU291cmNlLCBFcnJvck1lc3NhZ2VMZXZlbCwg
bWVzc2FnZSwgbGluZU51bWJlciwgU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfSBlbHNlCi0gICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+ZXhlY3V0ZVNjcmlwdChtX2Nv
ZGUpOwotCi0gICAgLy8gVXBkYXRlIG91ciBkb2N1bWVudCdzIHJlbmRlcmluZyBmb2xsb3dpbmcg
dGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGltZW91dCBjYWxsYmFjay4KLSAgICAvLyBGSVhNRTogV2h5
IG5vdCB1c2UgdXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5nIHRvIHVwZGF0ZSByZW5kZXJpbmcgb2Yg
YWxsIGRvY3VtZW50cz8KLSAgICAvLyBGSVhNRTogSXMgdGhpcyByZWFsbHkgdGhlIHJpZ2h0IHBv
aW50IHRvIGRvIHRoZSB1cGRhdGU/IFdlIG5lZWQgYSBwbGFjZSB0aGF0IHdvcmtzCi0gICAgLy8g
Zm9yIGFsbCBwb3NzaWJsZSBlbnRyeSBwb2ludHMgdGhhdCBtaWdodCBwb3NzaWJseSBleGVjdXRl
IHNjcmlwdCwgYnV0IHRoaXMgc2VlbXMKLSAgICAvLyB0byBiZSBhIGJpdCB0b28gbG93LWxldmVs
LgotICAgIGlmIChEb2N1bWVudCogZG9jID0gZnJhbWUtPmRvY3VtZW50KCkpCi0gICAgICAgIGRv
Yy0+dXBkYXRlUmVuZGVyaW5nKCk7Ci0KLSAgICBzY3JpcHRQcm94eS0+c2V0UHJvY2Vzc2luZ1Rp
bWVyQ2FsbGJhY2soZmFsc2UpOwotfQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHRpbWVvdXRz
IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiB2b2lkIFdpbmRvdzo6Y2xlYXJBbGxUaW1lb3V0
cygpCkBAIC0xMjY2LDcgKzEyMTEsNyBAQCB2b2lkIFdpbmRvdzo6Y2xlYXJBbGxUaW1lb3V0cygp
CiAgICAgZC0+bV90aW1lb3V0cy5jbGVhcigpOwogfQogCi1pbnQgV2luZG93OjppbnN0YWxsVGlt
ZW91dChTY2hlZHVsZWRBY3Rpb24qIGEsIGludCB0LCBib29sIHNpbmdsZVNob3QpCitpbnQgV2lu
ZG93OjppbnN0YWxsVGltZW91dChXZWJDb3JlOjpTY2hlZHVsZWRBY3Rpb24qIGEsIGludCB0LCBi
b29sIHNpbmdsZVNob3QpCiB7CiAgICAgaW50IHRpbWVvdXRJZCA9ICsrbGFzdFVzZWRUaW1lb3V0
SWQ7CiAKQEAgLTEyOTEsMjIgKzEyMzYsMTQgQEAgaW50IFdpbmRvdzo6aW5zdGFsbFRpbWVvdXQo
U2NoZWR1bGVkQWN0aQogICAgIHJldHVybiB0aW1lb3V0SWQ7CiB9CiAKLVNjaGVkdWxlZEFjdGlv
bjo6U2NoZWR1bGVkQWN0aW9uKEpTVmFsdWUqIGZ1bmMsIGNvbnN0IExpc3QmIGFyZ3MpCi0gICAg
OiBtX2Z1bmMoZnVuYykKLXsKLSAgICBMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBhcmdzLmVu
ZCgpOwotICAgIGZvciAoTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhcmdzLmJlZ2luKCk7IGl0
ICE9IGVuZDsgKytpdCkKLSAgICAgICAgbV9hcmdzLmFwcGVuZCgqaXQpOwotfQotCiBpbnQgV2lu
ZG93OjppbnN0YWxsVGltZW91dChjb25zdCBVU3RyaW5nJiBoYW5kbGVyLCBpbnQgdCwgYm9vbCBz
aW5nbGVTaG90KQogewotICAgIHJldHVybiBpbnN0YWxsVGltZW91dChuZXcgU2NoZWR1bGVkQWN0
aW9uKGhhbmRsZXIpLCB0LCBzaW5nbGVTaG90KTsKKyAgICByZXR1cm4gaW5zdGFsbFRpbWVvdXQo
bmV3IFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlvbihoYW5kbGVyKSwgdCwgc2luZ2xlU2hvdCk7CiB9
CiAKIGludCBXaW5kb3c6Omluc3RhbGxUaW1lb3V0KEpTVmFsdWUqIGZ1bmMsIGNvbnN0IExpc3Qm
IGFyZ3MsIGludCB0LCBib29sIHNpbmdsZVNob3QpCiB7Ci0gICAgcmV0dXJuIGluc3RhbGxUaW1l
b3V0KG5ldyBTY2hlZHVsZWRBY3Rpb24oZnVuYywgYXJncyksIHQsIHNpbmdsZVNob3QpOworICAg
IHJldHVybiBpbnN0YWxsVGltZW91dChuZXcgV2ViQ29yZTo6U2NoZWR1bGVkQWN0aW9uKGZ1bmMs
IGFyZ3MpLCB0LCBzaW5nbGVTaG90KTsKIH0KIAogV2ViQ29yZTo6UGF1c2VkVGltZW91dHMqIFdp
bmRvdzo6cGF1c2VUaW1lb3V0cygpCkBAIC0xMzc4LDcgKzEzMTUsNyBAQCB2b2lkIFdpbmRvdzo6
dGltZXJGaXJlZChET01XaW5kb3dUaW1lciogCiAgICAgfQogCiAgICAgLy8gRGVsZXRlIHRpbWVy
IGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbiBmb3Igb25lLXNob3QgdGltZXJzLgotICAgIFNj
aGVkdWxlZEFjdGlvbiogYWN0aW9uID0gdGltZXItPnRha2VBY3Rpb24oKTsKKyAgICBXZWJDb3Jl
OjpTY2hlZHVsZWRBY3Rpb24qIGFjdGlvbiA9IHRpbWVyLT50YWtlQWN0aW9uKCk7CiAgICAgZC0+
bV90aW1lb3V0cy5yZW1vdmUodGltZXItPnRpbWVvdXRJZCgpKTsKICAgICBkZWxldGUgdGltZXI7
CiAgICAgYWN0aW9uLT5leGVjdXRlKHRoaXMpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9qcy9r
anNfd2luZG93LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93
LmgJKHJldmlzaW9uIDI4Nzc5KQorKysgV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTM0LDEzICszNCwxMyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAg
ICAgY2xhc3MgSlNFdmVudExpc3RlbmVyOwogICAgIGNsYXNzIEpTVW5wcm90ZWN0ZWRFdmVudExp
c3RlbmVyOwogICAgIGNsYXNzIFBhdXNlZFRpbWVvdXRzOworICAgIGNsYXNzIFNjaGVkdWxlZEFj
dGlvbjsKIH0KIAogbmFtZXNwYWNlIEtKUyB7CiAKICAgICBjbGFzcyBET01XaW5kb3dUaW1lcjsK
ICAgICBjbGFzcyBMb2NhdGlvbjsKLSAgICBjbGFzcyBTY2hlZHVsZWRBY3Rpb247CiAgICAgY2xh
c3MgV2luZG93OwogICAgIGNsYXNzIFdpbmRvd0Z1bmM7CiAgICAgY2xhc3MgV2luZG93UHJpdmF0
ZTsKQEAgLTQ4LDcgKzQ4LDcgQEAgbmFtZXNwYWNlIEtKUyB7CiAgIC8vIFRoaXMgaXMgdGhlIG9u
bHkgV2ViQ29yZSBKUyBiaW5kaW5nIHdoaWNoIGRvZXMgbm90IGluaGVyaXQgZnJvbSBET01PYmpl
Y3QKICAgY2xhc3MgV2luZG93IDogcHVibGljIEpTR2xvYmFsT2JqZWN0IHsKICAgICBmcmllbmQg
Y2xhc3MgTG9jYXRpb247Ci0gICAgZnJpZW5kIGNsYXNzIFNjaGVkdWxlZEFjdGlvbjsKKyAgICBm
cmllbmQgY2xhc3MgV2ViQ29yZTo6U2NoZWR1bGVkQWN0aW9uOwogICBwcm90ZWN0ZWQ6CiAgICAg
V2luZG93KFdlYkNvcmU6OkRPTVdpbmRvdyopOwogCkBAIC0xNTUsNyArMTU1LDcgQEAgbmFtZXNw
YWNlIEtKUyB7CiAKICAgICB2b2lkIGNsZWFySGVscGVyT2JqZWN0UHJvcGVydGllcygpOwogICAg
IHZvaWQgY2xlYXJBbGxUaW1lb3V0cygpOwotICAgIGludCBpbnN0YWxsVGltZW91dChTY2hlZHVs
ZWRBY3Rpb24qLCBpbnQgaW50ZXJ2YWwsIGJvb2wgc2luZ2xlU2hvdCk7CisgICAgaW50IGluc3Rh
bGxUaW1lb3V0KFdlYkNvcmU6OlNjaGVkdWxlZEFjdGlvbiosIGludCBpbnRlcnZhbCwgYm9vbCBz
aW5nbGVTaG90KTsKIAogICAgIFJlZlB0cjxXZWJDb3JlOjpET01XaW5kb3c+IG1faW1wbDsKICAg
ICBPd25QdHI8V2luZG93UHJpdmF0ZT4gZDsKQEAgLTE3NywyNyArMTc3LDYgQEAgRk9SX0VBQ0hf
Q0xBU1MoS0pTX0lNUExFTUVOVF9QUk9UT1RZUEVfRgogI3VuZGVmIEZPUl9FQUNIX0NMQVNTCiAK
IAotICAvKioKLSAgICogQW4gYWN0aW9uIChlaXRoZXIgZnVuY3Rpb24gb3Igc3RyaW5nKSB0byBi
ZSBleGVjdXRlZCBhZnRlciBhIHNwZWNpZmllZAotICAgKiB0aW1lIGludGVydmFsLCBlaXRoZXIg
b25jZSBvciByZXBlYXRlZGx5LiBVc2VkIGZvciB3aW5kb3cuc2V0VGltZW91dCgpCi0gICAqIGFu
ZCB3aW5kb3cuc2V0SW50ZXJ2YWwoKQotICAgKi8KLSAgICBjbGFzcyBTY2hlZHVsZWRBY3Rpb24g
ewotICAgIHB1YmxpYzoKLSAgICAgICAgU2NoZWR1bGVkQWN0aW9uKEpTVmFsdWUqIGZ1bmMsIGNv
bnN0IExpc3QmIGFyZ3MpOwotICAgICAgICBTY2hlZHVsZWRBY3Rpb24oY29uc3QgV2ViQ29yZTo6
U3RyaW5nJiBjb2RlKQotICAgICAgICAgICAgOiBtX2NvZGUoY29kZSkKLSAgICAgICAgewotICAg
ICAgICB9Ci0KLSAgICAgICAgdm9pZCBleGVjdXRlKFdpbmRvdyAqKTsKLQotICAgIHByaXZhdGU6
Ci0gICAgICAgIFByb3RlY3RlZFB0cjxKU1ZhbHVlPiBtX2Z1bmM7Ci0gICAgICAgIFZlY3RvcjxQ
cm90ZWN0ZWRQdHI8SlNWYWx1ZT4gPiBtX2FyZ3M7Ci0gICAgICAgIFdlYkNvcmU6OlN0cmluZyBt
X2NvZGU7Ci0gICAgfTsKLQogICBjbGFzcyBMb2NhdGlvbiA6IHB1YmxpYyBET01PYmplY3Qgewog
ICAgIGZyaWVuZCBjbGFzcyBXaW5kb3c7CiAgIHB1YmxpYzoK
</data>
<flag name="review"
          id="7775"
          type_id="1"
          status="+"
          setter="mjs"
    />
          </attachment>
      

    </bug>

</bugzilla>