<?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>123028</bug_id>
          
          <creation_ts>2013-10-18 10:29:53 -0700</creation_ts>
          <short_desc>Move IDBTransactionBackend operations to the IDBTransactionBackend itself.</short_desc>
          <delta_ts>2013-10-18 13:19:38 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</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>
          
          <blocked>123027</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Brady Eidson">beidson</reporter>
          <assigned_to name="Brady Eidson">beidson</assigned_to>
          <cc>alecflett</cc>
    
    <cc>commit-queue</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>jsbell</cc>
    
    <cc>rakuco</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>941261</commentid>
    <comment_count>0</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-10-18 10:29:53 -0700</bug_when>
    <thetext>Move IDBTransactionBackend operations to the IDBTransactionBackend itself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941295</commentid>
    <comment_count>1</comment_count>
      <attachid>214594</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-10-18 12:22:35 -0700</bug_when>
    <thetext>Created attachment 214594
Patch v1 - Code shoveling!

Tested the build on Mac and it worked great.

Let EWS churn on this.  Unfortunately non-Mac EWS doesn&apos;t run tests...  (But there should be no change in behavior)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941296</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-10-18 12:25:09 -0700</bug_when>
    <thetext>Attachment 214594 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/CMakeLists.txt&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/GNUmakefile.list.am&apos;, u&apos;Source/WebCore/Modules/indexeddb/IDBTransactionBackendInterface.h&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBCursorBackendLevelDB.cpp&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.cpp&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBObjectStoreBackendLevelDB.cpp&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDB.cpp&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDB.h&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.h&apos;, u&apos;Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionCoordinatorLevelDB.cpp&apos;]&quot; exit_code: 1
Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDB.h:82:  The parameter name &quot;key&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/Modules/indexeddb/IDBTransactionBackendInterface.h:57:  The parameter name &quot;key&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/Modules/indexeddb/IDBTransactionBackendInterface.h:68:  Could not find a newline character at the end of the file.  [whitespace/ending_newline] [5]
Total errors found: 3 in 13 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941300</commentid>
    <comment_count>3</comment_count>
      <attachid>214594</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-10-18 12:40:22 -0700</bug_when>
    <thetext>Comment on attachment 214594
Patch v1 - Code shoveling!

View in context: https://bugs.webkit.org/attachment.cgi?id=214594&amp;action=review

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBCursorBackendLevelDB.cpp:50
&gt; +    virtual void perform();

Please go over the patch and add OVERRIDE and FINAL everywhere.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:126
&gt; +        PassRefPtr&lt;IDBCallbacks&gt; callbacks() { return m_callbacks; }
&gt; +        PassRefPtr&lt;IDBDatabaseCallbacks&gt; databaseCallbacks() { return m_databaseCallbacks; }

PassRefPtr seems very inappropriate here, should be a raw pointer. There is no passing of ownership.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:144
&gt;      Deque&lt;OwnPtr&lt;PendingOpenCall&gt; &gt; m_pendingOpenCalls;

Please change &quot;&gt; &gt;&quot; to &quot;&gt;&gt;&quot; everywhere.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:153
&gt; +        PassRefPtr&lt;IDBCallbacks&gt; callbacks() { return m_callbacks; }

Same comment about PassRefPtr.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDB.h:82
&gt; +    virtual void scheduleGetOperation(const IDBDatabaseMetadata&amp;, int64_t objectStoreId, int64_t indexId, PassRefPtr&lt;IDBKeyRange&gt;, IndexedDB::CursorType, PassRefPtr&lt;IDBCallbacks&gt;);
&gt; +    virtual void schedulePutOperation(const IDBObjectStoreMetadata&amp;, PassRefPtr&lt;SharedBuffer&gt; value, PassRefPtr&lt;IDBKey&gt; key, IDBDatabaseBackendInterface::PutMode, PassRefPtr&lt;IDBCallbacks&gt;, const Vector&lt;int64_t&gt;&amp; indexIds, const Vector&lt;IDBDatabaseBackendInterface::IndexKeys&gt;&amp;);

All these PassRefPtr make me a little nervous too.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:98
&gt; +                // Index Value Retrieval Operation
&gt; +                backingStoreCursor = m_backingStore-&gt;openIndexKeyCursor(m_transaction-&gt;backingStoreTransaction(), m_databaseId, m_objectStoreId, m_indexId, m_keyRange.get(), IndexedDB::CursorNext);

There should be braces here.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:101
&gt; +            else
&gt; +                // Index Referenced Value Retrieval Operation
&gt; +                backingStoreCursor = m_backingStore-&gt;openIndexCursor(m_transaction-&gt;backingStoreTransaction(), m_databaseId, m_objectStoreId, m_indexId, m_keyRange.get(), IndexedDB::CursorNext);

And here.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:135
&gt; +

Blank line.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:192
&gt; +    ASSERT(key &amp;&amp; key-&gt;isValid());

Please split into two ASSERTs.

&gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:208
&gt; +    Vector&lt;OwnPtr&lt;IDBObjectStoreBackendLevelDB::IndexWriter&gt; &gt; indexWriters;

Don&apos;t we use unique_ptr everywhere now?

Please try to replace all OwnPtrs and PassOwnPtrs to see what happens.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941304</commentid>
    <comment_count>4</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-10-18 12:51:14 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 214594 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=214594&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBCursorBackendLevelDB.cpp:50
&gt; &gt; +    virtual void perform();
&gt; 
&gt; Please go over the patch and add OVERRIDE and FINAL everywhere.
&gt; 
&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:126
&gt; &gt; +        PassRefPtr&lt;IDBCallbacks&gt; callbacks() { return m_callbacks; }
&gt; &gt; +        PassRefPtr&lt;IDBDatabaseCallbacks&gt; databaseCallbacks() { return m_databaseCallbacks; }
&gt; 
&gt; PassRefPtr seems very inappropriate here, should be a raw pointer. There is no passing of ownership.

Longstanding from the original Google implementation. I fixed it in some places, but will clean up a few more obvious ones like this.

&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:144
&gt; &gt;      Deque&lt;OwnPtr&lt;PendingOpenCall&gt; &gt; m_pendingOpenCalls;
&gt; 
&gt; Please change &quot;&gt; &gt;&quot; to &quot;&gt;&gt;&quot; everywhere.

YAY!

&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:153
&gt; &gt; +        PassRefPtr&lt;IDBCallbacks&gt; callbacks() { return m_callbacks; }
&gt; 
&gt; Same comment about PassRefPtr.
&gt; 
&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDB.h:82
&gt; &gt; +    virtual void scheduleGetOperation(const IDBDatabaseMetadata&amp;, int64_t objectStoreId, int64_t indexId, PassRefPtr&lt;IDBKeyRange&gt;, IndexedDB::CursorType, PassRefPtr&lt;IDBCallbacks&gt;);
&gt; &gt; +    virtual void schedulePutOperation(const IDBObjectStoreMetadata&amp;, PassRefPtr&lt;SharedBuffer&gt; value, PassRefPtr&lt;IDBKey&gt; key, IDBDatabaseBackendInterface::PutMode, PassRefPtr&lt;IDBCallbacks&gt;, const Vector&lt;int64_t&gt;&amp; indexIds, const Vector&lt;IDBDatabaseBackendInterface::IndexKeys&gt;&amp;);
&gt; 
&gt; All these PassRefPtr make me a little nervous too.

Longstanding, so not changing behavior here...  but I&apos;ll nuke them.

&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:98
&gt; &gt; +                // Index Value Retrieval Operation
&gt; &gt; +                backingStoreCursor = m_backingStore-&gt;openIndexKeyCursor(m_transaction-&gt;backingStoreTransaction(), m_databaseId, m_objectStoreId, m_indexId, m_keyRange.get(), IndexedDB::CursorNext);
&gt; 
&gt; There should be braces here.
&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:101
&gt; &gt; +            else
&gt; &gt; +                // Index Referenced Value Retrieval Operation
&gt; &gt; +                backingStoreCursor = m_backingStore-&gt;openIndexCursor(m_transaction-&gt;backingStoreTransaction(), m_databaseId, m_objectStoreId, m_indexId, m_keyRange.get(), IndexedDB::CursorNext);
&gt; 
&gt; And here.

Will do.


&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:192
&gt; &gt; +    ASSERT(key &amp;&amp; key-&gt;isValid());
&gt; 
&gt; Please split into two ASSERTs.

Okay.

&gt; 
&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:208
&gt; &gt; +    Vector&lt;OwnPtr&lt;IDBObjectStoreBackendLevelDB::IndexWriter&gt; &gt; indexWriters;
&gt; 
&gt; Don&apos;t we use unique_ptr everywhere now?
&gt; 
&gt; Please try to replace all OwnPtrs and PassOwnPtrs to see what happens.

Ruh roh...  I&apos;ll consider this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941305</commentid>
    <comment_count>5</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-10-18 13:11:07 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; (From update of attachment 214594 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=214594&amp;action=review
&gt; &gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:126
&gt; &gt; &gt; +        PassRefPtr&lt;IDBCallbacks&gt; callbacks() { return m_callbacks; }
&gt; &gt; &gt; +        PassRefPtr&lt;IDBDatabaseCallbacks&gt; databaseCallbacks() { return m_databaseCallbacks; }
&gt; &gt; 
&gt; &gt; PassRefPtr seems very inappropriate here, should be a raw pointer. There is no passing of ownership.
&gt; 
&gt; &gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBDatabaseBackendLevelDB.h:153
&gt; &gt; &gt; +        PassRefPtr&lt;IDBCallbacks&gt; callbacks() { return m_callbacks; }
&gt; &gt; 
&gt; &gt; Same comment about PassRefPtr.

Changed these, but...

&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDB.h:82
&gt; &gt; &gt; +    virtual void scheduleGetOperation(const IDBDatabaseMetadata&amp;, int64_t objectStoreId, int64_t indexId, PassRefPtr&lt;IDBKeyRange&gt;, IndexedDB::CursorType, PassRefPtr&lt;IDBCallbacks&gt;);
&gt; &gt; &gt; +    virtual void schedulePutOperation(const IDBObjectStoreMetadata&amp;, PassRefPtr&lt;SharedBuffer&gt; value, PassRefPtr&lt;IDBKey&gt; key, IDBDatabaseBackendInterface::PutMode, PassRefPtr&lt;IDBCallbacks&gt;, const Vector&lt;int64_t&gt;&amp; indexIds, const Vector&lt;IDBDatabaseBackendInterface::IndexKeys&gt;&amp;);
&gt; &gt; 
&gt; &gt; All these PassRefPtr make me a little nervous too.
&gt; 
&gt; Longstanding, so not changing behavior here...  but I&apos;ll nuke them.

Most of these actually do pass ownership, so I&apos;m going to leave all of them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941306</commentid>
    <comment_count>6</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-10-18 13:13:46 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 214594 [details])
&gt; &gt; Source/WebCore/Modules/indexeddb/leveldb/IDBTransactionBackendLevelDBOperations.cpp:208
&gt; &gt; +    Vector&lt;OwnPtr&lt;IDBObjectStoreBackendLevelDB::IndexWriter&gt; &gt; indexWriters;
&gt; 
&gt; Don&apos;t we use unique_ptr everywhere now?
&gt; 
&gt; Please try to replace all OwnPtrs and PassOwnPtrs to see what happens.

This explodes the scope of the patch a bit more than it already has.  I&apos;ll pass for now, but keep it in mind for a followup and future refactors in this area.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941308</commentid>
    <comment_count>7</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-10-18 13:19:11 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/157644

With the wrong log message.  :(  God dammit...</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>214594</attachid>
            <date>2013-10-18 12:22:35 -0700</date>
            <delta_ts>2013-10-18 12:40:22 -0700</delta_ts>
            <desc>Patch v1 - Code shoveling!</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>117346</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggNjQ5MDM0OC4uMzQyMGI2MiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTc4OSw2ICs3ODksNyBAQCBzZXQoV2ViQ29yZV9TT1VSQ0VTCiAgICAgTW9kdWxl
cy9pbmRleGVkZGIvbGV2ZWxkYi9JREJMZXZlbERCQ29kaW5nLmNwcAogICAgIE1vZHVsZXMvaW5k
ZXhlZGRiL2xldmVsZGIvSURCT2JqZWN0U3RvcmVCYWNrZW5kTGV2ZWxEQi5jcHAKICAgICBNb2R1
bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIuY3BwCisg
ICAgTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERC
T3BlcmF0aW9ucy5jcHAKICAgICBNb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0
aW9uQ29vcmRpbmF0b3JMZXZlbERCLmNwcAogCiAgICAgTW9kdWxlcy9tZWRpYXNvdXJjZS9NZWRp
YVNvdXJjZS5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJj
ZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAxZGJkYjk5Li4wMTZmYzI2IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsMTMxIEBACisyMDEzLTEwLTE4ICBCcmFkeSBFaWRzb24gIDxiZWlkc29uQGFwcGxl
LmNvbT4KKworICAgICAgICBNb3ZlIElEQlRyYW5zYWN0aW9uQmFja2VuZCBvcGVyYXRpb25zIHRv
IHRoZSBJREJUcmFuc2FjdGlvbkJhY2tlbmQgaXRzZWxmLi4KKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzAyOAorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgZ2V0cyByaWQgb2YgYSBiaWcgYmxvYiBv
ZiBMZXZlbERCIHNwZWNpZmljIGNvZGUgZnJvbSBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCLmNw
cCwKKyAgICAgICAgYnJpbmdpbmcgdXMgbXVjaCBjbG9zZXIgdG8gaGF2aW5nIGl0IGJlIGNyb3Nz
IHBsYXRmb3JtLgorCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogR05VbWFr
ZWZpbGUubGlzdC5hbToKKworICAgICAgICAqIE1vZHVsZXMvaW5kZXhlZGRiL0lEQlRyYW5zYWN0
aW9uQmFja2VuZEludGVyZmFjZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5z
YWN0aW9uQmFja2VuZEludGVyZmFjZTo6fklEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZSk6
CisKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkN1cnNvckJhY2tlbmRM
ZXZlbERCLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQkN1cnNvckJhY2tlbmRMZXZlbERCOjpD
dXJzb3JBZHZhbmNlT3BlcmF0aW9uOjpwZXJmb3JtKTogVXBkYXRlIGZvciBuZXcgbWV0aG9kIHNp
Z25hdHVyZS4KKyAgICAgICAgKFdlYkNvcmU6OklEQkN1cnNvckJhY2tlbmRMZXZlbERCOjpDdXJz
b3JJdGVyYXRpb25PcGVyYXRpb246OnBlcmZvcm0pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6
OklEQkN1cnNvckJhY2tlbmRMZXZlbERCOjpDdXJzb3JQcmVmZXRjaEl0ZXJhdGlvbk9wZXJhdGlv
bjo6cGVyZm9ybSk6IERpdHRvLgorCisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxk
Yi9JREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCLmNwcDogTW92ZSBhbGwgb3BlcmF0aW9ucyBpbnRv
CisgICAgICAgICAgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQk9wZXJhdGlvbnMsIHRoZW4g
c3RhcnQgc2NoZWR1bGluZyB0aGVtIHVzaW5nIHRoZSBuZXcKKyAgICAgICAgICBJREJUcmFuc2Fj
dGlvbkJhY2tlbmRJbnRlcmZhY2Ugc2NoZWR1bGluZyBtZXRob2RzLgorICAgICAgICAoV2ViQ29y
ZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6Y3JlYXRlT2JqZWN0U3RvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6ZGVsZXRlT2JqZWN0U3RvcmUp
OgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6Y3JlYXRlSW5k
ZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6ZGVsZXRl
SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6Z2V0
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OnB1dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpzZXRJbmRleGVzUmVh
ZHkpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6b3BlbkN1
cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpjb3Vu
dCk6CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpkZWxldGVS
YW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpjbGVh
cik6CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpjcmVhdGVU
cmFuc2FjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERC
OjpydW5JbnRWZXJzaW9uQ2hhbmdlVHJhbnNhY3Rpb24pOgorICAgICAgICAqIE1vZHVsZXMvaW5k
ZXhlZGRiL2xldmVsZGIvSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQi5oOiBNb3ZlIGRlZmluaXRp
b25zIG9mIFBlbmRpbmdPcGVuQ2FsbCBhbmQKKyAgICAgICAgICBQZW5kaW5nRGVsZXRlQ2FsbCB0
byB0aGUgaGVhZGVyLgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxE
Qjo6UGVuZGluZ09wZW5DYWxsOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0YWJh
c2VCYWNrZW5kTGV2ZWxEQjo6UGVuZGluZ09wZW5DYWxsOjpjYWxsYmFja3MpOgorICAgICAgICAo
V2ViQ29yZTo6SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6UGVuZGluZ09wZW5DYWxsOjpkYXRh
YmFzZUNhbGxiYWNrcyk6CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZl
bERCOjpQZW5kaW5nT3BlbkNhbGw6OnZlcnNpb24pOgorICAgICAgICAoV2ViQ29yZTo6SURCRGF0
YWJhc2VCYWNrZW5kTGV2ZWxEQjo6UGVuZGluZ09wZW5DYWxsOjp0cmFuc2FjdGlvbklkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OlBlbmRpbmdPcGVuQ2Fs
bDo6UGVuZGluZ09wZW5DYWxsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2Vu
ZExldmVsREI6OlBlbmRpbmdEZWxldGVDYWxsOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6UGVuZGluZ0RlbGV0ZUNhbGw6OmNhbGxiYWNrcyk6
CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpQZW5kaW5nRGVs
ZXRlQ2FsbDo6UGVuZGluZ0RlbGV0ZUNhbGwpOgorCisgICAgICAgICogTW9kdWxlcy9pbmRleGVk
ZGIvbGV2ZWxkYi9JREJPYmplY3RTdG9yZUJhY2tlbmRMZXZlbERCLmNwcDogQWRkIGEgbmV3bHkg
cmVxdWlyZWQgaW5jbHVkZS4KKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lE
QlRyYW5zYWN0aW9uQ29vcmRpbmF0b3JMZXZlbERCLmNwcDogRGl0dG8uCisKKyAgICAgICAgKiBN
b2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIuY3Bw
OiBJbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2UgdG8KKyAgICAgICAgICBoYW5kbGUgc2NoZWR1
bGluZyBvZiBvcGVyYXRpb25zIGluIGEgY3Jvc3MgcGxhdGZvcm0gbWFubmVyLCB0aGVuIHJlbHkg
b24gdGhlIG5ldworICAgICAgICAgIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREJPcGVyYXRp
b25zIGNsYXNzZXMgZm9yIHRoZSBhY3R1YWwgb3BlcmF0aW9ucy4KKyAgICAgICAgKFdlYkNvcmU6
OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZl
bERCKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OmFi
b3J0KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OnRh
c2tUaW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5zYWN0aW9uQmFja2VuZExl
dmVsREI6OnNjaGVkdWxlQ3JlYXRlT2JqZWN0U3RvcmVPcGVyYXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6c2NoZWR1bGVEZWxldGVPYmplY3RT
dG9yZU9wZXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJREJUcmFuc2FjdGlvbkJhY2tlbmRM
ZXZlbERCOjpzY2hlZHVsZVZlcnNpb25DaGFuZ2VPcGVyYXRpb24pOgorICAgICAgICAoV2ViQ29y
ZTo6SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6c2NoZWR1bGVDcmVhdGVJbmRleE9wZXJh
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpz
Y2hlZHVsZURlbGV0ZUluZGV4T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREI6OnNjaGVkdWxlR2V0T3BlcmF0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OnNjaGVkdWxlUHV0T3BlcmF0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OnNjaGVk
dWxlU2V0SW5kZXhlc1JlYWR5T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREI6OnNjaGVkdWxlT3BlbkN1cnNvck9wZXJhdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpzY2hlZHVsZUNvdW50
T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVs
REI6OnNjaGVkdWxlRGVsZXRlUmFuZ2VPcGVyYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6SURC
VHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6c2NoZWR1bGVDbGVhck9wZXJhdGlvbik6CisgICAg
ICAgICogTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZl
bERCLmg6CisKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0
aW9uQmFja2VuZExldmVsREJPcGVyYXRpb25zLmNwcDogQWRkZWQuCisgICAgICAgICAgTW92ZSBh
bGwgdGhlIExldmVsREIgdHJhbnNhY3Rpb24gb3BlcmF0aW9ucyBmcm9tIElEQkRhdGFiYXNlQmFj
a2VuZExldmVsREIgdG8gaGVyZS4KKyAgICAgICAgKFdlYkNvcmU6OkNyZWF0ZU9iamVjdFN0b3Jl
T3BlcmF0aW9uOjpwZXJmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkNyZWF0ZUluZGV4T3BlcmF0
aW9uOjpwZXJmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkNyZWF0ZUluZGV4QWJvcnRPcGVyYXRp
b246OnBlcmZvcm0pOgorICAgICAgICAoV2ViQ29yZTo6RGVsZXRlSW5kZXhPcGVyYXRpb246OnBl
cmZvcm0pOgorICAgICAgICAoV2ViQ29yZTo6RGVsZXRlSW5kZXhBYm9ydE9wZXJhdGlvbjo6cGVy
Zm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpHZXRPcGVyYXRpb246OnBlcmZvcm0pOgorICAgICAg
ICAoV2ViQ29yZTo6UHV0T3BlcmF0aW9uOjpwZXJmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
dEluZGV4ZXNSZWFkeU9wZXJhdGlvbjo6cGVyZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVu
Q3Vyc29yT3BlcmF0aW9uOjpwZXJmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkNvdW50T3BlcmF0
aW9uOjpwZXJmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkRlbGV0ZVJhbmdlT3BlcmF0aW9uOjpw
ZXJmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkNsZWFyT3BlcmF0aW9uOjpwZXJmb3JtKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRlbGV0ZU9iamVjdFN0b3JlT3BlcmF0aW9uOjpwZXJmb3JtKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OlZlcnNpb25DaGFuZ2VP
cGVyYXRpb246OnBlcmZvcm0pOgorICAgICAgICAoV2ViQ29yZTo6Q3JlYXRlT2JqZWN0U3RvcmVB
Ym9ydE9wZXJhdGlvbjo6cGVyZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpEZWxldGVPYmplY3RT
dG9yZUFib3J0T3BlcmF0aW9uOjpwZXJmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFi
YXNlQmFja2VuZExldmVsREI6OlZlcnNpb25DaGFuZ2VBYm9ydE9wZXJhdGlvbjo6cGVyZm9ybSk6
CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXZlbERCT3BlcmF0aW9ucy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNyZWF0ZU9i
amVjdFN0b3JlT3BlcmF0aW9uOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Q3JlYXRlT2Jq
ZWN0U3RvcmVPcGVyYXRpb246OkNyZWF0ZU9iamVjdFN0b3JlT3BlcmF0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OkRlbGV0ZU9iamVjdFN0b3JlT3BlcmF0aW9uOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6RGVsZXRlT2JqZWN0U3RvcmVPcGVyYXRpb246OkRlbGV0ZU9iamVjdFN0b3JlT3Bl
cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OlZl
cnNpb25DaGFuZ2VPcGVyYXRpb246OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJEYXRh
YmFzZUJhY2tlbmRMZXZlbERCOjpWZXJzaW9uQ2hhbmdlT3BlcmF0aW9uOjpWZXJzaW9uQ2hhbmdl
T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNyZWF0ZU9iamVjdFN0b3JlQWJvcnRPcGVy
YXRpb246OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpDcmVhdGVPYmplY3RTdG9yZUFib3J0
T3BlcmF0aW9uOjpDcmVhdGVPYmplY3RTdG9yZUFib3J0T3BlcmF0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OkRlbGV0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb246OmNyZWF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpEZWxldGVPYmplY3RTdG9yZUFib3J0T3BlcmF0aW9uOjpEZWxldGVPYmplY3RT
dG9yZUFib3J0T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2Vu
ZExldmVsREI6OlZlcnNpb25DaGFuZ2VBYm9ydE9wZXJhdGlvbjo6Y3JlYXRlKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OlZlcnNpb25DaGFuZ2VBYm9ydE9w
ZXJhdGlvbjo6VmVyc2lvbkNoYW5nZUFib3J0T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6
OkNyZWF0ZUluZGV4T3BlcmF0aW9uOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Q3JlYXRl
SW5kZXhPcGVyYXRpb246OkNyZWF0ZUluZGV4T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6
OkNyZWF0ZUluZGV4QWJvcnRPcGVyYXRpb246OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpD
cmVhdGVJbmRleEFib3J0T3BlcmF0aW9uOjpDcmVhdGVJbmRleEFib3J0T3BlcmF0aW9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRlbGV0ZUluZGV4T3BlcmF0aW9uOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6RGVsZXRlSW5kZXhPcGVyYXRpb246OkRlbGV0ZUluZGV4T3BlcmF0aW9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRlbGV0ZUluZGV4QWJvcnRPcGVyYXRpb246OmNyZWF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpEZWxldGVJbmRleEFib3J0T3BlcmF0aW9uOjpEZWxldGVJbmRleEFib3J0
T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkdldE9wZXJhdGlvbjo6Y3JlYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdldE9wZXJhdGlvbjo6R2V0T3BlcmF0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlB1dE9wZXJhdGlvbjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlB1dE9wZXJh
dGlvbjo6UHV0T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlNldEluZGV4ZXNSZWFkeU9w
ZXJhdGlvbjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNldEluZGV4ZXNSZWFkeU9wZXJh
dGlvbjo6U2V0SW5kZXhlc1JlYWR5T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5D
dXJzb3JPcGVyYXRpb246OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuQ3Vyc29yT3Bl
cmF0aW9uOjpPcGVuQ3Vyc29yT3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNvdW50T3Bl
cmF0aW9uOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Q291bnRPcGVyYXRpb246OkNvdW50
T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkRlbGV0ZVJhbmdlT3BlcmF0aW9uOjpjcmVh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6RGVsZXRlUmFuZ2VPcGVyYXRpb246OkRlbGV0ZVJhbmdl
T3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNsZWFyT3BlcmF0aW9uOjpjcmVhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6Q2xlYXJPcGVyYXRpb246OkNsZWFyT3BlcmF0aW9uKToKKwogMjAx
My0xMC0xNyAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgQ2xl
YW51cCB0aGUgTW9kdWxlcyBncm91cCBpbiB0aGUgV2ViQ29yZS54Y29kZXByb2oKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0gYi9Tb3VyY2UvV2ViQ29yZS9H
TlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IDdlZDMzNzUuLjlhOGY0MGIgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05V
bWFrZWZpbGUubGlzdC5hbQpAQCAtMTg0NCwxMCArMTg0NCwxMyBAQCB3ZWJjb3JlX21vZHVsZXNf
c291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCUmVxdWVz
dC5oIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREIuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4
ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIuaCBcCisJU291cmNlL1dl
YkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZl
bERCT3BlcmF0aW9ucy5jcHAgXAorCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL2xl
dmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQk9wZXJhdGlvbnMuaCBcCiAJU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJUcmFuc2FjdGlvbkNvb3JkaW5h
dG9yTGV2ZWxEQi5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL2xldmVs
ZGIvSURCVHJhbnNhY3Rpb25Db29yZGluYXRvckxldmVsREIuaCBcCiAJU291cmNlL1dlYkNvcmUv
TW9kdWxlcy9pbmRleGVkZGIvSURCVHJhbnNhY3Rpb24uY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9JREJUcmFuc2FjdGlvbi5oIFwKKwlTb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9JREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2UuaCBcCiAJU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCVmVyc2lvbkNoYW5nZUV2ZW50LmNwcCBcCiAJ
U291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCVmVyc2lvbkNoYW5nZUV2ZW50Lmgg
XAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0luZGV4ZWREQi5oIFwKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQlRyYW5zYWN0aW9uQmFj
a2VuZEludGVyZmFjZS5oIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCVHJh
bnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uNTc1Y2NkNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
aW5kZXhlZGRiL0lEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZS5oCkBAIC0wLDAgKzEsNjgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZV9o
CisjZGVmaW5lIElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJJ
REJEYXRhYmFzZUJhY2tlbmRJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJJbmRleGVkREIuaCIKKyNp
bmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2lm
IEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IElEQkNhbGxiYWNrczsKK2NsYXNzIElEQkRhdGFiYXNlQ2FsbGJhY2tzOworY2xhc3MgSURCS2V5
OworY2xhc3MgSURCS2V5UmFuZ2U7CisKK3N0cnVjdCBJREJEYXRhYmFzZU1ldGFkYXRhOworc3Ry
dWN0IElEQkluZGV4TWV0YWRhdGE7CitzdHJ1Y3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YTsKKwor
Y2xhc3MgSURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlIDogcHVibGljIFJlZkNvdW50ZWQ8
SURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+
SURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKCkgeyB9CisgICAgCisgICAgdmlydHVhbCB2
b2lkIHNjaGVkdWxlQ3JlYXRlT2JqZWN0U3RvcmVPcGVyYXRpb24oY29uc3QgSURCT2JqZWN0U3Rv
cmVNZXRhZGF0YSYpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVEZWxldGVPYmplY3RT
dG9yZU9wZXJhdGlvbihjb25zdCBJREJPYmplY3RTdG9yZU1ldGFkYXRhJikgPSAwOworICAgIHZp
cnR1YWwgdm9pZCBzY2hlZHVsZVZlcnNpb25DaGFuZ2VPcGVyYXRpb24oaW50NjRfdCB0cmFuc2Fj
dGlvbklkLCBpbnQ2NF90IHJlcXVlc3RlZFZlcnNpb24sIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tz
PiwgUGFzc1JlZlB0cjxJREJEYXRhYmFzZUNhbGxiYWNrcz4sIGNvbnN0IElEQkRhdGFiYXNlTWV0
YWRhdGEmKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlQ3JlYXRlSW5kZXhPcGVyYXRp
b24oaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJJbmRleE1ldGFkYXRhJikgPSAwOwor
ICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZURlbGV0ZUluZGV4T3BlcmF0aW9uKGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgY29uc3QgSURCSW5kZXhNZXRhZGF0YSYpID0gMDsKKyAgICB2aXJ0dWFsIHZv
aWQgc2NoZWR1bGVHZXRPcGVyYXRpb24oY29uc3QgSURCRGF0YWJhc2VNZXRhZGF0YSYsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBQYXNzUmVmUHRyPElEQktleVJhbmdl
PiwgSW5kZXhlZERCOjpDdXJzb3JUeXBlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4pID0gMDsK
KyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVQdXRPcGVyYXRpb24oY29uc3QgSURCT2JqZWN0U3Rv
cmVNZXRhZGF0YSYsIFBhc3NSZWZQdHI8U2hhcmVkQnVmZmVyPiB2YWx1ZSwgUGFzc1JlZlB0cjxJ
REJLZXk+IGtleSwgSURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpQdXRNb2RlLCBQYXNzUmVm
UHRyPElEQkNhbGxiYWNrcz4sIGNvbnN0IFZlY3RvcjxpbnQ2NF90PiYgaW5kZXhJZHMsIGNvbnN0
IFZlY3RvcjxJREJEYXRhYmFzZUJhY2tlbmRJbnRlcmZhY2U6OkluZGV4S2V5cz4mKSA9IDA7Cisg
ICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlU2V0SW5kZXhlc1JlYWR5T3BlcmF0aW9uKHNpemVfdCBp
bmRleENvdW50KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlT3BlbkN1cnNvck9wZXJh
dGlvbihpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgUGFzc1JlZlB0cjxJ
REJLZXlSYW5nZT4sIEluZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uLCBJbmRleGVkREI6OkN1cnNv
clR5cGUsIElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6VGFza1R5cGUsIFBhc3NSZWZQdHI8
SURCQ2FsbGJhY2tzPikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZUNvdW50T3BlcmF0
aW9uKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBQYXNzUmVmUHRyPElE
QktleVJhbmdlPiwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+KSA9IDA7CisgICAgdmlydHVhbCB2
b2lkIHNjaGVkdWxlRGVsZXRlUmFuZ2VPcGVyYXRpb24oaW50NjRfdCBvYmplY3RTdG9yZUlkLCBQ
YXNzUmVmUHRyPElEQktleVJhbmdlPiwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+KSA9IDA7Cisg
ICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlQ2xlYXJPcGVyYXRpb24oaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4pID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQorI2VuZGlmIC8v
IElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZV9oClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg
ZmlsZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxk
Yi9JREJDdXJzb3JCYWNrZW5kTGV2ZWxEQi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2lu
ZGV4ZWRkYi9sZXZlbGRiL0lEQkN1cnNvckJhY2tlbmRMZXZlbERCLmNwcAppbmRleCBiODY3ZTY3
Li5lYzdmMmQzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9s
ZXZlbGRiL0lEQkN1cnNvckJhY2tlbmRMZXZlbERCLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkN1cnNvckJhY2tlbmRMZXZlbERCLmNwcApAQCAt
MzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIklEQkJhY2tpbmdTdG9yZUxldmVsREIuaCIKICNpbmNs
dWRlICJJREJDYWxsYmFja3MuaCIKICNpbmNsdWRlICJJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERC
LmgiCisjaW5jbHVkZSAiSURCRGF0YWJhc2VDYWxsYmFja3MuaCIKICNpbmNsdWRlICJJREJEYXRh
YmFzZUVycm9yLmgiCiAjaW5jbHVkZSAiSURCRGF0YWJhc2VFeGNlcHRpb24uaCIKICNpbmNsdWRl
ICJJREJLZXlSYW5nZS5oIgpAQCAtNDYsNyArNDcsNyBAQCBwdWJsaWM6CiAgICAgewogICAgICAg
ICByZXR1cm4gYWRvcHRQdHIobmV3IEN1cnNvckl0ZXJhdGlvbk9wZXJhdGlvbihjdXJzb3IsIGtl
eSwgY2FsbGJhY2tzKSk7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtKElEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybSgpOwogcHJp
dmF0ZToKICAgICBDdXJzb3JJdGVyYXRpb25PcGVyYXRpb24oUGFzc1JlZlB0cjxJREJDdXJzb3JC
YWNrZW5kTGV2ZWxEQj4gY3Vyc29yLCBQYXNzUmVmUHRyPElEQktleT4ga2V5LCBQYXNzUmVmUHRy
PElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQogICAgICAgICA6IG1fY3Vyc29yKGN1cnNvcikKQEAg
LTY2LDcgKzY3LDcgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5l
dyBDdXJzb3JBZHZhbmNlT3BlcmF0aW9uKGN1cnNvciwgY291bnQsIGNhbGxiYWNrcykpOwogICAg
IH0KLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERC
Kik7CisgICAgdmlydHVhbCB2b2lkIHBlcmZvcm0oKTsKIHByaXZhdGU6CiAgICAgQ3Vyc29yQWR2
YW5jZU9wZXJhdGlvbihQYXNzUmVmUHRyPElEQkN1cnNvckJhY2tlbmRMZXZlbERCPiBjdXJzb3Is
IHVuc2lnbmVkIGxvbmcgY291bnQsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3Mp
CiAgICAgICAgIDogbV9jdXJzb3IoY3Vyc29yKQpAQCAtODYsNyArODcsNyBAQCBwdWJsaWM6CiAg
ICAgewogICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IEN1cnNvclByZWZldGNoSXRlcmF0aW9u
T3BlcmF0aW9uKGN1cnNvciwgbnVtYmVyVG9GZXRjaCwgY2FsbGJhY2tzKSk7CiAgICAgfQotICAg
IHZpcnR1YWwgdm9pZCBwZXJmb3JtKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgcGVyZm9ybSgpOwogcHJpdmF0ZToKICAgICBDdXJzb3JQcmVmZXRjaEl0
ZXJhdGlvbk9wZXJhdGlvbihQYXNzUmVmUHRyPElEQkN1cnNvckJhY2tlbmRMZXZlbERCPiBjdXJz
b3IsIGludCBudW1iZXJUb0ZldGNoLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tz
KQogICAgICAgICA6IG1fY3Vyc29yKGN1cnNvcikKQEAgLTEzMiw3ICsxMzMsNyBAQCB2b2lkIElE
QkN1cnNvckJhY2tlbmRMZXZlbERCOjphZHZhbmNlKHVuc2lnbmVkIGxvbmcgY291bnQsIFBhc3NS
ZWZQdHI8SURCQ2FsbGJhYwogICAgIG1fdHJhbnNhY3Rpb24tPnNjaGVkdWxlVGFzayhDdXJzb3JB
ZHZhbmNlT3BlcmF0aW9uOjpjcmVhdGUodGhpcywgY291bnQsIGNhbGxiYWNrcykpOwogfQogCi12
b2lkIElEQkN1cnNvckJhY2tlbmRMZXZlbERCOjpDdXJzb3JBZHZhbmNlT3BlcmF0aW9uOjpwZXJm
b3JtKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqKQordm9pZCBJREJDdXJzb3JCYWNrZW5k
TGV2ZWxEQjo6Q3Vyc29yQWR2YW5jZU9wZXJhdGlvbjo6cGVyZm9ybSgpCiB7CiAgICAgTE9HKFN0
b3JhZ2VBUEksICJDdXJzb3JBZHZhbmNlT3BlcmF0aW9uIik7CiAgICAgaWYgKCFtX2N1cnNvci0+
bV9jdXJzb3IgfHwgIW1fY3Vyc29yLT5tX2N1cnNvci0+YWR2YW5jZShtX2NvdW50KSkgewpAQCAt
MTQ0LDcgKzE0NSw3IEBAIHZvaWQgSURCQ3Vyc29yQmFja2VuZExldmVsREI6OkN1cnNvckFkdmFu
Y2VPcGVyYXRpb246OnBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrCiAgICAgbV9jYWxsYmFja3Mt
Pm9uU3VjY2VzcyhtX2N1cnNvci0+a2V5KCksIG1fY3Vyc29yLT5wcmltYXJ5S2V5KCksIG1fY3Vy
c29yLT52YWx1ZSgpKTsKIH0KIAotdm9pZCBJREJDdXJzb3JCYWNrZW5kTGV2ZWxEQjo6Q3Vyc29y
SXRlcmF0aW9uT3BlcmF0aW9uOjpwZXJmb3JtKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIq
KQordm9pZCBJREJDdXJzb3JCYWNrZW5kTGV2ZWxEQjo6Q3Vyc29ySXRlcmF0aW9uT3BlcmF0aW9u
OjpwZXJmb3JtKCkKIHsKICAgICBMT0coU3RvcmFnZUFQSSwgIkN1cnNvckl0ZXJhdGlvbk9wZXJh
dGlvbiIpOwogICAgIGlmICghbV9jdXJzb3ItPm1fY3Vyc29yIHx8ICFtX2N1cnNvci0+bV9jdXJz
b3ItPmNvbnRpbnVlRnVuY3Rpb24obV9rZXkuZ2V0KCkpKSB7CkBAIC0xNzEsNyArMTcyLDcgQEAg
dm9pZCBJREJDdXJzb3JCYWNrZW5kTGV2ZWxEQjo6cHJlZmV0Y2hDb250aW51ZShpbnQgbnVtYmVy
VG9GZXRjaCwgUGFzc1JlZlB0cjxJREIKICAgICBtX3RyYW5zYWN0aW9uLT5zY2hlZHVsZVRhc2so
bV90YXNrVHlwZSwgQ3Vyc29yUHJlZmV0Y2hJdGVyYXRpb25PcGVyYXRpb246OmNyZWF0ZSh0aGlz
LCBudW1iZXJUb0ZldGNoLCBjYWxsYmFja3MpKTsKIH0KIAotdm9pZCBJREJDdXJzb3JCYWNrZW5k
TGV2ZWxEQjo6Q3Vyc29yUHJlZmV0Y2hJdGVyYXRpb25PcGVyYXRpb246OnBlcmZvcm0oSURCVHJh
bnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiopCit2b2lkIElEQkN1cnNvckJhY2tlbmRMZXZlbERCOjpD
dXJzb3JQcmVmZXRjaEl0ZXJhdGlvbk9wZXJhdGlvbjo6cGVyZm9ybSgpCiB7CiAgICAgTE9HKFN0
b3JhZ2VBUEksICJDdXJzb3JQcmVmZXRjaEl0ZXJhdGlvbk9wZXJhdGlvbiIpOwogCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkRhdGFiYXNl
QmFja2VuZExldmVsREIuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2
ZWxkYi9JREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCLmNwcAppbmRleCA0Y2ZiZmFkLi5hMDdmYjk0
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lE
QkRhdGFiYXNlQmFja2VuZExldmVsREIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
aW5kZXhlZGRiL2xldmVsZGIvSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQi5jcHAKQEAgLTQyLDQy
OSArNDIsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIENyZWF0ZU9iamVjdFN0
b3JlT3BlcmF0aW9uIDogcHVibGljIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJh
dGlvbiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNr
ZW5kTGV2ZWxEQjo6T3BlcmF0aW9uPiBjcmVhdGUoUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+
IGJhY2tpbmdTdG9yZSwgY29uc3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSYgb2JqZWN0U3RvcmVN
ZXRhZGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgQ3JlYXRlT2JqZWN0
U3RvcmVPcGVyYXRpb24oYmFja2luZ1N0b3JlLCBvYmplY3RTdG9yZU1ldGFkYXRhKSk7Ci0gICAg
fQotICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIq
KTsKLXByaXZhdGU6Ci0gICAgQ3JlYXRlT2JqZWN0U3RvcmVPcGVyYXRpb24oUGFzc1JlZlB0cjxJ
REJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZSwgY29uc3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0
YSYgb2JqZWN0U3RvcmVNZXRhZGF0YSkKLSAgICAgICAgOiBtX2JhY2tpbmdTdG9yZShiYWNraW5n
U3RvcmUpCi0gICAgICAgICwgbV9vYmplY3RTdG9yZU1ldGFkYXRhKG9iamVjdFN0b3JlTWV0YWRh
dGEpCi0gICAgewotICAgIH0KLQotICAgIGNvbnN0IFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IG1f
YmFja2luZ1N0b3JlOwotICAgIGNvbnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEgbV9vYmplY3RT
dG9yZU1ldGFkYXRhOwotfTsKLQotY2xhc3MgRGVsZXRlT2JqZWN0U3RvcmVPcGVyYXRpb24gOiBw
dWJsaWMgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKLXB1YmxpYzoK
LSAgICBzdGF0aWMgUGFzc093blB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVy
YXRpb24+IGNyZWF0ZShQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlLCBj
b25zdCBJREJPYmplY3RTdG9yZU1ldGFkYXRhJiBvYmplY3RTdG9yZU1ldGFkYXRhKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBEZWxldGVPYmplY3RTdG9yZU9wZXJhdGlvbihi
YWNraW5nU3RvcmUsIG9iamVjdFN0b3JlTWV0YWRhdGEpKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2
b2lkIHBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiopOwotcHJpdmF0ZToKLSAg
ICBEZWxldGVPYmplY3RTdG9yZU9wZXJhdGlvbihQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4g
YmFja2luZ1N0b3JlLCBjb25zdCBJREJPYmplY3RTdG9yZU1ldGFkYXRhJiBvYmplY3RTdG9yZU1l
dGFkYXRhKQotICAgICAgICA6IG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKLSAgICAgICAg
LCBtX29iamVjdFN0b3JlTWV0YWRhdGEob2JqZWN0U3RvcmVNZXRhZGF0YSkKLSAgICB7Ci0gICAg
fQotCi0gICAgY29uc3QgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNraW5nU3RvcmU7Ci0g
ICAgY29uc3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSBtX29iamVjdFN0b3JlTWV0YWRhdGE7Ci19
OwotCi1jbGFzcyBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpWZXJzaW9uQ2hhbmdlT3BlcmF0
aW9uIDogcHVibGljIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7Ci1w
dWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
Qjo6T3BlcmF0aW9uPiBjcmVhdGUoUGFzc1JlZlB0cjxJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERC
PiBkYXRhYmFzZSwgaW50NjRfdCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHZlcnNpb24sIFBhc3NS
ZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFBhc3NSZWZQdHI8SURCRGF0YWJhc2VDYWxs
YmFja3M+IGRhdGFiYXNlQ2FsbGJhY2tzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UHRy
KG5ldyBWZXJzaW9uQ2hhbmdlT3BlcmF0aW9uKGRhdGFiYXNlLCB0cmFuc2FjdGlvbklkLCB2ZXJz
aW9uLCBjYWxsYmFja3MsIGRhdGFiYXNlQ2FsbGJhY2tzKSk7Ci0gICAgfQotICAgIHZpcnR1YWwg
dm9pZCBwZXJmb3JtKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqKTsKLXByaXZhdGU6Ci0g
ICAgVmVyc2lvbkNoYW5nZU9wZXJhdGlvbihQYXNzUmVmUHRyPElEQkRhdGFiYXNlQmFja2VuZExl
dmVsREI+IGRhdGFiYXNlLCBpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdmVyc2lvbiwg
UGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcywgUGFzc1JlZlB0cjxJREJEYXRhYmFz
ZUNhbGxiYWNrcz4gZGF0YWJhc2VDYWxsYmFja3MpCi0gICAgICAgIDogbV9kYXRhYmFzZShkYXRh
YmFzZSkKLSAgICAgICAgLCBtX3RyYW5zYWN0aW9uSWQodHJhbnNhY3Rpb25JZCkKLSAgICAgICAg
LCBtX3ZlcnNpb24odmVyc2lvbikKLSAgICAgICAgLCBtX2NhbGxiYWNrcyhjYWxsYmFja3MpCi0g
ICAgICAgICwgbV9kYXRhYmFzZUNhbGxiYWNrcyhkYXRhYmFzZUNhbGxiYWNrcykKLSAgICB7Ci0g
ICAgfQotCi0gICAgUmVmUHRyPElEQkRhdGFiYXNlQmFja2VuZExldmVsREI+IG1fZGF0YWJhc2U7
Ci0gICAgaW50NjRfdCBtX3RyYW5zYWN0aW9uSWQ7Ci0gICAgaW50NjRfdCBtX3ZlcnNpb247Ci0g
ICAgUmVmUHRyPElEQkNhbGxiYWNrcz4gbV9jYWxsYmFja3M7Ci0gICAgUmVmUHRyPElEQkRhdGFi
YXNlQ2FsbGJhY2tzPiBtX2RhdGFiYXNlQ2FsbGJhY2tzOwotfTsKLQotY2xhc3MgQ3JlYXRlT2Jq
ZWN0U3RvcmVBYm9ydE9wZXJhdGlvbiA6IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZl
bERCOjpPcGVyYXRpb24gewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbj4gY3JlYXRlKFBhc3NSZWZQdHI8SURCRGF0
YWJhc2VCYWNrZW5kTGV2ZWxEQj4gZGF0YWJhc2UsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgQ3JlYXRlT2JqZWN0U3RvcmVBYm9ydE9w
ZXJhdGlvbihkYXRhYmFzZSwgb2JqZWN0U3RvcmVJZCkpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZv
aWQgcGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKik7Ci1wcml2YXRlOgotICAg
IENyZWF0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb24oUGFzc1JlZlB0cjxJREJEYXRhYmFzZUJh
Y2tlbmRMZXZlbERCPiBkYXRhYmFzZSwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQotICAgICAgICA6
IG1fZGF0YWJhc2UoZGF0YWJhc2UpCi0gICAgICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0
b3JlSWQpCi0gICAgewotICAgIH0KLQotICAgIGNvbnN0IFJlZlB0cjxJREJEYXRhYmFzZUJhY2tl
bmRMZXZlbERCPiBtX2RhdGFiYXNlOwotICAgIGNvbnN0IGludDY0X3QgbV9vYmplY3RTdG9yZUlk
OwotfTsKLQotY2xhc3MgRGVsZXRlT2JqZWN0U3RvcmVBYm9ydE9wZXJhdGlvbiA6IHB1YmxpYyBJ
REJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24gewotcHVibGljOgotICAgIHN0
YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbj4g
Y3JlYXRlKFBhc3NSZWZQdHI8SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQj4gZGF0YWJhc2UsIGNv
bnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEmIG9iamVjdFN0b3JlKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIGFkb3B0UHRyKG5ldyBEZWxldGVPYmplY3RTdG9yZUFib3J0T3BlcmF0aW9uKGRhdGFi
YXNlLCBvYmplY3RTdG9yZSkpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJREJU
cmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKik7Ci1wcml2YXRlOgotICAgIERlbGV0ZU9iamVjdFN0
b3JlQWJvcnRPcGVyYXRpb24oUGFzc1JlZlB0cjxJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCPiBk
YXRhYmFzZSwgY29uc3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSYgb2JqZWN0U3RvcmVNZXRhZGF0
YSkKLSAgICAgICAgOiBtX2RhdGFiYXNlKGRhdGFiYXNlKQotICAgICAgICAsIG1fb2JqZWN0U3Rv
cmVNZXRhZGF0YShvYmplY3RTdG9yZU1ldGFkYXRhKQotICAgIHsKLSAgICB9Ci0KLSAgICBSZWZQ
dHI8SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQj4gbV9kYXRhYmFzZTsKLSAgICBJREJPYmplY3RT
dG9yZU1ldGFkYXRhIG1fb2JqZWN0U3RvcmVNZXRhZGF0YTsKLX07Ci0KLWNsYXNzIElEQkRhdGFi
YXNlQmFja2VuZExldmVsREI6OlZlcnNpb25DaGFuZ2VBYm9ydE9wZXJhdGlvbiA6IHB1YmxpYyBJ
REJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24gewotcHVibGljOgotICAgIHN0
YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbj4g
Y3JlYXRlKFBhc3NSZWZQdHI8SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQj4gZGF0YWJhc2UsIGNv
bnN0IFN0cmluZyYgcHJldmlvdXNWZXJzaW9uLCBpbnQ2NF90IHByZXZpb3VzSW50VmVyc2lvbikK
LSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgVmVyc2lvbkNoYW5nZUFib3J0T3Bl
cmF0aW9uKGRhdGFiYXNlLCBwcmV2aW91c1ZlcnNpb24sIHByZXZpb3VzSW50VmVyc2lvbikpOwot
ICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZl
bERCKik7Ci1wcml2YXRlOgotICAgIFZlcnNpb25DaGFuZ2VBYm9ydE9wZXJhdGlvbihQYXNzUmVm
UHRyPElEQkRhdGFiYXNlQmFja2VuZExldmVsREI+IGRhdGFiYXNlLCBjb25zdCBTdHJpbmcmIHBy
ZXZpb3VzVmVyc2lvbiwgaW50NjRfdCBwcmV2aW91c0ludFZlcnNpb24pCi0gICAgICAgIDogbV9k
YXRhYmFzZShkYXRhYmFzZSkKLSAgICAgICAgLCBtX3ByZXZpb3VzVmVyc2lvbihwcmV2aW91c1Zl
cnNpb24pCi0gICAgICAgICwgbV9wcmV2aW91c0ludFZlcnNpb24ocHJldmlvdXNJbnRWZXJzaW9u
KQotICAgIHsKLSAgICB9Ci0KLSAgICBSZWZQdHI8SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQj4g
bV9kYXRhYmFzZTsKLSAgICBTdHJpbmcgbV9wcmV2aW91c1ZlcnNpb247Ci0gICAgaW50NjRfdCBt
X3ByZXZpb3VzSW50VmVyc2lvbjsKLX07Ci0KLWNsYXNzIENyZWF0ZUluZGV4T3BlcmF0aW9uIDog
cHVibGljIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7Ci1wdWJsaWM6
Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3Bl
cmF0aW9uPiBjcmVhdGUoUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZSwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJJbmRleE1ldGFkYXRhJiBpbmRleE1ldGFk
YXRhKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBDcmVhdGVJbmRleE9wZXJh
dGlvbihiYWNraW5nU3RvcmUsIG9iamVjdFN0b3JlSWQsIGluZGV4TWV0YWRhdGEpKTsKLSAgICB9
Ci0gICAgdmlydHVhbCB2b2lkIHBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiop
OwotcHJpdmF0ZToKLSAgICBDcmVhdGVJbmRleE9wZXJhdGlvbihQYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZT4gYmFja2luZ1N0b3JlLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQklu
ZGV4TWV0YWRhdGEmIGluZGV4TWV0YWRhdGEpCi0gICAgICAgIDogbV9iYWNraW5nU3RvcmUoYmFj
a2luZ1N0b3JlKQotICAgICAgICAsIG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQotICAg
ICAgICAsIG1faW5kZXhNZXRhZGF0YShpbmRleE1ldGFkYXRhKQotICAgIHsKLSAgICB9Ci0KLSAg
ICBjb25zdCBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9yZTsKLSAgICBjb25z
dCBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICBjb25zdCBJREJJbmRleE1ldGFkYXRhIG1f
aW5kZXhNZXRhZGF0YTsKLX07Ci0KLWNsYXNzIERlbGV0ZUluZGV4T3BlcmF0aW9uIDogcHVibGlj
IElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7Ci1wdWJsaWM6Ci0gICAg
c3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9u
PiBjcmVhdGUoUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZSwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJJbmRleE1ldGFkYXRhJiBpbmRleE1ldGFkYXRhKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBEZWxldGVJbmRleE9wZXJhdGlvbihi
YWNraW5nU3RvcmUsIG9iamVjdFN0b3JlSWQsIGluZGV4TWV0YWRhdGEpKTsKLSAgICB9Ci0gICAg
dmlydHVhbCB2b2lkIHBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiopOwotcHJp
dmF0ZToKLSAgICBEZWxldGVJbmRleE9wZXJhdGlvbihQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9y
ZT4gYmFja2luZ1N0b3JlLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQkluZGV4TWV0
YWRhdGEmIGluZGV4TWV0YWRhdGEpCi0gICAgICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0
b3JlKQotICAgICAgICAsIG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQotICAgICAgICAs
IG1faW5kZXhNZXRhZGF0YShpbmRleE1ldGFkYXRhKQotICAgIHsKLSAgICB9Ci0KLSAgICBjb25z
dCBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9yZTsKLSAgICBjb25zdCBpbnQ2
NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICBjb25zdCBJREJJbmRleE1ldGFkYXRhIG1faW5kZXhN
ZXRhZGF0YTsKLX07Ci0KLWNsYXNzIENyZWF0ZUluZGV4QWJvcnRPcGVyYXRpb24gOiBwdWJsaWMg
SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUGFzc093blB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+
IGNyZWF0ZShQYXNzUmVmUHRyPElEQkRhdGFiYXNlQmFja2VuZExldmVsREI+IGRhdGFiYXNlLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKLSAgICB7Ci0gICAgICAgIHJl
dHVybiBhZG9wdFB0cihuZXcgQ3JlYXRlSW5kZXhBYm9ydE9wZXJhdGlvbihkYXRhYmFzZSwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCkpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJ
REJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKik7Ci1wcml2YXRlOgotICAgIENyZWF0ZUluZGV4
QWJvcnRPcGVyYXRpb24oUGFzc1JlZlB0cjxJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCPiBkYXRh
YmFzZSwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCi0gICAgICAgIDog
bV9kYXRhYmFzZShkYXRhYmFzZSkKLSAgICAgICAgLCBtX29iamVjdFN0b3JlSWQob2JqZWN0U3Rv
cmVJZCkKLSAgICAgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKLSAgICB7Ci0gICAgfQotCi0gICAg
Y29uc3QgUmVmUHRyPElEQkRhdGFiYXNlQmFja2VuZExldmVsREI+IG1fZGF0YWJhc2U7Ci0gICAg
Y29uc3QgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0gICAgY29uc3QgaW50NjRfdCBtX2luZGV4
SWQ7Ci19OwotCi1jbGFzcyBEZWxldGVJbmRleEFib3J0T3BlcmF0aW9uIDogcHVibGljIElEQlRy
YW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGlj
IFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uPiBjcmVh
dGUoUGFzc1JlZlB0cjxJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCPiBkYXRhYmFzZSwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJJbmRleE1ldGFkYXRhJiBpbmRleE1ldGFkYXRhKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBEZWxldGVJbmRleEFib3J0T3BlcmF0
aW9uKGRhdGFiYXNlLCBvYmplY3RTdG9yZUlkLCBpbmRleE1ldGFkYXRhKSk7Ci0gICAgfQotICAg
IHZpcnR1YWwgdm9pZCBwZXJmb3JtKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqKTsKLXBy
aXZhdGU6Ci0gICAgRGVsZXRlSW5kZXhBYm9ydE9wZXJhdGlvbihQYXNzUmVmUHRyPElEQkRhdGFi
YXNlQmFja2VuZExldmVsREI+IGRhdGFiYXNlLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0
IElEQkluZGV4TWV0YWRhdGEmIGluZGV4TWV0YWRhdGEpCi0gICAgICAgIDogbV9kYXRhYmFzZShk
YXRhYmFzZSkKLSAgICAgICAgLCBtX29iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkKLSAgICAg
ICAgLCBtX2luZGV4TWV0YWRhdGEoaW5kZXhNZXRhZGF0YSkKLSAgICB7Ci0gICAgfQotCi0gICAg
Y29uc3QgUmVmUHRyPElEQkRhdGFiYXNlQmFja2VuZExldmVsREI+IG1fZGF0YWJhc2U7Ci0gICAg
Y29uc3QgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0gICAgY29uc3QgSURCSW5kZXhNZXRhZGF0
YSBtX2luZGV4TWV0YWRhdGE7Ci19OwotCi1jbGFzcyBHZXRPcGVyYXRpb24gOiBwdWJsaWMgSURC
VHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKLXB1YmxpYzoKLSAgICBzdGF0
aWMgUGFzc093blB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNy
ZWF0ZShQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlLCBjb25zdCBJREJE
YXRhYmFzZU1ldGFkYXRhJiBtZXRhZGF0YSwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBJbmRleGVkREI6OkN1
cnNvclR5cGUgY3Vyc29yVHlwZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykK
LSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgR2V0T3BlcmF0aW9uKGJhY2tpbmdT
dG9yZSwgbWV0YWRhdGEsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleVJhbmdlLCBjdXJzb3JU
eXBlLCBjYWxsYmFja3MpKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIHBlcmZvcm0oSURCVHJh
bnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiopOwotcHJpdmF0ZToKLSAgICBHZXRPcGVyYXRpb24oUGFz
c1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZSwgY29uc3QgSURCRGF0YWJhc2VN
ZXRhZGF0YSYgbWV0YWRhdGEsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiBrZXlSYW5nZSwgSW5kZXhlZERCOjpDdXJzb3JUeXBl
IGN1cnNvclR5cGUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCi0gICAgICAg
IDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQotICAgICAgICAsIG1fZGF0YWJhc2VJZCht
ZXRhZGF0YS5pZCkKLSAgICAgICAgLCBtX29iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkKLSAg
ICAgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKLSAgICAgICAgLCBtX2tleVBhdGgobWV0YWRhdGEu
b2JqZWN0U3RvcmVzLmdldChvYmplY3RTdG9yZUlkKS5rZXlQYXRoKQotICAgICAgICAsIG1fYXV0
b0luY3JlbWVudChtZXRhZGF0YS5vYmplY3RTdG9yZXMuZ2V0KG9iamVjdFN0b3JlSWQpLmF1dG9J
bmNyZW1lbnQpCi0gICAgICAgICwgbV9rZXlSYW5nZShrZXlSYW5nZSkKLSAgICAgICAgLCBtX2N1
cnNvclR5cGUoY3Vyc29yVHlwZSkKLSAgICAgICAgLCBtX2NhbGxiYWNrcyhjYWxsYmFja3MpCi0g
ICAgewotICAgICAgICBBU1NFUlQobWV0YWRhdGEub2JqZWN0U3RvcmVzLmNvbnRhaW5zKG9iamVj
dFN0b3JlSWQpKTsKLSAgICAgICAgQVNTRVJUKG1ldGFkYXRhLm9iamVjdFN0b3Jlcy5nZXQob2Jq
ZWN0U3RvcmVJZCkuaWQgPT0gb2JqZWN0U3RvcmVJZCk7Ci0gICAgfQotCi0gICAgY29uc3QgUmVm
UHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNraW5nU3RvcmU7Ci0gICAgY29uc3QgaW50NjRfdCBt
X2RhdGFiYXNlSWQ7Ci0gICAgY29uc3QgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0gICAgY29u
c3QgaW50NjRfdCBtX2luZGV4SWQ7Ci0gICAgY29uc3QgSURCS2V5UGF0aCBtX2tleVBhdGg7Ci0g
ICAgY29uc3QgYm9vbCBtX2F1dG9JbmNyZW1lbnQ7Ci0gICAgY29uc3QgUmVmUHRyPElEQktleVJh
bmdlPiBtX2tleVJhbmdlOwotICAgIGNvbnN0IEluZGV4ZWREQjo6Q3Vyc29yVHlwZSBtX2N1cnNv
clR5cGU7Ci0gICAgY29uc3QgUmVmUHRyPElEQkNhbGxiYWNrcz4gbV9jYWxsYmFja3M7Ci19Owot
Ci1jbGFzcyBQdXRPcGVyYXRpb24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
Qjo6T3BlcmF0aW9uIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093blB0cjxJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNyZWF0ZShQYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZT4gYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IElEQk9iamVj
dFN0b3JlTWV0YWRhdGEmIG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gdmFs
dWUsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6
UHV0TW9kZSBwdXRNb2RlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzLCBjb25z
dCBWZWN0b3I8aW50NjRfdD4mIGluZGV4SWRzLCBjb25zdCBWZWN0b3I8SURCRGF0YWJhc2VCYWNr
ZW5kSW50ZXJmYWNlOjpJbmRleEtleXM+JiBpbmRleEtleXMpCi0gICAgewotICAgICAgICByZXR1
cm4gYWRvcHRQdHIobmV3IFB1dE9wZXJhdGlvbihiYWNraW5nU3RvcmUsIGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlLCB2YWx1ZSwga2V5LCBwdXRNb2RlLCBjYWxsYmFja3MsIGluZGV4SWRzLCBpbmRl
eEtleXMpKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIHBlcmZvcm0oSURCVHJhbnNhY3Rpb25C
YWNrZW5kTGV2ZWxEQiopOwotcHJpdmF0ZToKLSAgICBQdXRPcGVyYXRpb24oUGFzc1JlZlB0cjxJ
REJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBJ
REJPYmplY3RTdG9yZU1ldGFkYXRhJiBvYmplY3RTdG9yZSwgUGFzc1JlZlB0cjxTaGFyZWRCdWZm
ZXI+JiB2YWx1ZSwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSwgSURCRGF0YWJhc2VCYWNrZW5kSW50
ZXJmYWNlOjpQdXRNb2RlIHB1dE1vZGUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFj
a3MsIGNvbnN0IFZlY3RvcjxpbnQ2NF90PiYgaW5kZXhJZHMsIGNvbnN0IFZlY3RvcjxJREJEYXRh
YmFzZUJhY2tlbmRJbnRlcmZhY2U6OkluZGV4S2V5cz4mIGluZGV4S2V5cykKLSAgICAgICAgOiBt
X2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCi0gICAgICAgICwgbV9kYXRhYmFzZUlkKGRhdGFi
YXNlSWQpCi0gICAgICAgICwgbV9vYmplY3RTdG9yZShvYmplY3RTdG9yZSkKLSAgICAgICAgLCBt
X3ZhbHVlKHZhbHVlKQotICAgICAgICAsIG1fa2V5KGtleSkKLSAgICAgICAgLCBtX3B1dE1vZGUo
cHV0TW9kZSkKLSAgICAgICAgLCBtX2NhbGxiYWNrcyhjYWxsYmFja3MpCi0gICAgICAgICwgbV9p
bmRleElkcyhpbmRleElkcykKLSAgICAgICAgLCBtX2luZGV4S2V5cyhpbmRleEtleXMpCi0gICAg
ewotICAgIH0KLQotICAgIGNvbnN0IFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IG1fYmFja2luZ1N0
b3JlOwotICAgIGNvbnN0IGludDY0X3QgbV9kYXRhYmFzZUlkOwotICAgIGNvbnN0IElEQk9iamVj
dFN0b3JlTWV0YWRhdGEgbV9vYmplY3RTdG9yZTsKLSAgICBjb25zdCBSZWZQdHI8U2hhcmVkQnVm
ZmVyPiBtX3ZhbHVlOwotICAgIGNvbnN0IFJlZlB0cjxJREJLZXk+IG1fa2V5OwotICAgIGNvbnN0
IElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6UHV0TW9kZSBtX3B1dE1vZGU7Ci0gICAgY29u
c3QgUmVmUHRyPElEQkNhbGxiYWNrcz4gbV9jYWxsYmFja3M7Ci0gICAgY29uc3QgVmVjdG9yPGlu
dDY0X3Q+IG1faW5kZXhJZHM7Ci0gICAgY29uc3QgVmVjdG9yPElEQkRhdGFiYXNlQmFja2VuZElu
dGVyZmFjZTo6SW5kZXhLZXlzPiBtX2luZGV4S2V5czsKLX07Ci0KLWNsYXNzIFNldEluZGV4ZXNS
ZWFkeU9wZXJhdGlvbiA6IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVy
YXRpb24gewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0aW9uQmFj
a2VuZExldmVsREI6Ok9wZXJhdGlvbj4gY3JlYXRlKHNpemVfdCBpbmRleENvdW50KQotICAgIHsK
LSAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBTZXRJbmRleGVzUmVhZHlPcGVyYXRpb24oaW5k
ZXhDb3VudCkpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJREJUcmFuc2FjdGlv
bkJhY2tlbmRMZXZlbERCKik7Ci1wcml2YXRlOgotICAgIFNldEluZGV4ZXNSZWFkeU9wZXJhdGlv
bihzaXplX3QgaW5kZXhDb3VudCkKLSAgICAgICAgOiBtX2luZGV4Q291bnQoaW5kZXhDb3VudCkK
LSAgICB7Ci0gICAgfQotCi0gICAgY29uc3Qgc2l6ZV90IG1faW5kZXhDb3VudDsKLX07Ci0KLWNs
YXNzIE9wZW5DdXJzb3JPcGVyYXRpb24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2
ZWxEQjo6T3BlcmF0aW9uIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093blB0cjxJREJUcmFu
c2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNyZWF0ZShQYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiBrZXlS
YW5nZSwgSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb24gZGlyZWN0aW9uLCBJbmRleGVkREI6OkN1
cnNvclR5cGUgY3Vyc29yVHlwZSwgSURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpUYXNrVHlw
ZSB0YXNrVHlwZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykKLSAgICB7Ci0g
ICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgT3BlbkN1cnNvck9wZXJhdGlvbihiYWNraW5nU3Rv
cmUsIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleVJhbmdlLCBkaXJlY3Rp
b24sIGN1cnNvclR5cGUsIHRhc2tUeXBlLCBjYWxsYmFja3MpKTsKLSAgICB9Ci0gICAgdmlydHVh
bCB2b2lkIHBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiopOwotcHJpdmF0ZToK
LSAgICBPcGVuQ3Vyc29yT3BlcmF0aW9uKFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBiYWNr
aW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IGluZGV4SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBJbmRleGVkREI6
OkN1cnNvckRpcmVjdGlvbiBkaXJlY3Rpb24sIEluZGV4ZWREQjo6Q3Vyc29yVHlwZSBjdXJzb3JU
eXBlLCBJREJEYXRhYmFzZUJhY2tlbmRJbnRlcmZhY2U6OlRhc2tUeXBlIHRhc2tUeXBlLCBQYXNz
UmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQotICAgICAgICA6IG1fYmFja2luZ1N0b3Jl
KGJhY2tpbmdTdG9yZSkKLSAgICAgICAgLCBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKLSAgICAg
ICAgLCBtX29iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkKLSAgICAgICAgLCBtX2luZGV4SWQo
aW5kZXhJZCkKLSAgICAgICAgLCBtX2tleVJhbmdlKGtleVJhbmdlKQotICAgICAgICAsIG1fZGly
ZWN0aW9uKGRpcmVjdGlvbikKLSAgICAgICAgLCBtX2N1cnNvclR5cGUoY3Vyc29yVHlwZSkKLSAg
ICAgICAgLCBtX3Rhc2tUeXBlKHRhc2tUeXBlKQotICAgICAgICAsIG1fY2FsbGJhY2tzKGNhbGxi
YWNrcykKLSAgICB7Ci0gICAgfQotCi0gICAgY29uc3QgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4g
bV9iYWNraW5nU3RvcmU7Ci0gICAgY29uc3QgaW50NjRfdCBtX2RhdGFiYXNlSWQ7Ci0gICAgY29u
c3QgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0gICAgY29uc3QgaW50NjRfdCBtX2luZGV4SWQ7
Ci0gICAgY29uc3QgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4gbV9rZXlSYW5nZTsKLSAgICBjb25z
dCBJbmRleGVkREI6OkN1cnNvckRpcmVjdGlvbiBtX2RpcmVjdGlvbjsKLSAgICBjb25zdCBJbmRl
eGVkREI6OkN1cnNvclR5cGUgbV9jdXJzb3JUeXBlOwotICAgIGNvbnN0IElEQkRhdGFiYXNlQmFj
a2VuZEludGVyZmFjZTo6VGFza1R5cGUgbV90YXNrVHlwZTsKLSAgICBjb25zdCBSZWZQdHI8SURC
Q2FsbGJhY2tzPiBtX2NhbGxiYWNrczsKLX07Ci0KLWNsYXNzIENvdW50T3BlcmF0aW9uIDogcHVi
bGljIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7Ci1wdWJsaWM6Ci0g
ICAgc3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0
aW9uPiBjcmVhdGUoUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZSwgaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
UGFzc1JlZlB0cjxJREJLZXlSYW5nZT4ga2V5UmFuZ2UsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tz
PiBjYWxsYmFja3MpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IENvdW50T3Bl
cmF0aW9uKGJhY2tpbmdTdG9yZSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwg
a2V5UmFuZ2UsIGNhbGxiYWNrcykpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJ
REJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKik7Ci1wcml2YXRlOgotICAgIENvdW50T3BlcmF0
aW9uKFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIFBhc3NSZWZQ
dHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJh
Y2tzKQotICAgICAgICA6IG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKLSAgICAgICAgLCBt
X2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKLSAgICAgICAgLCBtX29iamVjdFN0b3JlSWQob2JqZWN0
U3RvcmVJZCkKLSAgICAgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKLSAgICAgICAgLCBtX2tleVJh
bmdlKGtleVJhbmdlKQotICAgICAgICAsIG1fY2FsbGJhY2tzKGNhbGxiYWNrcykKLSAgICB7Ci0g
ICAgfQotCi0gICAgY29uc3QgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNraW5nU3RvcmU7
Ci0gICAgY29uc3QgaW50NjRfdCBtX2RhdGFiYXNlSWQ7Ci0gICAgY29uc3QgaW50NjRfdCBtX29i
amVjdFN0b3JlSWQ7Ci0gICAgY29uc3QgaW50NjRfdCBtX2luZGV4SWQ7Ci0gICAgY29uc3QgUmVm
UHRyPElEQktleVJhbmdlPiBtX2tleVJhbmdlOwotICAgIGNvbnN0IFJlZlB0cjxJREJDYWxsYmFj
a3M+IG1fY2FsbGJhY2tzOwotfTsKLQotY2xhc3MgRGVsZXRlUmFuZ2VPcGVyYXRpb24gOiBwdWJs
aWMgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKLXB1YmxpYzoKLSAg
ICBzdGF0aWMgUGFzc093blB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRp
b24+IGNyZWF0ZShQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlLCBpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgUGFzc1JlZlB0cjxJREJLZXlS
YW5nZT4ga2V5UmFuZ2UsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCi0gICAg
ewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IERlbGV0ZVJhbmdlT3BlcmF0aW9uKGJhY2tp
bmdTdG9yZSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwga2V5UmFuZ2UsIGNhbGxiYWNrcykp
OwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tlbmRM
ZXZlbERCKik7Ci1wcml2YXRlOgotICAgIERlbGV0ZVJhbmdlT3BlcmF0aW9uKFBhc3NSZWZQdHI8
SURCQmFja2luZ1N0b3JlPiBiYWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiBrZXlSYW5nZSwgUGFzc1Jl
ZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykKLSAgICAgICAgOiBtX2JhY2tpbmdTdG9yZShi
YWNraW5nU3RvcmUpCi0gICAgICAgICwgbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCi0gICAgICAg
ICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCi0gICAgICAgICwgbV9rZXlSYW5nZShr
ZXlSYW5nZSkKLSAgICAgICAgLCBtX2NhbGxiYWNrcyhjYWxsYmFja3MpCi0gICAgewotICAgIH0K
LQotICAgIGNvbnN0IFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IG1fYmFja2luZ1N0b3JlOwotICAg
IGNvbnN0IGludDY0X3QgbV9kYXRhYmFzZUlkOwotICAgIGNvbnN0IGludDY0X3QgbV9vYmplY3RT
dG9yZUlkOwotICAgIGNvbnN0IFJlZlB0cjxJREJLZXlSYW5nZT4gbV9rZXlSYW5nZTsKLSAgICBj
b25zdCBSZWZQdHI8SURCQ2FsbGJhY2tzPiBtX2NhbGxiYWNrczsKLX07Ci0KLWNsYXNzIENsZWFy
T3BlcmF0aW9uIDogcHVibGljIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlv
biB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5k
TGV2ZWxEQjo6T3BlcmF0aW9uPiBjcmVhdGUoUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGJh
Y2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFBh
c3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCi0gICAgewotICAgICAgICByZXR1cm4g
YWRvcHRQdHIobmV3IENsZWFyT3BlcmF0aW9uKGJhY2tpbmdTdG9yZSwgZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgY2FsbGJhY2tzKSk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBwZXJmb3Jt
KElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqKTsKLXByaXZhdGU6Ci0gICAgQ2xlYXJPcGVy
YXRpb24oUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGJhY2tpbmdTdG9yZSwgaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tz
PiBjYWxsYmFja3MpCi0gICAgICAgIDogbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQotICAg
ICAgICAsIG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQotICAgICAgICAsIG1fb2JqZWN0U3RvcmVJ
ZChvYmplY3RTdG9yZUlkKQotICAgICAgICAsIG1fY2FsbGJhY2tzKGNhbGxiYWNrcykKLSAgICB7
Ci0gICAgfQotCi0gICAgY29uc3QgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNraW5nU3Rv
cmU7Ci0gICAgY29uc3QgaW50NjRfdCBtX2RhdGFiYXNlSWQ7Ci0gICAgY29uc3QgaW50NjRfdCBt
X29iamVjdFN0b3JlSWQ7Ci0gICAgY29uc3QgUmVmUHRyPElEQkNhbGxiYWNrcz4gbV9jYWxsYmFj
a3M7Ci19OwotCi1jbGFzcyBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpQZW5kaW5nT3BlbkNh
bGwgewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzT3duUHRyPFBlbmRpbmdPcGVuQ2FsbD4gY3Jl
YXRlKFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFBhc3NSZWZQdHI8SURCRGF0
YWJhc2VDYWxsYmFja3M+IGRhdGFiYXNlQ2FsbGJhY2tzLCBpbnQ2NF90IHRyYW5zYWN0aW9uSWQs
IGludDY0X3QgdmVyc2lvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgUGVu
ZGluZ09wZW5DYWxsKGNhbGxiYWNrcywgZGF0YWJhc2VDYWxsYmFja3MsIHRyYW5zYWN0aW9uSWQs
IHZlcnNpb24pKTsKLSAgICB9Ci0gICAgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNr
cygpIHsgcmV0dXJuIG1fY2FsbGJhY2tzOyB9Ci0gICAgUGFzc1JlZlB0cjxJREJEYXRhYmFzZUNh
bGxiYWNrcz4gZGF0YWJhc2VDYWxsYmFja3MoKSB7IHJldHVybiBtX2RhdGFiYXNlQ2FsbGJhY2tz
OyB9Ci0gICAgaW50NjRfdCB2ZXJzaW9uKCkgeyByZXR1cm4gbV92ZXJzaW9uOyB9Ci0gICAgaW50
NjRfdCB0cmFuc2FjdGlvbklkKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc2FjdGlvbklkOyB9Ci0K
LXByaXZhdGU6Ci0gICAgUGVuZGluZ09wZW5DYWxsKFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBj
YWxsYmFja3MsIFBhc3NSZWZQdHI8SURCRGF0YWJhc2VDYWxsYmFja3M+IGRhdGFiYXNlQ2FsbGJh
Y2tzLCBpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdmVyc2lvbikKLSAgICAgICAgOiBt
X2NhbGxiYWNrcyhjYWxsYmFja3MpCi0gICAgICAgICwgbV9kYXRhYmFzZUNhbGxiYWNrcyhkYXRh
YmFzZUNhbGxiYWNrcykKLSAgICAgICAgLCBtX3ZlcnNpb24odmVyc2lvbikKLSAgICAgICAgLCBt
X3RyYW5zYWN0aW9uSWQodHJhbnNhY3Rpb25JZCkKLSAgICB7Ci0gICAgfQotICAgIFJlZlB0cjxJ
REJDYWxsYmFja3M+IG1fY2FsbGJhY2tzOwotICAgIFJlZlB0cjxJREJEYXRhYmFzZUNhbGxiYWNr
cz4gbV9kYXRhYmFzZUNhbGxiYWNrczsKLSAgICBpbnQ2NF90IG1fdmVyc2lvbjsKLSAgICBjb25z
dCBpbnQ2NF90IG1fdHJhbnNhY3Rpb25JZDsKLX07Ci0KLWNsYXNzIElEQkRhdGFiYXNlQmFja2Vu
ZExldmVsREI6OlBlbmRpbmdEZWxldGVDYWxsIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093
blB0cjxQZW5kaW5nRGVsZXRlQ2FsbD4gY3JlYXRlKFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBj
YWxsYmFja3MpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBlbmRpbmdEZWxl
dGVDYWxsKGNhbGxiYWNrcykpOwotICAgIH0KLSAgICBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4g
Y2FsbGJhY2tzKCkgeyByZXR1cm4gbV9jYWxsYmFja3M7IH0KLQotcHJpdmF0ZToKLSAgICBQZW5k
aW5nRGVsZXRlQ2FsbChQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQotICAgICAg
ICA6IG1fY2FsbGJhY2tzKGNhbGxiYWNrcykKLSAgICB7Ci0gICAgfQotICAgIFJlZlB0cjxJREJD
YWxsYmFja3M+IG1fY2FsbGJhY2tzOwotfTsKLQogUGFzc1JlZlB0cjxJREJEYXRhYmFzZUJhY2tl
bmRMZXZlbERCPiBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpjcmVhdGUoY29uc3QgU3RyaW5n
JiBuYW1lLCBJREJCYWNraW5nU3RvcmUqIGRhdGFiYXNlLCBJREJGYWN0b3J5QmFja2VuZExldmVs
REIqIGZhY3RvcnksIGNvbnN0IFN0cmluZyYgdW5pcXVlSWRlbnRpZmllcikKIHsKICAgICBSZWZQ
dHI8SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQj4gYmFja2VuZCA9IGFkb3B0UmVmKG5ldyBJREJE
YXRhYmFzZUJhY2tlbmRMZXZlbERCKG5hbWUsIGRhdGFiYXNlLCBmYWN0b3J5LCB1bmlxdWVJZGVu
dGlmaWVyKSk7CkBAIC01NTcsMjEgKzEzNCwxMCBAQCB2b2lkIElEQkRhdGFiYXNlQmFja2VuZExl
dmVsREI6OmNyZWF0ZU9iamVjdFN0b3JlKGludDY0X3QgdHJhbnNhY3Rpb25JZCwgaW50NjRfdAog
ICAgIEFTU0VSVCghbV9tZXRhZGF0YS5vYmplY3RTdG9yZXMuY29udGFpbnMob2JqZWN0U3RvcmVJ
ZCkpOwogICAgIElEQk9iamVjdFN0b3JlTWV0YWRhdGEgb2JqZWN0U3RvcmVNZXRhZGF0YShuYW1l
LCBvYmplY3RTdG9yZUlkLCBrZXlQYXRoLCBhdXRvSW5jcmVtZW50LCBJREJEYXRhYmFzZUJhY2tl
bmRJbnRlcmZhY2U6Ok1pbmltdW1JbmRleElkKTsKIAotICAgIHRyYW5zYWN0aW9uLT5zY2hlZHVs
ZVRhc2soQ3JlYXRlT2JqZWN0U3RvcmVPcGVyYXRpb246OmNyZWF0ZShtX2JhY2tpbmdTdG9yZSwg
b2JqZWN0U3RvcmVNZXRhZGF0YSksIENyZWF0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb246OmNy
ZWF0ZSh0aGlzLCBvYmplY3RTdG9yZUlkKSk7Ci0KKyAgICB0cmFuc2FjdGlvbi0+c2NoZWR1bGVD
cmVhdGVPYmplY3RTdG9yZU9wZXJhdGlvbihvYmplY3RTdG9yZU1ldGFkYXRhKTsKICAgICBhZGRP
YmplY3RTdG9yZShvYmplY3RTdG9yZU1ldGFkYXRhLCBvYmplY3RTdG9yZUlkKTsKIH0KIAotdm9p
ZCBDcmVhdGVPYmplY3RTdG9yZU9wZXJhdGlvbjo6cGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXZlbERCKiB0cmFuc2FjdGlvbikKLXsKLSAgICBMT0coU3RvcmFnZUFQSSwgIkNyZWF0ZU9i
amVjdFN0b3JlT3BlcmF0aW9uIik7Ci0gICAgaWYgKCFtX2JhY2tpbmdTdG9yZS0+Y3JlYXRlT2Jq
ZWN0U3RvcmUodHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIHRyYW5zYWN0
aW9uLT5kYXRhYmFzZSgpLT5pZCgpLCBtX29iamVjdFN0b3JlTWV0YWRhdGEuaWQsIG1fb2JqZWN0
U3RvcmVNZXRhZGF0YS5uYW1lLCBtX29iamVjdFN0b3JlTWV0YWRhdGEua2V5UGF0aCwgbV9vYmpl
Y3RTdG9yZU1ldGFkYXRhLmF1dG9JbmNyZW1lbnQpKSB7Ci0gICAgICAgIFJlZlB0cjxJREJEYXRh
YmFzZUVycm9yPiBlcnJvciA9IElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4
Y2VwdGlvbjo6VW5rbm93bkVycm9yLCBTdHJpbmc6OmZvcm1hdCgiSW50ZXJuYWwgZXJyb3IgY3Jl
YXRpbmcgb2JqZWN0IHN0b3JlICclcycuIiwgbV9vYmplY3RTdG9yZU1ldGFkYXRhLm5hbWUudXRm
OCgpLmRhdGEoKSkpOwotICAgICAgICB0cmFuc2FjdGlvbi0+YWJvcnQoZXJyb3IucmVsZWFzZSgp
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQogdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRM
ZXZlbERCOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCkKIHsKICAgICBMT0coU3RvcmFnZUFQSSwgIklEQkRhdGFiYXNlQmFja2Vu
ZExldmVsREI6OmRlbGV0ZU9iamVjdFN0b3JlIik7CkBAIC01ODMsNyArMTQ5LDcgQEAgdm9pZCBJ
REJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpkZWxldGVPYmplY3RTdG9yZShpbnQ2NF90IHRyYW5z
YWN0aW9uSWQsIGludDY0X3QKICAgICBBU1NFUlQobV9tZXRhZGF0YS5vYmplY3RTdG9yZXMuY29u
dGFpbnMob2JqZWN0U3RvcmVJZCkpOwogICAgIGNvbnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEm
IG9iamVjdFN0b3JlTWV0YWRhdGEgPSBtX21ldGFkYXRhLm9iamVjdFN0b3Jlcy5nZXQob2JqZWN0
U3RvcmVJZCk7CiAKLSAgICB0cmFuc2FjdGlvbi0+c2NoZWR1bGVUYXNrKERlbGV0ZU9iamVjdFN0
b3JlT3BlcmF0aW9uOjpjcmVhdGUobV9iYWNraW5nU3RvcmUsIG9iamVjdFN0b3JlTWV0YWRhdGEp
LCAgRGVsZXRlT2JqZWN0U3RvcmVBYm9ydE9wZXJhdGlvbjo6Y3JlYXRlKHRoaXMsIG9iamVjdFN0
b3JlTWV0YWRhdGEpKTsKKyAgICB0cmFuc2FjdGlvbi0+c2NoZWR1bGVEZWxldGVPYmplY3RTdG9y
ZU9wZXJhdGlvbihvYmplY3RTdG9yZU1ldGFkYXRhKTsKICAgICByZW1vdmVPYmplY3RTdG9yZShv
YmplY3RTdG9yZUlkKTsKIH0KIApAQCAtNjAxLDI3ICsxNjcsMTEgQEAgdm9pZCBJREJEYXRhYmFz
ZUJhY2tlbmRMZXZlbERCOjpjcmVhdGVJbmRleChpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0
X3Qgb2JqZWMKICAgICBBU1NFUlQoIW9iamVjdFN0b3JlLmluZGV4ZXMuY29udGFpbnMoaW5kZXhJ
ZCkpOwogICAgIGNvbnN0IElEQkluZGV4TWV0YWRhdGEgaW5kZXhNZXRhZGF0YShuYW1lLCBpbmRl
eElkLCBrZXlQYXRoLCB1bmlxdWUsIG11bHRpRW50cnkpOwogCi0gICAgdHJhbnNhY3Rpb24tPnNj
aGVkdWxlVGFzayhDcmVhdGVJbmRleE9wZXJhdGlvbjo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLCBv
YmplY3RTdG9yZUlkLCBpbmRleE1ldGFkYXRhKSwgQ3JlYXRlSW5kZXhBYm9ydE9wZXJhdGlvbjo6
Y3JlYXRlKHRoaXMsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpKTsKKyAgICB0cmFuc2FjdGlvbi0+
c2NoZWR1bGVDcmVhdGVJbmRleE9wZXJhdGlvbihvYmplY3RTdG9yZUlkLCBpbmRleE1ldGFkYXRh
KTsKIAogICAgIGFkZEluZGV4KG9iamVjdFN0b3JlSWQsIGluZGV4TWV0YWRhdGEsIGluZGV4SWQp
OwogfQogCi12b2lkIENyZWF0ZUluZGV4T3BlcmF0aW9uOjpwZXJmb3JtKElEQlRyYW5zYWN0aW9u
QmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uKQotewotICAgIExPRyhTdG9yYWdlQVBJLCAiQ3Jl
YXRlSW5kZXhPcGVyYXRpb24iKTsKLSAgICBpZiAoIW1fYmFja2luZ1N0b3JlLT5jcmVhdGVJbmRl
eCh0cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgdHJhbnNhY3Rpb24tPmRh
dGFiYXNlKCktPmlkKCksIG1fb2JqZWN0U3RvcmVJZCwgbV9pbmRleE1ldGFkYXRhLmlkLCBtX2lu
ZGV4TWV0YWRhdGEubmFtZSwgbV9pbmRleE1ldGFkYXRhLmtleVBhdGgsIG1faW5kZXhNZXRhZGF0
YS51bmlxdWUsIG1faW5kZXhNZXRhZGF0YS5tdWx0aUVudHJ5KSkgewotICAgICAgICB0cmFuc2Fj
dGlvbi0+YWJvcnQoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9u
OjpVbmtub3duRXJyb3IsIFN0cmluZzo6Zm9ybWF0KCJJbnRlcm5hbCBlcnJvciB3aGVuIHRyeWlu
ZyB0byBjcmVhdGUgaW5kZXggJyVzJy4iLCBtX2luZGV4TWV0YWRhdGEubmFtZS51dGY4KCkuZGF0
YSgpKSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi12b2lkIENyZWF0ZUluZGV4QWJv
cnRPcGVyYXRpb246OnBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNh
Y3Rpb24pCi17Ci0gICAgTE9HKFN0b3JhZ2VBUEksICJDcmVhdGVJbmRleEFib3J0T3BlcmF0aW9u
Iik7Ci0gICAgQVNTRVJUX1VOVVNFRCh0cmFuc2FjdGlvbiwgIXRyYW5zYWN0aW9uKTsKLSAgICBt
X2RhdGFiYXNlLT5yZW1vdmVJbmRleChtX29iamVjdFN0b3JlSWQsIG1faW5kZXhJZCk7Ci19Ci0K
IHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6ZGVsZXRlSW5kZXgoaW50NjRfdCB0cmFu
c2FjdGlvbklkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKIHsKICAg
ICBMT0coU3RvcmFnZUFQSSwgIklEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OmRlbGV0ZUluZGV4
Iik7CkBAIC02MzYsMjggKzE4NiwxMSBAQCB2b2lkIElEQkRhdGFiYXNlQmFja2VuZExldmVsREI6
OmRlbGV0ZUluZGV4KGludDY0X3QgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCBvYmplYwogICAgIEFT
U0VSVChvYmplY3RTdG9yZS5pbmRleGVzLmNvbnRhaW5zKGluZGV4SWQpKTsKICAgICBjb25zdCBJ
REJJbmRleE1ldGFkYXRhJiBpbmRleE1ldGFkYXRhID0gb2JqZWN0U3RvcmUuaW5kZXhlcy5nZXQo
aW5kZXhJZCk7CiAKLSAgICB0cmFuc2FjdGlvbi0+c2NoZWR1bGVUYXNrKERlbGV0ZUluZGV4T3Bl
cmF0aW9uOjpjcmVhdGUobV9iYWNraW5nU3RvcmUsIG9iamVjdFN0b3JlSWQsIGluZGV4TWV0YWRh
dGEpLCBEZWxldGVJbmRleEFib3J0T3BlcmF0aW9uOjpjcmVhdGUodGhpcywgb2JqZWN0U3RvcmVJ
ZCwgaW5kZXhNZXRhZGF0YSkpOworICAgIHRyYW5zYWN0aW9uLT5zY2hlZHVsZURlbGV0ZUluZGV4
T3BlcmF0aW9uKG9iamVjdFN0b3JlSWQsIGluZGV4TWV0YWRhdGEpOwogCiAgICAgcmVtb3ZlSW5k
ZXgob2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CiB9CiAKLXZvaWQgRGVsZXRlSW5kZXhPcGVyYXRp
b246OnBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24pCi17
Ci0gICAgTE9HKFN0b3JhZ2VBUEksICJEZWxldGVJbmRleE9wZXJhdGlvbiIpOwotICAgIGJvb2wg
b2sgPSBtX2JhY2tpbmdTdG9yZS0+ZGVsZXRlSW5kZXgodHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9y
ZVRyYW5zYWN0aW9uKCksIHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5pZCgpLCBtX29iamVjdFN0
b3JlSWQsIG1faW5kZXhNZXRhZGF0YS5pZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBSZWZQ
dHI8SURCRGF0YWJhc2VFcnJvcj4gZXJyb3IgPSBJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURC
RGF0YWJhc2VFeGNlcHRpb246OlVua25vd25FcnJvciwgU3RyaW5nOjpmb3JtYXQoIkludGVybmFs
IGVycm9yIGRlbGV0aW5nIGluZGV4ICclcycuIiwgbV9pbmRleE1ldGFkYXRhLm5hbWUudXRmOCgp
LmRhdGEoKSkpOwotICAgICAgICB0cmFuc2FjdGlvbi0+YWJvcnQoZXJyb3IpOwotICAgIH0KLX0K
LQotdm9pZCBEZWxldGVJbmRleEFib3J0T3BlcmF0aW9uOjpwZXJmb3JtKElEQlRyYW5zYWN0aW9u
QmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uKQotewotICAgIExPRyhTdG9yYWdlQVBJLCAiRGVs
ZXRlSW5kZXhBYm9ydE9wZXJhdGlvbiIpOwotICAgIEFTU0VSVF9VTlVTRUQodHJhbnNhY3Rpb24s
ICF0cmFuc2FjdGlvbik7Ci0gICAgbV9kYXRhYmFzZS0+YWRkSW5kZXgobV9vYmplY3RTdG9yZUlk
LCBtX2luZGV4TWV0YWRhdGEsIElEQkluZGV4TWV0YWRhdGE6OkludmFsaWRJZCk7Ci19Ci0KIHZv
aWQgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6Y29tbWl0KGludDY0X3QgdHJhbnNhY3Rpb25J
ZCkKIHsKICAgICAvLyBUaGUgZnJvbnRlbmQgc3VnZ2VzdHMgdGhhdCB3ZSBjb21taXQsIGJ1dCB3
ZSBtYXkgaGF2ZSBwcmV2aW91c2x5IGluaXRpYXRlZCBhbiBhYm9ydCwgYW5kIHNvIGhhdmUgZGlz
cG9zZWQgb2YgdGhlIHRyYW5zYWN0aW9uLiBvbkFib3J0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcGF0
Y2hlZCB0byB0aGUgZnJvbnRlbmQsIHNvIGl0IHdpbGwgZmluZCBvdXQgYWJvdXQgdGhhdCBhc3lu
Y2hyb25vdXNseS4KQEAgLTY4Niw5OSArMjE5LDcgQEAgdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRM
ZXZlbERCOjpnZXQoaW50NjRfdCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQK
ICAgICBpZiAoIXRyYW5zYWN0aW9uKQogICAgICAgICByZXR1cm47CiAKLSAgICB0cmFuc2FjdGlv
bi0+c2NoZWR1bGVUYXNrKEdldE9wZXJhdGlvbjo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLCBtX21l
dGFkYXRhLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXlSYW5nZSwga2V5T25seSA/IEluZGV4
ZWREQjo6Q3Vyc29yS2V5T25seSA6IEluZGV4ZWREQjo6Q3Vyc29yS2V5QW5kVmFsdWUsIGNhbGxi
YWNrcykpOwotfQotCi12b2lkIEdldE9wZXJhdGlvbjo6cGVyZm9ybShJREJUcmFuc2FjdGlvbkJh
Y2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbikKLXsKLSAgICBMT0coU3RvcmFnZUFQSSwgIkdldE9w
ZXJhdGlvbiIpOwotCi0gICAgUmVmUHRyPElEQktleT4ga2V5OwotCi0gICAgaWYgKG1fa2V5UmFu
Z2UtPmlzT25seUtleSgpKQotICAgICAgICBrZXkgPSBtX2tleVJhbmdlLT5sb3dlcigpOwotICAg
IGVsc2UgewotICAgICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGJhY2tpbmdT
dG9yZUN1cnNvcjsKLSAgICAgICAgaWYgKG1faW5kZXhJZCA9PSBJREJJbmRleE1ldGFkYXRhOjpJ
bnZhbGlkSWQpIHsKLSAgICAgICAgICAgIEFTU0VSVChtX2N1cnNvclR5cGUgIT0gSW5kZXhlZERC
OjpDdXJzb3JLZXlPbmx5KTsKLSAgICAgICAgICAgIC8vIE9iamVjdFN0b3JlIFJldHJpZXZhbCBP
cGVyYXRpb24KLSAgICAgICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9IG1fYmFja2luZ1N0b3Jl
LT5vcGVuT2JqZWN0U3RvcmVDdXJzb3IodHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0
aW9uKCksIG1fZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2tleVJhbmdlLmdldCgpLCBJ
bmRleGVkREI6OkN1cnNvck5leHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYg
KG1fY3Vyc29yVHlwZSA9PSBJbmRleGVkREI6OkN1cnNvcktleU9ubHkpCi0gICAgICAgICAgICAg
ICAgLy8gSW5kZXggVmFsdWUgUmV0cmlldmFsIE9wZXJhdGlvbgotICAgICAgICAgICAgICAgIGJh
Y2tpbmdTdG9yZUN1cnNvciA9IG1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhLZXlDdXJzb3IodHJh
bnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0YWJhc2VJZCwgbV9vYmpl
Y3RTdG9yZUlkLCBtX2luZGV4SWQsIG1fa2V5UmFuZ2UuZ2V0KCksIEluZGV4ZWREQjo6Q3Vyc29y
TmV4dCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLy8gSW5kZXggUmVmZXJl
bmNlZCBWYWx1ZSBSZXRyaWV2YWwgT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgYmFja2luZ1N0
b3JlQ3Vyc29yID0gbV9iYWNraW5nU3RvcmUtPm9wZW5JbmRleEN1cnNvcih0cmFuc2FjdGlvbi0+
YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQs
IG1faW5kZXhJZCwgbV9rZXlSYW5nZS5nZXQoKSwgSW5kZXhlZERCOjpDdXJzb3JOZXh0KTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmICghYmFja2luZ1N0b3JlQ3Vyc29yKSB7Ci0gICAgICAgICAg
ICBtX2NhbGxiYWNrcy0+b25TdWNjZXNzKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICBrZXkgPSBiYWNraW5nU3RvcmVDdXJzb3ItPmtleSgpOwotICAgIH0KLQot
ICAgIFJlZlB0cjxJREJLZXk+IHByaW1hcnlLZXk7Ci0gICAgYm9vbCBvazsKLSAgICBpZiAobV9p
bmRleElkID09IElEQkluZGV4TWV0YWRhdGE6OkludmFsaWRJZCkgewotICAgICAgICAvLyBPYmpl
Y3QgU3RvcmUgUmV0cmlldmFsIE9wZXJhdGlvbgotICAgICAgICBWZWN0b3I8Y2hhcj4gdmFsdWU7
Ci0gICAgICAgIG9rID0gbV9iYWNraW5nU3RvcmUtPmdldFJlY29yZCh0cmFuc2FjdGlvbi0+YmFj
a2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQsICpr
ZXksIHZhbHVlKTsKLSAgICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgbV9jYWxsYmFja3Mt
Pm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpV
bmtub3duRXJyb3IsICJJbnRlcm5hbCBlcnJvciBpbiBnZXRSZWNvcmQuIikpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlLmlzRW1wdHkoKSkgewot
ICAgICAgICAgICAgbV9jYWxsYmFja3MtPm9uU3VjY2VzcygpOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fYXV0b0luY3JlbWVudCAmJiAhbV9rZXlQYXRo
LmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBtX2NhbGxiYWNrcy0+b25TdWNjZXNzKFNoYXJlZEJ1
ZmZlcjo6YWRvcHRWZWN0b3IodmFsdWUpLCBrZXksIG1fa2V5UGF0aCk7Ci0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtX2NhbGxiYWNrcy0+b25TdWNjZXNzKFNoYXJl
ZEJ1ZmZlcjo6YWRvcHRWZWN0b3IodmFsdWUpKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgfQot
Ci0gICAgLy8gRnJvbSBoZXJlIHdlIGFyZSBkZWFsaW5nIG9ubHkgd2l0aCBpbmRleGVzLgotICAg
IG9rID0gbV9iYWNraW5nU3RvcmUtPmdldFByaW1hcnlLZXlWaWFJbmRleCh0cmFuc2FjdGlvbi0+
YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQs
IG1faW5kZXhJZCwgKmtleSwgcHJpbWFyeUtleSk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBt
X2NhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VF
eGNlcHRpb246OlVua25vd25FcnJvciwgIkludGVybmFsIGVycm9yIGluIGdldFByaW1hcnlLZXlW
aWFJbmRleC4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFwcmltYXJ5S2V5
KSB7Ci0gICAgICAgIG1fY2FsbGJhY2tzLT5vblN1Y2Nlc3MoKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBpZiAobV9jdXJzb3JUeXBlID09IEluZGV4ZWREQjo6Q3Vyc29yS2V5T25seSkg
ewotICAgICAgICAvLyBJbmRleCBWYWx1ZSBSZXRyaWV2YWwgT3BlcmF0aW9uCi0gICAgICAgIG1f
Y2FsbGJhY2tzLT5vblN1Y2Nlc3MocHJpbWFyeUtleS5nZXQoKSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICAvLyBJbmRleCBSZWZlcmVuY2VkIFZhbHVlIFJldHJpZXZhbCBPcGVyYXRp
b24KLSAgICBWZWN0b3I8Y2hhcj4gdmFsdWU7Ci0gICAgb2sgPSBtX2JhY2tpbmdTdG9yZS0+Z2V0
UmVjb3JkKHRyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlvbigpLCBtX2RhdGFiYXNl
SWQsIG1fb2JqZWN0U3RvcmVJZCwgKnByaW1hcnlLZXksIHZhbHVlKTsKLSAgICBpZiAoIW9rKSB7
Ci0gICAgICAgIG1fY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJ
REJEYXRhYmFzZUV4Y2VwdGlvbjo6VW5rbm93bkVycm9yLCAiSW50ZXJuYWwgZXJyb3IgaW4gZ2V0
UmVjb3JkLiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh2YWx1ZS5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgbV9jYWxsYmFja3MtPm9uU3VjY2VzcygpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIGlmIChtX2F1dG9JbmNyZW1lbnQgJiYgIW1fa2V5UGF0aC5pc051bGwo
KSkgewotICAgICAgICBtX2NhbGxiYWNrcy0+b25TdWNjZXNzKFNoYXJlZEJ1ZmZlcjo6YWRvcHRW
ZWN0b3IodmFsdWUpLCBwcmltYXJ5S2V5LCBtX2tleVBhdGgpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIG1fY2FsbGJhY2tzLT5vblN1Y2Nlc3MoU2hhcmVkQnVmZmVyOjphZG9wdFZlY3Rv
cih2YWx1ZSkpOworICAgIHRyYW5zYWN0aW9uLT5zY2hlZHVsZUdldE9wZXJhdGlvbihtX21ldGFk
YXRhLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXlSYW5nZSwga2V5T25seSA/IEluZGV4ZWRE
Qjo6Q3Vyc29yS2V5T25seSA6IEluZGV4ZWREQjo6Q3Vyc29yS2V5QW5kVmFsdWUsIGNhbGxiYWNr
cyk7CiB9CiAKIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6cHV0KGludDY0X3QgdHJh
bnNhY3Rpb25JZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZl
cj4gdmFsdWUsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIFB1dE1vZGUgcHV0TW9kZSwgUGFzc1Jl
ZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcywgY29uc3QgVmVjdG9yPGludDY0X3Q+JiBpbmRl
eElkcywgY29uc3QgVmVjdG9yPEluZGV4S2V5cz4mIGluZGV4S2V5cykKQEAgLTc5Myw3OCArMjM0
LDcgQEAgdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpwdXQoaW50NjRfdCB0cmFuc2Fj
dGlvbklkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQKIAogICAgIEFTU0VSVChvYmplY3RTdG9yZU1l
dGFkYXRhLmF1dG9JbmNyZW1lbnQgfHwga2V5LmdldCgpKTsKIAotICAgIHRyYW5zYWN0aW9uLT5z
Y2hlZHVsZVRhc2soUHV0T3BlcmF0aW9uOjpjcmVhdGUobV9iYWNraW5nU3RvcmUsIGlkKCksIG9i
amVjdFN0b3JlTWV0YWRhdGEsIHZhbHVlLCBrZXksIHB1dE1vZGUsIGNhbGxiYWNrcywgaW5kZXhJ
ZHMsIGluZGV4S2V5cykpOwotfQotCi12b2lkIFB1dE9wZXJhdGlvbjo6cGVyZm9ybShJREJUcmFu
c2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbikKLXsKLSAgICBMT0coU3RvcmFnZUFQ
SSwgIlB1dE9wZXJhdGlvbiIpOwotICAgIEFTU0VSVCh0cmFuc2FjdGlvbi0+bW9kZSgpICE9IElu
ZGV4ZWREQjo6VHJhbnNhY3Rpb25SZWFkT25seSk7Ci0gICAgQVNTRVJUKG1faW5kZXhJZHMuc2l6
ZSgpID09IG1faW5kZXhLZXlzLnNpemUoKSk7Ci0gICAgYm9vbCBrZXlXYXNHZW5lcmF0ZWQgPSBm
YWxzZTsKLQotICAgIFJlZlB0cjxJREJLZXk+IGtleTsKLSAgICBpZiAobV9wdXRNb2RlICE9IElE
QkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6Q3Vyc29yVXBkYXRlICYmIG1fb2JqZWN0U3RvcmUu
YXV0b0luY3JlbWVudCAmJiAhbV9rZXkpIHsKLSAgICAgICAgUmVmUHRyPElEQktleT4gYXV0b0lu
Y0tleSA9IElEQk9iamVjdFN0b3JlQmFja2VuZExldmVsREI6OmdlbmVyYXRlS2V5KG1fYmFja2lu
Z1N0b3JlLCB0cmFuc2FjdGlvbiwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlLmlkKTsKLSAg
ICAgICAga2V5V2FzR2VuZXJhdGVkID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFhdXRvSW5jS2V5LT5p
c1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIG1fY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNl
RXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6Q29uc3RyYWludEVycm9yLCAiTWF4
aW11bSBrZXkgZ2VuZXJhdG9yIHZhbHVlIHJlYWNoZWQuIikpOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0gICAgICAgIGtleSA9IGF1dG9JbmNLZXk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIGtleSA9IG1fa2V5OwotCi0gICAgQVNTRVJUKGtleSAmJiBrZXktPmlzVmFsaWQoKSk7Ci0K
LSAgICBJREJCYWNraW5nU3RvcmU6OlJlY29yZElkZW50aWZpZXIgcmVjb3JkSWRlbnRpZmllcjsK
LSAgICBpZiAobV9wdXRNb2RlID09IElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6QWRkT25s
eSkgewotICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgb2sgPSBtX2Jh
Y2tpbmdTdG9yZS0+a2V5RXhpc3RzSW5PYmplY3RTdG9yZSh0cmFuc2FjdGlvbi0+YmFja2luZ1N0
b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlLmlkLCAqa2V5LCAm
cmVjb3JkSWRlbnRpZmllciwgZm91bmQpOwotICAgICAgICBpZiAoIW9rKSB7Ci0gICAgICAgICAg
ICBtX2NhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJh
c2VFeGNlcHRpb246OlVua25vd25FcnJvciwgIkludGVybmFsIGVycm9yIGNoZWNraW5nIGtleSBl
eGlzdGVuY2UuIikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlm
IChmb3VuZCkgewotICAgICAgICAgICAgbV9jYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VF
cnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpDb25zdHJhaW50RXJyb3IsICJLZXkg
YWxyZWFkeSBleGlzdHMgaW4gdGhlIG9iamVjdCBzdG9yZS4iKSk7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWZWN0b3I8T3duUHRyPElEQk9iamVjdFN0b3Jl
QmFja2VuZExldmVsREI6OkluZGV4V3JpdGVyPiA+IGluZGV4V3JpdGVyczsKLSAgICBTdHJpbmcg
ZXJyb3JNZXNzYWdlOwotICAgIGJvb2wgb2JleXNDb25zdHJhaW50cyA9IGZhbHNlOwotICAgIGJv
b2wgYmFja2luZ1N0b3JlU3VjY2VzcyA9IElEQk9iamVjdFN0b3JlQmFja2VuZExldmVsREI6Om1h
a2VJbmRleFdyaXRlcnModHJhbnNhY3Rpb24sIG1fYmFja2luZ1N0b3JlLmdldCgpLCBtX2RhdGFi
YXNlSWQsIG1fb2JqZWN0U3RvcmUsIGtleSwga2V5V2FzR2VuZXJhdGVkLCBtX2luZGV4SWRzLCBt
X2luZGV4S2V5cywgJmluZGV4V3JpdGVycywgJmVycm9yTWVzc2FnZSwgb2JleXNDb25zdHJhaW50
cyk7Ci0gICAgaWYgKCFiYWNraW5nU3RvcmVTdWNjZXNzKSB7Ci0gICAgICAgIG1fY2FsbGJhY2tz
LT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6
VW5rbm93bkVycm9yLCAiSW50ZXJuYWwgZXJyb3I6IGJhY2tpbmcgc3RvcmUgZXJyb3IgdXBkYXRp
bmcgaW5kZXgga2V5cy4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFvYmV5
c0NvbnN0cmFpbnRzKSB7Ci0gICAgICAgIG1fY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNl
RXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6Q29uc3RyYWludEVycm9yLCBlcnJv
ck1lc3NhZ2UpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEJlZm9yZSB0aGlz
IHBvaW50LCBkb24ndCBkbyBhbnkgbXV0YXRpb24uIEFmdGVyIHRoaXMgcG9pbnQsIHJvbGxiYWNr
IHRoZSB0cmFuc2FjdGlvbiBpbiBjYXNlIG9mIGVycm9yLgotICAgIGJhY2tpbmdTdG9yZVN1Y2Nl
c3MgPSBtX2JhY2tpbmdTdG9yZS0+cHV0UmVjb3JkKHRyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVU
cmFuc2FjdGlvbigpLCBtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmUuaWQsICprZXksIG1fdmFs
dWUsICZyZWNvcmRJZGVudGlmaWVyKTsKLSAgICBpZiAoIWJhY2tpbmdTdG9yZVN1Y2Nlc3MpIHsK
LSAgICAgICAgbV9jYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElE
QkRhdGFiYXNlRXhjZXB0aW9uOjpVbmtub3duRXJyb3IsICJJbnRlcm5hbCBlcnJvcjogYmFja2lu
ZyBzdG9yZSBlcnJvciBwZXJmb3JtaW5nIHB1dC9hZGQuIikpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmRleFdyaXRlcnMuc2l6ZSgpOyAr
K2kpIHsKLSAgICAgICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kTGV2ZWxEQjo6SW5kZXhXcml0ZXIq
IGluZGV4V3JpdGVyID0gaW5kZXhXcml0ZXJzW2ldLmdldCgpOwotICAgICAgICBpbmRleFdyaXRl
ci0+d3JpdGVJbmRleEtleXMocmVjb3JkSWRlbnRpZmllciwgKm1fYmFja2luZ1N0b3JlLCB0cmFu
c2FjdGlvbi0+YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVj
dFN0b3JlLmlkKTsKLSAgICB9Ci0KLSAgICBpZiAobV9vYmplY3RTdG9yZS5hdXRvSW5jcmVtZW50
ICYmIG1fcHV0TW9kZSAhPSBJREJEYXRhYmFzZUJhY2tlbmRJbnRlcmZhY2U6OkN1cnNvclVwZGF0
ZSAmJiBrZXktPnR5cGUoKSA9PSBJREJLZXk6Ok51bWJlclR5cGUpIHsKLSAgICAgICAgYm9vbCBv
ayA9IElEQk9iamVjdFN0b3JlQmFja2VuZExldmVsREI6OnVwZGF0ZUtleUdlbmVyYXRvcihtX2Jh
Y2tpbmdTdG9yZSwgdHJhbnNhY3Rpb24sIG1fZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZS5pZCwg
a2V5LmdldCgpLCAha2V5V2FzR2VuZXJhdGVkKTsKLSAgICAgICAgaWYgKCFvaykgewotICAgICAg
ICAgICAgbV9jYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRh
dGFiYXNlRXhjZXB0aW9uOjpVbmtub3duRXJyb3IsICJJbnRlcm5hbCBlcnJvciB1cGRhdGluZyBr
ZXkgZ2VuZXJhdG9yLiIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIG1fY2FsbGJhY2tzLT5vblN1Y2Nlc3Moa2V5LnJlbGVhc2UoKSk7CisgICAgdHJhbnNh
Y3Rpb24tPnNjaGVkdWxlUHV0T3BlcmF0aW9uKG9iamVjdFN0b3JlTWV0YWRhdGEsIHZhbHVlLCBr
ZXksIHB1dE1vZGUsIGNhbGxiYWNrcywgaW5kZXhJZHMsIGluZGV4S2V5cyk7CiB9CiAKIHZvaWQg
SURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6c2V0SW5kZXhLZXlzKGludDY0X3QgdHJhbnNhY3Rp
b25JZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBQYXNzUmVmUHRyPElEQktleT4gcHJwUHJpbWFy
eUtleSwgY29uc3QgVmVjdG9yPGludDY0X3Q+JiBpbmRleElkcywgY29uc3QgVmVjdG9yPEluZGV4
S2V5cz4mIGluZGV4S2V5cykKQEAgLTkyMCwxNCArMjkwLDcgQEAgdm9pZCBJREJEYXRhYmFzZUJh
Y2tlbmRMZXZlbERCOjpzZXRJbmRleGVzUmVhZHkoaW50NjRfdCB0cmFuc2FjdGlvbklkLCBpbnQ2
NF90LAogICAgIGlmICghdHJhbnNhY3Rpb24pCiAgICAgICAgIHJldHVybjsKIAotICAgIHRyYW5z
YWN0aW9uLT5zY2hlZHVsZVRhc2soSURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpQcmVlbXB0
aXZlVGFzaywgU2V0SW5kZXhlc1JlYWR5T3BlcmF0aW9uOjpjcmVhdGUoaW5kZXhJZHMuc2l6ZSgp
KSk7Ci19Ci0KLXZvaWQgU2V0SW5kZXhlc1JlYWR5T3BlcmF0aW9uOjpwZXJmb3JtKElEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uKQotewotICAgIExPRyhTdG9yYWdlQVBJ
LCAiU2V0SW5kZXhlc1JlYWR5T3BlcmF0aW9uIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX2luZGV4Q291bnQ7ICsraSkKLSAgICAgICAgdHJhbnNhY3Rpb24tPmRpZENvbXBsZXRlUHJl
ZW1wdGl2ZUV2ZW50KCk7CisgICAgdHJhbnNhY3Rpb24tPnNjaGVkdWxlU2V0SW5kZXhlc1JlYWR5
T3BlcmF0aW9uKGluZGV4SWRzLnNpemUoKSk7CiB9CiAKIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5k
TGV2ZWxEQjo6b3BlbkN1cnNvcihpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiBrZXlSYW5n
ZSwgSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb24gZGlyZWN0aW9uLCBib29sIGtleU9ubHksIFRh
c2tUeXBlIHRhc2tUeXBlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQpAQCAt
OTM3LDQwICszMDAsNyBAQCB2b2lkIElEQkRhdGFiYXNlQmFja2VuZExldmVsREI6Om9wZW5DdXJz
b3IoaW50NjRfdCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IG9iamVjdAogICAgIGlmICghdHJhbnNh
Y3Rpb24pCiAgICAgICAgIHJldHVybjsKIAotICAgIHRyYW5zYWN0aW9uLT5zY2hlZHVsZVRhc2so
T3BlbkN1cnNvck9wZXJhdGlvbjo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLCBpZCgpLCBvYmplY3RT
dG9yZUlkLCBpbmRleElkLCBrZXlSYW5nZSwgZGlyZWN0aW9uLCBrZXlPbmx5ID8gSW5kZXhlZERC
OjpDdXJzb3JLZXlPbmx5IDogSW5kZXhlZERCOjpDdXJzb3JLZXlBbmRWYWx1ZSwgdGFza1R5cGUs
IGNhbGxiYWNrcykpOwotfQotCi12b2lkIE9wZW5DdXJzb3JPcGVyYXRpb246OnBlcmZvcm0oSURC
VHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24pCi17Ci0gICAgTE9HKFN0b3Jh
Z2VBUEksICJPcGVuQ3Vyc29yT3BlcmF0aW9uIik7Ci0KLSAgICAvLyBUaGUgZnJvbnRlbmQgaGFz
IGJlZ3VuIGluZGV4aW5nLCBzbyB0aGlzIHBhdXNlcyB0aGUgdHJhbnNhY3Rpb24KLSAgICAvLyB1
bnRpbCB0aGUgaW5kZXhpbmcgaXMgY29tcGxldGUuIFRoaXMgY2FuJ3QgaGFwcGVuIGFueSBlYXJs
aWVyCi0gICAgLy8gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHN3aXRjaCB0byBlYXJseSBtb2Rl
IGluIGNhc2UgbXVsdGlwbGUKLSAgICAvLyBpbmRleGVzIGFyZSBiZWluZyBjcmVhdGVkIGluIGEg
cm93LCB3aXRoIHB1dCgpJ3MgaW4gYmV0d2Vlbi4KLSAgICBpZiAobV90YXNrVHlwZSA9PSBJREJE
YXRhYmFzZUJhY2tlbmRJbnRlcmZhY2U6OlByZWVtcHRpdmVUYXNrKQotICAgICAgICB0cmFuc2Fj
dGlvbi0+YWRkUHJlZW1wdGl2ZUV2ZW50KCk7Ci0KLSAgICBSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpDdXJzb3I+IGJhY2tpbmdTdG9yZUN1cnNvcjsKLSAgICBpZiAobV9pbmRleElkID09IElEQklu
ZGV4TWV0YWRhdGE6OkludmFsaWRJZCkgewotICAgICAgICBBU1NFUlQobV9jdXJzb3JUeXBlICE9
IEluZGV4ZWREQjo6Q3Vyc29yS2V5T25seSk7Ci0gICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9
IG1fYmFja2luZ1N0b3JlLT5vcGVuT2JqZWN0U3RvcmVDdXJzb3IodHJhbnNhY3Rpb24tPmJhY2tp
bmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2tl
eVJhbmdlLmdldCgpLCBtX2RpcmVjdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJU
KG1fdGFza1R5cGUgPT0gSURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpOb3JtYWxUYXNrKTsK
LSAgICAgICAgaWYgKG1fY3Vyc29yVHlwZSA9PSBJbmRleGVkREI6OkN1cnNvcktleU9ubHkpCi0g
ICAgICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBtX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4
S2V5Q3Vyc29yKHRyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlvbigpLCBtX2RhdGFi
YXNlSWQsIG1fb2JqZWN0U3RvcmVJZCwgbV9pbmRleElkLCBtX2tleVJhbmdlLmdldCgpLCBtX2Rp
cmVjdGlvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9
IG1fYmFja2luZ1N0b3JlLT5vcGVuSW5kZXhDdXJzb3IodHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9y
ZVRyYW5zYWN0aW9uKCksIG1fZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2luZGV4SWQs
IG1fa2V5UmFuZ2UuZ2V0KCksIG1fZGlyZWN0aW9uKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJhY2tp
bmdTdG9yZUN1cnNvcikgewotICAgICAgICBtX2NhbGxiYWNrcy0+b25TdWNjZXNzKHN0YXRpY19j
YXN0PFNoYXJlZEJ1ZmZlcio+KDApKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIElE
QkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6VGFza1R5cGUgdGFza1R5cGUoc3RhdGljX2Nhc3Q8
SURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpUYXNrVHlwZT4obV90YXNrVHlwZSkpOwotICAg
IFJlZlB0cjxJREJDdXJzb3JCYWNrZW5kTGV2ZWxEQj4gY3Vyc29yID0gSURCQ3Vyc29yQmFja2Vu
ZExldmVsREI6OmNyZWF0ZShiYWNraW5nU3RvcmVDdXJzb3IuZ2V0KCksIG1fY3Vyc29yVHlwZSwg
dGFza1R5cGUsIHRyYW5zYWN0aW9uLCBtX29iamVjdFN0b3JlSWQpOwotICAgIG1fY2FsbGJhY2tz
LT5vblN1Y2Nlc3MoY3Vyc29yLCBjdXJzb3ItPmtleSgpLCBjdXJzb3ItPnByaW1hcnlLZXkoKSwg
Y3Vyc29yLT52YWx1ZSgpKTsKKyAgICB0cmFuc2FjdGlvbi0+c2NoZWR1bGVPcGVuQ3Vyc29yT3Bl
cmF0aW9uKG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleVJhbmdlLCBkaXJlY3Rpb24sIGtleU9u
bHkgPyBJbmRleGVkREI6OkN1cnNvcktleU9ubHkgOiBJbmRleGVkREI6OkN1cnNvcktleUFuZFZh
bHVlLCB0YXNrVHlwZSwgY2FsbGJhY2tzKTsKIH0KIAogdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRM
ZXZlbERCOjpjb3VudChpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkLCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiBrZXlSYW5nZSwgUGFz
c1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykKQEAgLTk4MSwzMCArMzExLDkgQEAgdm9p
ZCBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpjb3VudChpbnQ2NF90IHRyYW5zYWN0aW9uSWQs
IGludDY0X3Qgb2JqZWN0U3RvcmUKICAgICAgICAgcmV0dXJuOwogCiAgICAgQVNTRVJUKG1fbWV0
YWRhdGEub2JqZWN0U3RvcmVzLmNvbnRhaW5zKG9iamVjdFN0b3JlSWQpKTsKLSAgICB0cmFuc2Fj
dGlvbi0+c2NoZWR1bGVUYXNrKENvdW50T3BlcmF0aW9uOjpjcmVhdGUobV9iYWNraW5nU3RvcmUs
IGlkKCksIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleVJhbmdlLCBjYWxsYmFja3MpKTsKKyAg
ICB0cmFuc2FjdGlvbi0+c2NoZWR1bGVDb3VudE9wZXJhdGlvbihvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBrZXlSYW5nZSwgY2FsbGJhY2tzKTsKIH0KIAotdm9pZCBDb3VudE9wZXJhdGlvbjo6cGVy
Zm9ybShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbikKLXsKLSAgICBM
T0coU3RvcmFnZUFQSSwgIkNvdW50T3BlcmF0aW9uIik7Ci0gICAgdWludDMyX3QgY291bnQgPSAw
OwotICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gYmFja2luZ1N0b3JlQ3Vyc29y
OwotCi0gICAgaWYgKG1faW5kZXhJZCA9PSBJREJJbmRleE1ldGFkYXRhOjpJbnZhbGlkSWQpCi0g
ICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9IG1fYmFja2luZ1N0b3JlLT5vcGVuT2JqZWN0U3Rv
cmVLZXlDdXJzb3IodHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0
YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2tleVJhbmdlLmdldCgpLCBJbmRleGVkREI6OkN1
cnNvck5leHQpOwotICAgIGVsc2UKLSAgICAgICAgYmFja2luZ1N0b3JlQ3Vyc29yID0gbV9iYWNr
aW5nU3RvcmUtPm9wZW5JbmRleEtleUN1cnNvcih0cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlVHJh
bnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQsIG1faW5kZXhJZCwgbV9r
ZXlSYW5nZS5nZXQoKSwgSW5kZXhlZERCOjpDdXJzb3JOZXh0KTsKLSAgICBpZiAoIWJhY2tpbmdT
dG9yZUN1cnNvcikgewotICAgICAgICBtX2NhbGxiYWNrcy0+b25TdWNjZXNzKGNvdW50KTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRvIHsKLSAgICAgICAgKytjb3VudDsKLSAgICB9
IHdoaWxlIChiYWNraW5nU3RvcmVDdXJzb3ItPmNvbnRpbnVlRnVuY3Rpb24oMCkpOwotCi0gICAg
bV9jYWxsYmFja3MtPm9uU3VjY2Vzcyhjb3VudCk7Ci19CiAKIHZvaWQgSURCRGF0YWJhc2VCYWNr
ZW5kTGV2ZWxEQjo6ZGVsZXRlUmFuZ2UoaW50NjRfdCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBQYXNzUmVmUHRy
PElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewpAQCAtMTAxNCwyMyArMzIzLDcgQEAgdm9pZCBJ
REJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpkZWxldGVSYW5nZShpbnQ2NF90IHRyYW5zYWN0aW9u
SWQsIGludDY0X3Qgb2JqZWMKICAgICAgICAgcmV0dXJuOwogICAgIEFTU0VSVCh0cmFuc2FjdGlv
bi0+bW9kZSgpICE9IEluZGV4ZWREQjo6VHJhbnNhY3Rpb25SZWFkT25seSk7CiAKLSAgICB0cmFu
c2FjdGlvbi0+c2NoZWR1bGVUYXNrKERlbGV0ZVJhbmdlT3BlcmF0aW9uOjpjcmVhdGUobV9iYWNr
aW5nU3RvcmUsIGlkKCksIG9iamVjdFN0b3JlSWQsIGtleVJhbmdlLCBjYWxsYmFja3MpKTsKLX0K
LQotdm9pZCBEZWxldGVSYW5nZU9wZXJhdGlvbjo6cGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXZlbERCKiB0cmFuc2FjdGlvbikKLXsKLSAgICBMT0coU3RvcmFnZUFQSSwgIkRlbGV0ZVJh
bmdlT3BlcmF0aW9uIik7Ci0gICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBiYWNr
aW5nU3RvcmVDdXJzb3IgPSBtX2JhY2tpbmdTdG9yZS0+b3Blbk9iamVjdFN0b3JlQ3Vyc29yKHRy
YW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlvbigpLCBtX2RhdGFiYXNlSWQsIG1fb2Jq
ZWN0U3RvcmVJZCwgbV9rZXlSYW5nZS5nZXQoKSwgSW5kZXhlZERCOjpDdXJzb3JOZXh0KTsKLSAg
ICBpZiAoYmFja2luZ1N0b3JlQ3Vyc29yKSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlm
ICghbV9iYWNraW5nU3RvcmUtPmRlbGV0ZVJlY29yZCh0cmFuc2FjdGlvbi0+YmFja2luZ1N0b3Jl
VHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQsIGJhY2tpbmdTdG9y
ZUN1cnNvci0+cmVjb3JkSWRlbnRpZmllcigpKSkgewotICAgICAgICAgICAgICAgIG1fY2FsbGJh
Y2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlv
bjo6VW5rbm93bkVycm9yLCAiRXJyb3IgZGVsZXRpbmcgZGF0YSBpbiByYW5nZSIpKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGJhY2tp
bmdTdG9yZUN1cnNvci0+Y29udGludWVGdW5jdGlvbigwKSk7Ci0gICAgfQotCi0gICAgbV9jYWxs
YmFja3MtPm9uU3VjY2VzcygpOworICAgIHRyYW5zYWN0aW9uLT5zY2hlZHVsZURlbGV0ZVJhbmdl
T3BlcmF0aW9uKG9iamVjdFN0b3JlSWQsIGtleVJhbmdlLCBjYWxsYmFja3MpOwogfQogCiB2b2lk
IElEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OmNsZWFyKGludDY0X3QgdHJhbnNhY3Rpb25JZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tz
KQpAQCAtMTA0MSw0NyArMzM0LDcgQEAgdm9pZCBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpj
bGVhcihpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3Qgb2JqZWN0U3RvcmUKICAgICAgICAg
cmV0dXJuOwogICAgIEFTU0VSVCh0cmFuc2FjdGlvbi0+bW9kZSgpICE9IEluZGV4ZWREQjo6VHJh
bnNhY3Rpb25SZWFkT25seSk7CiAKLSAgICB0cmFuc2FjdGlvbi0+c2NoZWR1bGVUYXNrKENsZWFy
T3BlcmF0aW9uOjpjcmVhdGUobV9iYWNraW5nU3RvcmUsIGlkKCksIG9iamVjdFN0b3JlSWQsIGNh
bGxiYWNrcykpOwotfQotCi12b2lkIENsZWFyT3BlcmF0aW9uOjpwZXJmb3JtKElEQlRyYW5zYWN0
aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uKQotewotICAgIExPRyhTdG9yYWdlQVBJLCAi
T2JqZWN0U3RvcmVDbGVhck9wZXJhdGlvbiIpOwotICAgIGlmICghbV9iYWNraW5nU3RvcmUtPmNs
ZWFyT2JqZWN0U3RvcmUodHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1f
ZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkKSkgewotICAgICAgICBtX2NhbGxiYWNrcy0+b25F
cnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVua25v
d25FcnJvciwgIkVycm9yIGNsZWFyaW5nIG9iamVjdCBzdG9yZSIpKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSAgICBtX2NhbGxiYWNrcy0+b25TdWNjZXNzKCk7Ci19Ci0KLXZvaWQgRGVsZXRl
T2JqZWN0U3RvcmVPcGVyYXRpb246OnBlcmZvcm0oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
QiogdHJhbnNhY3Rpb24pCi17Ci0gICAgTE9HKFN0b3JhZ2VBUEksICJEZWxldGVPYmplY3RTdG9y
ZU9wZXJhdGlvbiIpOwotICAgIGJvb2wgb2sgPSBtX2JhY2tpbmdTdG9yZS0+ZGVsZXRlT2JqZWN0
U3RvcmUodHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIHRyYW5zYWN0aW9u
LT5kYXRhYmFzZSgpLT5pZCgpLCBtX29iamVjdFN0b3JlTWV0YWRhdGEuaWQpOwotICAgIGlmICgh
b2spIHsKLSAgICAgICAgUmVmUHRyPElEQkRhdGFiYXNlRXJyb3I+IGVycm9yID0gSURCRGF0YWJh
c2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpVbmtub3duRXJyb3IsIFN0cmlu
Zzo6Zm9ybWF0KCJJbnRlcm5hbCBlcnJvciBkZWxldGluZyBvYmplY3Qgc3RvcmUgJyVzJy4iLCBt
X29iamVjdFN0b3JlTWV0YWRhdGEubmFtZS51dGY4KCkuZGF0YSgpKSk7Ci0gICAgICAgIHRyYW5z
YWN0aW9uLT5hYm9ydChlcnJvcik7Ci0gICAgfQotfQotCi12b2lkIElEQkRhdGFiYXNlQmFja2Vu
ZExldmVsREI6OlZlcnNpb25DaGFuZ2VPcGVyYXRpb246OnBlcmZvcm0oSURCVHJhbnNhY3Rpb25C
YWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24pCi17Ci0gICAgTE9HKFN0b3JhZ2VBUEksICJWZXJz
aW9uQ2hhbmdlT3BlcmF0aW9uIik7Ci0gICAgaW50NjRfdCBkYXRhYmFzZUlkID0gbV9kYXRhYmFz
ZS0+aWQoKTsKLSAgICB1aW50NjRfdCBvbGRWZXJzaW9uID0gbV9kYXRhYmFzZS0+bV9tZXRhZGF0
YS52ZXJzaW9uOwotCi0gICAgLy8gRklYTUU6IERhdGFiYXNlIHZlcnNpb25zIGFyZSBub3cgb2Yg
dHlwZSB1aW50NjRfdCwgYnV0IHRoaXMgY29kZSBleHBlY3RlZCBpbnQ2NF90LgotICAgIEFTU0VS
VChtX3ZlcnNpb24gPiAoaW50NjRfdClvbGRWZXJzaW9uKTsKLSAgICBtX2RhdGFiYXNlLT5tX21l
dGFkYXRhLnZlcnNpb24gPSBtX3ZlcnNpb247Ci0gICAgaWYgKCFtX2RhdGFiYXNlLT5tX2JhY2tp
bmdTdG9yZS0+dXBkYXRlSURCRGF0YWJhc2VJbnRWZXJzaW9uKHRyYW5zYWN0aW9uLT5iYWNraW5n
U3RvcmVUcmFuc2FjdGlvbigpLCBkYXRhYmFzZUlkLCBtX2RhdGFiYXNlLT5tX21ldGFkYXRhLnZl
cnNpb24pKSB7Ci0gICAgICAgIFJlZlB0cjxJREJEYXRhYmFzZUVycm9yPiBlcnJvciA9IElEQkRh
dGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VW5rbm93bkVycm9yLCAi
RXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0YWJsZSBzdG9yYWdlIHdoZW4gdXBkYXRpbmcgdmVyc2lv
bi4iKTsKLSAgICAgICAgbV9jYWxsYmFja3MtPm9uRXJyb3IoZXJyb3IpOwotICAgICAgICB0cmFu
c2FjdGlvbi0+YWJvcnQoZXJyb3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VS
VCghbV9kYXRhYmFzZS0+bV9wZW5kaW5nU2Vjb25kSGFsZk9wZW4pOwotICAgIG1fZGF0YWJhc2Ut
Pm1fcGVuZGluZ1NlY29uZEhhbGZPcGVuID0gUGVuZGluZ09wZW5DYWxsOjpjcmVhdGUobV9jYWxs
YmFja3MsIG1fZGF0YWJhc2VDYWxsYmFja3MsIG1fdHJhbnNhY3Rpb25JZCwgbV92ZXJzaW9uKTsK
LSAgICBtX2NhbGxiYWNrcy0+b25VcGdyYWRlTmVlZGVkKG9sZFZlcnNpb24sIG1fZGF0YWJhc2Us
IG1fZGF0YWJhc2UtPm1ldGFkYXRhKCkpOworICAgIHRyYW5zYWN0aW9uLT5zY2hlZHVsZUNsZWFy
T3BlcmF0aW9uKG9iamVjdFN0b3JlSWQsIGNhbGxiYWNrcyk7CiB9CiAKIHZvaWQgSURCRGF0YWJh
c2VCYWNrZW5kTGV2ZWxEQjo6dHJhbnNhY3Rpb25TdGFydGVkKFBhc3NSZWZQdHI8SURCVHJhbnNh
Y3Rpb25CYWNrZW5kTGV2ZWxEQj4gcHJwVHJhbnNhY3Rpb24pCkBAIC0xMTc0LDcgKzQyNyw3IEBA
IHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6cHJvY2Vzc1BlbmRpbmdDYWxscygpCiAK
IHZvaWQgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6Y3JlYXRlVHJhbnNhY3Rpb24oaW50NjRf
dCB0cmFuc2FjdGlvbklkLCBQYXNzUmVmUHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiBjYWxsYmFj
a3MsIGNvbnN0IFZlY3RvcjxpbnQ2NF90PiYgb2JqZWN0U3RvcmVJZHMsIHVuc2lnbmVkIHNob3J0
IG1vZGUpCiB7Ci0gICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI+IHRyYW5z
YWN0aW9uID0gSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6Y3JlYXRlKHRyYW5zYWN0aW9u
SWQsIGNhbGxiYWNrcywgb2JqZWN0U3RvcmVJZHMsIHN0YXRpY19jYXN0PEluZGV4ZWREQjo6VHJh
bnNhY3Rpb25Nb2RlPihtb2RlKSwgdGhpcyk7CisgICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFj
a2VuZExldmVsREI+IHRyYW5zYWN0aW9uID0gSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6
Y3JlYXRlKG1fYmFja2luZ1N0b3JlLmdldCgpLCB0cmFuc2FjdGlvbklkLCBjYWxsYmFja3MsIG9i
amVjdFN0b3JlSWRzLCBzdGF0aWNfY2FzdDxJbmRleGVkREI6OlRyYW5zYWN0aW9uTW9kZT4obW9k
ZSksIHRoaXMpOwogICAgIEFTU0VSVCghbV90cmFuc2FjdGlvbnMuY29udGFpbnModHJhbnNhY3Rp
b25JZCkpOwogICAgIG1fdHJhbnNhY3Rpb25zLmFkZCh0cmFuc2FjdGlvbklkLCB0cmFuc2FjdGlv
bi5nZXQoKSk7CiB9CkBAIC0xMjc1LDcgKzUyOCw3IEBAIHZvaWQgSURCRGF0YWJhc2VCYWNrZW5k
TGV2ZWxEQjo6cnVuSW50VmVyc2lvbkNoYW5nZVRyYW5zYWN0aW9uKFBhc3NSZWZQdHI8SURCQ2Fs
CiAgICAgY3JlYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JZCwgZGF0YWJhc2VDYWxsYmFja3Ms
IG9iamVjdFN0b3JlSWRzLCBJbmRleGVkREI6OlRyYW5zYWN0aW9uVmVyc2lvbkNoYW5nZSk7CiAg
ICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI+IHRyYW5zYWN0aW9uID0gbV90
cmFuc2FjdGlvbnMuZ2V0KHRyYW5zYWN0aW9uSWQpOwogCi0gICAgdHJhbnNhY3Rpb24tPnNjaGVk
dWxlVGFzayhWZXJzaW9uQ2hhbmdlT3BlcmF0aW9uOjpjcmVhdGUodGhpcywgdHJhbnNhY3Rpb25J
ZCwgcmVxdWVzdGVkVmVyc2lvbiwgY2FsbGJhY2tzLCBkYXRhYmFzZUNhbGxiYWNrcyksIFZlcnNp
b25DaGFuZ2VBYm9ydE9wZXJhdGlvbjo6Y3JlYXRlKHRoaXMsIFN0cmluZzo6bnVtYmVyKG1fbWV0
YWRhdGEudmVyc2lvbiksIG1fbWV0YWRhdGEudmVyc2lvbikpOworICAgIHRyYW5zYWN0aW9uLT5z
Y2hlZHVsZVZlcnNpb25DaGFuZ2VPcGVyYXRpb24odHJhbnNhY3Rpb25JZCwgcmVxdWVzdGVkVmVy
c2lvbiwgY2FsbGJhY2tzLCBkYXRhYmFzZUNhbGxiYWNrcywgbV9tZXRhZGF0YSk7CiAKICAgICBB
U1NFUlQoIW1fcGVuZGluZ1NlY29uZEhhbGZPcGVuKTsKICAgICBtX2RhdGFiYXNlQ2FsbGJhY2tz
U2V0LmFkZChkYXRhYmFzZUNhbGxiYWNrcyk7CkBAIC0xMzYwLDI3ICs2MTMsNiBAQCB2b2lkIElE
QkRhdGFiYXNlQmFja2VuZExldmVsREI6OmNsb3NlKFBhc3NSZWZQdHI8SURCRGF0YWJhc2VDYWxs
YmFja3M+IHBycENhbGxiYQogICAgIH0KIH0KIAotdm9pZCBDcmVhdGVPYmplY3RTdG9yZUFib3J0
T3BlcmF0aW9uOjpwZXJmb3JtKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0
aW9uKQotewotICAgIExPRyhTdG9yYWdlQVBJLCAiQ3JlYXRlT2JqZWN0U3RvcmVBYm9ydE9wZXJh
dGlvbiIpOwotICAgIEFTU0VSVF9VTlVTRUQodHJhbnNhY3Rpb24sICF0cmFuc2FjdGlvbik7Ci0g
ICAgbV9kYXRhYmFzZS0+cmVtb3ZlT2JqZWN0U3RvcmUobV9vYmplY3RTdG9yZUlkKTsKLX0KLQot
dm9pZCBEZWxldGVPYmplY3RTdG9yZUFib3J0T3BlcmF0aW9uOjpwZXJmb3JtKElEQlRyYW5zYWN0
aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uKQotewotICAgIExPRyhTdG9yYWdlQVBJLCAi
RGVsZXRlT2JqZWN0U3RvcmVBYm9ydE9wZXJhdGlvbiIpOwotICAgIEFTU0VSVF9VTlVTRUQodHJh
bnNhY3Rpb24sICF0cmFuc2FjdGlvbik7Ci0gICAgbV9kYXRhYmFzZS0+YWRkT2JqZWN0U3RvcmUo
bV9vYmplY3RTdG9yZU1ldGFkYXRhLCBJREJPYmplY3RTdG9yZU1ldGFkYXRhOjpJbnZhbGlkSWQp
OwotfQotCi12b2lkIElEQkRhdGFiYXNlQmFja2VuZExldmVsREI6OlZlcnNpb25DaGFuZ2VBYm9y
dE9wZXJhdGlvbjo6cGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2Fj
dGlvbikKLXsKLSAgICBMT0coU3RvcmFnZUFQSSwgIlZlcnNpb25DaGFuZ2VBYm9ydE9wZXJhdGlv
biIpOwotICAgIEFTU0VSVF9VTlVTRUQodHJhbnNhY3Rpb24sICF0cmFuc2FjdGlvbik7Ci0gICAg
bV9kYXRhYmFzZS0+bV9tZXRhZGF0YS52ZXJzaW9uID0gbV9wcmV2aW91c0ludFZlcnNpb247Ci19
Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RB
VEFCQVNFKSAmJiBVU0UoTEVWRUxEQikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvaW5kZXhlZGRiL2xldmVsZGIvSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQi5oIGIvU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJEYXRhYmFzZUJhY2tlbmRMZXZl
bERCLmgKaW5kZXggZTk4ZjY2NC4uODY3OGViYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCLmgKKysr
IGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJEYXRhYmFzZUJh
Y2tlbmRMZXZlbERCLmgKQEAgLTg5LDYgKzg5LDkgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9p
ZCBkZWxldGVSYW5nZShpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4sIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPikgT1ZF
UlJJREU7CiAgICAgdmlydHVhbCB2b2lkIGNsZWFyKGludDY0X3QgdHJhbnNhY3Rpb25JZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4pIE9WRVJSSURFOwog
CisgICAgY2xhc3MgVmVyc2lvbkNoYW5nZU9wZXJhdGlvbjsKKyAgICBjbGFzcyBWZXJzaW9uQ2hh
bmdlQWJvcnRPcGVyYXRpb247CisKIHByaXZhdGU6CiAgICAgSURCRGF0YWJhc2VCYWNrZW5kTGV2
ZWxEQihjb25zdCBTdHJpbmcmIG5hbWUsIElEQkJhY2tpbmdTdG9yZSogZGF0YWJhc2UsIElEQkZh
Y3RvcnlCYWNrZW5kTGV2ZWxEQiosIGNvbnN0IFN0cmluZyYgdW5pcXVlSWRlbnRpZmllcik7CiAK
QEAgLTEwMCwxMSArMTAzLDYgQEAgcHJpdmF0ZToKICAgICBib29sIGlzRGVsZXRlRGF0YWJhc2VC
bG9ja2VkKCk7CiAgICAgdm9pZCBkZWxldGVEYXRhYmFzZUZpbmFsKFBhc3NSZWZQdHI8SURCQ2Fs
bGJhY2tzPik7CiAKLSAgICBjbGFzcyBWZXJzaW9uQ2hhbmdlT3BlcmF0aW9uOwotCi0gICAgLy8g
V2hlbiBhICJ2ZXJzaW9uY2hhbmdlIiB0cmFuc2FjdGlvbiBhYm9ydHMsIHRoZXNlIHJlc3RvcmUg
dGhlIGJhY2stZW5kIG9iamVjdCBoaWVyYXJjaHkuCi0gICAgY2xhc3MgVmVyc2lvbkNoYW5nZUFi
b3J0T3BlcmF0aW9uOwotCiAgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNraW5nU3Rv
cmU7CiAgICAgSURCRGF0YWJhc2VNZXRhZGF0YSBtX21ldGFkYXRhOwogCkBAIC0xMTgsMTEgKzEx
Niw1MCBAQCBwcml2YXRlOgogICAgIHR5cGVkZWYgSGFzaE1hcDxpbnQ2NF90LCBJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCKj4gVHJhbnNhY3Rpb25NYXA7CiAgICAgVHJhbnNhY3Rpb25NYXAg
bV90cmFuc2FjdGlvbnM7CiAKLSAgICBjbGFzcyBQZW5kaW5nT3BlbkNhbGw7CisgICAgY2xhc3Mg
UGVuZGluZ09wZW5DYWxsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBQYXNzT3duUHRy
PFBlbmRpbmdPcGVuQ2FsbD4gY3JlYXRlKFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFj
a3MsIFBhc3NSZWZQdHI8SURCRGF0YWJhc2VDYWxsYmFja3M+IGRhdGFiYXNlQ2FsbGJhY2tzLCBp
bnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdmVyc2lvbikKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBQZW5kaW5nT3BlbkNhbGwoY2FsbGJhY2tzLCBkYXRh
YmFzZUNhbGxiYWNrcywgdHJhbnNhY3Rpb25JZCwgdmVyc2lvbikpOworICAgICAgICB9CisgICAg
ICAgIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MoKSB7IHJldHVybiBtX2NhbGxi
YWNrczsgfQorICAgICAgICBQYXNzUmVmUHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiBkYXRhYmFz
ZUNhbGxiYWNrcygpIHsgcmV0dXJuIG1fZGF0YWJhc2VDYWxsYmFja3M7IH0KKyAgICAgICAgaW50
NjRfdCB2ZXJzaW9uKCkgeyByZXR1cm4gbV92ZXJzaW9uOyB9CisgICAgICAgIGludDY0X3QgdHJh
bnNhY3Rpb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNhY3Rpb25JZDsgfQorCisgICAgcHJp
dmF0ZToKKyAgICAgICAgUGVuZGluZ09wZW5DYWxsKFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBj
YWxsYmFja3MsIFBhc3NSZWZQdHI8SURCRGF0YWJhc2VDYWxsYmFja3M+IGRhdGFiYXNlQ2FsbGJh
Y2tzLCBpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdmVyc2lvbikKKyAgICAgICAgICAg
IDogbV9jYWxsYmFja3MoY2FsbGJhY2tzKQorICAgICAgICAgICAgLCBtX2RhdGFiYXNlQ2FsbGJh
Y2tzKGRhdGFiYXNlQ2FsbGJhY2tzKQorICAgICAgICAgICAgLCBtX3ZlcnNpb24odmVyc2lvbikK
KyAgICAgICAgICAgICwgbV90cmFuc2FjdGlvbklkKHRyYW5zYWN0aW9uSWQpCisgICAgICAgIHsK
KyAgICAgICAgfQorICAgICAgICBSZWZQdHI8SURCQ2FsbGJhY2tzPiBtX2NhbGxiYWNrczsKKyAg
ICAgICAgUmVmUHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiBtX2RhdGFiYXNlQ2FsbGJhY2tzOwor
ICAgICAgICBpbnQ2NF90IG1fdmVyc2lvbjsKKyAgICAgICAgY29uc3QgaW50NjRfdCBtX3RyYW5z
YWN0aW9uSWQ7CisgICAgfTsKKwogICAgIERlcXVlPE93blB0cjxQZW5kaW5nT3BlbkNhbGw+ID4g
bV9wZW5kaW5nT3BlbkNhbGxzOwogICAgIE93blB0cjxQZW5kaW5nT3BlbkNhbGw+IG1fcGVuZGlu
Z1NlY29uZEhhbGZPcGVuOwogCi0gICAgY2xhc3MgUGVuZGluZ0RlbGV0ZUNhbGw7CisgICAgY2xh
c3MgUGVuZGluZ0RlbGV0ZUNhbGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIFBhc3NP
d25QdHI8UGVuZGluZ0RlbGV0ZUNhbGw+IGNyZWF0ZShQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4g
Y2FsbGJhY2tzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBl
bmRpbmdEZWxldGVDYWxsKGNhbGxiYWNrcykpOworICAgICAgICB9CisgICAgICAgIFBhc3NSZWZQ
dHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MoKSB7IHJldHVybiBtX2NhbGxiYWNrczsgfQorCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgUGVuZGluZ0RlbGV0ZUNhbGwoUGFzc1JlZlB0cjxJREJDYWxs
YmFja3M+IGNhbGxiYWNrcykKKyAgICAgICAgICAgIDogbV9jYWxsYmFja3MoY2FsbGJhY2tzKQor
ICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgUmVmUHRyPElEQkNhbGxiYWNrcz4gbV9jYWxs
YmFja3M7CisgICAgfTsKKwogICAgIERlcXVlPE93blB0cjxQZW5kaW5nRGVsZXRlQ2FsbD4gPiBt
X3BlbmRpbmdEZWxldGVDYWxsczsKIAogICAgIHR5cGVkZWYgTGlzdEhhc2hTZXQ8UmVmUHRyPElE
QkRhdGFiYXNlQ2FsbGJhY2tzPiA+IERhdGFiYXNlQ2FsbGJhY2tzU2V0OwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJPYmplY3RTdG9yZUJh
Y2tlbmRMZXZlbERCLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL2xldmVs
ZGIvSURCT2JqZWN0U3RvcmVCYWNrZW5kTGV2ZWxEQi5jcHAKaW5kZXggZGQxMTEzZi4uYzAwNTUy
ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9J
REJPYmplY3RTdG9yZUJhY2tlbmRMZXZlbERCLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQk9iamVjdFN0b3JlQmFja2VuZExldmVsREIuY3BwCkBA
IC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiSURCQ2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAiSURC
Q3Vyc29yQmFja2VuZExldmVsREIuaCIKICNpbmNsdWRlICJJREJEYXRhYmFzZUJhY2tlbmRMZXZl
bERCLmgiCisjaW5jbHVkZSAiSURCRGF0YWJhc2VDYWxsYmFja3MuaCIKICNpbmNsdWRlICJJREJE
YXRhYmFzZUV4Y2VwdGlvbi5oIgogI2luY2x1ZGUgIklEQktleS5oIgogI2luY2x1ZGUgIklEQktl
eVBhdGguaCIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL2xl
dmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIuY3Bw
CmluZGV4IGQ2ZGI1MzIuLjQ4NzVhYTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvaW5kZXhlZGRiL2xldmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQi5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJUcmFuc2FjdGlv
bkJhY2tlbmRMZXZlbERCLmNwcApAQCAtMzMsMjEgKzMzLDIzIEBACiAjaW5jbHVkZSAiSURCRGF0
YWJhc2VCYWNrZW5kTGV2ZWxEQi5oIgogI2luY2x1ZGUgIklEQkRhdGFiYXNlQ2FsbGJhY2tzLmgi
CiAjaW5jbHVkZSAiSURCRGF0YWJhc2VFeGNlcHRpb24uaCIKKyNpbmNsdWRlICJJREJLZXlSYW5n
ZS5oIgorI2luY2x1ZGUgIklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREJPcGVyYXRpb25zLmgi
CiAjaW5jbHVkZSAiSURCVHJhbnNhY3Rpb25Db29yZGluYXRvckxldmVsREIuaCIKICNpbmNsdWRl
ICJMb2dnaW5nLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotUGFzc1JlZlB0cjxJREJUcmFu
c2FjdGlvbkJhY2tlbmRMZXZlbERCPiBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpjcmVh
dGUoaW50NjRfdCBpZCwgUGFzc1JlZlB0cjxJREJEYXRhYmFzZUNhbGxiYWNrcz4gY2FsbGJhY2tz
LCBjb25zdCBWZWN0b3I8aW50NjRfdD4mIG9iamVjdFN0b3JlSWRzLCBJbmRleGVkREI6OlRyYW5z
YWN0aW9uTW9kZSBtb2RlLCBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCKiBkYXRhYmFzZSkKK1Bh
c3NSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQj4gSURCVHJhbnNhY3Rpb25CYWNr
ZW5kTGV2ZWxEQjo6Y3JlYXRlKElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90
IGlkLCBQYXNzUmVmUHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiBjYWxsYmFja3MsIGNvbnN0IFZl
Y3RvcjxpbnQ2NF90PiYgb2JqZWN0U3RvcmVJZHMsIEluZGV4ZWREQjo6VHJhbnNhY3Rpb25Nb2Rl
IG1vZGUsIElEQkRhdGFiYXNlQmFja2VuZExldmVsREIqIGRhdGFiYXNlKQogewogICAgIEhhc2hT
ZXQ8aW50NjRfdD4gb2JqZWN0U3RvcmVIYXNoU2V0OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgb2JqZWN0U3RvcmVJZHMuc2l6ZSgpOyArK2kpCiAgICAgICAgIG9iamVjdFN0b3JlSGFzaFNl
dC5hZGQob2JqZWN0U3RvcmVJZHNbaV0pOwogCi0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJREJU
cmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKGlkLCBjYWxsYmFja3MsIG9iamVjdFN0b3JlSGFzaFNl
dCwgbW9kZSwgZGF0YWJhc2UpKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IElEQlRyYW5zYWN0
aW9uQmFja2VuZExldmVsREIoYmFja2luZ1N0b3JlLCBpZCwgY2FsbGJhY2tzLCBvYmplY3RTdG9y
ZUhhc2hTZXQsIG1vZGUsIGRhdGFiYXNlKSk7CiB9CiAKLUlEQlRyYW5zYWN0aW9uQmFja2VuZExl
dmVsREI6OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIoaW50NjRfdCBpZCwgUGFzc1JlZlB0
cjxJREJEYXRhYmFzZUNhbGxiYWNrcz4gY2FsbGJhY2tzLCBjb25zdCBIYXNoU2V0PGludDY0X3Q+
JiBvYmplY3RTdG9yZUlkcywgSW5kZXhlZERCOjpUcmFuc2FjdGlvbk1vZGUgbW9kZSwgSURCRGF0
YWJhc2VCYWNrZW5kTGV2ZWxEQiogZGF0YWJhc2UpCitJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZl
bERCOjpJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKElEQkJhY2tpbmdTdG9yZSogYmFja2lu
Z1N0b3JlLCBpbnQ2NF90IGlkLCBQYXNzUmVmUHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiBjYWxs
YmFja3MsIGNvbnN0IEhhc2hTZXQ8aW50NjRfdD4mIG9iamVjdFN0b3JlSWRzLCBJbmRleGVkREI6
OlRyYW5zYWN0aW9uTW9kZSBtb2RlLCBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCKiBkYXRhYmFz
ZSkKICAgICA6IG1faWQoaWQpCiAgICAgLCBtX29iamVjdFN0b3JlSWRzKG9iamVjdFN0b3JlSWRz
KQogICAgICwgbV9tb2RlKG1vZGUpCkBAIC01OCw2ICs2MCw3IEBAIElEQlRyYW5zYWN0aW9uQmFj
a2VuZExldmVsREI6OklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIoaW50NjRfdCBpZCwgUGFz
c1JlZlB0CiAgICAgLCBtX3RyYW5zYWN0aW9uKGRhdGFiYXNlLT5iYWNraW5nU3RvcmUoKS5nZXQo
KSkKICAgICAsIG1fdGFza1RpbWVyKHRoaXMsICZJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERC
Ojp0YXNrVGltZXJGaXJlZCkKICAgICAsIG1fcGVuZGluZ1ByZWVtcHRpdmVFdmVudHMoMCkKKyAg
ICAsIG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKIHsKICAgICAvLyBXZSBwYXNzIGEgcmVm
ZXJlbmNlIG9mIHRoaXMgb2JqZWN0IGJlZm9yZSBpdCBjYW4gYmUgYWRvcHRlZC4KICAgICByZWxh
eEFkb3B0aW9uUmVxdWlyZW1lbnQoKTsKQEAgLTExNyw3ICsxMjAsNyBAQCB2b2lkIElEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREI6OmFib3J0KFBhc3NSZWZQdHI8SURCRGF0YWJhc2VFcnJvcj4g
ZXJyb3IpCiAgICAgLy8gUnVuIHRoZSBhYm9ydCB0YXNrcywgaWYgYW55LgogICAgIHdoaWxlICgh
bV9hYm9ydFRhc2tRdWV1ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgT3duUHRyPE9wZXJhdGlvbj4g
dGFzayhtX2Fib3J0VGFza1F1ZXVlLnRha2VGaXJzdCgpKTsKLSAgICAgICAgdGFzay0+cGVyZm9y
bSgwKTsKKyAgICAgICAgdGFzay0+cGVyZm9ybSgpOwogICAgIH0KIAogICAgIC8vIEJhY2tpbmcg
c3RvcmUgcmVzb3VyY2VzIChoZWxkIHZpYSBjdXJzb3JzKSBtdXN0IGJlIHJlbGVhc2VkIGJlZm9y
ZSBzY3JpcHQgY2FsbGJhY2tzCkBAIC0yNDgsNyArMjUxLDcgQEAgdm9pZCBJREJUcmFuc2FjdGlv
bkJhY2tlbmRMZXZlbERCOjp0YXNrVGltZXJGaXJlZChUaW1lcjxJREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXYKICAgICB3aGlsZSAoIXRhc2tRdWV1ZS0+aXNFbXB0eSgpICYmIG1fc3RhdGUgIT0gRmlu
aXNoZWQpIHsKICAgICAgICAgQVNTRVJUKG1fc3RhdGUgPT0gUnVubmluZyk7CiAgICAgICAgIE93
blB0cjxPcGVyYXRpb24+IHRhc2sodGFza1F1ZXVlLT50YWtlRmlyc3QoKSk7Ci0gICAgICAgIHRh
c2stPnBlcmZvcm0odGhpcyk7CisgICAgICAgIHRhc2stPnBlcmZvcm0oKTsKIAogICAgICAgICAv
LyBFdmVudCBpdHNlbGYgbWF5IGNoYW5nZSB3aGljaCBxdWV1ZSBzaG91bGQgYmUgcHJvY2Vzc2Vk
IG5leHQuCiAgICAgICAgIHRhc2tRdWV1ZSA9IG1fcGVuZGluZ1ByZWVtcHRpdmVFdmVudHMgPyAm
bV9wcmVlbXB0aXZlVGFza1F1ZXVlIDogJm1fdGFza1F1ZXVlOwpAQCAtMjY3LDYgKzI3MCw2NyBA
QCB2b2lkIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OmNsb3NlT3BlbkN1cnNvcnMoKQog
ICAgIG1fb3BlbkN1cnNvcnMuY2xlYXIoKTsKIH0KIAordm9pZCBJREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXZlbERCOjpzY2hlZHVsZUNyZWF0ZU9iamVjdFN0b3JlT3BlcmF0aW9uKGNvbnN0IElEQk9i
amVjdFN0b3JlTWV0YWRhdGEmIG9iamVjdFN0b3JlTWV0YWRhdGEpCit7CisgICAgc2NoZWR1bGVU
YXNrKENyZWF0ZU9iamVjdFN0b3JlT3BlcmF0aW9uOjpjcmVhdGUodGhpcywgbV9iYWNraW5nU3Rv
cmUuZ2V0KCksIG9iamVjdFN0b3JlTWV0YWRhdGEpLCBDcmVhdGVPYmplY3RTdG9yZUFib3J0T3Bl
cmF0aW9uOjpjcmVhdGUodGhpcywgb2JqZWN0U3RvcmVNZXRhZGF0YS5pZCkpOworfQorCit2b2lk
IElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OnNjaGVkdWxlRGVsZXRlT2JqZWN0U3RvcmVP
cGVyYXRpb24oY29uc3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSYgb2JqZWN0U3RvcmVNZXRhZGF0
YSkKK3sKKyAgICBzY2hlZHVsZVRhc2soRGVsZXRlT2JqZWN0U3RvcmVPcGVyYXRpb246OmNyZWF0
ZSh0aGlzLCBtX2JhY2tpbmdTdG9yZS5nZXQoKSwgb2JqZWN0U3RvcmVNZXRhZGF0YSksIERlbGV0
ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb246OmNyZWF0ZSh0aGlzLCBvYmplY3RTdG9yZU1ldGFk
YXRhKSk7Cit9CisKK3ZvaWQgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6c2NoZWR1bGVW
ZXJzaW9uQ2hhbmdlT3BlcmF0aW9uKGludDY0X3QgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCByZXF1
ZXN0ZWRWZXJzaW9uLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzLCBQYXNzUmVm
UHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiBkYXRhYmFzZUNhbGxiYWNrcywgY29uc3QgSURCRGF0
YWJhc2VNZXRhZGF0YSYgbWV0YWRhdGEpCit7CisgICAgc2NoZWR1bGVUYXNrKElEQkRhdGFiYXNl
QmFja2VuZExldmVsREI6OlZlcnNpb25DaGFuZ2VPcGVyYXRpb246OmNyZWF0ZSh0aGlzLCB0cmFu
c2FjdGlvbklkLCByZXF1ZXN0ZWRWZXJzaW9uLCBjYWxsYmFja3MsIGRhdGFiYXNlQ2FsbGJhY2tz
KSwgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6VmVyc2lvbkNoYW5nZUFib3J0T3BlcmF0aW9u
OjpjcmVhdGUodGhpcywgU3RyaW5nOjpudW1iZXIobWV0YWRhdGEudmVyc2lvbiksIG1ldGFkYXRh
LnZlcnNpb24pKTsKK30KKwordm9pZCBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpzY2hl
ZHVsZUNyZWF0ZUluZGV4T3BlcmF0aW9uKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURC
SW5kZXhNZXRhZGF0YSYgaW5kZXhNZXRhZGF0YSkKK3sKKyAgICBzY2hlZHVsZVRhc2soQ3JlYXRl
SW5kZXhPcGVyYXRpb246OmNyZWF0ZSh0aGlzLCBtX2JhY2tpbmdTdG9yZS5nZXQoKSwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhNZXRhZGF0YSksIENyZWF0ZUluZGV4QWJvcnRPcGVyYXRpb246OmNyZWF0
ZSh0aGlzLCBvYmplY3RTdG9yZUlkLCBpbmRleE1ldGFkYXRhLmlkKSk7Cit9CisKK3ZvaWQgSURC
VHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6c2NoZWR1bGVEZWxldGVJbmRleE9wZXJhdGlvbihp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQkluZGV4TWV0YWRhdGEmIGluZGV4TWV0YWRh
dGEpCit7CisgICAgc2NoZWR1bGVUYXNrKERlbGV0ZUluZGV4T3BlcmF0aW9uOjpjcmVhdGUodGhp
cywgbV9iYWNraW5nU3RvcmUuZ2V0KCksIG9iamVjdFN0b3JlSWQsIGluZGV4TWV0YWRhdGEpLCBE
ZWxldGVJbmRleEFib3J0T3BlcmF0aW9uOjpjcmVhdGUodGhpcywgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhNZXRhZGF0YSkpOworfQorCit2b2lkIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OnNj
aGVkdWxlR2V0T3BlcmF0aW9uKGNvbnN0IElEQkRhdGFiYXNlTWV0YWRhdGEmIG1ldGFkYXRhLCBp
bnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgUGFzc1JlZlB0cjxJREJLZXlS
YW5nZT4ga2V5UmFuZ2UsIEluZGV4ZWREQjo6Q3Vyc29yVHlwZSBjdXJzb3JUeXBlLCBQYXNzUmVm
UHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQoreworICAgIHNjaGVkdWxlVGFzayhHZXRPcGVy
YXRpb246OmNyZWF0ZSh0aGlzLCBtX2JhY2tpbmdTdG9yZS5nZXQoKSwgbWV0YWRhdGEsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQsIGtleVJhbmdlLCBjdXJzb3JUeXBlLCBjYWxsYmFja3MpKTsKK30K
Kwordm9pZCBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpzY2hlZHVsZVB1dE9wZXJhdGlv
bihjb25zdCBJREJPYmplY3RTdG9yZU1ldGFkYXRhJiBvYmplY3RTdG9yZU1ldGFkYXRhLCBQYXNz
UmVmUHRyPFNoYXJlZEJ1ZmZlcj4gdmFsdWUsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIElEQkRh
dGFiYXNlQmFja2VuZEludGVyZmFjZTo6UHV0TW9kZSBwdXRNb2RlLCBQYXNzUmVmUHRyPElEQkNh
bGxiYWNrcz4gY2FsbGJhY2tzLCBjb25zdCBWZWN0b3I8aW50NjRfdD4mIGluZGV4SWRzLCBjb25z
dCBWZWN0b3I8SURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpJbmRleEtleXM+JiBpbmRleEtl
eXMpCit7CisgICAgc2NoZWR1bGVUYXNrKFB1dE9wZXJhdGlvbjo6Y3JlYXRlKHRoaXMsIG1fYmFj
a2luZ1N0b3JlLmdldCgpLCBkYXRhYmFzZSgpLT5pZCgpLCBvYmplY3RTdG9yZU1ldGFkYXRhLCB2
YWx1ZSwga2V5LCBwdXRNb2RlLCBjYWxsYmFja3MsIGluZGV4SWRzLCBpbmRleEtleXMpKTsKK30K
Kwordm9pZCBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpzY2hlZHVsZVNldEluZGV4ZXNS
ZWFkeU9wZXJhdGlvbihzaXplX3QgaW5kZXhDb3VudCkKK3sKKyAgICBzY2hlZHVsZVRhc2soSURC
RGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpQcmVlbXB0aXZlVGFzaywgU2V0SW5kZXhlc1JlYWR5
T3BlcmF0aW9uOjpjcmVhdGUodGhpcywgaW5kZXhDb3VudCkpOworfQorCit2b2lkIElEQlRyYW5z
YWN0aW9uQmFja2VuZExldmVsREI6OnNjaGVkdWxlT3BlbkN1cnNvck9wZXJhdGlvbihpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4g
a2V5UmFuZ2UsIEluZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uIGRpcmVjdGlvbiwgSW5kZXhlZERC
OjpDdXJzb3JUeXBlIGN1cnNvclR5cGUsIElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6VGFz
a1R5cGUgdGFza1R5cGUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCit7Cisg
ICAgc2NoZWR1bGVUYXNrKE9wZW5DdXJzb3JPcGVyYXRpb246OmNyZWF0ZSh0aGlzLCBtX2JhY2tp
bmdTdG9yZS5nZXQoKSwgZGF0YWJhc2UoKS0+aWQoKSwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwg
a2V5UmFuZ2UsIGRpcmVjdGlvbiwgY3Vyc29yVHlwZSwgdGFza1R5cGUsIGNhbGxiYWNrcykpOwor
fQorCit2b2lkIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6OnNjaGVkdWxlQ291bnRPcGVy
YXRpb24oaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIFBhc3NSZWZQdHI8
SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tz
KQoreworICAgIHNjaGVkdWxlVGFzayhDb3VudE9wZXJhdGlvbjo6Y3JlYXRlKHRoaXMsIG1fYmFj
a2luZ1N0b3JlLmdldCgpLCBkYXRhYmFzZSgpLT5pZCgpLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
LCBrZXlSYW5nZSwgY2FsbGJhY2tzKSk7Cit9CisKK3ZvaWQgSURCVHJhbnNhY3Rpb25CYWNrZW5k
TGV2ZWxEQjo6c2NoZWR1bGVEZWxldGVSYW5nZU9wZXJhdGlvbihpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBQYXNzUmVmUHRyPElEQkNhbGxi
YWNrcz4gY2FsbGJhY2tzKQoreworICAgIHNjaGVkdWxlVGFzayhEZWxldGVSYW5nZU9wZXJhdGlv
bjo6Y3JlYXRlKHRoaXMsIG1fYmFja2luZ1N0b3JlLmdldCgpLCBkYXRhYmFzZSgpLT5pZCgpLCBv
YmplY3RTdG9yZUlkLCBrZXlSYW5nZSwgY2FsbGJhY2tzKSk7Cit9CisKK3ZvaWQgSURCVHJhbnNh
Y3Rpb25CYWNrZW5kTGV2ZWxEQjo6c2NoZWR1bGVDbGVhck9wZXJhdGlvbihpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCit7CisgICAgc2No
ZWR1bGVUYXNrKENsZWFyT3BlcmF0aW9uOjpjcmVhdGUodGhpcywgbV9iYWNraW5nU3RvcmUuZ2V0
KCksIGRhdGFiYXNlKCktPmlkKCksIG9iamVjdFN0b3JlSWQsIGNhbGxiYWNrcykpOworfQorCisK
IH07CiAKICNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkgJiYgVVNFKExFVkVMREIp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lE
QlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIuaCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5k
ZXhlZGRiL2xldmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQi5oCmluZGV4IDZlNGY3
MzYuLmM2MGUzM2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRi
L2xldmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQi5oCisrKyBiL1NvdXJjZS9XZWJD
b3JlL01vZHVsZXMvaW5kZXhlZGRiL2xldmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
Qi5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiSURCRGF0YWJhc2VCYWNrZW5kSW50ZXJm
YWNlLmgiCiAjaW5jbHVkZSAiSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQi5oIgogI2luY2x1ZGUg
IklEQkRhdGFiYXNlRXJyb3IuaCIKKyNpbmNsdWRlICJJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRl
cmZhY2UuaCIKICNpbmNsdWRlICJUaW1lci5oIgogI2luY2x1ZGUgPHd0Zi9EZXF1ZS5oPgogI2lu
Y2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CkBAIC0zOSwxMiArNDAsMTMgQEAKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCitjbGFzcyBJREJCYWNraW5nU3RvcmU7CiBjbGFzcyBJREJDdXJzb3JCYWNrZW5k
TGV2ZWxEQjsKIGNsYXNzIElEQkRhdGFiYXNlQ2FsbGJhY2tzOwogCi1jbGFzcyBJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCIDogcHVibGljIFJlZkNvdW50ZWQ8SURCVHJhbnNhY3Rpb25CYWNr
ZW5kTGV2ZWxEQj4geworY2xhc3MgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiA6IHB1Ymxp
YyBJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2UgewogcHVibGljOgotICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI+IGNyZWF0ZShpbnQ2NF90IHRy
YW5zYWN0aW9uSWQsIFBhc3NSZWZQdHI8SURCRGF0YWJhc2VDYWxsYmFja3M+LCBjb25zdCBWZWN0
b3I8aW50NjRfdD4mLCBJbmRleGVkREI6OlRyYW5zYWN0aW9uTW9kZSwgSURCRGF0YWJhc2VCYWNr
ZW5kTGV2ZWxEQiopOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2Vu
ZExldmVsREI+IGNyZWF0ZShJREJCYWNraW5nU3RvcmUqLCBpbnQ2NF90IHRyYW5zYWN0aW9uSWQs
IFBhc3NSZWZQdHI8SURCRGF0YWJhc2VDYWxsYmFja3M+LCBjb25zdCBWZWN0b3I8aW50NjRfdD4m
LCBJbmRleGVkREI6OlRyYW5zYWN0aW9uTW9kZSwgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQiop
OwogICAgIHZpcnR1YWwgfklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIoKTsKIAogICAgIHZp
cnR1YWwgdm9pZCBhYm9ydCgpOwpAQCAtNTMsNyArNTUsNyBAQCBwdWJsaWM6CiAgICAgY2xhc3Mg
T3BlcmF0aW9uIHsKICAgICBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgfk9wZXJhdGlvbigpIHsg
fQotICAgICAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZl
bERCKikgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybSgpID0gMDsKICAgICB9Owog
CiAgICAgdm9pZCBhYm9ydChQYXNzUmVmUHRyPElEQkRhdGFiYXNlRXJyb3I+KTsKQEAgLTcxLDgg
KzczLDIxIEBAIHB1YmxpYzoKIAogICAgIElEQkRhdGFiYXNlQmFja2VuZExldmVsREIqIGRhdGFi
YXNlKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhYmFzZS5nZXQoKTsgfQogCisgICAgdmlydHVhbCB2
b2lkIHNjaGVkdWxlQ3JlYXRlT2JqZWN0U3RvcmVPcGVyYXRpb24oY29uc3QgSURCT2JqZWN0U3Rv
cmVNZXRhZGF0YSYpOworICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZURlbGV0ZU9iamVjdFN0b3Jl
T3BlcmF0aW9uKGNvbnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEmKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2NoZWR1bGVWZXJzaW9uQ2hhbmdlT3BlcmF0aW9uKGludDY0X3QgdHJhbnNhY3Rpb25JZCwg
aW50NjRfdCByZXF1ZXN0ZWRWZXJzaW9uLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4sIFBhc3NS
ZWZQdHI8SURCRGF0YWJhc2VDYWxsYmFja3M+LCBjb25zdCBJREJEYXRhYmFzZU1ldGFkYXRhJik7
CisgICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlQ3JlYXRlSW5kZXhPcGVyYXRpb24oaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBjb25zdCBJREJJbmRleE1ldGFkYXRhJik7CisgICAgdmlydHVhbCB2b2lk
IHNjaGVkdWxlRGVsZXRlSW5kZXhPcGVyYXRpb24oaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25z
dCBJREJJbmRleE1ldGFkYXRhJik7CisgICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlR2V0T3BlcmF0
aW9uKGNvbnN0IElEQkRhdGFiYXNlTWV0YWRhdGEmLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4sIEluZGV4ZWREQjo6Q3Vyc29y
VHlwZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1
bGVQdXRPcGVyYXRpb24oY29uc3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSYsIFBhc3NSZWZQdHI8
U2hhcmVkQnVmZmVyPiB2YWx1ZSwgUGFzc1JlZlB0cjxJREJLZXk+IGtleSwgSURCRGF0YWJhc2VC
YWNrZW5kSW50ZXJmYWNlOjpQdXRNb2RlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4sIGNvbnN0
IFZlY3RvcjxpbnQ2NF90PiYgaW5kZXhJZHMsIGNvbnN0IFZlY3RvcjxJREJEYXRhYmFzZUJhY2tl
bmRJbnRlcmZhY2U6OkluZGV4S2V5cz4mKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVTZXRJ
bmRleGVzUmVhZHlPcGVyYXRpb24oc2l6ZV90IGluZGV4Q291bnQpOworICAgIHZpcnR1YWwgdm9p
ZCBzY2hlZHVsZU9wZW5DdXJzb3JPcGVyYXRpb24oaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IGluZGV4SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+LCBJbmRleGVkREI6OkN1cnNvckRp
cmVjdGlvbiwgSW5kZXhlZERCOjpDdXJzb3JUeXBlLCBJREJEYXRhYmFzZUJhY2tlbmRJbnRlcmZh
Y2U6OlRhc2tUeXBlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4pOworICAgIHZpcnR1YWwgdm9p
ZCBzY2hlZHVsZUNvdW50T3BlcmF0aW9uKGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBp
bmRleElkLCBQYXNzUmVmUHRyPElEQktleVJhbmdlPiwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+
KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVEZWxldGVSYW5nZU9wZXJhdGlvbihpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+LCBQYXNzUmVmUHRyPElEQkNh
bGxiYWNrcz4pOworICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZUNsZWFyT3BlcmF0aW9uKGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+KTsKKyAgICAKIHByaXZh
dGU6Ci0gICAgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQihpbnQ2NF90IGlkLCBQYXNzUmVm
UHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiwgY29uc3QgSGFzaFNldDxpbnQ2NF90PiYgb2JqZWN0
U3RvcmVJZHMsIEluZGV4ZWREQjo6VHJhbnNhY3Rpb25Nb2RlLCBJREJEYXRhYmFzZUJhY2tlbmRM
ZXZlbERCKik7CisgICAgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQihJREJCYWNraW5nU3Rv
cmUqLCBpbnQ2NF90IGlkLCBQYXNzUmVmUHRyPElEQkRhdGFiYXNlQ2FsbGJhY2tzPiwgY29uc3Qg
SGFzaFNldDxpbnQ2NF90PiYgb2JqZWN0U3RvcmVJZHMsIEluZGV4ZWREQjo6VHJhbnNhY3Rpb25N
b2RlLCBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCKik7CiAKICAgICBlbnVtIFN0YXRlIHsKICAg
ICAgICAgVW51c2VkLCAvLyBDcmVhdGVkLCBidXQgbm8gdGFza3MgeWV0LgpAQCAtMTEwLDYgKzEy
NSw4IEBAIHByaXZhdGU6CiAgICAgaW50IG1fcGVuZGluZ1ByZWVtcHRpdmVFdmVudHM7CiAKICAg
ICBIYXNoU2V0PElEQkN1cnNvckJhY2tlbmRMZXZlbERCKj4gbV9vcGVuQ3Vyc29yczsKKyAgICAK
KyAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9yZTsKIH07CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5k
ZXhlZGRiL2xldmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQk9wZXJhdGlvbnMuY3Bw
IGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJUcmFuc2FjdGlv
bkJhY2tlbmRMZXZlbERCT3BlcmF0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uZGNlNzk2YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvaW5kZXhlZGRiL2xldmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQk9wZXJhdGlv
bnMuY3BwCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIklEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREJPcGVyYXRpb25zLmgiCisK
KyNpbmNsdWRlICJJREJDdXJzb3JCYWNrZW5kTGV2ZWxEQi5oIgorI2luY2x1ZGUgIklEQkRhdGFi
YXNlQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAiSURCS2V5UmFuZ2UuaCIKKyNpbmNsdWRlICJJREJP
YmplY3RTdG9yZUJhY2tlbmRMZXZlbERCLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1
ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKSAm
JiBVU0UoTEVWRUxEQikKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIENyZWF0ZU9iamVj
dFN0b3JlT3BlcmF0aW9uOjpwZXJmb3JtKCkKK3sKKyAgICBMT0coU3RvcmFnZUFQSSwgIkNyZWF0
ZU9iamVjdFN0b3JlT3BlcmF0aW9uIik7CisgICAgaWYgKCFtX2JhY2tpbmdTdG9yZS0+Y3JlYXRl
T2JqZWN0U3RvcmUobV90cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV90
cmFuc2FjdGlvbi0+ZGF0YWJhc2UoKS0+aWQoKSwgbV9vYmplY3RTdG9yZU1ldGFkYXRhLmlkLCBt
X29iamVjdFN0b3JlTWV0YWRhdGEubmFtZSwgbV9vYmplY3RTdG9yZU1ldGFkYXRhLmtleVBhdGgs
IG1fb2JqZWN0U3RvcmVNZXRhZGF0YS5hdXRvSW5jcmVtZW50KSkgeworICAgICAgICBSZWZQdHI8
SURCRGF0YWJhc2VFcnJvcj4gZXJyb3IgPSBJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0
YWJhc2VFeGNlcHRpb246OlVua25vd25FcnJvciwgU3RyaW5nOjpmb3JtYXQoIkludGVybmFsIGVy
cm9yIGNyZWF0aW5nIG9iamVjdCBzdG9yZSAnJXMnLiIsIG1fb2JqZWN0U3RvcmVNZXRhZGF0YS5u
YW1lLnV0ZjgoKS5kYXRhKCkpKTsKKyAgICAgICAgbV90cmFuc2FjdGlvbi0+YWJvcnQoZXJyb3Iu
cmVsZWFzZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwordm9pZCBDcmVhdGVJbmRl
eE9wZXJhdGlvbjo6cGVyZm9ybSgpCit7CisgICAgTE9HKFN0b3JhZ2VBUEksICJDcmVhdGVJbmRl
eE9wZXJhdGlvbiIpOworICAgIGlmICghbV9iYWNraW5nU3RvcmUtPmNyZWF0ZUluZGV4KG1fdHJh
bnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fdHJhbnNhY3Rpb24tPmRhdGFi
YXNlKCktPmlkKCksIG1fb2JqZWN0U3RvcmVJZCwgbV9pbmRleE1ldGFkYXRhLmlkLCBtX2luZGV4
TWV0YWRhdGEubmFtZSwgbV9pbmRleE1ldGFkYXRhLmtleVBhdGgsIG1faW5kZXhNZXRhZGF0YS51
bmlxdWUsIG1faW5kZXhNZXRhZGF0YS5tdWx0aUVudHJ5KSkgeworICAgICAgICBtX3RyYW5zYWN0
aW9uLT5hYm9ydChJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246
OlVua25vd25FcnJvciwgU3RyaW5nOjpmb3JtYXQoIkludGVybmFsIGVycm9yIHdoZW4gdHJ5aW5n
IHRvIGNyZWF0ZSBpbmRleCAnJXMnLiIsIG1faW5kZXhNZXRhZGF0YS5uYW1lLnV0ZjgoKS5kYXRh
KCkpKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgQ3JlYXRlSW5kZXhBYm9y
dE9wZXJhdGlvbjo6cGVyZm9ybSgpCit7CisgICAgTE9HKFN0b3JhZ2VBUEksICJDcmVhdGVJbmRl
eEFib3J0T3BlcmF0aW9uIik7CisgICAgbV90cmFuc2FjdGlvbi0+ZGF0YWJhc2UoKS0+cmVtb3Zl
SW5kZXgobV9vYmplY3RTdG9yZUlkLCBtX2luZGV4SWQpOworfQorCit2b2lkIERlbGV0ZUluZGV4
T3BlcmF0aW9uOjpwZXJmb3JtKCkKK3sKKyAgICBMT0coU3RvcmFnZUFQSSwgIkRlbGV0ZUluZGV4
T3BlcmF0aW9uIik7CisgICAgYm9vbCBvayA9IG1fYmFja2luZ1N0b3JlLT5kZWxldGVJbmRleCht
X3RyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlvbigpLCBtX3RyYW5zYWN0aW9uLT5k
YXRhYmFzZSgpLT5pZCgpLCBtX29iamVjdFN0b3JlSWQsIG1faW5kZXhNZXRhZGF0YS5pZCk7Cisg
ICAgaWYgKCFvaykgeworICAgICAgICBSZWZQdHI8SURCRGF0YWJhc2VFcnJvcj4gZXJyb3IgPSBJ
REJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVua25vd25FcnJv
ciwgU3RyaW5nOjpmb3JtYXQoIkludGVybmFsIGVycm9yIGRlbGV0aW5nIGluZGV4ICclcycuIiwg
bV9pbmRleE1ldGFkYXRhLm5hbWUudXRmOCgpLmRhdGEoKSkpOworICAgICAgICBtX3RyYW5zYWN0
aW9uLT5hYm9ydChlcnJvcik7CisgICAgfQorfQorCit2b2lkIERlbGV0ZUluZGV4QWJvcnRPcGVy
YXRpb246OnBlcmZvcm0oKQoreworICAgIExPRyhTdG9yYWdlQVBJLCAiRGVsZXRlSW5kZXhBYm9y
dE9wZXJhdGlvbiIpOworICAgIG1fdHJhbnNhY3Rpb24tPmRhdGFiYXNlKCktPmFkZEluZGV4KG1f
b2JqZWN0U3RvcmVJZCwgbV9pbmRleE1ldGFkYXRhLCBJREJJbmRleE1ldGFkYXRhOjpJbnZhbGlk
SWQpOworfQorCit2b2lkIEdldE9wZXJhdGlvbjo6cGVyZm9ybSgpCit7CisgICAgTE9HKFN0b3Jh
Z2VBUEksICJHZXRPcGVyYXRpb24iKTsKKworICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKworICAg
IGlmIChtX2tleVJhbmdlLT5pc09ubHlLZXkoKSkKKyAgICAgICAga2V5ID0gbV9rZXlSYW5nZS0+
bG93ZXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yPiBiYWNraW5nU3RvcmVDdXJzb3I7CisgICAgICAgIGlmIChtX2luZGV4SWQgPT0gSURCSW5k
ZXhNZXRhZGF0YTo6SW52YWxpZElkKSB7CisgICAgICAgICAgICBBU1NFUlQobV9jdXJzb3JUeXBl
ICE9IEluZGV4ZWREQjo6Q3Vyc29yS2V5T25seSk7CisgICAgICAgICAgICAvLyBPYmplY3RTdG9y
ZSBSZXRyaWV2YWwgT3BlcmF0aW9uCisgICAgICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBt
X2JhY2tpbmdTdG9yZS0+b3Blbk9iamVjdFN0b3JlQ3Vyc29yKG1fdHJhbnNhY3Rpb24tPmJhY2tp
bmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2tl
eVJhbmdlLmdldCgpLCBJbmRleGVkREI6OkN1cnNvck5leHQpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgaWYgKG1fY3Vyc29yVHlwZSA9PSBJbmRleGVkREI6OkN1cnNvcktleU9ubHkp
CisgICAgICAgICAgICAgICAgLy8gSW5kZXggVmFsdWUgUmV0cmlldmFsIE9wZXJhdGlvbgorICAg
ICAgICAgICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9IG1fYmFja2luZ1N0b3JlLT5vcGVuSW5k
ZXhLZXlDdXJzb3IobV90cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9k
YXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQsIG1faW5kZXhJZCwgbV9rZXlSYW5nZS5nZXQoKSwg
SW5kZXhlZERCOjpDdXJzb3JOZXh0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICAvLyBJbmRleCBSZWZlcmVuY2VkIFZhbHVlIFJldHJpZXZhbCBPcGVyYXRpb24KKyAgICAgICAg
ICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBtX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4Q3Vy
c29yKG1fdHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0YWJhc2VJ
ZCwgbV9vYmplY3RTdG9yZUlkLCBtX2luZGV4SWQsIG1fa2V5UmFuZ2UuZ2V0KCksIEluZGV4ZWRE
Qjo6Q3Vyc29yTmV4dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJhY2tpbmdTdG9yZUN1
cnNvcikgeworICAgICAgICAgICAgbV9jYWxsYmFja3MtPm9uU3VjY2VzcygpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAga2V5ID0gYmFja2luZ1N0b3JlQ3Vyc29y
LT5rZXkoKTsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCS2V5PiBwcmltYXJ5S2V5OworICAgIGJv
b2wgb2s7CisgICAgaWYgKG1faW5kZXhJZCA9PSBJREJJbmRleE1ldGFkYXRhOjpJbnZhbGlkSWQp
IHsKKyAgICAgICAgLy8gT2JqZWN0IFN0b3JlIFJldHJpZXZhbCBPcGVyYXRpb24KKyAgICAgICAg
VmVjdG9yPGNoYXI+IHZhbHVlOworICAgICAgICBvayA9IG1fYmFja2luZ1N0b3JlLT5nZXRSZWNv
cmQobV90cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlk
LCBtX29iamVjdFN0b3JlSWQsICprZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKCFvaykgeworICAg
ICAgICAgICAgbV9jYWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElE
QkRhdGFiYXNlRXhjZXB0aW9uOjpVbmtub3duRXJyb3IsICJJbnRlcm5hbCBlcnJvciBpbiBnZXRS
ZWNvcmQuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYg
KHZhbHVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbV9jYWxsYmFja3MtPm9uU3VjY2Vzcygp
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fYXV0b0lu
Y3JlbWVudCAmJiAhbV9rZXlQYXRoLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBtX2NhbGxiYWNr
cy0+b25TdWNjZXNzKFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3IodmFsdWUpLCBrZXksIG1fa2V5
UGF0aCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtX2NhbGxi
YWNrcy0+b25TdWNjZXNzKFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3IodmFsdWUpKTsKKyAgICAg
ICAgcmV0dXJuOworCisgICAgfQorCisgICAgLy8gRnJvbSBoZXJlIHdlIGFyZSBkZWFsaW5nIG9u
bHkgd2l0aCBpbmRleGVzLgorICAgIG9rID0gbV9iYWNraW5nU3RvcmUtPmdldFByaW1hcnlLZXlW
aWFJbmRleChtX3RyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlvbigpLCBtX2RhdGFi
YXNlSWQsIG1fb2JqZWN0U3RvcmVJZCwgbV9pbmRleElkLCAqa2V5LCBwcmltYXJ5S2V5KTsKKyAg
ICBpZiAoIW9rKSB7CisgICAgICAgIG1fY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJy
b3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VW5rbm93bkVycm9yLCAiSW50ZXJuYWwg
ZXJyb3IgaW4gZ2V0UHJpbWFyeUtleVZpYUluZGV4LiIpKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICBpZiAoIXByaW1hcnlLZXkpIHsKKyAgICAgICAgbV9jYWxsYmFja3MtPm9uU3VjY2Vz
cygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtX2N1cnNvclR5cGUgPT0gSW5k
ZXhlZERCOjpDdXJzb3JLZXlPbmx5KSB7CisgICAgICAgIC8vIEluZGV4IFZhbHVlIFJldHJpZXZh
bCBPcGVyYXRpb24KKyAgICAgICAgbV9jYWxsYmFja3MtPm9uU3VjY2VzcyhwcmltYXJ5S2V5Lmdl
dCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluZGV4IFJlZmVyZW5jZWQg
VmFsdWUgUmV0cmlldmFsIE9wZXJhdGlvbgorICAgIFZlY3RvcjxjaGFyPiB2YWx1ZTsKKyAgICBv
ayA9IG1fYmFja2luZ1N0b3JlLT5nZXRSZWNvcmQobV90cmFuc2FjdGlvbi0+YmFja2luZ1N0b3Jl
VHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQsICpwcmltYXJ5S2V5
LCB2YWx1ZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBtX2NhbGxiYWNrcy0+b25FcnJvcihJ
REJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVua25vd25FcnJv
ciwgIkludGVybmFsIGVycm9yIGluIGdldFJlY29yZC4iKSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBpZiAodmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgIG1fY2FsbGJhY2tzLT5v
blN1Y2Nlc3MoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobV9hdXRvSW5jcmVt
ZW50ICYmICFtX2tleVBhdGguaXNOdWxsKCkpIHsKKyAgICAgICAgbV9jYWxsYmFja3MtPm9uU3Vj
Y2VzcyhTaGFyZWRCdWZmZXI6OmFkb3B0VmVjdG9yKHZhbHVlKSwgcHJpbWFyeUtleSwgbV9rZXlQ
YXRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX2NhbGxiYWNrcy0+b25TdWNjZXNz
KFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3IodmFsdWUpKTsKK30KKwordm9pZCBQdXRPcGVyYXRp
b246OnBlcmZvcm0oKQoreworICAgIExPRyhTdG9yYWdlQVBJLCAiUHV0T3BlcmF0aW9uIik7Cisg
ICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24tPm1vZGUoKSAhPSBJbmRleGVkREI6OlRyYW5zYWN0aW9u
UmVhZE9ubHkpOworICAgIEFTU0VSVChtX2luZGV4SWRzLnNpemUoKSA9PSBtX2luZGV4S2V5cy5z
aXplKCkpOworICAgIGJvb2wga2V5V2FzR2VuZXJhdGVkID0gZmFsc2U7CisKKyAgICBSZWZQdHI8
SURCS2V5PiBrZXk7CisgICAgaWYgKG1fcHV0TW9kZSAhPSBJREJEYXRhYmFzZUJhY2tlbmRJbnRl
cmZhY2U6OkN1cnNvclVwZGF0ZSAmJiBtX29iamVjdFN0b3JlLmF1dG9JbmNyZW1lbnQgJiYgIW1f
a2V5KSB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGF1dG9JbmNLZXkgPSBJREJPYmplY3RTdG9y
ZUJhY2tlbmRMZXZlbERCOjpnZW5lcmF0ZUtleShtX2JhY2tpbmdTdG9yZSwgbV90cmFuc2FjdGlv
biwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlLmlkKTsKKyAgICAgICAga2V5V2FzR2VuZXJh
dGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFhdXRvSW5jS2V5LT5pc1ZhbGlkKCkpIHsKKyAgICAg
ICAgICAgIG1fY2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJE
YXRhYmFzZUV4Y2VwdGlvbjo6Q29uc3RyYWludEVycm9yLCAiTWF4aW11bSBrZXkgZ2VuZXJhdG9y
IHZhbHVlIHJlYWNoZWQuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
ICAgIGtleSA9IGF1dG9JbmNLZXk7CisgICAgfSBlbHNlCisgICAgICAgIGtleSA9IG1fa2V5Owor
CisgICAgQVNTRVJUKGtleSAmJiBrZXktPmlzVmFsaWQoKSk7CisKKyAgICBJREJCYWNraW5nU3Rv
cmU6OlJlY29yZElkZW50aWZpZXIgcmVjb3JkSWRlbnRpZmllcjsKKyAgICBpZiAobV9wdXRNb2Rl
ID09IElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6QWRkT25seSkgeworICAgICAgICBib29s
IGZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2wgb2sgPSBtX2JhY2tpbmdTdG9yZS0+a2V5RXhp
c3RzSW5PYmplY3RTdG9yZShtX3RyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlvbigp
LCBtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmUuaWQsICprZXksICZyZWNvcmRJZGVudGlmaWVy
LCBmb3VuZCk7CisgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgIG1fY2FsbGJhY2tzLT5v
bkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4Y2VwdGlvbjo6VW5r
bm93bkVycm9yLCAiSW50ZXJuYWwgZXJyb3IgY2hlY2tpbmcga2V5IGV4aXN0ZW5jZS4iKSk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAg
ICAgICAgICBtX2NhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUoSURC
RGF0YWJhc2VFeGNlcHRpb246OkNvbnN0cmFpbnRFcnJvciwgIktleSBhbHJlYWR5IGV4aXN0cyBp
biB0aGUgb2JqZWN0IHN0b3JlLiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIFZlY3RvcjxPd25QdHI8SURCT2JqZWN0U3RvcmVCYWNrZW5kTGV2ZWxEQjo6
SW5kZXhXcml0ZXI+ID4gaW5kZXhXcml0ZXJzOworICAgIFN0cmluZyBlcnJvck1lc3NhZ2U7Cisg
ICAgYm9vbCBvYmV5c0NvbnN0cmFpbnRzID0gZmFsc2U7CisgICAgYm9vbCBiYWNraW5nU3RvcmVT
dWNjZXNzID0gSURCT2JqZWN0U3RvcmVCYWNrZW5kTGV2ZWxEQjo6bWFrZUluZGV4V3JpdGVycyht
X3RyYW5zYWN0aW9uLCBtX2JhY2tpbmdTdG9yZS5nZXQoKSwgbV9kYXRhYmFzZUlkLCBtX29iamVj
dFN0b3JlLCBrZXksIGtleVdhc0dlbmVyYXRlZCwgbV9pbmRleElkcywgbV9pbmRleEtleXMsICZp
bmRleFdyaXRlcnMsICZlcnJvck1lc3NhZ2UsIG9iZXlzQ29uc3RyYWludHMpOworICAgIGlmICgh
YmFja2luZ1N0b3JlU3VjY2VzcykgeworICAgICAgICBtX2NhbGxiYWNrcy0+b25FcnJvcihJREJE
YXRhYmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVua25vd25FcnJvciwg
IkludGVybmFsIGVycm9yOiBiYWNraW5nIHN0b3JlIGVycm9yIHVwZGF0aW5nIGluZGV4IGtleXMu
IikpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghb2JleXNDb25zdHJhaW50cykg
eworICAgICAgICBtX2NhbGxiYWNrcy0+b25FcnJvcihJREJEYXRhYmFzZUVycm9yOjpjcmVhdGUo
SURCRGF0YWJhc2VFeGNlcHRpb246OkNvbnN0cmFpbnRFcnJvciwgZXJyb3JNZXNzYWdlKSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBCZWZvcmUgdGhpcyBwb2ludCwgZG9uJ3Qg
ZG8gYW55IG11dGF0aW9uLiBBZnRlciB0aGlzIHBvaW50LCByb2xsYmFjayB0aGUgdHJhbnNhY3Rp
b24gaW4gY2FzZSBvZiBlcnJvci4KKyAgICBiYWNraW5nU3RvcmVTdWNjZXNzID0gbV9iYWNraW5n
U3RvcmUtPnB1dFJlY29yZChtX3RyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlvbigp
LCBtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmUuaWQsICprZXksIG1fdmFsdWUsICZyZWNvcmRJ
ZGVudGlmaWVyKTsKKyAgICBpZiAoIWJhY2tpbmdTdG9yZVN1Y2Nlc3MpIHsKKyAgICAgICAgbV9j
YWxsYmFja3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhj
ZXB0aW9uOjpVbmtub3duRXJyb3IsICJJbnRlcm5hbCBlcnJvcjogYmFja2luZyBzdG9yZSBlcnJv
ciBwZXJmb3JtaW5nIHB1dC9hZGQuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmRleFdyaXRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kTGV2ZWxEQjo6SW5kZXhXcml0ZXIqIGluZGV4V3JpdGVy
ID0gaW5kZXhXcml0ZXJzW2ldLmdldCgpOworICAgICAgICBpbmRleFdyaXRlci0+d3JpdGVJbmRl
eEtleXMocmVjb3JkSWRlbnRpZmllciwgKm1fYmFja2luZ1N0b3JlLCBtX3RyYW5zYWN0aW9uLT5i
YWNraW5nU3RvcmVUcmFuc2FjdGlvbigpLCBtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmUuaWQp
OworICAgIH0KKworICAgIGlmIChtX29iamVjdFN0b3JlLmF1dG9JbmNyZW1lbnQgJiYgbV9wdXRN
b2RlICE9IElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6Q3Vyc29yVXBkYXRlICYmIGtleS0+
dHlwZSgpID09IElEQktleTo6TnVtYmVyVHlwZSkgeworICAgICAgICBib29sIG9rID0gSURCT2Jq
ZWN0U3RvcmVCYWNrZW5kTGV2ZWxEQjo6dXBkYXRlS2V5R2VuZXJhdG9yKG1fYmFja2luZ1N0b3Jl
LCBtX3RyYW5zYWN0aW9uLCBtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmUuaWQsIGtleS5nZXQo
KSwgIWtleVdhc0dlbmVyYXRlZCk7CisgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgIG1f
Y2FsbGJhY2tzLT5vbkVycm9yKElEQkRhdGFiYXNlRXJyb3I6OmNyZWF0ZShJREJEYXRhYmFzZUV4
Y2VwdGlvbjo6VW5rbm93bkVycm9yLCAiSW50ZXJuYWwgZXJyb3IgdXBkYXRpbmcga2V5IGdlbmVy
YXRvci4iKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBt
X2NhbGxiYWNrcy0+b25TdWNjZXNzKGtleS5yZWxlYXNlKCkpOworfQorCit2b2lkIFNldEluZGV4
ZXNSZWFkeU9wZXJhdGlvbjo6cGVyZm9ybSgpCit7CisgICAgTE9HKFN0b3JhZ2VBUEksICJTZXRJ
bmRleGVzUmVhZHlPcGVyYXRpb24iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1faW5k
ZXhDb3VudDsgKytpKQorICAgICAgICBtX3RyYW5zYWN0aW9uLT5kaWRDb21wbGV0ZVByZWVtcHRp
dmVFdmVudCgpOworfQorCit2b2lkIE9wZW5DdXJzb3JPcGVyYXRpb246OnBlcmZvcm0oKQorewor
ICAgIExPRyhTdG9yYWdlQVBJLCAiT3BlbkN1cnNvck9wZXJhdGlvbiIpOworCisgICAgLy8gVGhl
IGZyb250ZW5kIGhhcyBiZWd1biBpbmRleGluZywgc28gdGhpcyBwYXVzZXMgdGhlIHRyYW5zYWN0
aW9uCisgICAgLy8gdW50aWwgdGhlIGluZGV4aW5nIGlzIGNvbXBsZXRlLiBUaGlzIGNhbid0IGhh
cHBlbiBhbnkgZWFybGllcgorICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBzd2l0Y2gg
dG8gZWFybHkgbW9kZSBpbiBjYXNlIG11bHRpcGxlCisgICAgLy8gaW5kZXhlcyBhcmUgYmVpbmcg
Y3JlYXRlZCBpbiBhIHJvdywgd2l0aCBwdXQoKSdzIGluIGJldHdlZW4uCisgICAgaWYgKG1fdGFz
a1R5cGUgPT0gSURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpQcmVlbXB0aXZlVGFzaykKKyAg
ICAgICAgbV90cmFuc2FjdGlvbi0+YWRkUHJlZW1wdGl2ZUV2ZW50KCk7CisKKyAgICBSZWZQdHI8
SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGJhY2tpbmdTdG9yZUN1cnNvcjsKKyAgICBpZiAobV9p
bmRleElkID09IElEQkluZGV4TWV0YWRhdGE6OkludmFsaWRJZCkgeworICAgICAgICBBU1NFUlQo
bV9jdXJzb3JUeXBlICE9IEluZGV4ZWREQjo6Q3Vyc29yS2V5T25seSk7CisgICAgICAgIGJhY2tp
bmdTdG9yZUN1cnNvciA9IG1fYmFja2luZ1N0b3JlLT5vcGVuT2JqZWN0U3RvcmVDdXJzb3IobV90
cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29i
amVjdFN0b3JlSWQsIG1fa2V5UmFuZ2UuZ2V0KCksIG1fZGlyZWN0aW9uKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBBU1NFUlQobV90YXNrVHlwZSA9PSBJREJEYXRhYmFzZUJhY2tlbmRJbnRlcmZh
Y2U6Ok5vcm1hbFRhc2spOworICAgICAgICBpZiAobV9jdXJzb3JUeXBlID09IEluZGV4ZWREQjo6
Q3Vyc29yS2V5T25seSkKKyAgICAgICAgICAgIGJhY2tpbmdTdG9yZUN1cnNvciA9IG1fYmFja2lu
Z1N0b3JlLT5vcGVuSW5kZXhLZXlDdXJzb3IobV90cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlVHJh
bnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0b3JlSWQsIG1faW5kZXhJZCwgbV9r
ZXlSYW5nZS5nZXQoKSwgbV9kaXJlY3Rpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBi
YWNraW5nU3RvcmVDdXJzb3IgPSBtX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4Q3Vyc29yKG1fdHJh
bnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0YWJhc2VJZCwgbV9vYmpl
Y3RTdG9yZUlkLCBtX2luZGV4SWQsIG1fa2V5UmFuZ2UuZ2V0KCksIG1fZGlyZWN0aW9uKTsKKyAg
ICB9CisKKyAgICBpZiAoIWJhY2tpbmdTdG9yZUN1cnNvcikgeworICAgICAgICBtX2NhbGxiYWNr
cy0+b25TdWNjZXNzKHN0YXRpY19jYXN0PFNoYXJlZEJ1ZmZlcio+KDApKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6VGFza1R5cGUg
dGFza1R5cGUoc3RhdGljX2Nhc3Q8SURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpUYXNrVHlw
ZT4obV90YXNrVHlwZSkpOworICAgIFJlZlB0cjxJREJDdXJzb3JCYWNrZW5kTGV2ZWxEQj4gY3Vy
c29yID0gSURCQ3Vyc29yQmFja2VuZExldmVsREI6OmNyZWF0ZShiYWNraW5nU3RvcmVDdXJzb3Iu
Z2V0KCksIG1fY3Vyc29yVHlwZSwgdGFza1R5cGUsIG1fdHJhbnNhY3Rpb24uZ2V0KCksIG1fb2Jq
ZWN0U3RvcmVJZCk7CisgICAgbV9jYWxsYmFja3MtPm9uU3VjY2VzcyhjdXJzb3IsIGN1cnNvci0+
a2V5KCksIGN1cnNvci0+cHJpbWFyeUtleSgpLCBjdXJzb3ItPnZhbHVlKCkpOworfQorCit2b2lk
IENvdW50T3BlcmF0aW9uOjpwZXJmb3JtKCkKK3sKKyAgICBMT0coU3RvcmFnZUFQSSwgIkNvdW50
T3BlcmF0aW9uIik7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIFJlZlB0cjxJREJCYWNr
aW5nU3RvcmU6OkN1cnNvcj4gYmFja2luZ1N0b3JlQ3Vyc29yOworCisgICAgaWYgKG1faW5kZXhJ
ZCA9PSBJREJJbmRleE1ldGFkYXRhOjpJbnZhbGlkSWQpCisgICAgICAgIGJhY2tpbmdTdG9yZUN1
cnNvciA9IG1fYmFja2luZ1N0b3JlLT5vcGVuT2JqZWN0U3RvcmVLZXlDdXJzb3IobV90cmFuc2Fj
dGlvbi0+YmFja2luZ1N0b3JlVHJhbnNhY3Rpb24oKSwgbV9kYXRhYmFzZUlkLCBtX29iamVjdFN0
b3JlSWQsIG1fa2V5UmFuZ2UuZ2V0KCksIEluZGV4ZWREQjo6Q3Vyc29yTmV4dCk7CisgICAgZWxz
ZQorICAgICAgICBiYWNraW5nU3RvcmVDdXJzb3IgPSBtX2JhY2tpbmdTdG9yZS0+b3BlbkluZGV4
S2V5Q3Vyc29yKG1fdHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0
YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2luZGV4SWQsIG1fa2V5UmFuZ2UuZ2V0KCksIElu
ZGV4ZWREQjo6Q3Vyc29yTmV4dCk7CisgICAgaWYgKCFiYWNraW5nU3RvcmVDdXJzb3IpIHsKKyAg
ICAgICAgbV9jYWxsYmFja3MtPm9uU3VjY2Vzcyhjb3VudCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBkbyB7CisgICAgICAgICsrY291bnQ7CisgICAgfSB3aGlsZSAoYmFja2luZ1N0
b3JlQ3Vyc29yLT5jb250aW51ZUZ1bmN0aW9uKDApKTsKKworICAgIG1fY2FsbGJhY2tzLT5vblN1
Y2Nlc3MoY291bnQpOworfQorCit2b2lkIERlbGV0ZVJhbmdlT3BlcmF0aW9uOjpwZXJmb3JtKCkK
K3sKKyAgICBMT0coU3RvcmFnZUFQSSwgIkRlbGV0ZVJhbmdlT3BlcmF0aW9uIik7CisgICAgUmVm
UHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBiYWNraW5nU3RvcmVDdXJzb3IgPSBtX2JhY2tp
bmdTdG9yZS0+b3Blbk9iamVjdFN0b3JlQ3Vyc29yKG1fdHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9y
ZVRyYW5zYWN0aW9uKCksIG1fZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2tleVJhbmdl
LmdldCgpLCBJbmRleGVkREI6OkN1cnNvck5leHQpOworICAgIGlmIChiYWNraW5nU3RvcmVDdXJz
b3IpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKCFtX2JhY2tpbmdTdG9yZS0+ZGVs
ZXRlUmVjb3JkKG1fdHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZVRyYW5zYWN0aW9uKCksIG1fZGF0
YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBiYWNraW5nU3RvcmVDdXJzb3ItPnJlY29yZElkZW50
aWZpZXIoKSkpIHsKKyAgICAgICAgICAgICAgICBtX2NhbGxiYWNrcy0+b25FcnJvcihJREJEYXRh
YmFzZUVycm9yOjpjcmVhdGUoSURCRGF0YWJhc2VFeGNlcHRpb246OlVua25vd25FcnJvciwgIkVy
cm9yIGRlbGV0aW5nIGRhdGEgaW4gcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChiYWNraW5nU3RvcmVDdXJzb3ItPmNvbnRp
bnVlRnVuY3Rpb24oMCkpOworICAgIH0KKworICAgIG1fY2FsbGJhY2tzLT5vblN1Y2Nlc3MoKTsK
K30KKwordm9pZCBDbGVhck9wZXJhdGlvbjo6cGVyZm9ybSgpCit7CisgICAgTE9HKFN0b3JhZ2VB
UEksICJPYmplY3RTdG9yZUNsZWFyT3BlcmF0aW9uIik7CisgICAgaWYgKCFtX2JhY2tpbmdTdG9y
ZS0+Y2xlYXJPYmplY3RTdG9yZShtX3RyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVUcmFuc2FjdGlv
bigpLCBtX2RhdGFiYXNlSWQsIG1fb2JqZWN0U3RvcmVJZCkpIHsKKyAgICAgICAgbV9jYWxsYmFj
a3MtPm9uRXJyb3IoSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9u
OjpVbmtub3duRXJyb3IsICJFcnJvciBjbGVhcmluZyBvYmplY3Qgc3RvcmUiKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgbV9jYWxsYmFja3MtPm9uU3VjY2VzcygpOworfQorCit2b2lk
IERlbGV0ZU9iamVjdFN0b3JlT3BlcmF0aW9uOjpwZXJmb3JtKCkKK3sKKyAgICBMT0coU3RvcmFn
ZUFQSSwgIkRlbGV0ZU9iamVjdFN0b3JlT3BlcmF0aW9uIik7CisgICAgYm9vbCBvayA9IG1fYmFj
a2luZ1N0b3JlLT5kZWxldGVPYmplY3RTdG9yZShtX3RyYW5zYWN0aW9uLT5iYWNraW5nU3RvcmVU
cmFuc2FjdGlvbigpLCBtX3RyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5pZCgpLCBtX29iamVjdFN0
b3JlTWV0YWRhdGEuaWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgUmVmUHRyPElEQkRhdGFi
YXNlRXJyb3I+IGVycm9yID0gSURCRGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhj
ZXB0aW9uOjpVbmtub3duRXJyb3IsIFN0cmluZzo6Zm9ybWF0KCJJbnRlcm5hbCBlcnJvciBkZWxl
dGluZyBvYmplY3Qgc3RvcmUgJyVzJy4iLCBtX29iamVjdFN0b3JlTWV0YWRhdGEubmFtZS51dGY4
KCkuZGF0YSgpKSk7CisgICAgICAgIG1fdHJhbnNhY3Rpb24tPmFib3J0KGVycm9yKTsKKyAgICB9
Cit9CisKK3ZvaWQgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6VmVyc2lvbkNoYW5nZU9wZXJh
dGlvbjo6cGVyZm9ybSgpCit7CisgICAgTE9HKFN0b3JhZ2VBUEksICJWZXJzaW9uQ2hhbmdlT3Bl
cmF0aW9uIik7CisgICAgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQiogZGF0YWJhc2UgPSBtX3Ry
YW5zYWN0aW9uLT5kYXRhYmFzZSgpOworICAgIGludDY0X3QgZGF0YWJhc2VJZCA9IGRhdGFiYXNl
LT5pZCgpOworICAgIHVpbnQ2NF90IG9sZFZlcnNpb24gPSBkYXRhYmFzZS0+bV9tZXRhZGF0YS52
ZXJzaW9uOworCisgICAgLy8gRklYTUU6IERhdGFiYXNlIHZlcnNpb25zIGFyZSBub3cgb2YgdHlw
ZSB1aW50NjRfdCwgYnV0IHRoaXMgY29kZSBleHBlY3RlZCBpbnQ2NF90LgorICAgIEFTU0VSVCht
X3ZlcnNpb24gPiAoaW50NjRfdClvbGRWZXJzaW9uKTsKKyAgICBkYXRhYmFzZS0+bV9tZXRhZGF0
YS52ZXJzaW9uID0gbV92ZXJzaW9uOworICAgIGlmICghZGF0YWJhc2UtPm1fYmFja2luZ1N0b3Jl
LT51cGRhdGVJREJEYXRhYmFzZUludFZlcnNpb24obV90cmFuc2FjdGlvbi0+YmFja2luZ1N0b3Jl
VHJhbnNhY3Rpb24oKSwgZGF0YWJhc2VJZCwgZGF0YWJhc2UtPm1fbWV0YWRhdGEudmVyc2lvbikp
IHsKKyAgICAgICAgUmVmUHRyPElEQkRhdGFiYXNlRXJyb3I+IGVycm9yID0gSURCRGF0YWJhc2VF
cnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpVbmtub3duRXJyb3IsICJFcnJvciB3
cml0aW5nIGRhdGEgdG8gc3RhYmxlIHN0b3JhZ2Ugd2hlbiB1cGRhdGluZyB2ZXJzaW9uLiIpOwor
ICAgICAgICBtX2NhbGxiYWNrcy0+b25FcnJvcihlcnJvcik7CisgICAgICAgIG1fdHJhbnNhY3Rp
b24tPmFib3J0KGVycm9yKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlQoIWRh
dGFiYXNlLT5tX3BlbmRpbmdTZWNvbmRIYWxmT3Blbik7CisgICAgZGF0YWJhc2UtPm1fcGVuZGlu
Z1NlY29uZEhhbGZPcGVuID0gUGVuZGluZ09wZW5DYWxsOjpjcmVhdGUobV9jYWxsYmFja3MsIG1f
ZGF0YWJhc2VDYWxsYmFja3MsIG1fdHJhbnNhY3Rpb25JZCwgbV92ZXJzaW9uKTsKKyAgICBtX2Nh
bGxiYWNrcy0+b25VcGdyYWRlTmVlZGVkKG9sZFZlcnNpb24sIGRhdGFiYXNlLCBkYXRhYmFzZS0+
bWV0YWRhdGEoKSk7Cit9CisKK3ZvaWQgQ3JlYXRlT2JqZWN0U3RvcmVBYm9ydE9wZXJhdGlvbjo6
cGVyZm9ybSgpCit7CisgICAgTE9HKFN0b3JhZ2VBUEksICJDcmVhdGVPYmplY3RTdG9yZUFib3J0
T3BlcmF0aW9uIik7CisgICAgbV90cmFuc2FjdGlvbi0+ZGF0YWJhc2UoKS0+cmVtb3ZlT2JqZWN0
U3RvcmUobV9vYmplY3RTdG9yZUlkKTsKK30KKwordm9pZCBEZWxldGVPYmplY3RTdG9yZUFib3J0
T3BlcmF0aW9uOjpwZXJmb3JtKCkKK3sKKyAgICBMT0coU3RvcmFnZUFQSSwgIkRlbGV0ZU9iamVj
dFN0b3JlQWJvcnRPcGVyYXRpb24iKTsKKyAgICBtX3RyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5h
ZGRPYmplY3RTdG9yZShtX29iamVjdFN0b3JlTWV0YWRhdGEsIElEQk9iamVjdFN0b3JlTWV0YWRh
dGE6OkludmFsaWRJZCk7Cit9CisKK3ZvaWQgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6VmVy
c2lvbkNoYW5nZUFib3J0T3BlcmF0aW9uOjpwZXJmb3JtKCkKK3sKKyAgICBMT0coU3RvcmFnZUFQ
SSwgIlZlcnNpb25DaGFuZ2VBYm9ydE9wZXJhdGlvbiIpOworICAgIG1fdHJhbnNhY3Rpb24tPmRh
dGFiYXNlKCktPm1fbWV0YWRhdGEudmVyc2lvbiA9IG1fcHJldmlvdXNJbnRWZXJzaW9uOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRB
QkFTRSkgJiYgVVNFKExFVkVMREIpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREJPcGVyYXRpb25z
LmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0
aW9uQmFja2VuZExldmVsREJPcGVyYXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uYTU5MjU4MwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvaW5kZXhlZGRiL2xldmVsZGIvSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQk9wZXJhdGlv
bnMuaApAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSURCVHJhbnNhY3Rp
b25CYWNrZW5kTGV2ZWxEQk9wZXJhdGlvbnNfaAorI2RlZmluZSBJREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXZlbERCT3BlcmF0aW9uc19oCisKKyNpbmNsdWRlICJJREJUcmFuc2FjdGlvbkJhY2tlbmRM
ZXZlbERCLmgiCisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkgJiYgVVNFKExFVkVMREIp
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3JlYXRlT2JqZWN0U3RvcmVPcGVyYXRp
b24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKK3B1
YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERC
OjpPcGVyYXRpb24+IGNyZWF0ZShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2Fj
dGlvbiwgSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGNvbnN0IElEQk9iamVjdFN0b3Jl
TWV0YWRhdGEmIG9iamVjdFN0b3JlTWV0YWRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gYWRv
cHRQdHIobmV3IENyZWF0ZU9iamVjdFN0b3JlT3BlcmF0aW9uKHRyYW5zYWN0aW9uLCBiYWNraW5n
U3RvcmUsIG9iamVjdFN0b3JlTWV0YWRhdGEpKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHBl
cmZvcm0oKTsKK3ByaXZhdGU6CisgICAgQ3JlYXRlT2JqZWN0U3RvcmVPcGVyYXRpb24oSURCVHJh
bnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24sIElEQkJhY2tpbmdTdG9yZSogYmFj
a2luZ1N0b3JlLCBjb25zdCBJREJPYmplY3RTdG9yZU1ldGFkYXRhJiBvYmplY3RTdG9yZU1ldGFk
YXRhKQorICAgICAgICA6IG1fdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pCisgICAgICAgICwgbV9i
YWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICAgICAsIG1fb2JqZWN0U3RvcmVNZXRhZGF0
YShvYmplY3RTdG9yZU1ldGFkYXRhKQorICAgIHsKKyAgICB9CisgICAgCisgICAgUmVmUHRyPElE
QlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI+IG1fdHJhbnNhY3Rpb247CisgICAgY29uc3QgUmVm
UHRyPElEQkJhY2tpbmdTdG9yZT4gbV9iYWNraW5nU3RvcmU7CisgICAgY29uc3QgSURCT2JqZWN0
U3RvcmVNZXRhZGF0YSBtX29iamVjdFN0b3JlTWV0YWRhdGE7Cit9OworCitjbGFzcyBEZWxldGVP
YmplY3RTdG9yZU9wZXJhdGlvbiA6IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERC
OjpPcGVyYXRpb24geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0
aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbj4gY3JlYXRlKElEQlRyYW5zYWN0aW9uQmFja2Vu
ZExldmVsREIqIHRyYW5zYWN0aW9uLCBJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgY29u
c3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSYgb2JqZWN0U3RvcmVNZXRhZGF0YSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgRGVsZXRlT2JqZWN0U3RvcmVPcGVyYXRpb24odHJh
bnNhY3Rpb24sIGJhY2tpbmdTdG9yZSwgb2JqZWN0U3RvcmVNZXRhZGF0YSkpOworICAgIH0KKyAg
ICB2aXJ0dWFsIHZvaWQgcGVyZm9ybSgpOworcHJpdmF0ZToKKyAgICBEZWxldGVPYmplY3RTdG9y
ZU9wZXJhdGlvbihJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgSURC
QmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUsIGNvbnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEm
IG9iamVjdFN0b3JlTWV0YWRhdGEpCisgICAgICAgIDogbV90cmFuc2FjdGlvbih0cmFuc2FjdGlv
bikKKyAgICAgICAgLCBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisgICAgICAgICwgbV9v
YmplY3RTdG9yZU1ldGFkYXRhKG9iamVjdFN0b3JlTWV0YWRhdGEpCisgICAgeworICAgIH0KKwor
ICAgIFJlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCPiBtX3RyYW5zYWN0aW9uOwor
ICAgIGNvbnN0IFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IG1fYmFja2luZ1N0b3JlOworICAgIGNv
bnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEgbV9vYmplY3RTdG9yZU1ldGFkYXRhOworfTsKKwor
Y2xhc3MgSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQjo6VmVyc2lvbkNoYW5nZU9wZXJhdGlvbiA6
IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24geworcHVibGlj
OgorICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9w
ZXJhdGlvbj4gY3JlYXRlKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9u
LCBpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdmVyc2lvbiwgUGFzc1JlZlB0cjxJREJD
YWxsYmFja3M+IGNhbGxiYWNrcywgUGFzc1JlZlB0cjxJREJEYXRhYmFzZUNhbGxiYWNrcz4gZGF0
YWJhc2VDYWxsYmFja3MpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFZlcnNp
b25DaGFuZ2VPcGVyYXRpb24odHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uSWQsIHZlcnNpb24sIGNh
bGxiYWNrcywgZGF0YWJhc2VDYWxsYmFja3MpKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHBl
cmZvcm0oKTsKK3ByaXZhdGU6CisgICAgVmVyc2lvbkNoYW5nZU9wZXJhdGlvbihJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgaW50NjRfdCB0cmFuc2FjdGlvbklkLCBp
bnQ2NF90IHZlcnNpb24sIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFBhc3NS
ZWZQdHI8SURCRGF0YWJhc2VDYWxsYmFja3M+IGRhdGFiYXNlQ2FsbGJhY2tzKQorICAgICAgICA6
IG1fdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pCisgICAgICAgICwgbV90cmFuc2FjdGlvbklkKHRy
YW5zYWN0aW9uSWQpCisgICAgICAgICwgbV92ZXJzaW9uKHZlcnNpb24pCisgICAgICAgICwgbV9j
YWxsYmFja3MoY2FsbGJhY2tzKQorICAgICAgICAsIG1fZGF0YWJhc2VDYWxsYmFja3MoZGF0YWJh
c2VDYWxsYmFja3MpCisgICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJUcmFuc2FjdGlvbkJh
Y2tlbmRMZXZlbERCPiBtX3RyYW5zYWN0aW9uOworICAgIGludDY0X3QgbV90cmFuc2FjdGlvbklk
OworICAgIGludDY0X3QgbV92ZXJzaW9uOworICAgIFJlZlB0cjxJREJDYWxsYmFja3M+IG1fY2Fs
bGJhY2tzOworICAgIFJlZlB0cjxJREJEYXRhYmFzZUNhbGxiYWNrcz4gbV9kYXRhYmFzZUNhbGxi
YWNrczsKK307CisKK2NsYXNzIENyZWF0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb24gOiBwdWJs
aWMgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAg
ICBzdGF0aWMgUGFzc093blB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRp
b24+IGNyZWF0ZShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgaW50
NjRfdCBvYmplY3RTdG9yZUlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBD
cmVhdGVPYmplY3RTdG9yZUFib3J0T3BlcmF0aW9uKHRyYW5zYWN0aW9uLCBvYmplY3RTdG9yZUlk
KSk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtKCk7Citwcml2YXRlOgorICAgIENy
ZWF0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb24oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
QiogdHJhbnNhY3Rpb24sIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgOiBtX3RyYW5z
YWN0aW9uKHRyYW5zYWN0aW9uKQorICAgICAgICAsIG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9y
ZUlkKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2
ZWxEQj4gbV90cmFuc2FjdGlvbjsKKyAgICBjb25zdCBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsK
K307CisKK2NsYXNzIERlbGV0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb24gOiBwdWJsaWMgSURC
VHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0
aWMgUGFzc093blB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNy
ZWF0ZShJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgY29uc3QgSURC
T2JqZWN0U3RvcmVNZXRhZGF0YSYgb2JqZWN0U3RvcmUpCisgICAgeworICAgICAgICByZXR1cm4g
YWRvcHRQdHIobmV3IERlbGV0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb24odHJhbnNhY3Rpb24s
IG9iamVjdFN0b3JlKSk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtKCk7Citwcml2
YXRlOgorICAgIERlbGV0ZU9iamVjdFN0b3JlQWJvcnRPcGVyYXRpb24oSURCVHJhbnNhY3Rpb25C
YWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEm
IG9iamVjdFN0b3JlTWV0YWRhdGEpCisgICAgICAgIDogbV90cmFuc2FjdGlvbih0cmFuc2FjdGlv
bikKKyAgICAgICAgLCBtX29iamVjdFN0b3JlTWV0YWRhdGEob2JqZWN0U3RvcmVNZXRhZGF0YSkK
KyAgICB7CisgICAgfQorCisgICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI+
IG1fdHJhbnNhY3Rpb247CisgICAgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSBtX29iamVjdFN0b3Jl
TWV0YWRhdGE7Cit9OworCitjbGFzcyBJREJEYXRhYmFzZUJhY2tlbmRMZXZlbERCOjpWZXJzaW9u
Q2hhbmdlQWJvcnRPcGVyYXRpb24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
Qjo6T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNyZWF0ZShJREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgY29uc3QgU3RyaW5nJiBwcmV2aW91c1ZlcnNpb24sIGlu
dDY0X3QgcHJldmlvdXNJbnRWZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRy
KG5ldyBWZXJzaW9uQ2hhbmdlQWJvcnRPcGVyYXRpb24odHJhbnNhY3Rpb24sIHByZXZpb3VzVmVy
c2lvbiwgcHJldmlvdXNJbnRWZXJzaW9uKSk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBwZXJm
b3JtKCk7Citwcml2YXRlOgorICAgIFZlcnNpb25DaGFuZ2VBYm9ydE9wZXJhdGlvbihJREJUcmFu
c2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgY29uc3QgU3RyaW5nJiBwcmV2aW91
c1ZlcnNpb24sIGludDY0X3QgcHJldmlvdXNJbnRWZXJzaW9uKQorICAgICAgICA6IG1fdHJhbnNh
Y3Rpb24odHJhbnNhY3Rpb24pCisgICAgICAgICwgbV9wcmV2aW91c1ZlcnNpb24ocHJldmlvdXNW
ZXJzaW9uKQorICAgICAgICAsIG1fcHJldmlvdXNJbnRWZXJzaW9uKHByZXZpb3VzSW50VmVyc2lv
bikKKyAgICB7CisgICAgfQorCisgICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVs
REI+IG1fdHJhbnNhY3Rpb247CisgICAgU3RyaW5nIG1fcHJldmlvdXNWZXJzaW9uOworICAgIGlu
dDY0X3QgbV9wcmV2aW91c0ludFZlcnNpb247Cit9OworCitjbGFzcyBDcmVhdGVJbmRleE9wZXJh
dGlvbiA6IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24gewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVs
REI6Ok9wZXJhdGlvbj4gY3JlYXRlKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5z
YWN0aW9uLCBJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBJREJJbmRleE1ldGFkYXRhJiBpbmRleE1ldGFkYXRhKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBDcmVhdGVJbmRleE9wZXJhdGlvbih0cmFuc2FjdGlvbiwg
YmFja2luZ1N0b3JlLCBvYmplY3RTdG9yZUlkLCBpbmRleE1ldGFkYXRhKSk7CisgICAgfQorICAg
IHZpcnR1YWwgdm9pZCBwZXJmb3JtKCk7Citwcml2YXRlOgorICAgIENyZWF0ZUluZGV4T3BlcmF0
aW9uKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uLCBJREJCYWNraW5n
U3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJJbmRl
eE1ldGFkYXRhJiBpbmRleE1ldGFkYXRhKQorICAgICAgICA6IG1fdHJhbnNhY3Rpb24odHJhbnNh
Y3Rpb24pCisgICAgICAgICwgbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICAgICAs
IG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQorICAgICAgICAsIG1faW5kZXhNZXRhZGF0
YShpbmRleE1ldGFkYXRhKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCVHJhbnNhY3Rp
b25CYWNrZW5kTGV2ZWxEQj4gbV90cmFuc2FjdGlvbjsKKyAgICBjb25zdCBSZWZQdHI8SURCQmFj
a2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9yZTsKKyAgICBjb25zdCBpbnQ2NF90IG1fb2JqZWN0U3Rv
cmVJZDsKKyAgICBjb25zdCBJREJJbmRleE1ldGFkYXRhIG1faW5kZXhNZXRhZGF0YTsKK307CisK
K2NsYXNzIENyZWF0ZUluZGV4QWJvcnRPcGVyYXRpb24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25C
YWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0
cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNyZWF0ZShJREJUcmFu
c2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IGluZGV4SWQpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IENy
ZWF0ZUluZGV4QWJvcnRPcGVyYXRpb24odHJhbnNhY3Rpb24sIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQpKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHBlcmZvcm0oKTsKK3ByaXZhdGU6CisgICAg
Q3JlYXRlSW5kZXhBYm9ydE9wZXJhdGlvbihJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAg
ICAgIDogbV90cmFuc2FjdGlvbih0cmFuc2FjdGlvbikKKyAgICAgICAgLCBtX29iamVjdFN0b3Jl
SWQob2JqZWN0U3RvcmVJZCkKKyAgICAgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKKyAgICB7Cisg
ICAgfQorCisgICAgY29uc3QgUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI+IG1f
dHJhbnNhY3Rpb247CisgICAgY29uc3QgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgY29u
c3QgaW50NjRfdCBtX2luZGV4SWQ7Cit9OworCitjbGFzcyBEZWxldGVJbmRleE9wZXJhdGlvbiA6
IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24geworcHVibGlj
OgorICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9w
ZXJhdGlvbj4gY3JlYXRlKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9u
LCBJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBj
b25zdCBJREJJbmRleE1ldGFkYXRhJiBpbmRleE1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGFkb3B0UHRyKG5ldyBEZWxldGVJbmRleE9wZXJhdGlvbih0cmFuc2FjdGlvbiwgYmFja2lu
Z1N0b3JlLCBvYmplY3RTdG9yZUlkLCBpbmRleE1ldGFkYXRhKSk7CisgICAgfQorICAgIHZpcnR1
YWwgdm9pZCBwZXJmb3JtKCk7Citwcml2YXRlOgorICAgIERlbGV0ZUluZGV4T3BlcmF0aW9uKElE
QlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uLCBJREJCYWNraW5nU3RvcmUq
IGJhY2tpbmdTdG9yZSwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJJbmRleE1ldGFk
YXRhJiBpbmRleE1ldGFkYXRhKQorICAgICAgICA6IG1fdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24p
CisgICAgICAgICwgbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICAgICAsIG1fb2Jq
ZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQorICAgICAgICAsIG1faW5kZXhNZXRhZGF0YShpbmRl
eE1ldGFkYXRhKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNr
ZW5kTGV2ZWxEQj4gbV90cmFuc2FjdGlvbjsKKyAgICBjb25zdCBSZWZQdHI8SURCQmFja2luZ1N0
b3JlPiBtX2JhY2tpbmdTdG9yZTsKKyAgICBjb25zdCBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsK
KyAgICBjb25zdCBJREJJbmRleE1ldGFkYXRhIG1faW5kZXhNZXRhZGF0YTsKK307CisKK2NsYXNz
IERlbGV0ZUluZGV4QWJvcnRPcGVyYXRpb24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25CYWNrZW5k
TGV2ZWxEQjo6T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxJREJU
cmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNyZWF0ZShJREJUcmFuc2FjdGlv
bkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25z
dCBJREJJbmRleE1ldGFkYXRhJiBpbmRleE1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UHRyKG5ldyBEZWxldGVJbmRleEFib3J0T3BlcmF0aW9uKHRyYW5zYWN0aW9uLCBvYmpl
Y3RTdG9yZUlkLCBpbmRleE1ldGFkYXRhKSk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBwZXJm
b3JtKCk7Citwcml2YXRlOgorICAgIERlbGV0ZUluZGV4QWJvcnRPcGVyYXRpb24oSURCVHJhbnNh
Y3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24sIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCSW5kZXhNZXRhZGF0YSYgaW5kZXhNZXRhZGF0YSkKKyAgICAgICAgOiBtX3RyYW5z
YWN0aW9uKHRyYW5zYWN0aW9uKQorICAgICAgICAsIG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9y
ZUlkKQorICAgICAgICAsIG1faW5kZXhNZXRhZGF0YShpbmRleE1ldGFkYXRhKQorICAgIHsKKyAg
ICB9CisKKyAgICBSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQj4gbV90cmFuc2Fj
dGlvbjsKKyAgICBjb25zdCBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBjb25zdCBJREJJ
bmRleE1ldGFkYXRhIG1faW5kZXhNZXRhZGF0YTsKK307CisKK2NsYXNzIEdldE9wZXJhdGlvbiA6
IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24geworcHVibGlj
OgorICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9w
ZXJhdGlvbj4gY3JlYXRlKElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9u
LCBJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSwgY29uc3QgSURCRGF0YWJhc2VNZXRhZGF0
YSYgbWV0YWRhdGEsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBQYXNz
UmVmUHRyPElEQktleVJhbmdlPiBrZXlSYW5nZSwgSW5kZXhlZERCOjpDdXJzb3JUeXBlIGN1cnNv
clR5cGUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCisgICAgeworICAgICAg
ICByZXR1cm4gYWRvcHRQdHIobmV3IEdldE9wZXJhdGlvbih0cmFuc2FjdGlvbiwgYmFja2luZ1N0
b3JlLCBtZXRhZGF0YSwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwga2V5UmFuZ2UsIGN1cnNvclR5
cGUsIGNhbGxiYWNrcykpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybSgpOworcHJp
dmF0ZToKKyAgICBHZXRPcGVyYXRpb24oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJh
bnNhY3Rpb24sIElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBjb25zdCBJREJEYXRhYmFz
ZU1ldGFkYXRhJiBtZXRhZGF0YSwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBJbmRleGVkREI6OkN1cnNvclR5
cGUgY3Vyc29yVHlwZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykKKyAgICAg
ICAgOiBtX3RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKQorICAgICAgICAsIG1fYmFja2luZ1N0b3Jl
KGJhY2tpbmdTdG9yZSkKKyAgICAgICAgLCBtX2RhdGFiYXNlSWQobWV0YWRhdGEuaWQpCisgICAg
ICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9pbmRleElk
KGluZGV4SWQpCisgICAgICAgICwgbV9rZXlQYXRoKG1ldGFkYXRhLm9iamVjdFN0b3Jlcy5nZXQo
b2JqZWN0U3RvcmVJZCkua2V5UGF0aCkKKyAgICAgICAgLCBtX2F1dG9JbmNyZW1lbnQobWV0YWRh
dGEub2JqZWN0U3RvcmVzLmdldChvYmplY3RTdG9yZUlkKS5hdXRvSW5jcmVtZW50KQorICAgICAg
ICAsIG1fa2V5UmFuZ2Uoa2V5UmFuZ2UpCisgICAgICAgICwgbV9jdXJzb3JUeXBlKGN1cnNvclR5
cGUpCisgICAgICAgICwgbV9jYWxsYmFja3MoY2FsbGJhY2tzKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1ldGFkYXRhLm9iamVjdFN0b3Jlcy5jb250YWlucyhvYmplY3RTdG9yZUlkKSk7CisgICAg
ICAgIEFTU0VSVChtZXRhZGF0YS5vYmplY3RTdG9yZXMuZ2V0KG9iamVjdFN0b3JlSWQpLmlkID09
IG9iamVjdFN0b3JlSWQpOworICAgIH0KKworICAgIFJlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tl
bmRMZXZlbERCPiBtX3RyYW5zYWN0aW9uOworICAgIGNvbnN0IFJlZlB0cjxJREJCYWNraW5nU3Rv
cmU+IG1fYmFja2luZ1N0b3JlOworICAgIGNvbnN0IGludDY0X3QgbV9kYXRhYmFzZUlkOworICAg
IGNvbnN0IGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGNvbnN0IGludDY0X3QgbV9pbmRl
eElkOworICAgIGNvbnN0IElEQktleVBhdGggbV9rZXlQYXRoOworICAgIGNvbnN0IGJvb2wgbV9h
dXRvSW5jcmVtZW50OworICAgIGNvbnN0IFJlZlB0cjxJREJLZXlSYW5nZT4gbV9rZXlSYW5nZTsK
KyAgICBjb25zdCBJbmRleGVkREI6OkN1cnNvclR5cGUgbV9jdXJzb3JUeXBlOworICAgIGNvbnN0
IFJlZlB0cjxJREJDYWxsYmFja3M+IG1fY2FsbGJhY2tzOworfTsKKworY2xhc3MgUHV0T3BlcmF0
aW9uIDogcHVibGljIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7Citw
dWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
Qjo6T3BlcmF0aW9uPiBjcmVhdGUoSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNh
Y3Rpb24sIElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQs
IGNvbnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEmIG9iamVjdFN0b3JlLCBQYXNzUmVmUHRyPFNo
YXJlZEJ1ZmZlcj4gdmFsdWUsIFBhc3NSZWZQdHI8SURCS2V5PiBrZXksIElEQkRhdGFiYXNlQmFj
a2VuZEludGVyZmFjZTo6UHV0TW9kZSBwdXRNb2RlLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4g
Y2FsbGJhY2tzLCBjb25zdCBWZWN0b3I8aW50NjRfdD4mIGluZGV4SWRzLCBjb25zdCBWZWN0b3I8
SURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpJbmRleEtleXM+JiBpbmRleEtleXMpCisgICAg
eworICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFB1dE9wZXJhdGlvbih0cmFuc2FjdGlvbiwg
YmFja2luZ1N0b3JlLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZSwgdmFsdWUsIGtleSwgcHV0TW9k
ZSwgY2FsbGJhY2tzLCBpbmRleElkcywgaW5kZXhLZXlzKSk7CisgICAgfQorICAgIHZpcnR1YWwg
dm9pZCBwZXJmb3JtKCk7Citwcml2YXRlOgorICAgIFB1dE9wZXJhdGlvbihJREJUcmFuc2FjdGlv
bkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgSURCQmFja2luZ1N0b3JlKiBiYWNraW5nU3Rv
cmUsIGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3QgSURCT2JqZWN0U3RvcmVNZXRhZGF0YSYgb2Jq
ZWN0U3RvcmUsIFBhc3NSZWZQdHI8U2hhcmVkQnVmZmVyPiYgdmFsdWUsIFBhc3NSZWZQdHI8SURC
S2V5PiBrZXksIElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6UHV0TW9kZSBwdXRNb2RlLCBQ
YXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzLCBjb25zdCBWZWN0b3I8aW50NjRfdD4m
IGluZGV4SWRzLCBjb25zdCBWZWN0b3I8SURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpJbmRl
eEtleXM+JiBpbmRleEtleXMpCisgICAgICAgIDogbV90cmFuc2FjdGlvbih0cmFuc2FjdGlvbikK
KyAgICAgICAgLCBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisgICAgICAgICwgbV9kYXRh
YmFzZUlkKGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9vYmplY3RTdG9yZShvYmplY3RTdG9yZSkK
KyAgICAgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgICAgICAsIG1fa2V5KGtleSkKKyAgICAgICAg
LCBtX3B1dE1vZGUocHV0TW9kZSkKKyAgICAgICAgLCBtX2NhbGxiYWNrcyhjYWxsYmFja3MpCisg
ICAgICAgICwgbV9pbmRleElkcyhpbmRleElkcykKKyAgICAgICAgLCBtX2luZGV4S2V5cyhpbmRl
eEtleXMpCisgICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRM
ZXZlbERCPiBtX3RyYW5zYWN0aW9uOworICAgIGNvbnN0IFJlZlB0cjxJREJCYWNraW5nU3RvcmU+
IG1fYmFja2luZ1N0b3JlOworICAgIGNvbnN0IGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGNv
bnN0IElEQk9iamVjdFN0b3JlTWV0YWRhdGEgbV9vYmplY3RTdG9yZTsKKyAgICBjb25zdCBSZWZQ
dHI8U2hhcmVkQnVmZmVyPiBtX3ZhbHVlOworICAgIGNvbnN0IFJlZlB0cjxJREJLZXk+IG1fa2V5
OworICAgIGNvbnN0IElEQkRhdGFiYXNlQmFja2VuZEludGVyZmFjZTo6UHV0TW9kZSBtX3B1dE1v
ZGU7CisgICAgY29uc3QgUmVmUHRyPElEQkNhbGxiYWNrcz4gbV9jYWxsYmFja3M7CisgICAgY29u
c3QgVmVjdG9yPGludDY0X3Q+IG1faW5kZXhJZHM7CisgICAgY29uc3QgVmVjdG9yPElEQkRhdGFi
YXNlQmFja2VuZEludGVyZmFjZTo6SW5kZXhLZXlzPiBtX2luZGV4S2V5czsKK307CisKK2NsYXNz
IFNldEluZGV4ZXNSZWFkeU9wZXJhdGlvbiA6IHB1YmxpYyBJREJUcmFuc2FjdGlvbkJhY2tlbmRM
ZXZlbERCOjpPcGVyYXRpb24geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPElEQlRy
YW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbj4gY3JlYXRlKElEQlRyYW5zYWN0aW9u
QmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uLCBzaXplX3QgaW5kZXhDb3VudCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgU2V0SW5kZXhlc1JlYWR5T3BlcmF0aW9uKHRyYW5z
YWN0aW9uLCBpbmRleENvdW50KSk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtKCk7
Citwcml2YXRlOgorICAgIFNldEluZGV4ZXNSZWFkeU9wZXJhdGlvbihJREJUcmFuc2FjdGlvbkJh
Y2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgc2l6ZV90IGluZGV4Q291bnQpCisgICAgICAgIDog
bV90cmFuc2FjdGlvbih0cmFuc2FjdGlvbikKKyAgICAgICAgLCBtX2luZGV4Q291bnQoaW5kZXhD
b3VudCkKKyAgICB7CisgICAgfQorCisgICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQmFja2VuZExl
dmVsREI+IG1fdHJhbnNhY3Rpb247CisgICAgY29uc3Qgc2l6ZV90IG1faW5kZXhDb3VudDsKK307
CisKK2NsYXNzIE9wZW5DdXJzb3JPcGVyYXRpb24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25CYWNr
ZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxJ
REJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNyZWF0ZShJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgSURCQmFja2luZ1N0b3JlKiBiYWNraW5n
U3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBJbmRleGVkREI6OkN1
cnNvckRpcmVjdGlvbiBkaXJlY3Rpb24sIEluZGV4ZWREQjo6Q3Vyc29yVHlwZSBjdXJzb3JUeXBl
LCBJREJEYXRhYmFzZUJhY2tlbmRJbnRlcmZhY2U6OlRhc2tUeXBlIHRhc2tUeXBlLCBQYXNzUmVm
UHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0
UHRyKG5ldyBPcGVuQ3Vyc29yT3BlcmF0aW9uKHRyYW5zYWN0aW9uLCBiYWNraW5nU3RvcmUsIGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIGtleVJhbmdlLCBkaXJlY3Rpb24sIGN1
cnNvclR5cGUsIHRhc2tUeXBlLCBjYWxsYmFja3MpKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lk
IHBlcmZvcm0oKTsKK3ByaXZhdGU6CisgICAgT3BlbkN1cnNvck9wZXJhdGlvbihJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgSURCQmFja2luZ1N0b3JlKiBiYWNraW5n
U3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBJbmRleGVkREI6OkN1
cnNvckRpcmVjdGlvbiBkaXJlY3Rpb24sIEluZGV4ZWREQjo6Q3Vyc29yVHlwZSBjdXJzb3JUeXBl
LCBJREJEYXRhYmFzZUJhY2tlbmRJbnRlcmZhY2U6OlRhc2tUeXBlIHRhc2tUeXBlLCBQYXNzUmVm
UHRyPElEQkNhbGxiYWNrcz4gY2FsbGJhY2tzKQorICAgICAgICA6IG1fdHJhbnNhY3Rpb24odHJh
bnNhY3Rpb24pCisgICAgICAgICwgbV9iYWNraW5nU3RvcmUoYmFja2luZ1N0b3JlKQorICAgICAg
ICAsIG1fZGF0YWJhc2VJZChkYXRhYmFzZUlkKQorICAgICAgICAsIG1fb2JqZWN0U3RvcmVJZChv
YmplY3RTdG9yZUlkKQorICAgICAgICAsIG1faW5kZXhJZChpbmRleElkKQorICAgICAgICAsIG1f
a2V5UmFuZ2Uoa2V5UmFuZ2UpCisgICAgICAgICwgbV9kaXJlY3Rpb24oZGlyZWN0aW9uKQorICAg
ICAgICAsIG1fY3Vyc29yVHlwZShjdXJzb3JUeXBlKQorICAgICAgICAsIG1fdGFza1R5cGUodGFz
a1R5cGUpCisgICAgICAgICwgbV9jYWxsYmFja3MoY2FsbGJhY2tzKQorICAgIHsKKyAgICB9CisK
KyAgICBSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQj4gbV90cmFuc2FjdGlvbjsK
KyAgICBjb25zdCBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2JhY2tpbmdTdG9yZTsKKyAgICBj
b25zdCBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKKyAgICBjb25zdCBpbnQ2NF90IG1fb2JqZWN0U3Rv
cmVJZDsKKyAgICBjb25zdCBpbnQ2NF90IG1faW5kZXhJZDsKKyAgICBjb25zdCBQYXNzUmVmUHRy
PElEQktleVJhbmdlPiBtX2tleVJhbmdlOworICAgIGNvbnN0IEluZGV4ZWREQjo6Q3Vyc29yRGly
ZWN0aW9uIG1fZGlyZWN0aW9uOworICAgIGNvbnN0IEluZGV4ZWREQjo6Q3Vyc29yVHlwZSBtX2N1
cnNvclR5cGU7CisgICAgY29uc3QgSURCRGF0YWJhc2VCYWNrZW5kSW50ZXJmYWNlOjpUYXNrVHlw
ZSBtX3Rhc2tUeXBlOworICAgIGNvbnN0IFJlZlB0cjxJREJDYWxsYmFja3M+IG1fY2FsbGJhY2tz
OworfTsKKworY2xhc3MgQ291bnRPcGVyYXRpb24gOiBwdWJsaWMgSURCVHJhbnNhY3Rpb25CYWNr
ZW5kTGV2ZWxEQjo6T3BlcmF0aW9uIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxJ
REJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCOjpPcGVyYXRpb24+IGNyZWF0ZShJREJUcmFuc2Fj
dGlvbkJhY2tlbmRMZXZlbERCKiB0cmFuc2FjdGlvbiwgSURCQmFja2luZ1N0b3JlKiBiYWNraW5n
U3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQsIFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+IGtleVJhbmdlLCBQYXNzUmVmUHRyPElE
QkNhbGxiYWNrcz4gY2FsbGJhY2tzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5l
dyBDb3VudE9wZXJhdGlvbih0cmFuc2FjdGlvbiwgYmFja2luZ1N0b3JlLCBkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXlSYW5nZSwgY2FsbGJhY2tzKSk7CisgICAgfQorICAg
IHZpcnR1YWwgdm9pZCBwZXJmb3JtKCk7Citwcml2YXRlOgorICAgIENvdW50T3BlcmF0aW9uKElE
QlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uLCBJREJCYWNraW5nU3RvcmUq
IGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCwgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4ga2V5UmFuZ2UsIFBhc3NS
ZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCisgICAgICAgIDogbV90cmFuc2FjdGlvbih0
cmFuc2FjdGlvbikKKyAgICAgICAgLCBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisgICAg
ICAgICwgbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9vYmplY3RTdG9yZUlk
KG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9pbmRleElkKGluZGV4SWQpCisgICAgICAgICwg
bV9rZXlSYW5nZShrZXlSYW5nZSkKKyAgICAgICAgLCBtX2NhbGxiYWNrcyhjYWxsYmFja3MpCisg
ICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJUcmFuc2FjdGlvbkJhY2tlbmRMZXZlbERCPiBt
X3RyYW5zYWN0aW9uOworICAgIGNvbnN0IFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IG1fYmFja2lu
Z1N0b3JlOworICAgIGNvbnN0IGludDY0X3QgbV9kYXRhYmFzZUlkOworICAgIGNvbnN0IGludDY0
X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGNvbnN0IGludDY0X3QgbV9pbmRleElkOworICAgIGNv
bnN0IFJlZlB0cjxJREJLZXlSYW5nZT4gbV9rZXlSYW5nZTsKKyAgICBjb25zdCBSZWZQdHI8SURC
Q2FsbGJhY2tzPiBtX2NhbGxiYWNrczsKK307CisKK2NsYXNzIERlbGV0ZVJhbmdlT3BlcmF0aW9u
IDogcHVibGljIElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7CitwdWJs
aWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6
T3BlcmF0aW9uPiBjcmVhdGUoSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rp
b24sIElEQkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4ga2V5UmFuZ2UsIFBh
c3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCisgICAgeworICAgICAgICByZXR1cm4g
YWRvcHRQdHIobmV3IERlbGV0ZVJhbmdlT3BlcmF0aW9uKHRyYW5zYWN0aW9uLCBiYWNraW5nU3Rv
cmUsIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleVJhbmdlLCBjYWxsYmFja3MpKTsKKyAg
ICB9CisgICAgdmlydHVhbCB2b2lkIHBlcmZvcm0oKTsKK3ByaXZhdGU6CisgICAgRGVsZXRlUmFu
Z2VPcGVyYXRpb24oSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24sIElE
QkJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4ga2V5UmFuZ2UsIFBhc3NSZWZQ
dHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCisgICAgICAgIDogbV90cmFuc2FjdGlvbih0cmFu
c2FjdGlvbikKKyAgICAgICAgLCBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3RvcmUpCisgICAgICAg
ICwgbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9vYmplY3RTdG9yZUlkKG9i
amVjdFN0b3JlSWQpCisgICAgICAgICwgbV9rZXlSYW5nZShrZXlSYW5nZSkKKyAgICAgICAgLCBt
X2NhbGxiYWNrcyhjYWxsYmFja3MpCisgICAgeworICAgIH0KKworICAgIFJlZlB0cjxJREJUcmFu
c2FjdGlvbkJhY2tlbmRMZXZlbERCPiBtX3RyYW5zYWN0aW9uOworICAgIGNvbnN0IFJlZlB0cjxJ
REJCYWNraW5nU3RvcmU+IG1fYmFja2luZ1N0b3JlOworICAgIGNvbnN0IGludDY0X3QgbV9kYXRh
YmFzZUlkOworICAgIGNvbnN0IGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGNvbnN0IFJl
ZlB0cjxJREJLZXlSYW5nZT4gbV9rZXlSYW5nZTsKKyAgICBjb25zdCBSZWZQdHI8SURCQ2FsbGJh
Y2tzPiBtX2NhbGxiYWNrczsKK307CisKK2NsYXNzIENsZWFyT3BlcmF0aW9uIDogcHVibGljIElE
QlRyYW5zYWN0aW9uQmFja2VuZExldmVsREI6Ok9wZXJhdGlvbiB7CitwdWJsaWM6CisgICAgc3Rh
dGljIFBhc3NPd25QdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQjo6T3BlcmF0aW9uPiBj
cmVhdGUoSURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxEQiogdHJhbnNhY3Rpb24sIElEQkJhY2tp
bmdTdG9yZSogYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhbGxiYWNrcykKKyAgICB7CisgICAg
ICAgIHJldHVybiBhZG9wdFB0cihuZXcgQ2xlYXJPcGVyYXRpb24odHJhbnNhY3Rpb24sIGJhY2tp
bmdTdG9yZSwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgY2FsbGJhY2tzKSk7CisgICAgfQor
ICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtKCk7Citwcml2YXRlOgorICAgIENsZWFyT3BlcmF0aW9u
KElEQlRyYW5zYWN0aW9uQmFja2VuZExldmVsREIqIHRyYW5zYWN0aW9uLCBJREJCYWNraW5nU3Rv
cmUqIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYWxsYmFja3MpCisgICAgICAgIDogbV90cmFu
c2FjdGlvbih0cmFuc2FjdGlvbikKKyAgICAgICAgLCBtX2JhY2tpbmdTdG9yZShiYWNraW5nU3Rv
cmUpCisgICAgICAgICwgbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgICAgICwgbV9vYmpl
Y3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCisgICAgICAgICwgbV9jYWxsYmFja3MoY2FsbGJhY2tz
KQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8SURCVHJhbnNhY3Rpb25CYWNrZW5kTGV2ZWxE
Qj4gbV90cmFuc2FjdGlvbjsKKyAgICBjb25zdCBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBtX2Jh
Y2tpbmdTdG9yZTsKKyAgICBjb25zdCBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKKyAgICBjb25zdCBp
bnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKKyAgICBjb25zdCBSZWZQdHI8SURCQ2FsbGJhY2tzPiBt
X2NhbGxiYWNrczsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVO
QUJMRShJTkRFWEVEX0RBVEFCQVNFKSAmJiBVU0UoTEVWRUxEQikKKyNlbmRpZiAvLyBJREJUcmFu
c2FjdGlvbkJhY2tlbmRMZXZlbERCT3BlcmF0aW9uc19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQlRyYW5zYWN0aW9uQ29vcmRpbmF0b3JM
ZXZlbERCLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL2xldmVsZGIvSURC
VHJhbnNhY3Rpb25Db29yZGluYXRvckxldmVsREIuY3BwCmluZGV4IGNjOWExNjMuLmM4NWEyZTEg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL2xldmVsZGIvSURC
VHJhbnNhY3Rpb25Db29yZGluYXRvckxldmVsREIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvaW5kZXhlZGRiL2xldmVsZGIvSURCVHJhbnNhY3Rpb25Db29yZGluYXRvckxldmVsREIu
Y3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpICYmIFVT
RShMRVZFTERCKQogCiAjaW5jbHVkZSAiSURCRGF0YWJhc2VCYWNrZW5kTGV2ZWxEQi5oIgorI2lu
Y2x1ZGUgIklEQkRhdGFiYXNlQ2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAiSURCVHJhbnNhY3Rpb25C
YWNrZW5kTGV2ZWxEQi5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7Cg==
</data>
<flag name="review"
          id="237158"
          type_id="1"
          status="+"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>