<?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>42843</bug_id>
          
          <creation_ts>2010-07-22 13:14:40 -0700</creation_ts>
          <short_desc>Interrupt all DB operations when a worker is shutting down</short_desc>
          <delta_ts>2010-07-30 16:20:02 -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>New Bugs</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>
          <dependson>43233</dependson>
          <blocked>34990</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dumitru Daniliuc">dumi</reporter>
          <assigned_to name="Dumitru Daniliuc">dumi</assigned_to>
          <cc>abecsi</cc>
    
    <cc>dimich</cc>
    
    <cc>levin</cc>
    
    <cc>michaeln</cc>
    
    <cc>ossy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>254942</commentid>
    <comment_count>0</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-22 13:14:40 -0700</bug_when>
    <thetext>We should interrupt all DB operations as soon as worker.terminate() is called.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>254977</commentid>
    <comment_count>1</comment_count>
      <attachid>62337</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-22 14:18:50 -0700</bug_when>
    <thetext>Created attachment 62337
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255197</commentid>
    <comment_count>2</comment_count>
      <attachid>62337</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-07-22 21:24:37 -0700</bug_when>
    <thetext>Comment on attachment 62337
patch

This threading stuff is all very complicated.  I&apos;m not sure I fully grasp the locking discipline, but this looks reasonable to me.

WebCore/storage/chromium/DatabaseTrackerChromium.cpp:181
 +  void DatabaseTracker::interruptAllDatabasesForContext(ScriptExecutionContext* context)
Sad that we have to copy/paste this code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255213</commentid>
    <comment_count>3</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-07-22 23:03:54 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 62337 [details])
&gt; This threading stuff is all very complicated.  I&apos;m not sure I fully grasp the locking discipline, but this looks reasonable to me.

Very honest but not too reassuring. Perhaps the r+ should wait until someone can take the time to understand it/Dumi can explain it to someone.

I say this because I&apos;ve seen a lot of instances of messed up threading stuff once the time was taken to understand it and this isn&apos;t the type of thing that is easy caught when it is wrong. (Bad threading issues result in random corruptions which are hard to track down.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255214</commentid>
    <comment_count>4</comment_count>
      <attachid>62337</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-07-22 23:07:24 -0700</bug_when>
    <thetext>Comment on attachment 62337
patch

Ok.  I&apos;m more than happy to have someone who understands the threading issues review this patch too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255518</commentid>
    <comment_count>5</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-07-23 12:51:24 -0700</bug_when>
    <thetext>Dumi asked me to take a look at this and I will, just haven&apos;t done it yet. It&apos;s real easy for me to probe him for details since he sits nearby.

To really see what&apos;s going on, I&apos;m going to have to patch this in locally and look at the diffs with a better diff viewer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255623</commentid>
    <comment_count>6</comment_count>
      <attachid>62337</attachid>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-07-23 18:05:23 -0700</bug_when>
    <thetext>Comment on attachment 62337
patch

http://wkrietveld.appspot.com/42843/diff/1/6
File WebCore/storage/AbstractDatabase.cpp (right):

http://wkrietveld.appspot.com/42843/diff/1/6#newcode480
WebCore/storage/AbstractDatabase.cpp:480: while (!m_interruptedGuard.tryLock())
i wonder if we can find a way to do this w/o looping like this

http://wkrietveld.appspot.com/42843/diff/1/8
File WebCore/storage/Database.cpp (right):

http://wkrietveld.appspot.com/42843/diff/1/8#newcode92
WebCore/storage/Database.cpp:92: MutexLocker interruptedMutexLock(DatabaseTracker::tracker().interruptedMutex());
This lock can be held for a very long time. There are some actions below that go ranging far and wide.

See DatabaseTracker::canEstablishDatabase and in particular this comment...

    // Drop all locks before calling out; we don&apos;t know what they&apos;ll do.
    context-&gt;databaseExceededQuota(name);

And openAndVerifyVersion() requires a task to be performed on the db thread while the current thread waits for it to complete (with this lock held). Is this mutex ever held on the db thread?

http://wkrietveld.appspot.com/42843/diff/1/9
File WebCore/storage/DatabaseSync.cpp (right):

http://wkrietveld.appspot.com/42843/diff/1/9#newcode53
WebCore/storage/DatabaseSync.cpp:53: MutexLocker interruptedMutexLock(DatabaseTracker::tracker().interruptedMutex());
Same comment here about holding this lock for a mighty long time and calling out into things that are very open ended... webframeClient callbacks and javascript callbacks.

http://wkrietveld.appspot.com/42843/diff/1/9#newcode73
WebCore/storage/DatabaseSync.cpp:73: creationCallback-&gt;handleEvent(context, database.get());
For example, what if the creation callback being invoked here calls openDatabaseSync().

http://wkrietveld.appspot.com/42843/diff/1/10
File WebCore/storage/DatabaseTracker.cpp (right):

http://wkrietveld.appspot.com/42843/diff/1/10#newcode262
WebCore/storage/DatabaseTracker.cpp:262: 
It looks like the loop is interrupt all dbs for a particular origin rather than for a particular context.

http://wkrietveld.appspot.com/42843/diff/1/11
File WebCore/storage/DatabaseTracker.h (right):

http://wkrietveld.appspot.com/42843/diff/1/11#newcode69
WebCore/storage/DatabaseTracker.h:69: Mutex&amp; interruptedMutex() { return m_openDatabaseMapGuard; }
oh... this is one of the existing locks, not a new one.

http://wkrietveld.appspot.com/42843/diff/1/17
File WebCore/workers/WorkerThread.cpp (right):

http://wkrietveld.appspot.com/42843/diff/1/17#newcode228
WebCore/workers/WorkerThread.cpp:228: DatabaseTracker::tracker().interruptAllDatabasesForContext(workerContext());
workerContext may be NULL here</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255694</commentid>
    <comment_count>7</comment_count>
      <attachid>62497</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-24 03:52:30 -0700</bug_when>
    <thetext>Created attachment 62497
patch

(In reply to comment #6)
&gt; (From update of attachment 62337 [details])
&gt; http://wkrietveld.appspot.com/42843/diff/1/6
&gt; File WebCore/storage/AbstractDatabase.cpp (right):
&gt; 
&gt; http://wkrietveld.appspot.com/42843/diff/1/6#newcode480
&gt; WebCore/storage/AbstractDatabase.cpp:480: while (!m_interruptedGuard.tryLock())
&gt; i wonder if we can find a way to do this w/o looping like this

i don&apos;t think there&apos;s a way to do this without looping. i moved this code to SQLiteDatabase though.

&gt; http://wkrietveld.appspot.com/42843/diff/1/8
&gt; File WebCore/storage/Database.cpp (right):
&gt; 
&gt; http://wkrietveld.appspot.com/42843/diff/1/8#newcode92
&gt; WebCore/storage/Database.cpp:92: MutexLocker interruptedMutexLock(DatabaseTracker::tracker().interruptedMutex());
&gt; This lock can be held for a very long time. There are some actions below that go ranging far and wide.
&gt; 
&gt; See DatabaseTracker::canEstablishDatabase and in particular this comment...
&gt; 
&gt;     // Drop all locks before calling out; we don&apos;t know what they&apos;ll do.
&gt;     context-&gt;databaseExceededQuota(name);
&gt; 
&gt; And openAndVerifyVersion() requires a task to be performed on the db thread while the current thread waits for it to complete (with this lock held). Is this mutex ever held on the db thread?
&gt; 

reverted the changes to Database and DatabaseSync. DatabaseTracker::interruptAllDatabasesForContext() is the only new place where this lock is being held, but only for a short period of time.

&gt; http://wkrietveld.appspot.com/42843/diff/1/9#newcode73
&gt; WebCore/storage/DatabaseSync.cpp:73: creationCallback-&gt;handleEvent(context, database.get());
&gt; For example, what if the creation callback being invoked here calls openDatabaseSync().

no more locks held here.

&gt; http://wkrietveld.appspot.com/42843/diff/1/10
&gt; File WebCore/storage/DatabaseTracker.cpp (right):
&gt; 
&gt; http://wkrietveld.appspot.com/42843/diff/1/10#newcode262
&gt; WebCore/storage/DatabaseTracker.cpp:262: 
&gt; It looks like the loop is interrupt all dbs for a particular origin rather than for a particular context.

i believe every ScriptExecutionContext has only one origin. see ScriptExecutionContext::m_securityOrigin().

&gt; http://wkrietveld.appspot.com/42843/diff/1/11
&gt; File WebCore/storage/DatabaseTracker.h (right):
&gt; 
&gt; http://wkrietveld.appspot.com/42843/diff/1/11#newcode69
&gt; WebCore/storage/DatabaseTracker.h:69: Mutex&amp; interruptedMutex() { return m_openDatabaseMapGuard; }
&gt; oh... this is one of the existing locks, not a new one.

reverted this change; this method is no longer needed.

&gt; http://wkrietveld.appspot.com/42843/diff/1/17
&gt; File WebCore/workers/WorkerThread.cpp (right):
&gt; 
&gt; http://wkrietveld.appspot.com/42843/diff/1/17#newcode228
&gt; WebCore/workers/WorkerThread.cpp:228: DatabaseTracker::tracker().interruptAllDatabasesForContext(workerContext());
&gt; workerContext may be NULL here

moved inside the if-block, after the script execution is forbidden.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255696</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-07-24 03:55:29 -0700</bug_when>
    <thetext>Attachment 62497 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/sql/SQLiteDatabase.h:63:  More than one command on the same line  [whitespace/newline] [4]
Total errors found: 1 in 19 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>255697</commentid>
    <comment_count>9</comment_count>
      <attachid>62499</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-24 04:14:12 -0700</bug_when>
    <thetext>Created attachment 62499
patch

Same patch, fixed the style problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256154</commentid>
    <comment_count>10</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-07-26 12:09:29 -0700</bug_when>
    <thetext>Haven&apos;t looked at the new code yet, just responding to this comment.

&gt;&gt; http://wkrietveld.appspot.com/42843/diff/1/10
&gt;&gt; File WebCore/storage/DatabaseTracker.cpp (right):
&gt;&gt; 
&gt;&gt; http://wkrietveld.appspot.com/42843/diff/1/10#newcode262
&gt;&gt; WebCore/storage/DatabaseTracker.cpp:262: 
&gt;&gt; It looks like the loop is interrupt all dbs for a particular origin rather 
&gt;&gt; than for a particular context.
&gt;
&gt; i believe every ScriptExecutionContext has only one origin. see
&gt; ScriptExecutionContext::m_securityOrigin().

The issue is that several SECs can refer to the same origin, and it looks like this loop will interrupt dbs in other SECs that aren&apos;t going away. Is that not the case?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256160</commentid>
    <comment_count>11</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-26 12:17:26 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Haven&apos;t looked at the new code yet, just responding to this comment.
&gt; 
&gt; &gt;&gt; http://wkrietveld.appspot.com/42843/diff/1/10
&gt; &gt;&gt; File WebCore/storage/DatabaseTracker.cpp (right):
&gt; &gt;&gt; 
&gt; &gt;&gt; http://wkrietveld.appspot.com/42843/diff/1/10#newcode262
&gt; &gt;&gt; WebCore/storage/DatabaseTracker.cpp:262: 
&gt; &gt;&gt; It looks like the loop is interrupt all dbs for a particular origin rather 
&gt; &gt;&gt; than for a particular context.
&gt; &gt;
&gt; &gt; i believe every ScriptExecutionContext has only one origin. see
&gt; &gt; ScriptExecutionContext::m_securityOrigin().
&gt; 
&gt; The issue is that several SECs can refer to the same origin, and it looks like this loop will interrupt dbs in other SECs that aren&apos;t going away. Is that not the case?

you&apos;re right. uploading a new patch shortly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256188</commentid>
    <comment_count>12</comment_count>
      <attachid>62596</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-26 12:53:31 -0700</bug_when>
    <thetext>Created attachment 62596
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256201</commentid>
    <comment_count>13</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-07-26 13:35:51 -0700</bug_when>
    <thetext>Could you do the webkit-patch post-attachment-to-rietveld voodoo again please :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256261</commentid>
    <comment_count>14</comment_count>
      <attachid>62596</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-07-26 14:51:15 -0700</bug_when>
    <thetext>Comment on attachment 62596
patch

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 64062)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,35 @@
&gt; +2010-07-26  Dumitru Daniliuc  &lt;dumi@chromium.org&gt;
&gt; +
&gt; +        Interrupt all DB operations when a worker is terminated.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=42843
&gt; +
&gt; +        Tests: fast/workers/storage/interrupt-database-sync.html
&gt; +               fast/workers/storage/interrupt-database.html
&gt; +
&gt; +        * platform/sql/SQLiteDatabase.cpp:
&gt; +        (WebCore::SQLiteDatabase::SQLiteDatabase):
&gt; +        (WebCore::SQLiteDatabase::interrupt):
&gt; +        * platform/sql/SQLiteDatabase.h:
&gt; +        (WebCore::SQLiteDatabase::isInterrupted):
&gt; +        (WebCore::SQLiteDatabase::databaseMutex):
&gt; +        * platform/sql/SQLiteStatement.cpp:
&gt; +        (WebCore::SQLiteStatement::prepare):
&gt; +        (WebCore::SQLiteStatement::step):
&gt; +        * storage/AbstractDatabase.cpp:
&gt; +        (WebCore::AbstractDatabase::interrupt):
&gt; +        * storage/AbstractDatabase.h:
&gt; +        * storage/DatabaseTracker.cpp:
&gt; +        (WebCore::DatabaseTracker::interruptAllDatabasesForContext):
&gt; +        * storage/DatabaseTracker.h:
&gt; +        * storage/SQLStatement.cpp:
&gt; +        (WebCore::SQLStatement::execute):
&gt; +        * storage/SQLStatementSync.cpp:
&gt; +        (WebCore::SQLStatementSync::execute):
&gt; +        * storage/chromium/DatabaseTrackerChromium.cpp:
&gt; +        (WebCore::DatabaseTracker::interruptAllDatabasesForContext):
&gt; +        * workers/WorkerThread.cpp:
&gt; +        (WebCore::WorkerThread::stop):

In general, it is nice to have short comments here explaining what was done in each place (see any of Darin Adler&apos;s commits for good examples).

&gt; Index: WebCore/platform/sql/SQLiteDatabase.cpp
&gt; +void SQLiteDatabase::interrupt()
&gt; +{
&gt; +    if (!m_db)
&gt; +        return;
&gt; +
&gt; +    while (!m_lockingMutex.tryLock())
&gt; +        sqlite3_interrupt(m_db);

How does this avoid doing the interrupt while with a database connection that is closed on might be closed before this call returns. According to http://www.sqlite.org/c3ref/interrupt.html, that is a dangerous thing to do.

&gt; Index: WebCore/platform/sql/SQLiteDatabase.h
&gt; +    bool isInterrupted();

const?

&gt; Index: WebCore/platform/sql/SQLiteStatement.cpp
&gt; @@ -61,6 +61,11 @@ SQLiteStatement::~SQLiteStatement()
&gt;  int SQLiteStatement::prepare()
&gt;  {
&gt;      ASSERT(!m_isPrepared);
&gt; +
&gt; +    MutexLocker databaseLock(m_database.databaseMutex());
&gt; +    if (m_database.isInterrupted())
&gt; +        return SQLITE_INTERRUPT;

For the naive folks (me), why do you need to take the lock in prepare() and step() but no other methods?

&gt; Index: WebCore/storage/DatabaseTracker.cpp
&gt; +                    for (DatabaseSet::const_iterator dbSetIt = databaseSet-&gt;begin(); dbSetIt != dbSetEndIt; ++dbSetIt)

Style nit: need braces on this &quot;for&quot;

&gt; +                        if ((*dbSetIt)-&gt;scriptExecutionContext() == context)
&gt; +                            openDatabases.append(*dbSetIt);


&gt; Index: WebCore/storage/chromium/DatabaseTrackerChromium.cpp
&gt; ===================================================================
&gt; --- WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(revision 64062)
&gt; +++ WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(working copy)
&gt; @@ -172,4 +172,30 @@ unsigned long long DatabaseTracker::getM
&gt;      return databaseSize + spaceAvailable;
&gt;  }
&gt;  
&gt; +void DatabaseTracker::interruptAllDatabasesForContext(const ScriptExecutionContext* context)
&gt; +{
&gt; +    Vector&lt;RefPtr&lt;AbstractDatabase&gt; &gt; openDatabases;
&gt; +    {
&gt; +        MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
&gt; +
&gt; +        if (m_openDatabaseMap) {

You could just return here.

&gt; +            DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(context-&gt;securityOrigin());
&gt; +            if (nameMap) {

You could just return here.

&gt; +                DatabaseNameMap::const_iterator dbNameMapEndIt = nameMap-&gt;end();
&gt; +                for (DatabaseNameMap::const_iterator dbNameMapIt = nameMap-&gt;begin(); dbNameMapIt != dbNameMapEndIt; ++dbNameMapIt) {
&gt; +                    DatabaseSet* databaseSet = dbNameMapIt-&gt;second;
&gt; +                    DatabaseSet::const_iterator dbSetEndIt = databaseSet-&gt;end();
&gt; +                    for (DatabaseSet::const_iterator dbSetIt = databaseSet-&gt;begin(); dbSetIt != dbSetEndIt; ++dbSetIt)

Needs braces as before.

&gt; +                        if ((*dbSetIt)-&gt;scriptExecutionContext() == context)
&gt; +                            openDatabases.append(*dbSetIt);
&gt; +                }
&gt; +            }
&gt; +        }
&gt; +    }
&gt; +
&gt; +    Vector&lt;RefPtr&lt;AbstractDatabase&gt; &gt;::const_iterator openDatabasesEndIt = openDatabases.end();
&gt; +    for (Vector&lt;RefPtr&lt;AbstractDatabase&gt; &gt;::const_iterator openDatabasesIt = openDatabases.begin(); openDatabasesIt != openDatabasesEndIt; ++openDatabasesIt)
&gt; +        (*openDatabasesIt)-&gt;interrupt();

Why are there two copies of this code?

Given the small set of member variables used, it seems like it could easily be a shared function if nothing else.

&gt; Index: WebCore/workers/WorkerThread.cpp

&gt; +#if ENABLE(DATABASE)
&gt;  #include &quot;DatabaseTask.h&quot;
&gt; +#include &quot;DatabaseTracker.h&quot;
&gt; +#endif

Ideally these #if includes should be placed after all other non-if&apos;ed includes.


&gt; Index: LayoutTests/fast/workers/storage/interrupt-database-sync.html
&gt; +function runTest()
&gt; +{
&gt; +    if (window.layoutTestController) {
&gt; +        layoutTestController.dumpAsText();
&gt; +        layoutTestController.waitUntilDone();
&gt; +    }
&gt; +
&gt; +    worker = new Worker(&apos;resources/interrupt-database-sync.js&apos;);
&gt; +    worker.onmessage = function(event) {
&gt; +        if (event.data == &quot;done&quot;)
&gt; +            finishTest();
&gt; +        else
&gt; +            log(event.data);
&gt; +    };
&gt; +
&gt; +    setTimeout(&apos;terminateWorker()&apos;, 500);

Is it possible to avoid doing this as a timeout? The timeout has two downsides:
1. It may make the test take longer than necessary.
2. It may make the test flaky if somehow things take longer than expected on a machine. (For example if running the test under valgrind.)

Here&apos;s some possible alternative. 
1. Post a message from the worker after the db transactions have happened at least once. Then do the terminate when you get this message back.
2. Put a specific value in the the db in the worker. Wait for that value to appear before doing the terminate.

Ditto for the other test that uses a timeout for the same type of thing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257077</commentid>
    <comment_count>15</comment_count>
      <attachid>62804</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-28 02:15:18 -0700</bug_when>
    <thetext>Created attachment 62804
patch

(In reply to comment #14)
&gt; (From update of attachment 62596 [details])
&gt; &gt; Index: WebCore/ChangeLog
&gt; &gt; ===================================================================
&gt; In general, it is nice to have short comments here explaining what was done in each place (see any of Darin Adler&apos;s commits for good examples).

done.

&gt; &gt; Index: WebCore/platform/sql/SQLiteDatabase.cpp
&gt; &gt; +void SQLiteDatabase::interrupt()
&gt; &gt; +{
&gt; &gt; +    if (!m_db)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    while (!m_lockingMutex.tryLock())
&gt; &gt; +        sqlite3_interrupt(m_db);
&gt; 
&gt; How does this avoid doing the interrupt while with a database connection that is closed on might be closed before this call returns. According to http://www.sqlite.org/c3ref/interrupt.html, that is a dangerous thing to do.

fixed. i thought that database would be opened until the context is destroyed, but then i realized that it could be GCed by the JS engine too, which would force it to close.

&gt; &gt; Index: WebCore/platform/sql/SQLiteDatabase.h
&gt; &gt; +    bool isInterrupted();
&gt; 
&gt; const?

can&apos;t make it const because of the assertion.

&gt; &gt; Index: WebCore/platform/sql/SQLiteStatement.cpp
&gt; &gt; @@ -61,6 +61,11 @@ SQLiteStatement::~SQLiteStatement()
&gt; &gt;  int SQLiteStatement::prepare()
&gt; &gt;  {
&gt; &gt;      ASSERT(!m_isPrepared);
&gt; &gt; +
&gt; &gt; +    MutexLocker databaseLock(m_database.databaseMutex());
&gt; &gt; +    if (m_database.isInterrupted())
&gt; &gt; +        return SQLITE_INTERRUPT;
&gt; 
&gt; For the naive folks (me), why do you need to take the lock in prepare() and step() but no other methods?

all other methods either bind a parameter, or return a value, which is fast. so we don&apos;t need to interrupt them.

&gt; &gt; Index: WebCore/storage/DatabaseTracker.cpp
&gt; &gt; +                    for (DatabaseSet::const_iterator dbSetIt = databaseSet-&gt;begin(); dbSetIt != dbSetEndIt; ++dbSetIt)
&gt; 
&gt; Style nit: need braces on this &quot;for&quot;
&gt; 
&gt; &gt; +                        if ((*dbSetIt)-&gt;scriptExecutionContext() == context)
&gt; &gt; +                            openDatabases.append(*dbSetIt);

fixed.

&gt; &gt; Index: WebCore/storage/chromium/DatabaseTrackerChromium.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(revision 64062)
&gt; &gt; +++ WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(working copy)
&gt; &gt; @@ -172,4 +172,30 @@ unsigned long long DatabaseTracker::getM
&gt; &gt;      return databaseSize + spaceAvailable;
&gt; &gt;  }
&gt; &gt;  
&gt; &gt; +void DatabaseTracker::interruptAllDatabasesForContext(const ScriptExecutionContext* context)
&gt; &gt; +{
&gt; &gt; +    Vector&lt;RefPtr&lt;AbstractDatabase&gt; &gt; openDatabases;
&gt; &gt; +    {
&gt; &gt; +        MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
&gt; &gt; +
&gt; &gt; +        if (m_openDatabaseMap) {
&gt; 
&gt; You could just return here.

changed, in this file and in DatabaseTracker.cpp too.

&gt; &gt; +            DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(context-&gt;securityOrigin());
&gt; &gt; +            if (nameMap) {
&gt; 
&gt; You could just return here.

done, in both .cpp files.

&gt; &gt; +                DatabaseNameMap::const_iterator dbNameMapEndIt = nameMap-&gt;end();
&gt; &gt; +                for (DatabaseNameMap::const_iterator dbNameMapIt = nameMap-&gt;begin(); dbNameMapIt != dbNameMapEndIt; ++dbNameMapIt) {
&gt; &gt; +                    DatabaseSet* databaseSet = dbNameMapIt-&gt;second;
&gt; &gt; +                    DatabaseSet::const_iterator dbSetEndIt = databaseSet-&gt;end();
&gt; &gt; +                    for (DatabaseSet::const_iterator dbSetIt = databaseSet-&gt;begin(); dbSetIt != dbSetEndIt; ++dbSetIt)
&gt; 
&gt; Needs braces as before.

fixed.

&gt; &gt; +    Vector&lt;RefPtr&lt;AbstractDatabase&gt; &gt;::const_iterator openDatabasesEndIt = openDatabases.end();
&gt; &gt; +    for (Vector&lt;RefPtr&lt;AbstractDatabase&gt; &gt;::const_iterator openDatabasesIt = openDatabases.begin(); openDatabasesIt != openDatabasesEndIt; ++openDatabasesIt)
&gt; &gt; +        (*openDatabasesIt)-&gt;interrupt();
&gt; 
&gt; Why are there two copies of this code?
&gt; 
&gt; Given the small set of member variables used, it seems like it could easily be a shared function if nothing else.

DatabaseTracker.cpp is WebKit&apos;s implementation. DatabaseTrackerChromium.cpp is Chromium&apos;s implementation. we had to split them, because Chromium uses only a few methods declared in DatabaseTracker.h, while other ports use more methods, keep track of more things and include more classes. in theory, DatabaseTracker.cpp should look like DatabaseTrackerChromium.cpp, and the rest of it should go into separate files that are only included by the ports that use that functionality. but it hasn&apos;t been easy to make that happen in practice.

&gt; &gt; Index: WebCore/workers/WorkerThread.cpp
&gt; 
&gt; &gt; +#if ENABLE(DATABASE)
&gt; &gt;  #include &quot;DatabaseTask.h&quot;
&gt; &gt; +#include &quot;DatabaseTracker.h&quot;
&gt; &gt; +#endif
&gt; 
&gt; Ideally these #if includes should be placed after all other non-if&apos;ed includes.

moved, wasn&apos;t sure what the rule was, so i was trying to keep them ordered alphabetically.

&gt; &gt; Index: LayoutTests/fast/workers/storage/interrupt-database-sync.html
&gt; &gt; +function runTest()
&gt; &gt; +{
&gt; &gt; +    if (window.layoutTestController) {
&gt; &gt; +        layoutTestController.dumpAsText();
&gt; &gt; +        layoutTestController.waitUntilDone();
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    worker = new Worker(&apos;resources/interrupt-database-sync.js&apos;);
&gt; &gt; +    worker.onmessage = function(event) {
&gt; &gt; +        if (event.data == &quot;done&quot;)
&gt; &gt; +            finishTest();
&gt; &gt; +        else
&gt; &gt; +            log(event.data);
&gt; &gt; +    };
&gt; &gt; +
&gt; &gt; +    setTimeout(&apos;terminateWorker()&apos;, 500);
&gt; 
&gt; Is it possible to avoid doing this as a timeout? The timeout has two downsides:
&gt; 1. It may make the test take longer than necessary.
&gt; 2. It may make the test flaky if somehow things take longer than expected on a machine. (For example if running the test under valgrind.)
&gt; 
&gt; Here&apos;s some possible alternative. 
&gt; 1. Post a message from the worker after the db transactions have happened at least once. Then do the terminate when you get this message back.
&gt; 2. Put a specific value in the the db in the worker. Wait for that value to appear before doing the terminate.
&gt; 
&gt; Ditto for the other test that uses a timeout for the same type of thing.

i used your first suggestion. i knew that setTimeout() is evil, but for some reason haven&apos;t spent too much time thinking about ways to not use it...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257243</commentid>
    <comment_count>16</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-07-28 10:42:50 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; &gt; Why are there two copies of this code?
&gt; &gt; 
&gt; &gt; Given the small set of member variables used, it seems like it could easily be a shared function if nothing else.
&gt; 
&gt; DatabaseTracker.cpp is WebKit&apos;s implementation. DatabaseTrackerChromium.cpp is Chromium&apos;s implementation. we had to split them, because Chromium uses only a few methods declared in DatabaseTracker.h, while other ports use more methods, keep track of more things and include more classes. in theory, DatabaseTracker.cpp should look like DatabaseTrackerChromium.cpp, and the rest of it should go into separate files that are only included by the ports that use that functionality. but it hasn&apos;t been easy to make that happen in practice.

This doesn&apos;t seem to answer the question:
Why can&apos;t there be a shared function in this case (since the code is exactly the same)? Not a class member function but just a plain old function some place where both chromium&apos;s implementation and WebKit&apos;s implementation can call it?

Duplicate code is bad.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257260</commentid>
    <comment_count>17</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-07-28 11:29:21 -0700</bug_when>
    <thetext>I&apos;ve been thinking about m_interrupted and m_lockingMutex. 

It seems like the code could do &quot;m_interrupted = true;&quot; in SQLiteDatabase::interrupt() before acquiring the mutex.

I do understand why you want to get the mutex before checking its value because if SQLiteDatabase::interrupt() has exited, you don&apos;t want any more operations happening.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257401</commentid>
    <comment_count>18</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-28 15:38:09 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; This doesn&apos;t seem to answer the question:
&gt; Why can&apos;t there be a shared function in this case (since the code is exactly the same)? Not a class member function but just a plain old function some place where both chromium&apos;s implementation and WebKit&apos;s implementation can call it?
&gt; 
&gt; Duplicate code is bad.

If we had such a function, it would have to live either in DatabaseTracker.h, or in a new file that would have only 1 function, and could easily become the dumping place for other DB-related &quot;utility&quot; functions. I&apos;m not sure either option is better than having this code duplicated. Don&apos;t know if it makes it any better, but there&apos;s a bug opened to clean up DatabaseTracker (https://bugs.webkit.org/show_bug.cgi?id=31482).

(In reply to comment #17)
&gt; I&apos;ve been thinking about m_interrupted and m_lockingMutex. 
&gt; 
&gt; It seems like the code could do &quot;m_interrupted = true;&quot; in SQLiteDatabase::interrupt() before acquiring the mutex.

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257450</commentid>
    <comment_count>19</comment_count>
      <attachid>62892</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-28 16:51:37 -0700</bug_when>
    <thetext>Created attachment 62892
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257509</commentid>
    <comment_count>20</comment_count>
      <attachid>62804</attachid>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-07-28 18:22:31 -0700</bug_when>
    <thetext>Comment on attachment 62804
patch

http://wkrietveld.appspot.com/42843/diff/11001/12006
File JavaScriptCore/wtf/ThreadingWin.cpp (right):

http://wkrietveld.appspot.com/42843/diff/11001/12006#newcode271
JavaScriptCore/wtf/ThreadingWin.cpp:271: ::SwitchToThread();
Is SwitchToThread() or Sleep(0) better for our particular use case?

http://wkrietveld.appspot.com/42843/diff/11001/12018
File WebCore/storage/SQLStatement.cpp (right):

http://wkrietveld.appspot.com/42843/diff/11001/12018#newcode81
WebCore/storage/SQLStatement.cpp:81: m_error = SQLError::create(db-&gt;isInterrupted() ? SQLError::DATABASE_ERR : SQLError::SYNTAX_ERR, database-&gt;lastErrorMsg());
Would it make sense to test result for equality with SQLITE_INTERRUPT here instead of sampling isInterrupted?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257522</commentid>
    <comment_count>21</comment_count>
      <attachid>62912</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-28 19:26:09 -0700</bug_when>
    <thetext>Created attachment 62912
patch

&gt; http://wkrietveld.appspot.com/42843/diff/11001/12006#newcode271
&gt; JavaScriptCore/wtf/ThreadingWin.cpp:271: ::SwitchToThread();
&gt; Is SwitchToThread() or Sleep(0) better for our particular use case?

looks like Sleep(1) is better than both SwitchToThread() and Sleep(0).

&gt; http://wkrietveld.appspot.com/42843/diff/11001/12018
&gt; File WebCore/storage/SQLStatement.cpp (right):
&gt; 
&gt; http://wkrietveld.appspot.com/42843/diff/11001/12018#newcode81
&gt; WebCore/storage/SQLStatement.cpp:81: m_error = SQLError::create(db-&gt;isInterrupted() ? SQLError::DATABASE_ERR : SQLError::SYNTAX_ERR, database-&gt;lastErrorMsg());
&gt; Would it make sense to test result for equality with SQLITE_INTERRUPT here instead of sampling isInterrupted?

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257899</commentid>
    <comment_count>22</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-29 14:52:41 -0700</bug_when>
    <thetext>At Ossy&apos;s recommendation, I changed qt&apos;s yield() implementation to QThread::yieldCurrentThread().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>257923</commentid>
    <comment_count>23</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-29 15:31:12 -0700</bug_when>
    <thetext>landed: r64313.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258095</commentid>
    <comment_count>24</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2010-07-30 02:28:49 -0700</bug_when>
    <thetext>I cc-ed Andras, could you check JavaScriptCore/wtf/qt/ThreadingQt.cpp, please ?

And reopen, because it was rolled out by http://trac.webkit.org/changeset/64334</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258409</commentid>
    <comment_count>25</comment_count>
      <attachid>63108</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-30 15:04:05 -0700</bug_when>
    <thetext>Created attachment 63108
patch

same patch, with one minor change. the ASSERT in SQLiteDatabase::close() was commented out before this patch. i thought it would be ok to uncomment it, but turns out i was wrong -- it&apos;s ok to uncomment it for WebSQLDatabases, but there&apos;s other code that doesn&apos;t close the database on the same thread that opened it. so i left that ASSERT commented out as it was before.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>258458</commentid>
    <comment_count>26</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-07-30 16:20:02 -0700</bug_when>
    <thetext>re-landed: r64384.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62337</attachid>
            <date>2010-07-22 14:18:50 -0700</date>
            <delta_ts>2010-07-24 03:52:30 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>32462</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MzkxMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTkgQEAKKzIwMTAtMDctMjEgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBJbnRlcnJ1cHQgYWxsIERCIG9wZXJhdGlvbnMgd2hlbiBhIHdvcmtlciBpcyB0ZXJtaW5hdGVk
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDI4NDMK
KworICAgICAgICBUZXN0czogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNl
LXN5bmMuaHRtbAorICAgICAgICAgICAgICAgZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0
LWRhdGFiYXNlLmh0bWwKKworICAgICAgICAqIHBsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6aW50ZXJydXB0KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9z
cWwvU1FMaXRlU3RhdGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVu
dDo6cHJlcGFyZSk6CisgICAgICAgICogc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkFic3RyYWN0RGF0YWJhc2U6OkFic3RyYWN0RGF0YWJhc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6QWJzdHJhY3REYXRhYmFzZTo6aW50ZXJydXB0KToKKyAgICAgICAgKiBz
dG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OkFic3RyYWN0RGF0
YWJhc2U6OmNsb3NlZE9ySW50ZXJydXB0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6QWJzdHJhY3RE
YXRhYmFzZTo6aW50ZXJydXB0ZWRNdXRleCk6CisgICAgICAgIChXZWJDb3JlOjpBYnN0cmFjdERh
dGFiYXNlOjpvcGVuZWQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2UuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2U6Om9wZW5EYXRhYmFzZSk6CisgICAgICAgICogc3RvcmFnZS9E
YXRhYmFzZVN5bmMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VTeW5jOjpvcGVuRGF0
YWJhc2VTeW5jKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlU3luYzo6Y2hhbmdlVmVyc2lv
bik6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVN5bmM6OnRyYW5zYWN0aW9uKToKKyAgICAg
ICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmNhbkVzdGFibGlzaERhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6aW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZSk6CisgICAgICAgICog
c3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJh
Y2tlcjo6aW50ZXJydXB0ZWRNdXRleCk6CisgICAgICAgICogc3RvcmFnZS9TUUxTdGF0ZW1lbnQu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVtZW50OjpleGVjdXRlKToKKyAgICAgICAg
KiBzdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMU3Rh
dGVtZW50U3luYzo6ZXhlY3V0ZSk6CisgICAgICAgICogc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6ZXhlY3V0ZVNRTCk6CisgICAg
ICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6Y2hlY2tBbmRIYW5kbGVDbG9zZWREYXRhYmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6cGVyZm9ybU5leHRTdGVwKToK
KyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpwZXJmb3JtUGVuZGluZ0NhbGxiYWNr
KToKKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyVHJhbnNhY3Rpb25D
YWxsYmFjayk6CisgICAgICAgICogc3RvcmFnZS9TUUxUcmFuc2FjdGlvblN5bmMuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb25TeW5jOjpleGVjdXRlU1FMKToKKyAgICAgICAg
KFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uU3luYzo6YmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6
U1FMVHJhbnNhY3Rpb25TeW5jOjpleGVjdXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5z
YWN0aW9uU3luYzo6Y29tbWl0KToKKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNl
VHJhY2tlckNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6
Y2FuRXN0YWJsaXNoRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2Vy
OjppbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFiYXNlKToKKyAgICAgICAgKiB3b3JrZXJzL1dvcmtl
clRocmVhZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJUaHJlYWQ6OnN0b3ApOgorCiAy
MDEwLTA3LTIyICBEdW1pdHJ1IERhbmlsaXVjICA8ZHVtaUBjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgT2phbiBWYWZhaS4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NR
TGl0ZURhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxp
dGVEYXRhYmFzZS5jcHAJKHJldmlzaW9uIDYzOTEwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwv
U1FMaXRlRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Miw2ICs0Miw3IEBAIGNvbnN0
IGludCBTUUxSZXN1bHRPayA9IFNRTElURV9PSzsKIGNvbnN0IGludCBTUUxSZXN1bHRSb3cgPSBT
UUxJVEVfUk9XOwogY29uc3QgaW50IFNRTFJlc3VsdFNjaGVtYSA9IFNRTElURV9TQ0hFTUE7CiBj
b25zdCBpbnQgU1FMUmVzdWx0RnVsbCA9IFNRTElURV9GVUxMOworY29uc3QgaW50IFNRTFJlc3Vs
dEludGVycnVwdCA9IFNRTElURV9JTlRFUlJVUFQ7CiAKIAogU1FMaXRlRGF0YWJhc2U6OlNRTGl0
ZURhdGFiYXNlKCkKQEAgLTkyLDYgKzkzLDEyIEBAIHZvaWQgU1FMaXRlRGF0YWJhc2U6OmNsb3Nl
KCkKICAgICBtX29wZW5pbmdUaHJlYWQgPSAwOwogfQogCit2b2lkIFNRTGl0ZURhdGFiYXNlOjpp
bnRlcnJ1cHQoKQoreworICAgIGlmIChtX2RiKQorICAgICAgICBzcWxpdGUzX2ludGVycnVwdCht
X2RiKTsKK30KKwogdm9pZCBTUUxpdGVEYXRhYmFzZTo6c2V0RnVsbHN5bmMoYm9vbCBmc3luYykg
CiB7CiAgICAgaWYgKGZzeW5jKSAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURh
dGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJh
c2UuaAkocmV2aXNpb24gNjM5MTApCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRh
YmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCw3IEBAIGV4dGVybiBjb25zdCBpbnQg
U1FMUmVzdWx0T2s7CiBleHRlcm4gY29uc3QgaW50IFNRTFJlc3VsdFJvdzsKIGV4dGVybiBjb25z
dCBpbnQgU1FMUmVzdWx0U2NoZW1hOwogZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1bHRGdWxsOwor
ZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1bHRJbnRlcnJ1cHQ7CiAKIGNsYXNzIFNRTGl0ZURhdGFi
YXNlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKICAgICBmcmllbmQgY2xhc3MgU1FMaXRlVHJhbnNh
Y3Rpb247CkBAIC01OCw2ICs1OSw3IEBAIHB1YmxpYzoKICAgICBib29sIG9wZW4oY29uc3QgU3Ry
aW5nJiBmaWxlbmFtZSwgYm9vbCBmb3JXZWJTUUxEYXRhYmFzZSA9IGZhbHNlKTsKICAgICBib29s
IGlzT3BlbigpIGNvbnN0IHsgcmV0dXJuIG1fZGI7IH0KICAgICB2b2lkIGNsb3NlKCk7CisgICAg
dm9pZCBpbnRlcnJ1cHQoKTsKIAogICAgIGJvb2wgZXhlY3V0ZUNvbW1hbmQoY29uc3QgU3RyaW5n
Jik7CiAgICAgYm9vbCByZXR1cm5zQXRMZWFzdE9uZVJlc3VsdChjb25zdCBTdHJpbmcmKTsKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0YXRlbWVudC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3RhdGVtZW50LmNwcAkocmV2aXNpb24gNjM5
MTApCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVTdGF0ZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC03Niw5ICs3NiwxMSBAQCBpbnQgU1FMaXRlU3RhdGVtZW50OjpwcmVwYXJlKCkK
IAogICAgIGlmIChlcnJvciAhPSBTUUxJVEVfT0spCiAgICAgICAgIExPRyhTUUxEYXRhYmFzZSwg
InNxbGl0ZTNfcHJlcGFyZTE2IGZhaWxlZCAoJWkpXG4lc1xuJXMiLCBlcnJvciwgbV9xdWVyeS5h
c2NpaSgpLmRhdGEoKSwgc3FsaXRlM19lcnJtc2cobV9kYXRhYmFzZS5zcWxpdGUzSGFuZGxlKCkp
KTsKLSAgICBjb25zdCBVQ2hhciogY2ggPSBzdGF0aWNfY2FzdDxjb25zdCBVQ2hhcio+KHRhaWwp
OwotICAgIGlmIChjaCAmJiAqY2gpCi0gICAgICAgIGVycm9yID0gU1FMSVRFX0VSUk9SOworICAg
IGVsc2UgeworICAgICAgICBjb25zdCBVQ2hhciogY2ggPSBzdGF0aWNfY2FzdDxjb25zdCBVQ2hh
cio+KHRhaWwpOworICAgICAgICBpZiAoY2ggJiYgKmNoKQorICAgICAgICAgICAgZXJyb3IgPSBT
UUxJVEVfRVJST1I7CisgICAgfQogI2lmbmRlZiBOREVCVUcKICAgICBtX2lzUHJlcGFyZWQgPSBl
cnJvciA9PSBTUUxJVEVfT0s7CiAjZW5kaWYKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFj
dERhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJhY3REYXRh
YmFzZS5jcHAJKHJldmlzaW9uIDYzOTEwKQorKysgV2ViQ29yZS9zdG9yYWdlL0Fic3RyYWN0RGF0
YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xODAsNiArMTgwLDcgQEAgQWJzdHJhY3REYXRh
YmFzZTo6QWJzdHJhY3REYXRhYmFzZShTY3JpcAogICAgICwgbV9ndWlkKDApCiAgICAgLCBtX29w
ZW5lZChmYWxzZSkKICAgICAsIG1fbmV3KGZhbHNlKQorICAgICwgbV9pbnRlcnJ1cHRlZChmYWxz
ZSkKIHsKICAgICBBU1NFUlQoY29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOwogICAgIG1fY29u
dGV4dFRocmVhZFNlY3VyaXR5T3JpZ2luID0gbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5zZWN1
cml0eU9yaWdpbigpOwpAQCAtNDc0LDYgKzQ3NSwxNiBAQCB2b2lkIEFic3RyYWN0RGF0YWJhc2U6
OmluY3JlbWVudGFsVmFjdXVtCiAgICAgICAgIG1fc3FsaXRlRGF0YWJhc2UucnVuSW5jcmVtZW50
YWxWYWN1dW1Db21tYW5kKCk7CiB9CiAKK3ZvaWQgQWJzdHJhY3REYXRhYmFzZTo6aW50ZXJydXB0
KCkKK3sKKyAgICB3aGlsZSAoIW1faW50ZXJydXB0ZWRHdWFyZC50cnlMb2NrKCkpCisgICAgICAg
IG1fc3FsaXRlRGF0YWJhc2UuaW50ZXJydXB0KCk7CisKKyAgICBBU1NFUlQoIW1faW50ZXJydXB0
ZWRHdWFyZC50cnlMb2NrKCkpOworICAgIG1faW50ZXJydXB0ZWQgPSB0cnVlOworICAgIG1faW50
ZXJydXB0ZWRHdWFyZC51bmxvY2soKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAj
ZW5kaWYgLy8gRU5BQkxFKERBVEFCQVNFKQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0Fic3RyYWN0
RGF0YWJhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJhY3REYXRhYmFz
ZS5oCShyZXZpc2lvbiA2MzkxMCkKKysrIFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTU1LDggKzU1LDggQEAgcHVibGljOgogCiAgICAgdmlydHVh
bCBTdHJpbmcgdmVyc2lvbigpIGNvbnN0OwogCi0gICAgYm9vbCBvcGVuZWQoKSBjb25zdCB7IHJl
dHVybiBtX29wZW5lZDsgfQogICAgIGJvb2wgaXNOZXcoKSBjb25zdCB7IHJldHVybiBtX25ldzsg
fQorICAgIGJvb2wgY2xvc2VkT3JJbnRlcnJ1cHRlZCgpIGNvbnN0IHsgcmV0dXJuICFtX29wZW5l
ZCB8fCBtX2ludGVycnVwdGVkOyB9CiAKICAgICB2aXJ0dWFsIFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdDsKICAgICB2aXJ0dWFsIFNlY3VyaXR5
T3JpZ2luKiBzZWN1cml0eU9yaWdpbigpIGNvbnN0OwpAQCAtNjgsNiArNjgsOCBAQCBwdWJsaWM6
CiAKICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbWF4aW11bVNpemUoKSBjb25zdDsKICAgICB2b2lk
IGluY3JlbWVudGFsVmFjdXVtSWZOZWVkZWQoKTsKKyAgICB2b2lkIGludGVycnVwdCgpOworICAg
IE11dGV4JiBpbnRlcnJ1cHRlZE11dGV4KCkgeyByZXR1cm4gbV9pbnRlcnJ1cHRlZEd1YXJkOyB9
CiAKICAgICAvLyBGSVhNRTogbW92ZSBhbGwgdmVyc2lvbi1yZWxhdGVkIG1ldGhvZHMgdG8gYSBE
YXRhYmFzZVZlcnNpb25UcmFja2VyIGNsYXNzCiAgICAgYm9vbCB2ZXJzaW9uTWF0Y2hlc0V4cGVj
dGVkKCkgY29uc3Q7CkBAIC05MSw2ICs5Myw3IEBAIHByb3RlY3RlZDoKICAgICBBYnN0cmFjdERh
dGFiYXNlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0
IFN0cmluZyYgZXhwZWN0ZWRWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3Ry
aW5nJiBkaXNwbGF5TmFtZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKTsKIAorICAgIGJv
b2wgb3BlbmVkKCkgY29uc3QgeyByZXR1cm4gbV9vcGVuZWQ7IH0KICAgICB2b2lkIGNsb3NlRGF0
YWJhc2UoKTsKIAogICAgIHZpcnR1YWwgYm9vbCBwZXJmb3JtT3BlbkFuZFZlcmlmeShib29sIHNo
b3VsZFNldFZlcnNpb25Jbk5ld0RhdGFiYXNlLCBFeGNlcHRpb25Db2RlJiBlYyk7CkBAIC0xMTYs
NiArMTE5LDggQEAgcHJpdmF0ZToKICAgICBpbnQgbV9ndWlkOwogICAgIGJvb2wgbV9vcGVuZWQ7
CiAgICAgYm9vbCBtX25ldzsKKyAgICBib29sIG1faW50ZXJydXB0ZWQ7CisgICAgTXV0ZXggbV9p
bnRlcnJ1cHRlZEd1YXJkOwogCiAgICAgU1FMaXRlRGF0YWJhc2UgbV9zcWxpdGVEYXRhYmFzZTsK
IApJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA2MzkxMCkKKysrIFdlYkNvcmUvc3Rv
cmFnZS9EYXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg5LDYgKzg5LDggQEAgUGFzc1Jl
ZlB0cjxEYXRhYmFzZT4gRGF0YWJhc2U6Om9wZW5EYXRhYgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGVzdGltYXRlZFNpemUsIFBhc3NS
ZWZQdHI8RGF0YWJhc2VDYWxsYmFjaz4gY3JlYXRpb25DYWxsYmFjaywKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSYgZSkKIHsKKyAgICBN
dXRleExvY2tlciBpbnRlcnJ1cHRlZE11dGV4TG9jayhEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIo
KS5pbnRlcnJ1cHRlZE11dGV4KCkpOworCiAgICAgaWYgKCFEYXRhYmFzZVRyYWNrZXI6OnRyYWNr
ZXIoKS5jYW5Fc3RhYmxpc2hEYXRhYmFzZShjb250ZXh0LCBuYW1lLCBkaXNwbGF5TmFtZSwgZXN0
aW1hdGVkU2l6ZSkpIHsKICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJEYXRhYmFzZSAlcyBmb3Ig
b3JpZ2luICVzIG5vdCBhbGxvd2VkIHRvIGJlIGVzdGFibGlzaGVkIiwgbmFtZS5hc2NpaSgpLmRh
dGEoKSwgY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKS0+dG9TdHJpbmcoKS5hc2NpaSgpLmRhdGEo
KSk7CiAgICAgICAgIHJldHVybiAwOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlU3lu
Yy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlU3luYy5jcHAJKHJl
dmlzaW9uIDYzOTEwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlU3luYy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUwLDYgKzUwLDggQEAgUGFzc1JlZlB0cjxEYXRhYmFzZVN5bmM+IERhdGFi
YXNlU3luYzo6bwogewogICAgIEFTU0VSVChjb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7CiAK
KyAgICBNdXRleExvY2tlciBpbnRlcnJ1cHRlZE11dGV4TG9jayhEYXRhYmFzZVRyYWNrZXI6OnRy
YWNrZXIoKS5pbnRlcnJ1cHRlZE11dGV4KCkpOworCiAgICAgaWYgKCFEYXRhYmFzZVRyYWNrZXI6
OnRyYWNrZXIoKS5jYW5Fc3RhYmxpc2hEYXRhYmFzZShjb250ZXh0LCBuYW1lLCBkaXNwbGF5TmFt
ZSwgZXN0aW1hdGVkU2l6ZSkpIHsKICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJEYXRhYmFzZSAl
cyBmb3Igb3JpZ2luICVzIG5vdCBhbGxvd2VkIHRvIGJlIGVzdGFibGlzaGVkIiwgbmFtZS5hc2Np
aSgpLmRhdGEoKSwgY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKS0+dG9TdHJpbmcoKS5hc2NpaSgp
LmRhdGEoKSk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtOTQsNiArOTYsMTIgQEAgdm9pZCBEYXRh
YmFzZVN5bmM6OmNoYW5nZVZlcnNpb24oY29uc3QgUwogewogICAgIEFTU0VSVChtX3NjcmlwdEV4
ZWN1dGlvbkNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKIAorICAgIE11dGV4TG9ja2VyIGlu
dGVycnVwdGVkTXV0ZXhMb2NrKGludGVycnVwdGVkTXV0ZXgoKSk7CisgICAgaWYgKGNsb3NlZE9y
SW50ZXJydXB0ZWQoKSkgeworICAgICAgICBlYyA9IFNRTEV4Y2VwdGlvbjo6REFUQUJBU0VfRVJS
OworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgaWYgKHNxbGl0ZURhdGFiYXNlKCkudHJh
bnNhY3Rpb25JblByb2dyZXNzKCkpIHsKICAgICAgICAgZWMgPSBTUUxFeGNlcHRpb246OkRBVEFC
QVNFX0VSUjsKICAgICAgICAgcmV0dXJuOwpAQCAtMTMyLDYgKzE0MCwxMiBAQCB2b2lkIERhdGFi
YXNlU3luYzo6dHJhbnNhY3Rpb24oUGFzc1JlZlB0CiB7CiAgICAgQVNTRVJUKG1fc2NyaXB0RXhl
Y3V0aW9uQ29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOwogCisgICAgTXV0ZXhMb2NrZXIgaW50
ZXJydXB0ZWRNdXRleExvY2soaW50ZXJydXB0ZWRNdXRleCgpKTsKKyAgICBpZiAoY2xvc2VkT3JJ
bnRlcnJ1cHRlZCgpKSB7CisgICAgICAgIGVjID0gU1FMRXhjZXB0aW9uOjpEQVRBQkFTRV9FUlI7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAoc3FsaXRlRGF0YWJhc2UoKS50cmFu
c2FjdGlvbkluUHJvZ3Jlc3MoKSkgewogICAgICAgICBlYyA9IFNRTEV4Y2VwdGlvbjo6REFUQUJB
U0VfRVJSOwogICAgICAgICByZXR1cm47CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VU
cmFja2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2Vy
LmNwcAkocmV2aXNpb24gNjM5MTApCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2Vy
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM3LDYgKzEzNywxMSBAQCB2b2lkIERhdGFiYXNlVHJh
Y2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzCiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpjYW5Fc3Rh
Ymxpc2hEYXRhYmFzZShTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0LCBjb25zdCBTdHJp
bmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1h
dGVkU2l6ZSkKIHsKKyAgICBBU1NFUlQoIW1fb3BlbkRhdGFiYXNlTWFwR3VhcmQudHJ5TG9jaygp
KTsKKworICAgIGlmIChtX2ludGVycnVwdGVkQ29udGV4dHMuY29udGFpbnMoY29udGV4dCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4gPSBjb250
ZXh0LT5zZWN1cml0eU9yaWdpbigpOwogICAgIFByb3Bvc2VkRGF0YWJhc2UgZGV0YWlsczsKIApA
QCAtMjM1LDYgKzI0MCwyOSBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VDaGFuZ2Vk
KEFiCiAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyKCkubWFya0RhdGFiYXNlKGRhdGFiYXNlKTsKIH0K
IAordm9pZCBEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQo
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBNdXRleExvY2tlciBvcGVu
RGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworICAgIG1faW50ZXJydXB0
ZWRDb250ZXh0cy5hZGQoY29udGV4dCk7CisKKyAgICBpZiAoIW1fb3BlbkRhdGFiYXNlTWFwKQor
ICAgICAgICByZXR1cm47CisKKyAgICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5E
YXRhYmFzZU1hcC0+Z2V0KGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgIGlmICghbmFt
ZU1hcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVy
YXRvciBkYk5hbWVNYXBFbmRJdCA9IG5hbWVNYXAtPmVuZCgpOworICAgIGZvciAoRGF0YWJhc2VO
YW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVNYXBJdCA9IG5hbWVNYXAtPmJlZ2luKCk7IGRi
TmFtZU1hcEl0ICE9IGRiTmFtZU1hcEVuZEl0OyArK2RiTmFtZU1hcEl0KSB7CisgICAgICAgIERh
dGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9IGRiTmFtZU1hcEl0LT5zZWNvbmQ7CisgICAgICAgIERh
dGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgp
OworICAgICAgICBmb3IgKERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEl0ID0gZGF0
YWJhc2VTZXQtPmJlZ2luKCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsgKytkYlNldEl0KQorICAg
ICAgICAgICAgKCpkYlNldEl0KS0+aW50ZXJydXB0KCk7CisgICAgfQorCisgICAgbV9pbnRlcnJ1
cHRlZENvbnRleHRzLnJlbW92ZShjb250ZXh0KTsKK30KKwogU3RyaW5nIERhdGFiYXNlVHJhY2tl
cjo6b3JpZ2luUGF0aChTZWN1cml0eU9yaWdpbiogb3JpZ2luKSBjb25zdAogewogICAgIHJldHVy
biBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJh
c2VEaXJlY3RvcnlQYXRoLnRocmVhZHNhZmVDb3B5KCksIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkpOwpAQCAtNDgwLDM3ICs1MDgsMzUgQEAgdW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNl
VHJhY2tlcjo6dXNhZwogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFiYXNlKEFi
c3RyYWN0RGF0YWJhc2UqIGRhdGFiYXNlKQogeworICAgIEFTU0VSVCghbV9vcGVuRGF0YWJhc2VN
YXBHdWFyZC50cnlMb2NrKCkpOworCiAgICAgaWYgKCFkYXRhYmFzZSkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgewotICAgICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2NrKG1fb3Bl
bkRhdGFiYXNlTWFwR3VhcmQpOwotCi0gICAgICAgIGlmICghbV9vcGVuRGF0YWJhc2VNYXApCi0g
ICAgICAgICAgICBtX29wZW5EYXRhYmFzZU1hcC5zZXQobmV3IERhdGFiYXNlT3JpZ2luTWFwKTsK
KyAgICBpZiAoIW1fb3BlbkRhdGFiYXNlTWFwKQorICAgICAgICBtX29wZW5EYXRhYmFzZU1hcC5z
ZXQobmV3IERhdGFiYXNlT3JpZ2luTWFwKTsKIAotICAgICAgICBTdHJpbmcgbmFtZShkYXRhYmFz
ZS0+c3RyaW5nSWRlbnRpZmllcigpKTsKLSAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1lTWFw
ID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSk7Ci0g
ICAgICAgIGlmICghbmFtZU1hcCkgewotICAgICAgICAgICAgbmFtZU1hcCA9IG5ldyBEYXRhYmFz
ZU5hbWVNYXA7Ci0gICAgICAgICAgICBtX29wZW5EYXRhYmFzZU1hcC0+c2V0KGRhdGFiYXNlLT5z
ZWN1cml0eU9yaWdpbigpLT50aHJlYWRzYWZlQ29weSgpLCBuYW1lTWFwKTsKLSAgICAgICAgfQor
ICAgIFN0cmluZyBuYW1lKGRhdGFiYXNlLT5zdHJpbmdJZGVudGlmaWVyKCkpOworICAgIERhdGFi
YXNlTmFtZU1hcCogbmFtZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQoZGF0YWJhc2UtPnNl
Y3VyaXR5T3JpZ2luKCkpOworICAgIGlmICghbmFtZU1hcCkgeworICAgICAgICBuYW1lTWFwID0g
bmV3IERhdGFiYXNlTmFtZU1hcDsKKyAgICAgICAgbV9vcGVuRGF0YWJhc2VNYXAtPnNldChkYXRh
YmFzZS0+c2VjdXJpdHlPcmlnaW4oKS0+dGhyZWFkc2FmZUNvcHkoKSwgbmFtZU1hcCk7CisgICAg
fQogCi0gICAgICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9IG5hbWVNYXAtPmdldChuYW1l
KTsKLSAgICAgICAgaWYgKCFkYXRhYmFzZVNldCkgewotICAgICAgICAgICAgZGF0YWJhc2VTZXQg
PSBuZXcgRGF0YWJhc2VTZXQ7Ci0gICAgICAgICAgICBuYW1lTWFwLT5zZXQobmFtZS50aHJlYWRz
YWZlQ29weSgpLCBkYXRhYmFzZVNldCk7Ci0gICAgICAgIH0KKyAgICBEYXRhYmFzZVNldCogZGF0
YWJhc2VTZXQgPSBuYW1lTWFwLT5nZXQobmFtZSk7CisgICAgaWYgKCFkYXRhYmFzZVNldCkgewor
ICAgICAgICBkYXRhYmFzZVNldCA9IG5ldyBEYXRhYmFzZVNldDsKKyAgICAgICAgbmFtZU1hcC0+
c2V0KG5hbWUudGhyZWFkc2FmZUNvcHkoKSwgZGF0YWJhc2VTZXQpOworICAgIH0KIAotICAgICAg
ICBkYXRhYmFzZVNldC0+YWRkKGRhdGFiYXNlKTsKKyAgICBkYXRhYmFzZVNldC0+YWRkKGRhdGFi
YXNlKTsKIAotICAgICAgICBMT0coU3RvcmFnZUFQSSwgIkFkZGVkIG9wZW4gRGF0YWJhc2UgJXMg
KCVwKVxuIiwgZGF0YWJhc2UtPnN0cmluZ0lkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSwgZGF0
YWJhc2UpOworICAgIExPRyhTdG9yYWdlQVBJLCAiQWRkZWQgb3BlbiBEYXRhYmFzZSAlcyAoJXAp
XG4iLCBkYXRhYmFzZS0+c3RyaW5nSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpLCBkYXRhYmFz
ZSk7CiAKLSAgICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9j
a2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKLSAgICAgICAgaWYgKCFvcmlnaW5RdW90YU1hbmFn
ZXIoKS50cmFja3NPcmlnaW4oZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpKSB7Ci0gICAgICAg
ICAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja09yaWdpbihkYXRhYmFzZS0+c2VjdXJpdHlP
cmlnaW4oKSk7Ci0gICAgICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS5hZGREYXRhYmFzZShk
YXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSwgZGF0YWJhc2UtPnN0cmluZ0lkZW50aWZpZXIoKSwg
ZGF0YWJhc2UtPmZpbGVOYW1lKCkpOwotICAgICAgICB9CisgICAgTG9ja2VyPE9yaWdpblF1b3Rh
TWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICBp
ZiAoIW9yaWdpblF1b3RhTWFuYWdlcigpLnRyYWNrc09yaWdpbihkYXRhYmFzZS0+c2VjdXJpdHlP
cmlnaW4oKSkpIHsKKyAgICAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tPcmlnaW4oZGF0
YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS5h
ZGREYXRhYmFzZShkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSwgZGF0YWJhc2UtPnN0cmluZ0lk
ZW50aWZpZXIoKSwgZGF0YWJhc2UtPmZpbGVOYW1lKCkpOwogICAgIH0KIAogICAgIE11dGV4TG9j
a2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwpJbmRleDogV2ViQ29yZS9zdG9yYWdl
L0RhdGFiYXNlVHJhY2tlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZVRyYWNrZXIuaAkocmV2aXNpb24gNjM5MTApCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VU
cmFja2VyLmgJKHdvcmtpbmcgY29weSkKQEAgLTYwLDEzICs2MCwxMyBAQCBjbGFzcyBEYXRhYmFz
ZVRyYWNrZXIgOiBwdWJsaWMgTm9uY29weWFiCiBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQgaW5p
dGlhbGl6ZVRyYWNrZXIoY29uc3QgU3RyaW5nJiBkYXRhYmFzZVBhdGgpOwogICAgIHN0YXRpYyBE
YXRhYmFzZVRyYWNrZXImIHRyYWNrZXIoKTsKKwogICAgIC8vIFRoaXMgc2luZ2xldG9uIHdpbGwg
cG90ZW50aWFsbHkgYmUgdXNlZCBmcm9tIG11bHRpcGxlIHdvcmtlciB0aHJlYWRzIGFuZCB0aGUg
cGFnZSdzIGNvbnRleHQgdGhyZWFkIHNpbXVsdGFuZW91c2x5LiAgVG8ga2VlcCB0aGlzIHNhZmUs
IGl0J3MKICAgICAvLyBjdXJyZW50bHkgdXNpbmcgNCBsb2Nrcy4gIEluIG9yZGVyIHRvIGF2b2lk
IGRlYWRsb2NrIHdoZW4gdGFraW5nIG11bHRpcGxlIGxvY2tzLCB5b3UgbXVzdCB0YWtlIHRoZW0g
aW4gdGhlIGNvcnJlY3Qgb3JkZXI6Ci0gICAgLy8gbV9kYXRhYmFzZUd1YXJkIGJlZm9yZSBxdW90
YU1hbmFnZXIgaWYgYm90aCBsb2NrcyBhcmUgbmVlZGVkLgotICAgIC8vIG1fb3BlbkRhdGFiYXNl
TWFwR3VhcmQgYmVmb3JlIHF1b3RhTWFuYWdlciBpZiBib3RoIGxvY2tzIGFyZSBuZWVkZWQuCi0g
ICAgLy8gbV9kYXRhYmFzZUd1YXJkIGFuZCBtX29wZW5EYXRhYmFzZU1hcEd1YXJkIGN1cnJlbnRs
eSBkb24ndCBvdmVybGFwLgorICAgIC8vIG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQgYmVmb3JlIG1f
ZGF0YWJhc2VHdWFyZCwgYmVmb3JlIHF1b3RhTWFuYWdlci4KICAgICAvLyBub3RpZmljYXRpb25N
dXRleCgpIGlzIGN1cnJlbnRseSBpbmRlcGVuZGVudCBvZiB0aGUgb3RoZXIgbG9ja3MuCiAKKyAg
ICBNdXRleCYgaW50ZXJydXB0ZWRNdXRleCgpIHsgcmV0dXJuIG1fb3BlbkRhdGFiYXNlTWFwR3Vh
cmQ7IH0KICAgICBib29sIGNhbkVzdGFibGlzaERhdGFiYXNlKFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5hbWUsIHVuc2ln
bmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSk7CiAgICAgdm9pZCBzZXREYXRhYmFzZURldGFpbHMoU2Vj
dXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5h
bWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSk7CiAgICAgU3RyaW5nIGZ1bGxQYXRoRm9y
RGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRl
SWZEb2VzTm90RXhpc3QgPSB0cnVlKTsKQEAgLTc4LDYgKzc4LDggQEAgcHVibGljOgogICAgIHVu
c2lnbmVkIGxvbmcgbG9uZyBnZXRNYXhTaXplRm9yRGF0YWJhc2UoY29uc3QgQWJzdHJhY3REYXRh
YmFzZSopOwogICAgIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKEFic3RyYWN0RGF0YWJhc2UqKTsKIAor
ICAgIHZvaWQgaW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dChTY3JpcHRFeGVjdXRpb25D
b250ZXh0Kik7CisKIHByaXZhdGU6CiAgICAgRGF0YWJhc2VUcmFja2VyKGNvbnN0IFN0cmluZyYg
ZGF0YWJhc2VQYXRoKTsKIApAQCAtODcsNiArODksNyBAQCBwcml2YXRlOgogCiAgICAgTXV0ZXgg
bV9vcGVuRGF0YWJhc2VNYXBHdWFyZDsKICAgICBtdXRhYmxlIE93blB0cjxEYXRhYmFzZU9yaWdp
bk1hcD4gbV9vcGVuRGF0YWJhc2VNYXA7CisgICAgSGFzaFNldDxTY3JpcHRFeGVjdXRpb25Db250
ZXh0Kj4gbV9pbnRlcnJ1cHRlZENvbnRleHRzOwogCiAjaWYgIVBMQVRGT1JNKENIUk9NSVVNKQog
cHVibGljOgpJbmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHJldmlzaW9uIDYzOTEwKQor
KysgV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4
LDcgKzc4LDcgQEAgYm9vbCBTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUoRGF0YWJhc2UqIGRiKQogCiAg
ICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHRPaykgewogICAgICAgICBMT0coU3RvcmFnZUFQSSwg
IlVuYWJsZSB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2Ygc3RhdGVtZW50ICVzIC0gZXJyb3IgJWkg
KCVzKSIsIG1fc3RhdGVtZW50LmFzY2lpKCkuZGF0YSgpLCByZXN1bHQsIGRhdGFiYXNlLT5sYXN0
RXJyb3JNc2coKSk7Ci0gICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKFNRTEVycm9y
OjpTWU5UQVhfRVJSLCBkYXRhYmFzZS0+bGFzdEVycm9yTXNnKCkpOworICAgICAgICBtX2Vycm9y
ID0gU1FMRXJyb3I6OmNyZWF0ZShyZXN1bHQgPT0gU1FMUmVzdWx0SW50ZXJydXB0ID8gU1FMRXJy
b3I6OkRBVEFCQVNFX0VSUiA6IFNRTEVycm9yOjpTWU5UQVhfRVJSLCBkYXRhYmFzZS0+bGFzdEVy
cm9yTXNnKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkluZGV4OiBXZWJDb3Jl
L3N0b3JhZ2UvU1FMU3RhdGVtZW50U3luYy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9y
YWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwCShyZXZpc2lvbiA2MzkxMCkKKysrIFdlYkNvcmUvc3Rv
cmFnZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjEsNyArNjEsNyBA
QCBQYXNzUmVmUHRyPFNRTFJlc3VsdFNldD4gU1FMU3RhdGVtZW50U3luCiAgICAgU1FMaXRlU3Rh
dGVtZW50IHN0YXRlbWVudCgqZGF0YWJhc2UsIG1fc3RhdGVtZW50KTsKICAgICBpbnQgcmVzdWx0
ID0gc3RhdGVtZW50LnByZXBhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdE9rKSB7
Ci0gICAgICAgIGVjID0gU1FMRXhjZXB0aW9uOjpTWU5UQVhfRVJSOworICAgICAgICBlYyA9IChy
ZXN1bHQgPT0gU1FMUmVzdWx0SW50ZXJydXB0ID8gU1FMRXhjZXB0aW9uOjpEQVRBQkFTRV9FUlIg
OiBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAK
SW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcAkocmV2aXNpb24gNjM5MTApCisrKyBX
ZWJDb3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OCw3
ICs4OCw3IEBAIFNRTFRyYW5zYWN0aW9uOjp+U1FMVHJhbnNhY3Rpb24oKQogCiB2b2lkIFNRTFRy
YW5zYWN0aW9uOjpleGVjdXRlU1FMKGNvbnN0IFN0cmluZyYgc3FsU3RhdGVtZW50LCBjb25zdCBW
ZWN0b3I8U1FMVmFsdWU+JiBhcmd1bWVudHMsIFBhc3NSZWZQdHI8U1FMU3RhdGVtZW50Q2FsbGJh
Y2s+IGNhbGxiYWNrLCBQYXNzUmVmUHRyPFNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2s+IGNhbGxi
YWNrRXJyb3IsIEV4Y2VwdGlvbkNvZGUmIGUpCiB7Ci0gICAgaWYgKCFtX2V4ZWN1dGVTcWxBbGxv
d2VkIHx8ICFtX2RhdGFiYXNlLT5vcGVuZWQoKSkgeworICAgIGlmICghbV9leGVjdXRlU3FsQWxs
b3dlZCB8fCBtX2RhdGFiYXNlLT5jbG9zZWRPckludGVycnVwdGVkKCkpIHsKICAgICAgICAgZSA9
IElOVkFMSURfU1RBVEVfRVJSOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTQ4LDcgKzE0
OCw3IEBAIGNvbnN0IGNoYXIqIFNRTFRyYW5zYWN0aW9uOjpkZWJ1Z1N0ZXBOYW0KIAogdm9pZCBT
UUxUcmFuc2FjdGlvbjo6Y2hlY2tBbmRIYW5kbGVDbG9zZWREYXRhYmFzZSgpCiB7Ci0gICAgaWYg
KG1fZGF0YWJhc2UtPm9wZW5lZCgpKQorICAgIGlmICghbV9kYXRhYmFzZS0+Y2xvc2VkT3JJbnRl
cnJ1cHRlZCgpKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBJZiB0aGUgZGF0YWJhc2Ugd2Fz
IHN0b3BwZWQsIGRvbid0IGRvIGFueXRoaW5nIGFuZCBjYW5jZWwgcXVldWVkIHdvcmsKQEAgLTE3
NCw2ICsxNzQsMTAgQEAgdm9pZCBTUUxUcmFuc2FjdGlvbjo6Y2hlY2tBbmRIYW5kbGVDbG9zZQog
CiBib29sIFNRTFRyYW5zYWN0aW9uOjpwZXJmb3JtTmV4dFN0ZXAoKQogeworICAgIE11dGV4TG9j
a2VyIGludGVycnVwdGVkTXV0ZXhMb2NrKG1fZGF0YWJhc2UtPmludGVycnVwdGVkTXV0ZXgoKSk7
CisgICAgaWYgKG1fZGF0YWJhc2UtPmNsb3NlZE9ySW50ZXJydXB0ZWQoKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKICAgICBMT0coU3RvcmFnZUFQSSwgIlN0ZXAgJXNcbiIsIGRlYnVnU3RlcE5h
bWUobV9uZXh0U3RlcCkpOwogCiAgICAgQVNTRVJUKG1fbmV4dFN0ZXAgPT0gJlNRTFRyYW5zYWN0
aW9uOjphY3F1aXJlTG9jayB8fApAQCAtMTk0LDYgKzE5OCwxMCBAQCBib29sIFNRTFRyYW5zYWN0
aW9uOjpwZXJmb3JtTmV4dFN0ZXAoKQogCiB2b2lkIFNRTFRyYW5zYWN0aW9uOjpwZXJmb3JtUGVu
ZGluZ0NhbGxiYWNrKCkKIHsKKyAgICBNdXRleExvY2tlciBpbnRlcnJ1cHRlZE11dGV4TG9jayht
X2RhdGFiYXNlLT5pbnRlcnJ1cHRlZE11dGV4KCkpOworICAgIGlmIChtX2RhdGFiYXNlLT5jbG9z
ZWRPckludGVycnVwdGVkKCkpCisgICAgICAgIHJldHVybjsKKwogICAgIExPRyhTdG9yYWdlQVBJ
LCAiQ2FsbGJhY2sgJXNcbiIsIGRlYnVnU3RlcE5hbWUobV9uZXh0U3RlcCkpOwogCiAgICAgQVNT
RVJUKG1fbmV4dFN0ZXAgPT0gJlNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyVHJhbnNhY3Rpb25DYWxs
YmFjayB8fApAQCAtMjk0LDcgKzMwMiw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJU
cmFuc2FjdGlvbkMKICAgICAgICAgbV9leGVjdXRlU3FsQWxsb3dlZCA9IGZhbHNlOwogICAgIH0K
IAotICAgIC8vIFRyYW5zYWN0aW9uIFN0ZXAgNSAtIElmIHRoZSB0cmFuc2FjdGlvbiBjYWxsYmFj
ayB3YXMgbnVsbCBvciByYWlzZWQgYW4gZXhjZXB0aW9uLCBqdW1wIHRvIHRoZSBlcnJvciBjYWxs
YmFjaworICAgIC8vIFRyYW5zYWN0aW9uIFN0ZXAgNSAtIElmIHRoZSB0cmFuc2FjdGlvbiBjYWxs
YmFjayByYWlzZWQgYW4gZXhjZXB0aW9uLCBqdW1wIHRvIHRoZSBlcnJvciBjYWxsYmFjawogICAg
IGlmIChzaG91bGREZWxpdmVyRXJyb3JDYWxsYmFjaykgewogICAgICAgICBtX3RyYW5zYWN0aW9u
RXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKFNRTEVycm9yOjpVTktOT1dOX0VSUiwgInRoZSBTUUxU
cmFuc2FjdGlvbkNhbGxiYWNrIHdhcyBudWxsIG9yIHRocmV3IGFuIGV4Y2VwdGlvbiIpOwogICAg
ICAgICBkZWxpdmVyVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKCk7CkBAIC0zMzcsMTIgKzM0NSwx
MiBAQCB2b2lkIFNRTFRyYW5zYWN0aW9uOjpydW5TdGF0ZW1lbnRzKCkKICAgICAgICAgICAgIC8v
IE90aGVyd2lzZSwgYWR2YW5jZSB0byB0aGUgbmV4dCBzdGF0ZW1lbnQKICAgICAgICAgICAgIGdl
dE5leHRTdGF0ZW1lbnQoKTsKICAgICAgICAgfQotICAgIH0gd2hpbGUgKHJ1bkN1cnJlbnRTdGF0
ZW1lbnQoKSk7CisgICAgfSB3aGlsZSAoIW1fZGF0YWJhc2UtPmNsb3NlZE9ySW50ZXJydXB0ZWQo
KSAmJiBydW5DdXJyZW50U3RhdGVtZW50KCkpOwogCiAgICAgLy8gSWYgcnVuQ3VycmVudFN0YXRl
bWVudCgpIHJldHVybmVkIGZhbHNlLCB0aGF0IG1lYW5zIGVpdGhlciB0aGVyZSB3YXMgbm8gY3Vy
cmVudCBzdGF0ZW1lbnQgdG8gcnVuLAogICAgIC8vIG9yIHRoZSBjdXJyZW50IHN0YXRlbWVudCBy
ZXF1aXJlcyBhIGNhbGxiYWNrIHRvIGNvbXBsZXRlLiAgSW4gdGhlIGxhdGVyIGNhc2UsIGl0IGFs
c28gc2NoZWR1bGVkCiAgICAgLy8gdGhlIGNhbGxiYWNrIG9yIHBlcmZvcm1lZCBhbnkgb3RoZXIg
YWRkaXRpb25hbCB3b3JrIHNvIHdlIGNhbiByZXR1cm4KLSAgICBpZiAoIW1fY3VycmVudFN0YXRl
bWVudCkKKyAgICBpZiAoIW1fZGF0YWJhc2UtPmNsb3NlZE9ySW50ZXJydXB0ZWQoKSAmJiAhbV9j
dXJyZW50U3RhdGVtZW50KQogICAgICAgICBwb3N0ZmxpZ2h0QW5kQ29tbWl0KCk7CiB9CiAKSW5k
ZXg6IFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvblN5bmMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvblN5bmMuY3BwCShyZXZpc2lvbiA2MzkxMCkK
KysrIFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvblN5bmMuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC03MywxMSArNzMsNiBAQCBTUUxUcmFuc2FjdGlvblN5bmM6On5TUUxUcmFuc2FjdGlvblN5
bmMoCiBQYXNzUmVmUHRyPFNRTFJlc3VsdFNldD4gU1FMVHJhbnNhY3Rpb25TeW5jOjpleGVjdXRl
U1FMKGNvbnN0IFN0cmluZyYgc3FsU3RhdGVtZW50LCBjb25zdCBWZWN0b3I8U1FMVmFsdWU+JiBh
cmd1bWVudHMsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewogICAgIEFTU0VSVChtX2RhdGFiYXNlLT5z
Y3JpcHRFeGVjdXRpb25Db250ZXh0KCktPmlzQ29udGV4dFRocmVhZCgpKTsKLSAgICBpZiAoIW1f
ZGF0YWJhc2UtPm9wZW5lZCgpKSB7Ci0gICAgICAgIGVjID0gU1FMRXhjZXB0aW9uOjpVTktOT1dO
X0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCiAgICAgaWYgKCFtX2RhdGFiYXNlLT52
ZXJzaW9uTWF0Y2hlc0V4cGVjdGVkKCkpIHsKICAgICAgICAgZWMgPSBTUUxFeGNlcHRpb246OlZF
UlNJT05fRVJSOwogICAgICAgICByZXR1cm4gMDsKQEAgLTEyMCw5ICsxMTUsNiBAQCBQYXNzUmVm
UHRyPFNRTFJlc3VsdFNldD4gU1FMVHJhbnNhY3Rpb25TCiBFeGNlcHRpb25Db2RlIFNRTFRyYW5z
YWN0aW9uU3luYzo6YmVnaW4oKQogewogICAgIEFTU0VSVChtX2RhdGFiYXNlLT5zY3JpcHRFeGVj
dXRpb25Db250ZXh0KCktPmlzQ29udGV4dFRocmVhZCgpKTsKLSAgICBpZiAoIW1fZGF0YWJhc2Ut
Pm9wZW5lZCgpKQotICAgICAgICByZXR1cm4gU1FMRXhjZXB0aW9uOjpVTktOT1dOX0VSUjsKLQog
ICAgIEFTU0VSVCghbV9kYXRhYmFzZS0+c3FsaXRlRGF0YWJhc2UoKS50cmFuc2FjdGlvbkluUHJv
Z3Jlc3MoKSk7CiAKICAgICAvLyBTZXQgdGhlIG1heGltdW0gdXNhZ2UgZm9yIHRoaXMgdHJhbnNh
Y3Rpb24gaWYgdGhpcyB0cmFuc2FjdGlvbnMgaXMgbm90IHJlYWQtb25seS4KQEAgLTE1MCw3ICsx
NDIsNyBAQCBFeGNlcHRpb25Db2RlIFNRTFRyYW5zYWN0aW9uU3luYzo6YmVnaW4oCiBFeGNlcHRp
b25Db2RlIFNRTFRyYW5zYWN0aW9uU3luYzo6ZXhlY3V0ZSgpCiB7CiAgICAgQVNTRVJUKG1fZGF0
YWJhc2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKS0+aXNDb250ZXh0VGhyZWFkKCkpOwotICAg
IGlmICghbV9kYXRhYmFzZS0+b3BlbmVkKCkgfHwgKG1fY2FsbGJhY2sgJiYgIW1fY2FsbGJhY2st
PmhhbmRsZUV2ZW50KG1fZGF0YWJhc2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSwgdGhpcykp
KSB7CisgICAgaWYgKG1fY2FsbGJhY2sgJiYgIW1fY2FsbGJhY2stPmhhbmRsZUV2ZW50KG1fZGF0
YWJhc2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSwgdGhpcykpIHsKICAgICAgICAgbV9jYWxs
YmFjayA9IDA7CiAgICAgICAgIHJldHVybiBTUUxFeGNlcHRpb246OlVOS05PV05fRVJSOwogICAg
IH0KQEAgLTE2Miw5ICsxNTQsNiBAQCBFeGNlcHRpb25Db2RlIFNRTFRyYW5zYWN0aW9uU3luYzo6
ZXhlY3V0CiBFeGNlcHRpb25Db2RlIFNRTFRyYW5zYWN0aW9uU3luYzo6Y29tbWl0KCkKIHsKICAg
ICBBU1NFUlQobV9kYXRhYmFzZS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLT5pc0NvbnRleHRU
aHJlYWQoKSk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLT5vcGVuZWQoKSkKLSAgICAgICAgcmV0dXJu
IFNRTEV4Y2VwdGlvbjo6VU5LTk9XTl9FUlI7Ci0KICAgICBBU1NFUlQobV9zcWxpdGVUcmFuc2Fj
dGlvbik7CiAKICAgICBtX2RhdGFiYXNlLT5kaXNhYmxlQXV0aG9yaXplcigpOwpJbmRleDogV2Vi
Q29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0u
Y3BwCShyZXZpc2lvbiA2MzkxMCkKKysrIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFz
ZVRyYWNrZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0LDkgKzU0LDE0IEBAIERh
dGFiYXNlVHJhY2tlcjo6RGF0YWJhc2VUcmFja2VyKGNvbnN0IFMKICAgICBTUUxpdGVGaWxlU3lz
dGVtOjpyZWdpc3RlclNRTGl0ZVZGUygpOwogfQogCi1ib29sIERhdGFiYXNlVHJhY2tlcjo6Y2Fu
RXN0YWJsaXNoRGF0YWJhc2UoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0RXhlY3V0aW9u
Q29udGV4dCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1
bnNpZ25lZCBsb25nIGVzdGltYXRlZFNpemUpCitib29sIERhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0
YWJsaXNoRGF0YWJhc2UoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCwgY29uc3QgU3Ry
aW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNpZ25lZCBsb25nIGVzdGlt
YXRlZFNpemUpCiB7Ci0gICAgcmV0dXJuIERhdGFiYXNlT2JzZXJ2ZXI6OmNhbkVzdGFibGlzaERh
dGFiYXNlKHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQsIG5hbWUsIGRpc3BsYXlOYW1lLCBlc3RpbWF0
ZWRTaXplKTsKKyAgICBBU1NFUlQoIW1fb3BlbkRhdGFiYXNlTWFwR3VhcmQudHJ5TG9jaygpKTsK
KworICAgIGlmIChtX2ludGVycnVwdGVkQ29udGV4dHMuY29udGFpbnMoY29udGV4dCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBEYXRhYmFzZU9ic2VydmVyOjpjYW5Fc3Rh
Ymxpc2hEYXRhYmFzZShjb250ZXh0LCBuYW1lLCBkaXNwbGF5TmFtZSwgZXN0aW1hdGVkU2l6ZSk7
CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMoU2VjdXJpdHlP
cmlnaW4qLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25nKQpAQCAt
NzIsNyArNzcsOCBAQCBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiCiB2
b2lkIERhdGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFiYXNlKEFic3RyYWN0RGF0YWJhc2UqIGRh
dGFiYXNlKQogewogICAgIEFTU0VSVChkYXRhYmFzZS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgp
LT5pc0NvbnRleHRUaHJlYWQoKSk7Ci0gICAgTXV0ZXhMb2NrZXIgb3BlbkRhdGFiYXNlTWFwTG9j
ayhtX29wZW5EYXRhYmFzZU1hcEd1YXJkKTsKKyAgICBBU1NFUlQoIW1fb3BlbkRhdGFiYXNlTWFw
R3VhcmQudHJ5TG9jaygpKTsKKwogICAgIGlmICghbV9vcGVuRGF0YWJhc2VNYXApCiAgICAgICAg
IG1fb3BlbkRhdGFiYXNlTWFwLnNldChuZXcgRGF0YWJhc2VPcmlnaW5NYXAoKSk7CiAKQEAgLTE3
Miw0ICsxNzgsMjcgQEAgdW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6Z2V0TQog
ICAgIHJldHVybiBkYXRhYmFzZVNpemUgKyBzcGFjZUF2YWlsYWJsZTsKIH0KIAordm9pZCBEYXRh
YmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQoU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBM
b2NrKG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworICAgIG1faW50ZXJydXB0ZWRDb250ZXh0cy5h
ZGQoY29udGV4dCk7CisKKyAgICBpZiAoIW1fb3BlbkRhdGFiYXNlTWFwKQorICAgICAgICByZXR1
cm47CisKKyAgICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+
Z2V0KGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgIGlmICghbmFtZU1hcCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVN
YXBFbmRJdCA9IG5hbWVNYXAtPmVuZCgpOworICAgIGZvciAoRGF0YWJhc2VOYW1lTWFwOjpjb25z
dF9pdGVyYXRvciBkYk5hbWVNYXBJdCA9IG5hbWVNYXAtPmJlZ2luKCk7IGRiTmFtZU1hcEl0ICE9
IGRiTmFtZU1hcEVuZEl0OyArK2RiTmFtZU1hcEl0KSB7CisgICAgICAgIERhdGFiYXNlU2V0KiBk
YXRhYmFzZVNldCA9IGRiTmFtZU1hcEl0LT5zZWNvbmQ7CisgICAgICAgIERhdGFiYXNlU2V0Ojpj
b25zdF9pdGVyYXRvciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgpOworICAgICAgICBm
b3IgKERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEl0ID0gZGF0YWJhc2VTZXQtPmJl
Z2luKCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsgKytkYlNldEl0KQorICAgICAgICAgICAgKCpk
YlNldEl0KS0+aW50ZXJydXB0KCk7CisgICAgfQorCisgICAgbV9pbnRlcnJ1cHRlZENvbnRleHRz
LnJlbW92ZShjb250ZXh0KTsKK30KKwogfQpJbmRleDogV2ViQ29yZS93b3JrZXJzL1dvcmtlclRo
cmVhZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVhZC5jcHAJ
KHJldmlzaW9uIDYzOTEwKQorKysgV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVhZC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTMwLDcgKzMwLDEwIEBACiAKICNpbmNsdWRlICJXb3JrZXJUaHJlYWQu
aCIKIAorI2lmIEVOQUJMRShEQVRBQkFTRSkKICNpbmNsdWRlICJEYXRhYmFzZVRhc2suaCIKKyNp
bmNsdWRlICJEYXRhYmFzZVRyYWNrZXIuaCIKKyNlbmRpZgogI2luY2x1ZGUgIkRlZGljYXRlZFdv
cmtlckNvbnRleHQuaCIKICNpbmNsdWRlICJLVVJMLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJp
bmcuaCIKQEAgLTIyMSw2ICsyMjQsMTAgQEAgdm9pZCBXb3JrZXJUaHJlYWQ6OnN0b3AoKQogICAg
IC8vIE11dGV4IHByb3RlY3Rpb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc3RvcCgpIGNhbiBiZSBj
YWxsZWQgYmVmb3JlIHRoZSBjb250ZXh0IGlzIGZ1bGx5IGNyZWF0ZWQuCiAgICAgTXV0ZXhMb2Nr
ZXIgbG9jayhtX3RocmVhZENyZWF0aW9uTXV0ZXgpOwogCisjaWYgRU5BQkxFKERBVEFCQVNFKQor
ICAgIERhdGFiYXNlVHJhY2tlcjo6dHJhY2tlcigpLmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNv
bnRleHQod29ya2VyQ29udGV4dCgpKTsKKyNlbmRpZgorCiAgICAgLy8gRW5zdXJlIHRoYXQgdGFz
a3MgYXJlIGJlaW5nIGhhbmRsZWQgYnkgdGhyZWFkIGV2ZW50IGxvb3AuIElmIHNjcmlwdCBleGVj
dXRpb24gd2VyZW4ndCBmb3JiaWRkZW4sIGEgd2hpbGUoMSkgbG9vcCBpbiBKUyBjb3VsZCBrZWVw
IHRoZSB0aHJlYWQgYWxpdmUgZm9yZXZlci4KICAgICBpZiAobV93b3JrZXJDb250ZXh0KSB7CiAg
ICAgICAgIG1fd29ya2VyQ29udGV4dC0+c2NyaXB0KCktPmZvcmJpZEV4ZWN1dGlvbihXb3JrZXJT
Y3JpcHRDb250cm9sbGVyOjpUZXJtaW5hdGVSdW5uaW5nU2NyaXB0KTsKSW5kZXg6IExheW91dFRl
c3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlz
aW9uIDYzOTEwKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsMTggQEAKKzIwMTAtMDctMjEgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBU
ZXN0IHRoYXQgYWxsIERCIG9wZXJhdGlvbnMgYXJlIGludGVycnVwdGVkIHdoZW4gYSB3b3JrZXIg
aXMgdGVybWluYXRlZC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTQyODQzCisKKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQt
ZGF0YWJhc2UtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3Rv
cmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAg
ICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmh0bWw6IEFk
ZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS5o
dG1sOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50
ZXJydXB0LWRhdGFiYXNlLXN5bmMuanM6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9z
dG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2UuanM6IEFkZGVkLgorICAgICAgICAo
cnVuVHJhbnNhY3Rpb25zKToKKwogMjAxMC0wNy0yMiAgRHVtaXRydSBEYW5pbGl1YyAgPGR1bWlA
Y2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE9qYW4gVmFmYWkuCkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UtZXhwZWN0
ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2lu
dGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UtZXhwZWN0ZWQudHh0CShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMgQEAKK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxs
IGFzeW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5IGludGVycnVwdGVkIHdo
ZW4gdGhlIHdvcmtlciBuZWVkcyB0byB0ZXJtaW5hdGUuCitQQVNTOiBkYXRhYmFzZSBvcGVyYXRp
b25zIGludGVycnVwdGVkLgorCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFn
ZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMtZXhw
ZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3Jh
Z2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDUgQEAKK0NPTlNPTEUgTUVTU0FHRTogbGluZSA2OiBEQVRBQkFTRV9FUlI6IERPTSBT
UUwgRXhjZXB0aW9uIDE6IFRoZSBvcGVyYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbiByZWxh
dGVkIHRvIHRoZSBkYXRhYmFzZS4KK0NPTlNPTEUgTUVTU0FHRTogbGluZSA4OiBVTktOT1dOX0VS
UjogRE9NIFNRTCBFeGNlcHRpb24gMDogVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yIHJlYXNvbnMg
dW5yZWxhdGVkIHRvIHRoZSBkYXRhYmFzZS4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxs
IHN5bmMgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hl
biB0aGUgd29ya2VyIG5lZWRzIHRvIHRlcm1pbmF0ZS4KK1BBU1M6IGRhdGFiYXNlIG9wZXJhdGlv
bnMgaW50ZXJydXB0ZWQuCisKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdl
L2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAkocmV2aXNp
b24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRh
YmFzZS1zeW5jLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTAgQEAKKzxodG1sPgorPGhl
YWQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL3dvcmtlci11dGlsLmpzIj48L3NjcmlwdD4K
KzxzY3JpcHQ+Cit2YXIgd29ya2VyOworCitmdW5jdGlvbiBsb2cobWVzc2FnZSkKK3sKKyAgICBk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29uc29sZSIpLmlubmVySFRNTCArPSBtZXNzYWdlICsg
Ijxicj4iOworfQorCitmdW5jdGlvbiBmaW5pc2hUZXN0KCkKK3sKKyAgICBsb2coIlBBU1M6IGRh
dGFiYXNlIG9wZXJhdGlvbnMgaW50ZXJydXB0ZWQuIik7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRU
ZXN0Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgp
OworfQorCitmdW5jdGlvbiB0ZXJtaW5hdGVXb3JrZXIoKQoreworICAgIHdvcmtlci50ZXJtaW5h
dGUoKTsKKyAgICB3YWl0VW50aWxXb3JrZXJUaHJlYWRzRXhpdChmaW5pc2hUZXN0KQorfQorCitm
dW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVy
KSB7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAg
bGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIHdvcmtl
ciA9IG5ldyBXb3JrZXIoJ3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5qcycpOwor
ICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgICBpZiAoZXZl
bnQuZGF0YSA9PSAiZG9uZSIpCisgICAgICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGxvZyhldmVudC5kYXRhKTsKKyAgICB9OworCisgICAgc2V0VGltZW91
dCgndGVybWluYXRlV29ya2VyKCknLCA1MDApOworfQorPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxi
b2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIHN5
bmMgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0
aGUgd29ya2VyIG5lZWRzIHRvIHRlcm1pbmF0ZS4KKzxwcmUgaWQ9ImNvbnNvbGUiPgorPC9wcmU+
Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFn
ZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbAkocmV2aXNpb24gMCkKKysr
IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS5odG1s
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUwIEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBz
cmM9Ii4uL3Jlc291cmNlcy93b3JrZXItdXRpbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0PgordmFy
IHdvcmtlcjsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgZG9jdW1lbnQuZ2V0RWxl
bWVudEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsKK30KKwor
ZnVuY3Rpb24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJQQVNTOiBkYXRhYmFzZSBvcGVyYXRp
b25zIGludGVycnVwdGVkLiIpOworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIp
CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rp
b24gdGVybWluYXRlV29ya2VyKCkKK3sKKyAgICB3b3JrZXIudGVybWluYXRlKCk7CisgICAgd2Fp
dFVudGlsV29ya2VyVGhyZWFkc0V4aXQoZmluaXNoVGVzdCkKK30KKworZnVuY3Rpb24gcnVuVGVz
dCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBs
YXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250
cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisKKyAgICB3b3JrZXIgPSBuZXcgV29ya2Vy
KCdyZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLmpzJyk7CisgICAgd29ya2VyLm9ubWVzc2Fn
ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5kYXRhID09ICJkb25lIikK
KyAgICAgICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9n
KGV2ZW50LmRhdGEpOworICAgIH07CisKKyAgICBzZXRUaW1lb3V0KCd0ZXJtaW5hdGVXb3JrZXIo
KScsIDUwMCk7Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkgb25sb2FkPSJydW5UZXN0
KCkiPgorVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgYXN5bmMgZGF0YWJhc2Ugb3BlcmF0
aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0aGUgd29ya2VyIG5lZWRzIHRv
IHRlcm1pbmF0ZS4KKzxwcmUgaWQ9ImNvbnNvbGUiPgorPC9wcmU+Cis8L2JvZHk+Cis8L2h0bWw+
CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJy
dXB0LWRhdGFiYXNlLXN5bmMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC93b3Jr
ZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmpzCShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVy
cnVwdC1kYXRhYmFzZS1zeW5jLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDggQEAKK3ZhciBk
YiA9IG9wZW5EYXRhYmFzZVN5bmMoIkludGVycnVwdERhdGFiYXNlVGVzdCIsICIxIiwgIiIsIDEp
OworZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsKKyAgICB0eC5leGVjdXRlU3FsKCJDUkVB
VEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBUZXN0IChGb28gSU5UKSIpOworICAgIHdoaWxlICh0cnVl
KSB7CisgICAgICAgIC8vIFB1dCBib3RoIHN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSwgdG8g
bWFrZSBzdXJlIHRoZSBleGNlcHRpb24gaXMgYWx3YXlzIHJlcG9ydGVkIG9uIHRoZSBzYW1lIGxp
bmUuCisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIFRlc3QgVkFMVUVTICgxKSIp
OyB0eC5leGVjdXRlU3FsKCJERUxFVEUgRlJPTSBUZXN0IFdIRVJFIEZvbyA9IDEiKTsKKyAgICB9
Cit9KTsKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9p
bnRlcnJ1cHQtZGF0YWJhc2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC93b3Jr
ZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS5qcwkocmV2aXNpb24gMCkK
KysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQt
ZGF0YWJhc2UuanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0aW9uIHJ1blRy
YW5zYWN0aW9ucygpCit7CisgICAgZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsKKyAgICAg
ICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRP
IFRlc3QgVkFMVUVTICgxKSIpOworICAgICAgICAgICAgdHguZXhlY3V0ZVNxbCgiREVMRVRFIEZS
T00gVGVzdCBXSEVSRSBGb28gPSAxIik7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordmFyIGRi
ID0gb3BlbkRhdGFiYXNlU3luYygiSW50ZXJydXB0RGF0YWJhc2VUZXN0IiwgIjEiLCAiIiwgMSk7
CitkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeworICAgIHR4LmV4ZWN1dGVTcWwoIkNSRUFU
RSBUQUJMRSBJRiBOT1QgRVhJU1RTIFRlc3QgKEZvbyBJTlQpIik7Cit9LCBudWxsLCBmdW5jdGlv
bigpIHsgcnVuVHJhbnNhY3Rpb25zKCk7IH0pOwo=
</data>
<flag name="commit-queue"
          id="50517"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62497</attachid>
            <date>2010-07-24 03:52:30 -0700</date>
            <delta_ts>2010-07-24 04:14:12 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>19200</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDAwNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzUgQEAKKzIwMTAtMDctMjQgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBJbnRlcnJ1cHQgYWxsIERCIG9wZXJhdGlvbnMgd2hlbiBhIHdv
cmtlciBpcyB0ZXJtaW5hdGVkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDI4NDMKKworICAgICAgICBUZXN0czogZmFzdC93b3JrZXJzL3N0b3JhZ2Uv
aW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAorICAgICAgICAgICAgICAgZmFzdC93b3JrZXJz
L3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwKKworICAgICAgICAqIHBsYXRmb3JtL3Nx
bC9TUUxpdGVEYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6
U1FMaXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OmludGVy
cnVwdCk6CisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmg6CisgICAgICAg
IChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6aXNJbnRlcnJ1cHRlZCk6CisgICAgICAgIChXZWJD
b3JlOjpTUUxpdGVEYXRhYmFzZTo6ZGF0YWJhc2VNdXRleCk6CisgICAgICAgICogcGxhdGZvcm0v
c3FsL1NRTGl0ZVN0YXRlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ6OnByZXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50OjpzdGVwKToK
KyAgICAgICAgKiBzdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6QWJzdHJhY3REYXRhYmFzZTo6aW50ZXJydXB0KToKKyAgICAgICAgKiBzdG9yYWdlL0Fic3Ry
YWN0RGF0YWJhc2UuaDoKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0Zv
ckNvbnRleHQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmg6CisgICAgICAg
ICogc3RvcmFnZS9TUUxTdGF0ZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVt
ZW50OjpleGVjdXRlKToKKyAgICAgICAgKiBzdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVtZW50U3luYzo6ZXhlY3V0ZSk6CisgICAgICAgICog
c3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQp
OgorICAgICAgICAqIHdvcmtlcnMvV29ya2VyVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OldvcmtlclRocmVhZDo6c3RvcCk6CisKIDIwMTAtMDctMjMgIFBhdHJpY2sgR2Fuc3RlcmVyICA8
cGFyb2dhQHBhcm9nYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA2NDAw
NykKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDIsNiArNDIsNyBAQCBjb25zdCBpbnQgU1FMUmVzdWx0T2sgPSBTUUxJVEVfT0s7
CiBjb25zdCBpbnQgU1FMUmVzdWx0Um93ID0gU1FMSVRFX1JPVzsKIGNvbnN0IGludCBTUUxSZXN1
bHRTY2hlbWEgPSBTUUxJVEVfU0NIRU1BOwogY29uc3QgaW50IFNRTFJlc3VsdEZ1bGwgPSBTUUxJ
VEVfRlVMTDsKK2NvbnN0IGludCBTUUxSZXN1bHRJbnRlcnJ1cHQgPSBTUUxJVEVfSU5URVJSVVBU
OwogCiAKIFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCkBAIC01MCw2ICs1MSw3IEBA
IFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAgLCBtX3RyYW5zYWN0aW9uSW5Q
cm9ncmVzcyhmYWxzZSkKICAgICAsIG1fc2hhcmFibGUoZmFsc2UpCiAgICAgLCBtX29wZW5pbmdU
aHJlYWQoMCkKKyAgICAsIG1faW50ZXJydXB0ZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTkyLDYgKzk0
LDE4IEBAIHZvaWQgU1FMaXRlRGF0YWJhc2U6OmNsb3NlKCkKICAgICBtX29wZW5pbmdUaHJlYWQg
PSAwOwogfQogCit2b2lkIFNRTGl0ZURhdGFiYXNlOjppbnRlcnJ1cHQoKQoreworICAgIGlmICgh
bV9kYikKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKCFtX2xvY2tpbmdNdXRleC50cnlM
b2NrKCkpCisgICAgICAgIHNxbGl0ZTNfaW50ZXJydXB0KG1fZGIpOworCisgICAgbV9pbnRlcnJ1
cHRlZCA9IHRydWU7CisgICAgbV9sb2NraW5nTXV0ZXgudW5sb2NrKCk7Cit9CisKIHZvaWQgU1FM
aXRlRGF0YWJhc2U6OnNldEZ1bGxzeW5jKGJvb2wgZnN5bmMpIAogewogICAgIGlmIChmc3luYykg
CkBAIC0zOTcsMTYgKzQxMSw2IEBAIHZvaWQgU1FMaXRlRGF0YWJhc2U6OmVuYWJsZUF1dGhvcml6
ZXIoYm8KICAgICAgICAgc3FsaXRlM19zZXRfYXV0aG9yaXplcihtX2RiLCBOVUxMLCAwKTsKIH0K
IAotdm9pZCBTUUxpdGVEYXRhYmFzZTo6bG9jaygpCi17Ci0gICAgbV9sb2NraW5nTXV0ZXgubG9j
aygpOwotfQotCi12b2lkIFNRTGl0ZURhdGFiYXNlOjp1bmxvY2soKQotewotICAgIG1fbG9ja2lu
Z011dGV4LnVubG9jaygpOwotfQotCiBib29sIFNRTGl0ZURhdGFiYXNlOjppc0F1dG9Db21taXRP
bigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHNxbGl0ZTNfZ2V0X2F1dG9jb21taXQobV9kYik7Cklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgJKHJldmlzaW9uIDY0MDA3KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkod29ya2luZyBjb3B5KQpA
QCAtNDgsNiArNDgsNyBAQCBleHRlcm4gY29uc3QgaW50IFNRTFJlc3VsdE9rOwogZXh0ZXJuIGNv
bnN0IGludCBTUUxSZXN1bHRSb3c7CiBleHRlcm4gY29uc3QgaW50IFNRTFJlc3VsdFNjaGVtYTsK
IGV4dGVybiBjb25zdCBpbnQgU1FMUmVzdWx0RnVsbDsKK2V4dGVybiBjb25zdCBpbnQgU1FMUmVz
dWx0SW50ZXJydXB0OwogCiBjbGFzcyBTUUxpdGVEYXRhYmFzZSA6IHB1YmxpYyBOb25jb3B5YWJs
ZSB7CiAgICAgZnJpZW5kIGNsYXNzIFNRTGl0ZVRyYW5zYWN0aW9uOwpAQCAtNTgsNiArNTksOCBA
QCBwdWJsaWM6CiAgICAgYm9vbCBvcGVuKGNvbnN0IFN0cmluZyYgZmlsZW5hbWUsIGJvb2wgZm9y
V2ViU1FMRGF0YWJhc2UgPSBmYWxzZSk7CiAgICAgYm9vbCBpc09wZW4oKSBjb25zdCB7IHJldHVy
biBtX2RiOyB9CiAgICAgdm9pZCBjbG9zZSgpOworICAgIHZvaWQgaW50ZXJydXB0KCk7CisgICAg
Ym9vbCBpc0ludGVycnVwdGVkKCkgeyBBU1NFUlQoIW1fbG9ja2luZ011dGV4LnRyeUxvY2soKSk7
IHJldHVybiBtX2ludGVycnVwdGVkOyB9CiAKICAgICBib29sIGV4ZWN1dGVDb21tYW5kKGNvbnN0
IFN0cmluZyYpOwogICAgIGJvb2wgcmV0dXJuc0F0TGVhc3RPbmVSZXN1bHQoY29uc3QgU3RyaW5n
Jik7CkBAIC0xMDUsOSArMTA4LDcgQEAgcHVibGljOgogICAgIAogICAgIHZvaWQgc2V0QXV0aG9y
aXplcihQYXNzUmVmUHRyPERhdGFiYXNlQXV0aG9yaXplcj4pOwogCi0gICAgLy8gKHVuKWxvY2tz
IHRoZSBkYXRhYmFzZSBsaWtlIGEgbXV0ZXgKLSAgICB2b2lkIGxvY2soKTsKLSAgICB2b2lkIHVu
bG9jaygpOworICAgIE11dGV4JiBkYXRhYmFzZU11dGV4KCkgeyByZXR1cm4gbV9sb2NraW5nTXV0
ZXg7IH0KICAgICBib29sIGlzQXV0b0NvbW1pdE9uKCkgY29uc3Q7CiAKICAgICAvLyBUaGUgU1FM
aXRlIEFVVE9fVkFDVVVNIHByYWdtYSBjYW4gYmUgZWl0aGVyIE5PTkUsIEZVTEwsIG9yIElOQ1JF
TUVOVEFMLgpAQCAtMTQ5LDcgKzE1MCw4IEBAIHByaXZhdGU6CiAKICAgICBNdXRleCBtX2xvY2tp
bmdNdXRleDsKICAgICBUaHJlYWRJZGVudGlmaWVyIG1fb3BlbmluZ1RocmVhZDsKLSAgICAKKwor
ICAgIGJvb2wgbV9pbnRlcnJ1cHRlZDsKIH07IC8vIGNsYXNzIFNRTGl0ZURhdGFiYXNlCiAKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0
YXRlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3Rh
dGVtZW50LmNwcAkocmV2aXNpb24gNjQwMDcpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxp
dGVTdGF0ZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MSw2ICs2MSwxMSBAQCBTUUxpdGVT
dGF0ZW1lbnQ6On5TUUxpdGVTdGF0ZW1lbnQoKQogaW50IFNRTGl0ZVN0YXRlbWVudDo6cHJlcGFy
ZSgpCiB7CiAgICAgQVNTRVJUKCFtX2lzUHJlcGFyZWQpOworCisgICAgTXV0ZXhMb2NrZXIgZGF0
YWJhc2VMb2NrKG1fZGF0YWJhc2UuZGF0YWJhc2VNdXRleCgpKTsKKyAgICBpZiAobV9kYXRhYmFz
ZS5pc0ludGVycnVwdGVkKCkpCisgICAgICAgIHJldHVybiBTUUxJVEVfSU5URVJSVVBUOworCiAg
ICAgY29uc3Qgdm9pZCogdGFpbCA9IDA7CiAgICAgTE9HKFNRTERhdGFiYXNlLCAiU1FMIC0gcHJl
cGFyZSAtICVzIiwgbV9xdWVyeS5hc2NpaSgpLmRhdGEoKSk7CiAgICAgU3RyaW5nIHN0cmlwcGVk
UXVlcnkgPSBtX3F1ZXJ5LnN0cmlwV2hpdGVTcGFjZSgpOwpAQCAtODgsNiArOTMsMTEgQEAgaW50
IFNRTGl0ZVN0YXRlbWVudDo6cHJlcGFyZSgpCiBpbnQgU1FMaXRlU3RhdGVtZW50OjpzdGVwKCkK
IHsKICAgICBBU1NFUlQobV9pc1ByZXBhcmVkKTsKKworICAgIE11dGV4TG9ja2VyIGRhdGFiYXNl
TG9jayhtX2RhdGFiYXNlLmRhdGFiYXNlTXV0ZXgoKSk7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNJ
bnRlcnJ1cHRlZCgpKQorICAgICAgICByZXR1cm4gU1FMSVRFX0lOVEVSUlVQVDsKKwogICAgIGlm
ICghbV9zdGF0ZW1lbnQpCiAgICAgICAgIHJldHVybiBTUUxJVEVfT0s7CiAgICAgTE9HKFNRTERh
dGFiYXNlLCAiU1FMIC0gc3RlcCAtICVzIiwgbV9xdWVyeS5hc2NpaSgpLmRhdGEoKSk7CkluZGV4
OiBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwCShyZXZpc2lvbiA2NDAwNykKKysrIFdl
YkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDc0
LDYgKzQ3NCwxMSBAQCB2b2lkIEFic3RyYWN0RGF0YWJhc2U6OmluY3JlbWVudGFsVmFjdXVtCiAg
ICAgICAgIG1fc3FsaXRlRGF0YWJhc2UucnVuSW5jcmVtZW50YWxWYWN1dW1Db21tYW5kKCk7CiB9
CiAKK3ZvaWQgQWJzdHJhY3REYXRhYmFzZTo6aW50ZXJydXB0KCkKK3sKKyAgICBtX3NxbGl0ZURh
dGFiYXNlLmludGVycnVwdCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRp
ZiAvLyBFTkFCTEUoREFUQUJBU0UpCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJhY3REYXRh
YmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmgJ
KHJldmlzaW9uIDY0MDA3KQorKysgV2ViQ29yZS9zdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuaAko
d29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsNyBAQCBwdWJsaWM6CiAKICAgICB1bnNpZ25lZCBs
b25nIGxvbmcgbWF4aW11bVNpemUoKSBjb25zdDsKICAgICB2b2lkIGluY3JlbWVudGFsVmFjdXVt
SWZOZWVkZWQoKTsKKyAgICB2b2lkIGludGVycnVwdCgpOwogCiAgICAgLy8gRklYTUU6IG1vdmUg
YWxsIHZlcnNpb24tcmVsYXRlZCBtZXRob2RzIHRvIGEgRGF0YWJhc2VWZXJzaW9uVHJhY2tlciBj
bGFzcwogICAgIGJvb2wgdmVyc2lvbk1hdGNoZXNFeHBlY3RlZCgpIGNvbnN0OwpJbmRleDogV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9z
dG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHJldmlzaW9uIDY0MDA3KQorKysgV2ViQ29yZS9z
dG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzNSw2ICsyMzUs
MzEgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlQ2hhbmdlZChBYgogICAgIG9yaWdp
blF1b3RhTWFuYWdlcigpLm1hcmtEYXRhYmFzZShkYXRhYmFzZSk7CiB9CiAKK3ZvaWQgRGF0YWJh
c2VUcmFja2VyOjppbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KFNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQqIGNvbnRleHQpCit7CisgICAgVmVjdG9yPFJlZlB0cjxBYnN0cmFjdERhdGFiYXNl
PiA+IG9wZW5EYXRhYmFzZXM7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJh
c2VNYXBMb2NrKG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworCisgICAgICAgIGlmIChtX29wZW5E
YXRhYmFzZU1hcCkgeworICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1lTWFwID0gbV9v
cGVuRGF0YWJhc2VNYXAtPmdldChjb250ZXh0LT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICAgICAg
ICAgIGlmIChuYW1lTWFwKSB7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwOjpjb25z
dF9pdGVyYXRvciBkYk5hbWVNYXBFbmRJdCA9IG5hbWVNYXAtPmVuZCgpOworICAgICAgICAgICAg
ICAgIGZvciAoRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVNYXBJdCA9IG5h
bWVNYXAtPmJlZ2luKCk7IGRiTmFtZU1hcEl0ICE9IGRiTmFtZU1hcEVuZEl0OyArK2RiTmFtZU1h
cEl0KSB7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9IGRi
TmFtZU1hcEl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlU2V0Ojpjb25z
dF9pdGVyYXRvciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgpOworICAgICAgICAgICAg
ICAgICAgICBmb3IgKERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEl0ID0gZGF0YWJh
c2VTZXQtPmJlZ2luKCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsgKytkYlNldEl0KQorICAgICAg
ICAgICAgICAgICAgICAgICAgb3BlbkRhdGFiYXNlcy5hcHBlbmQoKmRiU2V0SXQpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZlY3Rv
cjxSZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPjo6Y29uc3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNl
c0VuZEl0ID0gb3BlbkRhdGFiYXNlcy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxSZWZQdHI8QWJz
dHJhY3REYXRhYmFzZT4gPjo6Y29uc3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNlc0l0ID0gb3BlbkRh
dGFiYXNlcy5iZWdpbigpOyBvcGVuRGF0YWJhc2VzSXQgIT0gb3BlbkRhdGFiYXNlc0VuZEl0OyAr
K29wZW5EYXRhYmFzZXNJdCkKKyAgICAgICAgKCpvcGVuRGF0YWJhc2VzSXQpLT5pbnRlcnJ1cHQo
KTsKK30KKwogU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUGF0aChTZWN1cml0eU9yaWdp
biogb3JpZ2luKSBjb25zdAogewogICAgIHJldHVybiBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmRE
YXRhYmFzZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLnRocmVhZHNhZmVD
b3B5KCksIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwpJbmRleDogV2ViQ29yZS9zdG9y
YWdlL0RhdGFiYXNlVHJhY2tlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRh
YmFzZVRyYWNrZXIuaAkocmV2aXNpb24gNjQwMDcpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2VUcmFja2VyLmgJKHdvcmtpbmcgY29weSkKQEAgLTc4LDYgKzc4LDggQEAgcHVibGljOgogICAg
IHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRNYXhTaXplRm9yRGF0YWJhc2UoY29uc3QgQWJzdHJhY3RE
YXRhYmFzZSopOwogICAgIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKEFic3RyYWN0RGF0YWJhc2UqKTsK
IAorICAgIHZvaWQgaW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dChTY3JpcHRFeGVjdXRp
b25Db250ZXh0Kik7CisKIHByaXZhdGU6CiAgICAgRGF0YWJhc2VUcmFja2VyKGNvbnN0IFN0cmlu
ZyYgZGF0YWJhc2VQYXRoKTsKIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHJldmlz
aW9uIDY0MDA3KQorKysgV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTc4LDcgKzc4LDcgQEAgYm9vbCBTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUoRGF0YWJh
c2UqIGRiKQogCiAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHRPaykgewogICAgICAgICBMT0co
U3RvcmFnZUFQSSwgIlVuYWJsZSB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2Ygc3RhdGVtZW50ICVz
IC0gZXJyb3IgJWkgKCVzKSIsIG1fc3RhdGVtZW50LmFzY2lpKCkuZGF0YSgpLCByZXN1bHQsIGRh
dGFiYXNlLT5sYXN0RXJyb3JNc2coKSk7Ci0gICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3Jl
YXRlKFNRTEVycm9yOjpTWU5UQVhfRVJSLCBkYXRhYmFzZS0+bGFzdEVycm9yTXNnKCkpOworICAg
ICAgICBtX2Vycm9yID0gU1FMRXJyb3I6OmNyZWF0ZShyZXN1bHQgPT0gU1FMUmVzdWx0SW50ZXJy
dXB0ID8gU1FMRXJyb3I6OkRBVEFCQVNFX0VSUiA6IFNRTEVycm9yOjpTWU5UQVhfRVJSLCBkYXRh
YmFzZS0+bGFzdEVycm9yTXNnKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCklu
ZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50U3luYy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwCShyZXZpc2lvbiA2NDAwNykKKysr
IFdlYkNvcmUvc3RvcmFnZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NjEsNyArNjEsNyBAQCBQYXNzUmVmUHRyPFNRTFJlc3VsdFNldD4gU1FMU3RhdGVtZW50U3luCiAg
ICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCgqZGF0YWJhc2UsIG1fc3RhdGVtZW50KTsKICAg
ICBpbnQgcmVzdWx0ID0gc3RhdGVtZW50LnByZXBhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IFNR
TFJlc3VsdE9rKSB7Ci0gICAgICAgIGVjID0gU1FMRXhjZXB0aW9uOjpTWU5UQVhfRVJSOworICAg
ICAgICBlYyA9IChyZXN1bHQgPT0gU1FMUmVzdWx0SW50ZXJydXB0ID8gU1FMRXhjZXB0aW9uOjpE
QVRBQkFTRV9FUlIgOiBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4g
MDsKICAgICB9CiAKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNr
ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0Rh
dGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkocmV2aXNpb24gNjQwMDcpCisrKyBXZWJDb3JlL3N0
b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xNzIsNCArMTcyLDI5IEBAIHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6
OmdldE0KICAgICByZXR1cm4gZGF0YWJhc2VTaXplICsgc3BhY2VBdmFpbGFibGU7CiB9CiAKK3Zv
aWQgRGF0YWJhc2VUcmFja2VyOjppbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KFNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQpCit7CisgICAgVmVjdG9yPFJlZlB0cjxBYnN0cmFj
dERhdGFiYXNlPiA+IG9wZW5EYXRhYmFzZXM7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBv
cGVuRGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworCisgICAgICAgIGlm
IChtX29wZW5EYXRhYmFzZU1hcCkgeworICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1l
TWFwID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChjb250ZXh0LT5zZWN1cml0eU9yaWdpbigpKTsK
KyAgICAgICAgICAgIGlmIChuYW1lTWFwKSB7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VOYW1l
TWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVNYXBFbmRJdCA9IG5hbWVNYXAtPmVuZCgpOworICAg
ICAgICAgICAgICAgIGZvciAoRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVN
YXBJdCA9IG5hbWVNYXAtPmJlZ2luKCk7IGRiTmFtZU1hcEl0ICE9IGRiTmFtZU1hcEVuZEl0OyAr
K2RiTmFtZU1hcEl0KSB7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlU2V0KiBkYXRhYmFz
ZVNldCA9IGRiTmFtZU1hcEl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNl
U2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgpOworICAg
ICAgICAgICAgICAgICAgICBmb3IgKERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEl0
ID0gZGF0YWJhc2VTZXQtPmJlZ2luKCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsgKytkYlNldEl0
KQorICAgICAgICAgICAgICAgICAgICAgICAgb3BlbkRhdGFiYXNlcy5hcHBlbmQoKmRiU2V0SXQp
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwor
ICAgIFZlY3RvcjxSZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPjo6Y29uc3RfaXRlcmF0b3Igb3Bl
bkRhdGFiYXNlc0VuZEl0ID0gb3BlbkRhdGFiYXNlcy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxS
ZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPjo6Y29uc3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNlc0l0
ID0gb3BlbkRhdGFiYXNlcy5iZWdpbigpOyBvcGVuRGF0YWJhc2VzSXQgIT0gb3BlbkRhdGFiYXNl
c0VuZEl0OyArK29wZW5EYXRhYmFzZXNJdCkKKyAgICAgICAgKCpvcGVuRGF0YWJhc2VzSXQpLT5p
bnRlcnJ1cHQoKTsKK30KKwogfQpJbmRleDogV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVhZC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVhZC5jcHAJKHJldmlz
aW9uIDY0MDA3KQorKysgV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVhZC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMwLDcgKzMwLDEwIEBACiAKICNpbmNsdWRlICJXb3JrZXJUaHJlYWQuaCIKIAor
I2lmIEVOQUJMRShEQVRBQkFTRSkKICNpbmNsdWRlICJEYXRhYmFzZVRhc2suaCIKKyNpbmNsdWRl
ICJEYXRhYmFzZVRyYWNrZXIuaCIKKyNlbmRpZgogI2luY2x1ZGUgIkRlZGljYXRlZFdvcmtlckNv
bnRleHQuaCIKICNpbmNsdWRlICJLVVJMLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIK
QEAgLTIyNSw2ICsyMjgsMTAgQEAgdm9pZCBXb3JrZXJUaHJlYWQ6OnN0b3AoKQogICAgIGlmICht
X3dvcmtlckNvbnRleHQpIHsKICAgICAgICAgbV93b3JrZXJDb250ZXh0LT5zY3JpcHQoKS0+Zm9y
YmlkRXhlY3V0aW9uKFdvcmtlclNjcmlwdENvbnRyb2xsZXI6OlRlcm1pbmF0ZVJ1bm5pbmdTY3Jp
cHQpOwogCisjaWYgRU5BQkxFKERBVEFCQVNFKQorICAgICAgICBEYXRhYmFzZVRyYWNrZXI6OnRy
YWNrZXIoKS5pbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KG1fd29ya2VyQ29udGV4dC5n
ZXQoKSk7CisjZW5kaWYKKwogICAgIC8vIEZJWE1FOiBSdWRlbHkga2lsbGluZyB0aGUgdGhyZWFk
IHdvbid0IHdvcmsgd2hlbiB3ZSBhbGxvdyBuZXN0ZWQgd29ya2VycywgYmVjYXVzZSB0aGV5IHdp
bGwgdHJ5IHRvIHBvc3Qgbm90aWZpY2F0aW9ucyBvZiB0aGVpciBkZXN0cnVjdGlvbi4KICAgICAv
LyBUaGlzIGNhbiBsaWtlbHkgdXNlIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyB1c2VkIGZvciBkYXRh
YmFzZXMgYWJvdmUuCiAKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0MDA3KQorKysgTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDctMjQgIER1
bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUZXN0IHRoYXQgYWxsIERCIG9wZXJhdGlvbnMg
YXJlIGludGVycnVwdGVkIHdoZW4gYSB3b3JrZXIgaXMgdGVybWluYXRlZC4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQyODQzCisKKyAgICAgICAgKiBm
YXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UtZXhwZWN0ZWQudHh0OiBBZGRl
ZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3lu
Yy1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL2lu
dGVycnVwdC1kYXRhYmFzZS1zeW5jLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vy
cy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0
L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuanM6IEFk
ZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQt
ZGF0YWJhc2UuanM6IEFkZGVkLgorICAgICAgICAocnVuVHJhbnNhY3Rpb25zKToKKyAgICAgICAg
KHZhcik6CisKIDIwMTAtMDctMjMgIEphbWVzIFJvYmluc29uICA8amFtZXNyQGNocm9taXVtLm9y
Zz4KIAogICAgICAgICBVbnJldmlld2VkLiAgQWRkIGNocm9taXVtIGV4cGVjdGF0aW9ucyBmb3Ig
bmV3IHRlc3RzLgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJy
dXB0LWRhdGFiYXNlLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UtZXhwZWN0ZWQudHh0CShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFi
YXNlLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzIEBACitUaGlzIHRlc3Qg
bWFrZXMgc3VyZSB0aGF0IGFsbCBhc3luYyBkYXRhYmFzZSBvcGVyYXRpb25zIGFyZSBpbW1lZGlh
dGVseSBpbnRlcnJ1cHRlZCB3aGVuIHRoZSB3b3JrZXIgbmVlZHMgdG8gdGVybWluYXRlLgorUEFT
UzogZGF0YWJhc2Ugb3BlcmF0aW9ucyBpbnRlcnJ1cHRlZC4KKwpJbmRleDogTGF5b3V0VGVzdHMv
ZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMtZXhwZWN0ZWQudHh0
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVw
dC1kYXRhYmFzZS1zeW5jLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLWV4cGVjdGVkLnR4
dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1IEBACitDT05TT0xFIE1FU1NBR0U6IGxpbmUgNjog
REFUQUJBU0VfRVJSOiBET00gU1FMIEV4Y2VwdGlvbiAxOiBUaGUgb3BlcmF0aW9uIGZhaWxlZCBm
b3Igc29tZSByZWFzb24gcmVsYXRlZCB0byB0aGUgZGF0YWJhc2UuCitDT05TT0xFIE1FU1NBR0U6
IGxpbmUgODogVU5LTk9XTl9FUlI6IERPTSBTUUwgRXhjZXB0aW9uIDA6IFRoZSBvcGVyYXRpb24g
ZmFpbGVkIGZvciByZWFzb25zIHVucmVsYXRlZCB0byB0aGUgZGF0YWJhc2UuCitUaGlzIHRlc3Qg
bWFrZXMgc3VyZSB0aGF0IGFsbCBzeW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMgYXJlIGltbWVkaWF0
ZWx5IGludGVycnVwdGVkIHdoZW4gdGhlIHdvcmtlciBuZWVkcyB0byB0ZXJtaW5hdGUuCitQQVNT
OiBkYXRhYmFzZSBvcGVyYXRpb25zIGludGVycnVwdGVkLgorCkluZGV4OiBMYXlvdXRUZXN0cy9m
YXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFz
ZS1zeW5jLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3Rv
cmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDUwIEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy93b3JrZXIt
dXRpbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0PgordmFyIHdvcmtlcjsKKworZnVuY3Rpb24gbG9n
KG1lc3NhZ2UpCit7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5pbm5l
ckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsKK30KKworZnVuY3Rpb24gZmluaXNoVGVzdCgpCit7
CisgICAgbG9nKCJQQVNTOiBkYXRhYmFzZSBvcGVyYXRpb25zIGludGVycnVwdGVkLiIpOworICAg
IGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxheW91dFRlc3RDb250
cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKCkKK3sK
KyAgICB3b3JrZXIudGVybWluYXRlKCk7CisgICAgd2FpdFVudGlsV29ya2VyVGhyZWFkc0V4aXQo
ZmluaXNoVGVzdCkKK30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAgaWYgKHdpbmRvdy5s
YXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1w
QXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsK
KyAgICB9CisKKyAgICB3b3JrZXIgPSBuZXcgV29ya2VyKCdyZXNvdXJjZXMvaW50ZXJydXB0LWRh
dGFiYXNlLXN5bmMuanMnKTsKKyAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQp
IHsKKyAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT0gImRvbmUiKQorICAgICAgICAgICAgZmluaXNo
VGVzdCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2coZXZlbnQuZGF0YSk7CisgICAg
fTsKKworICAgIHNldFRpbWVvdXQoJ3Rlcm1pbmF0ZVdvcmtlcigpJywgNTAwKTsKK30KKzwvc2Ny
aXB0PgorPC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+CitUaGlzIHRlc3QgbWFr
ZXMgc3VyZSB0aGF0IGFsbCBzeW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5
IGludGVycnVwdGVkIHdoZW4gdGhlIHdvcmtlciBuZWVkcyB0byB0ZXJtaW5hdGUuCis8cHJlIGlk
PSJjb25zb2xlIj4KKzwvcHJlPgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMv
ZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0
bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRl
cnJ1cHQtZGF0YWJhc2UuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1MCBAQAorPGh0bWw+
Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMvd29ya2VyLXV0aWwuanMiPjwvc2Ny
aXB0PgorPHNjcmlwdD4KK3ZhciB3b3JrZXI7CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQorewor
ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3Nh
Z2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiUEFT
UzogZGF0YWJhc2Ugb3BlcmF0aW9ucyBpbnRlcnJ1cHRlZC4iKTsKKyAgICBpZiAod2luZG93Lmxh
eW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlE
b25lKCk7Cit9CisKK2Z1bmN0aW9uIHRlcm1pbmF0ZVdvcmtlcigpCit7CisgICAgd29ya2VyLnRl
cm1pbmF0ZSgpOworICAgIHdhaXRVbnRpbFdvcmtlclRocmVhZHNFeGl0KGZpbmlzaFRlc3QpCit9
CisKK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRy
b2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAg
ICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisgICAg
d29ya2VyID0gbmV3IFdvcmtlcigncmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS5qcycpOwor
ICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgICBpZiAoZXZl
bnQuZGF0YSA9PSAiZG9uZSIpCisgICAgICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGxvZyhldmVudC5kYXRhKTsKKyAgICB9OworCisgICAgc2V0VGltZW91
dCgndGVybWluYXRlV29ya2VyKCknLCA1MDApOworfQorPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxi
b2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIGFz
eW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5IGludGVycnVwdGVkIHdoZW4g
dGhlIHdvcmtlciBuZWVkcyB0byB0ZXJtaW5hdGUuCis8cHJlIGlkPSJjb25zb2xlIj4KKzwvcHJl
PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3Jh
Z2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJh
c2Utc3luYy5qcwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9y
YWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5qcwkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw4IEBACit2YXIgZGIgPSBvcGVuRGF0YWJhc2VTeW5jKCJJbnRlcnJ1cHREYXRhYmFz
ZVRlc3QiLCAiMSIsICIiLCAxKTsKK2RiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7CisgICAg
dHguZXhlY3V0ZVNxbCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgVGVzdCAoRm9vIElOVCki
KTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAvLyBQdXQgYm90aCBzdGF0ZW1lbnRzIG9u
IHRoZSBzYW1lIGxpbmUsIHRvIG1ha2Ugc3VyZSB0aGUgZXhjZXB0aW9uIGlzIGFsd2F5cyByZXBv
cnRlZCBvbiB0aGUgc2FtZSBsaW5lLgorICAgICAgICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5U
TyBUZXN0IFZBTFVFUyAoMSkiKTsgdHguZXhlY3V0ZVNxbCgiREVMRVRFIEZST00gVGVzdCBXSEVS
RSBGb28gPSAxIik7CisgICAgfQorfSk7CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMv
c3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJh
c2UuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9y
ZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0
IEBACitmdW5jdGlvbiBydW5UcmFuc2FjdGlvbnMoKQoreworICAgIGRiLnRyYW5zYWN0aW9uKGZ1
bmN0aW9uKHR4KSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0eC5leGVj
dXRlU3FsKCJJTlNFUlQgSU5UTyBUZXN0IFZBTFVFUyAoMSkiKTsKKyAgICAgICAgICAgIHR4LmV4
ZWN1dGVTcWwoIkRFTEVURSBGUk9NIFRlc3QgV0hFUkUgRm9vID0gMSIpOworICAgICAgICB9Cisg
ICAgfSk7Cit9CisKK3ZhciBkYiA9IG9wZW5EYXRhYmFzZVN5bmMoIkludGVycnVwdERhdGFiYXNl
VGVzdCIsICIxIiwgIiIsIDEpOworZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsKKyAgICB0
eC5leGVjdXRlU3FsKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBUZXN0IChGb28gSU5UKSIp
OworfSwgbnVsbCwgZnVuY3Rpb24oKSB7IHJ1blRyYW5zYWN0aW9ucygpOyB9KTsK
</data>
<flag name="commit-queue"
          id="50719"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62499</attachid>
            <date>2010-07-24 04:14:12 -0700</date>
            <delta_ts>2010-07-26 12:53:31 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>19253</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDAwNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzUgQEAKKzIwMTAtMDctMjQgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBJbnRlcnJ1cHQgYWxsIERCIG9wZXJhdGlvbnMgd2hlbiBhIHdv
cmtlciBpcyB0ZXJtaW5hdGVkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDI4NDMKKworICAgICAgICBUZXN0czogZmFzdC93b3JrZXJzL3N0b3JhZ2Uv
aW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAorICAgICAgICAgICAgICAgZmFzdC93b3JrZXJz
L3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwKKworICAgICAgICAqIHBsYXRmb3JtL3Nx
bC9TUUxpdGVEYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6
U1FMaXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OmludGVy
cnVwdCk6CisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmg6CisgICAgICAg
IChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6aXNJbnRlcnJ1cHRlZCk6CisgICAgICAgIChXZWJD
b3JlOjpTUUxpdGVEYXRhYmFzZTo6ZGF0YWJhc2VNdXRleCk6CisgICAgICAgICogcGxhdGZvcm0v
c3FsL1NRTGl0ZVN0YXRlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ6OnByZXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50OjpzdGVwKToK
KyAgICAgICAgKiBzdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6QWJzdHJhY3REYXRhYmFzZTo6aW50ZXJydXB0KToKKyAgICAgICAgKiBzdG9yYWdlL0Fic3Ry
YWN0RGF0YWJhc2UuaDoKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0Zv
ckNvbnRleHQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmg6CisgICAgICAg
ICogc3RvcmFnZS9TUUxTdGF0ZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVt
ZW50OjpleGVjdXRlKToKKyAgICAgICAgKiBzdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVtZW50U3luYzo6ZXhlY3V0ZSk6CisgICAgICAgICog
c3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQp
OgorICAgICAgICAqIHdvcmtlcnMvV29ya2VyVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OldvcmtlclRocmVhZDo6c3RvcCk6CisKIDIwMTAtMDctMjMgIFBhdHJpY2sgR2Fuc3RlcmVyICA8
cGFyb2dhQHBhcm9nYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA2NDAw
NykKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDIsNiArNDIsNyBAQCBjb25zdCBpbnQgU1FMUmVzdWx0T2sgPSBTUUxJVEVfT0s7
CiBjb25zdCBpbnQgU1FMUmVzdWx0Um93ID0gU1FMSVRFX1JPVzsKIGNvbnN0IGludCBTUUxSZXN1
bHRTY2hlbWEgPSBTUUxJVEVfU0NIRU1BOwogY29uc3QgaW50IFNRTFJlc3VsdEZ1bGwgPSBTUUxJ
VEVfRlVMTDsKK2NvbnN0IGludCBTUUxSZXN1bHRJbnRlcnJ1cHQgPSBTUUxJVEVfSU5URVJSVVBU
OwogCiAKIFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCkBAIC01MCw2ICs1MSw3IEBA
IFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAgLCBtX3RyYW5zYWN0aW9uSW5Q
cm9ncmVzcyhmYWxzZSkKICAgICAsIG1fc2hhcmFibGUoZmFsc2UpCiAgICAgLCBtX29wZW5pbmdU
aHJlYWQoMCkKKyAgICAsIG1faW50ZXJydXB0ZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTkyLDYgKzk0
LDI0IEBAIHZvaWQgU1FMaXRlRGF0YWJhc2U6OmNsb3NlKCkKICAgICBtX29wZW5pbmdUaHJlYWQg
PSAwOwogfQogCit2b2lkIFNRTGl0ZURhdGFiYXNlOjppbnRlcnJ1cHQoKQoreworICAgIGlmICgh
bV9kYikKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKCFtX2xvY2tpbmdNdXRleC50cnlM
b2NrKCkpCisgICAgICAgIHNxbGl0ZTNfaW50ZXJydXB0KG1fZGIpOworCisgICAgbV9pbnRlcnJ1
cHRlZCA9IHRydWU7CisgICAgbV9sb2NraW5nTXV0ZXgudW5sb2NrKCk7Cit9CisKK2Jvb2wgU1FM
aXRlRGF0YWJhc2U6OmlzSW50ZXJydXB0ZWQoKQoreworICAgIEFTU0VSVCghbV9sb2NraW5nTXV0
ZXgudHJ5TG9jaygpKTsKKyAgICByZXR1cm4gbV9pbnRlcnJ1cHRlZDsKK30KKwogdm9pZCBTUUxp
dGVEYXRhYmFzZTo6c2V0RnVsbHN5bmMoYm9vbCBmc3luYykgCiB7CiAgICAgaWYgKGZzeW5jKSAK
QEAgLTM5NywxNiArNDE3LDYgQEAgdm9pZCBTUUxpdGVEYXRhYmFzZTo6ZW5hYmxlQXV0aG9yaXpl
cihibwogICAgICAgICBzcWxpdGUzX3NldF9hdXRob3JpemVyKG1fZGIsIE5VTEwsIDApOwogfQog
Ci12b2lkIFNRTGl0ZURhdGFiYXNlOjpsb2NrKCkKLXsKLSAgICBtX2xvY2tpbmdNdXRleC5sb2Nr
KCk7Ci19Ci0KLXZvaWQgU1FMaXRlRGF0YWJhc2U6OnVubG9jaygpCi17Ci0gICAgbV9sb2NraW5n
TXV0ZXgudW5sb2NrKCk7Ci19Ci0KIGJvb2wgU1FMaXRlRGF0YWJhc2U6OmlzQXV0b0NvbW1pdE9u
KCkgY29uc3QKIHsKICAgICByZXR1cm4gc3FsaXRlM19nZXRfYXV0b2NvbW1pdChtX2RiKTsKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkocmV2aXNpb24gNjQwMDcpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC00OCw2ICs0OCw3IEBAIGV4dGVybiBjb25zdCBpbnQgU1FMUmVzdWx0T2s7CiBleHRlcm4gY29u
c3QgaW50IFNRTFJlc3VsdFJvdzsKIGV4dGVybiBjb25zdCBpbnQgU1FMUmVzdWx0U2NoZW1hOwog
ZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1bHRGdWxsOworZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1
bHRJbnRlcnJ1cHQ7CiAKIGNsYXNzIFNRTGl0ZURhdGFiYXNlIDogcHVibGljIE5vbmNvcHlhYmxl
IHsKICAgICBmcmllbmQgY2xhc3MgU1FMaXRlVHJhbnNhY3Rpb247CkBAIC01OCw2ICs1OSw4IEBA
IHB1YmxpYzoKICAgICBib29sIG9wZW4oY29uc3QgU3RyaW5nJiBmaWxlbmFtZSwgYm9vbCBmb3JX
ZWJTUUxEYXRhYmFzZSA9IGZhbHNlKTsKICAgICBib29sIGlzT3BlbigpIGNvbnN0IHsgcmV0dXJu
IG1fZGI7IH0KICAgICB2b2lkIGNsb3NlKCk7CisgICAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgICBi
b29sIGlzSW50ZXJydXB0ZWQoKTsKIAogICAgIGJvb2wgZXhlY3V0ZUNvbW1hbmQoY29uc3QgU3Ry
aW5nJik7CiAgICAgYm9vbCByZXR1cm5zQXRMZWFzdE9uZVJlc3VsdChjb25zdCBTdHJpbmcmKTsK
QEAgLTEwNSw5ICsxMDgsNyBAQCBwdWJsaWM6CiAgICAgCiAgICAgdm9pZCBzZXRBdXRob3JpemVy
KFBhc3NSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVyPik7CiAKLSAgICAvLyAodW4pbG9ja3MgdGhl
IGRhdGFiYXNlIGxpa2UgYSBtdXRleAotICAgIHZvaWQgbG9jaygpOwotICAgIHZvaWQgdW5sb2Nr
KCk7CisgICAgTXV0ZXgmIGRhdGFiYXNlTXV0ZXgoKSB7IHJldHVybiBtX2xvY2tpbmdNdXRleDsg
fQogICAgIGJvb2wgaXNBdXRvQ29tbWl0T24oKSBjb25zdDsKIAogICAgIC8vIFRoZSBTUUxpdGUg
QVVUT19WQUNVVU0gcHJhZ21hIGNhbiBiZSBlaXRoZXIgTk9ORSwgRlVMTCwgb3IgSU5DUkVNRU5U
QUwuCkBAIC0xNDksNyArMTUwLDggQEAgcHJpdmF0ZToKIAogICAgIE11dGV4IG1fbG9ja2luZ011
dGV4OwogICAgIFRocmVhZElkZW50aWZpZXIgbV9vcGVuaW5nVGhyZWFkOwotICAgIAorCisgICAg
Ym9vbCBtX2ludGVycnVwdGVkOwogfTsgLy8gY2xhc3MgU1FMaXRlRGF0YWJhc2UKIAogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3RhdGVt
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVTdGF0ZW1l
bnQuY3BwCShyZXZpc2lvbiA2NDAwNykKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0
YXRlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYxLDYgKzYxLDExIEBAIFNRTGl0ZVN0YXRl
bWVudDo6flNRTGl0ZVN0YXRlbWVudCgpCiBpbnQgU1FMaXRlU3RhdGVtZW50OjpwcmVwYXJlKCkK
IHsKICAgICBBU1NFUlQoIW1faXNQcmVwYXJlZCk7CisKKyAgICBNdXRleExvY2tlciBkYXRhYmFz
ZUxvY2sobV9kYXRhYmFzZS5kYXRhYmFzZU11dGV4KCkpOworICAgIGlmIChtX2RhdGFiYXNlLmlz
SW50ZXJydXB0ZWQoKSkKKyAgICAgICAgcmV0dXJuIFNRTElURV9JTlRFUlJVUFQ7CisKICAgICBj
b25zdCB2b2lkKiB0YWlsID0gMDsKICAgICBMT0coU1FMRGF0YWJhc2UsICJTUUwgLSBwcmVwYXJl
IC0gJXMiLCBtX3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKICAgICBTdHJpbmcgc3RyaXBwZWRRdWVy
eSA9IG1fcXVlcnkuc3RyaXBXaGl0ZVNwYWNlKCk7CkBAIC04OCw2ICs5MywxMSBAQCBpbnQgU1FM
aXRlU3RhdGVtZW50OjpwcmVwYXJlKCkKIGludCBTUUxpdGVTdGF0ZW1lbnQ6OnN0ZXAoKQogewog
ICAgIEFTU0VSVChtX2lzUHJlcGFyZWQpOworCisgICAgTXV0ZXhMb2NrZXIgZGF0YWJhc2VMb2Nr
KG1fZGF0YWJhc2UuZGF0YWJhc2VNdXRleCgpKTsKKyAgICBpZiAobV9kYXRhYmFzZS5pc0ludGVy
cnVwdGVkKCkpCisgICAgICAgIHJldHVybiBTUUxJVEVfSU5URVJSVVBUOworCiAgICAgaWYgKCFt
X3N0YXRlbWVudCkKICAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKICAgICBMT0coU1FMRGF0YWJh
c2UsICJTUUwgLSBzdGVwIC0gJXMiLCBtX3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3N0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5jcHAJKHJldmlzaW9uIDY0MDA3KQorKysgV2ViQ29y
ZS9zdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NzQsNiAr
NDc0LDExIEBAIHZvaWQgQWJzdHJhY3REYXRhYmFzZTo6aW5jcmVtZW50YWxWYWN1dW0KICAgICAg
ICAgbV9zcWxpdGVEYXRhYmFzZS5ydW5JbmNyZW1lbnRhbFZhY3V1bUNvbW1hbmQoKTsKIH0KIAor
dm9pZCBBYnN0cmFjdERhdGFiYXNlOjppbnRlcnJ1cHQoKQoreworICAgIG1fc3FsaXRlRGF0YWJh
c2UuaW50ZXJydXB0KCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8v
IEVOQUJMRShEQVRBQkFTRSkKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuaAkocmV2
aXNpb24gNjQwMDcpCisrKyBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC02OCw2ICs2OCw3IEBAIHB1YmxpYzoKIAogICAgIHVuc2lnbmVkIGxvbmcg
bG9uZyBtYXhpbXVtU2l6ZSgpIGNvbnN0OwogICAgIHZvaWQgaW5jcmVtZW50YWxWYWN1dW1JZk5l
ZWRlZCgpOworICAgIHZvaWQgaW50ZXJydXB0KCk7CiAKICAgICAvLyBGSVhNRTogbW92ZSBhbGwg
dmVyc2lvbi1yZWxhdGVkIG1ldGhvZHMgdG8gYSBEYXRhYmFzZVZlcnNpb25UcmFja2VyIGNsYXNz
CiAgICAgYm9vbCB2ZXJzaW9uTWF0Y2hlc0V4cGVjdGVkKCkgY29uc3Q7CkluZGV4OiBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUcmFja2VyLmNwcAkocmV2aXNpb24gNjQwMDcpCisrKyBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUcmFja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjM1LDYgKzIzNSwzMSBA
QCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VDaGFuZ2VkKEFiCiAgICAgb3JpZ2luUXVv
dGFNYW5hZ2VyKCkubWFya0RhdGFiYXNlKGRhdGFiYXNlKTsKIH0KIAordm9pZCBEYXRhYmFzZVRy
YWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQoU2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCogY29udGV4dCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0YWJhc2U+ID4g
b3BlbkRhdGFiYXNlczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1h
cExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CisKKyAgICAgICAgaWYgKG1fb3BlbkRhdGFi
YXNlTWFwKSB7CisgICAgICAgICAgICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5E
YXRhYmFzZU1hcC0+Z2V0KGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgICAgICAgICAg
aWYgKG5hbWVNYXApIHsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0
ZXJhdG9yIGRiTmFtZU1hcEVuZEl0ID0gbmFtZU1hcC0+ZW5kKCk7CisgICAgICAgICAgICAgICAg
Zm9yIChEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGRiTmFtZU1hcEl0ID0gbmFtZU1h
cC0+YmVnaW4oKTsgZGJOYW1lTWFwSXQgIT0gZGJOYW1lTWFwRW5kSXQ7ICsrZGJOYW1lTWFwSXQp
IHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VTZXQqIGRhdGFiYXNlU2V0ID0gZGJOYW1l
TWFwSXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VTZXQ6OmNvbnN0X2l0
ZXJhdG9yIGRiU2V0RW5kSXQgPSBkYXRhYmFzZVNldC0+ZW5kKCk7CisgICAgICAgICAgICAgICAg
ICAgIGZvciAoRGF0YWJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGRiU2V0SXQgPSBkYXRhYmFzZVNl
dC0+YmVnaW4oKTsgZGJTZXRJdCAhPSBkYlNldEVuZEl0OyArK2RiU2V0SXQpCisgICAgICAgICAg
ICAgICAgICAgICAgICBvcGVuRGF0YWJhc2VzLmFwcGVuZCgqZGJTZXRJdCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmVjdG9yPFJl
ZlB0cjxBYnN0cmFjdERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzRW5k
SXQgPSBvcGVuRGF0YWJhc2VzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFJlZlB0cjxBYnN0cmFj
dERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzSXQgPSBvcGVuRGF0YWJh
c2VzLmJlZ2luKCk7IG9wZW5EYXRhYmFzZXNJdCAhPSBvcGVuRGF0YWJhc2VzRW5kSXQ7ICsrb3Bl
bkRhdGFiYXNlc0l0KQorICAgICAgICAoKm9wZW5EYXRhYmFzZXNJdCktPmludGVycnVwdCgpOwor
fQorCiBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5QYXRoKFNlY3VyaXR5T3JpZ2luKiBv
cmlnaW4pIGNvbnN0CiB7CiAgICAgcmV0dXJuIFNRTGl0ZUZpbGVTeXN0ZW06OmFwcGVuZERhdGFi
YXNlRmlsZU5hbWVUb1BhdGgobV9kYXRhYmFzZURpcmVjdG9yeVBhdGgudGhyZWFkc2FmZUNvcHko
KSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VUcmFja2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
VHJhY2tlci5oCShyZXZpc2lvbiA2NDAwNykKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRy
YWNrZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNzgsNiArNzgsOCBAQCBwdWJsaWM6CiAgICAgdW5z
aWduZWQgbG9uZyBsb25nIGdldE1heFNpemVGb3JEYXRhYmFzZShjb25zdCBBYnN0cmFjdERhdGFi
YXNlKik7CiAgICAgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQWJzdHJhY3REYXRhYmFzZSopOwogCisg
ICAgdm9pZCBpbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqKTsKKwogcHJpdmF0ZToKICAgICBEYXRhYmFzZVRyYWNrZXIoY29uc3QgU3RyaW5nJiBk
YXRhYmFzZVBhdGgpOwogCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAkocmV2aXNpb24g
NjQwMDcpCisrKyBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNzgsNyArNzgsNyBAQCBib29sIFNRTFN0YXRlbWVudDo6ZXhlY3V0ZShEYXRhYmFzZSog
ZGIpCiAKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdE9rKSB7CiAgICAgICAgIExPRyhTdG9y
YWdlQVBJLCAiVW5hYmxlIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiBzdGF0ZW1lbnQgJXMgLSBl
cnJvciAlaSAoJXMpIiwgbV9zdGF0ZW1lbnQuYXNjaWkoKS5kYXRhKCksIHJlc3VsdCwgZGF0YWJh
c2UtPmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgbV9lcnJvciA9IFNRTEVycm9yOjpjcmVhdGUo
U1FMRXJyb3I6OlNZTlRBWF9FUlIsIGRhdGFiYXNlLT5sYXN0RXJyb3JNc2coKSk7CisgICAgICAg
IG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKHJlc3VsdCA9PSBTUUxSZXN1bHRJbnRlcnJ1cHQg
PyBTUUxFcnJvcjo6REFUQUJBU0VfRVJSIDogU1FMRXJyb3I6OlNZTlRBWF9FUlIsIGRhdGFiYXNl
LT5sYXN0RXJyb3JNc2coKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKSW5kZXg6
IFdlYkNvcmUvc3RvcmFnZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50U3luYy5jcHAJKHJldmlzaW9uIDY0MDA3KQorKysgV2Vi
Q29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MSw3
ICs2MSw3IEBAIFBhc3NSZWZQdHI8U1FMUmVzdWx0U2V0PiBTUUxTdGF0ZW1lbnRTeW4KICAgICBT
UUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KCpkYXRhYmFzZSwgbV9zdGF0ZW1lbnQpOwogICAgIGlu
dCByZXN1bHQgPSBzdGF0ZW1lbnQucHJlcGFyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gU1FMUmVz
dWx0T2spIHsKLSAgICAgICAgZWMgPSBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlI7CisgICAgICAg
IGVjID0gKHJlc3VsdCA9PSBTUUxSZXN1bHRJbnRlcnJ1cHQgPyBTUUxFeGNlcHRpb246OkRBVEFC
QVNFX0VSUiA6IFNRTEV4Y2VwdGlvbjo6U1lOVEFYX0VSUik7CiAgICAgICAgIHJldHVybiAwOwog
ICAgIH0KIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNo
cm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJh
c2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA2NDAwNykKKysrIFdlYkNvcmUvc3RvcmFn
ZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTE3Miw0ICsxNzIsMjkgQEAgdW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6Z2V0
TQogICAgIHJldHVybiBkYXRhYmFzZVNpemUgKyBzcGFjZUF2YWlsYWJsZTsKIH0KIAordm9pZCBE
YXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQoU2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0
YWJhc2U+ID4gb3BlbkRhdGFiYXNlczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIG9wZW5E
YXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CisKKyAgICAgICAgaWYgKG1f
b3BlbkRhdGFiYXNlTWFwKSB7CisgICAgICAgICAgICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAg
PSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCkpOworICAg
ICAgICAgICAgaWYgKG5hbWVNYXApIHsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZU5hbWVNYXA6
OmNvbnN0X2l0ZXJhdG9yIGRiTmFtZU1hcEVuZEl0ID0gbmFtZU1hcC0+ZW5kKCk7CisgICAgICAg
ICAgICAgICAgZm9yIChEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGRiTmFtZU1hcEl0
ID0gbmFtZU1hcC0+YmVnaW4oKTsgZGJOYW1lTWFwSXQgIT0gZGJOYW1lTWFwRW5kSXQ7ICsrZGJO
YW1lTWFwSXQpIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VTZXQqIGRhdGFiYXNlU2V0
ID0gZGJOYW1lTWFwSXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VTZXQ6
OmNvbnN0X2l0ZXJhdG9yIGRiU2V0RW5kSXQgPSBkYXRhYmFzZVNldC0+ZW5kKCk7CisgICAgICAg
ICAgICAgICAgICAgIGZvciAoRGF0YWJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGRiU2V0SXQgPSBk
YXRhYmFzZVNldC0+YmVnaW4oKTsgZGJTZXRJdCAhPSBkYlNldEVuZEl0OyArK2RiU2V0SXQpCisg
ICAgICAgICAgICAgICAgICAgICAgICBvcGVuRGF0YWJhc2VzLmFwcGVuZCgqZGJTZXRJdCk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAg
VmVjdG9yPFJlZlB0cjxBYnN0cmFjdERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0
YWJhc2VzRW5kSXQgPSBvcGVuRGF0YWJhc2VzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFJlZlB0
cjxBYnN0cmFjdERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzSXQgPSBv
cGVuRGF0YWJhc2VzLmJlZ2luKCk7IG9wZW5EYXRhYmFzZXNJdCAhPSBvcGVuRGF0YWJhc2VzRW5k
SXQ7ICsrb3BlbkRhdGFiYXNlc0l0KQorICAgICAgICAoKm9wZW5EYXRhYmFzZXNJdCktPmludGVy
cnVwdCgpOworfQorCiB9CkluZGV4OiBXZWJDb3JlL3dvcmtlcnMvV29ya2VyVGhyZWFkLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3dvcmtlcnMvV29ya2VyVGhyZWFkLmNwcAkocmV2aXNpb24g
NjQwMDcpCisrKyBXZWJDb3JlL3dvcmtlcnMvV29ya2VyVGhyZWFkLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzAsNyArMzAsMTAgQEAKIAogI2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgogCisjaWYg
RU5BQkxFKERBVEFCQVNFKQogI2luY2x1ZGUgIkRhdGFiYXNlVGFzay5oIgorI2luY2x1ZGUgIkRh
dGFiYXNlVHJhY2tlci5oIgorI2VuZGlmCiAjaW5jbHVkZSAiRGVkaWNhdGVkV29ya2VyQ29udGV4
dC5oIgogI2luY2x1ZGUgIktVUkwuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgpAQCAt
MjI1LDYgKzIyOCwxMCBAQCB2b2lkIFdvcmtlclRocmVhZDo6c3RvcCgpCiAgICAgaWYgKG1fd29y
a2VyQ29udGV4dCkgewogICAgICAgICBtX3dvcmtlckNvbnRleHQtPnNjcmlwdCgpLT5mb3JiaWRF
eGVjdXRpb24oV29ya2VyU2NyaXB0Q29udHJvbGxlcjo6VGVybWluYXRlUnVubmluZ1NjcmlwdCk7
CiAKKyNpZiBFTkFCTEUoREFUQUJBU0UpCisgICAgICAgIERhdGFiYXNlVHJhY2tlcjo6dHJhY2tl
cigpLmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQobV93b3JrZXJDb250ZXh0LmdldCgp
KTsKKyNlbmRpZgorCiAgICAgLy8gRklYTUU6IFJ1ZGVseSBraWxsaW5nIHRoZSB0aHJlYWQgd29u
J3Qgd29yayB3aGVuIHdlIGFsbG93IG5lc3RlZCB3b3JrZXJzLCBiZWNhdXNlIHRoZXkgd2lsbCB0
cnkgdG8gcG9zdCBub3RpZmljYXRpb25zIG9mIHRoZWlyIGRlc3RydWN0aW9uLgogICAgIC8vIFRo
aXMgY2FuIGxpa2VseSB1c2UgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHVzZWQgZm9yIGRhdGFiYXNl
cyBhYm92ZS4KIApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNjQwMDcpCisrKyBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxOSBAQAorMjAxMC0wNy0yNCAgRHVtaXRy
dSBEYW5pbGl1YyAgPGR1bWlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRlc3QgdGhhdCBhbGwgREIgb3BlcmF0aW9ucyBhcmUg
aW50ZXJydXB0ZWQgd2hlbiBhIHdvcmtlciBpcyB0ZXJtaW5hdGVkLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDI4NDMKKworICAgICAgICAqIGZhc3Qv
d29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50eHQ6IEFkZGVkLgor
ICAgICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLWV4
cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJy
dXB0LWRhdGFiYXNlLXN5bmMuaHRtbDogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0
b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29y
a2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5qczogQWRkZWQu
CisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRh
YmFzZS5qczogQWRkZWQuCisgICAgICAgIChydW5UcmFuc2FjdGlvbnMpOgorICAgICAgICAodmFy
KToKKwogMjAxMC0wNy0yMyAgSmFtZXMgUm9iaW5zb24gIDxqYW1lc3JAY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFVucmV2aWV3ZWQuICBBZGQgY2hyb21pdW0gZXhwZWN0YXRpb25zIGZvciBuZXcg
dGVzdHMuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQt
ZGF0YWJhc2UtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29y
a2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Ut
ZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMgQEAKK1RoaXMgdGVzdCBtYWtl
cyBzdXJlIHRoYXQgYWxsIGFzeW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5
IGludGVycnVwdGVkIHdoZW4gdGhlIHdvcmtlciBuZWVkcyB0byB0ZXJtaW5hdGUuCitQQVNTOiBk
YXRhYmFzZSBvcGVyYXRpb25zIGludGVycnVwdGVkLgorCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy1leHBlY3RlZC50eHQKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRh
dGFiYXNlLXN5bmMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFz
dC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMtZXhwZWN0ZWQudHh0CShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUgQEAKK0NPTlNPTEUgTUVTU0FHRTogbGluZSA2OiBEQVRB
QkFTRV9FUlI6IERPTSBTUUwgRXhjZXB0aW9uIDE6IFRoZSBvcGVyYXRpb24gZmFpbGVkIGZvciBz
b21lIHJlYXNvbiByZWxhdGVkIHRvIHRoZSBkYXRhYmFzZS4KK0NPTlNPTEUgTUVTU0FHRTogbGlu
ZSA4OiBVTktOT1dOX0VSUjogRE9NIFNRTCBFeGNlcHRpb24gMDogVGhlIG9wZXJhdGlvbiBmYWls
ZWQgZm9yIHJlYXNvbnMgdW5yZWxhdGVkIHRvIHRoZSBkYXRhYmFzZS4KK1RoaXMgdGVzdCBtYWtl
cyBzdXJlIHRoYXQgYWxsIHN5bmMgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkg
aW50ZXJydXB0ZWQgd2hlbiB0aGUgd29ya2VyIG5lZWRzIHRvIHRlcm1pbmF0ZS4KK1BBU1M6IGRh
dGFiYXNlIG9wZXJhdGlvbnMgaW50ZXJydXB0ZWQuCisKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qv
d29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmh0bWwKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5
bmMuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdl
L2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTAg
QEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL3dvcmtlci11dGls
LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+Cit2YXIgd29ya2VyOworCitmdW5jdGlvbiBsb2cobWVz
c2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29uc29sZSIpLmlubmVySFRN
TCArPSBtZXNzYWdlICsgIjxicj4iOworfQorCitmdW5jdGlvbiBmaW5pc2hUZXN0KCkKK3sKKyAg
ICBsb2coIlBBU1M6IGRhdGFiYXNlIG9wZXJhdGlvbnMgaW50ZXJydXB0ZWQuIik7CisgICAgaWYg
KHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIubm90aWZ5RG9uZSgpOworfQorCitmdW5jdGlvbiB0ZXJtaW5hdGVXb3JrZXIoKQoreworICAg
IHdvcmtlci50ZXJtaW5hdGUoKTsKKyAgICB3YWl0VW50aWxXb3JrZXJUaHJlYWRzRXhpdChmaW5p
c2hUZXN0KQorfQorCitmdW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBpZiAod2luZG93LmxheW91
dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1Rl
eHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgpOworICAg
IH0KKworICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoJ3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJh
c2Utc3luYy5qcycpOworICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkgewor
ICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PSAiZG9uZSIpCisgICAgICAgICAgICBmaW5pc2hUZXN0
KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvZyhldmVudC5kYXRhKTsKKyAgICB9Owor
CisgICAgc2V0VGltZW91dCgndGVybWluYXRlV29ya2VyKCknLCA1MDApOworfQorPC9zY3JpcHQ+
Cis8L2hlYWQ+CisKKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KK1RoaXMgdGVzdCBtYWtlcyBz
dXJlIHRoYXQgYWxsIHN5bmMgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50
ZXJydXB0ZWQgd2hlbiB0aGUgd29ya2VyIG5lZWRzIHRvIHRlcm1pbmF0ZS4KKzxwcmUgaWQ9ImNv
bnNvbGUiPgorPC9wcmU+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbAko
cmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVw
dC1kYXRhYmFzZS5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUwIEBACis8aHRtbD4KKzxo
ZWFkPgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy93b3JrZXItdXRpbC5qcyI+PC9zY3JpcHQ+
Cis8c2NyaXB0PgordmFyIHdvcmtlcjsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAg
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSAr
ICI8YnI+IjsKK30KKworZnVuY3Rpb24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJQQVNTOiBk
YXRhYmFzZSBvcGVyYXRpb25zIGludGVycnVwdGVkLiIpOworICAgIGlmICh3aW5kb3cubGF5b3V0
VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUo
KTsKK30KKworZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKCkKK3sKKyAgICB3b3JrZXIudGVybWlu
YXRlKCk7CisgICAgd2FpdFVudGlsV29ya2VyVGhyZWFkc0V4aXQoZmluaXNoVGVzdCkKK30KKwor
ZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxl
cikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAg
IGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisKKyAgICB3b3Jr
ZXIgPSBuZXcgV29ya2VyKCdyZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLmpzJyk7CisgICAg
d29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5k
YXRhID09ICJkb25lIikKKyAgICAgICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgbG9nKGV2ZW50LmRhdGEpOworICAgIH07CisKKyAgICBzZXRUaW1lb3V0KCd0
ZXJtaW5hdGVXb3JrZXIoKScsIDUwMCk7Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkg
b25sb2FkPSJydW5UZXN0KCkiPgorVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgYXN5bmMg
ZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0aGUg
d29ya2VyIG5lZWRzIHRvIHRlcm1pbmF0ZS4KKzxwcmUgaWQ9ImNvbnNvbGUiPgorPC9wcmU+Cis8
L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9y
ZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1z
eW5jLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2Uv
cmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmpzCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDggQEAKK3ZhciBkYiA9IG9wZW5EYXRhYmFzZVN5bmMoIkludGVycnVwdERhdGFiYXNlVGVz
dCIsICIxIiwgIiIsIDEpOworZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsKKyAgICB0eC5l
eGVjdXRlU3FsKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBUZXN0IChGb28gSU5UKSIpOwor
ICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIC8vIFB1dCBib3RoIHN0YXRlbWVudHMgb24gdGhl
IHNhbWUgbGluZSwgdG8gbWFrZSBzdXJlIHRoZSBleGNlcHRpb24gaXMgYWx3YXlzIHJlcG9ydGVk
IG9uIHRoZSBzYW1lIGxpbmUuCisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIFRl
c3QgVkFMVUVTICgxKSIpOyB0eC5leGVjdXRlU3FsKCJERUxFVEUgRlJPTSBUZXN0IFdIRVJFIEZv
byA9IDEiKTsKKyAgICB9Cit9KTsKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9y
YWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2UuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS5q
cwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291
cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2UuanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQgQEAK
K2Z1bmN0aW9uIHJ1blRyYW5zYWN0aW9ucygpCit7CisgICAgZGIudHJhbnNhY3Rpb24oZnVuY3Rp
b24odHgpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHR4LmV4ZWN1dGVT
cWwoIklOU0VSVCBJTlRPIFRlc3QgVkFMVUVTICgxKSIpOworICAgICAgICAgICAgdHguZXhlY3V0
ZVNxbCgiREVMRVRFIEZST00gVGVzdCBXSEVSRSBGb28gPSAxIik7CisgICAgICAgIH0KKyAgICB9
KTsKK30KKwordmFyIGRiID0gb3BlbkRhdGFiYXNlU3luYygiSW50ZXJydXB0RGF0YWJhc2VUZXN0
IiwgIjEiLCAiIiwgMSk7CitkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeworICAgIHR4LmV4
ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFRlc3QgKEZvbyBJTlQpIik7Cit9
LCBudWxsLCBmdW5jdGlvbigpIHsgcnVuVHJhbnNhY3Rpb25zKCk7IH0pOwo=
</data>
<flag name="commit-queue"
          id="50723"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62596</attachid>
            <date>2010-07-26 12:53:31 -0700</date>
            <delta_ts>2010-07-28 02:15:18 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>19441</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDA2MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzUgQEAKKzIwMTAtMDctMjYgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBJbnRlcnJ1cHQgYWxsIERCIG9wZXJhdGlvbnMgd2hlbiBhIHdv
cmtlciBpcyB0ZXJtaW5hdGVkLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDI4NDMKKworICAgICAgICBUZXN0czogZmFzdC93b3JrZXJzL3N0b3JhZ2Uv
aW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAorICAgICAgICAgICAgICAgZmFzdC93b3JrZXJz
L3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwKKworICAgICAgICAqIHBsYXRmb3JtL3Nx
bC9TUUxpdGVEYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6
U1FMaXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OmludGVy
cnVwdCk6CisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmg6CisgICAgICAg
IChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6aXNJbnRlcnJ1cHRlZCk6CisgICAgICAgIChXZWJD
b3JlOjpTUUxpdGVEYXRhYmFzZTo6ZGF0YWJhc2VNdXRleCk6CisgICAgICAgICogcGxhdGZvcm0v
c3FsL1NRTGl0ZVN0YXRlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ6OnByZXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50OjpzdGVwKToK
KyAgICAgICAgKiBzdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6QWJzdHJhY3REYXRhYmFzZTo6aW50ZXJydXB0KToKKyAgICAgICAgKiBzdG9yYWdlL0Fic3Ry
YWN0RGF0YWJhc2UuaDoKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0Zv
ckNvbnRleHQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmg6CisgICAgICAg
ICogc3RvcmFnZS9TUUxTdGF0ZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVt
ZW50OjpleGVjdXRlKToKKyAgICAgICAgKiBzdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVtZW50U3luYzo6ZXhlY3V0ZSk6CisgICAgICAgICog
c3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQp
OgorICAgICAgICAqIHdvcmtlcnMvV29ya2VyVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OldvcmtlclRocmVhZDo6c3RvcCk6CisKIDIwMTAtMDctMjYgIFBhdHJpY2sgR2Fuc3RlcmVyICA8
cGFyb2dhQHBhcm9nYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VudCBUYW11cmEuCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA2NDA2
MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDIsNiArNDIsNyBAQCBjb25zdCBpbnQgU1FMUmVzdWx0T2sgPSBTUUxJVEVfT0s7
CiBjb25zdCBpbnQgU1FMUmVzdWx0Um93ID0gU1FMSVRFX1JPVzsKIGNvbnN0IGludCBTUUxSZXN1
bHRTY2hlbWEgPSBTUUxJVEVfU0NIRU1BOwogY29uc3QgaW50IFNRTFJlc3VsdEZ1bGwgPSBTUUxJ
VEVfRlVMTDsKK2NvbnN0IGludCBTUUxSZXN1bHRJbnRlcnJ1cHQgPSBTUUxJVEVfSU5URVJSVVBU
OwogCiAKIFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCkBAIC01MCw2ICs1MSw3IEBA
IFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAgLCBtX3RyYW5zYWN0aW9uSW5Q
cm9ncmVzcyhmYWxzZSkKICAgICAsIG1fc2hhcmFibGUoZmFsc2UpCiAgICAgLCBtX29wZW5pbmdU
aHJlYWQoMCkKKyAgICAsIG1faW50ZXJydXB0ZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTkyLDYgKzk0
LDI0IEBAIHZvaWQgU1FMaXRlRGF0YWJhc2U6OmNsb3NlKCkKICAgICBtX29wZW5pbmdUaHJlYWQg
PSAwOwogfQogCit2b2lkIFNRTGl0ZURhdGFiYXNlOjppbnRlcnJ1cHQoKQoreworICAgIGlmICgh
bV9kYikKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKCFtX2xvY2tpbmdNdXRleC50cnlM
b2NrKCkpCisgICAgICAgIHNxbGl0ZTNfaW50ZXJydXB0KG1fZGIpOworCisgICAgbV9pbnRlcnJ1
cHRlZCA9IHRydWU7CisgICAgbV9sb2NraW5nTXV0ZXgudW5sb2NrKCk7Cit9CisKK2Jvb2wgU1FM
aXRlRGF0YWJhc2U6OmlzSW50ZXJydXB0ZWQoKQoreworICAgIEFTU0VSVCghbV9sb2NraW5nTXV0
ZXgudHJ5TG9jaygpKTsKKyAgICByZXR1cm4gbV9pbnRlcnJ1cHRlZDsKK30KKwogdm9pZCBTUUxp
dGVEYXRhYmFzZTo6c2V0RnVsbHN5bmMoYm9vbCBmc3luYykgCiB7CiAgICAgaWYgKGZzeW5jKSAK
QEAgLTM5NywxNiArNDE3LDYgQEAgdm9pZCBTUUxpdGVEYXRhYmFzZTo6ZW5hYmxlQXV0aG9yaXpl
cihibwogICAgICAgICBzcWxpdGUzX3NldF9hdXRob3JpemVyKG1fZGIsIE5VTEwsIDApOwogfQog
Ci12b2lkIFNRTGl0ZURhdGFiYXNlOjpsb2NrKCkKLXsKLSAgICBtX2xvY2tpbmdNdXRleC5sb2Nr
KCk7Ci19Ci0KLXZvaWQgU1FMaXRlRGF0YWJhc2U6OnVubG9jaygpCi17Ci0gICAgbV9sb2NraW5n
TXV0ZXgudW5sb2NrKCk7Ci19Ci0KIGJvb2wgU1FMaXRlRGF0YWJhc2U6OmlzQXV0b0NvbW1pdE9u
KCkgY29uc3QKIHsKICAgICByZXR1cm4gc3FsaXRlM19nZXRfYXV0b2NvbW1pdChtX2RiKTsKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkocmV2aXNpb24gNjQwNjIpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC00OCw2ICs0OCw3IEBAIGV4dGVybiBjb25zdCBpbnQgU1FMUmVzdWx0T2s7CiBleHRlcm4gY29u
c3QgaW50IFNRTFJlc3VsdFJvdzsKIGV4dGVybiBjb25zdCBpbnQgU1FMUmVzdWx0U2NoZW1hOwog
ZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1bHRGdWxsOworZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1
bHRJbnRlcnJ1cHQ7CiAKIGNsYXNzIFNRTGl0ZURhdGFiYXNlIDogcHVibGljIE5vbmNvcHlhYmxl
IHsKICAgICBmcmllbmQgY2xhc3MgU1FMaXRlVHJhbnNhY3Rpb247CkBAIC01OCw2ICs1OSw4IEBA
IHB1YmxpYzoKICAgICBib29sIG9wZW4oY29uc3QgU3RyaW5nJiBmaWxlbmFtZSwgYm9vbCBmb3JX
ZWJTUUxEYXRhYmFzZSA9IGZhbHNlKTsKICAgICBib29sIGlzT3BlbigpIGNvbnN0IHsgcmV0dXJu
IG1fZGI7IH0KICAgICB2b2lkIGNsb3NlKCk7CisgICAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgICBi
b29sIGlzSW50ZXJydXB0ZWQoKTsKIAogICAgIGJvb2wgZXhlY3V0ZUNvbW1hbmQoY29uc3QgU3Ry
aW5nJik7CiAgICAgYm9vbCByZXR1cm5zQXRMZWFzdE9uZVJlc3VsdChjb25zdCBTdHJpbmcmKTsK
QEAgLTEwNSw5ICsxMDgsNyBAQCBwdWJsaWM6CiAgICAgCiAgICAgdm9pZCBzZXRBdXRob3JpemVy
KFBhc3NSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVyPik7CiAKLSAgICAvLyAodW4pbG9ja3MgdGhl
IGRhdGFiYXNlIGxpa2UgYSBtdXRleAotICAgIHZvaWQgbG9jaygpOwotICAgIHZvaWQgdW5sb2Nr
KCk7CisgICAgTXV0ZXgmIGRhdGFiYXNlTXV0ZXgoKSB7IHJldHVybiBtX2xvY2tpbmdNdXRleDsg
fQogICAgIGJvb2wgaXNBdXRvQ29tbWl0T24oKSBjb25zdDsKIAogICAgIC8vIFRoZSBTUUxpdGUg
QVVUT19WQUNVVU0gcHJhZ21hIGNhbiBiZSBlaXRoZXIgTk9ORSwgRlVMTCwgb3IgSU5DUkVNRU5U
QUwuCkBAIC0xNDksNyArMTUwLDggQEAgcHJpdmF0ZToKIAogICAgIE11dGV4IG1fbG9ja2luZ011
dGV4OwogICAgIFRocmVhZElkZW50aWZpZXIgbV9vcGVuaW5nVGhyZWFkOwotICAgIAorCisgICAg
Ym9vbCBtX2ludGVycnVwdGVkOwogfTsgLy8gY2xhc3MgU1FMaXRlRGF0YWJhc2UKIAogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3RhdGVt
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVTdGF0ZW1l
bnQuY3BwCShyZXZpc2lvbiA2NDA2MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0
YXRlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYxLDYgKzYxLDExIEBAIFNRTGl0ZVN0YXRl
bWVudDo6flNRTGl0ZVN0YXRlbWVudCgpCiBpbnQgU1FMaXRlU3RhdGVtZW50OjpwcmVwYXJlKCkK
IHsKICAgICBBU1NFUlQoIW1faXNQcmVwYXJlZCk7CisKKyAgICBNdXRleExvY2tlciBkYXRhYmFz
ZUxvY2sobV9kYXRhYmFzZS5kYXRhYmFzZU11dGV4KCkpOworICAgIGlmIChtX2RhdGFiYXNlLmlz
SW50ZXJydXB0ZWQoKSkKKyAgICAgICAgcmV0dXJuIFNRTElURV9JTlRFUlJVUFQ7CisKICAgICBj
b25zdCB2b2lkKiB0YWlsID0gMDsKICAgICBMT0coU1FMRGF0YWJhc2UsICJTUUwgLSBwcmVwYXJl
IC0gJXMiLCBtX3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKICAgICBTdHJpbmcgc3RyaXBwZWRRdWVy
eSA9IG1fcXVlcnkuc3RyaXBXaGl0ZVNwYWNlKCk7CkBAIC04OCw2ICs5MywxMSBAQCBpbnQgU1FM
aXRlU3RhdGVtZW50OjpwcmVwYXJlKCkKIGludCBTUUxpdGVTdGF0ZW1lbnQ6OnN0ZXAoKQogewog
ICAgIEFTU0VSVChtX2lzUHJlcGFyZWQpOworCisgICAgTXV0ZXhMb2NrZXIgZGF0YWJhc2VMb2Nr
KG1fZGF0YWJhc2UuZGF0YWJhc2VNdXRleCgpKTsKKyAgICBpZiAobV9kYXRhYmFzZS5pc0ludGVy
cnVwdGVkKCkpCisgICAgICAgIHJldHVybiBTUUxJVEVfSU5URVJSVVBUOworCiAgICAgaWYgKCFt
X3N0YXRlbWVudCkKICAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKICAgICBMT0coU1FMRGF0YWJh
c2UsICJTUUwgLSBzdGVwIC0gJXMiLCBtX3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3N0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5jcHAJKHJldmlzaW9uIDY0MDYyKQorKysgV2ViQ29y
ZS9zdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NzQsNiAr
NDc0LDExIEBAIHZvaWQgQWJzdHJhY3REYXRhYmFzZTo6aW5jcmVtZW50YWxWYWN1dW0KICAgICAg
ICAgbV9zcWxpdGVEYXRhYmFzZS5ydW5JbmNyZW1lbnRhbFZhY3V1bUNvbW1hbmQoKTsKIH0KIAor
dm9pZCBBYnN0cmFjdERhdGFiYXNlOjppbnRlcnJ1cHQoKQoreworICAgIG1fc3FsaXRlRGF0YWJh
c2UuaW50ZXJydXB0KCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8v
IEVOQUJMRShEQVRBQkFTRSkKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuaAkocmV2
aXNpb24gNjQwNjIpCisrKyBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC02OCw2ICs2OCw3IEBAIHB1YmxpYzoKIAogICAgIHVuc2lnbmVkIGxvbmcg
bG9uZyBtYXhpbXVtU2l6ZSgpIGNvbnN0OwogICAgIHZvaWQgaW5jcmVtZW50YWxWYWN1dW1JZk5l
ZWRlZCgpOworICAgIHZvaWQgaW50ZXJydXB0KCk7CiAKICAgICAvLyBGSVhNRTogbW92ZSBhbGwg
dmVyc2lvbi1yZWxhdGVkIG1ldGhvZHMgdG8gYSBEYXRhYmFzZVZlcnNpb25UcmFja2VyIGNsYXNz
CiAgICAgYm9vbCB2ZXJzaW9uTWF0Y2hlc0V4cGVjdGVkKCkgY29uc3Q7CkluZGV4OiBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUcmFja2VyLmNwcAkocmV2aXNpb24gNjQwNjIpCisrKyBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUcmFja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjM1LDYgKzIzNSwzMiBA
QCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VDaGFuZ2VkKEFiCiAgICAgb3JpZ2luUXVv
dGFNYW5hZ2VyKCkubWFya0RhdGFiYXNlKGRhdGFiYXNlKTsKIH0KIAordm9pZCBEYXRhYmFzZVRy
YWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQoY29uc3QgU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0YWJh
c2U+ID4gb3BlbkRhdGFiYXNlczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIG9wZW5EYXRh
YmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CisKKyAgICAgICAgaWYgKG1fb3Bl
bkRhdGFiYXNlTWFwKSB7CisgICAgICAgICAgICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBt
X29wZW5EYXRhYmFzZU1hcC0+Z2V0KGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgICAg
ICAgICAgaWYgKG5hbWVNYXApIHsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZU5hbWVNYXA6OmNv
bnN0X2l0ZXJhdG9yIGRiTmFtZU1hcEVuZEl0ID0gbmFtZU1hcC0+ZW5kKCk7CisgICAgICAgICAg
ICAgICAgZm9yIChEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGRiTmFtZU1hcEl0ID0g
bmFtZU1hcC0+YmVnaW4oKTsgZGJOYW1lTWFwSXQgIT0gZGJOYW1lTWFwRW5kSXQ7ICsrZGJOYW1l
TWFwSXQpIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VTZXQqIGRhdGFiYXNlU2V0ID0g
ZGJOYW1lTWFwSXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VTZXQ6OmNv
bnN0X2l0ZXJhdG9yIGRiU2V0RW5kSXQgPSBkYXRhYmFzZVNldC0+ZW5kKCk7CisgICAgICAgICAg
ICAgICAgICAgIGZvciAoRGF0YWJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGRiU2V0SXQgPSBkYXRh
YmFzZVNldC0+YmVnaW4oKTsgZGJTZXRJdCAhPSBkYlNldEVuZEl0OyArK2RiU2V0SXQpCisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoKCpkYlNldEl0KS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4
dCgpID09IGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbkRhdGFiYXNl
cy5hcHBlbmQoKmRiU2V0SXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKworICAgIFZlY3RvcjxSZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPjo6
Y29uc3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNlc0VuZEl0ID0gb3BlbkRhdGFiYXNlcy5lbmQoKTsK
KyAgICBmb3IgKFZlY3RvcjxSZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPjo6Y29uc3RfaXRlcmF0
b3Igb3BlbkRhdGFiYXNlc0l0ID0gb3BlbkRhdGFiYXNlcy5iZWdpbigpOyBvcGVuRGF0YWJhc2Vz
SXQgIT0gb3BlbkRhdGFiYXNlc0VuZEl0OyArK29wZW5EYXRhYmFzZXNJdCkKKyAgICAgICAgKCpv
cGVuRGF0YWJhc2VzSXQpLT5pbnRlcnJ1cHQoKTsKK30KKwogU3RyaW5nIERhdGFiYXNlVHJhY2tl
cjo6b3JpZ2luUGF0aChTZWN1cml0eU9yaWdpbiogb3JpZ2luKSBjb25zdAogewogICAgIHJldHVy
biBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJh
c2VEaXJlY3RvcnlQYXRoLnRocmVhZHNhZmVDb3B5KCksIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkpOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAkocmV2aXNpb24gNjQwNjIp
CisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTc4LDYgKzc4LDggQEAgcHVibGljOgogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRNYXhTaXpl
Rm9yRGF0YWJhc2UoY29uc3QgQWJzdHJhY3REYXRhYmFzZSopOwogICAgIHZvaWQgZGF0YWJhc2VD
aGFuZ2VkKEFic3RyYWN0RGF0YWJhc2UqKTsKIAorICAgIHZvaWQgaW50ZXJydXB0QWxsRGF0YWJh
c2VzRm9yQ29udGV4dChjb25zdCBTY3JpcHRFeGVjdXRpb25Db250ZXh0Kik7CisKIHByaXZhdGU6
CiAgICAgRGF0YWJhc2VUcmFja2VyKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VQYXRoKTsKIApJbmRl
eDogV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHJldmlzaW9uIDY0MDYyKQorKysgV2ViQ29yZS9z
dG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4LDcgKzc4LDcgQEAg
Ym9vbCBTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUoRGF0YWJhc2UqIGRiKQogCiAgICAgaWYgKHJlc3Vs
dCAhPSBTUUxSZXN1bHRPaykgewogICAgICAgICBMT0coU3RvcmFnZUFQSSwgIlVuYWJsZSB0byB2
ZXJpZnkgY29ycmVjdG5lc3Mgb2Ygc3RhdGVtZW50ICVzIC0gZXJyb3IgJWkgKCVzKSIsIG1fc3Rh
dGVtZW50LmFzY2lpKCkuZGF0YSgpLCByZXN1bHQsIGRhdGFiYXNlLT5sYXN0RXJyb3JNc2coKSk7
Ci0gICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKFNRTEVycm9yOjpTWU5UQVhfRVJS
LCBkYXRhYmFzZS0+bGFzdEVycm9yTXNnKCkpOworICAgICAgICBtX2Vycm9yID0gU1FMRXJyb3I6
OmNyZWF0ZShyZXN1bHQgPT0gU1FMUmVzdWx0SW50ZXJydXB0ID8gU1FMRXJyb3I6OkRBVEFCQVNF
X0VSUiA6IFNRTEVycm9yOjpTWU5UQVhfRVJSLCBkYXRhYmFzZS0+bGFzdEVycm9yTXNnKCkpOwog
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU1FM
U3RhdGVtZW50U3luYy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRl
bWVudFN5bmMuY3BwCShyZXZpc2lvbiA2NDA2MikKKysrIFdlYkNvcmUvc3RvcmFnZS9TUUxTdGF0
ZW1lbnRTeW5jLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjEsNyArNjEsNyBAQCBQYXNzUmVmUHRy
PFNRTFJlc3VsdFNldD4gU1FMU3RhdGVtZW50U3luCiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRl
bWVudCgqZGF0YWJhc2UsIG1fc3RhdGVtZW50KTsKICAgICBpbnQgcmVzdWx0ID0gc3RhdGVtZW50
LnByZXBhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdE9rKSB7Ci0gICAgICAgIGVj
ID0gU1FMRXhjZXB0aW9uOjpTWU5UQVhfRVJSOworICAgICAgICBlYyA9IChyZXN1bHQgPT0gU1FM
UmVzdWx0SW50ZXJydXB0ID8gU1FMRXhjZXB0aW9uOjpEQVRBQkFTRV9FUlIgOiBTUUxFeGNlcHRp
b246OlNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKSW5kZXg6IFdlYkNv
cmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNw
cAkocmV2aXNpb24gNjQwNjIpCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VU
cmFja2VyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzIsNCArMTcyLDMwIEBAIHVu
c2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OmdldE0KICAgICByZXR1cm4gZGF0YWJh
c2VTaXplICsgc3BhY2VBdmFpbGFibGU7CiB9CiAKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjppbnRl
cnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KGNvbnN0IFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
IGNvbnRleHQpCit7CisgICAgVmVjdG9yPFJlZlB0cjxBYnN0cmFjdERhdGFiYXNlPiA+IG9wZW5E
YXRhYmFzZXM7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2Nr
KG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworCisgICAgICAgIGlmIChtX29wZW5EYXRhYmFzZU1h
cCkgeworICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1lTWFwID0gbV9vcGVuRGF0YWJh
c2VNYXAtPmdldChjb250ZXh0LT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICAgICAgICAgIGlmIChu
YW1lTWFwKSB7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRv
ciBkYk5hbWVNYXBFbmRJdCA9IG5hbWVNYXAtPmVuZCgpOworICAgICAgICAgICAgICAgIGZvciAo
RGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVNYXBJdCA9IG5hbWVNYXAtPmJl
Z2luKCk7IGRiTmFtZU1hcEl0ICE9IGRiTmFtZU1hcEVuZEl0OyArK2RiTmFtZU1hcEl0KSB7Cisg
ICAgICAgICAgICAgICAgICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9IGRiTmFtZU1hcEl0
LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRv
ciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgpOworICAgICAgICAgICAgICAgICAgICBm
b3IgKERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEl0ID0gZGF0YWJhc2VTZXQtPmJl
Z2luKCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsgKytkYlNldEl0KQorICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCgqZGJTZXRJdCktPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSA9PSBjb250
ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5EYXRhYmFzZXMuYXBwZW5kKCpk
YlNldEl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0YWJhc2U+ID46OmNvbnN0X2l0ZXJh
dG9yIG9wZW5EYXRhYmFzZXNFbmRJdCA9IG9wZW5EYXRhYmFzZXMuZW5kKCk7CisgICAgZm9yIChW
ZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0YWJhc2U+ID46OmNvbnN0X2l0ZXJhdG9yIG9wZW5EYXRh
YmFzZXNJdCA9IG9wZW5EYXRhYmFzZXMuYmVnaW4oKTsgb3BlbkRhdGFiYXNlc0l0ICE9IG9wZW5E
YXRhYmFzZXNFbmRJdDsgKytvcGVuRGF0YWJhc2VzSXQpCisgICAgICAgICgqb3BlbkRhdGFiYXNl
c0l0KS0+aW50ZXJydXB0KCk7Cit9CisKIH0KSW5kZXg6IFdlYkNvcmUvd29ya2Vycy9Xb3JrZXJU
aHJlYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd29ya2Vycy9Xb3JrZXJUaHJlYWQuY3Bw
CShyZXZpc2lvbiA2NDA2MikKKysrIFdlYkNvcmUvd29ya2Vycy9Xb3JrZXJUaHJlYWQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCwxMCBAQAogCiAjaW5jbHVkZSAiV29ya2VyVGhyZWFk
LmgiCiAKKyNpZiBFTkFCTEUoREFUQUJBU0UpCiAjaW5jbHVkZSAiRGF0YWJhc2VUYXNrLmgiCisj
aW5jbHVkZSAiRGF0YWJhc2VUcmFja2VyLmgiCisjZW5kaWYKICNpbmNsdWRlICJEZWRpY2F0ZWRX
b3JrZXJDb250ZXh0LmgiCiAjaW5jbHVkZSAiS1VSTC5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCkBAIC0yMjUsNiArMjI4LDEwIEBAIHZvaWQgV29ya2VyVGhyZWFkOjpzdG9wKCkKICAg
ICBpZiAobV93b3JrZXJDb250ZXh0KSB7CiAgICAgICAgIG1fd29ya2VyQ29udGV4dC0+c2NyaXB0
KCktPmZvcmJpZEV4ZWN1dGlvbihXb3JrZXJTY3JpcHRDb250cm9sbGVyOjpUZXJtaW5hdGVSdW5u
aW5nU2NyaXB0KTsKIAorI2lmIEVOQUJMRShEQVRBQkFTRSkKKyAgICAgICAgRGF0YWJhc2VUcmFj
a2VyOjp0cmFja2VyKCkuaW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dChtX3dvcmtlckNv
bnRleHQuZ2V0KCkpOworI2VuZGlmCisKICAgICAvLyBGSVhNRTogUnVkZWx5IGtpbGxpbmcgdGhl
IHRocmVhZCB3b24ndCB3b3JrIHdoZW4gd2UgYWxsb3cgbmVzdGVkIHdvcmtlcnMsIGJlY2F1c2Ug
dGhleSB3aWxsIHRyeSB0byBwb3N0IG5vdGlmaWNhdGlvbnMgb2YgdGhlaXIgZGVzdHJ1Y3Rpb24u
CiAgICAgLy8gVGhpcyBjYW4gbGlrZWx5IHVzZSB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdXNlZCBm
b3IgZGF0YWJhc2VzIGFib3ZlLgogCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NDA2MikKKysrIExheW91
dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE5IEBACisyMDEwLTA3
LTI2ICBEdW1pdHJ1IERhbmlsaXVjICA8ZHVtaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdCB0aGF0IGFsbCBEQiBvcGVy
YXRpb25zIGFyZSBpbnRlcnJ1cHRlZCB3aGVuIGEgd29ya2VyIGlzIHRlcm1pbmF0ZWQuCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Mjg0MworCisgICAg
ICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLWV4cGVjdGVkLnR4
dDogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFi
YXNlLXN5bmMtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3Rv
cmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbDogQWRkZWQuCisgICAgICAg
ICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1zeW5j
LmpzOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50
ZXJydXB0LWRhdGFiYXNlLmpzOiBBZGRlZC4KKyAgICAgICAgKHJ1blRyYW5zYWN0aW9ucyk6Cisg
ICAgICAgICh2YXIpOgorCiAyMDEwLTA3LTI2ICBWaWN0b3IgV2FuZyAgPHZpY3RvcndAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQuIFVwZGF0ZSBjaHJvbWl1bSB0ZXN0IGV4cGVj
dGF0aW9ucyBmcm8gZmxha3kgdGVzdC4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9z
dG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLWV4cGVjdGVk
LnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2lu
dGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMyBA
QAorVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgYXN5bmMgZGF0YWJhc2Ugb3BlcmF0aW9u
cyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0aGUgd29ya2VyIG5lZWRzIHRvIHRl
cm1pbmF0ZS4KK1BBU1M6IGRhdGFiYXNlIG9wZXJhdGlvbnMgaW50ZXJydXB0ZWQuCisKSW5kZXg6
IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1zeW5j
LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3Rv
cmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisr
KyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3lu
Yy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNSBAQAorQ09OU09MRSBNRVNT
QUdFOiBsaW5lIDY6IERBVEFCQVNFX0VSUjogRE9NIFNRTCBFeGNlcHRpb24gMTogVGhlIG9wZXJh
dGlvbiBmYWlsZWQgZm9yIHNvbWUgcmVhc29uIHJlbGF0ZWQgdG8gdGhlIGRhdGFiYXNlLgorQ09O
U09MRSBNRVNTQUdFOiBsaW5lIDg6IFVOS05PV05fRVJSOiBET00gU1FMIEV4Y2VwdGlvbiAwOiBU
aGUgb3BlcmF0aW9uIGZhaWxlZCBmb3IgcmVhc29ucyB1bnJlbGF0ZWQgdG8gdGhlIGRhdGFiYXNl
LgorVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgc3luYyBkYXRhYmFzZSBvcGVyYXRpb25z
IGFyZSBpbW1lZGlhdGVseSBpbnRlcnJ1cHRlZCB3aGVuIHRoZSB3b3JrZXIgbmVlZHMgdG8gdGVy
bWluYXRlLgorUEFTUzogZGF0YWJhc2Ugb3BlcmF0aW9ucyBpbnRlcnJ1cHRlZC4KKwpJbmRleDog
TGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMu
aHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRl
cnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFz
dC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw1MCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9yZXNv
dXJjZXMvd29ya2VyLXV0aWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdD4KK3ZhciB3b3JrZXI7CisK
K2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJj
b25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZp
bmlzaFRlc3QoKQoreworICAgIGxvZygiUEFTUzogZGF0YWJhc2Ugb3BlcmF0aW9ucyBpbnRlcnJ1
cHRlZC4iKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBs
YXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIHRlcm1pbmF0
ZVdvcmtlcigpCit7CisgICAgd29ya2VyLnRlcm1pbmF0ZSgpOworICAgIHdhaXRVbnRpbFdvcmtl
clRocmVhZHNFeGl0KGZpbmlzaFRlc3QpCit9CisKK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAg
IGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENv
bnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0
VW50aWxEb25lKCk7CisgICAgfQorCisgICAgd29ya2VyID0gbmV3IFdvcmtlcigncmVzb3VyY2Vz
L2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmpzJyk7CisgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1
bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5kYXRhID09ICJkb25lIikKKyAgICAg
ICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9nKGV2ZW50
LmRhdGEpOworICAgIH07CisKKyAgICBzZXRUaW1lb3V0KCd0ZXJtaW5hdGVXb3JrZXIoKScsIDUw
MCk7Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkgb25sb2FkPSJydW5UZXN0KCkiPgor
VGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgc3luYyBkYXRhYmFzZSBvcGVyYXRpb25zIGFy
ZSBpbW1lZGlhdGVseSBpbnRlcnJ1cHRlZCB3aGVuIHRoZSB3b3JrZXIgbmVlZHMgdG8gdGVybWlu
YXRlLgorPHByZSBpZD0iY29uc29sZSI+Cis8L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6
IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS5odG1s
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVw
dC1kYXRhYmFzZS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJz
L3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
NTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL3dvcmtlci11
dGlsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+Cit2YXIgd29ya2VyOworCitmdW5jdGlvbiBsb2co
bWVzc2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29uc29sZSIpLmlubmVy
SFRNTCArPSBtZXNzYWdlICsgIjxicj4iOworfQorCitmdW5jdGlvbiBmaW5pc2hUZXN0KCkKK3sK
KyAgICBsb2coIlBBU1M6IGRhdGFiYXNlIG9wZXJhdGlvbnMgaW50ZXJydXB0ZWQuIik7CisgICAg
aWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIubm90aWZ5RG9uZSgpOworfQorCitmdW5jdGlvbiB0ZXJtaW5hdGVXb3JrZXIoKQorewor
ICAgIHdvcmtlci50ZXJtaW5hdGUoKTsKKyAgICB3YWl0VW50aWxXb3JrZXJUaHJlYWRzRXhpdChm
aW5pc2hUZXN0KQorfQorCitmdW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBpZiAod2luZG93Lmxh
eW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBB
c1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgpOwor
ICAgIH0KKworICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoJ3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0
YWJhc2UuanMnKTsKKyAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHsKKyAg
ICAgICAgaWYgKGV2ZW50LmRhdGEgPT0gImRvbmUiKQorICAgICAgICAgICAgZmluaXNoVGVzdCgp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2coZXZlbnQuZGF0YSk7CisgICAgfTsKKwor
ICAgIHNldFRpbWVvdXQoJ3Rlcm1pbmF0ZVdvcmtlcigpJywgNTAwKTsKK30KKzwvc2NyaXB0Pgor
PC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+CitUaGlzIHRlc3QgbWFrZXMgc3Vy
ZSB0aGF0IGFsbCBhc3luYyBkYXRhYmFzZSBvcGVyYXRpb25zIGFyZSBpbW1lZGlhdGVseSBpbnRl
cnJ1cHRlZCB3aGVuIHRoZSB3b3JrZXIgbmVlZHMgdG8gdGVybWluYXRlLgorPHByZSBpZD0iY29u
c29sZSI+Cis8L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qv
d29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50
ZXJydXB0LWRhdGFiYXNlLXN5bmMuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0
L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuanMJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsOCBAQAordmFyIGRiID0gb3BlbkRhdGFiYXNlU3luYygiSW50
ZXJydXB0RGF0YWJhc2VUZXN0IiwgIjEiLCAiIiwgMSk7CitkYi50cmFuc2FjdGlvbihmdW5jdGlv
bih0eCkgeworICAgIHR4LmV4ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFRl
c3QgKEZvbyBJTlQpIik7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gUHV0IGJvdGgg
c3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lLCB0byBtYWtlIHN1cmUgdGhlIGV4Y2VwdGlvbiBp
cyBhbHdheXMgcmVwb3J0ZWQgb24gdGhlIHNhbWUgbGluZS4KKyAgICAgICAgdHguZXhlY3V0ZVNx
bCgiSU5TRVJUIElOVE8gVGVzdCBWQUxVRVMgKDEpIik7IHR4LmV4ZWN1dGVTcWwoIkRFTEVURSBG
Uk9NIFRlc3QgV0hFUkUgRm9vID0gMSIpOworICAgIH0KK30pOwpJbmRleDogTGF5b3V0VGVzdHMv
ZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50
ZXJydXB0LWRhdGFiYXNlLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3Jr
ZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS5qcwkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxNCBAQAorZnVuY3Rpb24gcnVuVHJhbnNhY3Rpb25zKCkKK3sKKyAgICBkYi50
cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAg
ICAgICAgdHguZXhlY3V0ZVNxbCgiSU5TRVJUIElOVE8gVGVzdCBWQUxVRVMgKDEpIik7CisgICAg
ICAgICAgICB0eC5leGVjdXRlU3FsKCJERUxFVEUgRlJPTSBUZXN0IFdIRVJFIEZvbyA9IDEiKTsK
KyAgICAgICAgfQorICAgIH0pOworfQorCit2YXIgZGIgPSBvcGVuRGF0YWJhc2VTeW5jKCJJbnRl
cnJ1cHREYXRhYmFzZVRlc3QiLCAiMSIsICIiLCAxKTsKK2RiLnRyYW5zYWN0aW9uKGZ1bmN0aW9u
KHR4KSB7CisgICAgdHguZXhlY3V0ZVNxbCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgVGVz
dCAoRm9vIElOVCkiKTsKK30sIG51bGwsIGZ1bmN0aW9uKCkgeyBydW5UcmFuc2FjdGlvbnMoKTsg
fSk7Cg==
</data>
<flag name="review"
          id="50824"
          type_id="1"
          status="-"
          setter="levin"
    />
    <flag name="commit-queue"
          id="50825"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62804</attachid>
            <date>2010-07-28 02:15:18 -0700</date>
            <delta_ts>2010-07-28 18:22:31 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>34014</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0MTkyKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTggQEAKKzIwMTAtMDctMjggIER1bWl0cnUg
RGFuaWxpdWMgIDxkdW1pQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBBZGRlZCBhIHlpZWxkKCkgZnVuY3Rpb24uCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Mjg0MworCisgICAgICAg
ICogSmF2YVNjcmlwdENvcmUuZXhwOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnZjcHJvai9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5kZWY6CisgICAgICAgICogd3RmL1RocmVhZGlu
Zy5oOgorICAgICAgICAqIHd0Zi9UaHJlYWRpbmdQdGhyZWFkcy5jcHA6CisgICAgICAgIChXVEY6
OnlpZWxkKToKKyAgICAgICAgKiB3dGYvVGhyZWFkaW5nV2luLmNwcDoKKyAgICAgICAgKFdURjo6
eWllbGQpOgorCiAyMDEwLTA3LTI3ICBLaW51a28gWWFzdWRhICA8a2ludWtvQGNocm9taXVtLm9y
Zz4KIAogICAgICAgICBSZXZpZXdlZCBieSBPamFuIFZhZmFpLgpJbmRleDogSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUuZXhwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLmV4cAkocmV2aXNpb24gNjQxOTIpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS5leHAJKHdvcmtpbmcgY29weSkKQEAgLTM2Nyw2ICszNjcsNyBAQCBfX1pOM1dURjVN
dXRleDZ1bmxvY2tFdgogX19aTjNXVEY1TXV0ZXg3dHJ5TG9ja0V2CiBfX1pOM1dURjVNdXRleEMx
RXYKIF9fWk4zV1RGNU11dGV4RDFFdgorX19aTjNXVEY1eWllbGRFdgogX19aTjNXVEY2c3RydG9k
RVBLY1BQYwogX19aTjNXVEY3Q1N0cmluZzExbXV0YWJsZURhdGFFdgogX19aTjNXVEY3Q1N0cmlu
ZzE2bmV3VW5pbml0aWFsaXplZEVtUlBjCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZGVmCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS5kZWYJKHJldmlzaW9uIDY0MTkyKQorKysgSmF2YVNjcmlwdENvcmUvSmF2
YVNjcmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmRlZgkod29y
a2luZyBjb3B5KQpAQCAtMzMwLDYgKzMzMCw3IEBAIEVYUE9SVFMKICAgICA/d2FpdEBUaHJlYWRD
b25kaXRpb25AV1RGQEBRQUVYQUFWTXV0ZXhAMkBAWgogICAgID93YWl0Rm9yVGhyZWFkQ29tcGxl
dGlvbkBXVEZAQFlBSElQQVBBWEBaCiAgICAgP3dyaXRhYmxlQFByb3BlcnR5RGVzY3JpcHRvckBK
U0NAQFFCRV9OWFoKKyAgICA/eWllbGRAV1RGQEBZQVhYWgogICAgIFdURkxvZwogICAgIFdURkxv
Z1ZlcmJvc2UKICAgICBXVEZSZXBvcnRBcmd1bWVudEFzc2VydGlvbkZhaWx1cmUKSW5kZXg6IEph
dmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29y
ZS93dGYvVGhyZWFkaW5nLmgJKHJldmlzaW9uIDY0MTkyKQorKysgSmF2YVNjcmlwdENvcmUvd3Rm
L1RocmVhZGluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDEsNiArMTAxLDcgQEAgVGhyZWFkSWRl
bnRpZmllciBjdXJyZW50VGhyZWFkKCk7CiBpbnQgd2FpdEZvclRocmVhZENvbXBsZXRpb24oVGhy
ZWFkSWRlbnRpZmllciwgdm9pZCoqKTsKIHZvaWQgZGV0YWNoVGhyZWFkKFRocmVhZElkZW50aWZp
ZXIpOwogCit2b2lkIHlpZWxkKCk7CiAKIHZvaWQgbG9ja0F0b21pY2FsbHlJbml0aWFsaXplZFN0
YXRpY011dGV4KCk7CiB2b2lkIHVubG9ja0F0b21pY2FsbHlJbml0aWFsaXplZFN0YXRpY011dGV4
KCk7CkBAIC0xMTIsNSArMTEzLDYgQEAgdXNpbmcgV1RGOjpjcmVhdGVUaHJlYWQ7CiB1c2luZyBX
VEY6OmN1cnJlbnRUaHJlYWQ7CiB1c2luZyBXVEY6OmRldGFjaFRocmVhZDsKIHVzaW5nIFdURjo6
d2FpdEZvclRocmVhZENvbXBsZXRpb247Cit1c2luZyBXVEY6OnlpZWxkOwogCiAjZW5kaWYgLy8g
VGhyZWFkaW5nX2gKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmdQdGhyZWFkcy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL1RocmVhZGluZ1B0aHJlYWRzLmNw
cAkocmV2aXNpb24gNjQxOTIpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvVGhyZWFkaW5nUHRocmVh
ZHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0NCw3IEBACiAKICNpZiAhQ09NUElMRVIo
TVNWQykKICNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgogI2luY2x1ZGUg
PHN5cy90aW1lLmg+CiAjZW5kaWYKIApAQCAtMjIxLDYgKzIyMiwxMSBAQCB2b2lkIGRldGFjaFRo
cmVhZChUaHJlYWRJZGVudGlmaWVyIHRocmVhCiAgICAgcHRocmVhZF9kZXRhY2gocHRocmVhZEhh
bmRsZSk7CiB9CiAKK3ZvaWQgeWllbGQoKQoreworICAgIHNjaGVkX3lpZWxkKCk7Cit9CisKIFRo
cmVhZElkZW50aWZpZXIgY3VycmVudFRocmVhZCgpCiB7CiAgICAgVGhyZWFkSWRlbnRpZmllciBp
ZCA9IFRocmVhZElkZW50aWZpZXJEYXRhOjppZGVudGlmaWVyKCk7CkluZGV4OiBKYXZhU2NyaXB0
Q29yZS93dGYvVGhyZWFkaW5nV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93
dGYvVGhyZWFkaW5nV2luLmNwcAkocmV2aXNpb24gNjQxOTIpCisrKyBKYXZhU2NyaXB0Q29yZS93
dGYvVGhyZWFkaW5nV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjY2LDYgKzI2NiwxMSBAQCB2
b2lkIGRldGFjaFRocmVhZChUaHJlYWRJZGVudGlmaWVyIHRocmVhCiAgICAgY2xlYXJUaHJlYWRI
YW5kbGVGb3JJZGVudGlmaWVyKHRocmVhZElEKTsKIH0KIAordm9pZCB5aWVsZCgpCit7CisgICAg
OjpTd2l0Y2hUb1RocmVhZCgpOworfQorCiBUaHJlYWRJZGVudGlmaWVyIGN1cnJlbnRUaHJlYWQo
KQogewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxUaHJlYWRJZGVudGlmaWVyPihHZXRDdXJyZW50
VGhyZWFkSWQoKSk7CkluZGV4OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNjQxOTIpCisrKyBXZWJDb3JlL0NoYW5nZUxvZwkod29y
a2luZyBjb3B5KQpAQCAtMSwzICsxLDg5IEBACisyMDEwLTA3LTI4ICBEdW1pdHJ1IERhbmlsaXVj
ICA8ZHVtaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgSW50ZXJydXB0IGFsbCBEQiBvcGVyYXRpb25zIHdoZW4gdGhlIHdvcmtl
ciBpcyB0ZXJtaW5hdGluZy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTQyODQzCisKKyAgICAgICAgVGVzdHM6IGZhc3Qvd29ya2Vycy9zdG9yYWdlL2lu
dGVycnVwdC1kYXRhYmFzZS1zeW5jLmh0bWwKKyAgICAgICAgICAgICAgIGZhc3Qvd29ya2Vycy9z
dG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS5odG1sCisKKyAgICAgICAgKiBiaW5kaW5ncy9qcy9K
U0N1c3RvbVZvaWRDYWxsYmFjay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpKU0N1c3RvbVZvaWRD
YWxsYmFjazo6fkpTQ3VzdG9tVm9pZENhbGxiYWNrKTogSWYgdGhlCisgICAgICAgIGRlc3RydWN0
b3IgaXMgY2FsbGVkIG9uIHRoZSBjb250ZXh0IHRocmVhZCwgZGVsZXRlIG1fZGF0YSBkaXJlY3Rs
eQorICAgICAgICBpbnN0ZWFkIG9mIHBvc3RpbmcgYSB0YXNrIHRvIGRvIHRoYXQuIFdlIG5lZWQg
dG8gZG8gdGhhdCB0byBtYWtlCisgICAgICAgIHN1cmUgdGhhdCBhbGwgSlMgb2JqZWN0cyBhcmUg
ZGVzdHJveWVkIGJlZm9yZQorICAgICAgICBXb3JrZXJUaHJlYWRTaHV0ZG93bkZpbmlzaFRhc2sg
KGluIFdvcmtlclRocmVhZC5jcHApIGNhbGxzCisgICAgICAgIFdvcmtlckNvbnRleHQ6OmNsZWFy
U2NyaXB0KCkuCisKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JKUy5w
bTogU2FtZSBjaGFuZ2UgYXMgYWJvdmUsIGZvcgorICAgICAgICBhbGwgYXV0by1nZW5lcmF0ZWQg
Y2FsbGJhY2tzLgorCisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pTVGVzdENh
bGxiYWNrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdENhbGxiYWNrOjp+SlNUZXN0Q2Fs
bGJhY2spOiBVcGRhdGVkIHRoZQorICAgICAgICBleHBlY3RhdGlvbnMgZm9yIHJ1bi1iaW5kaW5n
cy10ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHA6IEFk
ZGVkIHRoZSBhYmlsaXR5IHRvIGludGVycnVwdAorICAgICAgICBhbGwgREIgb3BlcmF0aW9ucyBp
biBwcm9ncmVzcywgdW5sZXNzIHRoZSBkYXRhYmFzZSB3YXMgY2xvc2VkIG9yCisgICAgICAgIGlz
IGJlaW5nIGNsb3NlZC4gVW5saWtlIHNxbGl0ZTNfaW50ZXJydXB0KCksCisgICAgICAgIFNRTGl0
ZURhdGFiYXNlOjppbnRlcnJ1cHQoKSBpcyBzdGlja3k6IG9uY2UgaXQncyBjYWxsZWQsIHRyeWlu
ZyB0bworICAgICAgICBydW4gYW55IHN0YXRlbWVudCBvbiB0aGF0IGRhdGFiYXNlIHdpbGwgZmFp
bCB3aXRoIGEKKyAgICAgICAgU1FMSVRFX0lOVEVSUlVQVCBlcnJvciBjb2RlLgorICAgICAgICAo
V2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OlNRTGl0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNRTGl0ZURhdGFiYXNlOjpjbG9zZSk6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVEYXRh
YmFzZTo6aW50ZXJydXB0KToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjppc0lu
dGVycnVwdGVkKToKKworICAgICAgICAqIHBsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oOiBB
ZGRlZCBhIG11dGV4IHRoYXQgY2FuIHVzZWQgYnkKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHRv
IGNoZWNrIGlmIHRoZSBkYXRhYmFzZSB3YXMgaW50ZXJydXB0ZWQuCisgICAgICAgIChXZWJDb3Jl
OjpTUUxpdGVEYXRhYmFzZTo6ZGF0YWJhc2VNdXRleCk6CisKKyAgICAgICAgKiBwbGF0Zm9ybS9z
cWwvU1FMaXRlU3RhdGVtZW50LmNwcDogQ2hhbmdlZCBwcmVwYXJlKCkgYW5kIHN0ZXAoKQorICAg
ICAgICB0byBjaGVjayBpZiB0aGUgZGF0YWJhc2Ugd2FzIGludGVycnVwdGVkLCBiZWZvcmUgdHJ5
aW5nIHRvIHByZXBhcmUKKyAgICAgICAgb3IgcnVuIHRoZSBzdGF0ZW1lbnQuIFRoZSBvdGhlciBt
ZXRob2RzIGRvbid0IG5lZWQgdG8gaG9sZCBvbiB0bworICAgICAgICB0aGUgREIgbG9jayB3aGls
ZSBydW5uaW5nLCBiZWNhdXNlIHRoZXkncmUgZmFzdCwgc28gd2UgZG9uJ3QgbmVlZAorICAgICAg
ICB0byBpbnRlcnJ1cHQgdGhlbS4KKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudDo6
cHJlcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ6OnN0ZXApOgorCisg
ICAgICAgICogc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmNwcDogTWFkZSBTUUxpdGVEYXRhYmFz
ZTo6aW50ZXJydXB0KCkKKyAgICAgICAgYW5kIGlzSW50ZXJydXB0ZWQoKSB2aXNpYmxlIHRvIFdl
YlNRTERhdGFiYXNlcyBjbGFzc2VzLgorICAgICAgICAoV2ViQ29yZTo6QWJzdHJhY3REYXRhYmFz
ZTo6aW50ZXJydXB0KToKKyAgICAgICAgKFdlYkNvcmU6OkFic3RyYWN0RGF0YWJhc2U6OmlzSW50
ZXJydXB0ZWQpOgorICAgICAgICAqIHN0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5oOgorCisgICAg
ICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuY3BwOiBBZGRlZCBhIG1ldGhvZCB0byBpbnRl
cnJ1cHQgYWxsCisgICAgICAgIGRhdGFiYXNlcyBpbiBhIGdpdmVuIGNvbnRleHQuCisgICAgICAg
IChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRl
eHQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmg6CisKKyAgICAgICAgKiBz
dG9yYWdlL1NRTFN0YXRlbWVudC5jcHA6IENoYW5nZWQgdGhlIGV4Y2VwdGlvbi9lcnJvciByZXBv
cnRlZAorICAgICAgICB3aGVuIGEgc3RhdGVtZW50IGlzIGludGVycnVwdGVkLgorICAgICAgICAo
V2ViQ29yZTo6U1FMU3RhdGVtZW50OjpleGVjdXRlKToKKyAgICAgICAgKiBzdG9yYWdlL1NRTFN0
YXRlbWVudFN5bmMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMU3RhdGVtZW50U3luYzo6ZXhl
Y3V0ZSk6CisKKyAgICAgICAgKiBzdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcDogQ2hhbmdlZCB0
aGUgY29kZSB0byByZWxlYXNlIHRoZQorICAgICAgICBjYWxsYmFjayBvYmplY3RzIGFzIHNvb24g
YXMgdGhleSdyZSBub3QgbmVlZGVkLgorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246
OmNoZWNrQW5kSGFuZGxlQ2xvc2VkT3JJbnRlcnJ1cHRlZERhdGFiYXNlKToKKyAgICAgICAgQ2hh
bmdlZCB0aGlzIG1ldGhvZCB0byBub3Qgc2NoZWR1bGUgdGhlIG5leHQgdHJhbnNhY3Rpb24gc3Rl
cCB3aGVuCisgICAgICAgIHRoZSBkYXRhYmFzZSBpcyBpbnRlcnJ1cHRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpwZXJmb3JtTmV4dFN0ZXApOgorICAgICAgICAoV2ViQ29y
ZTo6U1FMVHJhbnNhY3Rpb246OnBlcmZvcm1QZW5kaW5nQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6U1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJUcmFuc2FjdGlvbkNhbGxiYWNrKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpwb3N0ZmxpZ2h0QW5kQ29tbWl0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyVHJhbnNhY3Rpb25FcnJvckNhbGxi
YWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJUcmFu
c2FjdGlvbkVycm9yQ2FsbGJhY2spOgorICAgICAgICAqIHN0b3JhZ2UvU1FMVHJhbnNhY3Rpb24u
aDoKKworICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0u
Y3BwOiBBZGRlZCBhIG1ldGhvZCB0bworICAgICAgICBpbnRlcnJ1cHQgYWxsIGRhdGFiYXNlcyBp
biBhIGdpdmVuIGNvbnRleHQuCisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omlu
dGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQpOgorCisgICAgICAgICogd29ya2Vycy9Xb3Jr
ZXJUaHJlYWQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyVGhyZWFkOjpzdG9wKTogQWRk
ZWQgYSBjYWxsIHRvCisgICAgICAgIERhdGFiYXNlVHJhY2tlcjo6aW50ZXJydXB0QWxsRGF0YWJh
c2VzRm9yQ29udGV4dCgpLgorCiAyMDEwLTA3LTI4ICBab2x0YW4gSGVyY3plZyAgPHpoZXJjemVn
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTmlrb2xhcyBaaW1tZXJtYW5uLgpJ
bmRleDogV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0N1c3RvbVZvaWRDYWxsYmFjay5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0N1c3RvbVZvaWRDYWxsYmFjay5jcHAJKHJl
dmlzaW9uIDY0MTkyKQorKysgV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0N1c3RvbVZvaWRDYWxsYmFj
ay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDcgKzQ4LDEwIEBAIEpTQ3VzdG9tVm9pZENhbGxi
YWNrOjpKU0N1c3RvbVZvaWRDYWxsYmEKIAogSlNDdXN0b21Wb2lkQ2FsbGJhY2s6On5KU0N1c3Rv
bVZvaWRDYWxsYmFjaygpCiB7Ci0gICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5wb3N0VGFz
ayhEZWxldGVDYWxsYmFja0RhdGFUYXNrOjpjcmVhdGUobV9kYXRhKSk7CisgICAgaWYgKG1fc2Ny
aXB0RXhlY3V0aW9uQ29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpCisgICAgICAgIGRlbGV0ZSBt
X2RhdGE7CisgICAgZWxzZQorICAgICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RU
YXNrKERlbGV0ZUNhbGxiYWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTsKICNpZm5kZWYgTkRF
QlVHCiAgICAgbV9kYXRhID0gMDsKICNlbmRpZgpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9zY3Jp
cHRzL0NvZGVHZW5lcmF0b3JKUy5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Nj
cmlwdHMvQ29kZUdlbmVyYXRvckpTLnBtCShyZXZpc2lvbiA2NDE5MikKKysrIFdlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9ySlMucG0JKHdvcmtpbmcgY29weSkKQEAgLTIxNTEs
NyArMjE1MSwxMCBAQCBzdWIgR2VuZXJhdGVDYWxsYmFja0ltcGxlbWVudGF0aW9uCiAgICAgIyBE
ZXN0cnVjdG9yCiAgICAgcHVzaChAaW1wbENvbnRlbnQsICIke2NsYXNzTmFtZX06On4ke2NsYXNz
TmFtZX0oKVxuIik7CiAgICAgcHVzaChAaW1wbENvbnRlbnQsICJ7XG4iKTsKLSAgICBwdXNoKEBp
bXBsQ29udGVudCwgIiAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKERlbGV0
ZUNhbGxiYWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTtcbiIpOworICAgIHB1c2goQGltcGxD
b250ZW50LCAiICAgIGlmIChtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPmlzQ29udGV4dFRocmVh
ZCgpKVxuIik7CisgICAgcHVzaChAaW1wbENvbnRlbnQsICIgICAgICAgIGRlbGV0ZSBtX2RhdGE7
XG4iKTsKKyAgICBwdXNoKEBpbXBsQ29udGVudCwgIiAgICBlbHNlXG4iKTsKKyAgICBwdXNoKEBp
bXBsQ29udGVudCwgIiAgICAgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5wb3N0VGFzayhE
ZWxldGVDYWxsYmFja0RhdGFUYXNrOjpjcmVhdGUobV9kYXRhKSk7XG4iKTsKICAgICBwdXNoKEBp
bXBsQ29udGVudCwgIiNpZm5kZWYgTkRFQlVHXG4iKTsKICAgICBwdXNoKEBpbXBsQ29udGVudCwg
IiAgICBtX2RhdGEgPSAwO1xuIik7CiAgICAgcHVzaChAaW1wbENvbnRlbnQsICIjZW5kaWZcbiIp
OwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0Q2FsbGJhY2su
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pTVGVz
dENhbGxiYWNrLmNwcAkocmV2aXNpb24gNjQxOTIpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Njcmlw
dHMvdGVzdC9KUy9KU1Rlc3RDYWxsYmFjay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzLDcgKzQz
LDEwIEBAIEpTVGVzdENhbGxiYWNrOjpKU1Rlc3RDYWxsYmFjayhKU09iamVjdCoKIAogSlNUZXN0
Q2FsbGJhY2s6On5KU1Rlc3RDYWxsYmFjaygpCiB7Ci0gICAgbV9zY3JpcHRFeGVjdXRpb25Db250
ZXh0LT5wb3N0VGFzayhEZWxldGVDYWxsYmFja0RhdGFUYXNrOjpjcmVhdGUobV9kYXRhKSk7Cisg
ICAgaWYgKG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpCisgICAg
ICAgIGRlbGV0ZSBtX2RhdGE7CisgICAgZWxzZQorICAgICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNv
bnRleHQtPnBvc3RUYXNrKERlbGV0ZUNhbGxiYWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTsK
ICNpZm5kZWYgTkRFQlVHCiAgICAgbV9kYXRhID0gMDsKICNlbmRpZgpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkocmV2aXNpb24gNjQxOTIpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYg
KzMxLDcgQEAKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAiU1FMaXRlRmlsZVN5c3Rl
bS5oIgogI2luY2x1ZGUgIlNRTGl0ZVN0YXRlbWVudC5oIgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRp
bmcuaD4KIAogI2luY2x1ZGUgPHNxbGl0ZTMuaD4KIApAQCAtNDMsMTMgKzQ0LDEzIEBAIGNvbnN0
IGludCBTUUxSZXN1bHRSb3cgPSBTUUxJVEVfUk9XOwogY29uc3QgaW50IFNRTFJlc3VsdFNjaGVt
YSA9IFNRTElURV9TQ0hFTUE7CiBjb25zdCBpbnQgU1FMUmVzdWx0RnVsbCA9IFNRTElURV9GVUxM
OwogCi0KIFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAgOiBtX2RiKDApCiAg
ICAgLCBtX3BhZ2VTaXplKC0xKQogICAgICwgbV90cmFuc2FjdGlvbkluUHJvZ3Jlc3MoZmFsc2Up
CiAgICAgLCBtX3NoYXJhYmxlKGZhbHNlKQogICAgICwgbV9vcGVuaW5nVGhyZWFkKDApCisgICAg
LCBtX2ludGVycnVwdGVkKGZhbHNlKQogewogfQogCkBAIC04MywxNSArODQsMzggQEAgYm9vbCBT
UUxpdGVEYXRhYmFzZTo6b3Blbihjb25zdCBTdHJpbmcmIAogdm9pZCBTUUxpdGVEYXRhYmFzZTo6
Y2xvc2UoKQogewogICAgIGlmIChtX2RiKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGJl
aW5nIGNhbGxlZCBvbiB0aGVtYWluIHRocmVhZCBkdXJpbmcgSlMgR0MuIDxyZGFyOi8vcHJvYmxl
bS81NzM5ODE4PgotICAgICAgICAvLyBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fb3Blbmlu
Z1RocmVhZCk7Ci0gICAgICAgIHNxbGl0ZTNfY2xvc2UobV9kYik7Ci0gICAgICAgIG1fZGIgPSAw
OworICAgICAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fb3BlbmluZ1RocmVhZCk7Cisg
ICAgICAgIHNxbGl0ZTMqIGRiID0gbV9kYjsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhM
b2NrZXIgbG9ja2VyKG1fZGF0YWJhc2VDbG9zaW5nTXV0ZXgpOworICAgICAgICAgICAgbV9kYiA9
IDA7CisgICAgICAgIH0KKyAgICAgICAgc3FsaXRlM19jbG9zZShkYik7CiAgICAgfQogCiAgICAg
bV9vcGVuaW5nVGhyZWFkID0gMDsKIH0KIAordm9pZCBTUUxpdGVEYXRhYmFzZTo6aW50ZXJydXB0
KCkKK3sKKyAgICB3aGlsZSAoIW1fbG9ja2luZ011dGV4LnRyeUxvY2soKSkgeworICAgICAgICBN
dXRleExvY2tlciBsb2NrZXIobV9kYXRhYmFzZUNsb3NpbmdNdXRleCk7CisgICAgICAgIGlmICgh
bV9kYikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3FsaXRlM19pbnRlcnJ1cHQobV9k
Yik7CisgICAgICAgIHlpZWxkKCk7CisgICAgfQorCisgICAgbV9pbnRlcnJ1cHRlZCA9IHRydWU7
CisgICAgbV9sb2NraW5nTXV0ZXgudW5sb2NrKCk7Cit9CisKK2Jvb2wgU1FMaXRlRGF0YWJhc2U6
OmlzSW50ZXJydXB0ZWQoKQoreworICAgIEFTU0VSVCghbV9sb2NraW5nTXV0ZXgudHJ5TG9jaygp
KTsKKyAgICByZXR1cm4gbV9pbnRlcnJ1cHRlZDsKK30KKwogdm9pZCBTUUxpdGVEYXRhYmFzZTo6
c2V0RnVsbHN5bmMoYm9vbCBmc3luYykgCiB7CiAgICAgaWYgKGZzeW5jKSAKQEAgLTM5NywxNiAr
NDIxLDYgQEAgdm9pZCBTUUxpdGVEYXRhYmFzZTo6ZW5hYmxlQXV0aG9yaXplcihibwogICAgICAg
ICBzcWxpdGUzX3NldF9hdXRob3JpemVyKG1fZGIsIE5VTEwsIDApOwogfQogCi12b2lkIFNRTGl0
ZURhdGFiYXNlOjpsb2NrKCkKLXsKLSAgICBtX2xvY2tpbmdNdXRleC5sb2NrKCk7Ci19Ci0KLXZv
aWQgU1FMaXRlRGF0YWJhc2U6OnVubG9jaygpCi17Ci0gICAgbV9sb2NraW5nTXV0ZXgudW5sb2Nr
KCk7Ci19Ci0KIGJvb2wgU1FMaXRlRGF0YWJhc2U6OmlzQXV0b0NvbW1pdE9uKCkgY29uc3QKIHsK
ICAgICByZXR1cm4gc3FsaXRlM19nZXRfYXV0b2NvbW1pdChtX2RiKTsKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkocmV2aXNpb24gNjQxOTIpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01OCw2ICs1OCw4
IEBAIHB1YmxpYzoKICAgICBib29sIG9wZW4oY29uc3QgU3RyaW5nJiBmaWxlbmFtZSwgYm9vbCBm
b3JXZWJTUUxEYXRhYmFzZSA9IGZhbHNlKTsKICAgICBib29sIGlzT3BlbigpIGNvbnN0IHsgcmV0
dXJuIG1fZGI7IH0KICAgICB2b2lkIGNsb3NlKCk7CisgICAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAg
ICBib29sIGlzSW50ZXJydXB0ZWQoKTsKIAogICAgIGJvb2wgZXhlY3V0ZUNvbW1hbmQoY29uc3Qg
U3RyaW5nJik7CiAgICAgYm9vbCByZXR1cm5zQXRMZWFzdE9uZVJlc3VsdChjb25zdCBTdHJpbmcm
KTsKQEAgLTEwNSw5ICsxMDcsNyBAQCBwdWJsaWM6CiAgICAgCiAgICAgdm9pZCBzZXRBdXRob3Jp
emVyKFBhc3NSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVyPik7CiAKLSAgICAvLyAodW4pbG9ja3Mg
dGhlIGRhdGFiYXNlIGxpa2UgYSBtdXRleAotICAgIHZvaWQgbG9jaygpOwotICAgIHZvaWQgdW5s
b2NrKCk7CisgICAgTXV0ZXgmIGRhdGFiYXNlTXV0ZXgoKSB7IHJldHVybiBtX2xvY2tpbmdNdXRl
eDsgfQogICAgIGJvb2wgaXNBdXRvQ29tbWl0T24oKSBjb25zdDsKIAogICAgIC8vIFRoZSBTUUxp
dGUgQVVUT19WQUNVVU0gcHJhZ21hIGNhbiBiZSBlaXRoZXIgTk9ORSwgRlVMTCwgb3IgSU5DUkVN
RU5UQUwuCkBAIC0xNDksNyArMTQ5LDkgQEAgcHJpdmF0ZToKIAogICAgIE11dGV4IG1fbG9ja2lu
Z011dGV4OwogICAgIFRocmVhZElkZW50aWZpZXIgbV9vcGVuaW5nVGhyZWFkOwotICAgIAorCisg
ICAgTXV0ZXggbV9kYXRhYmFzZUNsb3NpbmdNdXRleDsKKyAgICBib29sIG1faW50ZXJydXB0ZWQ7
CiB9OyAvLyBjbGFzcyBTUUxpdGVEYXRhYmFzZQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVTdGF0ZW1lbnQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0YXRlbWVudC5jcHAJKHJldmlzaW9uIDY0
MTkyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3RhdGVtZW50LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNjEsNiArNjEsMTEgQEAgU1FMaXRlU3RhdGVtZW50Ojp+U1FMaXRlU3RhdGVt
ZW50KCkKIGludCBTUUxpdGVTdGF0ZW1lbnQ6OnByZXBhcmUoKQogewogICAgIEFTU0VSVCghbV9p
c1ByZXBhcmVkKTsKKworICAgIE11dGV4TG9ja2VyIGRhdGFiYXNlTG9jayhtX2RhdGFiYXNlLmRh
dGFiYXNlTXV0ZXgoKSk7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNJbnRlcnJ1cHRlZCgpKQorICAg
ICAgICByZXR1cm4gU1FMSVRFX0lOVEVSUlVQVDsKKwogICAgIGNvbnN0IHZvaWQqIHRhaWwgPSAw
OwogICAgIExPRyhTUUxEYXRhYmFzZSwgIlNRTCAtIHByZXBhcmUgLSAlcyIsIG1fcXVlcnkuYXNj
aWkoKS5kYXRhKCkpOwogICAgIFN0cmluZyBzdHJpcHBlZFF1ZXJ5ID0gbV9xdWVyeS5zdHJpcFdo
aXRlU3BhY2UoKTsKQEAgLTg4LDYgKzkzLDExIEBAIGludCBTUUxpdGVTdGF0ZW1lbnQ6OnByZXBh
cmUoKQogaW50IFNRTGl0ZVN0YXRlbWVudDo6c3RlcCgpCiB7CiAgICAgQVNTRVJUKG1faXNQcmVw
YXJlZCk7CisKKyAgICBNdXRleExvY2tlciBkYXRhYmFzZUxvY2sobV9kYXRhYmFzZS5kYXRhYmFz
ZU11dGV4KCkpOworICAgIGlmIChtX2RhdGFiYXNlLmlzSW50ZXJydXB0ZWQoKSkKKyAgICAgICAg
cmV0dXJuIFNRTElURV9JTlRFUlJVUFQ7CisKICAgICBpZiAoIW1fc3RhdGVtZW50KQogICAgICAg
ICByZXR1cm4gU1FMSVRFX09LOwogICAgIExPRyhTUUxEYXRhYmFzZSwgIlNRTCAtIHN0ZXAgLSAl
cyIsIG1fcXVlcnkuYXNjaWkoKS5kYXRhKCkpOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0Fic3Ry
YWN0RGF0YWJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFjdERh
dGFiYXNlLmNwcAkocmV2aXNpb24gNjQxOTIpCisrKyBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJhY3RE
YXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3NCw2ICs0NzQsMTcgQEAgdm9pZCBBYnN0
cmFjdERhdGFiYXNlOjppbmNyZW1lbnRhbFZhY3V1bQogICAgICAgICBtX3NxbGl0ZURhdGFiYXNl
LnJ1bkluY3JlbWVudGFsVmFjdXVtQ29tbWFuZCgpOwogfQogCit2b2lkIEFic3RyYWN0RGF0YWJh
c2U6OmludGVycnVwdCgpCit7CisgICAgbV9zcWxpdGVEYXRhYmFzZS5pbnRlcnJ1cHQoKTsKK30K
KworYm9vbCBBYnN0cmFjdERhdGFiYXNlOjppc0ludGVycnVwdGVkKCkKK3sKKyAgICBNdXRleExv
Y2tlciBsb2NrZXIobV9zcWxpdGVEYXRhYmFzZS5kYXRhYmFzZU11dGV4KCkpOworICAgIHJldHVy
biBtX3NxbGl0ZURhdGFiYXNlLmlzSW50ZXJydXB0ZWQoKTsKK30KKwogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQogCiAjZW5kaWYgLy8gRU5BQkxFKERBVEFCQVNFKQpJbmRleDogV2ViQ29yZS9zdG9y
YWdlL0Fic3RyYWN0RGF0YWJhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvQWJz
dHJhY3REYXRhYmFzZS5oCShyZXZpc2lvbiA2NDE5MikKKysrIFdlYkNvcmUvc3RvcmFnZS9BYnN0
cmFjdERhdGFiYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTY4LDYgKzY4LDggQEAgcHVibGljOgog
CiAgICAgdW5zaWduZWQgbG9uZyBsb25nIG1heGltdW1TaXplKCkgY29uc3Q7CiAgICAgdm9pZCBp
bmNyZW1lbnRhbFZhY3V1bUlmTmVlZGVkKCk7CisgICAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgICBi
b29sIGlzSW50ZXJydXB0ZWQoKTsKIAogICAgIC8vIEZJWE1FOiBtb3ZlIGFsbCB2ZXJzaW9uLXJl
bGF0ZWQgbWV0aG9kcyB0byBhIERhdGFiYXNlVmVyc2lvblRyYWNrZXIgY2xhc3MKICAgICBib29s
IHZlcnNpb25NYXRjaGVzRXhwZWN0ZWQoKSBjb25zdDsKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9E
YXRhYmFzZVRyYWNrZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZVRyYWNrZXIuY3BwCShyZXZpc2lvbiA2NDE5MikKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZVRyYWNrZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMzUsNiArMjM1LDM1IEBAIHZvaWQgRGF0
YWJhc2VUcmFja2VyOjpkYXRhYmFzZUNoYW5nZWQoQWIKICAgICBvcmlnaW5RdW90YU1hbmFnZXIo
KS5tYXJrRGF0YWJhc2UoZGF0YWJhc2UpOwogfQogCit2b2lkIERhdGFiYXNlVHJhY2tlcjo6aW50
ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dChjb25zdCBTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiBjb250ZXh0KQoreworICAgIFZlY3RvcjxSZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPiBvcGVu
RGF0YWJhc2VzOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgb3BlbkRhdGFiYXNlTWFwTG9j
ayhtX29wZW5EYXRhYmFzZU1hcEd1YXJkKTsKKworICAgICAgICBpZiAoIW1fb3BlbkRhdGFiYXNl
TWFwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIERhdGFiYXNlTmFtZU1hcCogbmFt
ZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQoY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKSk7
CisgICAgICAgIGlmICghbmFtZU1hcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBE
YXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGRiTmFtZU1hcEVuZEl0ID0gbmFtZU1hcC0+
ZW5kKCk7CisgICAgICAgIGZvciAoRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5h
bWVNYXBJdCA9IG5hbWVNYXAtPmJlZ2luKCk7IGRiTmFtZU1hcEl0ICE9IGRiTmFtZU1hcEVuZEl0
OyArK2RiTmFtZU1hcEl0KSB7CisgICAgICAgICAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQg
PSBkYk5hbWVNYXBJdC0+c2Vjb25kOworICAgICAgICAgICAgRGF0YWJhc2VTZXQ6OmNvbnN0X2l0
ZXJhdG9yIGRiU2V0RW5kSXQgPSBkYXRhYmFzZVNldC0+ZW5kKCk7CisgICAgICAgICAgICBmb3Ig
KERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEl0ID0gZGF0YWJhc2VTZXQtPmJlZ2lu
KCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsgKytkYlNldEl0KSB7CisgICAgICAgICAgICAgICAg
aWYgKCgqZGJTZXRJdCktPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSA9PSBjb250ZXh0KQorICAg
ICAgICAgICAgICAgICAgICBvcGVuRGF0YWJhc2VzLmFwcGVuZCgqZGJTZXRJdCk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0
YWJhc2U+ID46OmNvbnN0X2l0ZXJhdG9yIG9wZW5EYXRhYmFzZXNFbmRJdCA9IG9wZW5EYXRhYmFz
ZXMuZW5kKCk7CisgICAgZm9yIChWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0YWJhc2U+ID46OmNv
bnN0X2l0ZXJhdG9yIG9wZW5EYXRhYmFzZXNJdCA9IG9wZW5EYXRhYmFzZXMuYmVnaW4oKTsgb3Bl
bkRhdGFiYXNlc0l0ICE9IG9wZW5EYXRhYmFzZXNFbmRJdDsgKytvcGVuRGF0YWJhc2VzSXQpCisg
ICAgICAgICgqb3BlbkRhdGFiYXNlc0l0KS0+aW50ZXJydXB0KCk7Cit9CisKIFN0cmluZyBEYXRh
YmFzZVRyYWNrZXI6Om9yaWdpblBhdGgoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikgY29uc3QKIHsK
ICAgICByZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0
aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aC50aHJlYWRzYWZlQ29weSgpLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpKTsKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgJKHJldmlz
aW9uIDY0MTkyKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCSh3b3JraW5n
IGNvcHkpCkBAIC03OCw2ICs3OCw4IEBAIHB1YmxpYzoKICAgICB1bnNpZ25lZCBsb25nIGxvbmcg
Z2V0TWF4U2l6ZUZvckRhdGFiYXNlKGNvbnN0IEFic3RyYWN0RGF0YWJhc2UqKTsKICAgICB2b2lk
IGRhdGFiYXNlQ2hhbmdlZChBYnN0cmFjdERhdGFiYXNlKik7CiAKKyAgICB2b2lkIGludGVycnVw
dEFsbERhdGFiYXNlc0ZvckNvbnRleHQoY29uc3QgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCopOwor
CiBwcml2YXRlOgogICAgIERhdGFiYXNlVHJhY2tlcihjb25zdCBTdHJpbmcmIGRhdGFiYXNlUGF0
aCk7CiAKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TUUxTdGF0ZW1lbnQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvc3RvcmFnZS9TUUxTdGF0ZW1lbnQuY3BwCShyZXZpc2lvbiA2NDE5MikKKysr
IFdlYkNvcmUvc3RvcmFnZS9TUUxTdGF0ZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03OCw3
ICs3OCw3IEBAIGJvb2wgU1FMU3RhdGVtZW50OjpleGVjdXRlKERhdGFiYXNlKiBkYikKIAogICAg
IGlmIChyZXN1bHQgIT0gU1FMUmVzdWx0T2spIHsKICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJV
bmFibGUgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHN0YXRlbWVudCAlcyAtIGVycm9yICVpICgl
cykiLCBtX3N0YXRlbWVudC5hc2NpaSgpLmRhdGEoKSwgcmVzdWx0LCBkYXRhYmFzZS0+bGFzdEVy
cm9yTXNnKCkpOwotICAgICAgICBtX2Vycm9yID0gU1FMRXJyb3I6OmNyZWF0ZShTUUxFcnJvcjo6
U1lOVEFYX0VSUiwgZGF0YWJhc2UtPmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgbV9lcnJvciA9
IFNRTEVycm9yOjpjcmVhdGUoZGItPmlzSW50ZXJydXB0ZWQoKSA/IFNRTEVycm9yOjpEQVRBQkFT
RV9FUlIgOiBTUUxFcnJvcjo6U1lOVEFYX0VSUiwgZGF0YWJhc2UtPmxhc3RFcnJvck1zZygpKTsK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtODYsNyArODYsNyBAQCBib29sIFNR
TFN0YXRlbWVudDo6ZXhlY3V0ZShEYXRhYmFzZSogZGIpCiAgICAgLy8gSWYgdGhpcyBpcyB0aGUg
Y2FzZSwgdGhleSBtaWdodCBiZSB0cnlpbmcgdG8gZG8gc29tZXRoaW5nIGZpc2h5IG9yIG1hbGlj
aW91cwogICAgIGlmIChzdGF0ZW1lbnQuYmluZFBhcmFtZXRlckNvdW50KCkgIT0gbV9hcmd1bWVu
dHMuc2l6ZSgpKSB7CiAgICAgICAgIExPRyhTdG9yYWdlQVBJLCAiQmluZCBwYXJhbWV0ZXIgY291
bnQgZG9lc24ndCBtYXRjaCBudW1iZXIgb2YgcXVlc3Rpb24gbWFya3MiKTsKLSAgICAgICAgbV9l
cnJvciA9IFNRTEVycm9yOjpjcmVhdGUoU1FMRXJyb3I6OlNZTlRBWF9FUlIsICJudW1iZXIgb2Yg
Jz8ncyBpbiBzdGF0ZW1lbnQgc3RyaW5nIGRvZXMgbm90IG1hdGNoIGFyZ3VtZW50IGNvdW50Iik7
CisgICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKGRiLT5pc0ludGVycnVwdGVkKCkg
PyBTUUxFcnJvcjo6REFUQUJBU0VfRVJSIDogU1FMRXJyb3I6OlNZTlRBWF9FUlIsICJudW1iZXIg
b2YgJz8ncyBpbiBzdGF0ZW1lbnQgc3RyaW5nIGRvZXMgbm90IG1hdGNoIGFyZ3VtZW50IGNvdW50
Iik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKSW5kZXg6IFdlYkNvcmUvc3RvcmFn
ZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FM
U3RhdGVtZW50U3luYy5jcHAJKHJldmlzaW9uIDY0MTkyKQorKysgV2ViQ29yZS9zdG9yYWdlL1NR
TFN0YXRlbWVudFN5bmMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MSwxMiArNjEsMTIgQEAgUGFz
c1JlZlB0cjxTUUxSZXN1bHRTZXQ+IFNRTFN0YXRlbWVudFN5bgogICAgIFNRTGl0ZVN0YXRlbWVu
dCBzdGF0ZW1lbnQoKmRhdGFiYXNlLCBtX3N0YXRlbWVudCk7CiAgICAgaW50IHJlc3VsdCA9IHN0
YXRlbWVudC5wcmVwYXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHRPaykgewotICAg
ICAgICBlYyA9IFNRTEV4Y2VwdGlvbjo6U1lOVEFYX0VSUjsKKyAgICAgICAgZWMgPSAoZGItPmlz
SW50ZXJydXB0ZWQoKSA/IFNRTEV4Y2VwdGlvbjo6REFUQUJBU0VfRVJSIDogU1FMRXhjZXB0aW9u
OjpTWU5UQVhfRVJSKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgaWYgKHN0YXRl
bWVudC5iaW5kUGFyYW1ldGVyQ291bnQoKSAhPSBtX2FyZ3VtZW50cy5zaXplKCkpIHsKLSAgICAg
ICAgZWMgPSBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlI7CisgICAgICAgIGVjID0gKGRiLT5pc0lu
dGVycnVwdGVkKCk/IFNRTEV4Y2VwdGlvbjo6REFUQUJBU0VfRVJSIDogU1FMRXhjZXB0aW9uOjpT
WU5UQVhfRVJSKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkluZGV4OiBXZWJDb3JlL3N0
b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9T
UUxUcmFuc2FjdGlvbi5jcHAJKHJldmlzaW9uIDY0MTkyKQorKysgV2ViQ29yZS9zdG9yYWdlL1NR
TFRyYW5zYWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ2LDE3ICsxNDYsMjIgQEAgY29u
c3QgY2hhciogU1FMVHJhbnNhY3Rpb246OmRlYnVnU3RlcE5hbQogfQogI2VuZGlmCiAKLXZvaWQg
U1FMVHJhbnNhY3Rpb246OmNoZWNrQW5kSGFuZGxlQ2xvc2VkRGF0YWJhc2UoKQordm9pZCBTUUxU
cmFuc2FjdGlvbjo6Y2hlY2tBbmRIYW5kbGVDbG9zZWRPckludGVycnVwdGVkRGF0YWJhc2UoKQog
ewotICAgIGlmIChtX2RhdGFiYXNlLT5vcGVuZWQoKSkKKyAgICBpZiAobV9kYXRhYmFzZS0+b3Bl
bmVkKCkgJiYgIW1fZGF0YWJhc2UtPmlzSW50ZXJydXB0ZWQoKSkKICAgICAgICAgcmV0dXJuOwog
CiAgICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdhcyBzdG9wcGVkLCBkb24ndCBkbyBhbnl0aGluZyBh
bmQgY2FuY2VsIHF1ZXVlZCB3b3JrCi0gICAgTE9HKFN0b3JhZ2VBUEksICJEYXRhYmFzZSB3YXMg
c3RvcHBlZCAtIGNhbmNlbGxpbmcgd29yayBmb3IgdGhpcyB0cmFuc2FjdGlvbiIpOworICAgIExP
RyhTdG9yYWdlQVBJLCAiRGF0YWJhc2Ugd2FzIHN0b3BwZWQgb3IgaW50ZXJydXB0ZWQgLSBjYW5j
ZWxsaW5nIHdvcmsgZm9yIHRoaXMgdHJhbnNhY3Rpb24iKTsKICAgICBNdXRleExvY2tlciBsb2Nr
ZXIobV9zdGF0ZW1lbnRNdXRleCk7CiAgICAgbV9zdGF0ZW1lbnRRdWV1ZS5jbGVhcigpOwogICAg
IG1fbmV4dFN0ZXAgPSAwOwogCisgICAgLy8gUmVsZWFzZSB0aGUgdW5uZWVkZWQgY2FsbGJhY2tz
LCB0byBicmVhayByZWZlcmVuY2UgY3ljbGVzLgorICAgIG1fY2FsbGJhY2sgPSAwOworICAgIG1f
c3VjY2Vzc0NhbGxiYWNrID0gMDsKKyAgICBtX2Vycm9yQ2FsbGJhY2sgPSAwOworCiAgICAgLy8g
VGhlIG5leHQgc3RlcHMgc2hvdWxkIGJlIGV4ZWN1dGVkIG9ubHkgaWYgd2UncmUgb24gdGhlIERC
IHRocmVhZC4KICAgICBpZiAoY3VycmVudFRocmVhZCgpICE9IGRhdGFiYXNlKCktPnNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQoKS0+ZGF0YWJhc2VUaHJlYWQoKS0+Z2V0VGhyZWFkSUQoKSkKICAgICAg
ICAgcmV0dXJuOwpAQCAtMTgzLDcgKzE4OCw3IEBAIGJvb2wgU1FMVHJhbnNhY3Rpb246OnBlcmZv
cm1OZXh0U3RlcCgpCiAgICAgICAgICAgIG1fbmV4dFN0ZXAgPT0gJlNRTFRyYW5zYWN0aW9uOjpj
bGVhbnVwQWZ0ZXJTdWNjZXNzQ2FsbGJhY2sgfHwKICAgICAgICAgICAgbV9uZXh0U3RlcCA9PSAm
U1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjayk7CiAK
LSAgICBjaGVja0FuZEhhbmRsZUNsb3NlZERhdGFiYXNlKCk7CisgICAgY2hlY2tBbmRIYW5kbGVD
bG9zZWRPckludGVycnVwdGVkRGF0YWJhc2UoKTsKIAogICAgIGlmIChtX25leHRTdGVwKQogICAg
ICAgICAodGhpcy0+Km1fbmV4dFN0ZXApKCk7CkBAIC0yMDIsNyArMjA3LDcgQEAgdm9pZCBTUUxU
cmFuc2FjdGlvbjo6cGVyZm9ybVBlbmRpbmdDYWxsYgogICAgICAgICAgICBtX25leHRTdGVwID09
ICZTUUxUcmFuc2FjdGlvbjo6ZGVsaXZlclF1b3RhSW5jcmVhc2VDYWxsYmFjayB8fAogICAgICAg
ICAgICBtX25leHRTdGVwID09ICZTUUxUcmFuc2FjdGlvbjo6ZGVsaXZlclN1Y2Nlc3NDYWxsYmFj
ayk7CiAKLSAgICBjaGVja0FuZEhhbmRsZUNsb3NlZERhdGFiYXNlKCk7CisgICAgY2hlY2tBbmRI
YW5kbGVDbG9zZWRPckludGVycnVwdGVkRGF0YWJhc2UoKTsKIAogICAgIGlmIChtX25leHRTdGVw
KQogICAgICAgICAodGhpcy0+Km1fbmV4dFN0ZXApKCk7CkBAIC0yOTIsNiArMjk3LDcgQEAgdm9p
ZCBTUUxUcmFuc2FjdGlvbjo6ZGVsaXZlclRyYW5zYWN0aW9uQwogICAgICAgICBtX2V4ZWN1dGVT
cWxBbGxvd2VkID0gdHJ1ZTsKICAgICAgICAgc2hvdWxkRGVsaXZlckVycm9yQ2FsbGJhY2sgPSAh
bV9jYWxsYmFjay0+aGFuZGxlRXZlbnQobV9kYXRhYmFzZS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4
dCgpLCB0aGlzKTsKICAgICAgICAgbV9leGVjdXRlU3FsQWxsb3dlZCA9IGZhbHNlOworICAgICAg
ICBtX2NhbGxiYWNrID0gMDsKICAgICB9CiAKICAgICAvLyBUcmFuc2FjdGlvbiBTdGVwIDUgLSBJ
ZiB0aGUgdHJhbnNhY3Rpb24gY2FsbGJhY2sgd2FzIG51bGwgb3IgcmFpc2VkIGFuIGV4Y2VwdGlv
biwganVtcCB0byB0aGUgZXJyb3IgY2FsbGJhY2sKQEAgLTQ1OSw2ICs0NjUsNyBAQCB2b2lkIFNR
TFRyYW5zYWN0aW9uOjpwb3N0ZmxpZ2h0QW5kQ29tbWl0CiAKICAgICAvLyBJZiB0aGUgY29tbWl0
IGZhaWxlZCwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgc3RpbGwgYmUgbWFya2VkIGFzICJpbiBwcm9n
cmVzcyIKICAgICBpZiAobV9zcWxpdGVUcmFuc2FjdGlvbi0+aW5Qcm9ncmVzcygpKSB7CisgICAg
ICAgIG1fc3VjY2Vzc0NhbGxiYWNrID0gMDsKICAgICAgICAgbV90cmFuc2FjdGlvbkVycm9yID0g
U1FMRXJyb3I6OmNyZWF0ZShTUUxFcnJvcjo6REFUQUJBU0VfRVJSLCAiZmFpbGVkIHRvIGNvbW1p
dCB0aGUgdHJhbnNhY3Rpb24iKTsKICAgICAgICAgaGFuZGxlVHJhbnNhY3Rpb25FcnJvcihmYWxz
ZSk7CiAgICAgICAgIHJldHVybjsKQEAgLTQ3Myw3ICs0ODAsNiBAQCB2b2lkIFNRTFRyYW5zYWN0
aW9uOjpwb3N0ZmxpZ2h0QW5kQ29tbWl0CiAgICAgICAgIG1fZGF0YWJhc2UtPnRyYW5zYWN0aW9u
Q2xpZW50KCktPmRpZENvbW1pdFdyaXRlVHJhbnNhY3Rpb24oZGF0YWJhc2UoKSk7CiAKICAgICAv
LyBOb3cgcmVsZWFzZSBvdXIgdW5uZWVkZWQgY2FsbGJhY2tzLCB0byBicmVhayByZWZlcmVuY2Ug
Y3ljbGVzLgotICAgIG1fY2FsbGJhY2sgPSAwOwogICAgIG1fZXJyb3JDYWxsYmFjayA9IDA7CiAK
ICAgICAvLyBUcmFuc2FjdGlvbiBTdGVwIDEwIC0gRGVsaXZlciBzdWNjZXNzIGNhbGxiYWNrLCBp
ZiB0aGVyZSBpcyBvbmUKQEAgLTU0Niw4ICs1NTIsMTAgQEAgdm9pZCBTUUxUcmFuc2FjdGlvbjo6
ZGVsaXZlclRyYW5zYWN0aW9uRQogCiAgICAgLy8gVHJhbnNhY3Rpb24gU3RlcCAxMiAtIElmIGV4
aXN0cywgaW52b2tlIGVycm9yIGNhbGxiYWNrIHdpdGggdGhlIGxhc3QKICAgICAvLyBlcnJvciB0
byBoYXZlIG9jY3VycmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uCi0gICAgaWYgKG1fZXJyb3JDYWxs
YmFjaykKKyAgICBpZiAobV9lcnJvckNhbGxiYWNrKSB7CiAgICAgICAgIG1fZXJyb3JDYWxsYmFj
ay0+aGFuZGxlRXZlbnQobV9kYXRhYmFzZS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLCBtX3Ry
YW5zYWN0aW9uRXJyb3IuZ2V0KCkpOworICAgICAgICBtX2Vycm9yQ2FsbGJhY2sgPSAwOworICAg
IH0KIAogICAgIG1fbmV4dFN0ZXAgPSAmU1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclRyYW5z
YWN0aW9uRXJyb3JDYWxsYmFjazsKICAgICBMT0coU3RvcmFnZUFQSSwgIlNjaGVkdWxpbmcgY2xl
YW51cEFmdGVyVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrIGZvciB0cmFuc2FjdGlvbiAlcFxuIiwg
dGhpcyk7CkBAIC01NzksMTAgKzU4Nyw2IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OmNsZWFudXBB
ZnRlclRyYW5zYWMKICAgICBBU1NFUlQoIW1fZGF0YWJhc2UtPnNxbGl0ZURhdGFiYXNlKCkudHJh
bnNhY3Rpb25JblByb2dyZXNzKCkpOwogICAgIG1fbmV4dFN0ZXAgPSAwOwogCi0gICAgLy8gTm93
IHJlbGVhc2Ugb3VyIGNhbGxiYWNrcywgdG8gYnJlYWsgcmVmZXJlbmNlIGN5Y2xlcy4KLSAgICBt
X2NhbGxiYWNrID0gMDsKLSAgICBtX2Vycm9yQ2FsbGJhY2sgPSAwOwotCiAgICAgLy8gTm93IHJl
bGVhc2UgdGhlIGxvY2sgb24gdGhpcyBkYXRhYmFzZQogICAgIG1fZGF0YWJhc2UtPnRyYW5zYWN0
aW9uQ29vcmRpbmF0b3IoKS0+cmVsZWFzZUxvY2sodGhpcyk7CiB9CkluZGV4OiBXZWJDb3JlL3N0
b3JhZ2UvU1FMVHJhbnNhY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FM
VHJhbnNhY3Rpb24uaAkocmV2aXNpb24gNjQxOTIpCisrKyBXZWJDb3JlL3N0b3JhZ2UvU1FMVHJh
bnNhY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAtODcsNyArODcsNyBAQCBwcml2YXRlOgogCiAg
ICAgdm9pZCBlbnF1ZXVlU3RhdGVtZW50KFBhc3NSZWZQdHI8U1FMU3RhdGVtZW50Pik7CiAKLSAg
ICB2b2lkIGNoZWNrQW5kSGFuZGxlQ2xvc2VkRGF0YWJhc2UoKTsKKyAgICB2b2lkIGNoZWNrQW5k
SGFuZGxlQ2xvc2VkT3JJbnRlcnJ1cHRlZERhdGFiYXNlKCk7CiAKICAgICB2b2lkIGFjcXVpcmVM
b2NrKCk7CiAgICAgdm9pZCBvcGVuVHJhbnNhY3Rpb25BbmRQcmVmbGlnaHQoKTsKSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVt
LmNwcAkocmV2aXNpb24gNjQxOTIpCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJh
c2VUcmFja2VyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzQsNiArMTc0LDM1IEBA
IHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OmdldE0KICAgICByZXR1cm4gZGF0
YWJhc2VTaXplICsgc3BhY2VBdmFpbGFibGU7CiB9CiAKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpp
bnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KGNvbnN0IFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqIGNvbnRleHQpCit7CisgICAgVmVjdG9yPFJlZlB0cjxBYnN0cmFjdERhdGFiYXNlPiA+IG9w
ZW5EYXRhYmFzZXM7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBM
b2NrKG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworCisgICAgICAgIGlmICghbV9vcGVuRGF0YWJh
c2VNYXApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBu
YW1lTWFwID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChjb250ZXh0LT5zZWN1cml0eU9yaWdpbigp
KTsKKyAgICAgICAgaWYgKCFuYW1lTWFwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IERhdGFiYXNlTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgZGJOYW1lTWFwRW5kSXQgPSBuYW1lTWFw
LT5lbmQoKTsKKyAgICAgICAgZm9yIChEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGRi
TmFtZU1hcEl0ID0gbmFtZU1hcC0+YmVnaW4oKTsgZGJOYW1lTWFwSXQgIT0gZGJOYW1lTWFwRW5k
SXQ7ICsrZGJOYW1lTWFwSXQpIHsKKyAgICAgICAgICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNl
dCA9IGRiTmFtZU1hcEl0LT5zZWNvbmQ7CisgICAgICAgICAgICBEYXRhYmFzZVNldDo6Y29uc3Rf
aXRlcmF0b3IgZGJTZXRFbmRJdCA9IGRhdGFiYXNlU2V0LT5lbmQoKTsKKyAgICAgICAgICAgIGZv
ciAoRGF0YWJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGRiU2V0SXQgPSBkYXRhYmFzZVNldC0+YmVn
aW4oKTsgZGJTZXRJdCAhPSBkYlNldEVuZEl0OyArK2RiU2V0SXQpIHsKKyAgICAgICAgICAgICAg
ICBpZiAoKCpkYlNldEl0KS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpID09IGNvbnRleHQpCisg
ICAgICAgICAgICAgICAgICAgIG9wZW5EYXRhYmFzZXMuYXBwZW5kKCpkYlNldEl0KTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZlY3RvcjxSZWZQdHI8QWJzdHJhY3RE
YXRhYmFzZT4gPjo6Y29uc3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNlc0VuZEl0ID0gb3BlbkRhdGFi
YXNlcy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxSZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPjo6
Y29uc3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNlc0l0ID0gb3BlbkRhdGFiYXNlcy5iZWdpbigpOyBv
cGVuRGF0YWJhc2VzSXQgIT0gb3BlbkRhdGFiYXNlc0VuZEl0OyArK29wZW5EYXRhYmFzZXNJdCkK
KyAgICAgICAgKCpvcGVuRGF0YWJhc2VzSXQpLT5pbnRlcnJ1cHQoKTsKK30KKwogfQogCiAjZW5k
aWYgLy8gRU5BQkxFKERBVEFCQVNFKQpJbmRleDogV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVh
ZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVhZC5jcHAJKHJl
dmlzaW9uIDY0MTkyKQorKysgV2ViQ29yZS93b3JrZXJzL1dvcmtlclRocmVhZC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTMwLDcgKzMwLDYgQEAKIAogI2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgog
Ci0jaW5jbHVkZSAiRGF0YWJhc2VUYXNrLmgiCiAjaW5jbHVkZSAiRGVkaWNhdGVkV29ya2VyQ29u
dGV4dC5oIgogI2luY2x1ZGUgIktVUkwuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgpA
QCAtNDEsNiArNDAsMTEgQEAKICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHd0Zi9Ob25j
b3B5YWJsZS5oPgogCisjaWYgRU5BQkxFKERBVEFCQVNFKQorI2luY2x1ZGUgIkRhdGFiYXNlVGFz
ay5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVHJhY2tlci5oIgorI2VuZGlmCisKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogc3RhdGljIE11dGV4JiB0aHJlYWRDb3VudE11dGV4KCkKQEAgLTIyNSw2ICsy
MjksMTAgQEAgdm9pZCBXb3JrZXJUaHJlYWQ6OnN0b3AoKQogICAgIGlmIChtX3dvcmtlckNvbnRl
eHQpIHsKICAgICAgICAgbV93b3JrZXJDb250ZXh0LT5zY3JpcHQoKS0+Zm9yYmlkRXhlY3V0aW9u
KFdvcmtlclNjcmlwdENvbnRyb2xsZXI6OlRlcm1pbmF0ZVJ1bm5pbmdTY3JpcHQpOwogCisjaWYg
RU5BQkxFKERBVEFCQVNFKQorICAgICAgICBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKS5pbnRl
cnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KG1fd29ya2VyQ29udGV4dC5nZXQoKSk7CisjZW5k
aWYKKwogICAgIC8vIEZJWE1FOiBSdWRlbHkga2lsbGluZyB0aGUgdGhyZWFkIHdvbid0IHdvcmsg
d2hlbiB3ZSBhbGxvdyBuZXN0ZWQgd29ya2VycywgYmVjYXVzZSB0aGV5IHdpbGwgdHJ5IHRvIHBv
c3Qgbm90aWZpY2F0aW9ucyBvZiB0aGVpciBkZXN0cnVjdGlvbi4KICAgICAvLyBUaGlzIGNhbiBs
aWtlbHkgdXNlIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyB1c2VkIGZvciBkYXRhYmFzZXMgYWJvdmUu
CiAKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0MTkyKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTggQEAKKzIwMTAtMDctMjggIER1bWl0cnUgRGFuaWxp
dWMgIDxkdW1pQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBUZXN0IHRoYXQgdGVybWluYXRpbmcgYSB3b3JrZXIgaW50ZXJydXB0
cyBhbGwgREIgb3BlcmF0aW9ucyBpbiB0aGF0IHdvcmtlci4KKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQyODQzCisKKyAgICAgICAgKiBmYXN0L3dvcmtl
cnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAg
ICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy1leHBlY3Rl
ZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1k
YXRhYmFzZS1zeW5jLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdl
L2ludGVycnVwdC1kYXRhYmFzZS5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMv
c3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuanM6IEFkZGVkLgorICAg
ICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Uu
anM6IEFkZGVkLgorICAgICAgICAocnVuVHJhbnNhY3Rpb24pOgorCiAyMDEwLTA3LTI4ICBab2x0
YW4gSGVyY3plZyAgPHpoZXJjemVnQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
Tmlrb2xhcyBaaW1tZXJtYW5uLgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3Jh
Z2UvaW50ZXJydXB0LWRhdGFiYXNlLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UtZXhwZWN0ZWQudHh0
CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJy
dXB0LWRhdGFiYXNlLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzIEBACitU
aGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IGFsbCBhc3luYyBkYXRhYmFzZSBvcGVyYXRpb25zIGFy
ZSBpbW1lZGlhdGVseSBpbnRlcnJ1cHRlZCB3aGVuIHRoZSB3b3JrZXIgbmVlZHMgdG8gdGVybWlu
YXRlLgorUEFTUzogZGF0YWJhc2Ugb3BlcmF0aW9ucyBpbnRlcnJ1cHRlZC4KKwpJbmRleDogTGF5
b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMtZXhw
ZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdl
L2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExh
eW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1IEBACitDT05TT0xFIE1FU1NBR0U6
IGxpbmUgNzogREFUQUJBU0VfRVJSOiBET00gU1FMIEV4Y2VwdGlvbiAxOiBUaGUgb3BlcmF0aW9u
IGZhaWxlZCBmb3Igc29tZSByZWFzb24gcmVsYXRlZCB0byB0aGUgZGF0YWJhc2UuCitDT05TT0xF
IE1FU1NBR0U6IGxpbmUgMTE6IFVOS05PV05fRVJSOiBET00gU1FMIEV4Y2VwdGlvbiAwOiBUaGUg
b3BlcmF0aW9uIGZhaWxlZCBmb3IgcmVhc29ucyB1bnJlbGF0ZWQgdG8gdGhlIGRhdGFiYXNlLgor
VGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgc3luYyBkYXRhYmFzZSBvcGVyYXRpb25zIGFy
ZSBpbW1lZGlhdGVseSBpbnRlcnJ1cHRlZCB3aGVuIHRoZSB3b3JrZXIgbmVlZHMgdG8gdGVybWlu
YXRlLgorUEFTUzogZGF0YWJhc2Ugb3BlcmF0aW9ucyBpbnRlcnJ1cHRlZC4KKwpJbmRleDogTGF5
b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRt
bAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1
cHQtZGF0YWJhc2Utc3luYy5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93
b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0OCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9yZXNvdXJj
ZXMvd29ya2VyLXV0aWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdD4KK3ZhciB3b3JrZXI7CisKK2Z1
bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25z
b2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZpbmlz
aFRlc3QoKQoreworICAgIGxvZygiUEFTUzogZGF0YWJhc2Ugb3BlcmF0aW9ucyBpbnRlcnJ1cHRl
ZC4iKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlv
dXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIHRlcm1pbmF0ZVdv
cmtlcigpCit7CisgICAgd29ya2VyLnRlcm1pbmF0ZSgpOworICAgIHdhaXRVbnRpbFdvcmtlclRo
cmVhZHNFeGl0KGZpbmlzaFRlc3QpCit9CisKK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAgIGlm
ICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50
aWxEb25lKCk7CisgICAgfQorCisgICAgd29ya2VyID0gbmV3IFdvcmtlcigncmVzb3VyY2VzL2lu
dGVycnVwdC1kYXRhYmFzZS1zeW5jLmpzJyk7CisgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0
aW9uKGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5kYXRhID09ICJ0ZXJtaW5hdGUiKQorICAg
ICAgICAgICAgdGVybWluYXRlV29ya2VyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxv
ZyhldmVudC5kYXRhKTsKKyAgICB9OworfQorPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5IG9u
bG9hZD0icnVuVGVzdCgpIj4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIHN5bmMgZGF0
YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0aGUgd29y
a2VyIG5lZWRzIHRvIHRlcm1pbmF0ZS4KKzxwcmUgaWQ9ImNvbnNvbGUiPgorPC9wcmU+Cis8L2Jv
ZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRl
cnJ1cHQtZGF0YWJhc2UuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtl
cnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91
dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS5odG1sCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDQ4IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4u
L3Jlc291cmNlcy93b3JrZXItdXRpbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0PgordmFyIHdvcmtl
cjsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsKK30KKworZnVuY3Rp
b24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJQQVNTOiBkYXRhYmFzZSBvcGVyYXRpb25zIGlu
dGVycnVwdGVkLiIpOworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24gdGVy
bWluYXRlV29ya2VyKCkKK3sKKyAgICB3b3JrZXIudGVybWluYXRlKCk7CisgICAgd2FpdFVudGls
V29ya2VyVGhyZWFkc0V4aXQoZmluaXNoVGVzdCkKK30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7
CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRU
ZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVy
LndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisKKyAgICB3b3JrZXIgPSBuZXcgV29ya2VyKCdyZXNv
dXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLmpzJyk7CisgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1
bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5kYXRhID09ICJ0ZXJtaW5hdGUiKQor
ICAgICAgICAgICAgdGVybWluYXRlV29ya2VyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGxvZyhldmVudC5kYXRhKTsKKyAgICB9OworfQorPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5
IG9ubG9hZD0icnVuVGVzdCgpIj4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIGFzeW5j
IGRhdGFiYXNlIG9wZXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5IGludGVycnVwdGVkIHdoZW4gdGhl
IHdvcmtlciBuZWVkcyB0byB0ZXJtaW5hdGUuCis8cHJlIGlkPSJjb25zb2xlIj4KKzwvcHJlPgor
PC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2Uv
cmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Ut
c3luYy5qcwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdl
L3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5qcwkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwxMSBAQAordmFyIGRiID0gb3BlbkRhdGFiYXNlU3luYygiSW50ZXJydXB0RGF0YWJhc2VT
eW5jVGVzdCIsICIxIiwgIiIsIDEpOworZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsKKyAg
ICB0eC5leGVjdXRlU3FsKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBUZXN0IChGb28gSU5U
KSIpOworICAgIHZhciBjb3VudGVyID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAv
LyBQdXQgYm90aCBzdGF0ZW1lbnRzIG9uIHRoZSBzYW1lIGxpbmUsIHRvIG1ha2Ugc3VyZSB0aGUg
ZXhjZXB0aW9uIGlzIGFsd2F5cyByZXBvcnRlZCBvbiB0aGUgc2FtZSBsaW5lLgorICAgICAgICB0
eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBUZXN0IFZBTFVFUyAoMSkiKTsgdHguZXhlY3V0ZVNx
bCgiREVMRVRFIEZST00gVGVzdCBXSEVSRSBGb28gPSAxIik7CisgICAgICAgIGlmICgrK2NvdW50
ZXIgPT0gMTAwKQorICAgICAgICAgICAgcG9zdE1lc3NhZ2UoInRlcm1pbmF0ZSIpOworICAgIH0K
K30pOwpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2lu
dGVycnVwdC1kYXRhYmFzZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtl
cnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLmpzCShyZXZpc2lvbiAwKQor
KysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1k
YXRhYmFzZS5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxOSBAQAordmFyIGNvdW50ZXIgPSAw
OworZnVuY3Rpb24gcnVuVHJhbnNhY3Rpb24oKQoreworICAgIGRiLnRyYW5zYWN0aW9uKGZ1bmN0
aW9uKHR4KSB7CisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIFRlc3QgVkFMVUVT
ICgxKSIpOworICAgICAgICB0eC5leGVjdXRlU3FsKCJERUxFVEUgRlJPTSBUZXN0IFdIRVJFIEZv
byA9IDEiKTsKKyAgICAgICAgaWYgKCsrY291bnRlciA9PSAxMDApCisgICAgICAgICAgICBwb3N0
TWVzc2FnZSgidGVybWluYXRlIik7CisgICAgfSwgbnVsbCwgcnVuVHJhbnNhY3Rpb24pOworfQor
Cit2YXIgZGIgPSBvcGVuRGF0YWJhc2UoIkludGVycnVwdERhdGFiYXNlVGVzdCIsICIxIiwgIiIs
IDEpOworZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsKKyAgICB0eC5leGVjdXRlU3FsKCJD
UkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBUZXN0IChGb28gSU5UKSIpOworfSwgZnVuY3Rpb24o
ZXJyb3IpIHsKKyAgICBwb3N0TWVzc2FnZSgiRXJyb3I6ICIgKyBlcnJvci5tZXNzYWdlKTsKK30s
IGZ1bmN0aW9uKCkgeworICAgIHJ1blRyYW5zYWN0aW9uKCk7Cit9KTsK
</data>
<flag name="commit-queue"
          id="51057"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62892</attachid>
            <date>2010-07-28 16:51:37 -0700</date>
            <delta_ts>2010-07-28 19:26:09 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>35156</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0MjQ0KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTAtMDctMjggIER1bWl0cnUg
RGFuaWxpdWMgIDxkdW1pQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBBZGRlZCBhIHlpZWxkKCkgZnVuY3Rpb24uCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Mjg0MworCisgICAgICAg
ICogSmF2YVNjcmlwdENvcmUuZXhwOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnZjcHJvai9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5kZWY6CisgICAgICAgICogd3RmL1RocmVhZGlu
Zy5oOgorICAgICAgICAqIHd0Zi9UaHJlYWRpbmdQdGhyZWFkcy5jcHA6CisgICAgICAgIChXVEY6
OnlpZWxkKToKKyAgICAgICAgKiB3dGYvVGhyZWFkaW5nV2luLmNwcDoKKyAgICAgICAgKFdURjo6
eWllbGQpOgorICAgICAgICAqIHd0Zi9ndGsvVGhyZWFkaW5nR3RrLmNwcDoKKyAgICAgICAgKFdU
Rjo6eWllbGQpOgorICAgICAgICAqIHd0Zi9xdC9UaHJlYWRpbmdRdC5jcHA6CisgICAgICAgIChX
VEY6OnlpZWxkKToKKwogMjAxMC0wNy0yNyAgS2ludWtvIFlhc3VkYSAgPGtpbnVrb0BjaHJvbWl1
bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2phbiBWYWZhaS4KSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS5leHAJKHJldmlzaW9uIDY0MjQ0KQorKysgSmF2YVNjcmlwdENvcmUvSmF2
YVNjcmlwdENvcmUuZXhwCSh3b3JraW5nIGNvcHkpCkBAIC0zNjcsNiArMzY3LDcgQEAgX19aTjNX
VEY1TXV0ZXg2dW5sb2NrRXYKIF9fWk4zV1RGNU11dGV4N3RyeUxvY2tFdgogX19aTjNXVEY1TXV0
ZXhDMUV2CiBfX1pOM1dURjVNdXRleEQxRXYKK19fWk4zV1RGNXlpZWxkRXYKIF9fWk4zV1RGNnN0
cnRvZEVQS2NQUGMKIF9fWk4zV1RGN0NTdHJpbmcxMW11dGFibGVEYXRhRXYKIF9fWk4zV1RGN0NT
dHJpbmcxNm5ld1VuaW5pdGlhbGl6ZWRFbVJQYwpJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNj
cmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmRlZgo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUuZGVmCShyZXZpc2lvbiA2NDI0NCkKKysrIEphdmFTY3JpcHRDb3Jl
L0phdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5kZWYJ
KHdvcmtpbmcgY29weSkKQEAgLTMzMCw2ICszMzAsNyBAQCBFWFBPUlRTCiAgICAgP3dhaXRAVGhy
ZWFkQ29uZGl0aW9uQFdURkBAUUFFWEFBVk11dGV4QDJAQFoKICAgICA/d2FpdEZvclRocmVhZENv
bXBsZXRpb25AV1RGQEBZQUhJUEFQQVhAWgogICAgID93cml0YWJsZUBQcm9wZXJ0eURlc2NyaXB0
b3JASlNDQEBRQkVfTlhaCisgICAgP3lpZWxkQFdURkBAWUFYWFoKICAgICBXVEZMb2cKICAgICBX
VEZMb2dWZXJib3NlCiAgICAgV1RGUmVwb3J0QXJndW1lbnRBc3NlcnRpb25GYWlsdXJlCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS93dGYvVGhyZWFkaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlw
dENvcmUvd3RmL1RocmVhZGluZy5oCShyZXZpc2lvbiA2NDI0NCkKKysrIEphdmFTY3JpcHRDb3Jl
L3d0Zi9UaHJlYWRpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMTAxLDYgKzEwMSw3IEBAIFRocmVh
ZElkZW50aWZpZXIgY3VycmVudFRocmVhZCgpOwogaW50IHdhaXRGb3JUaHJlYWRDb21wbGV0aW9u
KFRocmVhZElkZW50aWZpZXIsIHZvaWQqKik7CiB2b2lkIGRldGFjaFRocmVhZChUaHJlYWRJZGVu
dGlmaWVyKTsKIAordm9pZCB5aWVsZCgpOwogCiB2b2lkIGxvY2tBdG9taWNhbGx5SW5pdGlhbGl6
ZWRTdGF0aWNNdXRleCgpOwogdm9pZCB1bmxvY2tBdG9taWNhbGx5SW5pdGlhbGl6ZWRTdGF0aWNN
dXRleCgpOwpAQCAtMTEyLDUgKzExMyw2IEBAIHVzaW5nIFdURjo6Y3JlYXRlVGhyZWFkOwogdXNp
bmcgV1RGOjpjdXJyZW50VGhyZWFkOwogdXNpbmcgV1RGOjpkZXRhY2hUaHJlYWQ7CiB1c2luZyBX
VEY6OndhaXRGb3JUaHJlYWRDb21wbGV0aW9uOwordXNpbmcgV1RGOjp5aWVsZDsKIAogI2VuZGlm
IC8vIFRocmVhZGluZ19oCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvVGhyZWFkaW5nUHRocmVh
ZHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmdQdGhyZWFk
cy5jcHAJKHJldmlzaW9uIDY0MjQ0KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL1RocmVhZGluZ1B0
aHJlYWRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBAQAogCiAjaWYgIUNPTVBJ
TEVSKE1TVkMpCiAjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KICNpbmNs
dWRlIDxzeXMvdGltZS5oPgogI2VuZGlmCiAKQEAgLTIyMSw2ICsyMjIsMTEgQEAgdm9pZCBkZXRh
Y2hUaHJlYWQoVGhyZWFkSWRlbnRpZmllciB0aHJlYQogICAgIHB0aHJlYWRfZGV0YWNoKHB0aHJl
YWRIYW5kbGUpOwogfQogCit2b2lkIHlpZWxkKCkKK3sKKyAgICBzY2hlZF95aWVsZCgpOworfQor
CiBUaHJlYWRJZGVudGlmaWVyIGN1cnJlbnRUaHJlYWQoKQogewogICAgIFRocmVhZElkZW50aWZp
ZXIgaWQgPSBUaHJlYWRJZGVudGlmaWVyRGF0YTo6aWRlbnRpZmllcigpOwpJbmRleDogSmF2YVNj
cmlwdENvcmUvd3RmL1RocmVhZGluZ1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvd3RmL1RocmVhZGluZ1dpbi5jcHAJKHJldmlzaW9uIDY0MjQ0KQorKysgSmF2YVNjcmlwdENv
cmUvd3RmL1RocmVhZGluZ1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2Niw2ICsyNjYsMTEg
QEAgdm9pZCBkZXRhY2hUaHJlYWQoVGhyZWFkSWRlbnRpZmllciB0aHJlYQogICAgIGNsZWFyVGhy
ZWFkSGFuZGxlRm9ySWRlbnRpZmllcih0aHJlYWRJRCk7CiB9CiAKK3ZvaWQgeWllbGQoKQorewor
ICAgIDo6U3dpdGNoVG9UaHJlYWQoKTsKK30KKwogVGhyZWFkSWRlbnRpZmllciBjdXJyZW50VGhy
ZWFkKCkKIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGhyZWFkSWRlbnRpZmllcj4oR2V0Q3Vy
cmVudFRocmVhZElkKCkpOwpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL2d0ay9UaHJlYWRpbmdH
dGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi9ndGsvVGhyZWFkaW5nR3Rr
LmNwcAkocmV2aXNpb24gNjQyNDQpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvZ3RrL1RocmVhZGlu
Z0d0ay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2Nyw2ICsxNjcsMTEgQEAgVGhyZWFkSWRlbnRp
ZmllciBjdXJyZW50VGhyZWFkKCkKICAgICByZXR1cm4gZXN0YWJsaXNoSWRlbnRpZmllckZvclRo
cmVhZChjdXJyZW50VGhyZWFkKTsKIH0KIAordm9pZCB5aWVsZCgpCit7CisgICAgZ190aHJlYWRf
eWllbGQoKTsKK30KKwogTXV0ZXg6Ok11dGV4KCkKICAgICA6IG1fbXV0ZXgoZ19tdXRleF9uZXco
KSkKIHsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9xdC9UaHJlYWRpbmdRdC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3F0L1RocmVhZGluZ1F0LmNwcAkocmV2aXNpb24g
NjQyNDQpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvcXQvVGhyZWFkaW5nUXQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yMDgsNiArMjA4LDE2IEBAIFRocmVhZElkZW50aWZpZXIgY3VycmVudFRocmVh
ZCgpCiAgICAgcmV0dXJuIGVzdGFibGlzaElkZW50aWZpZXJGb3JUaHJlYWQoY3VycmVudFRocmVh
ZCk7CiB9CiAKK2NsYXNzIFlpZWxkaW5nUVRocmVhZCA6IHB1YmxpYyBRVGhyZWFkIHsKK3B1Ymxp
YzoKKyAgICB2b2lkIHlpZWxkKCkgeyBRVGhyZWFkOjpzbGVlcCgwKTsgfQorfTsKKwordm9pZCB5
aWVsZCgpCit7CisgICAgc3RhdGljX2Nhc3Q8WWllbGRpbmdRVGhyZWFkKj4oUVRocmVhZDo6Y3Vy
cmVudFRocmVhZCgpKS0+eWllbGQoKTsKK30KKwogTXV0ZXg6Ok11dGV4KCkKICAgICA6IG1fbXV0
ZXgobmV3IFFNdXRleCgpKQogewpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0MjQ0KQorKysgV2ViQ29yZS9DaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw4OSBAQAorMjAxMC0wNy0yOCAgRHVtaXRydSBE
YW5pbGl1YyAgPGR1bWlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEludGVycnVwdCBhbGwgREIgb3BlcmF0aW9ucyB3aGVuIHRo
ZSB3b3JrZXIgaXMgdGVybWluYXRpbmcuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD00Mjg0MworCisgICAgICAgIFRlc3RzOiBmYXN0L3dvcmtlcnMvc3Rv
cmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sCisgICAgICAgICAgICAgICBmYXN0L3dv
cmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbAorCisgICAgICAgICogYmluZGlu
Z3MvanMvSlNDdXN0b21Wb2lkQ2FsbGJhY2suY3BwOgorICAgICAgICAoV2ViQ29yZTo6SlNDdXN0
b21Wb2lkQ2FsbGJhY2s6On5KU0N1c3RvbVZvaWRDYWxsYmFjayk6IElmIHRoZQorICAgICAgICBk
ZXN0cnVjdG9yIGlzIGNhbGxlZCBvbiB0aGUgY29udGV4dCB0aHJlYWQsIGRlbGV0ZSBtX2RhdGEg
ZGlyZWN0bHkKKyAgICAgICAgaW5zdGVhZCBvZiBwb3N0aW5nIGEgdGFzayB0byBkbyB0aGF0LiBX
ZSBuZWVkIHRvIGRvIHRoYXQgdG8gbWFrZQorICAgICAgICBzdXJlIHRoYXQgYWxsIEpTIG9iamVj
dHMgYXJlIGRlc3Ryb3llZCBiZWZvcmUKKyAgICAgICAgV29ya2VyVGhyZWFkU2h1dGRvd25GaW5p
c2hUYXNrIChpbiBXb3JrZXJUaHJlYWQuY3BwKSBjYWxscworICAgICAgICBXb3JrZXJDb250ZXh0
OjpjbGVhclNjcmlwdCgpLgorCisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJh
dG9ySlMucG06IFNhbWUgY2hhbmdlIGFzIGFib3ZlLCBmb3IKKyAgICAgICAgYWxsIGF1dG8tZ2Vu
ZXJhdGVkIGNhbGxiYWNrcy4KKworICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9K
U1Rlc3RDYWxsYmFjay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RDYWxsYmFjazo6fkpT
VGVzdENhbGxiYWNrKTogVXBkYXRlZCB0aGUKKyAgICAgICAgZXhwZWN0YXRpb25zIGZvciBydW4t
YmluZGluZ3MtdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2Uu
Y3BwOiBBZGRlZCB0aGUgYWJpbGl0eSB0byBpbnRlcnJ1cHQKKyAgICAgICAgYWxsIERCIG9wZXJh
dGlvbnMgaW4gcHJvZ3Jlc3MsIHVubGVzcyB0aGUgZGF0YWJhc2Ugd2FzIGNsb3NlZCBvcgorICAg
ICAgICBpcyBiZWluZyBjbG9zZWQuIFVubGlrZSBzcWxpdGUzX2ludGVycnVwdCgpLAorICAgICAg
ICBTUUxpdGVEYXRhYmFzZTo6aW50ZXJydXB0KCkgaXMgc3RpY2t5OiBvbmNlIGl0J3MgY2FsbGVk
LCB0cnlpbmcgdG8KKyAgICAgICAgcnVuIGFueSBzdGF0ZW1lbnQgb24gdGhhdCBkYXRhYmFzZSB3
aWxsIGZhaWwgd2l0aCBhCisgICAgICAgIFNRTElURV9JTlRFUlJVUFQgZXJyb3IgY29kZS4KKyAg
ICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSk6CisgICAgICAg
IChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6Y2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6U1FM
aXRlRGF0YWJhc2U6OmludGVycnVwdCk6CisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVEYXRhYmFz
ZTo6aXNJbnRlcnJ1cHRlZCk6CisKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJh
c2UuaDogQWRkZWQgYSBtdXRleCB0aGF0IGNhbiB1c2VkIGJ5CisgICAgICAgIFNRTGl0ZVN0YXRl
bWVudCB0byBjaGVjayBpZiB0aGUgZGF0YWJhc2Ugd2FzIGludGVycnVwdGVkLgorICAgICAgICAo
V2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OmRhdGFiYXNlTXV0ZXgpOgorCisgICAgICAgICogcGxh
dGZvcm0vc3FsL1NRTGl0ZVN0YXRlbWVudC5jcHA6IENoYW5nZWQgcHJlcGFyZSgpIGFuZCBzdGVw
KCkKKyAgICAgICAgdG8gY2hlY2sgaWYgdGhlIGRhdGFiYXNlIHdhcyBpbnRlcnJ1cHRlZCwgYmVm
b3JlIHRyeWluZyB0byBwcmVwYXJlCisgICAgICAgIG9yIHJ1biB0aGUgc3RhdGVtZW50LiBUaGUg
b3RoZXIgbWV0aG9kcyBkb24ndCBuZWVkIHRvIGhvbGQgb24gdG8KKyAgICAgICAgdGhlIERCIGxv
Y2sgd2hpbGUgcnVubmluZywgYmVjYXVzZSB0aGV5J3JlIGZhc3QsIHNvIHdlIGRvbid0IG5lZWQK
KyAgICAgICAgdG8gaW50ZXJydXB0IHRoZW0uCisgICAgICAgIChXZWJDb3JlOjpTUUxpdGVTdGF0
ZW1lbnQ6OnByZXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50OjpzdGVw
KToKKworICAgICAgICAqIHN0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5jcHA6IE1hZGUgU1FMaXRl
RGF0YWJhc2U6OmludGVycnVwdCgpCisgICAgICAgIGFuZCBpc0ludGVycnVwdGVkKCkgdmlzaWJs
ZSB0byBXZWJTUUxEYXRhYmFzZXMgY2xhc3Nlcy4KKyAgICAgICAgKFdlYkNvcmU6OkFic3RyYWN0
RGF0YWJhc2U6OmludGVycnVwdCk6CisgICAgICAgIChXZWJDb3JlOjpBYnN0cmFjdERhdGFiYXNl
Ojppc0ludGVycnVwdGVkKToKKyAgICAgICAgKiBzdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuaDoK
KworICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcDogQWRkZWQgYSBtZXRob2Qg
dG8gaW50ZXJydXB0IGFsbAorICAgICAgICBkYXRhYmFzZXMgaW4gYSBnaXZlbiBjb250ZXh0Lgor
ICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjppbnRlcnJ1cHRBbGxEYXRhYmFzZXNG
b3JDb250ZXh0KToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oOgorCisgICAg
ICAgICogc3RvcmFnZS9TUUxTdGF0ZW1lbnQuY3BwOiBDaGFuZ2VkIHRoZSBleGNlcHRpb24vZXJy
b3IgcmVwb3J0ZWQKKyAgICAgICAgd2hlbiBhIHN0YXRlbWVudCBpcyBpbnRlcnJ1cHRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlNRTFN0YXRlbWVudDo6ZXhlY3V0ZSk6CisgICAgICAgICogc3RvcmFn
ZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNRTFN0YXRlbWVudFN5
bmM6OmV4ZWN1dGUpOgorCisgICAgICAgICogc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHA6IENo
YW5nZWQgdGhlIGNvZGUgdG8gcmVsZWFzZSB0aGUKKyAgICAgICAgY2FsbGJhY2sgb2JqZWN0cyBh
cyBzb29uIGFzIHRoZXkncmUgbm90IG5lZWRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5z
YWN0aW9uOjpjaGVja0FuZEhhbmRsZUNsb3NlZE9ySW50ZXJydXB0ZWREYXRhYmFzZSk6CisgICAg
ICAgIENoYW5nZWQgdGhpcyBtZXRob2QgdG8gbm90IHNjaGVkdWxlIHRoZSBuZXh0IHRyYW5zYWN0
aW9uIHN0ZXAgd2hlbgorICAgICAgICB0aGUgZGF0YWJhc2UgaXMgaW50ZXJydXB0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6cGVyZm9ybU5leHRTdGVwKToKKyAgICAgICAg
KFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpwZXJmb3JtUGVuZGluZ0NhbGxiYWNrKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyVHJhbnNhY3Rpb25DYWxsYmFjayk6
CisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6cG9zdGZsaWdodEFuZENvbW1pdCk6
CisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6ZGVsaXZlclRyYW5zYWN0aW9uRXJy
b3JDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6Y2xlYW51cEFm
dGVyVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKToKKyAgICAgICAgKiBzdG9yYWdlL1NRTFRyYW5z
YWN0aW9uLmg6CisKKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNo
cm9taXVtLmNwcDogQWRkZWQgYSBtZXRob2QgdG8KKyAgICAgICAgaW50ZXJydXB0IGFsbCBkYXRh
YmFzZXMgaW4gYSBnaXZlbiBjb250ZXh0LgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFj
a2VyOjppbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KToKKworICAgICAgICAqIHdvcmtl
cnMvV29ya2VyVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlclRocmVhZDo6c3Rv
cCk6IEFkZGVkIGEgY2FsbCB0bworICAgICAgICBEYXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFs
bERhdGFiYXNlc0ZvckNvbnRleHQoKS4KKwogMjAxMC0wNy0yOCAgVG9ueSBDaGFuZyAgPHRvbnlA
Y2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE9qYW4gVmFmYWkuCkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ3VzdG9tVm9pZENhbGxiYWNrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ3VzdG9tVm9pZENhbGxiYWNrLmNwcAkocmV2aXNpb24g
NjQyNDQpCisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ3VzdG9tVm9pZENhbGxiYWNrLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsMTAgQEAgSlNDdXN0b21Wb2lkQ2FsbGJhY2s6OkpT
Q3VzdG9tVm9pZENhbGxiYQogCiBKU0N1c3RvbVZvaWRDYWxsYmFjazo6fkpTQ3VzdG9tVm9pZENh
bGxiYWNrKCkKIHsKLSAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKERlbGV0
ZUNhbGxiYWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTsKKyAgICBpZiAobV9zY3JpcHRFeGVj
dXRpb25Db250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSkKKyAgICAgICAgZGVsZXRlIG1fZGF0YTsK
KyAgICBlbHNlCisgICAgICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soRGVs
ZXRlQ2FsbGJhY2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpOwogI2lmbmRlZiBOREVCVUcKICAg
ICBtX2RhdGEgPSAwOwogI2VuZGlmCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvckpTLnBtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9D
b2RlR2VuZXJhdG9ySlMucG0JKHJldmlzaW9uIDY0MjQ0KQorKysgV2ViQ29yZS9iaW5kaW5ncy9z
Y3JpcHRzL0NvZGVHZW5lcmF0b3JKUy5wbQkod29ya2luZyBjb3B5KQpAQCAtMjE1MSw3ICsyMTUx
LDEwIEBAIHN1YiBHZW5lcmF0ZUNhbGxiYWNrSW1wbGVtZW50YXRpb24KICAgICAjIERlc3RydWN0
b3IKICAgICBwdXNoKEBpbXBsQ29udGVudCwgIiR7Y2xhc3NOYW1lfTo6fiR7Y2xhc3NOYW1lfSgp
XG4iKTsKICAgICBwdXNoKEBpbXBsQ29udGVudCwgIntcbiIpOwotICAgIHB1c2goQGltcGxDb250
ZW50LCAiICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soRGVsZXRlQ2FsbGJh
Y2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpO1xuIik7CisgICAgcHVzaChAaW1wbENvbnRlbnQs
ICIgICAgaWYgKG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpXG4i
KTsKKyAgICBwdXNoKEBpbXBsQ29udGVudCwgIiAgICAgICAgZGVsZXRlIG1fZGF0YTtcbiIpOwor
ICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgIGVsc2VcbiIpOworICAgIHB1c2goQGltcGxDb250
ZW50LCAiICAgICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKERlbGV0ZUNh
bGxiYWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTtcbiIpOwogICAgIHB1c2goQGltcGxDb250
ZW50LCAiI2lmbmRlZiBOREVCVUdcbiIpOwogICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgIG1f
ZGF0YSA9IDA7XG4iKTsKICAgICBwdXNoKEBpbXBsQ29udGVudCwgIiNlbmRpZlxuIik7CkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RDYWxsYmFjay5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0Q2FsbGJh
Y2suY3BwCShyZXZpc2lvbiA2NDI0NCkKKysrIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0
L0pTL0pTVGVzdENhbGxiYWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDMsNyArNDMsMTAgQEAg
SlNUZXN0Q2FsbGJhY2s6OkpTVGVzdENhbGxiYWNrKEpTT2JqZWN0KgogCiBKU1Rlc3RDYWxsYmFj
azo6fkpTVGVzdENhbGxiYWNrKCkKIHsKLSAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBv
c3RUYXNrKERlbGV0ZUNhbGxiYWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTsKKyAgICBpZiAo
bV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSkKKyAgICAgICAgZGVs
ZXRlIG1fZGF0YTsKKyAgICBlbHNlCisgICAgICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+
cG9zdFRhc2soRGVsZXRlQ2FsbGJhY2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpOwogI2lmbmRl
ZiBOREVCVUcKICAgICBtX2RhdGEgPSAwOwogI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9z
cWwvU1FMaXRlRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA2NDI0NCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsOCArMzEsOCBA
QAogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJTUUxpdGVGaWxlU3lzdGVtLmgiCiAj
aW5jbHVkZSAiU1FMaXRlU3RhdGVtZW50LmgiCi0KICNpbmNsdWRlIDxzcWxpdGUzLmg+CisjaW5j
bHVkZSA8d3RmL1RocmVhZGluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTQzLDEz
ICs0MywxMyBAQCBjb25zdCBpbnQgU1FMUmVzdWx0Um93ID0gU1FMSVRFX1JPVzsKIGNvbnN0IGlu
dCBTUUxSZXN1bHRTY2hlbWEgPSBTUUxJVEVfU0NIRU1BOwogY29uc3QgaW50IFNRTFJlc3VsdEZ1
bGwgPSBTUUxJVEVfRlVMTDsKIAotCiBTUUxpdGVEYXRhYmFzZTo6U1FMaXRlRGF0YWJhc2UoKQog
ICAgIDogbV9kYigwKQogICAgICwgbV9wYWdlU2l6ZSgtMSkKICAgICAsIG1fdHJhbnNhY3Rpb25J
blByb2dyZXNzKGZhbHNlKQogICAgICwgbV9zaGFyYWJsZShmYWxzZSkKICAgICAsIG1fb3Blbmlu
Z1RocmVhZCgwKQorICAgICwgbV9pbnRlcnJ1cHRlZChmYWxzZSkKIHsKIH0KIApAQCAtODMsMTUg
KzgzLDM4IEBAIGJvb2wgU1FMaXRlRGF0YWJhc2U6Om9wZW4oY29uc3QgU3RyaW5nJiAKIHZvaWQg
U1FMaXRlRGF0YWJhc2U6OmNsb3NlKCkKIHsKICAgICBpZiAobV9kYikgewotICAgICAgICAvLyBG
SVhNRTogVGhpcyBpcyBiZWluZyBjYWxsZWQgb24gdGhlbWFpbiB0aHJlYWQgZHVyaW5nIEpTIEdD
LiA8cmRhcjovL3Byb2JsZW0vNTczOTgxOD4KLSAgICAgICAgLy8gQVNTRVJUKGN1cnJlbnRUaHJl
YWQoKSA9PSBtX29wZW5pbmdUaHJlYWQpOwotICAgICAgICBzcWxpdGUzX2Nsb3NlKG1fZGIpOwot
ICAgICAgICBtX2RiID0gMDsKKyAgICAgICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX29w
ZW5pbmdUaHJlYWQpOworICAgICAgICBzcWxpdGUzKiBkYiA9IG1fZGI7CisgICAgICAgIHsKKyAg
ICAgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2RhdGFiYXNlQ2xvc2luZ011dGV4KTsKKyAg
ICAgICAgICAgIG1fZGIgPSAwOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZTNfY2xvc2UoZGIp
OwogICAgIH0KIAogICAgIG1fb3BlbmluZ1RocmVhZCA9IDA7CiB9CiAKK3ZvaWQgU1FMaXRlRGF0
YWJhc2U6OmludGVycnVwdCgpCit7CisgICAgbV9pbnRlcnJ1cHRlZCA9IHRydWU7CisgICAgd2hp
bGUgKCFtX2xvY2tpbmdNdXRleC50cnlMb2NrKCkpIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9j
a2VyKG1fZGF0YWJhc2VDbG9zaW5nTXV0ZXgpOworICAgICAgICBpZiAoIW1fZGIpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIHNxbGl0ZTNfaW50ZXJydXB0KG1fZGIpOworICAgICAgICB5
aWVsZCgpOworICAgIH0KKworICAgIG1fbG9ja2luZ011dGV4LnVubG9jaygpOworfQorCitib29s
IFNRTGl0ZURhdGFiYXNlOjppc0ludGVycnVwdGVkKCkKK3sKKyAgICBBU1NFUlQoIW1fbG9ja2lu
Z011dGV4LnRyeUxvY2soKSk7CisgICAgcmV0dXJuIG1faW50ZXJydXB0ZWQ7Cit9CisKIHZvaWQg
U1FMaXRlRGF0YWJhc2U6OnNldEZ1bGxzeW5jKGJvb2wgZnN5bmMpIAogewogICAgIGlmIChmc3lu
YykgCkBAIC0zOTcsMTYgKzQyMCw2IEBAIHZvaWQgU1FMaXRlRGF0YWJhc2U6OmVuYWJsZUF1dGhv
cml6ZXIoYm8KICAgICAgICAgc3FsaXRlM19zZXRfYXV0aG9yaXplcihtX2RiLCBOVUxMLCAwKTsK
IH0KIAotdm9pZCBTUUxpdGVEYXRhYmFzZTo6bG9jaygpCi17Ci0gICAgbV9sb2NraW5nTXV0ZXgu
bG9jaygpOwotfQotCi12b2lkIFNRTGl0ZURhdGFiYXNlOjp1bmxvY2soKQotewotICAgIG1fbG9j
a2luZ011dGV4LnVubG9jaygpOwotfQotCiBib29sIFNRTGl0ZURhdGFiYXNlOjppc0F1dG9Db21t
aXRPbigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHNxbGl0ZTNfZ2V0X2F1dG9jb21taXQobV9kYik7
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgJKHJldmlzaW9uIDY0MjQ0
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkod29ya2luZyBjb3B5
KQpAQCAtNTgsNiArNTgsOCBAQCBwdWJsaWM6CiAgICAgYm9vbCBvcGVuKGNvbnN0IFN0cmluZyYg
ZmlsZW5hbWUsIGJvb2wgZm9yV2ViU1FMRGF0YWJhc2UgPSBmYWxzZSk7CiAgICAgYm9vbCBpc09w
ZW4oKSBjb25zdCB7IHJldHVybiBtX2RiOyB9CiAgICAgdm9pZCBjbG9zZSgpOworICAgIHZvaWQg
aW50ZXJydXB0KCk7CisgICAgYm9vbCBpc0ludGVycnVwdGVkKCk7CiAKICAgICBib29sIGV4ZWN1
dGVDb21tYW5kKGNvbnN0IFN0cmluZyYpOwogICAgIGJvb2wgcmV0dXJuc0F0TGVhc3RPbmVSZXN1
bHQoY29uc3QgU3RyaW5nJik7CkBAIC0xMDUsOSArMTA3LDcgQEAgcHVibGljOgogICAgIAogICAg
IHZvaWQgc2V0QXV0aG9yaXplcihQYXNzUmVmUHRyPERhdGFiYXNlQXV0aG9yaXplcj4pOwogCi0g
ICAgLy8gKHVuKWxvY2tzIHRoZSBkYXRhYmFzZSBsaWtlIGEgbXV0ZXgKLSAgICB2b2lkIGxvY2so
KTsKLSAgICB2b2lkIHVubG9jaygpOworICAgIE11dGV4JiBkYXRhYmFzZU11dGV4KCkgeyByZXR1
cm4gbV9sb2NraW5nTXV0ZXg7IH0KICAgICBib29sIGlzQXV0b0NvbW1pdE9uKCkgY29uc3Q7CiAK
ICAgICAvLyBUaGUgU1FMaXRlIEFVVE9fVkFDVVVNIHByYWdtYSBjYW4gYmUgZWl0aGVyIE5PTkUs
IEZVTEwsIG9yIElOQ1JFTUVOVEFMLgpAQCAtMTQ5LDcgKzE0OSw5IEBAIHByaXZhdGU6CiAKICAg
ICBNdXRleCBtX2xvY2tpbmdNdXRleDsKICAgICBUaHJlYWRJZGVudGlmaWVyIG1fb3BlbmluZ1Ro
cmVhZDsKLSAgICAKKworICAgIE11dGV4IG1fZGF0YWJhc2VDbG9zaW5nTXV0ZXg7CisgICAgYm9v
bCBtX2ludGVycnVwdGVkOwogfTsgLy8gY2xhc3MgU1FMaXRlRGF0YWJhc2UKIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3RhdGVtZW50
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVTdGF0ZW1lbnQu
Y3BwCShyZXZpc2lvbiA2NDI0NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0YXRl
bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYxLDYgKzYxLDExIEBAIFNRTGl0ZVN0YXRlbWVu
dDo6flNRTGl0ZVN0YXRlbWVudCgpCiBpbnQgU1FMaXRlU3RhdGVtZW50OjpwcmVwYXJlKCkKIHsK
ICAgICBBU1NFUlQoIW1faXNQcmVwYXJlZCk7CisKKyAgICBNdXRleExvY2tlciBkYXRhYmFzZUxv
Y2sobV9kYXRhYmFzZS5kYXRhYmFzZU11dGV4KCkpOworICAgIGlmIChtX2RhdGFiYXNlLmlzSW50
ZXJydXB0ZWQoKSkKKyAgICAgICAgcmV0dXJuIFNRTElURV9JTlRFUlJVUFQ7CisKICAgICBjb25z
dCB2b2lkKiB0YWlsID0gMDsKICAgICBMT0coU1FMRGF0YWJhc2UsICJTUUwgLSBwcmVwYXJlIC0g
JXMiLCBtX3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKICAgICBTdHJpbmcgc3RyaXBwZWRRdWVyeSA9
IG1fcXVlcnkuc3RyaXBXaGl0ZVNwYWNlKCk7CkBAIC04OCw2ICs5MywxMSBAQCBpbnQgU1FMaXRl
U3RhdGVtZW50OjpwcmVwYXJlKCkKIGludCBTUUxpdGVTdGF0ZW1lbnQ6OnN0ZXAoKQogewogICAg
IEFTU0VSVChtX2lzUHJlcGFyZWQpOworCisgICAgTXV0ZXhMb2NrZXIgZGF0YWJhc2VMb2NrKG1f
ZGF0YWJhc2UuZGF0YWJhc2VNdXRleCgpKTsKKyAgICBpZiAobV9kYXRhYmFzZS5pc0ludGVycnVw
dGVkKCkpCisgICAgICAgIHJldHVybiBTUUxJVEVfSU5URVJSVVBUOworCiAgICAgaWYgKCFtX3N0
YXRlbWVudCkKICAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKICAgICBMT0coU1FMRGF0YWJhc2Us
ICJTUUwgLSBzdGVwIC0gJXMiLCBtX3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKSW5kZXg6IFdlYkNv
cmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0
b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5jcHAJKHJldmlzaW9uIDY0MjQ0KQorKysgV2ViQ29yZS9z
dG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NzQsNiArNDc0
LDE3IEBAIHZvaWQgQWJzdHJhY3REYXRhYmFzZTo6aW5jcmVtZW50YWxWYWN1dW0KICAgICAgICAg
bV9zcWxpdGVEYXRhYmFzZS5ydW5JbmNyZW1lbnRhbFZhY3V1bUNvbW1hbmQoKTsKIH0KIAordm9p
ZCBBYnN0cmFjdERhdGFiYXNlOjppbnRlcnJ1cHQoKQoreworICAgIG1fc3FsaXRlRGF0YWJhc2Uu
aW50ZXJydXB0KCk7Cit9CisKK2Jvb2wgQWJzdHJhY3REYXRhYmFzZTo6aXNJbnRlcnJ1cHRlZCgp
Cit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fc3FsaXRlRGF0YWJhc2UuZGF0YWJhc2VNdXRl
eCgpKTsKKyAgICByZXR1cm4gbV9zcWxpdGVEYXRhYmFzZS5pc0ludGVycnVwdGVkKCk7Cit9CisK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIEVOQUJMRShEQVRBQkFTRSkKSW5k
ZXg6IFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuaAkocmV2aXNpb24gNjQyNDQpCisrKyBXZWJD
b3JlL3N0b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC02OCw2ICs2
OCw4IEBAIHB1YmxpYzoKIAogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXhpbXVtU2l6ZSgpIGNv
bnN0OwogICAgIHZvaWQgaW5jcmVtZW50YWxWYWN1dW1JZk5lZWRlZCgpOworICAgIHZvaWQgaW50
ZXJydXB0KCk7CisgICAgYm9vbCBpc0ludGVycnVwdGVkKCk7CiAKICAgICAvLyBGSVhNRTogbW92
ZSBhbGwgdmVyc2lvbi1yZWxhdGVkIG1ldGhvZHMgdG8gYSBEYXRhYmFzZVZlcnNpb25UcmFja2Vy
IGNsYXNzCiAgICAgYm9vbCB2ZXJzaW9uTWF0Y2hlc0V4cGVjdGVkKCkgY29uc3Q7CkluZGV4OiBX
ZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAkocmV2aXNpb24gNjQyNDQpCisrKyBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjM1LDYgKzIz
NSwzNSBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VDaGFuZ2VkKEFiCiAgICAgb3Jp
Z2luUXVvdGFNYW5hZ2VyKCkubWFya0RhdGFiYXNlKGRhdGFiYXNlKTsKIH0KIAordm9pZCBEYXRh
YmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQoY29uc3QgU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0
RGF0YWJhc2U+ID4gb3BlbkRhdGFiYXNlczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIG9w
ZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CisKKyAgICAgICAgaWYg
KCFtX29wZW5EYXRhYmFzZU1hcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBEYXRh
YmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KGNvbnRleHQtPnNl
Y3VyaXR5T3JpZ2luKCkpOworICAgICAgICBpZiAoIW5hbWVNYXApCisgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVNYXBF
bmRJdCA9IG5hbWVNYXAtPmVuZCgpOworICAgICAgICBmb3IgKERhdGFiYXNlTmFtZU1hcDo6Y29u
c3RfaXRlcmF0b3IgZGJOYW1lTWFwSXQgPSBuYW1lTWFwLT5iZWdpbigpOyBkYk5hbWVNYXBJdCAh
PSBkYk5hbWVNYXBFbmRJdDsgKytkYk5hbWVNYXBJdCkgeworICAgICAgICAgICAgRGF0YWJhc2VT
ZXQqIGRhdGFiYXNlU2V0ID0gZGJOYW1lTWFwSXQtPnNlY29uZDsKKyAgICAgICAgICAgIERhdGFi
YXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgpOwor
ICAgICAgICAgICAgZm9yIChEYXRhYmFzZVNldDo6Y29uc3RfaXRlcmF0b3IgZGJTZXRJdCA9IGRh
dGFiYXNlU2V0LT5iZWdpbigpOyBkYlNldEl0ICE9IGRiU2V0RW5kSXQ7ICsrZGJTZXRJdCkgewor
ICAgICAgICAgICAgICAgIGlmICgoKmRiU2V0SXQpLT5zY3JpcHRFeGVjdXRpb25Db250ZXh0KCkg
PT0gY29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgb3BlbkRhdGFiYXNlcy5hcHBlbmQoKmRi
U2V0SXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmVjdG9yPFJl
ZlB0cjxBYnN0cmFjdERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzRW5k
SXQgPSBvcGVuRGF0YWJhc2VzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFJlZlB0cjxBYnN0cmFj
dERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzSXQgPSBvcGVuRGF0YWJh
c2VzLmJlZ2luKCk7IG9wZW5EYXRhYmFzZXNJdCAhPSBvcGVuRGF0YWJhc2VzRW5kSXQ7ICsrb3Bl
bkRhdGFiYXNlc0l0KQorICAgICAgICAoKm9wZW5EYXRhYmFzZXNJdCktPmludGVycnVwdCgpOwor
fQorCiBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5QYXRoKFNlY3VyaXR5T3JpZ2luKiBv
cmlnaW4pIGNvbnN0CiB7CiAgICAgcmV0dXJuIFNRTGl0ZUZpbGVTeXN0ZW06OmFwcGVuZERhdGFi
YXNlRmlsZU5hbWVUb1BhdGgobV9kYXRhYmFzZURpcmVjdG9yeVBhdGgudGhyZWFkc2FmZUNvcHko
KSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VUcmFja2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
VHJhY2tlci5oCShyZXZpc2lvbiA2NDI0NCkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRy
YWNrZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNzgsNiArNzgsOCBAQCBwdWJsaWM6CiAgICAgdW5z
aWduZWQgbG9uZyBsb25nIGdldE1heFNpemVGb3JEYXRhYmFzZShjb25zdCBBYnN0cmFjdERhdGFi
YXNlKik7CiAgICAgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQWJzdHJhY3REYXRhYmFzZSopOwogCisg
ICAgdm9pZCBpbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KGNvbnN0IFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQqKTsKKwogcHJpdmF0ZToKICAgICBEYXRhYmFzZVRyYWNrZXIoY29uc3QgU3Ry
aW5nJiBkYXRhYmFzZVBhdGgpOwogCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAkocmV2
aXNpb24gNjQyNDQpCisrKyBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNzgsNyArNzgsNyBAQCBib29sIFNRTFN0YXRlbWVudDo6ZXhlY3V0ZShEYXRh
YmFzZSogZGIpCiAKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdE9rKSB7CiAgICAgICAgIExP
RyhTdG9yYWdlQVBJLCAiVW5hYmxlIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiBzdGF0ZW1lbnQg
JXMgLSBlcnJvciAlaSAoJXMpIiwgbV9zdGF0ZW1lbnQuYXNjaWkoKS5kYXRhKCksIHJlc3VsdCwg
ZGF0YWJhc2UtPmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgbV9lcnJvciA9IFNRTEVycm9yOjpj
cmVhdGUoU1FMRXJyb3I6OlNZTlRBWF9FUlIsIGRhdGFiYXNlLT5sYXN0RXJyb3JNc2coKSk7Cisg
ICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKGRiLT5pc0ludGVycnVwdGVkKCkgPyBT
UUxFcnJvcjo6REFUQUJBU0VfRVJSIDogU1FMRXJyb3I6OlNZTlRBWF9FUlIsIGRhdGFiYXNlLT5s
YXN0RXJyb3JNc2coKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTg2LDcg
Kzg2LDcgQEAgYm9vbCBTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUoRGF0YWJhc2UqIGRiKQogICAgIC8v
IElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZXkgbWlnaHQgYmUgdHJ5aW5nIHRvIGRvIHNvbWV0aGlu
ZyBmaXNoeSBvciBtYWxpY2lvdXMKICAgICBpZiAoc3RhdGVtZW50LmJpbmRQYXJhbWV0ZXJDb3Vu
dCgpICE9IG1fYXJndW1lbnRzLnNpemUoKSkgewogICAgICAgICBMT0coU3RvcmFnZUFQSSwgIkJp
bmQgcGFyYW1ldGVyIGNvdW50IGRvZXNuJ3QgbWF0Y2ggbnVtYmVyIG9mIHF1ZXN0aW9uIG1hcmtz
Iik7Ci0gICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKFNRTEVycm9yOjpTWU5UQVhf
RVJSLCAibnVtYmVyIG9mICc/J3MgaW4gc3RhdGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRjaCBh
cmd1bWVudCBjb3VudCIpOworICAgICAgICBtX2Vycm9yID0gU1FMRXJyb3I6OmNyZWF0ZShkYi0+
aXNJbnRlcnJ1cHRlZCgpID8gU1FMRXJyb3I6OkRBVEFCQVNFX0VSUiA6IFNRTEVycm9yOjpTWU5U
QVhfRVJSLCAibnVtYmVyIG9mICc/J3MgaW4gc3RhdGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRj
aCBhcmd1bWVudCBjb3VudCIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkluZGV4
OiBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50U3luYy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwCShyZXZpc2lvbiA2NDI0NCkKKysrIFdl
YkNvcmUvc3RvcmFnZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjEs
MTIgKzYxLDEyIEBAIFBhc3NSZWZQdHI8U1FMUmVzdWx0U2V0PiBTUUxTdGF0ZW1lbnRTeW4KICAg
ICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KCpkYXRhYmFzZSwgbV9zdGF0ZW1lbnQpOwogICAg
IGludCByZXN1bHQgPSBzdGF0ZW1lbnQucHJlcGFyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gU1FM
UmVzdWx0T2spIHsKLSAgICAgICAgZWMgPSBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlI7CisgICAg
ICAgIGVjID0gKGRiLT5pc0ludGVycnVwdGVkKCkgPyBTUUxFeGNlcHRpb246OkRBVEFCQVNFX0VS
UiA6IFNRTEV4Y2VwdGlvbjo6U1lOVEFYX0VSUik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0K
IAogICAgIGlmIChzdGF0ZW1lbnQuYmluZFBhcmFtZXRlckNvdW50KCkgIT0gbV9hcmd1bWVudHMu
c2l6ZSgpKSB7Ci0gICAgICAgIGVjID0gU1FMRXhjZXB0aW9uOjpTWU5UQVhfRVJSOworICAgICAg
ICBlYyA9IChkYi0+aXNJbnRlcnJ1cHRlZCgpPyBTUUxFeGNlcHRpb246OkRBVEFCQVNFX0VSUiA6
IFNRTEV4Y2VwdGlvbjo6U1lOVEFYX0VSUik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApJ
bmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCShyZXZpc2lvbiA2NDI0NCkKKysrIFdl
YkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0Niwx
NyArMTQ2LDIyIEBAIGNvbnN0IGNoYXIqIFNRTFRyYW5zYWN0aW9uOjpkZWJ1Z1N0ZXBOYW0KIH0K
ICNlbmRpZgogCi12b2lkIFNRTFRyYW5zYWN0aW9uOjpjaGVja0FuZEhhbmRsZUNsb3NlZERhdGFi
YXNlKCkKK3ZvaWQgU1FMVHJhbnNhY3Rpb246OmNoZWNrQW5kSGFuZGxlQ2xvc2VkT3JJbnRlcnJ1
cHRlZERhdGFiYXNlKCkKIHsKLSAgICBpZiAobV9kYXRhYmFzZS0+b3BlbmVkKCkpCisgICAgaWYg
KG1fZGF0YWJhc2UtPm9wZW5lZCgpICYmICFtX2RhdGFiYXNlLT5pc0ludGVycnVwdGVkKCkpCiAg
ICAgICAgIHJldHVybjsKIAogICAgIC8vIElmIHRoZSBkYXRhYmFzZSB3YXMgc3RvcHBlZCwgZG9u
J3QgZG8gYW55dGhpbmcgYW5kIGNhbmNlbCBxdWV1ZWQgd29yawotICAgIExPRyhTdG9yYWdlQVBJ
LCAiRGF0YWJhc2Ugd2FzIHN0b3BwZWQgLSBjYW5jZWxsaW5nIHdvcmsgZm9yIHRoaXMgdHJhbnNh
Y3Rpb24iKTsKKyAgICBMT0coU3RvcmFnZUFQSSwgIkRhdGFiYXNlIHdhcyBzdG9wcGVkIG9yIGlu
dGVycnVwdGVkIC0gY2FuY2VsbGluZyB3b3JrIGZvciB0aGlzIHRyYW5zYWN0aW9uIik7CiAgICAg
TXV0ZXhMb2NrZXIgbG9ja2VyKG1fc3RhdGVtZW50TXV0ZXgpOwogICAgIG1fc3RhdGVtZW50UXVl
dWUuY2xlYXIoKTsKICAgICBtX25leHRTdGVwID0gMDsKIAorICAgIC8vIFJlbGVhc2UgdGhlIHVu
bmVlZGVkIGNhbGxiYWNrcywgdG8gYnJlYWsgcmVmZXJlbmNlIGN5Y2xlcy4KKyAgICBtX2NhbGxi
YWNrID0gMDsKKyAgICBtX3N1Y2Nlc3NDYWxsYmFjayA9IDA7CisgICAgbV9lcnJvckNhbGxiYWNr
ID0gMDsKKwogICAgIC8vIFRoZSBuZXh0IHN0ZXBzIHNob3VsZCBiZSBleGVjdXRlZCBvbmx5IGlm
IHdlJ3JlIG9uIHRoZSBEQiB0aHJlYWQuCiAgICAgaWYgKGN1cnJlbnRUaHJlYWQoKSAhPSBkYXRh
YmFzZSgpLT5zY3JpcHRFeGVjdXRpb25Db250ZXh0KCktPmRhdGFiYXNlVGhyZWFkKCktPmdldFRo
cmVhZElEKCkpCiAgICAgICAgIHJldHVybjsKQEAgLTE4Myw3ICsxODgsNyBAQCBib29sIFNRTFRy
YW5zYWN0aW9uOjpwZXJmb3JtTmV4dFN0ZXAoKQogICAgICAgICAgICBtX25leHRTdGVwID09ICZT
UUxUcmFuc2FjdGlvbjo6Y2xlYW51cEFmdGVyU3VjY2Vzc0NhbGxiYWNrIHx8CiAgICAgICAgICAg
IG1fbmV4dFN0ZXAgPT0gJlNRTFRyYW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVy
cm9yQ2FsbGJhY2spOwogCi0gICAgY2hlY2tBbmRIYW5kbGVDbG9zZWREYXRhYmFzZSgpOworICAg
IGNoZWNrQW5kSGFuZGxlQ2xvc2VkT3JJbnRlcnJ1cHRlZERhdGFiYXNlKCk7CiAKICAgICBpZiAo
bV9uZXh0U3RlcCkKICAgICAgICAgKHRoaXMtPiptX25leHRTdGVwKSgpOwpAQCAtMjAyLDcgKzIw
Nyw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OnBlcmZvcm1QZW5kaW5nQ2FsbGIKICAgICAgICAg
ICAgbV9uZXh0U3RlcCA9PSAmU1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJRdW90YUluY3JlYXNlQ2Fs
bGJhY2sgfHwKICAgICAgICAgICAgbV9uZXh0U3RlcCA9PSAmU1FMVHJhbnNhY3Rpb246OmRlbGl2
ZXJTdWNjZXNzQ2FsbGJhY2spOwogCi0gICAgY2hlY2tBbmRIYW5kbGVDbG9zZWREYXRhYmFzZSgp
OworICAgIGNoZWNrQW5kSGFuZGxlQ2xvc2VkT3JJbnRlcnJ1cHRlZERhdGFiYXNlKCk7CiAKICAg
ICBpZiAobV9uZXh0U3RlcCkKICAgICAgICAgKHRoaXMtPiptX25leHRTdGVwKSgpOwpAQCAtMjky
LDYgKzI5Nyw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJUcmFuc2FjdGlvbkMKICAg
ICAgICAgbV9leGVjdXRlU3FsQWxsb3dlZCA9IHRydWU7CiAgICAgICAgIHNob3VsZERlbGl2ZXJF
cnJvckNhbGxiYWNrID0gIW1fY2FsbGJhY2stPmhhbmRsZUV2ZW50KG1fZGF0YWJhc2UtPnNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQoKSwgdGhpcyk7CiAgICAgICAgIG1fZXhlY3V0ZVNxbEFsbG93ZWQg
PSBmYWxzZTsKKyAgICAgICAgbV9jYWxsYmFjayA9IDA7CiAgICAgfQogCiAgICAgLy8gVHJhbnNh
Y3Rpb24gU3RlcCA1IC0gSWYgdGhlIHRyYW5zYWN0aW9uIGNhbGxiYWNrIHdhcyBudWxsIG9yIHJh
aXNlZCBhbiBleGNlcHRpb24sIGp1bXAgdG8gdGhlIGVycm9yIGNhbGxiYWNrCkBAIC00NTksNiAr
NDY1LDcgQEAgdm9pZCBTUUxUcmFuc2FjdGlvbjo6cG9zdGZsaWdodEFuZENvbW1pdAogCiAgICAg
Ly8gSWYgdGhlIGNvbW1pdCBmYWlsZWQsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIHN0aWxsIGJlIG1h
cmtlZCBhcyAiaW4gcHJvZ3Jlc3MiCiAgICAgaWYgKG1fc3FsaXRlVHJhbnNhY3Rpb24tPmluUHJv
Z3Jlc3MoKSkgeworICAgICAgICBtX3N1Y2Nlc3NDYWxsYmFjayA9IDA7CiAgICAgICAgIG1fdHJh
bnNhY3Rpb25FcnJvciA9IFNRTEVycm9yOjpjcmVhdGUoU1FMRXJyb3I6OkRBVEFCQVNFX0VSUiwg
ImZhaWxlZCB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIik7CiAgICAgICAgIGhhbmRsZVRyYW5z
YWN0aW9uRXJyb3IoZmFsc2UpOwogICAgICAgICByZXR1cm47CkBAIC00NzMsNyArNDgwLDYgQEAg
dm9pZCBTUUxUcmFuc2FjdGlvbjo6cG9zdGZsaWdodEFuZENvbW1pdAogICAgICAgICBtX2RhdGFi
YXNlLT50cmFuc2FjdGlvbkNsaWVudCgpLT5kaWRDb21taXRXcml0ZVRyYW5zYWN0aW9uKGRhdGFi
YXNlKCkpOwogCiAgICAgLy8gTm93IHJlbGVhc2Ugb3VyIHVubmVlZGVkIGNhbGxiYWNrcywgdG8g
YnJlYWsgcmVmZXJlbmNlIGN5Y2xlcy4KLSAgICBtX2NhbGxiYWNrID0gMDsKICAgICBtX2Vycm9y
Q2FsbGJhY2sgPSAwOwogCiAgICAgLy8gVHJhbnNhY3Rpb24gU3RlcCAxMCAtIERlbGl2ZXIgc3Vj
Y2VzcyBjYWxsYmFjaywgaWYgdGhlcmUgaXMgb25lCkBAIC01NDYsOCArNTUyLDEwIEBAIHZvaWQg
U1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJUcmFuc2FjdGlvbkUKIAogICAgIC8vIFRyYW5zYWN0aW9u
IFN0ZXAgMTIgLSBJZiBleGlzdHMsIGludm9rZSBlcnJvciBjYWxsYmFjayB3aXRoIHRoZSBsYXN0
CiAgICAgLy8gZXJyb3IgdG8gaGF2ZSBvY2N1cnJlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLgotICAg
IGlmIChtX2Vycm9yQ2FsbGJhY2spCisgICAgaWYgKG1fZXJyb3JDYWxsYmFjaykgewogICAgICAg
ICBtX2Vycm9yQ2FsbGJhY2stPmhhbmRsZUV2ZW50KG1fZGF0YWJhc2UtPnNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQoKSwgbV90cmFuc2FjdGlvbkVycm9yLmdldCgpKTsKKyAgICAgICAgbV9lcnJvckNh
bGxiYWNrID0gMDsKKyAgICB9CiAKICAgICBtX25leHRTdGVwID0gJlNRTFRyYW5zYWN0aW9uOjpj
bGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s7CiAgICAgTE9HKFN0b3JhZ2VBUEks
ICJTY2hlZHVsaW5nIGNsZWFudXBBZnRlclRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjayBmb3IgdHJh
bnNhY3Rpb24gJXBcbiIsIHRoaXMpOwpAQCAtNTc5LDEwICs1ODcsNiBAQCB2b2lkIFNRTFRyYW5z
YWN0aW9uOjpjbGVhbnVwQWZ0ZXJUcmFuc2FjCiAgICAgQVNTRVJUKCFtX2RhdGFiYXNlLT5zcWxp
dGVEYXRhYmFzZSgpLnRyYW5zYWN0aW9uSW5Qcm9ncmVzcygpKTsKICAgICBtX25leHRTdGVwID0g
MDsKIAotICAgIC8vIE5vdyByZWxlYXNlIG91ciBjYWxsYmFja3MsIHRvIGJyZWFrIHJlZmVyZW5j
ZSBjeWNsZXMuCi0gICAgbV9jYWxsYmFjayA9IDA7Ci0gICAgbV9lcnJvckNhbGxiYWNrID0gMDsK
LQogICAgIC8vIE5vdyByZWxlYXNlIHRoZSBsb2NrIG9uIHRoaXMgZGF0YWJhc2UKICAgICBtX2Rh
dGFiYXNlLT50cmFuc2FjdGlvbkNvb3JkaW5hdG9yKCktPnJlbGVhc2VMb2NrKHRoaXMpOwogfQpJ
bmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmgJKHJldmlzaW9uIDY0MjQ0KQorKysgV2ViQ29y
ZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTg3LDcgKzg3LDcg
QEAgcHJpdmF0ZToKIAogICAgIHZvaWQgZW5xdWV1ZVN0YXRlbWVudChQYXNzUmVmUHRyPFNRTFN0
YXRlbWVudD4pOwogCi0gICAgdm9pZCBjaGVja0FuZEhhbmRsZUNsb3NlZERhdGFiYXNlKCk7Cisg
ICAgdm9pZCBjaGVja0FuZEhhbmRsZUNsb3NlZE9ySW50ZXJydXB0ZWREYXRhYmFzZSgpOwogCiAg
ICAgdm9pZCBhY3F1aXJlTG9jaygpOwogICAgIHZvaWQgb3BlblRyYW5zYWN0aW9uQW5kUHJlZmxp
Z2h0KCk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hy
b21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFz
ZVRyYWNrZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDY0MjQ0KQorKysgV2ViQ29yZS9zdG9yYWdl
L2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTc0LDYgKzE3NCwzNSBAQCB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpnZXRN
CiAgICAgcmV0dXJuIGRhdGFiYXNlU2l6ZSArIHNwYWNlQXZhaWxhYmxlOwogfQogCit2b2lkIERh
dGFiYXNlVHJhY2tlcjo6aW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dChjb25zdCBTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0KQoreworICAgIFZlY3RvcjxSZWZQdHI8QWJzdHJh
Y3REYXRhYmFzZT4gPiBvcGVuRGF0YWJhc2VzOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIg
b3BlbkRhdGFiYXNlTWFwTG9jayhtX29wZW5EYXRhYmFzZU1hcEd1YXJkKTsKKworICAgICAgICBp
ZiAoIW1fb3BlbkRhdGFiYXNlTWFwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIERh
dGFiYXNlTmFtZU1hcCogbmFtZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQoY29udGV4dC0+
c2VjdXJpdHlPcmlnaW4oKSk7CisgICAgICAgIGlmICghbmFtZU1hcCkKKyAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICBEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGRiTmFtZU1h
cEVuZEl0ID0gbmFtZU1hcC0+ZW5kKCk7CisgICAgICAgIGZvciAoRGF0YWJhc2VOYW1lTWFwOjpj
b25zdF9pdGVyYXRvciBkYk5hbWVNYXBJdCA9IG5hbWVNYXAtPmJlZ2luKCk7IGRiTmFtZU1hcEl0
ICE9IGRiTmFtZU1hcEVuZEl0OyArK2RiTmFtZU1hcEl0KSB7CisgICAgICAgICAgICBEYXRhYmFz
ZVNldCogZGF0YWJhc2VTZXQgPSBkYk5hbWVNYXBJdC0+c2Vjb25kOworICAgICAgICAgICAgRGF0
YWJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGRiU2V0RW5kSXQgPSBkYXRhYmFzZVNldC0+ZW5kKCk7
CisgICAgICAgICAgICBmb3IgKERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEl0ID0g
ZGF0YWJhc2VTZXQtPmJlZ2luKCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsgKytkYlNldEl0KSB7
CisgICAgICAgICAgICAgICAgaWYgKCgqZGJTZXRJdCktPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQo
KSA9PSBjb250ZXh0KQorICAgICAgICAgICAgICAgICAgICBvcGVuRGF0YWJhc2VzLmFwcGVuZCgq
ZGJTZXRJdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWZWN0b3I8
UmVmUHRyPEFic3RyYWN0RGF0YWJhc2U+ID46OmNvbnN0X2l0ZXJhdG9yIG9wZW5EYXRhYmFzZXNF
bmRJdCA9IG9wZW5EYXRhYmFzZXMuZW5kKCk7CisgICAgZm9yIChWZWN0b3I8UmVmUHRyPEFic3Ry
YWN0RGF0YWJhc2U+ID46OmNvbnN0X2l0ZXJhdG9yIG9wZW5EYXRhYmFzZXNJdCA9IG9wZW5EYXRh
YmFzZXMuYmVnaW4oKTsgb3BlbkRhdGFiYXNlc0l0ICE9IG9wZW5EYXRhYmFzZXNFbmRJdDsgKytv
cGVuRGF0YWJhc2VzSXQpCisgICAgICAgICgqb3BlbkRhdGFiYXNlc0l0KS0+aW50ZXJydXB0KCk7
Cit9CisKIH0KIAogI2VuZGlmIC8vIEVOQUJMRShEQVRBQkFTRSkKSW5kZXg6IFdlYkNvcmUvd29y
a2Vycy9Xb3JrZXJUaHJlYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd29ya2Vycy9Xb3Jr
ZXJUaHJlYWQuY3BwCShyZXZpc2lvbiA2NDI0NCkKKysrIFdlYkNvcmUvd29ya2Vycy9Xb3JrZXJU
aHJlYWQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCw2IEBACiAKICNpbmNsdWRlICJX
b3JrZXJUaHJlYWQuaCIKIAotI2luY2x1ZGUgIkRhdGFiYXNlVGFzay5oIgogI2luY2x1ZGUgIkRl
ZGljYXRlZFdvcmtlckNvbnRleHQuaCIKICNpbmNsdWRlICJLVVJMLmgiCiAjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKQEAgLTQxLDYgKzQwLDExIEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KICNp
bmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KIAorI2lmIEVOQUJMRShEQVRBQkFTRSkKKyNpbmNs
dWRlICJEYXRhYmFzZVRhc2suaCIKKyNpbmNsdWRlICJEYXRhYmFzZVRyYWNrZXIuaCIKKyNlbmRp
ZgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRpYyBNdXRleCYgdGhyZWFkQ291bnRNdXRl
eCgpCkBAIC0yMjUsNiArMjI5LDEwIEBAIHZvaWQgV29ya2VyVGhyZWFkOjpzdG9wKCkKICAgICBp
ZiAobV93b3JrZXJDb250ZXh0KSB7CiAgICAgICAgIG1fd29ya2VyQ29udGV4dC0+c2NyaXB0KCkt
PmZvcmJpZEV4ZWN1dGlvbihXb3JrZXJTY3JpcHRDb250cm9sbGVyOjpUZXJtaW5hdGVSdW5uaW5n
U2NyaXB0KTsKIAorI2lmIEVOQUJMRShEQVRBQkFTRSkKKyAgICAgICAgRGF0YWJhc2VUcmFja2Vy
Ojp0cmFja2VyKCkuaW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dChtX3dvcmtlckNvbnRl
eHQuZ2V0KCkpOworI2VuZGlmCisKICAgICAvLyBGSVhNRTogUnVkZWx5IGtpbGxpbmcgdGhlIHRo
cmVhZCB3b24ndCB3b3JrIHdoZW4gd2UgYWxsb3cgbmVzdGVkIHdvcmtlcnMsIGJlY2F1c2UgdGhl
eSB3aWxsIHRyeSB0byBwb3N0IG5vdGlmaWNhdGlvbnMgb2YgdGhlaXIgZGVzdHJ1Y3Rpb24uCiAg
ICAgLy8gVGhpcyBjYW4gbGlrZWx5IHVzZSB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdXNlZCBmb3Ig
ZGF0YWJhc2VzIGFib3ZlLgogCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NDI0NCkKKysrIExheW91dFRl
c3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE4IEBACisyMDEwLTA3LTI4
ICBEdW1pdHJ1IERhbmlsaXVjICA8ZHVtaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdCB0aGF0IHRlcm1pbmF0aW5nIGEg
d29ya2VyIGludGVycnVwdHMgYWxsIERCIG9wZXJhdGlvbnMgaW4gdGhhdCB3b3JrZXIuCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Mjg0MworCisgICAg
ICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLWV4cGVjdGVkLnR4
dDogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFi
YXNlLXN5bmMtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3Rv
cmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbDogQWRkZWQuCisgICAgICAg
ICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1zeW5j
LmpzOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50
ZXJydXB0LWRhdGFiYXNlLmpzOiBBZGRlZC4KKyAgICAgICAgKHJ1blRyYW5zYWN0aW9uKToKKwog
MjAxMC0wNy0yOCAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IE9qYW4gVmFmYWkuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3Rv
cmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50
eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRl
cnJ1cHQtZGF0YWJhc2UtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMgQEAK
K1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIGFzeW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMg
YXJlIGltbWVkaWF0ZWx5IGludGVycnVwdGVkIHdoZW4gdGhlIHdvcmtlciBuZWVkcyB0byB0ZXJt
aW5hdGUuCitQQVNTOiBkYXRhYmFzZSBvcGVyYXRpb25zIGludGVycnVwdGVkLgorCkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy1l
eHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3Jh
Z2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMt
ZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUgQEAKK0NPTlNPTEUgTUVTU0FH
RTogbGluZSA3OiBEQVRBQkFTRV9FUlI6IERPTSBTUUwgRXhjZXB0aW9uIDE6IFRoZSBvcGVyYXRp
b24gZmFpbGVkIGZvciBzb21lIHJlYXNvbiByZWxhdGVkIHRvIHRoZSBkYXRhYmFzZS4KK0NPTlNP
TEUgTUVTU0FHRTogbGluZSAxMTogVU5LTk9XTl9FUlI6IERPTSBTUUwgRXhjZXB0aW9uIDA6IFRo
ZSBvcGVyYXRpb24gZmFpbGVkIGZvciByZWFzb25zIHVucmVsYXRlZCB0byB0aGUgZGF0YWJhc2Uu
CitUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IGFsbCBzeW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMg
YXJlIGltbWVkaWF0ZWx5IGludGVycnVwdGVkIHdoZW4gdGhlIHdvcmtlciBuZWVkcyB0byB0ZXJt
aW5hdGUuCitQQVNTOiBkYXRhYmFzZSBvcGVyYXRpb25zIGludGVycnVwdGVkLgorCkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5o
dG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVy
cnVwdC1kYXRhYmFzZS1zeW5jLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDQ4IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291
cmNlcy93b3JrZXItdXRpbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0PgordmFyIHdvcmtlcjsKKwor
ZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNv
bnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsKK30KKworZnVuY3Rpb24gZmlu
aXNoVGVzdCgpCit7CisgICAgbG9nKCJQQVNTOiBkYXRhYmFzZSBvcGVyYXRpb25zIGludGVycnVw
dGVkLiIpOworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxh
eW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24gdGVybWluYXRl
V29ya2VyKCkKK3sKKyAgICB3b3JrZXIudGVybWluYXRlKCk7CisgICAgd2FpdFVudGlsV29ya2Vy
VGhyZWFkc0V4aXQoZmluaXNoVGVzdCkKK30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAg
aWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29u
dHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRV
bnRpbERvbmUoKTsKKyAgICB9CisKKyAgICB3b3JrZXIgPSBuZXcgV29ya2VyKCdyZXNvdXJjZXMv
aW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuanMnKTsKKyAgICB3b3JrZXIub25tZXNzYWdlID0gZnVu
Y3Rpb24oZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT0gInRlcm1pbmF0ZSIpCisg
ICAgICAgICAgICB0ZXJtaW5hdGVXb3JrZXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
bG9nKGV2ZW50LmRhdGEpOworICAgIH07Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkg
b25sb2FkPSJydW5UZXN0KCkiPgorVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgc3luYyBk
YXRhYmFzZSBvcGVyYXRpb25zIGFyZSBpbW1lZGlhdGVseSBpbnRlcnJ1cHRlZCB3aGVuIHRoZSB3
b3JrZXIgbmVlZHMgdG8gdGVybWluYXRlLgorPHByZSBpZD0iY29uc29sZSI+Cis8L3ByZT4KKzwv
Ym9keT4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2lu
dGVycnVwdC1kYXRhYmFzZS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29y
a2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5
b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNDggQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0i
Li4vcmVzb3VyY2VzL3dvcmtlci11dGlsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+Cit2YXIgd29y
a2VyOworCitmdW5jdGlvbiBsb2cobWVzc2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgiY29uc29sZSIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4iOworfQorCitmdW5j
dGlvbiBmaW5pc2hUZXN0KCkKK3sKKyAgICBsb2coIlBBU1M6IGRhdGFiYXNlIG9wZXJhdGlvbnMg
aW50ZXJydXB0ZWQuIik7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAg
ICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOworfQorCitmdW5jdGlvbiB0
ZXJtaW5hdGVXb3JrZXIoKQoreworICAgIHdvcmtlci50ZXJtaW5hdGUoKTsKKyAgICB3YWl0VW50
aWxXb3JrZXJUaHJlYWRzRXhpdChmaW5pc2hUZXN0KQorfQorCitmdW5jdGlvbiBydW5UZXN0KCkK
K3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91
dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoJ3Jl
c291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2UuanMnKTsKKyAgICB3b3JrZXIub25tZXNzYWdlID0g
ZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT0gInRlcm1pbmF0ZSIp
CisgICAgICAgICAgICB0ZXJtaW5hdGVXb3JrZXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbG9nKGV2ZW50LmRhdGEpOworICAgIH07Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJv
ZHkgb25sb2FkPSJydW5UZXN0KCkiPgorVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgYXN5
bmMgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0
aGUgd29ya2VyIG5lZWRzIHRvIHRlcm1pbmF0ZS4KKzxwcmUgaWQ9ImNvbnNvbGUiPgorPC9wcmU+
Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFn
ZS9yZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFz
ZS1zeW5jLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3Jh
Z2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmpzCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDExIEBACit2YXIgZGIgPSBvcGVuRGF0YWJhc2VTeW5jKCJJbnRlcnJ1cHREYXRhYmFz
ZVN5bmNUZXN0IiwgIjEiLCAiIiwgMSk7CitkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgewor
ICAgIHR4LmV4ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFRlc3QgKEZvbyBJ
TlQpIik7CisgICAgdmFyIGNvdW50ZXIgPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAg
IC8vIFB1dCBib3RoIHN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSwgdG8gbWFrZSBzdXJlIHRo
ZSBleGNlcHRpb24gaXMgYWx3YXlzIHJlcG9ydGVkIG9uIHRoZSBzYW1lIGxpbmUuCisgICAgICAg
IHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIFRlc3QgVkFMVUVTICgxKSIpOyB0eC5leGVjdXRl
U3FsKCJERUxFVEUgRlJPTSBUZXN0IFdIRVJFIEZvbyA9IDEiKTsKKyAgICAgICAgaWYgKCsrY291
bnRlciA9PSAxMDApCisgICAgICAgICAgICBwb3N0TWVzc2FnZSgidGVybWluYXRlIik7CisgICAg
fQorfSk7CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMv
aW50ZXJydXB0LWRhdGFiYXNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qvd29y
a2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2UuanMJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0
LWRhdGFiYXNlLmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE5IEBACit2YXIgY291bnRlciA9
IDA7CitmdW5jdGlvbiBydW5UcmFuc2FjdGlvbigpCit7CisgICAgZGIudHJhbnNhY3Rpb24oZnVu
Y3Rpb24odHgpIHsKKyAgICAgICAgdHguZXhlY3V0ZVNxbCgiSU5TRVJUIElOVE8gVGVzdCBWQUxV
RVMgKDEpIik7CisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIkRFTEVURSBGUk9NIFRlc3QgV0hFUkUg
Rm9vID0gMSIpOworICAgICAgICBpZiAoKytjb3VudGVyID09IDEwMCkKKyAgICAgICAgICAgIHBv
c3RNZXNzYWdlKCJ0ZXJtaW5hdGUiKTsKKyAgICB9LCBudWxsLCBydW5UcmFuc2FjdGlvbik7Cit9
CisKK3ZhciBkYiA9IG9wZW5EYXRhYmFzZSgiSW50ZXJydXB0RGF0YWJhc2VUZXN0IiwgIjEiLCAi
IiwgMSk7CitkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeworICAgIHR4LmV4ZWN1dGVTcWwo
IkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFRlc3QgKEZvbyBJTlQpIik7Cit9LCBmdW5jdGlv
bihlcnJvcikgeworICAgIHBvc3RNZXNzYWdlKCJFcnJvcjogIiArIGVycm9yLm1lc3NhZ2UpOwor
fSwgZnVuY3Rpb24oKSB7CisgICAgcnVuVHJhbnNhY3Rpb24oKTsKK30pOwo=
</data>
<flag name="commit-queue"
          id="51148"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62912</attachid>
            <date>2010-07-28 19:26:09 -0700</date>
            <delta_ts>2010-07-30 15:04:05 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>35563</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0MjU1KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTAtMDctMjggIER1bWl0cnUg
RGFuaWxpdWMgIDxkdW1pQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBBZGRlZCBhIHlpZWxkKCkgZnVuY3Rpb24uCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Mjg0MworCisgICAgICAg
ICogSmF2YVNjcmlwdENvcmUuZXhwOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnZjcHJvai9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5kZWY6CisgICAgICAgICogd3RmL1RocmVhZGlu
Zy5oOgorICAgICAgICAqIHd0Zi9UaHJlYWRpbmdQdGhyZWFkcy5jcHA6CisgICAgICAgIChXVEY6
OnlpZWxkKToKKyAgICAgICAgKiB3dGYvVGhyZWFkaW5nV2luLmNwcDoKKyAgICAgICAgKFdURjo6
eWllbGQpOgorICAgICAgICAqIHd0Zi9ndGsvVGhyZWFkaW5nR3RrLmNwcDoKKyAgICAgICAgKFdU
Rjo6eWllbGQpOgorICAgICAgICAqIHd0Zi9xdC9UaHJlYWRpbmdRdC5jcHA6CisgICAgICAgIChX
VEY6OnlpZWxkKToKKwogMjAxMC0wNy0yNyAgS2ludWtvIFlhc3VkYSAgPGtpbnVrb0BjaHJvbWl1
bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2phbiBWYWZhaS4KSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS5leHAJKHJldmlzaW9uIDY0MjU1KQorKysgSmF2YVNjcmlwdENvcmUvSmF2
YVNjcmlwdENvcmUuZXhwCSh3b3JraW5nIGNvcHkpCkBAIC0zNjcsNiArMzY3LDcgQEAgX19aTjNX
VEY1TXV0ZXg2dW5sb2NrRXYKIF9fWk4zV1RGNU11dGV4N3RyeUxvY2tFdgogX19aTjNXVEY1TXV0
ZXhDMUV2CiBfX1pOM1dURjVNdXRleEQxRXYKK19fWk4zV1RGNXlpZWxkRXYKIF9fWk4zV1RGNnN0
cnRvZEVQS2NQUGMKIF9fWk4zV1RGN0NTdHJpbmcxMW11dGFibGVEYXRhRXYKIF9fWk4zV1RGN0NT
dHJpbmcxNm5ld1VuaW5pdGlhbGl6ZWRFbVJQYwpJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNj
cmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmRlZgo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUuZGVmCShyZXZpc2lvbiA2NDI1NSkKKysrIEphdmFTY3JpcHRDb3Jl
L0phdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5kZWYJ
KHdvcmtpbmcgY29weSkKQEAgLTMzMCw2ICszMzAsNyBAQCBFWFBPUlRTCiAgICAgP3dhaXRAVGhy
ZWFkQ29uZGl0aW9uQFdURkBAUUFFWEFBVk11dGV4QDJAQFoKICAgICA/d2FpdEZvclRocmVhZENv
bXBsZXRpb25AV1RGQEBZQUhJUEFQQVhAWgogICAgID93cml0YWJsZUBQcm9wZXJ0eURlc2NyaXB0
b3JASlNDQEBRQkVfTlhaCisgICAgP3lpZWxkQFdURkBAWUFYWFoKICAgICBXVEZMb2cKICAgICBX
VEZMb2dWZXJib3NlCiAgICAgV1RGUmVwb3J0QXJndW1lbnRBc3NlcnRpb25GYWlsdXJlCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS93dGYvVGhyZWFkaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlw
dENvcmUvd3RmL1RocmVhZGluZy5oCShyZXZpc2lvbiA2NDI1NSkKKysrIEphdmFTY3JpcHRDb3Jl
L3d0Zi9UaHJlYWRpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMTAxLDYgKzEwMSw3IEBAIFRocmVh
ZElkZW50aWZpZXIgY3VycmVudFRocmVhZCgpOwogaW50IHdhaXRGb3JUaHJlYWRDb21wbGV0aW9u
KFRocmVhZElkZW50aWZpZXIsIHZvaWQqKik7CiB2b2lkIGRldGFjaFRocmVhZChUaHJlYWRJZGVu
dGlmaWVyKTsKIAordm9pZCB5aWVsZCgpOwogCiB2b2lkIGxvY2tBdG9taWNhbGx5SW5pdGlhbGl6
ZWRTdGF0aWNNdXRleCgpOwogdm9pZCB1bmxvY2tBdG9taWNhbGx5SW5pdGlhbGl6ZWRTdGF0aWNN
dXRleCgpOwpAQCAtMTEyLDUgKzExMyw2IEBAIHVzaW5nIFdURjo6Y3JlYXRlVGhyZWFkOwogdXNp
bmcgV1RGOjpjdXJyZW50VGhyZWFkOwogdXNpbmcgV1RGOjpkZXRhY2hUaHJlYWQ7CiB1c2luZyBX
VEY6OndhaXRGb3JUaHJlYWRDb21wbGV0aW9uOwordXNpbmcgV1RGOjp5aWVsZDsKIAogI2VuZGlm
IC8vIFRocmVhZGluZ19oCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvVGhyZWFkaW5nUHRocmVh
ZHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmdQdGhyZWFk
cy5jcHAJKHJldmlzaW9uIDY0MjU1KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL1RocmVhZGluZ1B0
aHJlYWRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBAQAogCiAjaWYgIUNPTVBJ
TEVSKE1TVkMpCiAjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KICNpbmNs
dWRlIDxzeXMvdGltZS5oPgogI2VuZGlmCiAKQEAgLTIyMSw2ICsyMjIsMTEgQEAgdm9pZCBkZXRh
Y2hUaHJlYWQoVGhyZWFkSWRlbnRpZmllciB0aHJlYQogICAgIHB0aHJlYWRfZGV0YWNoKHB0aHJl
YWRIYW5kbGUpOwogfQogCit2b2lkIHlpZWxkKCkKK3sKKyAgICBzY2hlZF95aWVsZCgpOworfQor
CiBUaHJlYWRJZGVudGlmaWVyIGN1cnJlbnRUaHJlYWQoKQogewogICAgIFRocmVhZElkZW50aWZp
ZXIgaWQgPSBUaHJlYWRJZGVudGlmaWVyRGF0YTo6aWRlbnRpZmllcigpOwpJbmRleDogSmF2YVNj
cmlwdENvcmUvd3RmL1RocmVhZGluZ1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvd3RmL1RocmVhZGluZ1dpbi5jcHAJKHJldmlzaW9uIDY0MjU1KQorKysgSmF2YVNjcmlwdENv
cmUvd3RmL1RocmVhZGluZ1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2Niw2ICsyNjYsMTEg
QEAgdm9pZCBkZXRhY2hUaHJlYWQoVGhyZWFkSWRlbnRpZmllciB0aHJlYQogICAgIGNsZWFyVGhy
ZWFkSGFuZGxlRm9ySWRlbnRpZmllcih0aHJlYWRJRCk7CiB9CiAKK3ZvaWQgeWllbGQoKQorewor
ICAgIDo6U2xlZXAoMSk7Cit9CisKIFRocmVhZElkZW50aWZpZXIgY3VycmVudFRocmVhZCgpCiB7
CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRocmVhZElkZW50aWZpZXI+KEdldEN1cnJlbnRUaHJl
YWRJZCgpKTsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9ndGsvVGhyZWFkaW5nR3RrLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvZ3RrL1RocmVhZGluZ0d0ay5jcHAJKHJl
dmlzaW9uIDY0MjU1KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL2d0ay9UaHJlYWRpbmdHdGsuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNjcsNiArMTY3LDExIEBAIFRocmVhZElkZW50aWZpZXIgY3Vy
cmVudFRocmVhZCgpCiAgICAgcmV0dXJuIGVzdGFibGlzaElkZW50aWZpZXJGb3JUaHJlYWQoY3Vy
cmVudFRocmVhZCk7CiB9CiAKK3ZvaWQgeWllbGQoKQoreworICAgIGdfdGhyZWFkX3lpZWxkKCk7
Cit9CisKIE11dGV4OjpNdXRleCgpCiAgICAgOiBtX211dGV4KGdfbXV0ZXhfbmV3KCkpCiB7Cklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvcXQvVGhyZWFkaW5nUXQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IEphdmFTY3JpcHRDb3JlL3d0Zi9xdC9UaHJlYWRpbmdRdC5jcHAJKHJldmlzaW9uIDY0MjU1KQor
KysgSmF2YVNjcmlwdENvcmUvd3RmL3F0L1RocmVhZGluZ1F0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjA4LDYgKzIwOCwxNiBAQCBUaHJlYWRJZGVudGlmaWVyIGN1cnJlbnRUaHJlYWQoKQogICAg
IHJldHVybiBlc3RhYmxpc2hJZGVudGlmaWVyRm9yVGhyZWFkKGN1cnJlbnRUaHJlYWQpOwogfQog
CitjbGFzcyBZaWVsZGluZ1FUaHJlYWQgOiBwdWJsaWMgUVRocmVhZCB7CitwdWJsaWM6CisgICAg
dm9pZCB5aWVsZCgpIHsgUVRocmVhZDo6c2xlZXAoMCk7IH0KK307CisKK3ZvaWQgeWllbGQoKQor
eworICAgIHN0YXRpY19jYXN0PFlpZWxkaW5nUVRocmVhZCo+KFFUaHJlYWQ6OmN1cnJlbnRUaHJl
YWQoKSktPnlpZWxkKCk7Cit9CisKIE11dGV4OjpNdXRleCgpCiAgICAgOiBtX211dGV4KG5ldyBR
TXV0ZXgoKSkKIHsKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NDI1NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsODkgQEAKKzIwMTAtMDctMjggIER1bWl0cnUgRGFuaWxpdWMg
IDxkdW1pQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBJbnRlcnJ1cHQgYWxsIERCIG9wZXJhdGlvbnMgd2hlbiB0aGUgd29ya2Vy
IGlzIHRlcm1pbmF0aW5nLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NDI4NDMKKworICAgICAgICBUZXN0czogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50
ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAorICAgICAgICAgICAgICAgZmFzdC93b3JrZXJzL3N0
b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwKKworICAgICAgICAqIGJpbmRpbmdzL2pzL0pT
Q3VzdG9tVm9pZENhbGxiYWNrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkpTQ3VzdG9tVm9pZENh
bGxiYWNrOjp+SlNDdXN0b21Wb2lkQ2FsbGJhY2spOiBJZiB0aGUKKyAgICAgICAgZGVzdHJ1Y3Rv
ciBpcyBjYWxsZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkLCBkZWxldGUgbV9kYXRhIGRpcmVjdGx5
CisgICAgICAgIGluc3RlYWQgb2YgcG9zdGluZyBhIHRhc2sgdG8gZG8gdGhhdC4gV2UgbmVlZCB0
byBkbyB0aGF0IHRvIG1ha2UKKyAgICAgICAgc3VyZSB0aGF0IGFsbCBKUyBvYmplY3RzIGFyZSBk
ZXN0cm95ZWQgYmVmb3JlCisgICAgICAgIFdvcmtlclRocmVhZFNodXRkb3duRmluaXNoVGFzayAo
aW4gV29ya2VyVGhyZWFkLmNwcCkgY2FsbHMKKyAgICAgICAgV29ya2VyQ29udGV4dDo6Y2xlYXJT
Y3JpcHQoKS4KKworICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckpTLnBt
OiBTYW1lIGNoYW5nZSBhcyBhYm92ZSwgZm9yCisgICAgICAgIGFsbCBhdXRvLWdlbmVyYXRlZCBj
YWxsYmFja3MuCisKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0Q2Fs
bGJhY2suY3BwOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0Q2FsbGJhY2s6On5KU1Rlc3RDYWxs
YmFjayk6IFVwZGF0ZWQgdGhlCisgICAgICAgIGV4cGVjdGF0aW9ucyBmb3IgcnVuLWJpbmRpbmdz
LXRlc3RzLgorCisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcDogQWRk
ZWQgdGhlIGFiaWxpdHkgdG8gaW50ZXJydXB0CisgICAgICAgIGFsbCBEQiBvcGVyYXRpb25zIGlu
IHByb2dyZXNzLCB1bmxlc3MgdGhlIGRhdGFiYXNlIHdhcyBjbG9zZWQgb3IKKyAgICAgICAgaXMg
YmVpbmcgY2xvc2VkLiBVbmxpa2Ugc3FsaXRlM19pbnRlcnJ1cHQoKSwKKyAgICAgICAgU1FMaXRl
RGF0YWJhc2U6OmludGVycnVwdCgpIGlzIHN0aWNreTogb25jZSBpdCdzIGNhbGxlZCwgdHJ5aW5n
IHRvCisgICAgICAgIHJ1biBhbnkgc3RhdGVtZW50IG9uIHRoYXQgZGF0YWJhc2Ugd2lsbCBmYWls
IHdpdGggYQorICAgICAgICBTUUxJVEVfSU5URVJSVVBUIGVycm9yIGNvZGUuCisgICAgICAgIChX
ZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6U1FMaXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29y
ZTo6U1FMaXRlRGF0YWJhc2U6OmNsb3NlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFi
YXNlOjppbnRlcnJ1cHQpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OmlzSW50
ZXJydXB0ZWQpOgorCisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmg6IEFk
ZGVkIGEgbXV0ZXggdGhhdCBjYW4gdXNlZCBieQorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgdG8g
Y2hlY2sgaWYgdGhlIGRhdGFiYXNlIHdhcyBpbnRlcnJ1cHRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlNRTGl0ZURhdGFiYXNlOjpkYXRhYmFzZU11dGV4KToKKworICAgICAgICAqIHBsYXRmb3JtL3Nx
bC9TUUxpdGVTdGF0ZW1lbnQuY3BwOiBDaGFuZ2VkIHByZXBhcmUoKSBhbmQgc3RlcCgpCisgICAg
ICAgIHRvIGNoZWNrIGlmIHRoZSBkYXRhYmFzZSB3YXMgaW50ZXJydXB0ZWQsIGJlZm9yZSB0cnlp
bmcgdG8gcHJlcGFyZQorICAgICAgICBvciBydW4gdGhlIHN0YXRlbWVudC4gVGhlIG90aGVyIG1l
dGhvZHMgZG9uJ3QgbmVlZCB0byBob2xkIG9uIHRvCisgICAgICAgIHRoZSBEQiBsb2NrIHdoaWxl
IHJ1bm5pbmcsIGJlY2F1c2UgdGhleSdyZSBmYXN0LCBzbyB3ZSBkb24ndCBuZWVkCisgICAgICAg
IHRvIGludGVycnVwdCB0aGVtLgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50Ojpw
cmVwYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudDo6c3RlcCk6CisKKyAg
ICAgICAgKiBzdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwOiBNYWRlIFNRTGl0ZURhdGFiYXNl
OjppbnRlcnJ1cHQoKQorICAgICAgICBhbmQgaXNJbnRlcnJ1cHRlZCgpIHZpc2libGUgdG8gV2Vi
U1FMRGF0YWJhc2VzIGNsYXNzZXMuCisgICAgICAgIChXZWJDb3JlOjpBYnN0cmFjdERhdGFiYXNl
OjppbnRlcnJ1cHQpOgorICAgICAgICAoV2ViQ29yZTo6QWJzdHJhY3REYXRhYmFzZTo6aXNJbnRl
cnJ1cHRlZCk6CisgICAgICAgICogc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmg6CisKKyAgICAg
ICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6IEFkZGVkIGEgbWV0aG9kIHRvIGludGVy
cnVwdCBhbGwKKyAgICAgICAgZGF0YWJhc2VzIGluIGEgZ2l2ZW4gY29udGV4dC4KKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4
dCk6CisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKworICAgICAgICAqIHN0
b3JhZ2UvU1FMU3RhdGVtZW50LmNwcDogQ2hhbmdlZCB0aGUgZXhjZXB0aW9uL2Vycm9yIHJlcG9y
dGVkCisgICAgICAgIHdoZW4gYSBzdGF0ZW1lbnQgaXMgaW50ZXJydXB0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUpOgorICAgICAgICAqIHN0b3JhZ2UvU1FMU3Rh
dGVtZW50U3luYy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxTdGF0ZW1lbnRTeW5jOjpleGVj
dXRlKToKKworICAgICAgICAqIHN0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwOiBDaGFuZ2VkIHRo
ZSBjb2RlIHRvIHJlbGVhc2UgdGhlCisgICAgICAgIGNhbGxiYWNrIG9iamVjdHMgYXMgc29vbiBh
cyB0aGV5J3JlIG5vdCBuZWVkZWQuCisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6
Y2hlY2tBbmRIYW5kbGVDbG9zZWRPckludGVycnVwdGVkRGF0YWJhc2UpOgorICAgICAgICBDaGFu
Z2VkIHRoaXMgbWV0aG9kIHRvIG5vdCBzY2hlZHVsZSB0aGUgbmV4dCB0cmFuc2FjdGlvbiBzdGVw
IHdoZW4KKyAgICAgICAgdGhlIGRhdGFiYXNlIGlzIGludGVycnVwdGVkLgorICAgICAgICAoV2Vi
Q29yZTo6U1FMVHJhbnNhY3Rpb246OnBlcmZvcm1OZXh0U3RlcCk6CisgICAgICAgIChXZWJDb3Jl
OjpTUUxUcmFuc2FjdGlvbjo6cGVyZm9ybVBlbmRpbmdDYWxsYmFjayk6CisgICAgICAgIChXZWJD
b3JlOjpTUUxUcmFuc2FjdGlvbjo6ZGVsaXZlclRyYW5zYWN0aW9uQ2FsbGJhY2spOgorICAgICAg
ICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OnBvc3RmbGlnaHRBbmRDb21taXQpOgorICAgICAg
ICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJh
Y2spOgorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclRyYW5z
YWN0aW9uRXJyb3JDYWxsYmFjayk6CisgICAgICAgICogc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5o
OgorCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5j
cHA6IEFkZGVkIGEgbWV0aG9kIHRvCisgICAgICAgIGludGVycnVwdCBhbGwgZGF0YWJhc2VzIGlu
IGEgZ2l2ZW4gY29udGV4dC4KKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aW50
ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dCk6CisKKyAgICAgICAgKiB3b3JrZXJzL1dvcmtl
clRocmVhZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJUaHJlYWQ6OnN0b3ApOiBBZGRl
ZCBhIGNhbGwgdG8KKyAgICAgICAgRGF0YWJhc2VUcmFja2VyOjppbnRlcnJ1cHRBbGxEYXRhYmFz
ZXNGb3JDb250ZXh0KCkuCisKIDIwMTAtMDctMjggIEFsZXggTmljb2xhb3UgIDxhbmljb2xhb0Bj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2phbiBWYWZhaS4KSW5kZXg6IFdl
YkNvcmUvYmluZGluZ3MvanMvSlNDdXN0b21Wb2lkQ2FsbGJhY2suY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYmluZGluZ3MvanMvSlNDdXN0b21Wb2lkQ2FsbGJhY2suY3BwCShyZXZpc2lvbiA2
NDI1NSkKKysrIFdlYkNvcmUvYmluZGluZ3MvanMvSlNDdXN0b21Wb2lkQ2FsbGJhY2suY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00OCw3ICs0OCwxMCBAQCBKU0N1c3RvbVZvaWRDYWxsYmFjazo6SlND
dXN0b21Wb2lkQ2FsbGJhCiAKIEpTQ3VzdG9tVm9pZENhbGxiYWNrOjp+SlNDdXN0b21Wb2lkQ2Fs
bGJhY2soKQogewotICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soRGVsZXRl
Q2FsbGJhY2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpOworICAgIGlmIChtX3NjcmlwdEV4ZWN1
dGlvbkNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKQorICAgICAgICBkZWxldGUgbV9kYXRhOwor
ICAgIGVsc2UKKyAgICAgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5wb3N0VGFzayhEZWxl
dGVDYWxsYmFja0RhdGFUYXNrOjpjcmVhdGUobV9kYXRhKSk7CiAjaWZuZGVmIE5ERUJVRwogICAg
IG1fZGF0YSA9IDA7CiAjZW5kaWYKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2Rl
R2VuZXJhdG9ySlMucG0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0Nv
ZGVHZW5lcmF0b3JKUy5wbQkocmV2aXNpb24gNjQyNTUpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Nj
cmlwdHMvQ29kZUdlbmVyYXRvckpTLnBtCSh3b3JraW5nIGNvcHkpCkBAIC0yMTUxLDcgKzIxNTEs
MTAgQEAgc3ViIEdlbmVyYXRlQ2FsbGJhY2tJbXBsZW1lbnRhdGlvbgogICAgICMgRGVzdHJ1Y3Rv
cgogICAgIHB1c2goQGltcGxDb250ZW50LCAiJHtjbGFzc05hbWV9Ojp+JHtjbGFzc05hbWV9KClc
biIpOwogICAgIHB1c2goQGltcGxDb250ZW50LCAie1xuIik7Ci0gICAgcHVzaChAaW1wbENvbnRl
bnQsICIgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5wb3N0VGFzayhEZWxldGVDYWxsYmFj
a0RhdGFUYXNrOjpjcmVhdGUobV9kYXRhKSk7XG4iKTsKKyAgICBwdXNoKEBpbXBsQ29udGVudCwg
IiAgICBpZiAobV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSlcbiIp
OworICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgICAgICBkZWxldGUgbV9kYXRhO1xuIik7Cisg
ICAgcHVzaChAaW1wbENvbnRlbnQsICIgICAgZWxzZVxuIik7CisgICAgcHVzaChAaW1wbENvbnRl
bnQsICIgICAgICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soRGVsZXRlQ2Fs
bGJhY2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpO1xuIik7CiAgICAgcHVzaChAaW1wbENvbnRl
bnQsICIjaWZuZGVmIE5ERUJVR1xuIik7CiAgICAgcHVzaChAaW1wbENvbnRlbnQsICIgICAgbV9k
YXRhID0gMDtcbiIpOwogICAgIHB1c2goQGltcGxDb250ZW50LCAiI2VuZGlmXG4iKTsKSW5kZXg6
IFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pTVGVzdENhbGxiYWNrLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RDYWxsYmFj
ay5jcHAJKHJldmlzaW9uIDY0MjU1KQorKysgV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3Qv
SlMvSlNUZXN0Q2FsbGJhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Myw3ICs0MywxMCBAQCBK
U1Rlc3RDYWxsYmFjazo6SlNUZXN0Q2FsbGJhY2soSlNPYmplY3QqCiAKIEpTVGVzdENhbGxiYWNr
Ojp+SlNUZXN0Q2FsbGJhY2soKQogewotICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9z
dFRhc2soRGVsZXRlQ2FsbGJhY2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpOworICAgIGlmICht
X3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKQorICAgICAgICBkZWxl
dGUgbV9kYXRhOworICAgIGVsc2UKKyAgICAgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5w
b3N0VGFzayhEZWxldGVDYWxsYmFja0RhdGFUYXNrOjpjcmVhdGUobV9kYXRhKSk7CiAjaWZuZGVm
IE5ERUJVRwogICAgIG1fZGF0YSA9IDA7CiAjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
c3FsL1NRTGl0ZURhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3Nx
bC9TUUxpdGVEYXRhYmFzZS5jcHAJKHJldmlzaW9uIDY0MjU1KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw4ICszMSw4IEBA
CiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlNRTGl0ZUZpbGVTeXN0ZW0uaCIKICNp
bmNsdWRlICJTUUxpdGVTdGF0ZW1lbnQuaCIKLQogI2luY2x1ZGUgPHNxbGl0ZTMuaD4KKyNpbmNs
dWRlIDx3dGYvVGhyZWFkaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNDIsNyAr
NDIsNyBAQCBjb25zdCBpbnQgU1FMUmVzdWx0T2sgPSBTUUxJVEVfT0s7CiBjb25zdCBpbnQgU1FM
UmVzdWx0Um93ID0gU1FMSVRFX1JPVzsKIGNvbnN0IGludCBTUUxSZXN1bHRTY2hlbWEgPSBTUUxJ
VEVfU0NIRU1BOwogY29uc3QgaW50IFNRTFJlc3VsdEZ1bGwgPSBTUUxJVEVfRlVMTDsKLQorY29u
c3QgaW50IFNRTFJlc3VsdEludGVycnVwdCA9IFNRTElURV9JTlRFUlJVUFQ7CiAKIFNRTGl0ZURh
dGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAgOiBtX2RiKDApCkBAIC01MCw2ICs1MCw3IEBA
IFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAgLCBtX3RyYW5zYWN0aW9uSW5Q
cm9ncmVzcyhmYWxzZSkKICAgICAsIG1fc2hhcmFibGUoZmFsc2UpCiAgICAgLCBtX29wZW5pbmdU
aHJlYWQoMCkKKyAgICAsIG1faW50ZXJydXB0ZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTgzLDE1ICs4
NCwzOCBAQCBib29sIFNRTGl0ZURhdGFiYXNlOjpvcGVuKGNvbnN0IFN0cmluZyYgCiB2b2lkIFNR
TGl0ZURhdGFiYXNlOjpjbG9zZSgpCiB7CiAgICAgaWYgKG1fZGIpIHsKLSAgICAgICAgLy8gRklY
TUU6IFRoaXMgaXMgYmVpbmcgY2FsbGVkIG9uIHRoZW1haW4gdGhyZWFkIGR1cmluZyBKUyBHQy4g
PHJkYXI6Ly9wcm9ibGVtLzU3Mzk4MTg+Ci0gICAgICAgIC8vIEFTU0VSVChjdXJyZW50VGhyZWFk
KCkgPT0gbV9vcGVuaW5nVGhyZWFkKTsKLSAgICAgICAgc3FsaXRlM19jbG9zZShtX2RiKTsKLSAg
ICAgICAgbV9kYiA9IDA7CisgICAgICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV9vcGVu
aW5nVGhyZWFkKTsKKyAgICAgICAgc3FsaXRlMyogZGIgPSBtX2RiOworICAgICAgICB7CisgICAg
ICAgICAgICBNdXRleExvY2tlciBsb2NrZXIobV9kYXRhYmFzZUNsb3NpbmdNdXRleCk7CisgICAg
ICAgICAgICBtX2RiID0gMDsKKyAgICAgICAgfQorICAgICAgICBzcWxpdGUzX2Nsb3NlKGRiKTsK
ICAgICB9CiAKICAgICBtX29wZW5pbmdUaHJlYWQgPSAwOwogfQogCit2b2lkIFNRTGl0ZURhdGFi
YXNlOjppbnRlcnJ1cHQoKQoreworICAgIG1faW50ZXJydXB0ZWQgPSB0cnVlOworICAgIHdoaWxl
ICghbV9sb2NraW5nTXV0ZXgudHJ5TG9jaygpKSB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tl
cihtX2RhdGFiYXNlQ2xvc2luZ011dGV4KTsKKyAgICAgICAgaWYgKCFtX2RiKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBzcWxpdGUzX2ludGVycnVwdChtX2RiKTsKKyAgICAgICAgeWll
bGQoKTsKKyAgICB9CisKKyAgICBtX2xvY2tpbmdNdXRleC51bmxvY2soKTsKK30KKworYm9vbCBT
UUxpdGVEYXRhYmFzZTo6aXNJbnRlcnJ1cHRlZCgpCit7CisgICAgQVNTRVJUKCFtX2xvY2tpbmdN
dXRleC50cnlMb2NrKCkpOworICAgIHJldHVybiBtX2ludGVycnVwdGVkOworfQorCiB2b2lkIFNR
TGl0ZURhdGFiYXNlOjpzZXRGdWxsc3luYyhib29sIGZzeW5jKSAKIHsKICAgICBpZiAoZnN5bmMp
IApAQCAtMzk3LDE2ICs0MjEsNiBAQCB2b2lkIFNRTGl0ZURhdGFiYXNlOjplbmFibGVBdXRob3Jp
emVyKGJvCiAgICAgICAgIHNxbGl0ZTNfc2V0X2F1dGhvcml6ZXIobV9kYiwgTlVMTCwgMCk7CiB9
CiAKLXZvaWQgU1FMaXRlRGF0YWJhc2U6OmxvY2soKQotewotICAgIG1fbG9ja2luZ011dGV4Lmxv
Y2soKTsKLX0KLQotdm9pZCBTUUxpdGVEYXRhYmFzZTo6dW5sb2NrKCkKLXsKLSAgICBtX2xvY2tp
bmdNdXRleC51bmxvY2soKTsKLX0KLQogYm9vbCBTUUxpdGVEYXRhYmFzZTo6aXNBdXRvQ29tbWl0
T24oKSBjb25zdAogewogICAgIHJldHVybiBzcWxpdGUzX2dldF9hdXRvY29tbWl0KG1fZGIpOwpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCShyZXZpc2lvbiA2NDI1NSkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQ4LDYgKzQ4LDcgQEAgZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1bHRPazsKIGV4dGVybiBj
b25zdCBpbnQgU1FMUmVzdWx0Um93OwogZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1bHRTY2hlbWE7
CiBleHRlcm4gY29uc3QgaW50IFNRTFJlc3VsdEZ1bGw7CitleHRlcm4gY29uc3QgaW50IFNRTFJl
c3VsdEludGVycnVwdDsKIAogY2xhc3MgU1FMaXRlRGF0YWJhc2UgOiBwdWJsaWMgTm9uY29weWFi
bGUgewogICAgIGZyaWVuZCBjbGFzcyBTUUxpdGVUcmFuc2FjdGlvbjsKQEAgLTU4LDYgKzU5LDgg
QEAgcHVibGljOgogICAgIGJvb2wgb3Blbihjb25zdCBTdHJpbmcmIGZpbGVuYW1lLCBib29sIGZv
cldlYlNRTERhdGFiYXNlID0gZmFsc2UpOwogICAgIGJvb2wgaXNPcGVuKCkgY29uc3QgeyByZXR1
cm4gbV9kYjsgfQogICAgIHZvaWQgY2xvc2UoKTsKKyAgICB2b2lkIGludGVycnVwdCgpOworICAg
IGJvb2wgaXNJbnRlcnJ1cHRlZCgpOwogCiAgICAgYm9vbCBleGVjdXRlQ29tbWFuZChjb25zdCBT
dHJpbmcmKTsKICAgICBib29sIHJldHVybnNBdExlYXN0T25lUmVzdWx0KGNvbnN0IFN0cmluZyYp
OwpAQCAtMTA1LDkgKzEwOCw3IEBAIHB1YmxpYzoKICAgICAKICAgICB2b2lkIHNldEF1dGhvcml6
ZXIoUGFzc1JlZlB0cjxEYXRhYmFzZUF1dGhvcml6ZXI+KTsKIAotICAgIC8vICh1bilsb2NrcyB0
aGUgZGF0YWJhc2UgbGlrZSBhIG11dGV4Ci0gICAgdm9pZCBsb2NrKCk7Ci0gICAgdm9pZCB1bmxv
Y2soKTsKKyAgICBNdXRleCYgZGF0YWJhc2VNdXRleCgpIHsgcmV0dXJuIG1fbG9ja2luZ011dGV4
OyB9CiAgICAgYm9vbCBpc0F1dG9Db21taXRPbigpIGNvbnN0OwogCiAgICAgLy8gVGhlIFNRTGl0
ZSBBVVRPX1ZBQ1VVTSBwcmFnbWEgY2FuIGJlIGVpdGhlciBOT05FLCBGVUxMLCBvciBJTkNSRU1F
TlRBTC4KQEAgLTE0OSw3ICsxNTAsOSBAQCBwcml2YXRlOgogCiAgICAgTXV0ZXggbV9sb2NraW5n
TXV0ZXg7CiAgICAgVGhyZWFkSWRlbnRpZmllciBtX29wZW5pbmdUaHJlYWQ7Ci0gICAgCisKKyAg
ICBNdXRleCBtX2RhdGFiYXNlQ2xvc2luZ011dGV4OworICAgIGJvb2wgbV9pbnRlcnJ1cHRlZDsK
IH07IC8vIGNsYXNzIFNRTGl0ZURhdGFiYXNlCiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0YXRlbWVudC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3RhdGVtZW50LmNwcAkocmV2aXNpb24gNjQy
NTUpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVTdGF0ZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC02MSw2ICs2MSwxMSBAQCBTUUxpdGVTdGF0ZW1lbnQ6On5TUUxpdGVTdGF0ZW1l
bnQoKQogaW50IFNRTGl0ZVN0YXRlbWVudDo6cHJlcGFyZSgpCiB7CiAgICAgQVNTRVJUKCFtX2lz
UHJlcGFyZWQpOworCisgICAgTXV0ZXhMb2NrZXIgZGF0YWJhc2VMb2NrKG1fZGF0YWJhc2UuZGF0
YWJhc2VNdXRleCgpKTsKKyAgICBpZiAobV9kYXRhYmFzZS5pc0ludGVycnVwdGVkKCkpCisgICAg
ICAgIHJldHVybiBTUUxJVEVfSU5URVJSVVBUOworCiAgICAgY29uc3Qgdm9pZCogdGFpbCA9IDA7
CiAgICAgTE9HKFNRTERhdGFiYXNlLCAiU1FMIC0gcHJlcGFyZSAtICVzIiwgbV9xdWVyeS5hc2Np
aSgpLmRhdGEoKSk7CiAgICAgU3RyaW5nIHN0cmlwcGVkUXVlcnkgPSBtX3F1ZXJ5LnN0cmlwV2hp
dGVTcGFjZSgpOwpAQCAtODgsNiArOTMsMTEgQEAgaW50IFNRTGl0ZVN0YXRlbWVudDo6cHJlcGFy
ZSgpCiBpbnQgU1FMaXRlU3RhdGVtZW50OjpzdGVwKCkKIHsKICAgICBBU1NFUlQobV9pc1ByZXBh
cmVkKTsKKworICAgIE11dGV4TG9ja2VyIGRhdGFiYXNlTG9jayhtX2RhdGFiYXNlLmRhdGFiYXNl
TXV0ZXgoKSk7CisgICAgaWYgKG1fZGF0YWJhc2UuaXNJbnRlcnJ1cHRlZCgpKQorICAgICAgICBy
ZXR1cm4gU1FMSVRFX0lOVEVSUlVQVDsKKwogICAgIGlmICghbV9zdGF0ZW1lbnQpCiAgICAgICAg
IHJldHVybiBTUUxJVEVfT0s7CiAgICAgTE9HKFNRTERhdGFiYXNlLCAiU1FMIC0gc3RlcCAtICVz
IiwgbV9xdWVyeS5hc2NpaSgpLmRhdGEoKSk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvQWJzdHJh
Y3REYXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0Fic3RyYWN0RGF0
YWJhc2UuY3BwCShyZXZpc2lvbiA2NDI1NSkKKysrIFdlYkNvcmUvc3RvcmFnZS9BYnN0cmFjdERh
dGFiYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDc0LDYgKzQ3NCwxNyBAQCB2b2lkIEFic3Ry
YWN0RGF0YWJhc2U6OmluY3JlbWVudGFsVmFjdXVtCiAgICAgICAgIG1fc3FsaXRlRGF0YWJhc2Uu
cnVuSW5jcmVtZW50YWxWYWN1dW1Db21tYW5kKCk7CiB9CiAKK3ZvaWQgQWJzdHJhY3REYXRhYmFz
ZTo6aW50ZXJydXB0KCkKK3sKKyAgICBtX3NxbGl0ZURhdGFiYXNlLmludGVycnVwdCgpOworfQor
Citib29sIEFic3RyYWN0RGF0YWJhc2U6OmlzSW50ZXJydXB0ZWQoKQoreworICAgIE11dGV4TG9j
a2VyIGxvY2tlcihtX3NxbGl0ZURhdGFiYXNlLmRhdGFiYXNlTXV0ZXgoKSk7CisgICAgcmV0dXJu
IG1fc3FsaXRlRGF0YWJhc2UuaXNJbnRlcnJ1cHRlZCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoREFUQUJBU0UpCkluZGV4OiBXZWJDb3JlL3N0b3Jh
Z2UvQWJzdHJhY3REYXRhYmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9BYnN0
cmFjdERhdGFiYXNlLmgJKHJldmlzaW9uIDY0MjU1KQorKysgV2ViQ29yZS9zdG9yYWdlL0Fic3Ry
YWN0RGF0YWJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsOCBAQCBwdWJsaWM6CiAK
ICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbWF4aW11bVNpemUoKSBjb25zdDsKICAgICB2b2lkIGlu
Y3JlbWVudGFsVmFjdXVtSWZOZWVkZWQoKTsKKyAgICB2b2lkIGludGVycnVwdCgpOworICAgIGJv
b2wgaXNJbnRlcnJ1cHRlZCgpOwogCiAgICAgLy8gRklYTUU6IG1vdmUgYWxsIHZlcnNpb24tcmVs
YXRlZCBtZXRob2RzIHRvIGEgRGF0YWJhc2VWZXJzaW9uVHJhY2tlciBjbGFzcwogICAgIGJvb2wg
dmVyc2lvbk1hdGNoZXNFeHBlY3RlZCgpIGNvbnN0OwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0Rh
dGFiYXNlVHJhY2tlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
VHJhY2tlci5jcHAJKHJldmlzaW9uIDY0MjU1KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
VHJhY2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzNSw2ICsyMzUsMzUgQEAgdm9pZCBEYXRh
YmFzZVRyYWNrZXI6OmRhdGFiYXNlQ2hhbmdlZChBYgogICAgIG9yaWdpblF1b3RhTWFuYWdlcigp
Lm1hcmtEYXRhYmFzZShkYXRhYmFzZSk7CiB9CiAKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjppbnRl
cnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KGNvbnN0IFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
IGNvbnRleHQpCit7CisgICAgVmVjdG9yPFJlZlB0cjxBYnN0cmFjdERhdGFiYXNlPiA+IG9wZW5E
YXRhYmFzZXM7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2Nr
KG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworCisgICAgICAgIGlmICghbV9vcGVuRGF0YWJhc2VN
YXApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1l
TWFwID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChjb250ZXh0LT5zZWN1cml0eU9yaWdpbigpKTsK
KyAgICAgICAgaWYgKCFuYW1lTWFwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIERh
dGFiYXNlTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgZGJOYW1lTWFwRW5kSXQgPSBuYW1lTWFwLT5l
bmQoKTsKKyAgICAgICAgZm9yIChEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGRiTmFt
ZU1hcEl0ID0gbmFtZU1hcC0+YmVnaW4oKTsgZGJOYW1lTWFwSXQgIT0gZGJOYW1lTWFwRW5kSXQ7
ICsrZGJOYW1lTWFwSXQpIHsKKyAgICAgICAgICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9
IGRiTmFtZU1hcEl0LT5zZWNvbmQ7CisgICAgICAgICAgICBEYXRhYmFzZVNldDo6Y29uc3RfaXRl
cmF0b3IgZGJTZXRFbmRJdCA9IGRhdGFiYXNlU2V0LT5lbmQoKTsKKyAgICAgICAgICAgIGZvciAo
RGF0YWJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGRiU2V0SXQgPSBkYXRhYmFzZVNldC0+YmVnaW4o
KTsgZGJTZXRJdCAhPSBkYlNldEVuZEl0OyArK2RiU2V0SXQpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoKCpkYlNldEl0KS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpID09IGNvbnRleHQpCisgICAg
ICAgICAgICAgICAgICAgIG9wZW5EYXRhYmFzZXMuYXBwZW5kKCpkYlNldEl0KTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZlY3RvcjxSZWZQdHI8QWJzdHJhY3REYXRh
YmFzZT4gPjo6Y29uc3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNlc0VuZEl0ID0gb3BlbkRhdGFiYXNl
cy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxSZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPjo6Y29u
c3RfaXRlcmF0b3Igb3BlbkRhdGFiYXNlc0l0ID0gb3BlbkRhdGFiYXNlcy5iZWdpbigpOyBvcGVu
RGF0YWJhc2VzSXQgIT0gb3BlbkRhdGFiYXNlc0VuZEl0OyArK29wZW5EYXRhYmFzZXNJdCkKKyAg
ICAgICAgKCpvcGVuRGF0YWJhc2VzSXQpLT5pbnRlcnJ1cHQoKTsKK30KKwogU3RyaW5nIERhdGFi
YXNlVHJhY2tlcjo6b3JpZ2luUGF0aChTZWN1cml0eU9yaWdpbiogb3JpZ2luKSBjb25zdAogewog
ICAgIHJldHVybiBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1lVG9QYXRo
KG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLnRocmVhZHNhZmVDb3B5KCksIG9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkpOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAkocmV2aXNp
b24gNjQyNTUpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTc4LDYgKzc4LDggQEAgcHVibGljOgogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBn
ZXRNYXhTaXplRm9yRGF0YWJhc2UoY29uc3QgQWJzdHJhY3REYXRhYmFzZSopOwogICAgIHZvaWQg
ZGF0YWJhc2VDaGFuZ2VkKEFic3RyYWN0RGF0YWJhc2UqKTsKIAorICAgIHZvaWQgaW50ZXJydXB0
QWxsRGF0YWJhc2VzRm9yQ29udGV4dChjb25zdCBTY3JpcHRFeGVjdXRpb25Db250ZXh0Kik7CisK
IHByaXZhdGU6CiAgICAgRGF0YWJhc2VUcmFja2VyKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VQYXRo
KTsKIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHJldmlzaW9uIDY0MjU1KQorKysg
V2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4LDcg
Kzc4LDcgQEAgYm9vbCBTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUoRGF0YWJhc2UqIGRiKQogCiAgICAg
aWYgKHJlc3VsdCAhPSBTUUxSZXN1bHRPaykgewogICAgICAgICBMT0coU3RvcmFnZUFQSSwgIlVu
YWJsZSB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2Ygc3RhdGVtZW50ICVzIC0gZXJyb3IgJWkgKCVz
KSIsIG1fc3RhdGVtZW50LmFzY2lpKCkuZGF0YSgpLCByZXN1bHQsIGRhdGFiYXNlLT5sYXN0RXJy
b3JNc2coKSk7Ci0gICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKFNRTEVycm9yOjpT
WU5UQVhfRVJSLCBkYXRhYmFzZS0+bGFzdEVycm9yTXNnKCkpOworICAgICAgICBtX2Vycm9yID0g
U1FMRXJyb3I6OmNyZWF0ZShyZXN1bHQgPT0gU1FMUmVzdWx0SW50ZXJydXB0ID8gU1FMRXJyb3I6
OkRBVEFCQVNFX0VSUiA6IFNRTEVycm9yOjpTWU5UQVhfRVJSLCBkYXRhYmFzZS0+bGFzdEVycm9y
TXNnKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC04Niw3ICs4Niw3IEBA
IGJvb2wgU1FMU3RhdGVtZW50OjpleGVjdXRlKERhdGFiYXNlKiBkYikKICAgICAvLyBJZiB0aGlz
IGlzIHRoZSBjYXNlLCB0aGV5IG1pZ2h0IGJlIHRyeWluZyB0byBkbyBzb21ldGhpbmcgZmlzaHkg
b3IgbWFsaWNpb3VzCiAgICAgaWYgKHN0YXRlbWVudC5iaW5kUGFyYW1ldGVyQ291bnQoKSAhPSBt
X2FyZ3VtZW50cy5zaXplKCkpIHsKICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJCaW5kIHBhcmFt
ZXRlciBjb3VudCBkb2Vzbid0IG1hdGNoIG51bWJlciBvZiBxdWVzdGlvbiBtYXJrcyIpOwotICAg
ICAgICBtX2Vycm9yID0gU1FMRXJyb3I6OmNyZWF0ZShTUUxFcnJvcjo6U1lOVEFYX0VSUiwgIm51
bWJlciBvZiAnPydzIGluIHN0YXRlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggYXJndW1lbnQg
Y291bnQiKTsKKyAgICAgICAgbV9lcnJvciA9IFNRTEVycm9yOjpjcmVhdGUoZGItPmlzSW50ZXJy
dXB0ZWQoKSA/IFNRTEVycm9yOjpEQVRBQkFTRV9FUlIgOiBTUUxFcnJvcjo6U1lOVEFYX0VSUiwg
Im51bWJlciBvZiAnPydzIGluIHN0YXRlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggYXJndW1l
bnQgY291bnQiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3Rv
cmFnZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcAkocmV2aXNpb24gNjQyNTUpCisrKyBXZWJDb3JlL3N0
b3JhZ2UvU1FMU3RhdGVtZW50U3luYy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYxLDEyICs2MSwx
MiBAQCBQYXNzUmVmUHRyPFNRTFJlc3VsdFNldD4gU1FMU3RhdGVtZW50U3luCiAgICAgU1FMaXRl
U3RhdGVtZW50IHN0YXRlbWVudCgqZGF0YWJhc2UsIG1fc3RhdGVtZW50KTsKICAgICBpbnQgcmVz
dWx0ID0gc3RhdGVtZW50LnByZXBhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdE9r
KSB7Ci0gICAgICAgIGVjID0gU1FMRXhjZXB0aW9uOjpTWU5UQVhfRVJSOworICAgICAgICBlYyA9
IChyZXN1bHQgPT0gU1FMUmVzdWx0SW50ZXJydXB0ID8gU1FMRXhjZXB0aW9uOjpEQVRBQkFTRV9F
UlIgOiBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9
CiAKICAgICBpZiAoc3RhdGVtZW50LmJpbmRQYXJhbWV0ZXJDb3VudCgpICE9IG1fYXJndW1lbnRz
LnNpemUoKSkgewotICAgICAgICBlYyA9IFNRTEV4Y2VwdGlvbjo6U1lOVEFYX0VSUjsKKyAgICAg
ICAgZWMgPSAoZGItPmlzSW50ZXJydXB0ZWQoKT8gU1FMRXhjZXB0aW9uOjpEQVRBQkFTRV9FUlIg
OiBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAK
SW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcAkocmV2aXNpb24gNjQyNTUpCisrKyBX
ZWJDb3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYs
MTcgKzE0NiwyMiBAQCBjb25zdCBjaGFyKiBTUUxUcmFuc2FjdGlvbjo6ZGVidWdTdGVwTmFtCiB9
CiAjZW5kaWYKIAotdm9pZCBTUUxUcmFuc2FjdGlvbjo6Y2hlY2tBbmRIYW5kbGVDbG9zZWREYXRh
YmFzZSgpCit2b2lkIFNRTFRyYW5zYWN0aW9uOjpjaGVja0FuZEhhbmRsZUNsb3NlZE9ySW50ZXJy
dXB0ZWREYXRhYmFzZSgpCiB7Ci0gICAgaWYgKG1fZGF0YWJhc2UtPm9wZW5lZCgpKQorICAgIGlm
IChtX2RhdGFiYXNlLT5vcGVuZWQoKSAmJiAhbV9kYXRhYmFzZS0+aXNJbnRlcnJ1cHRlZCgpKQog
ICAgICAgICByZXR1cm47CiAKICAgICAvLyBJZiB0aGUgZGF0YWJhc2Ugd2FzIHN0b3BwZWQsIGRv
bid0IGRvIGFueXRoaW5nIGFuZCBjYW5jZWwgcXVldWVkIHdvcmsKLSAgICBMT0coU3RvcmFnZUFQ
SSwgIkRhdGFiYXNlIHdhcyBzdG9wcGVkIC0gY2FuY2VsbGluZyB3b3JrIGZvciB0aGlzIHRyYW5z
YWN0aW9uIik7CisgICAgTE9HKFN0b3JhZ2VBUEksICJEYXRhYmFzZSB3YXMgc3RvcHBlZCBvciBp
bnRlcnJ1cHRlZCAtIGNhbmNlbGxpbmcgd29yayBmb3IgdGhpcyB0cmFuc2FjdGlvbiIpOwogICAg
IE11dGV4TG9ja2VyIGxvY2tlcihtX3N0YXRlbWVudE11dGV4KTsKICAgICBtX3N0YXRlbWVudFF1
ZXVlLmNsZWFyKCk7CiAgICAgbV9uZXh0U3RlcCA9IDA7CiAKKyAgICAvLyBSZWxlYXNlIHRoZSB1
bm5lZWRlZCBjYWxsYmFja3MsIHRvIGJyZWFrIHJlZmVyZW5jZSBjeWNsZXMuCisgICAgbV9jYWxs
YmFjayA9IDA7CisgICAgbV9zdWNjZXNzQ2FsbGJhY2sgPSAwOworICAgIG1fZXJyb3JDYWxsYmFj
ayA9IDA7CisKICAgICAvLyBUaGUgbmV4dCBzdGVwcyBzaG91bGQgYmUgZXhlY3V0ZWQgb25seSBp
ZiB3ZSdyZSBvbiB0aGUgREIgdGhyZWFkLgogICAgIGlmIChjdXJyZW50VGhyZWFkKCkgIT0gZGF0
YWJhc2UoKS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLT5kYXRhYmFzZVRocmVhZCgpLT5nZXRU
aHJlYWRJRCgpKQogICAgICAgICByZXR1cm47CkBAIC0xODMsNyArMTg4LDcgQEAgYm9vbCBTUUxU
cmFuc2FjdGlvbjo6cGVyZm9ybU5leHRTdGVwKCkKICAgICAgICAgICAgbV9uZXh0U3RlcCA9PSAm
U1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclN1Y2Nlc3NDYWxsYmFjayB8fAogICAgICAgICAg
ICBtX25leHRTdGVwID09ICZTUUxUcmFuc2FjdGlvbjo6Y2xlYW51cEFmdGVyVHJhbnNhY3Rpb25F
cnJvckNhbGxiYWNrKTsKIAotICAgIGNoZWNrQW5kSGFuZGxlQ2xvc2VkRGF0YWJhc2UoKTsKKyAg
ICBjaGVja0FuZEhhbmRsZUNsb3NlZE9ySW50ZXJydXB0ZWREYXRhYmFzZSgpOwogCiAgICAgaWYg
KG1fbmV4dFN0ZXApCiAgICAgICAgICh0aGlzLT4qbV9uZXh0U3RlcCkoKTsKQEAgLTIwMiw3ICsy
MDcsNyBAQCB2b2lkIFNRTFRyYW5zYWN0aW9uOjpwZXJmb3JtUGVuZGluZ0NhbGxiCiAgICAgICAg
ICAgIG1fbmV4dFN0ZXAgPT0gJlNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyUXVvdGFJbmNyZWFzZUNh
bGxiYWNrIHx8CiAgICAgICAgICAgIG1fbmV4dFN0ZXAgPT0gJlNRTFRyYW5zYWN0aW9uOjpkZWxp
dmVyU3VjY2Vzc0NhbGxiYWNrKTsKIAotICAgIGNoZWNrQW5kSGFuZGxlQ2xvc2VkRGF0YWJhc2Uo
KTsKKyAgICBjaGVja0FuZEhhbmRsZUNsb3NlZE9ySW50ZXJydXB0ZWREYXRhYmFzZSgpOwogCiAg
ICAgaWYgKG1fbmV4dFN0ZXApCiAgICAgICAgICh0aGlzLT4qbV9uZXh0U3RlcCkoKTsKQEAgLTI5
Miw2ICsyOTcsNyBAQCB2b2lkIFNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyVHJhbnNhY3Rpb25DCiAg
ICAgICAgIG1fZXhlY3V0ZVNxbEFsbG93ZWQgPSB0cnVlOwogICAgICAgICBzaG91bGREZWxpdmVy
RXJyb3JDYWxsYmFjayA9ICFtX2NhbGxiYWNrLT5oYW5kbGVFdmVudChtX2RhdGFiYXNlLT5zY3Jp
cHRFeGVjdXRpb25Db250ZXh0KCksIHRoaXMpOwogICAgICAgICBtX2V4ZWN1dGVTcWxBbGxvd2Vk
ID0gZmFsc2U7CisgICAgICAgIG1fY2FsbGJhY2sgPSAwOwogICAgIH0KIAogICAgIC8vIFRyYW5z
YWN0aW9uIFN0ZXAgNSAtIElmIHRoZSB0cmFuc2FjdGlvbiBjYWxsYmFjayB3YXMgbnVsbCBvciBy
YWlzZWQgYW4gZXhjZXB0aW9uLCBqdW1wIHRvIHRoZSBlcnJvciBjYWxsYmFjawpAQCAtNDU5LDYg
KzQ2NSw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OnBvc3RmbGlnaHRBbmRDb21taXQKIAogICAg
IC8vIElmIHRoZSBjb21taXQgZmFpbGVkLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBzdGlsbCBiZSBt
YXJrZWQgYXMgImluIHByb2dyZXNzIgogICAgIGlmIChtX3NxbGl0ZVRyYW5zYWN0aW9uLT5pblBy
b2dyZXNzKCkpIHsKKyAgICAgICAgbV9zdWNjZXNzQ2FsbGJhY2sgPSAwOwogICAgICAgICBtX3Ry
YW5zYWN0aW9uRXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKFNRTEVycm9yOjpEQVRBQkFTRV9FUlIs
ICJmYWlsZWQgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiIpOwogICAgICAgICBoYW5kbGVUcmFu
c2FjdGlvbkVycm9yKGZhbHNlKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNDczLDcgKzQ4MCw2IEBA
IHZvaWQgU1FMVHJhbnNhY3Rpb246OnBvc3RmbGlnaHRBbmRDb21taXQKICAgICAgICAgbV9kYXRh
YmFzZS0+dHJhbnNhY3Rpb25DbGllbnQoKS0+ZGlkQ29tbWl0V3JpdGVUcmFuc2FjdGlvbihkYXRh
YmFzZSgpKTsKIAogICAgIC8vIE5vdyByZWxlYXNlIG91ciB1bm5lZWRlZCBjYWxsYmFja3MsIHRv
IGJyZWFrIHJlZmVyZW5jZSBjeWNsZXMuCi0gICAgbV9jYWxsYmFjayA9IDA7CiAgICAgbV9lcnJv
ckNhbGxiYWNrID0gMDsKIAogICAgIC8vIFRyYW5zYWN0aW9uIFN0ZXAgMTAgLSBEZWxpdmVyIHN1
Y2Nlc3MgY2FsbGJhY2ssIGlmIHRoZXJlIGlzIG9uZQpAQCAtNTQ2LDggKzU1MiwxMCBAQCB2b2lk
IFNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyVHJhbnNhY3Rpb25FCiAKICAgICAvLyBUcmFuc2FjdGlv
biBTdGVwIDEyIC0gSWYgZXhpc3RzLCBpbnZva2UgZXJyb3IgY2FsbGJhY2sgd2l0aCB0aGUgbGFz
dAogICAgIC8vIGVycm9yIHRvIGhhdmUgb2NjdXJyZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4KLSAg
ICBpZiAobV9lcnJvckNhbGxiYWNrKQorICAgIGlmIChtX2Vycm9yQ2FsbGJhY2spIHsKICAgICAg
ICAgbV9lcnJvckNhbGxiYWNrLT5oYW5kbGVFdmVudChtX2RhdGFiYXNlLT5zY3JpcHRFeGVjdXRp
b25Db250ZXh0KCksIG1fdHJhbnNhY3Rpb25FcnJvci5nZXQoKSk7CisgICAgICAgIG1fZXJyb3JD
YWxsYmFjayA9IDA7CisgICAgfQogCiAgICAgbV9uZXh0U3RlcCA9ICZTUUxUcmFuc2FjdGlvbjo6
Y2xlYW51cEFmdGVyVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrOwogICAgIExPRyhTdG9yYWdlQVBJ
LCAiU2NoZWR1bGluZyBjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2sgZm9yIHRy
YW5zYWN0aW9uICVwXG4iLCB0aGlzKTsKQEAgLTU3OSwxMCArNTg3LDYgQEAgdm9pZCBTUUxUcmFu
c2FjdGlvbjo6Y2xlYW51cEFmdGVyVHJhbnNhYwogICAgIEFTU0VSVCghbV9kYXRhYmFzZS0+c3Fs
aXRlRGF0YWJhc2UoKS50cmFuc2FjdGlvbkluUHJvZ3Jlc3MoKSk7CiAgICAgbV9uZXh0U3RlcCA9
IDA7CiAKLSAgICAvLyBOb3cgcmVsZWFzZSBvdXIgY2FsbGJhY2tzLCB0byBicmVhayByZWZlcmVu
Y2UgY3ljbGVzLgotICAgIG1fY2FsbGJhY2sgPSAwOwotICAgIG1fZXJyb3JDYWxsYmFjayA9IDA7
Ci0KICAgICAvLyBOb3cgcmVsZWFzZSB0aGUgbG9jayBvbiB0aGlzIGRhdGFiYXNlCiAgICAgbV9k
YXRhYmFzZS0+dHJhbnNhY3Rpb25Db29yZGluYXRvcigpLT5yZWxlYXNlTG9jayh0aGlzKTsKIH0K
SW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5oCShyZXZpc2lvbiA2NDI1NSkKKysrIFdlYkNv
cmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC04Nyw3ICs4Nyw3
IEBAIHByaXZhdGU6CiAKICAgICB2b2lkIGVucXVldWVTdGF0ZW1lbnQoUGFzc1JlZlB0cjxTUUxT
dGF0ZW1lbnQ+KTsKIAotICAgIHZvaWQgY2hlY2tBbmRIYW5kbGVDbG9zZWREYXRhYmFzZSgpOwor
ICAgIHZvaWQgY2hlY2tBbmRIYW5kbGVDbG9zZWRPckludGVycnVwdGVkRGF0YWJhc2UoKTsKIAog
ICAgIHZvaWQgYWNxdWlyZUxvY2soKTsKICAgICB2b2lkIG9wZW5UcmFuc2FjdGlvbkFuZFByZWZs
aWdodCgpOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNo
cm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJh
c2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA2NDI1NSkKKysrIFdlYkNvcmUvc3RvcmFn
ZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTE3NCw2ICsxNzQsMzUgQEAgdW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6Z2V0
TQogICAgIHJldHVybiBkYXRhYmFzZVNpemUgKyBzcGFjZUF2YWlsYWJsZTsKIH0KIAordm9pZCBE
YXRhYmFzZVRyYWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQoY29uc3QgU2Ny
aXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPEFic3Ry
YWN0RGF0YWJhc2U+ID4gb3BlbkRhdGFiYXNlczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2Vy
IG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CisKKyAgICAgICAg
aWYgKCFtX29wZW5EYXRhYmFzZU1hcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBE
YXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KGNvbnRleHQt
PnNlY3VyaXR5T3JpZ2luKCkpOworICAgICAgICBpZiAoIW5hbWVNYXApCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVN
YXBFbmRJdCA9IG5hbWVNYXAtPmVuZCgpOworICAgICAgICBmb3IgKERhdGFiYXNlTmFtZU1hcDo6
Y29uc3RfaXRlcmF0b3IgZGJOYW1lTWFwSXQgPSBuYW1lTWFwLT5iZWdpbigpOyBkYk5hbWVNYXBJ
dCAhPSBkYk5hbWVNYXBFbmRJdDsgKytkYk5hbWVNYXBJdCkgeworICAgICAgICAgICAgRGF0YWJh
c2VTZXQqIGRhdGFiYXNlU2V0ID0gZGJOYW1lTWFwSXQtPnNlY29uZDsKKyAgICAgICAgICAgIERh
dGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgp
OworICAgICAgICAgICAgZm9yIChEYXRhYmFzZVNldDo6Y29uc3RfaXRlcmF0b3IgZGJTZXRJdCA9
IGRhdGFiYXNlU2V0LT5iZWdpbigpOyBkYlNldEl0ICE9IGRiU2V0RW5kSXQ7ICsrZGJTZXRJdCkg
eworICAgICAgICAgICAgICAgIGlmICgoKmRiU2V0SXQpLT5zY3JpcHRFeGVjdXRpb25Db250ZXh0
KCkgPT0gY29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgb3BlbkRhdGFiYXNlcy5hcHBlbmQo
KmRiU2V0SXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmVjdG9y
PFJlZlB0cjxBYnN0cmFjdERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2Vz
RW5kSXQgPSBvcGVuRGF0YWJhc2VzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFJlZlB0cjxBYnN0
cmFjdERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzSXQgPSBvcGVuRGF0
YWJhc2VzLmJlZ2luKCk7IG9wZW5EYXRhYmFzZXNJdCAhPSBvcGVuRGF0YWJhc2VzRW5kSXQ7ICsr
b3BlbkRhdGFiYXNlc0l0KQorICAgICAgICAoKm9wZW5EYXRhYmFzZXNJdCktPmludGVycnVwdCgp
OworfQorCiB9CiAKICNlbmRpZiAvLyBFTkFCTEUoREFUQUJBU0UpCkluZGV4OiBXZWJDb3JlL3dv
cmtlcnMvV29ya2VyVGhyZWFkLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dvcmtlcnMvV29y
a2VyVGhyZWFkLmNwcAkocmV2aXNpb24gNjQyNTUpCisrKyBXZWJDb3JlL3dvcmtlcnMvV29ya2Vy
VGhyZWFkLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNyArMzAsNiBAQAogCiAjaW5jbHVkZSAi
V29ya2VyVGhyZWFkLmgiCiAKLSNpbmNsdWRlICJEYXRhYmFzZVRhc2suaCIKICNpbmNsdWRlICJE
ZWRpY2F0ZWRXb3JrZXJDb250ZXh0LmgiCiAjaW5jbHVkZSAiS1VSTC5oIgogI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCkBAIC00MSw2ICs0MCwxMSBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAj
aW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CiAKKyNpZiBFTkFCTEUoREFUQUJBU0UpCisjaW5j
bHVkZSAiRGF0YWJhc2VUYXNrLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUcmFja2VyLmgiCisjZW5k
aWYKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBzdGF0aWMgTXV0ZXgmIHRocmVhZENvdW50TXV0
ZXgoKQpAQCAtMjI1LDYgKzIyOSwxMCBAQCB2b2lkIFdvcmtlclRocmVhZDo6c3RvcCgpCiAgICAg
aWYgKG1fd29ya2VyQ29udGV4dCkgewogICAgICAgICBtX3dvcmtlckNvbnRleHQtPnNjcmlwdCgp
LT5mb3JiaWRFeGVjdXRpb24oV29ya2VyU2NyaXB0Q29udHJvbGxlcjo6VGVybWluYXRlUnVubmlu
Z1NjcmlwdCk7CiAKKyNpZiBFTkFCTEUoREFUQUJBU0UpCisgICAgICAgIERhdGFiYXNlVHJhY2tl
cjo6dHJhY2tlcigpLmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQobV93b3JrZXJDb250
ZXh0LmdldCgpKTsKKyNlbmRpZgorCiAgICAgLy8gRklYTUU6IFJ1ZGVseSBraWxsaW5nIHRoZSB0
aHJlYWQgd29uJ3Qgd29yayB3aGVuIHdlIGFsbG93IG5lc3RlZCB3b3JrZXJzLCBiZWNhdXNlIHRo
ZXkgd2lsbCB0cnkgdG8gcG9zdCBub3RpZmljYXRpb25zIG9mIHRoZWlyIGRlc3RydWN0aW9uLgog
ICAgIC8vIFRoaXMgY2FuIGxpa2VseSB1c2UgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHVzZWQgZm9y
IGRhdGFiYXNlcyBhYm92ZS4KIApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNjQyNTUpCisrKyBMYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxOCBAQAorMjAxMC0wNy0y
OCAgRHVtaXRydSBEYW5pbGl1YyAgPGR1bWlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRlc3QgdGhhdCB0ZXJtaW5hdGluZyBh
IHdvcmtlciBpbnRlcnJ1cHRzIGFsbCBEQiBvcGVyYXRpb25zIGluIHRoYXQgd29ya2VyLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDI4NDMKKworICAg
ICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50
eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRh
YmFzZS1zeW5jLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0
b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbDogQWRkZWQuCisgICAgICAgICogZmFz
dC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWw6IEFkZGVkLgorICAgICAg
ICAqIGZhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3lu
Yy5qczogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2lu
dGVycnVwdC1kYXRhYmFzZS5qczogQWRkZWQuCisgICAgICAgIChydW5UcmFuc2FjdGlvbik6CisK
IDIwMTAtMDctMjggIEFsZXggTmljb2xhb3UgIDxhbmljb2xhb0BjaHJvbWl1bS5vcmc+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgT2phbiBWYWZhaS4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29y
a2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50eHQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9y
YWdlL2ludGVycnVwdC1kYXRhYmFzZS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMyBAQAorVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBhbGwgYXN5bmMgZGF0YWJhc2Ugb3Bl
cmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0aGUgd29ya2VyIG5lZWRz
IHRvIHRlcm1pbmF0ZS4KK1BBU1M6IGRhdGFiYXNlIG9wZXJhdGlvbnMgaW50ZXJydXB0ZWQuCisK
SW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFz
ZS1zeW5jLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtl
cnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy1leHBlY3RlZC50eHQJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJh
c2Utc3luYy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNSBAQAorQ09OU09M
RSBNRVNTQUdFOiBsaW5lIDc6IERBVEFCQVNFX0VSUjogRE9NIFNRTCBFeGNlcHRpb24gMTogVGhl
IG9wZXJhdGlvbiBmYWlsZWQgZm9yIHNvbWUgcmVhc29uIHJlbGF0ZWQgdG8gdGhlIGRhdGFiYXNl
LgorQ09OU09MRSBNRVNTQUdFOiBsaW5lIDExOiBVTktOT1dOX0VSUjogRE9NIFNRTCBFeGNlcHRp
b24gMDogVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yIHJlYXNvbnMgdW5yZWxhdGVkIHRvIHRoZSBk
YXRhYmFzZS4KK1RoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgYWxsIHN5bmMgZGF0YWJhc2Ugb3Bl
cmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkgaW50ZXJydXB0ZWQgd2hlbiB0aGUgd29ya2VyIG5lZWRz
IHRvIHRlcm1pbmF0ZS4KK1BBU1M6IGRhdGFiYXNlIG9wZXJhdGlvbnMgaW50ZXJydXB0ZWQuCisK
SW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFz
ZS1zeW5jLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0b3Jh
Z2UvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRl
c3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL2ludGVycnVwdC1kYXRhYmFzZS1zeW5jLmh0bWwJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNDggQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0i
Li4vcmVzb3VyY2VzL3dvcmtlci11dGlsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+Cit2YXIgd29y
a2VyOworCitmdW5jdGlvbiBsb2cobWVzc2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgiY29uc29sZSIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4iOworfQorCitmdW5j
dGlvbiBmaW5pc2hUZXN0KCkKK3sKKyAgICBsb2coIlBBU1M6IGRhdGFiYXNlIG9wZXJhdGlvbnMg
aW50ZXJydXB0ZWQuIik7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAg
ICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOworfQorCitmdW5jdGlvbiB0
ZXJtaW5hdGVXb3JrZXIoKQoreworICAgIHdvcmtlci50ZXJtaW5hdGUoKTsKKyAgICB3YWl0VW50
aWxXb3JrZXJUaHJlYWRzRXhpdChmaW5pc2hUZXN0KQorfQorCitmdW5jdGlvbiBydW5UZXN0KCkK
K3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91
dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoJ3Jl
c291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5qcycpOworICAgIHdvcmtlci5vbm1lc3Nh
Z2UgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PSAidGVybWlu
YXRlIikKKyAgICAgICAgICAgIHRlcm1pbmF0ZVdvcmtlcigpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBsb2coZXZlbnQuZGF0YSk7CisgICAgfTsKK30KKzwvc2NyaXB0PgorPC9oZWFkPgor
Cis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+CitUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IGFs
bCBzeW5jIGRhdGFiYXNlIG9wZXJhdGlvbnMgYXJlIGltbWVkaWF0ZWx5IGludGVycnVwdGVkIHdo
ZW4gdGhlIHdvcmtlciBuZWVkcyB0byB0ZXJtaW5hdGUuCis8cHJlIGlkPSJjb25zb2xlIj4KKzwv
cHJlPgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3N0
b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNlLmh0bWwJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Uu
aHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0OCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3Jp
cHQgc3JjPSIuLi9yZXNvdXJjZXMvd29ya2VyLXV0aWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdD4K
K3ZhciB3b3JrZXI7CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9
CisKK2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiUEFTUzogZGF0YWJhc2Ugb3Bl
cmF0aW9ucyBpbnRlcnJ1cHRlZC4iKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9s
bGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1
bmN0aW9uIHRlcm1pbmF0ZVdvcmtlcigpCit7CisgICAgd29ya2VyLnRlcm1pbmF0ZSgpOworICAg
IHdhaXRVbnRpbFdvcmtlclRocmVhZHNFeGl0KGZpbmlzaFRlc3QpCit9CisKK2Z1bmN0aW9uIHJ1
blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAg
ICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisgICAgd29ya2VyID0gbmV3IFdv
cmtlcigncmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS5qcycpOworICAgIHdvcmtlci5vbm1l
c3NhZ2UgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PSAidGVy
bWluYXRlIikKKyAgICAgICAgICAgIHRlcm1pbmF0ZVdvcmtlcigpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBsb2coZXZlbnQuZGF0YSk7CisgICAgfTsKK30KKzwvc2NyaXB0PgorPC9oZWFk
PgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+CitUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0
IGFsbCBhc3luYyBkYXRhYmFzZSBvcGVyYXRpb25zIGFyZSBpbW1lZGlhdGVseSBpbnRlcnJ1cHRl
ZCB3aGVuIHRoZSB3b3JrZXIgbmVlZHMgdG8gdGVybWluYXRlLgorPHByZSBpZD0iY29uc29sZSI+
Cis8L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vy
cy9zdG9yYWdlL3Jlc291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0
LWRhdGFiYXNlLXN5bmMuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L3dvcmtl
cnMvc3RvcmFnZS9yZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLXN5bmMuanMJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMTEgQEAKK3ZhciBkYiA9IG9wZW5EYXRhYmFzZVN5bmMoIkludGVycnVw
dERhdGFiYXNlU3luY1Rlc3QiLCAiMSIsICIiLCAxKTsKK2RiLnRyYW5zYWN0aW9uKGZ1bmN0aW9u
KHR4KSB7CisgICAgdHguZXhlY3V0ZVNxbCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgVGVz
dCAoRm9vIElOVCkiKTsKKyAgICB2YXIgY291bnRlciA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsK
KyAgICAgICAgLy8gUHV0IGJvdGggc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lLCB0byBtYWtl
IHN1cmUgdGhlIGV4Y2VwdGlvbiBpcyBhbHdheXMgcmVwb3J0ZWQgb24gdGhlIHNhbWUgbGluZS4K
KyAgICAgICAgdHguZXhlY3V0ZVNxbCgiSU5TRVJUIElOVE8gVGVzdCBWQUxVRVMgKDEpIik7IHR4
LmV4ZWN1dGVTcWwoIkRFTEVURSBGUk9NIFRlc3QgV0hFUkUgRm9vID0gMSIpOworICAgICAgICBp
ZiAoKytjb3VudGVyID09IDEwMCkKKyAgICAgICAgICAgIHBvc3RNZXNzYWdlKCJ0ZXJtaW5hdGUi
KTsKKyAgICB9Cit9KTsKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jl
c291cmNlcy9pbnRlcnJ1cHQtZGF0YWJhc2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1kYXRhYmFzZS5qcwkocmV2
aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zdG9yYWdlL3Jlc291cmNlcy9p
bnRlcnJ1cHQtZGF0YWJhc2UuanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTkgQEAKK3ZhciBj
b3VudGVyID0gMDsKK2Z1bmN0aW9uIHJ1blRyYW5zYWN0aW9uKCkKK3sKKyAgICBkYi50cmFuc2Fj
dGlvbihmdW5jdGlvbih0eCkgeworICAgICAgICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBU
ZXN0IFZBTFVFUyAoMSkiKTsKKyAgICAgICAgdHguZXhlY3V0ZVNxbCgiREVMRVRFIEZST00gVGVz
dCBXSEVSRSBGb28gPSAxIik7CisgICAgICAgIGlmICgrK2NvdW50ZXIgPT0gMTAwKQorICAgICAg
ICAgICAgcG9zdE1lc3NhZ2UoInRlcm1pbmF0ZSIpOworICAgIH0sIG51bGwsIHJ1blRyYW5zYWN0
aW9uKTsKK30KKwordmFyIGRiID0gb3BlbkRhdGFiYXNlKCJJbnRlcnJ1cHREYXRhYmFzZVRlc3Qi
LCAiMSIsICIiLCAxKTsKK2RiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7CisgICAgdHguZXhl
Y3V0ZVNxbCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgVGVzdCAoRm9vIElOVCkiKTsKK30s
IGZ1bmN0aW9uKGVycm9yKSB7CisgICAgcG9zdE1lc3NhZ2UoIkVycm9yOiAiICsgZXJyb3IubWVz
c2FnZSk7Cit9LCBmdW5jdGlvbigpIHsKKyAgICBydW5UcmFuc2FjdGlvbigpOworfSk7Cg==
</data>
<flag name="review"
          id="51168"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="51169"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63108</attachid>
            <date>2010-07-30 15:04:05 -0700</date>
            <delta_ts>2010-07-30 15:12:03 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>29623</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0Mzc3KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTAtMDctMzAgIER1bWl0cnUg
RGFuaWxpdWMgIDxkdW1pQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBBZGRlZCBhIHlpZWxkKCkgZnVuY3Rpb24uCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Mjg0MworCisgICAgICAg
ICogSmF2YVNjcmlwdENvcmUuZXhwOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnZjcHJvai9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5kZWY6CisgICAgICAgICogd3RmL1RocmVhZGlu
Zy5oOgorICAgICAgICAqIHd0Zi9UaHJlYWRpbmdQdGhyZWFkcy5jcHA6CisgICAgICAgIChXVEY6
OnlpZWxkKToKKyAgICAgICAgKiB3dGYvVGhyZWFkaW5nV2luLmNwcDoKKyAgICAgICAgKFdURjo6
eWllbGQpOgorICAgICAgICAqIHd0Zi9ndGsvVGhyZWFkaW5nR3RrLmNwcDoKKyAgICAgICAgKFdU
Rjo6eWllbGQpOgorICAgICAgICAqIHd0Zi9xdC9UaHJlYWRpbmdRdC5jcHA6CisgICAgICAgIChX
VEY6OnlpZWxkKToKKwogMjAxMC0wNy0zMCAgUmFmYWVsIEFudG9nbm9sbGkgIDxhbnRvZ25vbGxp
QHByb2Z1c2lvbi5tb2JpPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFudG9uaW8gR29tZXMuCklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZXhwCShyZXZpc2lvbiA2NDM3NykKKysrIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAkod29ya2luZyBjb3B5KQpAQCAtMzY3LDYgKzM2
Nyw3IEBAIF9fWk4zV1RGNU11dGV4NnVubG9ja0V2CiBfX1pOM1dURjVNdXRleDd0cnlMb2NrRXYK
IF9fWk4zV1RGNU11dGV4QzFFdgogX19aTjNXVEY1TXV0ZXhEMUV2CitfX1pOM1dURjV5aWVsZEV2
CiBfX1pOM1dURjZzdHJ0b2RFUEtjUFBjCiBfX1pOM1dURjdDU3RyaW5nMTFtdXRhYmxlRGF0YUV2
CiBfX1pOM1dURjdDU3RyaW5nMTZuZXdVbmluaXRpYWxpemVkRW1SUGMKSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29y
ZS5kZWYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9q
L0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmRlZgkocmV2aXNpb24gNjQzNzcpCisrKyBK
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2YVNj
cmlwdENvcmUuZGVmCSh3b3JraW5nIGNvcHkpCkBAIC0zMzAsNiArMzMwLDcgQEAgRVhQT1JUUwog
ICAgID93YWl0QFRocmVhZENvbmRpdGlvbkBXVEZAQFFBRVhBQVZNdXRleEAyQEBaCiAgICAgP3dh
aXRGb3JUaHJlYWRDb21wbGV0aW9uQFdURkBAWUFISVBBUEFYQFoKICAgICA/d3JpdGFibGVAUHJv
cGVydHlEZXNjcmlwdG9yQEpTQ0BAUUJFX05YWgorICAgID95aWVsZEBXVEZAQFlBWFhaCiAgICAg
V1RGTG9nCiAgICAgV1RGTG9nVmVyYm9zZQogICAgIFdURlJlcG9ydEFyZ3VtZW50QXNzZXJ0aW9u
RmFpbHVyZQpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL1RocmVhZGluZy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmcuaAkocmV2aXNpb24gNjQzNzcpCisrKyBK
YXZhU2NyaXB0Q29yZS93dGYvVGhyZWFkaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMSw2ICsx
MDEsNyBAQCBUaHJlYWRJZGVudGlmaWVyIGN1cnJlbnRUaHJlYWQoKTsKIGludCB3YWl0Rm9yVGhy
ZWFkQ29tcGxldGlvbihUaHJlYWRJZGVudGlmaWVyLCB2b2lkKiopOwogdm9pZCBkZXRhY2hUaHJl
YWQoVGhyZWFkSWRlbnRpZmllcik7CiAKK3ZvaWQgeWllbGQoKTsKIAogdm9pZCBsb2NrQXRvbWlj
YWxseUluaXRpYWxpemVkU3RhdGljTXV0ZXgoKTsKIHZvaWQgdW5sb2NrQXRvbWljYWxseUluaXRp
YWxpemVkU3RhdGljTXV0ZXgoKTsKQEAgLTExMiw1ICsxMTMsNiBAQCB1c2luZyBXVEY6OmNyZWF0
ZVRocmVhZDsKIHVzaW5nIFdURjo6Y3VycmVudFRocmVhZDsKIHVzaW5nIFdURjo6ZGV0YWNoVGhy
ZWFkOwogdXNpbmcgV1RGOjp3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbjsKK3VzaW5nIFdURjo6eWll
bGQ7CiAKICNlbmRpZiAvLyBUaHJlYWRpbmdfaApJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL1Ro
cmVhZGluZ1B0aHJlYWRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvVGhy
ZWFkaW5nUHRocmVhZHMuY3BwCShyZXZpc2lvbiA2NDM3NykKKysrIEphdmFTY3JpcHRDb3JlL3d0
Zi9UaHJlYWRpbmdQdGhyZWFkcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDYgKzQ0LDcgQEAK
IAogI2lmICFDT01QSUxFUihNU1ZDKQogI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHNj
aGVkLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbmRpZgogCkBAIC0yMjEsNiArMjIyLDEx
IEBAIHZvaWQgZGV0YWNoVGhyZWFkKFRocmVhZElkZW50aWZpZXIgdGhyZWEKICAgICBwdGhyZWFk
X2RldGFjaChwdGhyZWFkSGFuZGxlKTsKIH0KIAordm9pZCB5aWVsZCgpCit7CisgICAgc2NoZWRf
eWllbGQoKTsKK30KKwogVGhyZWFkSWRlbnRpZmllciBjdXJyZW50VGhyZWFkKCkKIHsKICAgICBU
aHJlYWRJZGVudGlmaWVyIGlkID0gVGhyZWFkSWRlbnRpZmllckRhdGE6OmlkZW50aWZpZXIoKTsK
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmdXaW4uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmdXaW4uY3BwCShyZXZpc2lvbiA2NDM3NykKKysr
IEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmdXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
NjYsNiArMjY2LDExIEBAIHZvaWQgZGV0YWNoVGhyZWFkKFRocmVhZElkZW50aWZpZXIgdGhyZWEK
ICAgICBjbGVhclRocmVhZEhhbmRsZUZvcklkZW50aWZpZXIodGhyZWFkSUQpOwogfQogCit2b2lk
IHlpZWxkKCkKK3sKKyAgICA6OlNsZWVwKDEpOworfQorCiBUaHJlYWRJZGVudGlmaWVyIGN1cnJl
bnRUaHJlYWQoKQogewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxUaHJlYWRJZGVudGlmaWVyPihH
ZXRDdXJyZW50VGhyZWFkSWQoKSk7CkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvZ3RrL1RocmVh
ZGluZ0d0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL2d0ay9UaHJlYWRp
bmdHdGsuY3BwCShyZXZpc2lvbiA2NDM3NykKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9ndGsvVGhy
ZWFkaW5nR3RrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTY3LDYgKzE2NywxMSBAQCBUaHJlYWRJ
ZGVudGlmaWVyIGN1cnJlbnRUaHJlYWQoKQogICAgIHJldHVybiBlc3RhYmxpc2hJZGVudGlmaWVy
Rm9yVGhyZWFkKGN1cnJlbnRUaHJlYWQpOwogfQogCit2b2lkIHlpZWxkKCkKK3sKKyAgICBnX3Ro
cmVhZF95aWVsZCgpOworfQorCiBNdXRleDo6TXV0ZXgoKQogICAgIDogbV9tdXRleChnX211dGV4
X25ldygpKQogewpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3F0L1RocmVhZGluZ1F0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvcXQvVGhyZWFkaW5nUXQuY3BwCShyZXZp
c2lvbiA2NDM3NykKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9xdC9UaHJlYWRpbmdRdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTIwOCw2ICsyMDgsMTEgQEAgVGhyZWFkSWRlbnRpZmllciBjdXJyZW50
VGhyZWFkKCkKICAgICByZXR1cm4gZXN0YWJsaXNoSWRlbnRpZmllckZvclRocmVhZChjdXJyZW50
VGhyZWFkKTsKIH0KIAordm9pZCB5aWVsZCgpCit7CisgICAgUVRocmVhZDo6eWllbGRDdXJyZW50
VGhyZWFkKCk7Cit9CisKIE11dGV4OjpNdXRleCgpCiAgICAgOiBtX211dGV4KG5ldyBRTXV0ZXgo
KSkKIHsKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hh
bmdlTG9nCShyZXZpc2lvbiA2NDM3NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDMgKzEsODkgQEAKKzIwMTAtMDctMzAgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1p
QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBJbnRlcnJ1cHQgYWxsIERCIG9wZXJhdGlvbnMgd2hlbiB0aGUgd29ya2VyIGlzIHRl
cm1pbmF0aW5nLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NDI4NDMKKworICAgICAgICBUZXN0czogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0
LWRhdGFiYXNlLXN5bmMuaHRtbAorICAgICAgICAgICAgICAgZmFzdC93b3JrZXJzL3N0b3JhZ2Uv
aW50ZXJydXB0LWRhdGFiYXNlLmh0bWwKKworICAgICAgICAqIGJpbmRpbmdzL2pzL0pTQ3VzdG9t
Vm9pZENhbGxiYWNrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkpTQ3VzdG9tVm9pZENhbGxiYWNr
Ojp+SlNDdXN0b21Wb2lkQ2FsbGJhY2spOiBJZiB0aGUKKyAgICAgICAgZGVzdHJ1Y3RvciBpcyBj
YWxsZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkLCBkZWxldGUgbV9kYXRhIGRpcmVjdGx5CisgICAg
ICAgIGluc3RlYWQgb2YgcG9zdGluZyBhIHRhc2sgdG8gZG8gdGhhdC4gV2UgbmVlZCB0byBkbyB0
aGF0IHRvIG1ha2UKKyAgICAgICAgc3VyZSB0aGF0IGFsbCBKUyBvYmplY3RzIGFyZSBkZXN0cm95
ZWQgYmVmb3JlCisgICAgICAgIFdvcmtlclRocmVhZFNodXRkb3duRmluaXNoVGFzayAoaW4gV29y
a2VyVGhyZWFkLmNwcCkgY2FsbHMKKyAgICAgICAgV29ya2VyQ29udGV4dDo6Y2xlYXJTY3JpcHQo
KS4KKworICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckpTLnBtOiBTYW1l
IGNoYW5nZSBhcyBhYm92ZSwgZm9yCisgICAgICAgIGFsbCBhdXRvLWdlbmVyYXRlZCBjYWxsYmFj
a3MuCisKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0Q2FsbGJhY2su
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0Q2FsbGJhY2s6On5KU1Rlc3RDYWxsYmFjayk6
IFVwZGF0ZWQgdGhlCisgICAgICAgIGV4cGVjdGF0aW9ucyBmb3IgcnVuLWJpbmRpbmdzLXRlc3Rz
LgorCisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcDogQWRkZWQgdGhl
IGFiaWxpdHkgdG8gaW50ZXJydXB0CisgICAgICAgIGFsbCBEQiBvcGVyYXRpb25zIGluIHByb2dy
ZXNzLCB1bmxlc3MgdGhlIGRhdGFiYXNlIHdhcyBjbG9zZWQgb3IKKyAgICAgICAgaXMgYmVpbmcg
Y2xvc2VkLiBVbmxpa2Ugc3FsaXRlM19pbnRlcnJ1cHQoKSwKKyAgICAgICAgU1FMaXRlRGF0YWJh
c2U6OmludGVycnVwdCgpIGlzIHN0aWNreTogb25jZSBpdCdzIGNhbGxlZCwgdHJ5aW5nIHRvCisg
ICAgICAgIHJ1biBhbnkgc3RhdGVtZW50IG9uIHRoYXQgZGF0YWJhc2Ugd2lsbCBmYWlsIHdpdGgg
YQorICAgICAgICBTUUxJVEVfSU5URVJSVVBUIGVycm9yIGNvZGUuCisgICAgICAgIChXZWJDb3Jl
OjpTUUxpdGVEYXRhYmFzZTo6U1FMaXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6U1FM
aXRlRGF0YWJhc2U6OmNsb3NlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpp
bnRlcnJ1cHQpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OmlzSW50ZXJydXB0
ZWQpOgorCisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmg6IEFkZGVkIGEg
bXV0ZXggdGhhdCBjYW4gdXNlZCBieQorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgdG8gY2hlY2sg
aWYgdGhlIGRhdGFiYXNlIHdhcyBpbnRlcnJ1cHRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0
ZURhdGFiYXNlOjpkYXRhYmFzZU11dGV4KToKKworICAgICAgICAqIHBsYXRmb3JtL3NxbC9TUUxp
dGVTdGF0ZW1lbnQuY3BwOiBDaGFuZ2VkIHByZXBhcmUoKSBhbmQgc3RlcCgpCisgICAgICAgIHRv
IGNoZWNrIGlmIHRoZSBkYXRhYmFzZSB3YXMgaW50ZXJydXB0ZWQsIGJlZm9yZSB0cnlpbmcgdG8g
cHJlcGFyZQorICAgICAgICBvciBydW4gdGhlIHN0YXRlbWVudC4gVGhlIG90aGVyIG1ldGhvZHMg
ZG9uJ3QgbmVlZCB0byBob2xkIG9uIHRvCisgICAgICAgIHRoZSBEQiBsb2NrIHdoaWxlIHJ1bm5p
bmcsIGJlY2F1c2UgdGhleSdyZSBmYXN0LCBzbyB3ZSBkb24ndCBuZWVkCisgICAgICAgIHRvIGlu
dGVycnVwdCB0aGVtLgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50OjpwcmVwYXJl
KToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudDo6c3RlcCk6CisKKyAgICAgICAg
KiBzdG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuY3BwOiBNYWRlIFNRTGl0ZURhdGFiYXNlOjppbnRl
cnJ1cHQoKQorICAgICAgICBhbmQgaXNJbnRlcnJ1cHRlZCgpIHZpc2libGUgdG8gV2ViU1FMRGF0
YWJhc2VzIGNsYXNzZXMuCisgICAgICAgIChXZWJDb3JlOjpBYnN0cmFjdERhdGFiYXNlOjppbnRl
cnJ1cHQpOgorICAgICAgICAoV2ViQ29yZTo6QWJzdHJhY3REYXRhYmFzZTo6aXNJbnRlcnJ1cHRl
ZCk6CisgICAgICAgICogc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmg6CisKKyAgICAgICAgKiBz
dG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6IEFkZGVkIGEgbWV0aG9kIHRvIGludGVycnVwdCBh
bGwKKyAgICAgICAgZGF0YWJhc2VzIGluIGEgZ2l2ZW4gY29udGV4dC4KKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6aW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dCk6Cisg
ICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKworICAgICAgICAqIHN0b3JhZ2Uv
U1FMU3RhdGVtZW50LmNwcDogQ2hhbmdlZCB0aGUgZXhjZXB0aW9uL2Vycm9yIHJlcG9ydGVkCisg
ICAgICAgIHdoZW4gYSBzdGF0ZW1lbnQgaXMgaW50ZXJydXB0ZWQuCisgICAgICAgIChXZWJDb3Jl
OjpTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUpOgorICAgICAgICAqIHN0b3JhZ2UvU1FMU3RhdGVtZW50
U3luYy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTUUxTdGF0ZW1lbnRTeW5jOjpleGVjdXRlKToK
KworICAgICAgICAqIHN0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwOiBDaGFuZ2VkIHRoZSBjb2Rl
IHRvIHJlbGVhc2UgdGhlCisgICAgICAgIGNhbGxiYWNrIG9iamVjdHMgYXMgc29vbiBhcyB0aGV5
J3JlIG5vdCBuZWVkZWQuCisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6Y2hlY2tB
bmRIYW5kbGVDbG9zZWRPckludGVycnVwdGVkRGF0YWJhc2UpOgorICAgICAgICBDaGFuZ2VkIHRo
aXMgbWV0aG9kIHRvIG5vdCBzY2hlZHVsZSB0aGUgbmV4dCB0cmFuc2FjdGlvbiBzdGVwIHdoZW4K
KyAgICAgICAgdGhlIGRhdGFiYXNlIGlzIGludGVycnVwdGVkLgorICAgICAgICAoV2ViQ29yZTo6
U1FMVHJhbnNhY3Rpb246OnBlcmZvcm1OZXh0U3RlcCk6CisgICAgICAgIChXZWJDb3JlOjpTUUxU
cmFuc2FjdGlvbjo6cGVyZm9ybVBlbmRpbmdDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpT
UUxUcmFuc2FjdGlvbjo6ZGVsaXZlclRyYW5zYWN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6U1FMVHJhbnNhY3Rpb246OnBvc3RmbGlnaHRBbmRDb21taXQpOgorICAgICAgICAoV2Vi
Q29yZTo6U1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2spOgor
ICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclRyYW5zYWN0aW9u
RXJyb3JDYWxsYmFjayk6CisgICAgICAgICogc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5oOgorCisg
ICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHA6IEFk
ZGVkIGEgbWV0aG9kIHRvCisgICAgICAgIGludGVycnVwdCBhbGwgZGF0YWJhc2VzIGluIGEgZ2l2
ZW4gY29udGV4dC4KKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aW50ZXJydXB0
QWxsRGF0YWJhc2VzRm9yQ29udGV4dCk6CisKKyAgICAgICAgKiB3b3JrZXJzL1dvcmtlclRocmVh
ZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJUaHJlYWQ6OnN0b3ApOiBBZGRlZCBhIGNh
bGwgdG8KKyAgICAgICAgRGF0YWJhc2VUcmFja2VyOjppbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JD
b250ZXh0KCkuCisKIDIwMTAtMDctMzAgIEphbWVzIFJvYmluc29uICA8amFtZXNyQGNocm9taXVt
Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBGaXNoZXIuCkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL2pzL0pTQ3VzdG9tVm9pZENhbGxiYWNrLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL2pzL0pTQ3VzdG9tVm9pZENhbGxiYWNrLmNwcAkocmV2aXNpb24gNjQzNzcp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ3VzdG9tVm9pZENhbGxiYWNrLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDgsNyArNDgsMTAgQEAgSlNDdXN0b21Wb2lkQ2FsbGJhY2s6OkpTQ3VzdG9t
Vm9pZENhbGxiYQogCiBKU0N1c3RvbVZvaWRDYWxsYmFjazo6fkpTQ3VzdG9tVm9pZENhbGxiYWNr
KCkKIHsKLSAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKERlbGV0ZUNhbGxi
YWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTsKKyAgICBpZiAobV9zY3JpcHRFeGVjdXRpb25D
b250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSkKKyAgICAgICAgZGVsZXRlIG1fZGF0YTsKKyAgICBl
bHNlCisgICAgICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soRGVsZXRlQ2Fs
bGJhY2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpOwogI2lmbmRlZiBOREVCVUcKICAgICBtX2Rh
dGEgPSAwOwogI2VuZGlmCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVy
YXRvckpTLnBtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2Vu
ZXJhdG9ySlMucG0JKHJldmlzaW9uIDY0Mzc3KQorKysgV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRz
L0NvZGVHZW5lcmF0b3JKUy5wbQkod29ya2luZyBjb3B5KQpAQCAtMjE2OCw3ICsyMTY4LDEwIEBA
IHN1YiBHZW5lcmF0ZUNhbGxiYWNrSW1wbGVtZW50YXRpb24KICAgICAjIERlc3RydWN0b3IKICAg
ICBwdXNoKEBpbXBsQ29udGVudCwgIiR7Y2xhc3NOYW1lfTo6fiR7Y2xhc3NOYW1lfSgpXG4iKTsK
ICAgICBwdXNoKEBpbXBsQ29udGVudCwgIntcbiIpOwotICAgIHB1c2goQGltcGxDb250ZW50LCAi
ICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soRGVsZXRlQ2FsbGJhY2tEYXRh
VGFzazo6Y3JlYXRlKG1fZGF0YSkpO1xuIik7CisgICAgcHVzaChAaW1wbENvbnRlbnQsICIgICAg
aWYgKG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpXG4iKTsKKyAg
ICBwdXNoKEBpbXBsQ29udGVudCwgIiAgICAgICAgZGVsZXRlIG1fZGF0YTtcbiIpOworICAgIHB1
c2goQGltcGxDb250ZW50LCAiICAgIGVsc2VcbiIpOworICAgIHB1c2goQGltcGxDb250ZW50LCAi
ICAgICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKERlbGV0ZUNhbGxiYWNr
RGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTtcbiIpOwogICAgIHB1c2goQGltcGxDb250ZW50LCAi
I2lmbmRlZiBOREVCVUdcbiIpOwogICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgIG1fZGF0YSA9
IDA7XG4iKTsKICAgICBwdXNoKEBpbXBsQ29udGVudCwgIiNlbmRpZlxuIik7CkluZGV4OiBXZWJD
b3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RDYWxsYmFjay5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0Q2FsbGJhY2suY3Bw
CShyZXZpc2lvbiA2NDM3NykKKysrIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pT
VGVzdENhbGxiYWNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDMsNyArNDMsMTAgQEAgSlNUZXN0
Q2FsbGJhY2s6OkpTVGVzdENhbGxiYWNrKEpTT2JqZWN0KgogCiBKU1Rlc3RDYWxsYmFjazo6fkpT
VGVzdENhbGxiYWNrKCkKIHsKLSAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNr
KERlbGV0ZUNhbGxiYWNrRGF0YVRhc2s6OmNyZWF0ZShtX2RhdGEpKTsKKyAgICBpZiAobV9zY3Jp
cHRFeGVjdXRpb25Db250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSkKKyAgICAgICAgZGVsZXRlIG1f
ZGF0YTsKKyAgICBlbHNlCisgICAgICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRh
c2soRGVsZXRlQ2FsbGJhY2tEYXRhVGFzazo6Y3JlYXRlKG1fZGF0YSkpOwogI2lmbmRlZiBOREVC
VUcKICAgICBtX2RhdGEgPSAwOwogI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9T
UUxpdGVEYXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FM
aXRlRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA2NDM3NykKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3Fs
L1NRTGl0ZURhdGFiYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsOCArMzEsOCBAQAogI2lu
Y2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJTUUxpdGVGaWxlU3lzdGVtLmgiCiAjaW5jbHVk
ZSAiU1FMaXRlU3RhdGVtZW50LmgiCi0KICNpbmNsdWRlIDxzcWxpdGUzLmg+CisjaW5jbHVkZSA8
d3RmL1RocmVhZGluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTQyLDcgKzQyLDcg
QEAgY29uc3QgaW50IFNRTFJlc3VsdE9rID0gU1FMSVRFX09LOwogY29uc3QgaW50IFNRTFJlc3Vs
dFJvdyA9IFNRTElURV9ST1c7CiBjb25zdCBpbnQgU1FMUmVzdWx0U2NoZW1hID0gU1FMSVRFX1ND
SEVNQTsKIGNvbnN0IGludCBTUUxSZXN1bHRGdWxsID0gU1FMSVRFX0ZVTEw7Ci0KK2NvbnN0IGlu
dCBTUUxSZXN1bHRJbnRlcnJ1cHQgPSBTUUxJVEVfSU5URVJSVVBUOwogCiBTUUxpdGVEYXRhYmFz
ZTo6U1FMaXRlRGF0YWJhc2UoKQogICAgIDogbV9kYigwKQpAQCAtNTAsNiArNTAsNyBAQCBTUUxp
dGVEYXRhYmFzZTo6U1FMaXRlRGF0YWJhc2UoKQogICAgICwgbV90cmFuc2FjdGlvbkluUHJvZ3Jl
c3MoZmFsc2UpCiAgICAgLCBtX3NoYXJhYmxlKGZhbHNlKQogICAgICwgbV9vcGVuaW5nVGhyZWFk
KDApCisgICAgLCBtX2ludGVycnVwdGVkKGZhbHNlKQogewogfQogCkBAIC04NSwxMyArODYsMzcg
QEAgdm9pZCBTUUxpdGVEYXRhYmFzZTo6Y2xvc2UoKQogICAgIGlmIChtX2RiKSB7CiAgICAgICAg
IC8vIEZJWE1FOiBUaGlzIGlzIGJlaW5nIGNhbGxlZCBvbiB0aGVtYWluIHRocmVhZCBkdXJpbmcg
SlMgR0MuIDxyZGFyOi8vcHJvYmxlbS81NzM5ODE4PgogICAgICAgICAvLyBBU1NFUlQoY3VycmVu
dFRocmVhZCgpID09IG1fb3BlbmluZ1RocmVhZCk7Ci0gICAgICAgIHNxbGl0ZTNfY2xvc2UobV9k
Yik7Ci0gICAgICAgIG1fZGIgPSAwOworICAgICAgICBzcWxpdGUzKiBkYiA9IG1fZGI7CisgICAg
ICAgIHsKKyAgICAgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2RhdGFiYXNlQ2xvc2luZ011
dGV4KTsKKyAgICAgICAgICAgIG1fZGIgPSAwOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZTNf
Y2xvc2UoZGIpOwogICAgIH0KIAogICAgIG1fb3BlbmluZ1RocmVhZCA9IDA7CiB9CiAKK3ZvaWQg
U1FMaXRlRGF0YWJhc2U6OmludGVycnVwdCgpCit7CisgICAgbV9pbnRlcnJ1cHRlZCA9IHRydWU7
CisgICAgd2hpbGUgKCFtX2xvY2tpbmdNdXRleC50cnlMb2NrKCkpIHsKKyAgICAgICAgTXV0ZXhM
b2NrZXIgbG9ja2VyKG1fZGF0YWJhc2VDbG9zaW5nTXV0ZXgpOworICAgICAgICBpZiAoIW1fZGIp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHNxbGl0ZTNfaW50ZXJydXB0KG1fZGIpOwor
ICAgICAgICB5aWVsZCgpOworICAgIH0KKworICAgIG1fbG9ja2luZ011dGV4LnVubG9jaygpOwor
fQorCitib29sIFNRTGl0ZURhdGFiYXNlOjppc0ludGVycnVwdGVkKCkKK3sKKyAgICBBU1NFUlQo
IW1fbG9ja2luZ011dGV4LnRyeUxvY2soKSk7CisgICAgcmV0dXJuIG1faW50ZXJydXB0ZWQ7Cit9
CisKIHZvaWQgU1FMaXRlRGF0YWJhc2U6OnNldEZ1bGxzeW5jKGJvb2wgZnN5bmMpIAogewogICAg
IGlmIChmc3luYykgCkBAIC0zOTcsMTYgKzQyMiw2IEBAIHZvaWQgU1FMaXRlRGF0YWJhc2U6OmVu
YWJsZUF1dGhvcml6ZXIoYm8KICAgICAgICAgc3FsaXRlM19zZXRfYXV0aG9yaXplcihtX2RiLCBO
VUxMLCAwKTsKIH0KIAotdm9pZCBTUUxpdGVEYXRhYmFzZTo6bG9jaygpCi17Ci0gICAgbV9sb2Nr
aW5nTXV0ZXgubG9jaygpOwotfQotCi12b2lkIFNRTGl0ZURhdGFiYXNlOjp1bmxvY2soKQotewot
ICAgIG1fbG9ja2luZ011dGV4LnVubG9jaygpOwotfQotCiBib29sIFNRTGl0ZURhdGFiYXNlOjpp
c0F1dG9Db21taXRPbigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHNxbGl0ZTNfZ2V0X2F1dG9jb21t
aXQobV9kYik7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgJKHJldmlz
aW9uIDY0Mzc3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkod29y
a2luZyBjb3B5KQpAQCAtNDgsNiArNDgsNyBAQCBleHRlcm4gY29uc3QgaW50IFNRTFJlc3VsdE9r
OwogZXh0ZXJuIGNvbnN0IGludCBTUUxSZXN1bHRSb3c7CiBleHRlcm4gY29uc3QgaW50IFNRTFJl
c3VsdFNjaGVtYTsKIGV4dGVybiBjb25zdCBpbnQgU1FMUmVzdWx0RnVsbDsKK2V4dGVybiBjb25z
dCBpbnQgU1FMUmVzdWx0SW50ZXJydXB0OwogCiBjbGFzcyBTUUxpdGVEYXRhYmFzZSA6IHB1Ymxp
YyBOb25jb3B5YWJsZSB7CiAgICAgZnJpZW5kIGNsYXNzIFNRTGl0ZVRyYW5zYWN0aW9uOwpAQCAt
NTgsNiArNTksOCBAQCBwdWJsaWM6CiAgICAgYm9vbCBvcGVuKGNvbnN0IFN0cmluZyYgZmlsZW5h
bWUsIGJvb2wgZm9yV2ViU1FMRGF0YWJhc2UgPSBmYWxzZSk7CiAgICAgYm9vbCBpc09wZW4oKSBj
b25zdCB7IHJldHVybiBtX2RiOyB9CiAgICAgdm9pZCBjbG9zZSgpOworICAgIHZvaWQgaW50ZXJy
dXB0KCk7CisgICAgYm9vbCBpc0ludGVycnVwdGVkKCk7CiAKICAgICBib29sIGV4ZWN1dGVDb21t
YW5kKGNvbnN0IFN0cmluZyYpOwogICAgIGJvb2wgcmV0dXJuc0F0TGVhc3RPbmVSZXN1bHQoY29u
c3QgU3RyaW5nJik7CkBAIC0xMDUsOSArMTA4LDcgQEAgcHVibGljOgogICAgIAogICAgIHZvaWQg
c2V0QXV0aG9yaXplcihQYXNzUmVmUHRyPERhdGFiYXNlQXV0aG9yaXplcj4pOwogCi0gICAgLy8g
KHVuKWxvY2tzIHRoZSBkYXRhYmFzZSBsaWtlIGEgbXV0ZXgKLSAgICB2b2lkIGxvY2soKTsKLSAg
ICB2b2lkIHVubG9jaygpOworICAgIE11dGV4JiBkYXRhYmFzZU11dGV4KCkgeyByZXR1cm4gbV9s
b2NraW5nTXV0ZXg7IH0KICAgICBib29sIGlzQXV0b0NvbW1pdE9uKCkgY29uc3Q7CiAKICAgICAv
LyBUaGUgU1FMaXRlIEFVVE9fVkFDVVVNIHByYWdtYSBjYW4gYmUgZWl0aGVyIE5PTkUsIEZVTEws
IG9yIElOQ1JFTUVOVEFMLgpAQCAtMTQ5LDcgKzE1MCw5IEBAIHByaXZhdGU6CiAKICAgICBNdXRl
eCBtX2xvY2tpbmdNdXRleDsKICAgICBUaHJlYWRJZGVudGlmaWVyIG1fb3BlbmluZ1RocmVhZDsK
LSAgICAKKworICAgIE11dGV4IG1fZGF0YWJhc2VDbG9zaW5nTXV0ZXg7CisgICAgYm9vbCBtX2lu
dGVycnVwdGVkOwogfTsgLy8gY2xhc3MgU1FMaXRlRGF0YWJhc2UKIAogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlU3RhdGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVTdGF0ZW1lbnQuY3BwCShy
ZXZpc2lvbiA2NDM3NykKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZVN0YXRlbWVudC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTYxLDYgKzYxLDExIEBAIFNRTGl0ZVN0YXRlbWVudDo6flNR
TGl0ZVN0YXRlbWVudCgpCiBpbnQgU1FMaXRlU3RhdGVtZW50OjpwcmVwYXJlKCkKIHsKICAgICBB
U1NFUlQoIW1faXNQcmVwYXJlZCk7CisKKyAgICBNdXRleExvY2tlciBkYXRhYmFzZUxvY2sobV9k
YXRhYmFzZS5kYXRhYmFzZU11dGV4KCkpOworICAgIGlmIChtX2RhdGFiYXNlLmlzSW50ZXJydXB0
ZWQoKSkKKyAgICAgICAgcmV0dXJuIFNRTElURV9JTlRFUlJVUFQ7CisKICAgICBjb25zdCB2b2lk
KiB0YWlsID0gMDsKICAgICBMT0coU1FMRGF0YWJhc2UsICJTUUwgLSBwcmVwYXJlIC0gJXMiLCBt
X3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKICAgICBTdHJpbmcgc3RyaXBwZWRRdWVyeSA9IG1fcXVl
cnkuc3RyaXBXaGl0ZVNwYWNlKCk7CkBAIC04OCw2ICs5MywxMSBAQCBpbnQgU1FMaXRlU3RhdGVt
ZW50OjpwcmVwYXJlKCkKIGludCBTUUxpdGVTdGF0ZW1lbnQ6OnN0ZXAoKQogewogICAgIEFTU0VS
VChtX2lzUHJlcGFyZWQpOworCisgICAgTXV0ZXhMb2NrZXIgZGF0YWJhc2VMb2NrKG1fZGF0YWJh
c2UuZGF0YWJhc2VNdXRleCgpKTsKKyAgICBpZiAobV9kYXRhYmFzZS5pc0ludGVycnVwdGVkKCkp
CisgICAgICAgIHJldHVybiBTUUxJVEVfSU5URVJSVVBUOworCiAgICAgaWYgKCFtX3N0YXRlbWVu
dCkKICAgICAgICAgcmV0dXJuIFNRTElURV9PSzsKICAgICBMT0coU1FMRGF0YWJhc2UsICJTUUwg
LSBzdGVwIC0gJXMiLCBtX3F1ZXJ5LmFzY2lpKCkuZGF0YSgpKTsKSW5kZXg6IFdlYkNvcmUvc3Rv
cmFnZS9BYnN0cmFjdERhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uv
QWJzdHJhY3REYXRhYmFzZS5jcHAJKHJldmlzaW9uIDY0Mzc3KQorKysgV2ViQ29yZS9zdG9yYWdl
L0Fic3RyYWN0RGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NzQsNiArNDc0LDE3IEBA
IHZvaWQgQWJzdHJhY3REYXRhYmFzZTo6aW5jcmVtZW50YWxWYWN1dW0KICAgICAgICAgbV9zcWxp
dGVEYXRhYmFzZS5ydW5JbmNyZW1lbnRhbFZhY3V1bUNvbW1hbmQoKTsKIH0KIAordm9pZCBBYnN0
cmFjdERhdGFiYXNlOjppbnRlcnJ1cHQoKQoreworICAgIG1fc3FsaXRlRGF0YWJhc2UuaW50ZXJy
dXB0KCk7Cit9CisKK2Jvb2wgQWJzdHJhY3REYXRhYmFzZTo6aXNJbnRlcnJ1cHRlZCgpCit7Cisg
ICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fc3FsaXRlRGF0YWJhc2UuZGF0YWJhc2VNdXRleCgpKTsK
KyAgICByZXR1cm4gbV9zcWxpdGVEYXRhYmFzZS5pc0ludGVycnVwdGVkKCk7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIEVOQUJMRShEQVRBQkFTRSkKSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9BYnN0cmFjdERhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9z
dG9yYWdlL0Fic3RyYWN0RGF0YWJhc2UuaAkocmV2aXNpb24gNjQzNzcpCisrKyBXZWJDb3JlL3N0
b3JhZ2UvQWJzdHJhY3REYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC02OCw2ICs2OCw4IEBA
IHB1YmxpYzoKIAogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXhpbXVtU2l6ZSgpIGNvbnN0Owog
ICAgIHZvaWQgaW5jcmVtZW50YWxWYWN1dW1JZk5lZWRlZCgpOworICAgIHZvaWQgaW50ZXJydXB0
KCk7CisgICAgYm9vbCBpc0ludGVycnVwdGVkKCk7CiAKICAgICAvLyBGSVhNRTogbW92ZSBhbGwg
dmVyc2lvbi1yZWxhdGVkIG1ldGhvZHMgdG8gYSBEYXRhYmFzZVZlcnNpb25UcmFja2VyIGNsYXNz
CiAgICAgYm9vbCB2ZXJzaW9uTWF0Y2hlc0V4cGVjdGVkKCkgY29uc3Q7CkluZGV4OiBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUcmFja2VyLmNwcAkocmV2aXNpb24gNjQzNzcpCisrKyBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUcmFja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjM1LDYgKzIzNSwzNSBA
QCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VDaGFuZ2VkKEFiCiAgICAgb3JpZ2luUXVv
dGFNYW5hZ2VyKCkubWFya0RhdGFiYXNlKGRhdGFiYXNlKTsKIH0KIAordm9pZCBEYXRhYmFzZVRy
YWNrZXI6OmludGVycnVwdEFsbERhdGFiYXNlc0ZvckNvbnRleHQoY29uc3QgU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0YWJh
c2U+ID4gb3BlbkRhdGFiYXNlczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIG9wZW5EYXRh
YmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CisKKyAgICAgICAgaWYgKCFtX29w
ZW5EYXRhYmFzZU1hcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBEYXRhYmFzZU5h
bWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KGNvbnRleHQtPnNlY3VyaXR5
T3JpZ2luKCkpOworICAgICAgICBpZiAoIW5hbWVNYXApCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgRGF0YWJhc2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVNYXBFbmRJdCA9
IG5hbWVNYXAtPmVuZCgpOworICAgICAgICBmb3IgKERhdGFiYXNlTmFtZU1hcDo6Y29uc3RfaXRl
cmF0b3IgZGJOYW1lTWFwSXQgPSBuYW1lTWFwLT5iZWdpbigpOyBkYk5hbWVNYXBJdCAhPSBkYk5h
bWVNYXBFbmRJdDsgKytkYk5hbWVNYXBJdCkgeworICAgICAgICAgICAgRGF0YWJhc2VTZXQqIGRh
dGFiYXNlU2V0ID0gZGJOYW1lTWFwSXQtPnNlY29uZDsKKyAgICAgICAgICAgIERhdGFiYXNlU2V0
Ojpjb25zdF9pdGVyYXRvciBkYlNldEVuZEl0ID0gZGF0YWJhc2VTZXQtPmVuZCgpOworICAgICAg
ICAgICAgZm9yIChEYXRhYmFzZVNldDo6Y29uc3RfaXRlcmF0b3IgZGJTZXRJdCA9IGRhdGFiYXNl
U2V0LT5iZWdpbigpOyBkYlNldEl0ICE9IGRiU2V0RW5kSXQ7ICsrZGJTZXRJdCkgeworICAgICAg
ICAgICAgICAgIGlmICgoKmRiU2V0SXQpLT5zY3JpcHRFeGVjdXRpb25Db250ZXh0KCkgPT0gY29u
dGV4dCkKKyAgICAgICAgICAgICAgICAgICAgb3BlbkRhdGFiYXNlcy5hcHBlbmQoKmRiU2V0SXQp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmVjdG9yPFJlZlB0cjxB
YnN0cmFjdERhdGFiYXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzRW5kSXQgPSBv
cGVuRGF0YWJhc2VzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFJlZlB0cjxBYnN0cmFjdERhdGFi
YXNlPiA+Ojpjb25zdF9pdGVyYXRvciBvcGVuRGF0YWJhc2VzSXQgPSBvcGVuRGF0YWJhc2VzLmJl
Z2luKCk7IG9wZW5EYXRhYmFzZXNJdCAhPSBvcGVuRGF0YWJhc2VzRW5kSXQ7ICsrb3BlbkRhdGFi
YXNlc0l0KQorICAgICAgICAoKm9wZW5EYXRhYmFzZXNJdCktPmludGVycnVwdCgpOworfQorCiBT
dHJpbmcgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5QYXRoKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4p
IGNvbnN0CiB7CiAgICAgcmV0dXJuIFNRTGl0ZUZpbGVTeXN0ZW06OmFwcGVuZERhdGFiYXNlRmls
ZU5hbWVUb1BhdGgobV9kYXRhYmFzZURpcmVjdG9yeVBhdGgudGhyZWFkc2FmZUNvcHkoKSwgb3Jp
Z2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2VUcmFja2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tl
ci5oCShyZXZpc2lvbiA2NDM3NykKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIu
aAkod29ya2luZyBjb3B5KQpAQCAtNzgsNiArNzgsOCBAQCBwdWJsaWM6CiAgICAgdW5zaWduZWQg
bG9uZyBsb25nIGdldE1heFNpemVGb3JEYXRhYmFzZShjb25zdCBBYnN0cmFjdERhdGFiYXNlKik7
CiAgICAgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQWJzdHJhY3REYXRhYmFzZSopOwogCisgICAgdm9p
ZCBpbnRlcnJ1cHRBbGxEYXRhYmFzZXNGb3JDb250ZXh0KGNvbnN0IFNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqKTsKKwogcHJpdmF0ZToKICAgICBEYXRhYmFzZVRyYWNrZXIoY29uc3QgU3RyaW5nJiBk
YXRhYmFzZVBhdGgpOwogCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAkocmV2aXNpb24g
NjQzNzcpCisrKyBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNzgsNyArNzgsNyBAQCBib29sIFNRTFN0YXRlbWVudDo6ZXhlY3V0ZShEYXRhYmFzZSog
ZGIpCiAKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdE9rKSB7CiAgICAgICAgIExPRyhTdG9y
YWdlQVBJLCAiVW5hYmxlIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiBzdGF0ZW1lbnQgJXMgLSBl
cnJvciAlaSAoJXMpIiwgbV9zdGF0ZW1lbnQuYXNjaWkoKS5kYXRhKCksIHJlc3VsdCwgZGF0YWJh
c2UtPmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgbV9lcnJvciA9IFNRTEVycm9yOjpjcmVhdGUo
U1FMRXJyb3I6OlNZTlRBWF9FUlIsIGRhdGFiYXNlLT5sYXN0RXJyb3JNc2coKSk7CisgICAgICAg
IG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKHJlc3VsdCA9PSBTUUxSZXN1bHRJbnRlcnJ1cHQg
PyBTUUxFcnJvcjo6REFUQUJBU0VfRVJSIDogU1FMRXJyb3I6OlNZTlRBWF9FUlIsIGRhdGFiYXNl
LT5sYXN0RXJyb3JNc2coKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTg2
LDcgKzg2LDcgQEAgYm9vbCBTUUxTdGF0ZW1lbnQ6OmV4ZWN1dGUoRGF0YWJhc2UqIGRiKQogICAg
IC8vIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZXkgbWlnaHQgYmUgdHJ5aW5nIHRvIGRvIHNvbWV0
aGluZyBmaXNoeSBvciBtYWxpY2lvdXMKICAgICBpZiAoc3RhdGVtZW50LmJpbmRQYXJhbWV0ZXJD
b3VudCgpICE9IG1fYXJndW1lbnRzLnNpemUoKSkgewogICAgICAgICBMT0coU3RvcmFnZUFQSSwg
IkJpbmQgcGFyYW1ldGVyIGNvdW50IGRvZXNuJ3QgbWF0Y2ggbnVtYmVyIG9mIHF1ZXN0aW9uIG1h
cmtzIik7Ci0gICAgICAgIG1fZXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKFNRTEVycm9yOjpTWU5U
QVhfRVJSLCAibnVtYmVyIG9mICc/J3MgaW4gc3RhdGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRj
aCBhcmd1bWVudCBjb3VudCIpOworICAgICAgICBtX2Vycm9yID0gU1FMRXJyb3I6OmNyZWF0ZShk
Yi0+aXNJbnRlcnJ1cHRlZCgpID8gU1FMRXJyb3I6OkRBVEFCQVNFX0VSUiA6IFNRTEVycm9yOjpT
WU5UQVhfRVJSLCAibnVtYmVyIG9mICc/J3MgaW4gc3RhdGVtZW50IHN0cmluZyBkb2VzIG5vdCBt
YXRjaCBhcmd1bWVudCBjb3VudCIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCklu
ZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU1FMU3RhdGVtZW50U3luYy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9zdG9yYWdlL1NRTFN0YXRlbWVudFN5bmMuY3BwCShyZXZpc2lvbiA2NDM3NykKKysr
IFdlYkNvcmUvc3RvcmFnZS9TUUxTdGF0ZW1lbnRTeW5jLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NjEsMTIgKzYxLDEyIEBAIFBhc3NSZWZQdHI8U1FMUmVzdWx0U2V0PiBTUUxTdGF0ZW1lbnRTeW4K
ICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KCpkYXRhYmFzZSwgbV9zdGF0ZW1lbnQpOwog
ICAgIGludCByZXN1bHQgPSBzdGF0ZW1lbnQucHJlcGFyZSgpOwogICAgIGlmIChyZXN1bHQgIT0g
U1FMUmVzdWx0T2spIHsKLSAgICAgICAgZWMgPSBTUUxFeGNlcHRpb246OlNZTlRBWF9FUlI7Cisg
ICAgICAgIGVjID0gKHJlc3VsdCA9PSBTUUxSZXN1bHRJbnRlcnJ1cHQgPyBTUUxFeGNlcHRpb246
OkRBVEFCQVNFX0VSUiA6IFNRTEV4Y2VwdGlvbjo6U1lOVEFYX0VSUik7CiAgICAgICAgIHJldHVy
biAwOwogICAgIH0KIAogICAgIGlmIChzdGF0ZW1lbnQuYmluZFBhcmFtZXRlckNvdW50KCkgIT0g
bV9hcmd1bWVudHMuc2l6ZSgpKSB7Ci0gICAgICAgIGVjID0gU1FMRXhjZXB0aW9uOjpTWU5UQVhf
RVJSOworICAgICAgICBlYyA9IChkYi0+aXNJbnRlcnJ1cHRlZCgpPyBTUUxFeGNlcHRpb246OkRB
VEFCQVNFX0VSUiA6IFNRTEV4Y2VwdGlvbjo6U1lOVEFYX0VSUik7CiAgICAgICAgIHJldHVybiAw
OwogICAgIH0KIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCShyZXZpc2lvbiA2
NDM3NykKKysrIFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTE0NiwxNyArMTQ2LDIyIEBAIGNvbnN0IGNoYXIqIFNRTFRyYW5zYWN0aW9uOjpkZWJ1
Z1N0ZXBOYW0KIH0KICNlbmRpZgogCi12b2lkIFNRTFRyYW5zYWN0aW9uOjpjaGVja0FuZEhhbmRs
ZUNsb3NlZERhdGFiYXNlKCkKK3ZvaWQgU1FMVHJhbnNhY3Rpb246OmNoZWNrQW5kSGFuZGxlQ2xv
c2VkT3JJbnRlcnJ1cHRlZERhdGFiYXNlKCkKIHsKLSAgICBpZiAobV9kYXRhYmFzZS0+b3BlbmVk
KCkpCisgICAgaWYgKG1fZGF0YWJhc2UtPm9wZW5lZCgpICYmICFtX2RhdGFiYXNlLT5pc0ludGVy
cnVwdGVkKCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIElmIHRoZSBkYXRhYmFzZSB3YXMg
c3RvcHBlZCwgZG9uJ3QgZG8gYW55dGhpbmcgYW5kIGNhbmNlbCBxdWV1ZWQgd29yawotICAgIExP
RyhTdG9yYWdlQVBJLCAiRGF0YWJhc2Ugd2FzIHN0b3BwZWQgLSBjYW5jZWxsaW5nIHdvcmsgZm9y
IHRoaXMgdHJhbnNhY3Rpb24iKTsKKyAgICBMT0coU3RvcmFnZUFQSSwgIkRhdGFiYXNlIHdhcyBz
dG9wcGVkIG9yIGludGVycnVwdGVkIC0gY2FuY2VsbGluZyB3b3JrIGZvciB0aGlzIHRyYW5zYWN0
aW9uIik7CiAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fc3RhdGVtZW50TXV0ZXgpOwogICAgIG1f
c3RhdGVtZW50UXVldWUuY2xlYXIoKTsKICAgICBtX25leHRTdGVwID0gMDsKIAorICAgIC8vIFJl
bGVhc2UgdGhlIHVubmVlZGVkIGNhbGxiYWNrcywgdG8gYnJlYWsgcmVmZXJlbmNlIGN5Y2xlcy4K
KyAgICBtX2NhbGxiYWNrID0gMDsKKyAgICBtX3N1Y2Nlc3NDYWxsYmFjayA9IDA7CisgICAgbV9l
cnJvckNhbGxiYWNrID0gMDsKKwogICAgIC8vIFRoZSBuZXh0IHN0ZXBzIHNob3VsZCBiZSBleGVj
dXRlZCBvbmx5IGlmIHdlJ3JlIG9uIHRoZSBEQiB0aHJlYWQuCiAgICAgaWYgKGN1cnJlbnRUaHJl
YWQoKSAhPSBkYXRhYmFzZSgpLT5zY3JpcHRFeGVjdXRpb25Db250ZXh0KCktPmRhdGFiYXNlVGhy
ZWFkKCktPmdldFRocmVhZElEKCkpCiAgICAgICAgIHJldHVybjsKQEAgLTE4Myw3ICsxODgsNyBA
QCBib29sIFNRTFRyYW5zYWN0aW9uOjpwZXJmb3JtTmV4dFN0ZXAoKQogICAgICAgICAgICBtX25l
eHRTdGVwID09ICZTUUxUcmFuc2FjdGlvbjo6Y2xlYW51cEFmdGVyU3VjY2Vzc0NhbGxiYWNrIHx8
CiAgICAgICAgICAgIG1fbmV4dFN0ZXAgPT0gJlNRTFRyYW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJU
cmFuc2FjdGlvbkVycm9yQ2FsbGJhY2spOwogCi0gICAgY2hlY2tBbmRIYW5kbGVDbG9zZWREYXRh
YmFzZSgpOworICAgIGNoZWNrQW5kSGFuZGxlQ2xvc2VkT3JJbnRlcnJ1cHRlZERhdGFiYXNlKCk7
CiAKICAgICBpZiAobV9uZXh0U3RlcCkKICAgICAgICAgKHRoaXMtPiptX25leHRTdGVwKSgpOwpA
QCAtMjAyLDcgKzIwNyw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OnBlcmZvcm1QZW5kaW5nQ2Fs
bGIKICAgICAgICAgICAgbV9uZXh0U3RlcCA9PSAmU1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJRdW90
YUluY3JlYXNlQ2FsbGJhY2sgfHwKICAgICAgICAgICAgbV9uZXh0U3RlcCA9PSAmU1FMVHJhbnNh
Y3Rpb246OmRlbGl2ZXJTdWNjZXNzQ2FsbGJhY2spOwogCi0gICAgY2hlY2tBbmRIYW5kbGVDbG9z
ZWREYXRhYmFzZSgpOworICAgIGNoZWNrQW5kSGFuZGxlQ2xvc2VkT3JJbnRlcnJ1cHRlZERhdGFi
YXNlKCk7CiAKICAgICBpZiAobV9uZXh0U3RlcCkKICAgICAgICAgKHRoaXMtPiptX25leHRTdGVw
KSgpOwpAQCAtMjkyLDYgKzI5Nyw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJUcmFu
c2FjdGlvbkMKICAgICAgICAgbV9leGVjdXRlU3FsQWxsb3dlZCA9IHRydWU7CiAgICAgICAgIHNo
b3VsZERlbGl2ZXJFcnJvckNhbGxiYWNrID0gIW1fY2FsbGJhY2stPmhhbmRsZUV2ZW50KG1fZGF0
YWJhc2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSwgdGhpcyk7CiAgICAgICAgIG1fZXhlY3V0
ZVNxbEFsbG93ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9jYWxsYmFjayA9IDA7CiAgICAgfQogCiAg
ICAgLy8gVHJhbnNhY3Rpb24gU3RlcCA1IC0gSWYgdGhlIHRyYW5zYWN0aW9uIGNhbGxiYWNrIHdh
cyBudWxsIG9yIHJhaXNlZCBhbiBleGNlcHRpb24sIGp1bXAgdG8gdGhlIGVycm9yIGNhbGxiYWNr
CkBAIC00NTksNiArNDY1LDcgQEAgdm9pZCBTUUxUcmFuc2FjdGlvbjo6cG9zdGZsaWdodEFuZENv
bW1pdAogCiAgICAgLy8gSWYgdGhlIGNvbW1pdCBmYWlsZWQsIHRoZSB0cmFuc2FjdGlvbiB3aWxs
IHN0aWxsIGJlIG1hcmtlZCBhcyAiaW4gcHJvZ3Jlc3MiCiAgICAgaWYgKG1fc3FsaXRlVHJhbnNh
Y3Rpb24tPmluUHJvZ3Jlc3MoKSkgeworICAgICAgICBtX3N1Y2Nlc3NDYWxsYmFjayA9IDA7CiAg
ICAgICAgIG1fdHJhbnNhY3Rpb25FcnJvciA9IFNRTEVycm9yOjpjcmVhdGUoU1FMRXJyb3I6OkRB
VEFCQVNFX0VSUiwgImZhaWxlZCB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIik7CiAgICAgICAg
IGhhbmRsZVRyYW5zYWN0aW9uRXJyb3IoZmFsc2UpOwogICAgICAgICByZXR1cm47CkBAIC00NzMs
NyArNDgwLDYgQEAgdm9pZCBTUUxUcmFuc2FjdGlvbjo6cG9zdGZsaWdodEFuZENvbW1pdAogICAg
ICAgICBtX2RhdGFiYXNlLT50cmFuc2FjdGlvbkNsaWVudCgpLT5kaWRDb21taXRXcml0ZVRyYW5z
YWN0aW9uKGRhdGFiYXNlKCkpOwogCiAgICAgLy8gTm93IHJlbGVhc2Ugb3VyIHVubmVlZGVkIGNh
bGxiYWNrcywgdG8gYnJlYWsgcmVmZXJlbmNlIGN5Y2xlcy4KLSAgICBtX2NhbGxiYWNrID0gMDsK
ICAgICBtX2Vycm9yQ2FsbGJhY2sgPSAwOwogCiAgICAgLy8gVHJhbnNhY3Rpb24gU3RlcCAxMCAt
IERlbGl2ZXIgc3VjY2VzcyBjYWxsYmFjaywgaWYgdGhlcmUgaXMgb25lCkBAIC01NDYsOCArNTUy
LDEwIEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJUcmFuc2FjdGlvbkUKIAogICAgIC8v
IFRyYW5zYWN0aW9uIFN0ZXAgMTIgLSBJZiBleGlzdHMsIGludm9rZSBlcnJvciBjYWxsYmFjayB3
aXRoIHRoZSBsYXN0CiAgICAgLy8gZXJyb3IgdG8gaGF2ZSBvY2N1cnJlZCBpbiB0aGlzIHRyYW5z
YWN0aW9uLgotICAgIGlmIChtX2Vycm9yQ2FsbGJhY2spCisgICAgaWYgKG1fZXJyb3JDYWxsYmFj
aykgewogICAgICAgICBtX2Vycm9yQ2FsbGJhY2stPmhhbmRsZUV2ZW50KG1fZGF0YWJhc2UtPnNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQoKSwgbV90cmFuc2FjdGlvbkVycm9yLmdldCgpKTsKKyAgICAg
ICAgbV9lcnJvckNhbGxiYWNrID0gMDsKKyAgICB9CiAKICAgICBtX25leHRTdGVwID0gJlNRTFRy
YW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s7CiAgICAgTE9H
KFN0b3JhZ2VBUEksICJTY2hlZHVsaW5nIGNsZWFudXBBZnRlclRyYW5zYWN0aW9uRXJyb3JDYWxs
YmFjayBmb3IgdHJhbnNhY3Rpb24gJXBcbiIsIHRoaXMpOwpAQCAtNTc5LDEwICs1ODcsNiBAQCB2
b2lkIFNRTFRyYW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJUcmFuc2FjCiAgICAgQVNTRVJUKCFtX2Rh
dGFiYXNlLT5zcWxpdGVEYXRhYmFzZSgpLnRyYW5zYWN0aW9uSW5Qcm9ncmVzcygpKTsKICAgICBt
X25leHRTdGVwID0gMDsKIAotICAgIC8vIE5vdyByZWxlYXNlIG91ciBjYWxsYmFja3MsIHRvIGJy
ZWFrIHJlZmVyZW5jZSBjeWNsZXMuCi0gICAgbV9jYWxsYmFjayA9IDA7Ci0gICAgbV9lcnJvckNh
bGxiYWNrID0gMDsKLQogICAgIC8vIE5vdyByZWxlYXNlIHRoZSBsb2NrIG9uIHRoaXMgZGF0YWJh
c2UKICAgICBtX2RhdGFiYXNlLT50cmFuc2FjdGlvbkNvb3JkaW5hdG9yKCktPnJlbGVhc2VMb2Nr
KHRoaXMpOwogfQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmgJKHJldmlzaW9uIDY0Mzc3
KQorKysgV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAg
LTg3LDcgKzg3LDcgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgZW5xdWV1ZVN0YXRlbWVudChQYXNz
UmVmUHRyPFNRTFN0YXRlbWVudD4pOwogCi0gICAgdm9pZCBjaGVja0FuZEhhbmRsZUNsb3NlZERh
dGFiYXNlKCk7CisgICAgdm9pZCBjaGVja0FuZEhhbmRsZUNsb3NlZE9ySW50ZXJydXB0ZWREYXRh
YmFzZSgpOwogCiAgICAgdm9pZCBhY3F1aXJlTG9jaygpOwogICAgIHZvaWQgb3BlblRyYW5zYWN0
aW9uQW5kUHJlZmxpZ2h0KCk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJh
c2VUcmFja2VyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJv
bWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDY0Mzc3KQorKysgV2Vi
Q29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTc0LDYgKzE3NCwzNSBAQCB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VU
cmFja2VyOjpnZXRNCiAgICAgcmV0dXJuIGRhdGFiYXNlU2l6ZSArIHNwYWNlQXZhaWxhYmxlOwog
fQogCit2b2lkIERhdGFiYXNlVHJhY2tlcjo6aW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4
dChjb25zdCBTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0KQoreworICAgIFZlY3RvcjxS
ZWZQdHI8QWJzdHJhY3REYXRhYmFzZT4gPiBvcGVuRGF0YWJhc2VzOworICAgIHsKKyAgICAgICAg
TXV0ZXhMb2NrZXIgb3BlbkRhdGFiYXNlTWFwTG9jayhtX29wZW5EYXRhYmFzZU1hcEd1YXJkKTsK
KworICAgICAgICBpZiAoIW1fb3BlbkRhdGFiYXNlTWFwKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIERhdGFiYXNlTmFtZU1hcCogbmFtZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5n
ZXQoY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKSk7CisgICAgICAgIGlmICghbmFtZU1hcCkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICBEYXRhYmFzZU5hbWVNYXA6OmNvbnN0X2l0ZXJh
dG9yIGRiTmFtZU1hcEVuZEl0ID0gbmFtZU1hcC0+ZW5kKCk7CisgICAgICAgIGZvciAoRGF0YWJh
c2VOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBkYk5hbWVNYXBJdCA9IG5hbWVNYXAtPmJlZ2luKCk7
IGRiTmFtZU1hcEl0ICE9IGRiTmFtZU1hcEVuZEl0OyArK2RiTmFtZU1hcEl0KSB7CisgICAgICAg
ICAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQgPSBkYk5hbWVNYXBJdC0+c2Vjb25kOworICAg
ICAgICAgICAgRGF0YWJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGRiU2V0RW5kSXQgPSBkYXRhYmFz
ZVNldC0+ZW5kKCk7CisgICAgICAgICAgICBmb3IgKERhdGFiYXNlU2V0Ojpjb25zdF9pdGVyYXRv
ciBkYlNldEl0ID0gZGF0YWJhc2VTZXQtPmJlZ2luKCk7IGRiU2V0SXQgIT0gZGJTZXRFbmRJdDsg
KytkYlNldEl0KSB7CisgICAgICAgICAgICAgICAgaWYgKCgqZGJTZXRJdCktPnNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQoKSA9PSBjb250ZXh0KQorICAgICAgICAgICAgICAgICAgICBvcGVuRGF0YWJh
c2VzLmFwcGVuZCgqZGJTZXRJdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBWZWN0b3I8UmVmUHRyPEFic3RyYWN0RGF0YWJhc2U+ID46OmNvbnN0X2l0ZXJhdG9yIG9w
ZW5EYXRhYmFzZXNFbmRJdCA9IG9wZW5EYXRhYmFzZXMuZW5kKCk7CisgICAgZm9yIChWZWN0b3I8
UmVmUHRyPEFic3RyYWN0RGF0YWJhc2U+ID46OmNvbnN0X2l0ZXJhdG9yIG9wZW5EYXRhYmFzZXNJ
dCA9IG9wZW5EYXRhYmFzZXMuYmVnaW4oKTsgb3BlbkRhdGFiYXNlc0l0ICE9IG9wZW5EYXRhYmFz
ZXNFbmRJdDsgKytvcGVuRGF0YWJhc2VzSXQpCisgICAgICAgICgqb3BlbkRhdGFiYXNlc0l0KS0+
aW50ZXJydXB0KCk7Cit9CisKIH0KIAogI2VuZGlmIC8vIEVOQUJMRShEQVRBQkFTRSkKSW5kZXg6
IFdlYkNvcmUvd29ya2Vycy9Xb3JrZXJUaHJlYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
d29ya2Vycy9Xb3JrZXJUaHJlYWQuY3BwCShyZXZpc2lvbiA2NDM3NykKKysrIFdlYkNvcmUvd29y
a2Vycy9Xb3JrZXJUaHJlYWQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCw2IEBACiAK
ICNpbmNsdWRlICJXb3JrZXJUaHJlYWQuaCIKIAotI2luY2x1ZGUgIkRhdGFiYXNlVGFzay5oIgog
I2luY2x1ZGUgIkRlZGljYXRlZFdvcmtlckNvbnRleHQuaCIKICNpbmNsdWRlICJLVVJMLmgiCiAj
aW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKQEAgLTQxLDYgKzQwLDExIEBACiAjaW5jbHVkZSA8
dXRpbGl0eT4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KIAorI2lmIEVOQUJMRShEQVRB
QkFTRSkKKyNpbmNsdWRlICJEYXRhYmFzZVRhc2suaCIKKyNpbmNsdWRlICJEYXRhYmFzZVRyYWNr
ZXIuaCIKKyNlbmRpZgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRpYyBNdXRleCYgdGhy
ZWFkQ291bnRNdXRleCgpCkBAIC0yMjUsNiArMjI5LDEwIEBAIHZvaWQgV29ya2VyVGhyZWFkOjpz
dG9wKCkKICAgICBpZiAobV93b3JrZXJDb250ZXh0KSB7CiAgICAgICAgIG1fd29ya2VyQ29udGV4
dC0+c2NyaXB0KCktPmZvcmJpZEV4ZWN1dGlvbihXb3JrZXJTY3JpcHRDb250cm9sbGVyOjpUZXJt
aW5hdGVSdW5uaW5nU2NyaXB0KTsKIAorI2lmIEVOQUJMRShEQVRBQkFTRSkKKyAgICAgICAgRGF0
YWJhc2VUcmFja2VyOjp0cmFja2VyKCkuaW50ZXJydXB0QWxsRGF0YWJhc2VzRm9yQ29udGV4dCht
X3dvcmtlckNvbnRleHQuZ2V0KCkpOworI2VuZGlmCisKICAgICAvLyBGSVhNRTogUnVkZWx5IGtp
bGxpbmcgdGhlIHRocmVhZCB3b24ndCB3b3JrIHdoZW4gd2UgYWxsb3cgbmVzdGVkIHdvcmtlcnMs
IGJlY2F1c2UgdGhleSB3aWxsIHRyeSB0byBwb3N0IG5vdGlmaWNhdGlvbnMgb2YgdGhlaXIgZGVz
dHJ1Y3Rpb24uCiAgICAgLy8gVGhpcyBjYW4gbGlrZWx5IHVzZSB0aGUgc2FtZSBtZWNoYW5pc20g
YXMgdXNlZCBmb3IgZGF0YWJhc2VzIGFib3ZlLgogCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NDM3NykK
KysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE4IEBA
CisyMDEwLTA3LTMwICBEdW1pdHJ1IERhbmlsaXVjICA8ZHVtaUBjaHJvbWl1bS5vcmc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVzdCB0aGF0IHRl
cm1pbmF0aW5nIGEgd29ya2VyIGludGVycnVwdHMgYWxsIERCIG9wZXJhdGlvbnMgaW4gdGhhdCB3
b3JrZXIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
Mjg0MworCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50ZXJydXB0LWRhdGFiYXNl
LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvaW50
ZXJydXB0LWRhdGFiYXNlLXN5bmMtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0
L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2Utc3luYy5odG1sOiBBZGRlZC4KKyAg
ICAgICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9pbnRlcnJ1cHQtZGF0YWJhc2UuaHRtbDogQWRk
ZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3N0b3JhZ2UvcmVzb3VyY2VzL2ludGVycnVwdC1k
YXRhYmFzZS1zeW5jLmpzOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvc3RvcmFnZS9y
ZXNvdXJjZXMvaW50ZXJydXB0LWRhdGFiYXNlLmpzOiBBZGRlZC4KKyAgICAgICAgKHJ1blRyYW5z
YWN0aW9uKToKKwogMjAxMC0wNy0zMCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUu
Y29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCg==
</data>
<flag name="review"
          id="51409"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="51410"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
      

    </bug>

</bugzilla>