<?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>34991</bug_id>
          
          <creation_ts>2010-02-16 13:52:39 -0800</creation_ts>
          <short_desc>Refactor DatabaseTracker.cpp for thread safety</short_desc>
          <delta_ts>2010-03-19 20:03:50 -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>DOM</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>P4</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric U.">ericu</reporter>
          <assigned_to name="Eric U.">ericu</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>dimich</cc>
    
    <cc>dumi</cc>
    
    <cc>ericu</cc>
    
    <cc>michaeln</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>190730</commentid>
    <comment_count>0</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-02-16 13:52:39 -0800</bug_when>
    <thetext>It currently uses 4 different locks, and yet isn&apos;t completely thread-safe.  In particular if you&apos;ve got more than one context thread [say a page thread and a worker thread] it&apos;ll have major problems.  Also, if you store quota information from a worker thread that then exits, you&apos;ll hit asserts due to the check on the refcount of the thread-local empty string.

Umbrella bug 34990 depends on this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193158</commentid>
    <comment_count>1</comment_count>
      <attachid>49333</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-02-23 15:47:51 -0800</bug_when>
    <thetext>Created attachment 49333
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193160</commentid>
    <comment_count>2</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-02-23 15:49:35 -0800</bug_when>
    <thetext>That patch is actually a good deal smaller than its size would indicate--there&apos;s a fair amount of code that&apos;s merely indented differently or moved slightly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193169</commentid>
    <comment_count>3</comment_count>
      <attachid>49337</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-02-23 16:12:08 -0800</bug_when>
    <thetext>Created attachment 49337
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196835</commentid>
    <comment_count>4</comment_count>
      <attachid>49337</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-03-05 18:10:20 -0800</bug_when>
    <thetext>Comment on attachment 49337
Patch

&gt; Index: WebCore/ChangeLog

I usually look at the ChangeLog to educate myself on details of the change, both &apos;what&apos; and &apos;why&apos;. The description here is a bit broad, and frankly looking at each file&apos;s changes, it&apos;s hard to figure out if each of them is correct. It would be really easier to review if the bug or ChangeLog tried to explain the changes better.

&gt; +    // Set this flag to allow access from multiple threads.  Not all multi-threaded accesses are safe!
&gt; +    // See http://www.sqlite.org/cvstrac/wiki?p=MultiThreading for more info, and you must be running with compile flags and SQLite version appropriate
&gt; +    // to your cross-thread uses.
Are we ensuring compile flags/version somehow? Across major ports? Is it possible to assert it?

If that assert in sqlite3Handle() was meant to ensure that sqlite can be built w/o multithreaded flags and now we require so, why not simply remove the ASSERT as well?

&gt; +    bool sharable() { return m_sharable; }
This method is not used. It seems the m_shareable is only used for an ASSERT. Maybe make it DEBUG-only?

&gt; Index: WebCore/storage/Database.cpp
&gt; +    // DatabaseCloseTask tells Database::close not to do this, so that we can get it over with here.

I had to read this comment a few times to parse... It is better to avoid &apos;this&apos;, &apos;it&apos; and &apos;here&apos; since it is not always clear if &apos;it&apos; relates to the next line, or more, etc.
Could it be a bit more descriptive?

&gt; -void Database::close()
&gt; +void Database::close(bool removeDatabaseFromContext)

It feels that instead of the bool parameter the thread detection could be used... If on database thread, then equivalent to close(true)?

At any case, WebKit always tries to use enum parameters, even if there is only bool semantics - to document code better at call site.

&gt; Index: WebCore/storage/DatabaseTracker.cpp

&gt;  void DatabaseTracker::setDatabaseDirectoryPath(const String&amp; path)
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);
&gt;      ASSERT(!m_database.isOpen());
&gt;      m_databaseDirectoryPath = path;
&gt;  }

Why this ASSERT can be removed? It can be probably any thread, but should it be at most one thread? Strings are not threadsafe.

&gt;  String DatabaseTracker::trackerDatabasePath() const
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);
&gt;      return SQLiteFileSystem::appendDatabaseFileNameToPath(m_databaseDirectoryPath, &quot;Databases.db&quot;);
&gt;  }

Ditto. If this method can be called from 2 threads, it may or may not cause String&apos;s refcount to be racey. At least it&apos;s not obvious at this call site and there are multiple port implementations of the call tree below.

&gt;  bool DatabaseTracker::canEstablishDatabase(ScriptExecutionContext* context, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);

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

It seems in case of multiple threads, once locks are dropped, the m_proposedDatabase will be overwritten.
Is it even right to call this method on any thread different from main? It seems most likely implementation is to pop up some modal UI. That can not be done on any thread.

&gt;  bool DatabaseTracker::hasEntryForOrigin(SecurityOrigin* origin)
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);
&gt; +    MutexLocker lockDatabase(m_databaseGuard);
&gt;      populateOrigins();
&gt; -    MutexLocker lockQuotaMap(m_quotaMapGuard);
&gt; -    return m_quotaMap-&gt;contains(origin);
&gt; +    return hasEntryForOriginNoLock(origin);
&gt;  }

The more I look at his the more I realize how dangerous this code is.
Strings in WebKit are not meant to be used cross thread. It is possible in some very limited cases that local and easily verifiable. DatabaseTracker essentially contains maps that use SecurityOrigins that contain a bunch of Strings. The maps get initialized on one thread, used on another.
Strings are passed in, concatenated, returned - while under local locks, the same Strings are getting accessed on different threads, and it&apos;s hard to verify how those strings are used outside of DatabaseTracker. Historically, Strings caused a lot of hard-to-deal-with issues, especially in Workers (since most of the rest of Webkit is basically single-thread). What usually causes it is an implicit copy, or an operator+ (which is sometimes a copy). The refcount goes wrong and causes crashes, sometimes. Normally, it is a (very!) good idea to keep Strings (and SecurityOrigins, etc) to one single thread, and only mix things on a single thread. Both String and SecurityOrigin have methods for that.

I am curious, can we design the tracker, which is essentially a shared database and a few maps, to live always on a single thread, and talk to all other threads via some specific tasks that could be examined separately for proper cross-thread semantics? That would make it possible to look at the code and be reasonably sure that thread-unsafe refcount of Strings won&apos;t be a problem. It looks like all operations on DatabaseTracker are serializable. It also could get rid of multiple locks and requirement to always lock stuff in order and have FooNoLock methods.

I think some of the concerns above are big enough to address, perhaps with another patch, so r- for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198827</commentid>
    <comment_count>5</comment_count>
      <attachid>50557</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-03-11 16:23:09 -0800</bug_when>
    <thetext>Created attachment 50557
Rolled in feedback, fixed bugs, improved Changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198828</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-11 16:30:30 -0800</bug_when>
    <thetext>Attachment 50557 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/platform/sql/SQLiteDatabase.cpp:258:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebCore/platform/sql/SQLiteDatabase.cpp:260:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebCore/platform/sql/SQLiteDatabase.cpp:262:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebCore/platform/sql/SQLiteDatabase.cpp:263:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebCore/storage/DatabaseTracker.cpp:351:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/storage/DatabaseTracker.cpp:802:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 6 in 11 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>198837</commentid>
    <comment_count>7</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-03-11 16:40:33 -0800</bug_when>
    <thetext>Arg--I forgot to check style before uploading.  I&apos;ll fix that when I&apos;m back at my desk in a couple of hours.  In the mean time, here&apos;s a play-by-play of my changes.

(In reply to comment #4)
&gt; (From update of attachment 49337 [details])
&gt; &gt; Index: WebCore/ChangeLog
&gt; 
&gt; I usually look at the ChangeLog to educate myself on details of the change,
&gt; both &apos;what&apos; and &apos;why&apos;. The description here is a bit broad, and frankly looking
&gt; at each file&apos;s changes, it&apos;s hard to figure out if each of them is correct. It
&gt; would be really easier to review if the bug or ChangeLog tried to explain the
&gt; changes better.

I&apos;ve fleshed out the Changelog comments and broken out each section by its changes.  How does that look?

&gt; &gt; +    // Set this flag to allow access from multiple threads.  Not all multi-threaded accesses are safe!
&gt; &gt; +    // See http://www.sqlite.org/cvstrac/wiki?p=MultiThreading for more info, and you must be running with compile flags and SQLite version appropriate
&gt; &gt; +    // to your cross-thread uses.
&gt; Are we ensuring compile flags/version somehow? Across major ports? Is it
&gt; possible to assert it?

Added an assert for version; we can&apos;t guarantee more than that, really.  You can always foul this up if you try hard enough.  I&apos;ve added a comment so that you&apos;ll know what&apos;s going wrong if you&apos;re doing odd things.

&gt; If that assert in sqlite3Handle() was meant to ensure that sqlite can be built
&gt; w/o multithreaded flags and now we require so, why not simply remove the ASSERT
&gt; as well?

This class only requires that we compile with threading support if tell it you want to use it that way [by calling setSharable].  If you don&apos;t use the Database, but want to use this class, you don&apos;t need the threading support.

&gt; &gt; +    bool sharable() { return m_sharable; }
&gt; This method is not used. It seems the m_shareable is only used for an ASSERT.
&gt; Maybe make it DEBUG-only?

Done.

&gt; &gt; Index: WebCore/storage/Database.cpp
&gt; &gt; +    // DatabaseCloseTask tells Database::close not to do this, so that we can get it over with here.
&gt; 
&gt; I had to read this comment a few times to parse... It is better to avoid
&gt; &apos;this&apos;, &apos;it&apos; and &apos;here&apos; since it is not always clear if &apos;it&apos; relates to the
&gt; next line, or more, etc.
&gt; Could it be a bit more descriptive?

How about now?

&gt; &gt; -void Database::close()
&gt; &gt; +void Database::close(bool removeDatabaseFromContext)
&gt; 
&gt; It feels that instead of the bool parameter the thread detection could be
&gt; used... If on database thread, then equivalent to close(true)?

By the time we get here, we&apos;re always on the same thread.  The flag really tells us which thread we came from before that.

&gt; At any case, WebKit always tries to use enum parameters, even if there is only
&gt; bool semantics - to document code better at call site.

Changed to an enum.

&gt; &gt; Index: WebCore/storage/DatabaseTracker.cpp
&gt; 
&gt; &gt;  void DatabaseTracker::setDatabaseDirectoryPath(const String&amp; path)
&gt; &gt;  {
&gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; &gt;      ASSERT(!m_database.isOpen());
&gt; &gt;      m_databaseDirectoryPath = path;
&gt; &gt;  }
&gt; 
&gt; Why this ASSERT can be removed? It can be probably any thread, but should it be
&gt; at most one thread? Strings are not threadsafe.

It could be any execution context thread, now.  More on strings below.

&gt; &gt;  String DatabaseTracker::trackerDatabasePath() const
&gt; &gt;  {
&gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; &gt;      return SQLiteFileSystem::appendDatabaseFileNameToPath(m_databaseDirectoryPath, &quot;Databases.db&quot;);
&gt; &gt;  }
&gt; 
&gt; Ditto. If this method can be called from 2 threads, it may or may not cause
&gt; String&apos;s refcount to be racey. At least it&apos;s not obvious at this call site and
&gt; there are multiple port implementations of the call tree below.

Here there and everywhere I&apos;ve now sanitized all strings on input if we&apos;re going to store them for later.  I&apos;ve likewise tried to sanitize all strings on output if they could come from something we&apos;ve stored.  Please do check me on that to see if I&apos;ve missed any.

I also had to do the same for the SecurityOrigins in OriginQuotaManager.

&gt; &gt;  bool DatabaseTracker::canEstablishDatabase(ScriptExecutionContext* context, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
&gt; &gt;  {
&gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; 
&gt; &gt; +    // Drop all locks before calling out; we don&apos;t know what they&apos;ll do.
&gt; &gt;      context-&gt;databaseExceededQuota(name);
&gt; 
&gt; It seems in case of multiple threads, once locks are dropped, the
&gt; m_proposedDatabase will be overwritten.

That&apos;s why it is now a set of databases instead of a single one; each reentrant caller adds its own proposed database and later cleans it up.

&gt; Is it even right to call this method on any thread different from main? It
&gt; seems most likely implementation is to pop up some modal UI. That can not be
&gt; done on any thread.

It&apos;ll get called from the worker&apos;s context thread as well.  Each port will naturally have to deal with it in its own way; in Chrome I hear talk of mustering all such messages through the Browser process.

&gt; &gt;  bool DatabaseTracker::hasEntryForOrigin(SecurityOrigin* origin)
&gt; &gt;  {
&gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; &gt; +    MutexLocker lockDatabase(m_databaseGuard);
&gt; &gt;      populateOrigins();
&gt; &gt; -    MutexLocker lockQuotaMap(m_quotaMapGuard);
&gt; &gt; -    return m_quotaMap-&gt;contains(origin);
&gt; &gt; +    return hasEntryForOriginNoLock(origin);
&gt; &gt;  }
&gt; 
&gt; The more I look at his the more I realize how dangerous this code is.
&gt; Strings in WebKit are not meant to be used cross thread. It is possible in some
&gt; very limited cases that local and easily verifiable. DatabaseTracker
&gt; essentially contains maps that use SecurityOrigins that contain a bunch of
&gt; Strings. The maps get initialized on one thread, used on another.
&gt; Strings are passed in, concatenated, returned - while under local locks, the
&gt; same Strings are getting accessed on different threads, and it&apos;s hard to verify
&gt; how those strings are used outside of DatabaseTracker. Historically, Strings
&gt; caused a lot of hard-to-deal-with issues, especially in Workers (since most of
&gt; the rest of Webkit is basically single-thread). What usually causes it is an
&gt; implicit copy, or an operator+ (which is sometimes a copy). The refcount goes
&gt; wrong and causes crashes, sometimes. Normally, it is a (very!) good idea to
&gt; keep Strings (and SecurityOrigins, etc) to one single thread, and only mix
&gt; things on a single thread. Both String and SecurityOrigin have methods for
&gt; that.

As said above, Iv&apos;e used those methods to transfer safe copies to the maps.  Those copies are guaranteed not to share internal references/storage with Strings or SecurityOrigins elsewhere, and not to use the ThreadLocal empty String, so we should now be safe from such issues.

&gt; I am curious, can we design the tracker, which is essentially a shared database
&gt; and a few maps, to live always on a single thread, and talk to all other
&gt; threads via some specific tasks that could be examined separately for proper
&gt; cross-thread semantics? That would make it possible to look at the code and be
&gt; reasonably sure that thread-unsafe refcount of Strings won&apos;t be a problem. It
&gt; looks like all operations on DatabaseTracker are serializable. It also could
&gt; get rid of multiple locks and requirement to always lock stuff in order and
&gt; have FooNoLock methods.

At a quick glance, while that sounds good, it would be fairly complicated to arrange.  There are too many synchronous calls into the DatabaseTracker from both the context and database threads, and synchronizing cross-thread calls is very deadlock-prone.  There may be a way that we could do a major rewrite that would end up cleaner, but it&apos;s not a small task.  I&apos;m afraid we&apos;d just end up with different complexity that we&apos;ve tested less.

&gt; I think some of the concerns above are big enough to address, perhaps with
&gt; another patch, so r- for now.

As you pointed out, there were a number of real bugs in my first patch.  I think I&apos;ve removed them; does the general approach here look OK with the new documentation?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198893</commentid>
    <comment_count>8</comment_count>
      <attachid>50571</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-03-11 18:41:55 -0800</bug_when>
    <thetext>Created attachment 50571
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199275</commentid>
    <comment_count>9</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-03-12 18:06:27 -0800</bug_when>
    <thetext>This looks very close!
Here is the first half, I&apos;ll do the rest soon. I&apos;m not sure all my notes are valid, since I tried to err on a side of caution here.


&gt; Index: WebCore/ChangeLog

Changelog is very good now, thanks!

&gt; +    // Set this flag to allow access from multiple threads.  Not all multi-threaded accesses are safe!
&gt; +    // See http://www.sqlite.org/cvstrac/wiki?p=MultiThreading for more info.
&gt; +#ifndef NDEBUG
&gt; +    bool sharable() { return m_sharable; }
&gt; +#endif
&gt; +    void setSharable(bool sharable);

This variable is used to drop the check that the db is accessed on the same thread where it was created. It does not really allow access, just removes assert. In release build, it doesn&apos;t do anything. That&apos;s why my first thought last time was that the variable itself together with setSharable should be DEBUG-only. Also, the name could be more specific, perhaps just disableThreadingChecks(), w/o parameters - since there is no real case where it would be set back to &apos;false&apos;.

Another variant for the name would be assumeSerializedThreadingMode(), following terminology from http://www.sqlite.org/threadsafe.html


&gt; Index: WebCore/storage/DatabaseTracker.cpp

&gt;  void DatabaseTracker::setDatabaseDirectoryPath(const String&amp; path)
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);
&gt;      ASSERT(!m_database.isOpen());
&gt; -    m_databaseDirectoryPath = path;
&gt; +    m_databaseDirectoryPath = path.threadsafeCopy();

So if we call this from 2 threads, they will create 2 separate copies but then call a copy ctor on the same receiving m_databaseDirectoryPath. The copy constructor is not threadsafe.
Maybe it&apos;s ok to use m_databaseGuard for a mutex lock around here?

BTW threadsafeCopy() here maybe replaced with crossThreadString(), but in other places in this file it&apos;s not true, so perhaps it&apos;s better to use a bigger hammer indeed..

&gt; -const String&amp; DatabaseTracker::databaseDirectoryPath() const
&gt; +String DatabaseTracker::databaseDirectoryPath() const
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);
&gt; -    return m_databaseDirectoryPath;
&gt; +    return m_databaseDirectoryPath.threadsafeCopy();

Here is the place which actually needs threadsafeCopy() rather then crossThreadString(), so I think using threadsafeCopy() across in this file is a good idea overall. Some comment to this effect may be nice.


&gt;  String DatabaseTracker::trackerDatabasePath() const
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);
&gt;      return SQLiteFileSystem::appendDatabaseFileNameToPath(m_databaseDirectoryPath, &quot;Databases.db&quot;);

If setDatabaseDirectoryPath can be called from another thread in parallel to this (even with the same string value), then this needs a mutex around bacause m_databaseDirectoryPath can change in the middle. 

&gt; +DatabaseDetails DatabaseTracker::detailsForNameAndOrigin(const String&amp; name, SecurityOrigin* origin)

&gt; +        for (HashSet&lt;ProposedDatabase*&gt;::iterator iter = m_proposedDatabases.begin(); iter != m_proposedDatabases.end(); ++iter)
&gt; +            if ((*iter)-&gt;first == origin &amp;&amp; (*iter)-&gt;second.name() == name)
&gt; +                return (*iter)-&gt;second;

Does DatabaseDetail need a threadsafeCopy() method? If this method is always called from the &quot;right&quot; thread, we shoudl assert for it, otherwise DatabaseDetails may need same treatment as SecurityOrigins.

&gt;  void DatabaseTracker::setDatabaseDetails(SecurityOrigin* origin, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)

will look at the rest soon...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199963</commentid>
    <comment_count>10</comment_count>
      <attachid>50571</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-03-15 19:31:03 -0700</bug_when>
    <thetext>Comment on attachment 50571
Patch

Ok, the rest:

&gt;  void DatabaseTracker::setDatabaseDetails(SecurityOrigin* origin, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
&gt;  {
&gt; -    ASSERT(currentThread() == m_thread);
&gt; -
&gt;      String originIdentifier = origin-&gt;databaseIdentifier();

databaseIdentifier() does not seem to be safe, it inits a global static of type String...

&gt; @@ -428,7 +473,7 @@ void DatabaseTracker::addOpenDatabase(Da
&gt; -        nameMap-&gt;set(name, databaseSet);
&gt; +        nameMap-&gt;set(name.threadsafeCopy(), databaseSet);

It seems the origin.threadsafeCopy() should be used earlier in this method when an origin gets inserted into a new openDatabaseMap.

&gt; @@ -441,6 +486,7 @@ void DatabaseTracker::removeOpenDatabase

&gt; +    // Throw away m_quotaMap whenever we&apos;ve cleared out an origin--otherwise we never get rid of stale entries.  The next call that needs it will populateOrigins().
&gt; +    m_quotaMap.clear();

m_quotaMap is protected by m_databaseGuard in other places, but I don&apos;t see it locked here.
Also, wouldn&apos;t a call to removeOrigin() right before this line remove the origin from the m_quotaMap? How would stale entries happen? Perhaps need a comment on this.

&gt; @@ -614,19 +673,24 @@ void DatabaseTracker::deleteAllDatabases

This method asks for a copy of all origins, using origins() helper, then deletes the local copy on return. Meanwhile, some other thread may modify m_quotaMap (as removeOpenDatabase does). This will make origin refcount racey. Perhaps origins() helper should use threadsafeCopy() instead of straight copy. Also, it seems the origins() is also a public method that gives out the SecurityOrigins.

&gt; +// It is the caller&apos;s responsibility to make sure that nobody is trying to create, delete, open, or close databases in this origin while the deletion is
&gt; +// taking place.

Is this possible to request? deleteAllDatabases() is a part of WebKit API, perhaps a browser can call it to &apos;clean up&apos;, responding to a user request in browser UI. At the same time, there can be any number of pages/workers trying to add/open/close databases. What will actually break if that will happen?

This method can probably even reenter since it drops the locks in the middle and does file synchronous IO which may be implemented in a way allowing for reentrancy via WebKit API.

Is it possible to do some refactoring as you did with &quot;NoLock&quot; methods to keep at least m_databaseGuard lock across this method and perhaps a bool inside to prevent reentrance?

&gt;  void DatabaseTracker::deleteOrigin(SecurityOrigin* origin)

&gt;  void DatabaseTracker::deleteDatabase(SecurityOrigin* origin, const String&amp; name)

&gt; +    // We drop the lock here because holding locks during a call to deleteDatabaseFile will deadlock.

Same here.

&gt; +// deleteDatabaseFile has to release locks between looking up the list of databases to close and closing them.  While this is in progress, the caller
&gt; +// is responsible for making sure no new databases are opened in the file to be deleted.
&gt;  bool DatabaseTracker::deleteDatabaseFile(SecurityOrigin* origin, const String&amp; name)

Same here. Need either a mechanism to prevent this or an ASSERT to ensure &apos;the caller&apos; does the right thing.

I&apos;m going to do r- since some changes to the patch probably will be needed. I tried to mention all things I didn&apos;t find easy-to-verify looking at the code. If some of notes are invalid because the code ensures correctness somehow else, please feel free to add ASSERT or comment to that effect.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201027</commentid>
    <comment_count>11</comment_count>
      <attachid>50968</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-03-17 16:18:24 -0700</bug_when>
    <thetext>Created attachment 50968
Roll in more feedback, add protections against simultaneous create+delete of databases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201030</commentid>
    <comment_count>12</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-03-17 16:23:22 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; This looks very close!
&gt; Here is the first half, I&apos;ll do the rest soon. I&apos;m not sure all my notes are
&gt; valid, since I tried to err on a side of caution here.

I&apos;m happy with that approach.

&gt; This variable is used to drop the check that the db is accessed on the same
&gt; thread where it was created. It does not really allow access, just removes
&gt; assert. In release build, it doesn&apos;t do anything. That&apos;s why my first thought
&gt; last time was that the variable itself together with setSharable should be
&gt; DEBUG-only. Also, the name could be more specific, perhaps just
&gt; disableThreadingChecks(), w/o parameters - since there is no real case where it
&gt; would be set back to &apos;false&apos;.

Ah, I see what you mean now.  Changed.  I&apos;ve left in an empty version if you&apos;re compiling in release mode; the compiler can optimize it out, but users won&apos;t have to guard their call with ifdefs.

&gt; &gt; Index: WebCore/storage/DatabaseTracker.cpp
&gt; 
&gt; &gt;  void DatabaseTracker::setDatabaseDirectoryPath(const String&amp; path)
&gt; &gt;  {
&gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; &gt;      ASSERT(!m_database.isOpen());
&gt; &gt; -    m_databaseDirectoryPath = path;
&gt; &gt; +    m_databaseDirectoryPath = path.threadsafeCopy();
&gt; 
&gt; So if we call this from 2 threads, they will create 2 separate copies but then
&gt; call a copy ctor on the same receiving m_databaseDirectoryPath. The copy
&gt; constructor is not threadsafe.
&gt; Maybe it&apos;s ok to use m_databaseGuard for a mutex lock around here?

Good catch; I&apos;ve put in the mutex.

&gt; BTW threadsafeCopy() here maybe replaced with crossThreadString(), but in other
&gt; places in this file it&apos;s not true, so perhaps it&apos;s better to use a bigger
&gt; hammer indeed..

I&apos;m still a little iffy on when crossThreadString is safe, but it&apos;s not safe
everywhere, so I think we&apos;re OK erring on the side of safety.  I can&apos;t find the code right now; where does crossThreadString make sure that thread-local empty strings don&apos;t get carried across?

&gt; &gt;  String DatabaseTracker::trackerDatabasePath() const
&gt; &gt;  {
&gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; &gt;      return SQLiteFileSystem::appendDatabaseFileNameToPath(m_databaseDirectoryPath, &quot;Databases.db&quot;);
&gt; 
&gt; If setDatabaseDirectoryPath can be called from another thread in parallel to
&gt; this (even with the same string value), then this needs a mutex around bacause
&gt; m_databaseDirectoryPath can change in the middle. 

This is only ever called with m_databaseGuard locked, so the new mutex call in
setDatabaseDirectoryPath takes care of it.  I can&apos;t add an assert(!tryLock())
because it&apos;s const, but it&apos;s only got a few calls and they&apos;re all safe.

&gt; &gt; +DatabaseDetails DatabaseTracker::detailsForNameAndOrigin(const String&amp; name, SecurityOrigin* origin)
&gt; 
&gt; &gt; +        for (HashSet&lt;ProposedDatabase*&gt;::iterator iter = m_proposedDatabases.begin(); iter != m_proposedDatabases.end(); ++iter)
&gt; &gt; +            if ((*iter)-&gt;first == origin &amp;&amp; (*iter)-&gt;second.name() == name)
&gt; &gt; +                return (*iter)-&gt;second;
&gt; 
&gt; Does DatabaseDetail need a threadsafeCopy() method? If this method is always
&gt; called from the &quot;right&quot; thread, we shoudl assert for it, otherwise
&gt; DatabaseDetails may need same treatment as SecurityOrigins.

In the old single-context-thread world it was guaranteed to be the same thread
that created the DatabaseDetails.  In the post-worker-db world I&apos;m not sure if
it&apos;ll be needed cross-thread [to let the UI thread look at Worker-created
details] or not; it&apos;ll likely be a port-specific thing.  I&apos;ve added a
per-DatabaseDetails thread identifier and an assert for now.  If we find we need to use DatabaseDetails objects across threads, we can add the threadsafeCopy.

&gt; &gt;  void DatabaseTracker::setDatabaseDetails(SecurityOrigin* origin, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
&gt; &gt;  {
&gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; &gt; -
&gt; &gt;      String originIdentifier = origin-&gt;databaseIdentifier();
&gt; 
&gt; databaseIdentifier() does not seem to be safe, it inits a global static of type
&gt; String...

It uses a static global, but emits a new thread-specific String each call.
You must be using the SecurityOrigin on the right thread, so the returned String should be safe.  We&apos;re not returning that string--we&apos;re just doing a database operation with it--so I think we&apos;re OK with that part.  However, regarding that static global--is it safe to concatenate a static global string with various strings on arbitrary threads, or do we need a new copy of the global per thread?

If it&apos;s not safe, I think we can just remove the static variable.  It looks like it&apos;s just there as an optimization, and I can&apos;t think that it&apos;s actually saving us all that much time.  [I haven&apos;t done this yet--waiting for your response].

&gt; &gt; @@ -428,7 +473,7 @@ void DatabaseTracker::addOpenDatabase(Da
&gt; &gt; -        nameMap-&gt;set(name, databaseSet);
&gt; &gt; +        nameMap-&gt;set(name.threadsafeCopy(), databaseSet);
&gt; 
&gt; It seems the origin.threadsafeCopy() should be used earlier in this method when
&gt; an origin gets inserted into a new openDatabaseMap.

Fixed.

&gt; &gt; @@ -441,6 +486,7 @@ void DatabaseTracker::removeOpenDatabase
&gt; 
&gt; &gt; +    // Throw away m_quotaMap whenever we&apos;ve cleared out an origin--otherwise we never get rid of stale entries.  The next call that needs it will populateOrigins().
&gt; &gt; +    m_quotaMap.clear();
&gt; 
&gt; m_quotaMap is protected by m_databaseGuard in other places, but I don&apos;t see it
&gt; locked here.

Fixed.

&gt; Also, wouldn&apos;t a call to removeOrigin() right before this line remove the
&gt; origin from the m_quotaMap? How would stale entries happen? Perhaps need a
&gt; comment on this.

I&apos;m not sure what you mean about a call to removeOrigin(); the
originQuotaManager uses a different data structure.  However, you&apos;re right that the clear call is unnecessary.  I&apos;d needed it during an earlier incarnation of this CL that never made it as far as posting, and I hadn&apos;t realized that it was now obsolete.  Thanks!

&gt; &gt; @@ -614,19 +673,24 @@ void DatabaseTracker::deleteAllDatabases
&gt; 
&gt; This method asks for a copy of all origins, using origins() helper, then
&gt; deletes the local copy on return. Meanwhile, some other thread may modify
&gt; m_quotaMap (as removeOpenDatabase does). This will make origin refcount racey.
&gt; Perhaps origins() helper should use threadsafeCopy() instead of straight copy.
&gt; Also, it seems the origins() is also a public method that gives out the
&gt; SecurityOrigins.

SecurityOrigins are ThreadSafeShared; what&apos;s racy about the refcounting?

Yes, origins is both public and called by another DatabaseTracker method.  It
and the deletion functions are the only ones with those characteristics.  It
doesn&apos;t seem worthwhile to pull out wrappers, given how little they&apos;d do.  The
restrictions on locking during deletions would mean that they&apos;d just be extra
code.

&gt; &gt; +// It is the caller&apos;s responsibility to make sure that nobody is trying to create, delete, open, or close databases in this origin while the deletion is
&gt; &gt; +// taking place.
&gt; 
&gt; Is this possible to request? deleteAllDatabases() is a part of WebKit API,
&gt; perhaps a browser can call it to &apos;clean up&apos;, responding to a user request in
&gt; browser UI. At the same time, there can be any number of pages/workers trying
&gt; to add/open/close databases. What will actually break if that will happen?

I&apos;m not sure what the worst thing that could happen is.  You could delete the
file from underneath a working Database, but I&apos;m not sure that would do anything worse than corrupt data.  It might depend on the platform.  However, you could easily end up with a database stored on disk, but deleted from the tracker, such that it would be inaccessible but take up disk space.

I&apos;ve put in code to guard against this; it took a fair bit of it, unfortunately.  If you try to delete a database while it&apos;s being created, or create one while it or its origin is being deleted, you&apos;ll fail.  In cases where we can&apos;t return an error, you&apos;ll also assert in debug builds.

&gt; This method can probably even reenter since it drops the locks in the middle
&gt; and does file synchronous IO which may be implemented in a way allowing for
&gt; reentrancy via WebKit API.
&gt; 
&gt; Is it possible to do some refactoring as you did with &quot;NoLock&quot; methods to keep
&gt; at least m_databaseGuard lock across this method and perhaps a bool inside to
&gt; prevent reentrance?

The problem with holding locks across the deletion calls is that there&apos;s a
cross-thread call [from the context to the database thread] to shut each
database before deleting its containing file.  If the database thread has to
wait on the context thread for anything at all, or call back into the tracker
for anything, you&apos;ll get a deadlock.  The new state variables that I put in for the aforementioned checks now serve as deadlock-free locks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201683</commentid>
    <comment_count>13</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-03-18 19:28:33 -0700</bug_when>
    <thetext>I think it looks really good now, the &apos;recordDeleting/doneDeleting and friends look a very good addition, they are easy to read and I think provide good checks.

A few things:

&gt; &gt; &gt;  void DatabaseTracker::setDatabaseDetails(SecurityOrigin* origin, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
&gt; &gt; &gt;  {
&gt; &gt; &gt; -    ASSERT(currentThread() == m_thread);
&gt; &gt; &gt; -
&gt; &gt; &gt;      String originIdentifier = origin-&gt;databaseIdentifier();
&gt; &gt; 
&gt; &gt; databaseIdentifier() does not seem to be safe, it inits a global static of type
&gt; &gt; String...
&gt; 
&gt; It uses a static global, but emits a new thread-specific String each call.
&gt; You must be using the SecurityOrigin on the right thread, so the returned
&gt; String should be safe.  We&apos;re not returning that string--we&apos;re just doing a
&gt; database operation with it--so I think we&apos;re OK with that part.  However,
&gt; regarding that static global--is it safe to concatenate a static global string
&gt; with various strings on arbitrary threads, or do we need a new copy of the
&gt; global per thread?
&gt; 
&gt; If it&apos;s not safe, I think we can just remove the static variable.  It looks
&gt; like it&apos;s just there as an optimization, and I can&apos;t think that it&apos;s actually
&gt; saving us all that much time.  [I haven&apos;t done this yet--waiting for your
&gt; response].

I think we should just remove this optimization. It doesn&apos;t look like it actually gives a benefit. The way it&apos;s implemented, I think it can be dangerous because it multiple threads could access the shared static String, and potentially copy it, as the operator+ can do. Right now it&apos;s probably ok but if someone changes operator+ or DEFINE_STATIC_LOCAL it can be broken. I think we better get rid of it.

&gt; &gt; &gt; @@ -614,19 +673,24 @@ void DatabaseTracker::deleteAllDatabases
&gt; &gt; 
&gt; &gt; This method asks for a copy of all origins, using origins() helper, then
&gt; &gt; deletes the local copy on return. Meanwhile, some other thread may modify
&gt; &gt; m_quotaMap (as removeOpenDatabase does). This will make origin refcount racey.
&gt; &gt; Perhaps origins() helper should use threadsafeCopy() instead of straight copy.
&gt; &gt; Also, it seems the origins() is also a public method that gives out the
&gt; &gt; SecurityOrigins.
&gt; 
&gt; SecurityOrigins are ThreadSafeShared; what&apos;s racy about the refcounting?
&gt; 
&gt; Yes, origins is both public and called by another DatabaseTracker method.  It
&gt; and the deletion functions are the only ones with those characteristics.  It
&gt; doesn&apos;t seem worthwhile to pull out wrappers, given how little they&apos;d do.  The
&gt; restrictions on locking during deletions would mean that they&apos;d just be extra
&gt; code.

Agree. Also, the copy operator for SecurityOrigin is doing threadsafeCopy on inner strings anyways, so it seems we are ok in any case.

Since you&apos;ll need cq+, I am doign r- on this patch, if you change the SecurityOrigin::databaseIdentifier() and re-upload, we shoudl be able to use commit bot.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201684</commentid>
    <comment_count>14</comment_count>
      <attachid>50968</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-03-18 19:28:52 -0700</bug_when>
    <thetext>Comment on attachment 50968
Roll in more feedback, add protections against simultaneous create+delete of databases.

r- as mentioned above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201961</commentid>
    <comment_count>15</comment_count>
      <attachid>51177</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-03-19 11:51:59 -0700</bug_when>
    <thetext>Created attachment 51177
Removed static variable optimization in SecurityOrigin::databaseIdentifier

Note that I haven&apos;t added any threadsafeCopy calls for this string, as it doesn&apos;t appear necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201981</commentid>
    <comment_count>16</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-03-19 12:21:38 -0700</bug_when>
    <thetext>Could you update ChangeLog to include SecurityOrigin.cpp and re-upload?

If you were a committer, I&apos;d simply said do it on landing, but I can&apos;t say that to a commit bot... (Hint: more smaller patches move you faster to a committer bit :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201988</commentid>
    <comment_count>17</comment_count>
      <attachid>51180</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-03-19 12:35:35 -0700</bug_when>
    <thetext>Created attachment 51180
Added Changelog entry for static variable change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202007</commentid>
    <comment_count>18</comment_count>
      <attachid>51180</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-03-19 13:12:23 -0700</bug_when>
    <thetext>Comment on attachment 51180
Added Changelog entry for static variable change.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202149</commentid>
    <comment_count>19</comment_count>
      <attachid>51180</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-03-19 20:03:44 -0700</bug_when>
    <thetext>Comment on attachment 51180
Added Changelog entry for static variable change.

Clearing flags on attachment: 51180

Committed r56293: &lt;http://trac.webkit.org/changeset/56293&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202150</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-03-19 20:03:50 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49333</attachid>
            <date>2010-02-23 15:47:51 -0800</date>
            <delta_ts>2010-02-23 16:12:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34991-20100223154750.patch</filename>
            <type>text/plain</type>
            <size>44802</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTE3NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzIgQEAKKzIwMTAtMDItMjMgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBS
ZWZhY3RvciBEYXRhYmFzZVRyYWNrZXIuY3BwIGZvciB0aHJlYWQgc2FmZXR5CisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDk5MQorCisgICAgICAgIFRo
aXMgZW5hYmxlcyBjYWxsaW5nIGludG8gRGF0YWJhc2VUcmFja2VyIGZyb20gbXVsdGlwbGUgY29u
dGV4dCB0aHJlYWRzLAorICAgICAgICBhcyB3aWxsIGhhcHBlbiBvbmNlIFdvcmtlcnMgY2FuIGFj
Y2VzcyB0aGUgRGF0YWJhc2UuICBJdCByZXF1aXJlZCBhIGZhaXIKKyAgICAgICAgYW1vdW50IG9m
IHJlc2h1ZmZsaW5nIG9mIGxvY2tzLiAgSSBlbmRlZCB1cCBzcGxpdHRpbmcgdGhlIHB1YmxpYwor
ICAgICAgICBpbnRlcmZhY2UgW2NhbGxzIHRoYXQgdGFrZSBsb2NrcyBhbmQgY2FsbCBwcml2YXRl
IGZ1bmN0aW9uc10gZnJvbSB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIFtjYWxscyB0aGF0
IGFzc2VydCB0aGF0IGxvY2tzIGFyZSBhbHJlYWR5IGhlbGRdIGluIG9yZGVyCisgICAgICAgIHRv
IGF2b2lkIGxvY2sgY29uZmxpY3RzLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4KKworICAgICAg
ICAqIHBsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpT
UUxpdGVEYXRhYmFzZTo6U1FMaXRlRGF0YWJhc2UpOgorICAgICAgICAqIHBsYXRmb3JtL3NxbC9T
UUxpdGVEYXRhYmFzZS5oOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OnNxbGl0
ZTNIYW5kbGUpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OnNoYXJhYmxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpzZXRTaGFyYWJsZSk6CisgICAgICAg
ICogc3RvcmFnZS9EYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6bWFy
a0FzRGVsZXRlZEFuZENsb3NlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpjbG9zZSk6
CisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZS5oOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJh
c2VUYXNrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlQ2xvc2VUYXNrOjpkb1BlcmZv
cm1UYXNrKToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCk6CisgICAgICAgICogc3Rv
cmFnZS9EYXRhYmFzZVRyYWNrZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFj
a2VyOjpvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2spOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJh
c2VUcmFja2VyOjpvcmlnaW5RdW90YU1hbmFnZXIpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJh
c2VUcmFja2VyOjpEYXRhYmFzZVRyYWNrZXIpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VU
cmFja2VyOjpzZXREYXRhYmFzZURpcmVjdG9yeVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6RGF0
YWJhc2VUcmFja2VyOjpkYXRhYmFzZURpcmVjdG9yeVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6
RGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0YWJhc2VQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmNhbkVzdGFibGlzaERhdGFiYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW5Ob0xvY2spOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvck9yaWdpbik6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yRGF0YWJhc2UpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpvcmlnaW5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2UpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpwb3B1bGF0ZU9yaWdpbnMpOgorICAgICAgICAoV2Vi
Q29yZTo6RGF0YWJhc2VUcmFja2VyOjpvcmlnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayk6CisgICAgICAgIChXZWJD
b3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW4pOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpkZXRhaWxzRm9yTmFtZUFuZE9yaWdpbik6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGV0YWlscyk6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbk5vTG9jayk6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yT3JpZ2luKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cXVvdGFGb3JPcmlnaW5Ob0xvY2spOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpxdW90YUZvck9yaWdpbik6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnNldFF1b3RhKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6YWRkRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VU
cmFja2VyOjpkZWxldGVBbGxEYXRhYmFzZXMpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VU
cmFja2VyOjpkZWxldGVPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2Vy
OjpkZWxldGVEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRl
bGV0ZURhdGFiYXNlRmlsZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnNl
dENsaWVudCk6CisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKyAgICAgICAg
KiBzdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpPcmln
aW5RdW90YU1hbmFnZXI6OnRyeUxvY2spOgorICAgICAgICAqIHN0b3JhZ2UvT3JpZ2luUXVvdGFN
YW5hZ2VyLmg6CisKIDIwMTAtMDItMjMgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBwbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRpbSBIYXRjaGVyIGFuZCBQYXZlbCBGZWxkbWFuLgpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkocmV2aXNpb24gNTUx
NzApCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ4LDYgKzQ4LDcgQEAgU1FMaXRlRGF0YWJhc2U6OlNRTGl0ZURhdGFiYXNlKCkK
ICAgICA6IG1fZGIoMCkKICAgICAsIG1fcGFnZVNpemUoLTEpCiAgICAgLCBtX3RyYW5zYWN0aW9u
SW5Qcm9ncmVzcyhmYWxzZSkKKyAgICAsIG1fc2hhcmFibGUoZmFsc2UpCiAgICAgLCBtX29wZW5p
bmdUaHJlYWQoMCkKIHsKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFi
YXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2Uu
aAkocmV2aXNpb24gNTUxNzApCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFz
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC05Nyw3ICs5Nyw3IEBAIHB1YmxpYzoKICAgICBjb25zdCBj
aGFyKiBsYXN0RXJyb3JNc2coKTsKICAgICAKICAgICBzcWxpdGUzKiBzcWxpdGUzSGFuZGxlKCkg
Y29uc3QgewotICAgICAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fb3BlbmluZ1RocmVh
ZCk7CisgICAgICAgIEFTU0VSVChtX3NoYXJhYmxlIHx8IGN1cnJlbnRUaHJlYWQoKSA9PSBtX29w
ZW5pbmdUaHJlYWQpOwogICAgICAgICByZXR1cm4gbV9kYjsKICAgICB9CiAgICAgCkBAIC0xMDgs
NiArMTA4LDEyIEBAIHB1YmxpYzoKICAgICB2b2lkIHVubG9jaygpOwogICAgIGJvb2wgaXNBdXRv
Q29tbWl0T24oKSBjb25zdDsKIAorICAgIC8vIFNldCB0aGlzIGZsYWcgdG8gYWxsb3cgYWNjZXNz
IGZyb20gbXVsdGlwbGUgdGhyZWFkcy4gIE5vdCBhbGwgbXVsdGktdGhyZWFkZWQgYWNjZXNzZXMg
YXJlIHNhZmUhCisgICAgLy8gU2VlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jdnN0cmFjL3dpa2k/
cD1NdWx0aVRocmVhZGluZyBmb3IgbW9yZSBpbmZvLCBhbmQgeW91IG11c3QgYmUgcnVubmluZyB3
aXRoIGNvbXBpbGUgZmxhZ3MgYW5kIFNRTGl0ZSB2ZXJzaW9uIGFwcHJvcHJpYXRlCisgICAgLy8g
dG8geW91ciBjcm9zcy10aHJlYWQgdXNlcy4KKyAgICBib29sIHNoYXJhYmxlKCkgeyByZXR1cm4g
bV9zaGFyYWJsZTsgfQorICAgIHZvaWQgc2V0U2hhcmFibGUoYm9vbCBzaGFyYWJsZSkgeyBtX3No
YXJhYmxlID0gc2hhcmFibGU7IH0KKwogcHJpdmF0ZToKICAgICBzdGF0aWMgaW50IGF1dGhvcml6
ZXJGdW5jdGlvbih2b2lkKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNo
YXIqLCBjb25zdCBjaGFyKik7CiAKQEAgLTEyMCw2ICsxMjYsNyBAQCBwcml2YXRlOgogICAgIGlu
dCBtX3BhZ2VTaXplOwogICAgIAogICAgIGJvb2wgbV90cmFuc2FjdGlvbkluUHJvZ3Jlc3M7Cisg
ICAgYm9vbCBtX3NoYXJhYmxlOwogICAgIAogICAgIE11dGV4IG1fYXV0aG9yaXplckxvY2s7CiAg
ICAgUmVmUHRyPERhdGFiYXNlQXV0aG9yaXplcj4gbV9hdXRob3JpemVyOwpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0
YWJhc2UuY3BwCShyZXZpc2lvbiA1NTE3MCkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTM1Miw2ICszNTIsMTAgQEAgdm9pZCBEYXRhYmFzZTo6bWFy
a0FzRGVsZXRlZEFuZENsb3NlKCkKIAogICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+ZGF0
YWJhc2VUaHJlYWQoKS0+c2NoZWR1bGVJbW1lZGlhdGVUYXNrKHRhc2sucmVsZWFzZSgpKTsKICAg
ICBzeW5jaHJvbml6ZXIud2FpdEZvclRhc2tDb21wbGV0aW9uKCk7CisKKyAgICAvLyBEYXRhYmFz
ZUNsb3NlVGFzayB0ZWxscyBEYXRhYmFzZTo6Y2xvc2Ugbm90IHRvIGRvIHRoaXMsIHNvIHRoYXQg
d2UgY2FuIGdldCBpdCBvdmVyIHdpdGggaGVyZS4KKyAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQtPnJlbW92ZU9wZW5EYXRhYmFzZSh0aGlzKTsKKyAgICBEYXRhYmFzZVRyYWNrZXI6OnRyYWNr
ZXIoKS5yZW1vdmVPcGVuRGF0YWJhc2UodGhpcyk7CiB9CiAKIGNsYXNzIENvbnRleHRSZW1vdmVP
cGVuRGF0YWJhc2VUYXNrIDogcHVibGljIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2sgewpA
QCAtMzc4LDcgKzM4Miw3IEBAIHByaXZhdGU6CiAgICAgUmVmUHRyPERhdGFiYXNlPiBtX2RhdGFi
YXNlOwogfTsKIAotdm9pZCBEYXRhYmFzZTo6Y2xvc2UoKQordm9pZCBEYXRhYmFzZTo6Y2xvc2Uo
Ym9vbCByZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0KQogewogICAgIFJlZlB0cjxEYXRhYmFzZT4g
cHJvdGVjdCA9IHRoaXM7CiAKQEAgLTQwNyw3ICs0MTEsMTAgQEAgdm9pZCBEYXRhYmFzZTo6Y2xv
c2UoKQogICAgIH0KIAogICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+ZGF0YWJhc2VUaHJl
YWQoKS0+dW5zY2hlZHVsZURhdGFiYXNlVGFza3ModGhpcyk7Ci0gICAgbV9zY3JpcHRFeGVjdXRp
b25Db250ZXh0LT5wb3N0VGFzayhDb250ZXh0UmVtb3ZlT3BlbkRhdGFiYXNlVGFzazo6Y3JlYXRl
KHRoaXMpKTsKKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjb250ZXh0IGluaXRpYXRlZCB0aGlz
IGNhbGwsIHNvIGl0J2xsIHRha2UgY2FyZSBvZiB0aGUgY2xlYW51cCBieSBpdHNlbGYsIHN5bmNo
cm9ub3VzbHkuICBUaGlzIGxldHMgaXQgbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgLy8gY2xlYW51
cCBjb21wbGV0ZXMgYnkgYSBnaXZlbiB0aW1lLgorICAgIGlmIChyZW1vdmVEYXRhYmFzZUZyb21D
b250ZXh0KQorICAgICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKENvbnRl
eHRSZW1vdmVPcGVuRGF0YWJhc2VUYXNrOjpjcmVhdGUodGhpcykpOwogfQogCiB2b2lkIERhdGFi
YXNlOjpzdG9wKCkKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCShyZXZpc2lvbiA1NTE3MCkKKysrIFdlYkNv
cmUvc3RvcmFnZS9EYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNyArMTA1LDcgQEAg
cHVibGljOgogICAgIHZvaWQgbWFya0FzRGVsZXRlZEFuZENsb3NlKCk7CiAgICAgYm9vbCBkZWxl
dGVkKCkgY29uc3QgeyByZXR1cm4gbV9kZWxldGVkOyB9CiAKLSAgICB2b2lkIGNsb3NlKCk7Cisg
ICAgdm9pZCBjbG9zZShib29sIHJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQpOwogICAgIGJvb2wg
b3BlbmVkKCkgY29uc3QgeyByZXR1cm4gbV9vcGVuZWQ7IH0KIAogICAgIHZvaWQgc3RvcCgpOwpJ
bmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAJKHJldmlzaW9uIDU1MTcwKQorKysgV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExNyw3ICsxMTcs
OCBAQCBEYXRhYmFzZUNsb3NlVGFzazo6RGF0YWJhc2VDbG9zZVRhc2soRGF0CiAKIHZvaWQgRGF0
YWJhc2VDbG9zZVRhc2s6OmRvUGVyZm9ybVRhc2soKQogewotICAgIGRhdGFiYXNlKCktPmNsb3Nl
KCk7CisgICAgLy8gVGVsbCB0aGUgZGF0YWJhc2Ugbm90IHRvIGNhbGwgYmFjayB0byB0aGUgY29u
dGV4dCB0aHJlYWQ7IHdlJ2xsIGhhbmRsZSBpdC4KKyAgICBkYXRhYmFzZSgpLT5jbG9zZShmYWxz
ZSk7CiB9CiAKICNpZm5kZWYgTkRFQlVHCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VU
aHJlYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5j
cHAJKHJldmlzaW9uIDU1MTcwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTEzLDcgKzExMyw3IEBAIHZvaWQqIERhdGFiYXNlVGhyZWFk
OjpkYXRhYmFzZVRocmVhZCgpCiAgICAgICAgIG9wZW5TZXRDb3B5LnN3YXAobV9vcGVuRGF0YWJh
c2VTZXQpOwogICAgICAgICBEYXRhYmFzZVNldDo6aXRlcmF0b3IgZW5kID0gb3BlblNldENvcHku
ZW5kKCk7CiAgICAgICAgIGZvciAoRGF0YWJhc2VTZXQ6Oml0ZXJhdG9yIGl0ID0gb3BlblNldENv
cHkuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAoKml0KS0+Y2xvc2UoKTsK
KyAgICAgICAgICAgKCppdCktPmNsb3NlKHRydWUpOwogICAgIH0KIAogICAgIC8vIERldGFjaCB0
aGUgdGhyZWFkIHNvIGl0cyByZXNvdXJjZXMgYXJlIG5vIGxvbmdlciBvZiBhbnkgY29uY2VybiB0
byBhbnlvbmUgZWxzZQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHJldmlz
aW9uIDU1MTcwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUxLDEzICs1MSwxOSBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLU9yaWdpblF1b3RhTWFuYWdlciYgRGF0YWJhc2VUcmFja2VyOjpv
cmlnaW5RdW90YU1hbmFnZXIoKQorT3JpZ2luUXVvdGFNYW5hZ2VyJiBEYXRhYmFzZVRyYWNrZXI6
Om9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpCiB7Ci0gICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAg
ICAgQVNTRVJUKG1fcXVvdGFNYW5hZ2VyKTsKICAgICByZXR1cm4gKm1fcXVvdGFNYW5hZ2VyOwog
fQogCitPcmlnaW5RdW90YU1hbmFnZXImIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5h
Z2VyKCkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsK
KyAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKKyAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2VyTm9M
b2NrKCk7Cit9CisKIERhdGFiYXNlVHJhY2tlciYgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyKCkK
IHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERhdGFiYXNlVHJhY2tlciwgdHJhY2tlciwgKCkp
OwpAQCAtNjYsMzYgKzcyLDI5IEBAIERhdGFiYXNlVHJhY2tlciYgRGF0YWJhc2VUcmFja2VyOjp0
cmFja2UKIAogRGF0YWJhc2VUcmFja2VyOjpEYXRhYmFzZVRyYWNrZXIoKQogICAgIDogbV9jbGll
bnQoMCkKLSAgICAsIG1fcHJvcG9zZWREYXRhYmFzZSgwKQotI2lmbmRlZiBOREVCVUcKLSAgICAs
IG1fdGhyZWFkKGN1cnJlbnRUaHJlYWQoKSkKLSNlbmRpZgogewogICAgIFNRTGl0ZUZpbGVTeXN0
ZW06OnJlZ2lzdGVyU1FMaXRlVkZTKCk7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXRE
YXRhYmFzZURpcmVjdG9yeVBhdGgoY29uc3QgU3RyaW5nJiBwYXRoKQogewotICAgIEFTU0VSVChj
dXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwogICAgIEFTU0VSVCghbV9kYXRhYmFzZS5pc09w
ZW4oKSk7CiAgICAgbV9kYXRhYmFzZURpcmVjdG9yeVBhdGggPSBwYXRoOwogfQogCi1jb25zdCBT
dHJpbmcmIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKCkgY29uc3QKK1N0
cmluZyBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlRGlyZWN0b3J5UGF0aCgpIGNvbnN0CiB7Ci0g
ICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgcmV0dXJuIG1fZGF0
YWJhc2VEaXJlY3RvcnlQYXRoOworICAgIHJldHVybiBtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aC50
aHJlYWRzYWZlQ29weSgpOwogfQogCiBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0
YWJhc2VQYXRoKCkgY29uc3QKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhy
ZWFkKTsKICAgICByZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFt
ZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aCwgIkRhdGFiYXNlcy5kYiIpOwogfQogCiB2
b2lkIERhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZShib29sIGNyZWF0ZUlmRG9l
c05vdEV4aXN0KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwor
ICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAKICAgICBpZiAobV9kYXRh
YmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMTA2LDY3ICsxMDUsODcgQEAgdm9p
ZCBEYXRhYmFzZVRyYWNrZXI6Om9wZW5UcmFja2VyRGF0YWJhcwogCiAgICAgaWYgKCFtX2RhdGFi
YXNlLm9wZW4oZGF0YWJhc2VQYXRoKSkgewogICAgICAgICAvLyBGSVhNRTogV2hhdCBkbyBkbyBo
ZXJlPworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlUGF0aCAlcy4i
LCBkYXRhYmFzZVBhdGguYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQor
ICAgIG1fZGF0YWJhc2Uuc2V0U2hhcmFibGUodHJ1ZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLnRh
YmxlRXhpc3RzKCJPcmlnaW5zIikpIHsKICAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1dGVD
b21tYW5kKCJDUkVBVEUgVEFCTEUgT3JpZ2lucyAob3JpZ2luIFRFWFQgVU5JUVVFIE9OIENPTkZM
SUNUIFJFUExBQ0UsIHF1b3RhIElOVEVHRVIgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7Iikp
IHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBhbmQgaGVyZQorICAgICAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gY3JlYXRlIE9yaWdpbnMgdGFibGUiKTsKICAgICAgICAgfQogICAgIH0KICAg
ICBpZiAoIW1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkRhdGFiYXNlcyIpKSB7CiAgICAgICAgIGlm
ICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIERhdGFiYXNlcyAoZ3Vp
ZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsIG9yaWdpbiBURVhULCBuYW1lIFRF
WFQsIGRpc3BsYXlOYW1lIFRFWFQsIGVzdGltYXRlZFNpemUgSU5URUdFUiwgcGF0aCBURVhUKTsi
KSkgewogICAgICAgICAgICAgLy8gRklYTUU6IGFuZCBoZXJlCisgICAgICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byBjcmVhdGUgRGF0YWJhc2VzIHRhYmxlIik7CiAgICAgICAgIH0KICAgICB9
CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpjYW5Fc3RhYmxpc2hEYXRhYmFzZShTY3JpcHRF
eGVjdXRpb25Db250ZXh0KiBjb250ZXh0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmlu
ZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSkKIHsKLSAgICBBU1NF
UlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQotICAgIC8vIFBvcHVsYXRlIHRoZSBv
cmlnaW5zIGJlZm9yZSB3ZSBlc3RhYmxpc2ggYSBkYXRhYmFzZTsgdGhpcyBndWFyYW50ZWVzIHRo
YXQgcXVvdGFGb3JPcmlnaW4KLSAgICAvLyBjYW4gcnVuIG9uIHRoZSBkYXRhYmFzZSB0aHJlYWQg
bGF0ZXIuCi0gICAgcG9wdWxhdGVPcmlnaW5zKCk7Ci0KICAgICBTZWN1cml0eU9yaWdpbiogb3Jp
Z2luID0gY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBQcm9wb3NlZERhdGFiYXNlIGRl
dGFpbHM7CiAKLSAgICAvLyBTaW5jZSB3ZSdyZSBpbW1pbmVudGx5IG9wZW5pbmcgYSBkYXRhYmFz
ZSB3aXRoaW4gdGhpcyBjb250ZXh0J3Mgb3JpZ2luLCBtYWtlIHN1cmUgdGhpcyBvcmlnaW4gaXMg
YmVpbmcgdHJhY2tlZCBieSB0aGUgUXVvdGFUcmFja2VyCi0gICAgLy8gYnkgZmV0Y2hpbmcgaXQn
cyBjdXJyZW50IHVzYWdlIG5vdwotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1c2FnZSA9IHVzYWdl
Rm9yT3JpZ2luKG9yaWdpbik7Ci0KLSAgICAvLyBJZiBhIGRhdGFiYXNlIGFscmVhZHkgZXhpc3Rz
LCBpZ25vcmUgdGhlIHBhc3NlZC1pbiBlc3RpbWF0ZWQgc2l6ZSBhbmQgc2F5IGl0J3MgT0suCi0g
ICAgaWYgKGhhc0VudHJ5Rm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSkKLSAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlcXVpcmVtZW50OworICAgIHVuc2lnbmVk
IGxvbmcgbG9uZyB0ZW1wVXNhZ2U7CisgICAgeworICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFN
YW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgICAgICBNdXRleExvY2tl
ciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKIAotICAgIC8vIElmIHRoZSBkYXRhYmFz
ZSB3aWxsIGZpdCwgYWxsb3cgaXRzIGNyZWF0aW9uLgotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBy
ZXF1aXJlbWVudCA9IHVzYWdlICsgbWF4KDFVTCwgZXN0aW1hdGVkU2l6ZSk7Ci0gICAgaWYgKHJl
cXVpcmVtZW50IDwgdXNhZ2UpCi0gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWYgdGhlIGVzdGlt
YXRlZCBzaXplIGlzIHNvIGJpZyBpdCBjYXVzZXMgYW4gb3ZlcmZsb3csIGRvbid0IGFsbG93IGNy
ZWF0aW9uLgotICAgIGlmIChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbihvcmlnaW4pKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAKLSAgICAv
LyBHaXZlIHRoZSBjaHJvbWUgY2xpZW50IGEgY2hhbmNlIHRvIGluY3JlYXNlIHRoZSBxdW90YS4K
LSAgICAvLyBUZW1wb3JhcmlseSBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBwcm9wb3NlZCBkYXRh
YmFzZSBhdmFpbGFibGUsIHNvIHRoZSBjbGllbnQgY2FuIGdldCBhdCB0aGVtLgotICAgIHBhaXI8
U2VjdXJpdHlPcmlnaW4qLCBEYXRhYmFzZURldGFpbHM+IGRldGFpbHMob3JpZ2luLCBEYXRhYmFz
ZURldGFpbHMobmFtZSwgZGlzcGxheU5hbWUsIGVzdGltYXRlZFNpemUsIDApKTsKLSAgICBtX3By
b3Bvc2VkRGF0YWJhc2UgPSAmZGV0YWlsczsKKyAgICAgICAgLy8gU2luY2Ugd2UncmUgaW1taW5l
bnRseSBvcGVuaW5nIGEgZGF0YWJhc2Ugd2l0aGluIHRoaXMgY29udGV4dCdzIG9yaWdpbiwgbWFr
ZSBzdXJlIHRoaXMgb3JpZ2luIGlzIGJlaW5nIHRyYWNrZWQgYnkgdGhlIFF1b3RhVHJhY2tlcgor
ICAgICAgICAvLyBieSBmZXRjaGluZyBpdHMgY3VycmVudCB1c2FnZSBub3cuCisgICAgICAgIHVu
c2lnbmVkIGxvbmcgbG9uZyB1c2FnZSA9IHVzYWdlRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7CisK
KyAgICAgICAgLy8gSWYgYSBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cywgaWdub3JlIHRoZSBwYXNz
ZWQtaW4gZXN0aW1hdGVkIHNpemUgYW5kIHNheSBpdCdzIE9LLgorICAgICAgICBpZiAoaGFzRW50
cnlGb3JEYXRhYmFzZShvcmlnaW4sIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICAgICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdpbGwgZml0LCBhbGxvdyBpdHMgY3JlYXRpb24u
CisgICAgICAgIHJlcXVpcmVtZW50ID0gdXNhZ2UgKyBtYXgoMVVMLCBlc3RpbWF0ZWRTaXplKTsK
KyAgICAgICAgdGVtcFVzYWdlID0gdXNhZ2U7CisgICAgICAgIGlmIChyZXF1aXJlbWVudCA8IHVz
YWdlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJZiB0aGUgZXN0aW1hdGVkIHNpemUg
aXMgc28gYmlnIGl0IGNhdXNlcyBhbiBvdmVyZmxvdywgZG9uJ3QgYWxsb3cgY3JlYXRpb24uCisg
ICAgICAgIGlmIChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbk5vTG9jayhvcmlnaW4pKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gR2l2ZSB0aGUgY2hyb21lIGNs
aWVudCBhIGNoYW5jZSB0byBpbmNyZWFzZSB0aGUgcXVvdGEuCisgICAgICAgIC8vIFRlbXBvcmFy
aWx5IG1ha2UgdGhlIGRldGFpbHMgb2YgdGhlIHByb3Bvc2VkIGRhdGFiYXNlIGF2YWlsYWJsZSwg
c28gdGhlIGNsaWVudCBjYW4gZ2V0IGF0IHRoZW0uCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91
bGQgcmVhbGx5IGp1c3QgcGFzcyB0aGUgZGV0YWlscyBpbnRvIHRoaXMgY2FsbCwgcmF0aGVyIHRo
YW4gdXNpbmcgbV9wcm9wb3NlZERhdGFiYXNlcy4KKyAgICAgICAgZGV0YWlscyA9IFByb3Bvc2Vk
RGF0YWJhc2Uob3JpZ2luLCBEYXRhYmFzZURldGFpbHMobmFtZSwgZGlzcGxheU5hbWUsIGVzdGlt
YXRlZFNpemUsIDApKTsKKyAgICAgICAgbV9wcm9wb3NlZERhdGFiYXNlcy5hZGQoJmRldGFpbHMp
OworICAgIH0KKyAgICAvLyBEcm9wIGFsbCBsb2NrcyBiZWZvcmUgY2FsbGluZyBvdXQ7IHdlIGRv
bid0IGtub3cgd2hhdCB0aGV5J2xsIGRvLgogICAgIGNvbnRleHQtPmRhdGFiYXNlRXhjZWVkZWRR
dW90YShuYW1lKTsKLSAgICBtX3Byb3Bvc2VkRGF0YWJhc2UgPSAwOworICAgIHsKKyAgICAgICAg
TXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIG1fcHJv
cG9zZWREYXRhYmFzZXMucmVtb3ZlKCZkZXRhaWxzKTsKKyAgICB9CiAKICAgICAvLyBJZiB0aGUg
ZGF0YWJhc2Ugd2lsbCBmaXQgbm93LCBhbGxvdyBpdHMgY3JlYXRpb24uCiAgICAgcmV0dXJuIHJl
cXVpcmVtZW50IDw9IHF1b3RhRm9yT3JpZ2luKG9yaWdpbik7CiB9CiAKK2Jvb2wgRGF0YWJhc2VU
cmFja2VyOjpoYXNFbnRyeUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKQor
eworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgQVNTRVJUKG1f
cXVvdGFNYXApOworICAgIHJldHVybiBtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pOworfQor
CiBib29sIERhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4q
IG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAg
ICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKICAgICBwb3B1bGF0
ZU9yaWdpbnMoKTsKLSAgICBNdXRleExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJk
KTsKLSAgICByZXR1cm4gbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKTsKKyAgICByZXR1cm4g
aGFzRW50cnlGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKIH0KIAogYm9vbCBEYXRhYmFzZVRyYWNr
ZXI6Omhhc0VudHJ5Rm9yRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3Ry
aW5nJiBkYXRhYmFzZUlkZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9
PSBtX3RocmVhZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKICAg
ICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVu
KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE5MywxNiArMjEyLDE3IEBAIHVuc2lnbmVk
IGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OmdldE0KIAogU3RyaW5nIERhdGFiYXNlVHJhY2tl
cjo6b3JpZ2luUGF0aChTZWN1cml0eU9yaWdpbiogb3JpZ2luKSBjb25zdAogewotICAgIEFTU0VS
VChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotICAgIHJldHVybiBTUUxpdGVGaWxlU3lz
dGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRo
LCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICByZXR1cm4gU1FMaXRlRmlsZVN5
c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0
aC50aHJlYWRzYWZlQ29weSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIH0KIAot
U3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZShTZWN1cml0eU9yaWdp
biogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RFeGlzdHMpCitT
dHJpbmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKFNlY3VyaXR5
T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZk5vdEV4aXN0
cykKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NF
UlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVCghb3JpZ2luUXVvdGFN
YW5hZ2VyTm9Mb2NrKCkudHJ5TG9jaygpKTsKIAotICAgIGlmIChtX3Byb3Bvc2VkRGF0YWJhc2Ug
JiYgbV9wcm9wb3NlZERhdGFiYXNlLT5maXJzdCA9PSBvcmlnaW4gJiYgbV9wcm9wb3NlZERhdGFi
YXNlLT5zZWNvbmQubmFtZSgpID09IG5hbWUpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAg
ICBmb3IgKEhhc2hTZXQ8UHJvcG9zZWREYXRhYmFzZSo+OjppdGVyYXRvciBpdGVyID0gbV9wcm9w
b3NlZERhdGFiYXNlcy5iZWdpbigpOyBpdGVyICE9IG1fcHJvcG9zZWREYXRhYmFzZXMuZW5kKCk7
ICsraXRlcikKKyAgICAgICAgaWYgKCgqaXRlciktPmZpcnN0ID09IG9yaWdpbiAmJiAoKml0ZXIp
LT5zZWNvbmQubmFtZSgpID09IG5hbWUpCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAK
ICAgICBTdHJpbmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVy
KCk7CiAgICAgU3RyaW5nIG9yaWdpblBhdGggPSB0aGlzLT5vcmlnaW5QYXRoKG9yaWdpbik7CkBA
IC0yMTIsNyArMjMyLDcgQEAgU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRh
YgogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHBh
dGggZm9yIHRoaXMgZGF0YWJhc2UgeWV0Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7
CisgICAgLy8gVE9ETzogV2h5IGRvbid0IHdlIHRyeSB0byBvcGVuIHRoZSBkYXRhYmFzZSBmaXJz
dD8KICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybiBTdHJpbmco
KTsKICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1QgcGF0
aCBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyBBTkQgbmFtZT0/OyIpOwpAQCAtMjMxLDM2
ICsyNTEsNDIgQEAgU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYgogICAg
ICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdERvbmUp
IHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmV0cmlldmUgZmlsZW5hbWUgZnJvbSBE
YXRhYmFzZSBUcmFja2VyIGZvciBvcmlnaW4gJXMsIG5hbWUgJXMiLCBvcmlnaW4tPmRhdGFiYXNl
SWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpLCBuYW1lLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmV0cmlldmUgZmlsZW5hbWUgZnJvbSBEYXRhYmFzZSBU
cmFja2VyIGZvciBvcmlnaW4gJXMsIG5hbWUgJXMiLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCku
ZGF0YSgpLCBuYW1lLmFzY2lpKCkuZGF0YSgpKTsKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwog
ICAgIH0KICAgICBzdGF0ZW1lbnQuZmluYWxpemUoKTsKIAotICAgIFN0cmluZyBmaWxlTmFtZSA9
IFNRTGl0ZUZpbGVTeXN0ZW06OmdldEZpbGVOYW1lRm9yTmV3RGF0YWJhc2Uob3JpZ2luUGF0aCwg
bmFtZSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSwgJm1fZGF0YWJhc2UpOworICAgIFN0
cmluZyBmaWxlTmFtZSA9IFNRTGl0ZUZpbGVTeXN0ZW06OmdldEZpbGVOYW1lRm9yTmV3RGF0YWJh
c2Uob3JpZ2luUGF0aCwgbmFtZSwgb3JpZ2luSWRlbnRpZmllciwgJm1fZGF0YWJhc2UpOwogICAg
IGlmICghYWRkRGF0YWJhc2Uob3JpZ2luLCBuYW1lLCBmaWxlTmFtZSkpCiAgICAgICAgIHJldHVy
biBTdHJpbmcoKTsKIAogICAgIC8vIElmIHRoaXMgb3JpZ2luJ3MgcXVvdGEgaXMgYmVpbmcgdHJh
Y2tlZCAob3BlbiBoYW5kbGUgdG8gYSBkYXRhYmFzZSBpbiB0aGlzIG9yaWdpbiksIGFkZCB0aGlz
IG5ldyBkYXRhYmFzZQogICAgIC8vIHRvIHRoZSBxdW90YSBtYW5hZ2VyIG5vdwogICAgIFN0cmlu
ZyBmdWxsRmlsZVBhdGggPSBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1l
VG9QYXRoKG9yaWdpblBhdGgsIGZpbGVOYW1lKTsKLSAgICB7Ci0gICAgICAgIExvY2tlcjxPcmln
aW5RdW90YU1hbmFnZXI+IGxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Ci0gICAgICAgIGlm
IChvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKLSAgICAgICAgICAg
IG9yaWdpblF1b3RhTWFuYWdlcigpLmFkZERhdGFiYXNlKG9yaWdpbiwgbmFtZSwgZnVsbEZpbGVQ
YXRoKTsKLSAgICB9CisgICAgaWYgKG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrc09y
aWdpbihvcmlnaW4pKQorICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5hZGREYXRh
YmFzZShvcmlnaW4sIG5hbWUsIGZ1bGxGaWxlUGF0aCk7CiAKICAgICByZXR1cm4gZnVsbEZpbGVQ
YXRoOwogfQogCitTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlKFNl
Y3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZk5v
dEV4aXN0cykKK3sKKyAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBsb2NrZXIob3JpZ2lu
UXVvdGFNYW5hZ2VyKCkpOworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNl
R3VhcmQpOworICAgIHBvcHVsYXRlT3JpZ2lucygpOworCisgICAgcmV0dXJuIGZ1bGxQYXRoRm9y
RGF0YWJhc2VOb0xvY2sob3JpZ2luLCBuYW1lLCBjcmVhdGVJZk5vdEV4aXN0cyk7Cit9CisKIHZv
aWQgRGF0YWJhc2VUcmFja2VyOjpwb3B1bGF0ZU9yaWdpbnMoKQogeworICAgIEFTU0VSVCghbV9k
YXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAgICAgaWYgKG1fcXVvdGFNYXApCiAgICAgICAgIHJl
dHVybjsKIAotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotCiAgICAg
bV9xdW90YU1hcC5zZXQobmV3IFF1b3RhTWFwKTsKLSAgICBtX3F1b3RhTWFuYWdlci5zZXQobmV3
IE9yaWdpblF1b3RhTWFuYWdlcik7CisgICAgaWYgKCFtX3F1b3RhTWFuYWdlcikKKyAgICAgICAg
bV9xdW90YU1hbmFnZXIuc2V0KG5ldyBPcmlnaW5RdW90YU1hbmFnZXIpOwogCiAgICAgb3BlblRy
YWNrZXJEYXRhYmFzZShmYWxzZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQpAQCAt
MjY4LDggKzI5NCwxMCBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKCkK
IAogICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmln
aW4sIHF1b3RhIEZST00gT3JpZ2lucyIpOwogCi0gICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkg
IT0gU1FMUmVzdWx0T2spCisgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0
T2spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBzdGF0ZW1lbnQuIik7
CiAgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBpbnQgcmVzdWx0OwogICAgIHdoaWxlICgo
cmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKSkgPT0gU1FMUmVzdWx0Um93KSB7CkBAIC0yNzgsMjAg
KzMwNiwyMCBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKCkKICAgICB9
CiAKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdERvbmUpCi0gICAgICAgIExPR19FUlJPUigi
RmFpbGVkIHRvIHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UiKTsKKyAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRoZSBkYXRh
YmFzZS4iKTsKIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbnMoVmVjdG9yPFJlZlB0
cjxTZWN1cml0eU9yaWdpbj4gPiYgcmVzdWx0KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFk
KCkgPT0gbV90aHJlYWQpOworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNl
R3VhcmQpOwogICAgIHBvcHVsYXRlT3JpZ2lucygpOwotICAgIE11dGV4TG9ja2VyIGxvY2tRdW90
YU1hcChtX3F1b3RhTWFwR3VhcmQpOworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKICAgICBjb3B5
S2V5c1RvVmVjdG9yKCptX3F1b3RhTWFwLCByZXN1bHQpOwogfQogCi1ib29sIERhdGFiYXNlVHJh
Y2tlcjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBWZWN0
b3I8U3RyaW5nPiYgcmVzdWx0VmVjdG9yKQorYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNl
TmFtZXNGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9yPFN0cmlu
Zz4mIHJlc3VsdFZlY3RvcikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhy
ZWFkKTsKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOwogICAgIG9wZW5U
cmFja2VyRGF0YWJhc2UoZmFsc2UpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzE1LDQ0ICszNDMsNTcgQEAgYm9vbCBEYXRhYmFzZVRy
YWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcgogICAgIHJldHVybiB0cnVlOwogfQogCi1EYXRhYmFz
ZURldGFpbHMgRGF0YWJhc2VUcmFja2VyOjpkZXRhaWxzRm9yTmFtZUFuZE9yaWdpbihjb25zdCBT
dHJpbmcmIG5hbWUsIFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCitib29sIERhdGFiYXNlVHJhY2tl
cjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBWZWN0b3I8
U3RyaW5nPiYgcmVzdWx0VmVjdG9yKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0g
bV90aHJlYWQpOwotCi0gICAgaWYgKG1fcHJvcG9zZWREYXRhYmFzZSAmJiBtX3Byb3Bvc2VkRGF0
YWJhc2UtPmZpcnN0ID09IG9yaWdpbiAmJiBtX3Byb3Bvc2VkRGF0YWJhc2UtPnNlY29uZC5uYW1l
KCkgPT0gbmFtZSkKLSAgICAgICAgcmV0dXJuIG1fcHJvcG9zZWREYXRhYmFzZS0+c2Vjb25kOwor
ICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgIHJldHVy
biBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbiwgcmVzdWx0VmVjdG9yKTsKK30K
IAorRGF0YWJhc2VEZXRhaWxzIERhdGFiYXNlVHJhY2tlcjo6ZGV0YWlsc0Zvck5hbWVBbmRPcmln
aW4oY29uc3QgU3RyaW5nJiBuYW1lLCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKQorewogICAgIFN0
cmluZyBvcmlnaW5JZGVudGlmaWVyID0gb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKTsKKyAg
ICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgaW50NjRfdCBleHBlY3RlZFVzYWdlOwogCi0gICAg
b3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3Blbigp
KQotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7Ci0gICAgU1FMaXRlU3RhdGVtZW50
IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIGRpc3BsYXlOYW1lLCBlc3RpbWF0ZWRTaXpl
IEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT8iKTsKLSAgICBpZiAoc3Rh
dGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKLSAgICAgICAgcmV0dXJuIERhdGFiYXNl
RGV0YWlscygpOwotCi0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZpZXIp
OwotICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBuYW1lKTsKLQotICAgIGludCByZXN1bHQgPSBz
dGF0ZW1lbnQuc3RlcCgpOwotICAgIGlmIChyZXN1bHQgPT0gU1FMUmVzdWx0RG9uZSkKLSAgICAg
ICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIg
bG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IFNRTFJl
c3VsdFJvdykgewotICAgICAgICBMT0dfRVJST1IoIkVycm9yIHJldHJpZXZpbmcgZGV0YWlscyBm
b3IgZGF0YWJhc2UgJXMgaW4gb3JpZ2luICVzIGZyb20gdHJhY2tlciBkYXRhYmFzZSIsIG5hbWUu
YXNjaWkoKS5kYXRhKCksIG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRhKCkpOwotICAgICAg
ICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxQcm9wb3Nl
ZERhdGFiYXNlKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX3Byb3Bvc2VkRGF0YWJhc2VzLmJlZ2luKCk7
IGl0ZXIgIT0gbV9wcm9wb3NlZERhdGFiYXNlcy5lbmQoKTsgKytpdGVyKQorICAgICAgICAgICAg
aWYgKCgqaXRlciktPmZpcnN0ID09IG9yaWdpbiAmJiAoKml0ZXIpLT5zZWNvbmQubmFtZSgpID09
IG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuICgqaXRlciktPnNlY29uZDsKKworICAgICAg
ICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKKyAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmlz
T3BlbigpKQorICAgICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgICAgICBT
UUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1QgZGlzcGxheU5hbWUs
IGVzdGltYXRlZFNpemUgRlJPTSBEYXRhYmFzZXMgV0hFUkUgb3JpZ2luPT8gQU5EIG5hbWU9PyIp
OworICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKKyAgICAg
ICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKworICAgICAgICBzdGF0ZW1lbnQuYmlu
ZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7CisgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgy
LCBuYW1lKTsKKworICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKTsKKyAgICAg
ICAgaWYgKHJlc3VsdCA9PSBTUUxSZXN1bHREb25lKQorICAgICAgICAgICAgcmV0dXJuIERhdGFi
YXNlRGV0YWlscygpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gU1FMUmVzdWx0Um93KSB7Cisg
ICAgICAgICAgICBMT0dfRVJST1IoIkVycm9yIHJldHJpZXZpbmcgZGV0YWlscyBmb3IgZGF0YWJh
c2UgJXMgaW4gb3JpZ2luICVzIGZyb20gdHJhY2tlciBkYXRhYmFzZSIsIG5hbWUuYXNjaWkoKS5k
YXRhKCksIG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgcmV0
dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgICAgICB9CisgICAgICAgIGRpc3BsYXlOYW1lID0g
c3RhdGVtZW50LmdldENvbHVtblRleHQoMCk7CisgICAgICAgIGV4cGVjdGVkVXNhZ2UgPSBzdGF0
ZW1lbnQuZ2V0Q29sdW1uSW50NjQoMSk7CiAgICAgfQogCi0gICAgcmV0dXJuIERhdGFiYXNlRGV0
YWlscyhuYW1lLCBzdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKSwgc3RhdGVtZW50LmdldENvbHVt
bkludDY0KDEpLCB1c2FnZUZvckRhdGFiYXNlKG5hbWUsIG9yaWdpbikpOworICAgIHJldHVybiBE
YXRhYmFzZURldGFpbHMobmFtZSwgZGlzcGxheU5hbWUsIGV4cGVjdGVkVXNhZ2UsIHVzYWdlRm9y
RGF0YWJhc2UobmFtZSwgb3JpZ2luKSk7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXRE
YXRhYmFzZURldGFpbHMoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNpZ25lZCBsb25nIGVzdGltYXRlZFNpemUp
CiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0KICAgICBTdHJp
bmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCk7CiAgICAg
aW50NjRfdCBndWlkID0gMDsKIAorICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFi
YXNlR3VhcmQpOworCiAgICAgb3BlblRyYWNrZXJEYXRhYmFzZSh0cnVlKTsKICAgICBpZiAoIW1f
ZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybjsKQEAgLTQwMCw3ICs0NDEsNiBAQCB2
b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxzCiAKIHVuc2lnbmVkIGxvbmcg
bG9uZyBEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBuYW1l
LCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkg
PT0gbV90aHJlYWQpOwogICAgIFN0cmluZyBwYXRoID0gZnVsbFBhdGhGb3JEYXRhYmFzZShvcmln
aW4sIG5hbWUsIGZhbHNlKTsKICAgICBpZiAocGF0aC5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVy
biAwOwpAQCAtNDQxLDYgKzQ4MSw3IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVu
RGF0YWJhc2UKICAgICBpZiAoIWRhdGFiYXNlKQogICAgICAgICByZXR1cm47CiAKKyAgICBMb2Nr
ZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5h
Z2VyKCkpOwogICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJh
c2VNYXBHdWFyZCk7CiAKICAgICBpZiAoIW1fb3BlbkRhdGFiYXNlTWFwKSB7CkBAIC00NzYsNiAr
NTE3LDEwIEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UKIAogICAg
IG1fb3BlbkRhdGFiYXNlTWFwLT5yZW1vdmUoZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpOwog
ICAgIGRlbGV0ZSBuYW1lTWFwOworICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnJlbW92
ZU9yaWdpbihkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSk7CisKKyAgICAvLyBUaHJvdyBhd2F5
IG1fcXVvdGFNYXAgd2hlbmV2ZXIgd2UndmUgY2xlYXJlZCBvdXQgYW4gb3JpZ2luLS1vdGhlcndp
c2Ugd2UgbmV2ZXIgZ2V0IHJpZCBvZiBzdGFsZSBlbnRyaWVzLiAgVGhlIG5leHQgY2FsbCB0aGF0
IG5lZWRzIGl0IHdpbGwgcG9wdWxhdGVPcmlnaW5zKCkuCisgICAgbV9xdW90YU1hcC5jbGVhcigp
OwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6Z2V0T3BlbkRhdGFiYXNlcyhTZWN1cml0eU9y
aWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIEhhc2hTZXQ8UmVmUHRyPERhdGFiYXNl
PiA+KiBkYXRhYmFzZXMpCkBAIC00OTYsOTIgKzU0MSwxMDMgQEAgdm9pZCBEYXRhYmFzZVRyYWNr
ZXI6OmdldE9wZW5EYXRhYmFzZXMoUwogICAgICAgICBkYXRhYmFzZXMtPmFkZCgqaXQpOwogfQog
Ci11bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbihTZWN1
cml0eU9yaWdpbiogb3JpZ2luKQordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6
dXNhZ2VGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NF
UlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLSAgICBMb2NrZXI8T3JpZ2luUXVvdGFN
YW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgIEFTU0VSVCghb3JpZ2lu
UXVvdGFNYW5hZ2VyTm9Mb2NrKCkudHJ5TG9jaygpKTsKIAogICAgIC8vIFVzZSB0aGUgT3JpZ2lu
UXVvdGFNYW5hZ2VyIG1lY2hhbmlzbSB0byBjYWxjdWxhdGUgdGhlIHVzYWdlCi0gICAgaWYgKG9y
aWdpblF1b3RhTWFuYWdlcigpLnRyYWNrc09yaWdpbihvcmlnaW4pKQotICAgICAgICByZXR1cm4g
b3JpZ2luUXVvdGFNYW5hZ2VyKCkuZGlza1VzYWdlKG9yaWdpbik7CisgICAgaWYgKG9yaWdpblF1
b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrc09yaWdpbihvcmlnaW4pKQorICAgICAgICByZXR1cm4g
b3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkuZGlza1VzYWdlKG9yaWdpbik7CiAKICAgICAvLyBJ
ZiB0aGUgT3JpZ2luUXVvdGFNYW5hZ2VyIGRvZXNuJ3QgdHJhY2sgdGhpcyBvcmlnaW4gYWxyZWFk
eSwgcHJpbWUgaXQgdG8gZG8gc28KLSAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja09yaWdp
bihvcmlnaW4pOworICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrT3JpZ2luKG9y
aWdpbik7CiAKICAgICBWZWN0b3I8U3RyaW5nPiBuYW1lczsKLSAgICBkYXRhYmFzZU5hbWVzRm9y
T3JpZ2luKG9yaWdpbiwgbmFtZXMpOworICAgIGRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2so
b3JpZ2luLCBuYW1lcyk7CiAKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmFtZXMuc2l6
ZSgpOyArK2kpCi0gICAgICAgIG9yaWdpblF1b3RhTWFuYWdlcigpLmFkZERhdGFiYXNlKG9yaWdp
biwgbmFtZXNbaV0sIGZ1bGxQYXRoRm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lc1tpXSwgZmFsc2Up
KTsKKyAgICAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkuYWRkRGF0YWJhc2Uob3JpZ2lu
LCBuYW1lc1tpXSwgZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayhvcmlnaW4sIG5hbWVzW2ldLCBm
YWxzZSkpOwogCi0gICAgaWYgKCFvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja3NPcmlnaW4ob3Jp
Z2luKSkKKyAgICBpZiAoIW9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrc09yaWdpbihv
cmlnaW4pKQogICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2Vy
KCkuZGlza1VzYWdlKG9yaWdpbik7CisgICAgcmV0dXJuIG9yaWdpblF1b3RhTWFuYWdlck5vTG9j
aygpLmRpc2tVc2FnZShvcmlnaW4pOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VU
cmFja2VyOjp1c2FnZUZvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luKQoreworICAgIExv
Y2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IGxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7CisK
KyAgICByZXR1cm4gdXNhZ2VGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKK30KKwordW5zaWduZWQg
bG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6cXVvdGFGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlP
cmlnaW4qIG9yaWdpbikKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkp
OworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKKyAgICByZXR1cm4gbV9xdW90YU1hcC0+Z2V0KG9y
aWdpbik7CiB9CiAKIHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9y
T3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJl
YWQoKSA9PSBtX3RocmVhZCB8fCBtX3F1b3RhTWFwKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0
YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKLSAgICBNdXRl
eExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJkKTsKLSAgICByZXR1cm4gbV9xdW90
YU1hcC0+Z2V0KG9yaWdpbik7CisgICAgcmV0dXJuIHF1b3RhRm9yT3JpZ2luTm9Mb2NrKG9yaWdp
bik7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXRRdW90YShTZWN1cml0eU9yaWdpbiog
b3JpZ2luLCB1bnNpZ25lZCBsb25nIGxvbmcgcXVvdGEpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRU
aHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgaWYgKHF1b3RhRm9yT3JpZ2luKG9yaWdpbikgPT0g
cXVvdGEpCisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisK
KyAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKKyAgICBpZiAocXVvdGFGb3JPcmlnaW5Ob0xvY2sob3Jp
Z2luKSA9PSBxdW90YSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgb3BlblRyYWNrZXJEYXRhYmFz
ZSh0cnVlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybjsK
IAotICAgIHsKLSAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFy
ZCk7Ci0KLSAgICAgICAgaWYgKCFtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pKSB7Ci0gICAg
ICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5U
TyBPcmlnaW5zIFZBTFVFUyAoPywgPykiKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucHJl
cGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFi
bGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgyLCBxdW90YSk7
Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50LnN0ZXAoKSAhPSBTUUxSZXN1bHREb25l
KQotICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2ggb3Jp
Z2luICVzIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2Np
aSgpLmRhdGEoKSk7Ci0gICAgICAgICAgICB9CisgICAgaWYgKCFtX3F1b3RhTWFwLT5jb250YWlu
cyhvcmlnaW4pKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIklOU0VSVCBJTlRPIE9yaWdpbnMgVkFMVUVTICg/LCA/KSIpOworICAgICAgICBpZiAoc3Rh
dGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJVbmFibGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+
ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiVVBEQVRF
IE9yaWdpbnMgU0VUIHF1b3RhPT8gV0hFUkUgb3JpZ2luPT8iKTsKLSAgICAgICAgICAgIGJvb2wg
ZXJyb3IgPSBzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rOwotICAgICAgICAgICAg
aWYgKCFlcnJvcikgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMSwgcXVv
dGEpOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmln
aW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50
NjQoMiwgcXVvdGEpOwogCi0gICAgICAgICAgICAgICAgZXJyb3IgPSAhc3RhdGVtZW50LmV4ZWN1
dGVDb21tYW5kKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50LnN0
ZXAoKSAhPSBTUUxSZXN1bHREb25lKQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxl
IHRvIGVzdGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNl
SWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlVQREFURSBPcmln
aW5zIFNFVCBxdW90YT0/IFdIRVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGJvb2wgZXJyb3IgPSBz
dGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rOworICAgICAgICBpZiAoIWVycm9yKSB7
CisgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEludDY0KDEsIHF1b3RhKTsKKyAgICAgICAgICAg
IHN0YXRlbWVudC5iaW5kVGV4dCgyLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIAot
ICAgICAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVk
IHRvIHNldCBxdW90YSAlbGx1IGluIHRyYWNrZXIgZGF0YWJhc2UgZm9yIG9yaWdpbiAlcyIsIHF1
b3RhLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgIGVycm9yID0gIXN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpOwogICAgICAgICB9CiAK
LSAgICAgICAgLy8gRklYTUU6IElzIGl0IHJlYWxseSBPSyB0byB1cGRhdGUgdGhlIHF1b3RhIGlu
IG1lbW9yeSBpZiB3ZSBmYWlsZWQgdG8gdXBkYXRlIGl0IG9uIGRpc2s/Ci0gICAgICAgIG1fcXVv
dGFNYXAtPnNldChvcmlnaW4sIHF1b3RhKTsKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHF1b3RhICVsbHUgaW4gdHJhY2tlciBkYXRhYmFz
ZSBmb3Igb3JpZ2luICVzIiwgcXVvdGEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNj
aWkoKS5kYXRhKCkpOwogICAgIH0KIAorICAgIC8vIEZJWE1FOiBJcyBpdCByZWFsbHkgT0sgdG8g
dXBkYXRlIHRoZSBxdW90YSBpbiBtZW1vcnkgaWYgd2UgZmFpbGVkIHRvIHVwZGF0ZSBpdCBvbiBk
aXNrPworICAgIG1fcXVvdGFNYXAtPnNldChvcmlnaW4sIHF1b3RhKTsKKwogICAgIGlmIChtX2Ns
aWVudCkKICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3JpZ2luKG9yaWdpbik7
CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZShTZWN1cml0eU9yaWdpbiog
b3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgcGF0aCkKIHsKLSAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fZGF0YWJh
c2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKICAgICBvcGVuVHJh
Y2tlckRhdGFiYXNlKHRydWUpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gTmV3IGRhdGFiYXNlIHNob3VsZCBuZXZlciBiZSBh
ZGRlZCB1bnRpbCB0aGUgb3JpZ2luIGhhcyBiZWVuIGVzdGFibGlzaGVkCi0gICAgQVNTRVJUKGhh
c0VudHJ5Rm9yT3JpZ2luKG9yaWdpbikpOworICAgIEFTU0VSVChoYXNFbnRyeUZvck9yaWdpbk5v
TG9jayhvcmlnaW4pKTsKIAogICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIklOU0VSVCBJTlRPIERhdGFiYXNlcyAob3JpZ2luLCBuYW1lLCBwYXRoKSBWQUxVRVMgKD8s
ID8sID8pOyIpOwogCkBAIC02MDUsOCArNjYxLDYgQEAgYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmFk
ZERhdGFiYXNlKFNlY3VyaQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlQWxsRGF0YWJh
c2VzKCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQogICAg
IFZlY3RvcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+ID4gb3JpZ2luc0NvcHk7CiAgICAgb3JpZ2lu
cyhvcmlnaW5zQ29weSk7CiAKQEAgLTYxNCwxOSArNjY4LDI0IEBAIHZvaWQgRGF0YWJhc2VUcmFj
a2VyOjpkZWxldGVBbGxEYXRhYmFzZXMKICAgICAgICAgZGVsZXRlT3JpZ2luKG9yaWdpbnNDb3B5
W2ldLmdldCgpKTsKIH0KIAorLy8gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRv
IG1ha2Ugc3VyZSB0aGF0IG5vYm9keSBpcyB0cnlpbmcgdG8gY3JlYXRlLCBkZWxldGUsIG9wZW4s
IG9yIGNsb3NlIGRhdGFiYXNlcyBpbiB0aGlzIG9yaWdpbiB3aGlsZSB0aGUgZGVsZXRpb24gaXMK
Ky8vIHRha2luZyBwbGFjZS4KIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpkZWxldGVPcmlnaW4oU2Vj
dXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1f
dGhyZWFkKTsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKLSAgICBpZiAoIW1fZGF0
YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIFZlY3RvcjxTdHJpbmc+IGRh
dGFiYXNlTmFtZXM7Ci0gICAgaWYgKCFkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKG9yaWdpbiwgZGF0
YWJhc2VOYW1lcykpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmV0cmlldmUgbGlz
dCBvZiBkYXRhYmFzZSBuYW1lcyBmb3Igb3JpZ2luICVzIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAg
IE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgICAgICBvcGVu
VHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKKyAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3Blbigp
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghZGF0YWJhc2VOYW1lc0Zvck9y
aWdpbk5vTG9jayhvcmlnaW4sIGRhdGFiYXNlTmFtZXMpKSB7CisgICAgICAgICAgICBMT0dfRVJS
T1IoIlVuYWJsZSB0byByZXRyaWV2ZSBsaXN0IG9mIGRhdGFiYXNlIG5hbWVzIGZvciBvcmlnaW4g
JXMiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdlIGRyb3AgdGhlIGxv
Y2sgaGVyZSBiZWNhdXNlIGhvbGRpbmcgbG9ja3MgZHVyaW5nIGEgY2FsbCB0byBkZWxldGVEYXRh
YmFzZUZpbGUgd2lsbCBkZWFkbG9jay4KICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0
YWJhc2VOYW1lcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAoIWRlbGV0ZURhdGFiYXNlRmls
ZShvcmlnaW4sIGRhdGFiYXNlTmFtZXNbaV0pKSB7CiAgICAgICAgICAgICAvLyBFdmVuIGlmIHRo
ZSBmaWxlIGNhbid0IGJlIGRlbGV0ZWQsIHdlIHdhbnQgdG8gdHJ5IGFuZCBkZWxldGUgdGhlIHJl
c3QsIGRvbid0IHJldHVybiBlYXJseSBoZXJlLgpAQCAtNjM0LDQxICs2OTMsNDIgQEAgdm9pZCBE
YXRhYmFzZVRyYWNrZXI6OmRlbGV0ZU9yaWdpbihTZWN1cgogICAgICAgICB9CiAgICAgfQogCi0g
ICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gRGF0
YWJhc2VzIFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0g
U1FMUmVzdWx0T2spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxl
dGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5k
YXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9CisgICAgeworICAgICAgICAvLyBUbyBzYXRpc2Z5IHRoZSBsb2NrIGhpZXJhcmNoeSwgd2Ug
aGF2ZSB0byBsb2NrIHRoZSBvcmlnaW5RdW90YU1hbmFnZXIgYmVmb3JlIG1fZGF0YWJhc2VHdWFy
ZCBpZiB0aGVyZSdzIGFueSBjaGFuY2Ugd2UnbGwgdG8gbG9jayBib3RoLgorICAgICAgICBMb2Nr
ZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5h
Z2VyKCkpOworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJk
KTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRF
IEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGlmIChzdGF0ZW1lbnQu
cHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJs
ZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRy
YWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDEs
IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOworICAgICAgICBzdGF0ZW1lbnQuYmluZFRl
eHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiAKLSAgICBpZiAoIXN0YXRlbWVu
dC5leGVjdXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGV4ZWN1
dGUgZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9y
aWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQorICAgICAgICBpZiAoIXN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7Cisg
ICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGRhdGFi
YXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRp
ZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQog
Ci0gICAgU1FMaXRlU3RhdGVtZW50IG9yaWdpblN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRF
IEZST00gT3JpZ2lucyBXSEVSRSBvcmlnaW49PyIpOwotICAgIGlmIChvcmlnaW5TdGF0ZW1lbnQu
cHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRv
IHByZXBhcmUgZGVsZXRpb24gb2Ygb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9yaWdpbi0+ZGF0
YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgb3JpZ2luU3RhdGVtZW50KG1fZGF0YWJhc2UsICJE
RUxFVEUgRlJPTSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGlmIChvcmlnaW5T
dGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7CisgICAgICAgICAgICBMT0dfRVJS
T1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIi
LCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgb3JpZ2luU3RhdGVtZW50LmJpbmRUZXh0KDEs
IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOworICAgICAgICBvcmlnaW5TdGF0ZW1lbnQu
YmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiAKLSAgICBpZiAoIW9y
aWdpblN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIGV4ZWN1dGUgZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20g
dHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQorICAgICAgICBpZiAoIW9yaWdpblN0YXRlbWVudC5leGVj
dXRlQ29tbWFuZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRl
IGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmln
aW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQogCi0gICAgU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRW1wdHlEYXRh
YmFzZURpcmVjdG9yeShvcmlnaW5QYXRoKG9yaWdpbikpOworICAgICAgICBTUUxpdGVGaWxlU3lz
dGVtOjpkZWxldGVFbXB0eURhdGFiYXNlRGlyZWN0b3J5KG9yaWdpblBhdGgob3JpZ2luKSk7CiAK
LSAgICBSZWZQdHI8U2VjdXJpdHlPcmlnaW4+IG9yaWdpblBvc3NpYmx5TGFzdFJlZmVyZW5jZSA9
IG9yaWdpbjsKLSAgICB7Ci0gICAgICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3Rh
TWFwR3VhcmQpOworICAgICAgICBSZWZQdHI8U2VjdXJpdHlPcmlnaW4+IG9yaWdpblBvc3NpYmx5
TGFzdFJlZmVyZW5jZSA9IG9yaWdpbjsKICAgICAgICAgbV9xdW90YU1hcC0+cmVtb3ZlKG9yaWdp
bik7CiAKLSAgICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9j
a2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKLSAgICAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyKCku
cmVtb3ZlT3JpZ2luKG9yaWdpbik7CisgICAgICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygp
LnJlbW92ZU9yaWdpbihvcmlnaW4pOwogCiAgICAgICAgIC8vIElmIHdlIHJlbW92ZWQgdGhlIGxh
c3Qgb3JpZ2luLCBkbyBzb21lIGFkZGl0aW9uYWwgZGVsZXRpb24uCiAgICAgICAgIGlmIChtX3F1
b3RhTWFwLT5pc0VtcHR5KCkpIHsKQEAgLTY3NywyNyArNzM3LDM0IEBAIHZvaWQgRGF0YWJhc2VU
cmFja2VyOjpkZWxldGVPcmlnaW4oU2VjdXIKICAgICAgICAgICAgU1FMaXRlRmlsZVN5c3RlbTo6
ZGVsZXRlRGF0YWJhc2VGaWxlKHRyYWNrZXJEYXRhYmFzZVBhdGgoKSk7CiAgICAgICAgICAgIFNR
TGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZUVtcHR5RGF0YWJhc2VEaXJlY3RvcnkobV9kYXRhYmFzZURp
cmVjdG9yeVBhdGgpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgaWYgKG1fY2xpZW50KSB7Ci0g
ICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdpbihvcmlnaW4pOwotICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YWJhc2VOYW1lcy5zaXplKCk7ICsraSkKLSAg
ICAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeURhdGFiYXNlKG9yaWdpbiwgZGF0
YWJhc2VOYW1lc1tpXSk7CisgICAgICAgIGlmIChtX2NsaWVudCkgeworICAgICAgICAgICAgbV9j
bGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3JpZ2luKG9yaWdpbik7CisgICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YWJhc2VOYW1lcy5zaXplKCk7ICsraSkKKyAgICAgICAg
ICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlEYXRhYmFzZShvcmlnaW4sIGRhdGFi
YXNlTmFtZXNbaV0pOworICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRlRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBu
YW1lKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotICAgIG9w
ZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkK
LSAgICAgICAgcmV0dXJuOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNl
KG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwor
ICAgICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgICAgICByZXR1cm47Cisg
ICAgfQogCisgICAgLy8gV2UgZHJvcCB0aGUgbG9jayBoZXJlIGJlY2F1c2UgaG9sZGluZyBsb2Nr
cyBkdXJpbmcgYSBjYWxsIHRvIGRlbGV0ZURhdGFiYXNlRmlsZSB3aWxsIGRlYWRsb2NrLgogICAg
IGlmICghZGVsZXRlRGF0YWJhc2VGaWxlKG9yaWdpbiwgbmFtZSkpIHsKICAgICAgICAgTE9HX0VS
Uk9SKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgZm9yIGRhdGFiYXNlICVzIGluIG9yaWdpbiAlcyIs
IG5hbWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWko
KS5kYXRhKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gVG8gc2F0aXNmeSB0
aGUgbG9jayBoaWVyYXJjaHksIHdlIGhhdmUgdG8gbG9jayB0aGUgb3JpZ2luUXVvdGFNYW5hZ2Vy
IGJlZm9yZSBtX2RhdGFiYXNlR3VhcmQgaWYgdGhlcmUncyBhbnkgY2hhbmNlIHdlJ2xsIHRvIGxv
Y2sgYm90aC4KKyAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJMb2Nr
ZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZSht
X2RhdGFiYXNlR3VhcmQpOworCiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFi
YXNlLCAiREVMRVRFIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT8iKTsK
ICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewogICAgICAgICBM
T0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIGRhdGFiYXNlICVzIGZyb20g
b3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG5hbWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbi0+ZGF0
YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwpAQCAtNzEyLDEwICs3NzksNyBAQCB2
b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2UoU2VjCiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAKLSAgICB7Ci0gICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IHF1b3Rh
TWFuYWdlckxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Ci0gICAgICAgIG9yaWdpblF1b3Rh
TWFuYWdlcigpLnJlbW92ZURhdGFiYXNlKG9yaWdpbiwgbmFtZSk7Ci0gICAgfQorICAgIG9yaWdp
blF1b3RhTWFuYWdlck5vTG9jaygpLnJlbW92ZURhdGFiYXNlKG9yaWdpbiwgbmFtZSk7CiAKICAg
ICBpZiAobV9jbGllbnQpIHsKICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3Jp
Z2luKG9yaWdpbik7CkBAIC03MjMsMjYgKzc4NywzMSBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6
ZGVsZXRlRGF0YWJhc2UoU2VjCiAgICAgfQogfQogCisvLyBkZWxldGVEYXRhYmFzZUZpbGUgaGFz
IHRvIHJlbGVhc2UgbG9ja3MgYmV0d2VlbiBsb29raW5nIHVwIHRoZSBsaXN0IG9mIGRhdGFiYXNl
cyB0byBjbG9zZSBhbmQgY2xvc2luZyB0aGVtLiAgV2hpbGUgdGhpcyBpcyBpbiBwcm9ncmVzcywg
dGhlIGNhbGxlcgorLy8gaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIG5vIG5ldyBkYXRh
YmFzZXMgYXJlIG9wZW5lZCBpbiB0aGUgZmlsZSB0byBiZSBkZWxldGVkLgogYm9vbCBEYXRhYmFz
ZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlRmlsZShTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25z
dCBTdHJpbmcmIG5hbWUpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVh
ZCk7CisgICAgTE9HX0VSUk9SKCJpbiBkZWxldGVEYXRhYmFzZUZpbGUoJXMsJXMpIiwKKyAgICAg
IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCksIG5hbWUuYXNjaWko
KS5kYXRhKCkpOwogICAgIFN0cmluZyBmdWxsUGF0aCA9IGZ1bGxQYXRoRm9yRGF0YWJhc2Uob3Jp
Z2luLCBuYW1lLCBmYWxzZSk7Ci0gICAgaWYgKGZ1bGxQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAo
ZnVsbFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIExPR19FUlJPUigib3V0IFtlbXB0eV0gZGVs
ZXRlRGF0YWJhc2VGaWxlKCVzLCVzKSIsCisgICAgICAgICAgb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSwgbmFtZS5hc2NpaSgpLmRhdGEoKSk7CiAgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KIAogICAgIFZlY3RvcjxSZWZQdHI8RGF0YWJhc2U+ID4gZGVsZXRl
ZERhdGFiYXNlczsKIAotICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gaG9sZCB0aGUgbV9vcGVuRGF0
YWJhc2VNYXBHdWFyZCBtdXRleCB3aGVuIGNhbGxpbmcKKyAgICAvLyBNYWtlIHN1cmUgbm90IHRv
IGhvbGQgdGhlIGFueSBsb2NrcyB3aGVuIGNhbGxpbmcKICAgICAvLyBEYXRhYmFzZTo6bWFya0Fz
RGVsZXRlZEFuZENsb3NlKCksIHNpbmNlIHRoYXQgY2FuIGNhdXNlIGEgZGVhZGxvY2sKICAgICAv
LyBkdXJpbmcgdGhlIHN5bmNocm9ub3VzIERhdGFiYXNlVGhyZWFkIGNhbGwgaXQgdHJpZ2dlcnMu
Ci0KICAgICB7CiAgICAgICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVu
RGF0YWJhc2VNYXBHdWFyZCk7CiAgICAgICAgIGlmIChtX29wZW5EYXRhYmFzZU1hcCkgewogICAg
ICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRhYmFzZXMsIGxldHMgY2hlY2sgaWYg
dGhleSBhcmUgZm9yIHRoaXMgb3JpZ2luLgogICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBu
YW1lTWFwID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChvcmlnaW4pOwogICAgICAgICAgICAgaWYg
KG5hbWVNYXAgJiYgbmFtZU1hcC0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUg
YXJlIHNvbWUgb3BlbiBkYXRhYmFzZXMgZm9yIHRoaXMgb3JpZ2luLCBsZXRzIGNoZWNrCisgICAg
ICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRhYmFzZXMgZm9yIHRoaXMgb3Jp
Z2luLCBsZXQncyBjaGVjawogICAgICAgICAgICAgICAgIC8vIGlmIHRoZXkgYXJlIHRoaXMgZGF0
YWJhc2UgYnkgbmFtZS4KICAgICAgICAgICAgICAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQg
PSBuYW1lTWFwLT5nZXQobmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFiYXNlU2V0ICYm
IGRhdGFiYXNlU2V0LT5zaXplKCkpIHsKQEAgLTc1OCwxMiArODI3LDEzIEBAIGJvb2wgRGF0YWJh
c2VUcmFja2VyOjpkZWxldGVEYXRhYmFzZUZpbGUKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgZGVsZXRlZERhdGFiYXNlcy5zaXplKCk7ICsraSkKICAgICAgICAgZGVsZXRlZERhdGFiYXNl
c1tpXS0+bWFya0FzRGVsZXRlZEFuZENsb3NlKCk7CiAKKyAgICBMT0dfRVJST1IoIm91dCBbZnVs
bF0gZGVsZXRlRGF0YWJhc2VGaWxlKCVzLCVzKSIsCisgICAgICBvcmlnaW4tPmRhdGFiYXNlSWRl
bnRpZmllcigpLmFzY2lpKCkuZGF0YSgpLCBuYW1lLmFzY2lpKCkuZGF0YSgpKTsKICAgICByZXR1
cm4gU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRGF0YWJhc2VGaWxlKGZ1bGxQYXRoKTsKIH0KIAog
dm9pZCBEYXRhYmFzZVRyYWNrZXI6OnNldENsaWVudChEYXRhYmFzZVRyYWNrZXJDbGllbnQqIGNs
aWVudCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKICAgICBt
X2NsaWVudCA9IGNsaWVudDsKIH0KIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJh
Y2tlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAko
cmV2aXNpb24gNTUxNzApCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgJKHdv
cmtpbmcgY29weSkKQEAgLTYwLDkgKzYwLDExIEBAIHN0cnVjdCBTZWN1cml0eU9yaWdpblRyYWl0
czsKIGNsYXNzIERhdGFiYXNlVHJhY2tlciA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiBwdWJsaWM6
CiAgICAgc3RhdGljIERhdGFiYXNlVHJhY2tlciYgdHJhY2tlcigpOwotICAgIC8vIEZJWE1FOiBE
dWUgdG8gd29ya2VycyBoYXZpbmcgbXVsdGlwbGUgdGhyZWFkcyBpbiBhIHNpbmdsZSBwcm9jZXNz
IHNoYXJpbmcKLSAgICAvLyBhIERhdGFiYXNlVHJhY2tlciwgdGhpcyBzaW5nbGV0b24gd2lsbCBo
YXZlIHRvIGJlIHN5bmNocm9uaXplZCBvciBtb3ZlZAotICAgIC8vIHRvIFRMUy4KKyAgICAvLyBU
aGlzIHNpbmdsZXRvbiB3aWxsIHBvdGVudGlhbGx5IGJlIHVzZWQgZnJvbSBtdWx0aXBsZSB3b3Jr
ZXIgdGhyZWFkcyBhbmQgdGhlIHBhZ2UncyBjb250ZXh0IHRocmVhZCBzaW11bHRhbmVvdXNseS4g
IFRvIGtlZXAgdGhpcyBzYWZlLCBpdCdzCisgICAgLy8gY3VycmVudGx5IHVzaW5nIDQgbG9ja3Mu
ICBJbiBvcmRlciB0byBhdm9pZCBkZWFkbG9jayB3aGVuIHRha2luZyBtdWx0aXBsZSBsb2Nrcywg
eW91IG11c3QgdGFrZSB0aGVtIGluIHRoZSBjb3JyZWN0IG9yZGVyOgorICAgIC8vIG9yaWdpblF1
b3RhTWFuYWdlcigpIGJlZm9yZSBtX2RhdGFiYXNlR3VhcmQgb3IgbV9vcGVuRGF0YWJhc2VNYXBH
dWFyZAorICAgIC8vIG1fZGF0YWJhc2VHdWFyZCBiZWZvcmUgbV9vcGVuRGF0YWJhc2VNYXBHdWFy
ZAorICAgIC8vIG5vdGlmaWNhdGlvbk11dGV4KCkgaXMgY3VycmVudGx5IGluZGVwZW5kZW50IG9m
IHRoZSBvdGhlciBsb2Nrcy4KIAogICAgIGJvb2wgY2FuRXN0YWJsaXNoRGF0YWJhc2UoU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCosIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkaXNw
bGF5TmFtZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKTsKICAgICB2b2lkIHNldERhdGFi
YXNlRGV0YWlscyhTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3Ry
aW5nJiBkaXNwbGF5TmFtZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKTsKQEAgLTg3LDcg
Kzg5LDcgQEAgcHJpdmF0ZToKICNpZiAhUExBVEZPUk0oQ0hST01JVU0pCiBwdWJsaWM6CiAgICAg
dm9pZCBzZXREYXRhYmFzZURpcmVjdG9yeVBhdGgoY29uc3QgU3RyaW5nJik7Ci0gICAgY29uc3Qg
U3RyaW5nJiBkYXRhYmFzZURpcmVjdG9yeVBhdGgoKSBjb25zdDsKKyAgICBTdHJpbmcgZGF0YWJh
c2VEaXJlY3RvcnlQYXRoKCkgY29uc3Q7CiAKICAgICB2b2lkIG9yaWdpbnMoVmVjdG9yPFJlZlB0
cjxTZWN1cml0eU9yaWdpbj4gPiYgcmVzdWx0KTsKICAgICBib29sIGRhdGFiYXNlTmFtZXNGb3JP
cmlnaW4oU2VjdXJpdHlPcmlnaW4qLCBWZWN0b3I8U3RyaW5nPiYgcmVzdWx0KTsKQEAgLTExNCw2
ICsxMTYsMTMgQEAgcHVibGljOgogICAgIGJvb2wgaGFzRW50cnlGb3JPcmlnaW4oU2VjdXJpdHlP
cmlnaW4qKTsKIAogcHJpdmF0ZToKKyAgICBPcmlnaW5RdW90YU1hbmFnZXImIG9yaWdpblF1b3Rh
TWFuYWdlck5vTG9jaygpOworICAgIGJvb2wgaGFzRW50cnlGb3JPcmlnaW5Ob0xvY2soU2VjdXJp
dHlPcmlnaW4qIG9yaWdpbik7CisgICAgU3RyaW5nIGZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2so
U2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZEb2VzTm90
RXhpc3QpOworICAgIGJvb2wgZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayhTZWN1cml0eU9y
aWdpbiogb3JpZ2luLCBWZWN0b3I8U3RyaW5nPiYgcmVzdWx0VmVjdG9yKTsKKyAgICB1bnNpZ25l
ZCBsb25nIGxvbmcgdXNhZ2VGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbik7
CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3Jp
Z2luKiBvcmlnaW4pOworCiAgICAgU3RyaW5nIHRyYWNrZXJEYXRhYmFzZVBhdGgoKSBjb25zdDsK
ICAgICB2b2lkIG9wZW5UcmFja2VyRGF0YWJhc2UoYm9vbCBjcmVhdGVJZkRvZXNOb3RFeGlzdCk7
CiAKQEAgLTEyNiwxMCArMTM1LDExIEBAIHByaXZhdGU6CiAKICAgICBib29sIGRlbGV0ZURhdGFi
YXNlRmlsZShTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgbmFtZSk7CiAKKyAgICAvLyBU
aGlzIGxvY2sgcHJvdGVjdHMgbV9kYXRhYmFzZSwgbV9xdW90YU1hcCwgYW5kIG1fcHJvcG9zZWRE
YXRhYmFzZXMuCisgICAgTXV0ZXggbV9kYXRhYmFzZUd1YXJkOwogICAgIFNRTGl0ZURhdGFiYXNl
IG1fZGF0YWJhc2U7CiAKICAgICB0eXBlZGVmIEhhc2hNYXA8UmVmUHRyPFNlY3VyaXR5T3JpZ2lu
PiwgdW5zaWduZWQgbG9uZyBsb25nLCBTZWN1cml0eU9yaWdpbkhhc2g+IFF1b3RhTWFwOwotICAg
IE11dGV4IG1fcXVvdGFNYXBHdWFyZDsKICAgICBtdXRhYmxlIE93blB0cjxRdW90YU1hcD4gbV9x
dW90YU1hcDsKIAogICAgIE93blB0cjxPcmlnaW5RdW90YU1hbmFnZXI+IG1fcXVvdGFNYW5hZ2Vy
OwpAQCAtMTM4LDExICsxNDgsOCBAQCBwcml2YXRlOgogCiAgICAgRGF0YWJhc2VUcmFja2VyQ2xp
ZW50KiBtX2NsaWVudDsKIAotICAgIHN0ZDo6cGFpcjxTZWN1cml0eU9yaWdpbiosIERhdGFiYXNl
RGV0YWlscz4qIG1fcHJvcG9zZWREYXRhYmFzZTsKLQotI2lmbmRlZiBOREVCVUcKLSAgICBUaHJl
YWRJZGVudGlmaWVyIG1fdGhyZWFkOwotI2VuZGlmCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8U2Vj
dXJpdHlPcmlnaW4qLCBEYXRhYmFzZURldGFpbHM+IFByb3Bvc2VkRGF0YWJhc2U7CisgICAgSGFz
aFNldDxQcm9wb3NlZERhdGFiYXNlKj4gbV9wcm9wb3NlZERhdGFiYXNlczsKIAogICAgIHN0YXRp
YyB2b2lkIHNjaGVkdWxlRm9yTm90aWZpY2F0aW9uKCk7CiAgICAgc3RhdGljIHZvaWQgbm90aWZ5
RGF0YWJhc2VzQ2hhbmdlZCh2b2lkKik7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVv
dGFNYW5hZ2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFN
YW5hZ2VyLmNwcAkocmV2aXNpb24gNTUxNzApCisrKyBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVv
dGFNYW5hZ2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsMTggQEAgT3JpZ2luUXVv
dGFNYW5hZ2VyOjpPcmlnaW5RdW90YU1hbmFnZXIoKQogewogfQogCitib29sIE9yaWdpblF1b3Rh
TWFuYWdlcjo6dHJ5TG9jaygpCit7CisgICAgYm9vbCBsb2NrZWQgPSBtX3VzYWdlUmVjb3JkR3Vh
cmQudHJ5TG9jaygpOworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAobG9ja2VkKQorICAgICAgICBt
X3VzYWdlUmVjb3JkR3VhcmRMb2NrZWQgPSB0cnVlOworICAgIGVsc2UKKyAgICAgICAgQVNTRVJU
KG1fdXNhZ2VSZWNvcmRHdWFyZExvY2tlZCk7CisjZW5kaWYKKyAgICByZXR1cm4gbG9ja2VkOwor
fQorCiB2b2lkIE9yaWdpblF1b3RhTWFuYWdlcjo6bG9jaygpCiB7CiAgICAgbV91c2FnZVJlY29y
ZEd1YXJkLmxvY2soKTsKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmgJKHJl
dmlzaW9uIDU1MTcwKQorKysgV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oCSh3
b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSw3IEBAIGNsYXNzIE9yaWdpblF1b3RhTWFuYWdlciA6
IHB1YmxpYyBOb25jb3AKIHB1YmxpYzoKICAgICBPcmlnaW5RdW90YU1hbmFnZXIoKTsKIAorICAg
IGJvb2wgdHJ5TG9jaygpOwogICAgIHZvaWQgbG9jaygpOwogICAgIHZvaWQgdW5sb2NrKCk7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49337</attachid>
            <date>2010-02-23 16:12:08 -0800</date>
            <delta_ts>2010-03-11 16:23:09 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34991-20100223161207.patch</filename>
            <type>text/plain</type>
            <size>44743</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTE3NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzIgQEAKKzIwMTAtMDItMjMgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBS
ZWZhY3RvciBEYXRhYmFzZVRyYWNrZXIuY3BwIGZvciB0aHJlYWQgc2FmZXR5CisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDk5MQorCisgICAgICAgIFRo
aXMgZW5hYmxlcyBjYWxsaW5nIGludG8gRGF0YWJhc2VUcmFja2VyIGZyb20gbXVsdGlwbGUgY29u
dGV4dCB0aHJlYWRzLAorICAgICAgICBhcyB3aWxsIGhhcHBlbiBvbmNlIFdvcmtlcnMgY2FuIGFj
Y2VzcyB0aGUgRGF0YWJhc2UuICBJdCByZXF1aXJlZCBhIGZhaXIKKyAgICAgICAgYW1vdW50IG9m
IHJlc2h1ZmZsaW5nIG9mIGxvY2tzLiAgSSBlbmRlZCB1cCBzcGxpdHRpbmcgdGhlIHB1YmxpYwor
ICAgICAgICBpbnRlcmZhY2UgW2NhbGxzIHRoYXQgdGFrZSBsb2NrcyBhbmQgY2FsbCBwcml2YXRl
IGZ1bmN0aW9uc10gZnJvbSB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIFtjYWxscyB0aGF0
IGFzc2VydCB0aGF0IGxvY2tzIGFyZSBhbHJlYWR5IGhlbGRdIGluIG9yZGVyCisgICAgICAgIHRv
IGF2b2lkIGxvY2sgY29uZmxpY3RzLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4KKworICAgICAg
ICAqIHBsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpT
UUxpdGVEYXRhYmFzZTo6U1FMaXRlRGF0YWJhc2UpOgorICAgICAgICAqIHBsYXRmb3JtL3NxbC9T
UUxpdGVEYXRhYmFzZS5oOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OnNxbGl0
ZTNIYW5kbGUpOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OnNoYXJhYmxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpzZXRTaGFyYWJsZSk6CisgICAgICAg
ICogc3RvcmFnZS9EYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6bWFy
a0FzRGVsZXRlZEFuZENsb3NlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpjbG9zZSk6
CisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZS5oOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJh
c2VUYXNrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlQ2xvc2VUYXNrOjpkb1BlcmZv
cm1UYXNrKToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCk6CisgICAgICAgICogc3Rv
cmFnZS9EYXRhYmFzZVRyYWNrZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFj
a2VyOjpvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2spOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJh
c2VUcmFja2VyOjpvcmlnaW5RdW90YU1hbmFnZXIpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJh
c2VUcmFja2VyOjpEYXRhYmFzZVRyYWNrZXIpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VU
cmFja2VyOjpzZXREYXRhYmFzZURpcmVjdG9yeVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6RGF0
YWJhc2VUcmFja2VyOjpkYXRhYmFzZURpcmVjdG9yeVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6
RGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0YWJhc2VQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmNhbkVzdGFibGlzaERhdGFiYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW5Ob0xvY2spOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvck9yaWdpbik6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yRGF0YWJhc2UpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpvcmlnaW5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2UpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpwb3B1bGF0ZU9yaWdpbnMpOgorICAgICAgICAoV2Vi
Q29yZTo6RGF0YWJhc2VUcmFja2VyOjpvcmlnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayk6CisgICAgICAgIChXZWJD
b3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW4pOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpkZXRhaWxzRm9yTmFtZUFuZE9yaWdpbik6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGV0YWlscyk6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbk5vTG9jayk6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yT3JpZ2luKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cXVvdGFGb3JPcmlnaW5Ob0xvY2spOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpxdW90YUZvck9yaWdpbik6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnNldFF1b3RhKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6YWRkRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VU
cmFja2VyOjpkZWxldGVBbGxEYXRhYmFzZXMpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VU
cmFja2VyOjpkZWxldGVPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2Vy
OjpkZWxldGVEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRl
bGV0ZURhdGFiYXNlRmlsZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnNl
dENsaWVudCk6CisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKyAgICAgICAg
KiBzdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpPcmln
aW5RdW90YU1hbmFnZXI6OnRyeUxvY2spOgorICAgICAgICAqIHN0b3JhZ2UvT3JpZ2luUXVvdGFN
YW5hZ2VyLmg6CisKIDIwMTAtMDItMjMgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBwbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRpbSBIYXRjaGVyIGFuZCBQYXZlbCBGZWxkbWFuLgpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkocmV2aXNpb24gNTUx
NzApCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ4LDYgKzQ4LDcgQEAgU1FMaXRlRGF0YWJhc2U6OlNRTGl0ZURhdGFiYXNlKCkK
ICAgICA6IG1fZGIoMCkKICAgICAsIG1fcGFnZVNpemUoLTEpCiAgICAgLCBtX3RyYW5zYWN0aW9u
SW5Qcm9ncmVzcyhmYWxzZSkKKyAgICAsIG1fc2hhcmFibGUoZmFsc2UpCiAgICAgLCBtX29wZW5p
bmdUaHJlYWQoMCkKIHsKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFi
YXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2Uu
aAkocmV2aXNpb24gNTUxNzApCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFz
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC05Nyw3ICs5Nyw3IEBAIHB1YmxpYzoKICAgICBjb25zdCBj
aGFyKiBsYXN0RXJyb3JNc2coKTsKICAgICAKICAgICBzcWxpdGUzKiBzcWxpdGUzSGFuZGxlKCkg
Y29uc3QgewotICAgICAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fb3BlbmluZ1RocmVh
ZCk7CisgICAgICAgIEFTU0VSVChtX3NoYXJhYmxlIHx8IGN1cnJlbnRUaHJlYWQoKSA9PSBtX29w
ZW5pbmdUaHJlYWQpOwogICAgICAgICByZXR1cm4gbV9kYjsKICAgICB9CiAgICAgCkBAIC0xMDgs
NiArMTA4LDEyIEBAIHB1YmxpYzoKICAgICB2b2lkIHVubG9jaygpOwogICAgIGJvb2wgaXNBdXRv
Q29tbWl0T24oKSBjb25zdDsKIAorICAgIC8vIFNldCB0aGlzIGZsYWcgdG8gYWxsb3cgYWNjZXNz
IGZyb20gbXVsdGlwbGUgdGhyZWFkcy4gIE5vdCBhbGwgbXVsdGktdGhyZWFkZWQgYWNjZXNzZXMg
YXJlIHNhZmUhCisgICAgLy8gU2VlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jdnN0cmFjL3dpa2k/
cD1NdWx0aVRocmVhZGluZyBmb3IgbW9yZSBpbmZvLCBhbmQgeW91IG11c3QgYmUgcnVubmluZyB3
aXRoIGNvbXBpbGUgZmxhZ3MgYW5kIFNRTGl0ZSB2ZXJzaW9uIGFwcHJvcHJpYXRlCisgICAgLy8g
dG8geW91ciBjcm9zcy10aHJlYWQgdXNlcy4KKyAgICBib29sIHNoYXJhYmxlKCkgeyByZXR1cm4g
bV9zaGFyYWJsZTsgfQorICAgIHZvaWQgc2V0U2hhcmFibGUoYm9vbCBzaGFyYWJsZSkgeyBtX3No
YXJhYmxlID0gc2hhcmFibGU7IH0KKwogcHJpdmF0ZToKICAgICBzdGF0aWMgaW50IGF1dGhvcml6
ZXJGdW5jdGlvbih2b2lkKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNo
YXIqLCBjb25zdCBjaGFyKik7CiAKQEAgLTEyMCw2ICsxMjYsNyBAQCBwcml2YXRlOgogICAgIGlu
dCBtX3BhZ2VTaXplOwogICAgIAogICAgIGJvb2wgbV90cmFuc2FjdGlvbkluUHJvZ3Jlc3M7Cisg
ICAgYm9vbCBtX3NoYXJhYmxlOwogICAgIAogICAgIE11dGV4IG1fYXV0aG9yaXplckxvY2s7CiAg
ICAgUmVmUHRyPERhdGFiYXNlQXV0aG9yaXplcj4gbV9hdXRob3JpemVyOwpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0
YWJhc2UuY3BwCShyZXZpc2lvbiA1NTE3MCkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTM1Miw2ICszNTIsMTAgQEAgdm9pZCBEYXRhYmFzZTo6bWFy
a0FzRGVsZXRlZEFuZENsb3NlKCkKIAogICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+ZGF0
YWJhc2VUaHJlYWQoKS0+c2NoZWR1bGVJbW1lZGlhdGVUYXNrKHRhc2sucmVsZWFzZSgpKTsKICAg
ICBzeW5jaHJvbml6ZXIud2FpdEZvclRhc2tDb21wbGV0aW9uKCk7CisKKyAgICAvLyBEYXRhYmFz
ZUNsb3NlVGFzayB0ZWxscyBEYXRhYmFzZTo6Y2xvc2Ugbm90IHRvIGRvIHRoaXMsIHNvIHRoYXQg
d2UgY2FuIGdldCBpdCBvdmVyIHdpdGggaGVyZS4KKyAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQtPnJlbW92ZU9wZW5EYXRhYmFzZSh0aGlzKTsKKyAgICBEYXRhYmFzZVRyYWNrZXI6OnRyYWNr
ZXIoKS5yZW1vdmVPcGVuRGF0YWJhc2UodGhpcyk7CiB9CiAKIGNsYXNzIENvbnRleHRSZW1vdmVP
cGVuRGF0YWJhc2VUYXNrIDogcHVibGljIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2sgewpA
QCAtMzc4LDcgKzM4Miw3IEBAIHByaXZhdGU6CiAgICAgUmVmUHRyPERhdGFiYXNlPiBtX2RhdGFi
YXNlOwogfTsKIAotdm9pZCBEYXRhYmFzZTo6Y2xvc2UoKQordm9pZCBEYXRhYmFzZTo6Y2xvc2Uo
Ym9vbCByZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0KQogewogICAgIFJlZlB0cjxEYXRhYmFzZT4g
cHJvdGVjdCA9IHRoaXM7CiAKQEAgLTQwNyw3ICs0MTEsMTAgQEAgdm9pZCBEYXRhYmFzZTo6Y2xv
c2UoKQogICAgIH0KIAogICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+ZGF0YWJhc2VUaHJl
YWQoKS0+dW5zY2hlZHVsZURhdGFiYXNlVGFza3ModGhpcyk7Ci0gICAgbV9zY3JpcHRFeGVjdXRp
b25Db250ZXh0LT5wb3N0VGFzayhDb250ZXh0UmVtb3ZlT3BlbkRhdGFiYXNlVGFzazo6Y3JlYXRl
KHRoaXMpKTsKKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjb250ZXh0IGluaXRpYXRlZCB0aGlz
IGNhbGwsIHNvIGl0J2xsIHRha2UgY2FyZSBvZiB0aGUgY2xlYW51cCBieSBpdHNlbGYsIHN5bmNo
cm9ub3VzbHkuICBUaGlzIGxldHMgaXQgbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgLy8gY2xlYW51
cCBjb21wbGV0ZXMgYnkgYSBnaXZlbiB0aW1lLgorICAgIGlmIChyZW1vdmVEYXRhYmFzZUZyb21D
b250ZXh0KQorICAgICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKENvbnRl
eHRSZW1vdmVPcGVuRGF0YWJhc2VUYXNrOjpjcmVhdGUodGhpcykpOwogfQogCiB2b2lkIERhdGFi
YXNlOjpzdG9wKCkKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCShyZXZpc2lvbiA1NTE3MCkKKysrIFdlYkNv
cmUvc3RvcmFnZS9EYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNyArMTA1LDcgQEAg
cHVibGljOgogICAgIHZvaWQgbWFya0FzRGVsZXRlZEFuZENsb3NlKCk7CiAgICAgYm9vbCBkZWxl
dGVkKCkgY29uc3QgeyByZXR1cm4gbV9kZWxldGVkOyB9CiAKLSAgICB2b2lkIGNsb3NlKCk7Cisg
ICAgdm9pZCBjbG9zZShib29sIHJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQpOwogICAgIGJvb2wg
b3BlbmVkKCkgY29uc3QgeyByZXR1cm4gbV9vcGVuZWQ7IH0KIAogICAgIHZvaWQgc3RvcCgpOwpJ
bmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAJKHJldmlzaW9uIDU1MTcwKQorKysgV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExNyw3ICsxMTcs
OCBAQCBEYXRhYmFzZUNsb3NlVGFzazo6RGF0YWJhc2VDbG9zZVRhc2soRGF0CiAKIHZvaWQgRGF0
YWJhc2VDbG9zZVRhc2s6OmRvUGVyZm9ybVRhc2soKQogewotICAgIGRhdGFiYXNlKCktPmNsb3Nl
KCk7CisgICAgLy8gVGVsbCB0aGUgZGF0YWJhc2Ugbm90IHRvIGNhbGwgYmFjayB0byB0aGUgY29u
dGV4dCB0aHJlYWQ7IHdlJ2xsIGhhbmRsZSBpdC4KKyAgICBkYXRhYmFzZSgpLT5jbG9zZShmYWxz
ZSk7CiB9CiAKICNpZm5kZWYgTkRFQlVHCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VU
aHJlYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5j
cHAJKHJldmlzaW9uIDU1MTcwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTEzLDcgKzExMyw3IEBAIHZvaWQqIERhdGFiYXNlVGhyZWFk
OjpkYXRhYmFzZVRocmVhZCgpCiAgICAgICAgIG9wZW5TZXRDb3B5LnN3YXAobV9vcGVuRGF0YWJh
c2VTZXQpOwogICAgICAgICBEYXRhYmFzZVNldDo6aXRlcmF0b3IgZW5kID0gb3BlblNldENvcHku
ZW5kKCk7CiAgICAgICAgIGZvciAoRGF0YWJhc2VTZXQ6Oml0ZXJhdG9yIGl0ID0gb3BlblNldENv
cHkuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAoKml0KS0+Y2xvc2UoKTsK
KyAgICAgICAgICAgKCppdCktPmNsb3NlKHRydWUpOwogICAgIH0KIAogICAgIC8vIERldGFjaCB0
aGUgdGhyZWFkIHNvIGl0cyByZXNvdXJjZXMgYXJlIG5vIGxvbmdlciBvZiBhbnkgY29uY2VybiB0
byBhbnlvbmUgZWxzZQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHJldmlz
aW9uIDU1MTcwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUxLDEzICs1MSwxOSBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLU9yaWdpblF1b3RhTWFuYWdlciYgRGF0YWJhc2VUcmFja2VyOjpv
cmlnaW5RdW90YU1hbmFnZXIoKQorT3JpZ2luUXVvdGFNYW5hZ2VyJiBEYXRhYmFzZVRyYWNrZXI6
Om9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpCiB7Ci0gICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAg
ICAgQVNTRVJUKG1fcXVvdGFNYW5hZ2VyKTsKICAgICByZXR1cm4gKm1fcXVvdGFNYW5hZ2VyOwog
fQogCitPcmlnaW5RdW90YU1hbmFnZXImIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5h
Z2VyKCkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsK
KyAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKKyAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2VyTm9M
b2NrKCk7Cit9CisKIERhdGFiYXNlVHJhY2tlciYgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyKCkK
IHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERhdGFiYXNlVHJhY2tlciwgdHJhY2tlciwgKCkp
OwpAQCAtNjYsMzYgKzcyLDI5IEBAIERhdGFiYXNlVHJhY2tlciYgRGF0YWJhc2VUcmFja2VyOjp0
cmFja2UKIAogRGF0YWJhc2VUcmFja2VyOjpEYXRhYmFzZVRyYWNrZXIoKQogICAgIDogbV9jbGll
bnQoMCkKLSAgICAsIG1fcHJvcG9zZWREYXRhYmFzZSgwKQotI2lmbmRlZiBOREVCVUcKLSAgICAs
IG1fdGhyZWFkKGN1cnJlbnRUaHJlYWQoKSkKLSNlbmRpZgogewogICAgIFNRTGl0ZUZpbGVTeXN0
ZW06OnJlZ2lzdGVyU1FMaXRlVkZTKCk7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXRE
YXRhYmFzZURpcmVjdG9yeVBhdGgoY29uc3QgU3RyaW5nJiBwYXRoKQogewotICAgIEFTU0VSVChj
dXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwogICAgIEFTU0VSVCghbV9kYXRhYmFzZS5pc09w
ZW4oKSk7CiAgICAgbV9kYXRhYmFzZURpcmVjdG9yeVBhdGggPSBwYXRoOwogfQogCi1jb25zdCBT
dHJpbmcmIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKCkgY29uc3QKK1N0
cmluZyBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlRGlyZWN0b3J5UGF0aCgpIGNvbnN0CiB7Ci0g
ICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgcmV0dXJuIG1fZGF0
YWJhc2VEaXJlY3RvcnlQYXRoOworICAgIHJldHVybiBtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aC50
aHJlYWRzYWZlQ29weSgpOwogfQogCiBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0
YWJhc2VQYXRoKCkgY29uc3QKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhy
ZWFkKTsKICAgICByZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFt
ZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aCwgIkRhdGFiYXNlcy5kYiIpOwogfQogCiB2
b2lkIERhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZShib29sIGNyZWF0ZUlmRG9l
c05vdEV4aXN0KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwor
ICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAKICAgICBpZiAobV9kYXRh
YmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMTA2LDY3ICsxMDUsODcgQEAgdm9p
ZCBEYXRhYmFzZVRyYWNrZXI6Om9wZW5UcmFja2VyRGF0YWJhcwogCiAgICAgaWYgKCFtX2RhdGFi
YXNlLm9wZW4oZGF0YWJhc2VQYXRoKSkgewogICAgICAgICAvLyBGSVhNRTogV2hhdCBkbyBkbyBo
ZXJlPworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlUGF0aCAlcy4i
LCBkYXRhYmFzZVBhdGguYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQor
ICAgIG1fZGF0YWJhc2Uuc2V0U2hhcmFibGUodHJ1ZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLnRh
YmxlRXhpc3RzKCJPcmlnaW5zIikpIHsKICAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1dGVD
b21tYW5kKCJDUkVBVEUgVEFCTEUgT3JpZ2lucyAob3JpZ2luIFRFWFQgVU5JUVVFIE9OIENPTkZM
SUNUIFJFUExBQ0UsIHF1b3RhIElOVEVHRVIgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7Iikp
IHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBhbmQgaGVyZQorICAgICAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gY3JlYXRlIE9yaWdpbnMgdGFibGUiKTsKICAgICAgICAgfQogICAgIH0KICAg
ICBpZiAoIW1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkRhdGFiYXNlcyIpKSB7CiAgICAgICAgIGlm
ICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIERhdGFiYXNlcyAoZ3Vp
ZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsIG9yaWdpbiBURVhULCBuYW1lIFRF
WFQsIGRpc3BsYXlOYW1lIFRFWFQsIGVzdGltYXRlZFNpemUgSU5URUdFUiwgcGF0aCBURVhUKTsi
KSkgewogICAgICAgICAgICAgLy8gRklYTUU6IGFuZCBoZXJlCisgICAgICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byBjcmVhdGUgRGF0YWJhc2VzIHRhYmxlIik7CiAgICAgICAgIH0KICAgICB9
CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpjYW5Fc3RhYmxpc2hEYXRhYmFzZShTY3JpcHRF
eGVjdXRpb25Db250ZXh0KiBjb250ZXh0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmlu
ZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSkKIHsKLSAgICBBU1NF
UlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQotICAgIC8vIFBvcHVsYXRlIHRoZSBv
cmlnaW5zIGJlZm9yZSB3ZSBlc3RhYmxpc2ggYSBkYXRhYmFzZTsgdGhpcyBndWFyYW50ZWVzIHRo
YXQgcXVvdGFGb3JPcmlnaW4KLSAgICAvLyBjYW4gcnVuIG9uIHRoZSBkYXRhYmFzZSB0aHJlYWQg
bGF0ZXIuCi0gICAgcG9wdWxhdGVPcmlnaW5zKCk7Ci0KICAgICBTZWN1cml0eU9yaWdpbiogb3Jp
Z2luID0gY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBQcm9wb3NlZERhdGFiYXNlIGRl
dGFpbHM7CiAKLSAgICAvLyBTaW5jZSB3ZSdyZSBpbW1pbmVudGx5IG9wZW5pbmcgYSBkYXRhYmFz
ZSB3aXRoaW4gdGhpcyBjb250ZXh0J3Mgb3JpZ2luLCBtYWtlIHN1cmUgdGhpcyBvcmlnaW4gaXMg
YmVpbmcgdHJhY2tlZCBieSB0aGUgUXVvdGFUcmFja2VyCi0gICAgLy8gYnkgZmV0Y2hpbmcgaXQn
cyBjdXJyZW50IHVzYWdlIG5vdwotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1c2FnZSA9IHVzYWdl
Rm9yT3JpZ2luKG9yaWdpbik7Ci0KLSAgICAvLyBJZiBhIGRhdGFiYXNlIGFscmVhZHkgZXhpc3Rz
LCBpZ25vcmUgdGhlIHBhc3NlZC1pbiBlc3RpbWF0ZWQgc2l6ZSBhbmQgc2F5IGl0J3MgT0suCi0g
ICAgaWYgKGhhc0VudHJ5Rm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSkKLSAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlcXVpcmVtZW50OworICAgIHVuc2lnbmVk
IGxvbmcgbG9uZyB0ZW1wVXNhZ2U7CisgICAgeworICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFN
YW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgICAgICBNdXRleExvY2tl
ciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKIAotICAgIC8vIElmIHRoZSBkYXRhYmFz
ZSB3aWxsIGZpdCwgYWxsb3cgaXRzIGNyZWF0aW9uLgotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBy
ZXF1aXJlbWVudCA9IHVzYWdlICsgbWF4KDFVTCwgZXN0aW1hdGVkU2l6ZSk7Ci0gICAgaWYgKHJl
cXVpcmVtZW50IDwgdXNhZ2UpCi0gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWYgdGhlIGVzdGlt
YXRlZCBzaXplIGlzIHNvIGJpZyBpdCBjYXVzZXMgYW4gb3ZlcmZsb3csIGRvbid0IGFsbG93IGNy
ZWF0aW9uLgotICAgIGlmIChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbihvcmlnaW4pKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAKLSAgICAv
LyBHaXZlIHRoZSBjaHJvbWUgY2xpZW50IGEgY2hhbmNlIHRvIGluY3JlYXNlIHRoZSBxdW90YS4K
LSAgICAvLyBUZW1wb3JhcmlseSBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBwcm9wb3NlZCBkYXRh
YmFzZSBhdmFpbGFibGUsIHNvIHRoZSBjbGllbnQgY2FuIGdldCBhdCB0aGVtLgotICAgIHBhaXI8
U2VjdXJpdHlPcmlnaW4qLCBEYXRhYmFzZURldGFpbHM+IGRldGFpbHMob3JpZ2luLCBEYXRhYmFz
ZURldGFpbHMobmFtZSwgZGlzcGxheU5hbWUsIGVzdGltYXRlZFNpemUsIDApKTsKLSAgICBtX3By
b3Bvc2VkRGF0YWJhc2UgPSAmZGV0YWlsczsKKyAgICAgICAgLy8gU2luY2Ugd2UncmUgaW1taW5l
bnRseSBvcGVuaW5nIGEgZGF0YWJhc2Ugd2l0aGluIHRoaXMgY29udGV4dCdzIG9yaWdpbiwgbWFr
ZSBzdXJlIHRoaXMgb3JpZ2luIGlzIGJlaW5nIHRyYWNrZWQgYnkgdGhlIFF1b3RhVHJhY2tlcgor
ICAgICAgICAvLyBieSBmZXRjaGluZyBpdHMgY3VycmVudCB1c2FnZSBub3cuCisgICAgICAgIHVu
c2lnbmVkIGxvbmcgbG9uZyB1c2FnZSA9IHVzYWdlRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7CisK
KyAgICAgICAgLy8gSWYgYSBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cywgaWdub3JlIHRoZSBwYXNz
ZWQtaW4gZXN0aW1hdGVkIHNpemUgYW5kIHNheSBpdCdzIE9LLgorICAgICAgICBpZiAoaGFzRW50
cnlGb3JEYXRhYmFzZShvcmlnaW4sIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICAgICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdpbGwgZml0LCBhbGxvdyBpdHMgY3JlYXRpb24u
CisgICAgICAgIHJlcXVpcmVtZW50ID0gdXNhZ2UgKyBtYXgoMVVMLCBlc3RpbWF0ZWRTaXplKTsK
KyAgICAgICAgdGVtcFVzYWdlID0gdXNhZ2U7CisgICAgICAgIGlmIChyZXF1aXJlbWVudCA8IHVz
YWdlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJZiB0aGUgZXN0aW1hdGVkIHNpemUg
aXMgc28gYmlnIGl0IGNhdXNlcyBhbiBvdmVyZmxvdywgZG9uJ3QgYWxsb3cgY3JlYXRpb24uCisg
ICAgICAgIGlmIChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbk5vTG9jayhvcmlnaW4pKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gR2l2ZSB0aGUgY2hyb21lIGNs
aWVudCBhIGNoYW5jZSB0byBpbmNyZWFzZSB0aGUgcXVvdGEuCisgICAgICAgIC8vIFRlbXBvcmFy
aWx5IG1ha2UgdGhlIGRldGFpbHMgb2YgdGhlIHByb3Bvc2VkIGRhdGFiYXNlIGF2YWlsYWJsZSwg
c28gdGhlIGNsaWVudCBjYW4gZ2V0IGF0IHRoZW0uCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91
bGQgcmVhbGx5IGp1c3QgcGFzcyB0aGUgZGV0YWlscyBpbnRvIHRoaXMgY2FsbCwgcmF0aGVyIHRo
YW4gdXNpbmcgbV9wcm9wb3NlZERhdGFiYXNlcy4KKyAgICAgICAgZGV0YWlscyA9IFByb3Bvc2Vk
RGF0YWJhc2Uob3JpZ2luLCBEYXRhYmFzZURldGFpbHMobmFtZSwgZGlzcGxheU5hbWUsIGVzdGlt
YXRlZFNpemUsIDApKTsKKyAgICAgICAgbV9wcm9wb3NlZERhdGFiYXNlcy5hZGQoJmRldGFpbHMp
OworICAgIH0KKyAgICAvLyBEcm9wIGFsbCBsb2NrcyBiZWZvcmUgY2FsbGluZyBvdXQ7IHdlIGRv
bid0IGtub3cgd2hhdCB0aGV5J2xsIGRvLgogICAgIGNvbnRleHQtPmRhdGFiYXNlRXhjZWVkZWRR
dW90YShuYW1lKTsKLSAgICBtX3Byb3Bvc2VkRGF0YWJhc2UgPSAwOworICAgIHsKKyAgICAgICAg
TXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIG1fcHJv
cG9zZWREYXRhYmFzZXMucmVtb3ZlKCZkZXRhaWxzKTsKKyAgICB9CiAKICAgICAvLyBJZiB0aGUg
ZGF0YWJhc2Ugd2lsbCBmaXQgbm93LCBhbGxvdyBpdHMgY3JlYXRpb24uCiAgICAgcmV0dXJuIHJl
cXVpcmVtZW50IDw9IHF1b3RhRm9yT3JpZ2luKG9yaWdpbik7CiB9CiAKK2Jvb2wgRGF0YWJhc2VU
cmFja2VyOjpoYXNFbnRyeUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKQor
eworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgQVNTRVJUKG1f
cXVvdGFNYXApOworICAgIHJldHVybiBtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pOworfQor
CiBib29sIERhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4q
IG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAg
ICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKICAgICBwb3B1bGF0
ZU9yaWdpbnMoKTsKLSAgICBNdXRleExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJk
KTsKLSAgICByZXR1cm4gbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKTsKKyAgICByZXR1cm4g
aGFzRW50cnlGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKIH0KIAogYm9vbCBEYXRhYmFzZVRyYWNr
ZXI6Omhhc0VudHJ5Rm9yRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3Ry
aW5nJiBkYXRhYmFzZUlkZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9
PSBtX3RocmVhZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKICAg
ICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVu
KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE5MywxNiArMjEyLDE3IEBAIHVuc2lnbmVk
IGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OmdldE0KIAogU3RyaW5nIERhdGFiYXNlVHJhY2tl
cjo6b3JpZ2luUGF0aChTZWN1cml0eU9yaWdpbiogb3JpZ2luKSBjb25zdAogewotICAgIEFTU0VS
VChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotICAgIHJldHVybiBTUUxpdGVGaWxlU3lz
dGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRo
LCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICByZXR1cm4gU1FMaXRlRmlsZVN5
c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0
aC50aHJlYWRzYWZlQ29weSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIH0KIAot
U3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZShTZWN1cml0eU9yaWdp
biogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RFeGlzdHMpCitT
dHJpbmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKFNlY3VyaXR5
T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZk5vdEV4aXN0
cykKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NF
UlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVCghb3JpZ2luUXVvdGFN
YW5hZ2VyTm9Mb2NrKCkudHJ5TG9jaygpKTsKIAotICAgIGlmIChtX3Byb3Bvc2VkRGF0YWJhc2Ug
JiYgbV9wcm9wb3NlZERhdGFiYXNlLT5maXJzdCA9PSBvcmlnaW4gJiYgbV9wcm9wb3NlZERhdGFi
YXNlLT5zZWNvbmQubmFtZSgpID09IG5hbWUpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAg
ICBmb3IgKEhhc2hTZXQ8UHJvcG9zZWREYXRhYmFzZSo+OjppdGVyYXRvciBpdGVyID0gbV9wcm9w
b3NlZERhdGFiYXNlcy5iZWdpbigpOyBpdGVyICE9IG1fcHJvcG9zZWREYXRhYmFzZXMuZW5kKCk7
ICsraXRlcikKKyAgICAgICAgaWYgKCgqaXRlciktPmZpcnN0ID09IG9yaWdpbiAmJiAoKml0ZXIp
LT5zZWNvbmQubmFtZSgpID09IG5hbWUpCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAK
ICAgICBTdHJpbmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVy
KCk7CiAgICAgU3RyaW5nIG9yaWdpblBhdGggPSB0aGlzLT5vcmlnaW5QYXRoKG9yaWdpbik7CkBA
IC0yMTIsNyArMjMyLDYgQEAgU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRh
YgogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHBh
dGggZm9yIHRoaXMgZGF0YWJhc2UgeWV0Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7
CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIHBhdGgg
RlJPTSBEYXRhYmFzZXMgV0hFUkUgb3JpZ2luPT8gQU5EIG5hbWU9PzsiKTsKQEAgLTIzMSwzNiAr
MjUwLDQyIEBAIFN0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWIKICAgICAg
ICAgcmV0dXJuIFN0cmluZygpOwogCiAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHREb25lKSB7
Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJldHJpZXZlIGZpbGVuYW1lIGZyb20gRGF0
YWJhc2UgVHJhY2tlciBmb3Igb3JpZ2luICVzLCBuYW1lICVzIiwgb3JpZ2luLT5kYXRhYmFzZUlk
ZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSwgbmFtZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIHJldHJpZXZlIGZpbGVuYW1lIGZyb20gRGF0YWJhc2UgVHJh
Y2tlciBmb3Igb3JpZ2luICVzLCBuYW1lICVzIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRh
dGEoKSwgbmFtZS5hc2NpaSgpLmRhdGEoKSk7CiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKICAg
ICB9CiAgICAgc3RhdGVtZW50LmZpbmFsaXplKCk7CiAKLSAgICBTdHJpbmcgZmlsZU5hbWUgPSBT
UUxpdGVGaWxlU3lzdGVtOjpnZXRGaWxlTmFtZUZvck5ld0RhdGFiYXNlKG9yaWdpblBhdGgsIG5h
bWUsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCksICZtX2RhdGFiYXNlKTsKKyAgICBTdHJp
bmcgZmlsZU5hbWUgPSBTUUxpdGVGaWxlU3lzdGVtOjpnZXRGaWxlTmFtZUZvck5ld0RhdGFiYXNl
KG9yaWdpblBhdGgsIG5hbWUsIG9yaWdpbklkZW50aWZpZXIsICZtX2RhdGFiYXNlKTsKICAgICBp
ZiAoIWFkZERhdGFiYXNlKG9yaWdpbiwgbmFtZSwgZmlsZU5hbWUpKQogICAgICAgICByZXR1cm4g
U3RyaW5nKCk7CiAKICAgICAvLyBJZiB0aGlzIG9yaWdpbidzIHF1b3RhIGlzIGJlaW5nIHRyYWNr
ZWQgKG9wZW4gaGFuZGxlIHRvIGEgZGF0YWJhc2UgaW4gdGhpcyBvcmlnaW4pLCBhZGQgdGhpcyBu
ZXcgZGF0YWJhc2UKICAgICAvLyB0byB0aGUgcXVvdGEgbWFuYWdlciBub3cKICAgICBTdHJpbmcg
ZnVsbEZpbGVQYXRoID0gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRv
UGF0aChvcmlnaW5QYXRoLCBmaWxlTmFtZSk7Ci0gICAgewotICAgICAgICBMb2NrZXI8T3JpZ2lu
UXVvdGFNYW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwotICAgICAgICBpZiAo
b3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tzT3JpZ2luKG9yaWdpbikpCi0gICAgICAgICAgICBv
cmlnaW5RdW90YU1hbmFnZXIoKS5hZGREYXRhYmFzZShvcmlnaW4sIG5hbWUsIGZ1bGxGaWxlUGF0
aCk7Ci0gICAgfQorICAgIGlmIChvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmln
aW4ob3JpZ2luKSkKKyAgICAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkuYWRkRGF0YWJh
c2Uob3JpZ2luLCBuYW1lLCBmdWxsRmlsZVBhdGgpOwogCiAgICAgcmV0dXJuIGZ1bGxGaWxlUGF0
aDsKIH0KIAorU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZShTZWN1
cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RF
eGlzdHMpCit7CisgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gbG9ja2VyKG9yaWdpblF1
b3RhTWFuYWdlcigpKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1
YXJkKTsKKyAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKKworICAgIHJldHVybiBmdWxsUGF0aEZvckRh
dGFiYXNlTm9Mb2NrKG9yaWdpbiwgbmFtZSwgY3JlYXRlSWZOb3RFeGlzdHMpOworfQorCiB2b2lk
IERhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKCkKIHsKKyAgICBBU1NFUlQoIW1fZGF0
YWJhc2VHdWFyZC50cnlMb2NrKCkpOwogICAgIGlmIChtX3F1b3RhTWFwKQogICAgICAgICByZXR1
cm47CiAKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQogICAgIG1f
cXVvdGFNYXAuc2V0KG5ldyBRdW90YU1hcCk7Ci0gICAgbV9xdW90YU1hbmFnZXIuc2V0KG5ldyBP
cmlnaW5RdW90YU1hbmFnZXIpOworICAgIGlmICghbV9xdW90YU1hbmFnZXIpCisgICAgICAgIG1f
cXVvdGFNYW5hZ2VyLnNldChuZXcgT3JpZ2luUXVvdGFNYW5hZ2VyKTsKIAogICAgIG9wZW5UcmFj
a2VyRGF0YWJhc2UoZmFsc2UpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKQEAgLTI2
OCw4ICsyOTMsMTAgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3JpZ2lucygpCiAK
ICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1Qgb3JpZ2lu
LCBxdW90YSBGUk9NIE9yaWdpbnMiKTsKIAotICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9
IFNRTFJlc3VsdE9rKQorICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9r
KSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3RhdGVtZW50LiIpOwog
ICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgaW50IHJlc3VsdDsKICAgICB3aGlsZSAoKHJl
c3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTFJlc3VsdFJvdykgewpAQCAtMjc4LDIwICsz
MDUsMjAgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3JpZ2lucygpCiAgICAgfQog
CiAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHREb25lKQotICAgICAgICBMT0dfRVJST1IoIkZh
aWxlZCB0byByZWFkIGluIGFsbCBvcmlnaW5zIGZyb20gdGhlIGRhdGFiYXNlIik7CisgICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJh
c2UuIik7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5zKFZlY3RvcjxSZWZQdHI8
U2VjdXJpdHlPcmlnaW4+ID4mIHJlc3VsdCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgp
ID09IG1fdGhyZWFkKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1
YXJkKTsKICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKLSAgICBNdXRleExvY2tlciBsb2NrUXVvdGFN
YXAobV9xdW90YU1hcEd1YXJkKTsKKyAgICBBU1NFUlQobV9xdW90YU1hcCk7CiAgICAgY29weUtl
eXNUb1ZlY3RvcigqbV9xdW90YU1hcCwgcmVzdWx0KTsKIH0KIAotYm9vbCBEYXRhYmFzZVRyYWNr
ZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9y
PFN0cmluZz4mIHJlc3VsdFZlY3RvcikKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5h
bWVzRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIFZlY3RvcjxTdHJpbmc+
JiByZXN1bHRWZWN0b3IpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVh
ZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKICAgICBvcGVuVHJh
Y2tlckRhdGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAg
ICAgIHJldHVybiBmYWxzZTsKQEAgLTMxNSw0NCArMzQyLDU3IEBAIGJvb2wgRGF0YWJhc2VUcmFj
a2VyOjpkYXRhYmFzZU5hbWVzRm9yT3IKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRGF0YWJhc2VE
ZXRhaWxzIERhdGFiYXNlVHJhY2tlcjo6ZGV0YWlsc0Zvck5hbWVBbmRPcmlnaW4oY29uc3QgU3Ry
aW5nJiBuYW1lLCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKQorYm9vbCBEYXRhYmFzZVRyYWNrZXI6
OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9yPFN0
cmluZz4mIHJlc3VsdFZlY3RvcikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1f
dGhyZWFkKTsKLQotICAgIGlmIChtX3Byb3Bvc2VkRGF0YWJhc2UgJiYgbV9wcm9wb3NlZERhdGFi
YXNlLT5maXJzdCA9PSBvcmlnaW4gJiYgbV9wcm9wb3NlZERhdGFiYXNlLT5zZWNvbmQubmFtZSgp
ID09IG5hbWUpCi0gICAgICAgIHJldHVybiBtX3Byb3Bvc2VkRGF0YWJhc2UtPnNlY29uZDsKKyAg
ICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICByZXR1cm4g
ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayhvcmlnaW4sIHJlc3VsdFZlY3Rvcik7Cit9CiAK
K0RhdGFiYXNlRGV0YWlscyBEYXRhYmFzZVRyYWNrZXI6OmRldGFpbHNGb3JOYW1lQW5kT3JpZ2lu
KGNvbnN0IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKK3sKICAgICBTdHJp
bmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCk7CisgICAg
U3RyaW5nIGRpc3BsYXlOYW1lOworICAgIGludDY0X3QgZXhwZWN0ZWRVc2FnZTsKIAotICAgIG9w
ZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwotICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkK
LSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOwotICAgIFNRTGl0ZVN0YXRlbWVudCBz
dGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBkaXNwbGF5TmFtZSwgZXN0aW1hdGVkU2l6ZSBG
Uk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyBBTkQgbmFtZT0/Iik7Ci0gICAgaWYgKHN0YXRl
bWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCi0gICAgICAgIHJldHVybiBEYXRhYmFzZURl
dGFpbHMoKTsKLQotICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW5JZGVudGlmaWVyKTsK
LSAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgbmFtZSk7Ci0KLSAgICBpbnQgcmVzdWx0ID0gc3Rh
dGVtZW50LnN0ZXAoKTsKLSAgICBpZiAocmVzdWx0ID09IFNRTFJlc3VsdERvbmUpCi0gICAgICAg
IHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxv
Y2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogCi0gICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1
bHRSb3cpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZXRyaWV2aW5nIGRldGFpbHMgZm9y
IGRhdGFiYXNlICVzIGluIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIgZGF0YWJhc2UiLCBuYW1lLmFz
Y2lpKCkuZGF0YSgpLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAg
cmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgICAgICBmb3IgKEhhc2hTZXQ8UHJvcG9zZWRE
YXRhYmFzZSo+OjppdGVyYXRvciBpdGVyID0gbV9wcm9wb3NlZERhdGFiYXNlcy5iZWdpbigpOyBp
dGVyICE9IG1fcHJvcG9zZWREYXRhYmFzZXMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgICAgIGlm
ICgoKml0ZXIpLT5maXJzdCA9PSBvcmlnaW4gJiYgKCppdGVyKS0+c2Vjb25kLm5hbWUoKSA9PSBu
YW1lKQorICAgICAgICAgICAgICAgIHJldHVybiAoKml0ZXIpLT5zZWNvbmQ7CisKKyAgICAgICAg
b3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CisgICAgICAgIGlmICghbV9kYXRhYmFzZS5pc09w
ZW4oKSkKKyAgICAgICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKyAgICAgICAgU1FM
aXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIGRpc3BsYXlOYW1lLCBl
c3RpbWF0ZWRTaXplIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT8iKTsK
KyAgICAgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCisgICAgICAg
ICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7CisKKyAgICAgICAgc3RhdGVtZW50LmJpbmRU
ZXh0KDEsIG9yaWdpbklkZW50aWZpZXIpOworICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwg
bmFtZSk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCk7CisgICAgICAg
IGlmIChyZXN1bHQgPT0gU1FMUmVzdWx0RG9uZSkKKyAgICAgICAgICAgIHJldHVybiBEYXRhYmFz
ZURldGFpbHMoKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdFJvdykgeworICAg
ICAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZXRyaWV2aW5nIGRldGFpbHMgZm9yIGRhdGFiYXNl
ICVzIGluIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIgZGF0YWJhc2UiLCBuYW1lLmFzY2lpKCkuZGF0
YSgpLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVy
biBEYXRhYmFzZURldGFpbHMoKTsKKyAgICAgICAgfQorICAgICAgICBkaXNwbGF5TmFtZSA9IHN0
YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBleHBlY3RlZFVzYWdlID0gc3RhdGVt
ZW50LmdldENvbHVtbkludDY0KDEpOwogICAgIH0KIAotICAgIHJldHVybiBEYXRhYmFzZURldGFp
bHMobmFtZSwgc3RhdGVtZW50LmdldENvbHVtblRleHQoMCksIHN0YXRlbWVudC5nZXRDb2x1bW5J
bnQ2NCgxKSwgdXNhZ2VGb3JEYXRhYmFzZShuYW1lLCBvcmlnaW4pKTsKKyAgICByZXR1cm4gRGF0
YWJhc2VEZXRhaWxzKG5hbWUsIGRpc3BsYXlOYW1lLCBleHBlY3RlZFVzYWdlLCB1c2FnZUZvckRh
dGFiYXNlKG5hbWUsIG9yaWdpbikpOwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0RGF0
YWJhc2VEZXRhaWxzKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwg
Y29uc3QgU3RyaW5nJiBkaXNwbGF5TmFtZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKQog
ewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotCiAgICAgU3RyaW5n
IG9yaWdpbklkZW50aWZpZXIgPSBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpOwogICAgIGlu
dDY0X3QgZ3VpZCA9IDA7CiAKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFz
ZUd1YXJkKTsKKwogICAgIG9wZW5UcmFja2VyRGF0YWJhc2UodHJ1ZSk7CiAgICAgaWYgKCFtX2Rh
dGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CkBAIC00MDAsNyArNDQwLDYgQEAgdm9p
ZCBEYXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGV0YWlscwogCiB1bnNpZ25lZCBsb25nIGxv
bmcgRGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvckRhdGFiYXNlKGNvbnN0IFN0cmluZyYgbmFtZSwg
U2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09
IG1fdGhyZWFkKTsKICAgICBTdHJpbmcgcGF0aCA9IGZ1bGxQYXRoRm9yRGF0YWJhc2Uob3JpZ2lu
LCBuYW1lLCBmYWxzZSk7CiAgICAgaWYgKHBhdGguaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4g
MDsKQEAgLTQ0MSw2ICs0ODAsNyBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRh
dGFiYXNlCiAgICAgaWYgKCFkYXRhYmFzZSkKICAgICAgICAgcmV0dXJuOwogCisgICAgTG9ja2Vy
PE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdl
cigpKTsKICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFiYXNl
TWFwR3VhcmQpOwogCiAgICAgaWYgKCFtX29wZW5EYXRhYmFzZU1hcCkgewpAQCAtNDc2LDYgKzUx
NiwxMCBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlCiAKICAgICBt
X29wZW5EYXRhYmFzZU1hcC0+cmVtb3ZlKGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigpKTsKICAg
ICBkZWxldGUgbmFtZU1hcDsKKyAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5yZW1vdmVP
cmlnaW4oZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpOworCisgICAgLy8gVGhyb3cgYXdheSBt
X3F1b3RhTWFwIHdoZW5ldmVyIHdlJ3ZlIGNsZWFyZWQgb3V0IGFuIG9yaWdpbi0tb3RoZXJ3aXNl
IHdlIG5ldmVyIGdldCByaWQgb2Ygc3RhbGUgZW50cmllcy4gIFRoZSBuZXh0IGNhbGwgdGhhdCBu
ZWVkcyBpdCB3aWxsIHBvcHVsYXRlT3JpZ2lucygpLgorICAgIG1fcXVvdGFNYXAuY2xlYXIoKTsK
IH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmdldE9wZW5EYXRhYmFzZXMoU2VjdXJpdHlPcmln
aW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBIYXNoU2V0PFJlZlB0cjxEYXRhYmFzZT4g
PiogZGF0YWJhc2VzKQpAQCAtNDk2LDkyICs1NDAsMTAzIEBAIHZvaWQgRGF0YWJhc2VUcmFja2Vy
OjpnZXRPcGVuRGF0YWJhc2VzKFMKICAgICAgICAgZGF0YWJhc2VzLT5hZGQoKml0KTsKIH0KIAot
dW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW4oU2VjdXJp
dHlPcmlnaW4qIG9yaWdpbikKK3Vuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnVz
YWdlRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJU
KGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgTG9ja2VyPE9yaWdpblF1b3RhTWFu
YWdlcj4gbG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICBBU1NFUlQoIW9yaWdpblF1
b3RhTWFuYWdlck5vTG9jaygpLnRyeUxvY2soKSk7CiAKICAgICAvLyBVc2UgdGhlIE9yaWdpblF1
b3RhTWFuYWdlciBtZWNoYW5pc20gdG8gY2FsY3VsYXRlIHRoZSB1c2FnZQotICAgIGlmIChvcmln
aW5RdW90YU1hbmFnZXIoKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKLSAgICAgICAgcmV0dXJuIG9y
aWdpblF1b3RhTWFuYWdlcigpLmRpc2tVc2FnZShvcmlnaW4pOworICAgIGlmIChvcmlnaW5RdW90
YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKKyAgICAgICAgcmV0dXJuIG9y
aWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmRpc2tVc2FnZShvcmlnaW4pOwogCiAgICAgLy8gSWYg
dGhlIE9yaWdpblF1b3RhTWFuYWdlciBkb2Vzbid0IHRyYWNrIHRoaXMgb3JpZ2luIGFscmVhZHks
IHByaW1lIGl0IHRvIGRvIHNvCi0gICAgb3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tPcmlnaW4o
b3JpZ2luKTsKKyAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja09yaWdpbihvcmln
aW4pOwogCiAgICAgVmVjdG9yPFN0cmluZz4gbmFtZXM7Ci0gICAgZGF0YWJhc2VOYW1lc0Zvck9y
aWdpbihvcmlnaW4sIG5hbWVzKTsKKyAgICBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKG9y
aWdpbiwgbmFtZXMpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5hbWVzLnNpemUo
KTsgKytpKQotICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS5hZGREYXRhYmFzZShvcmlnaW4s
IG5hbWVzW2ldLCBmdWxsUGF0aEZvckRhdGFiYXNlKG9yaWdpbiwgbmFtZXNbaV0sIGZhbHNlKSk7
CisgICAgICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmFkZERhdGFiYXNlKG9yaWdpbiwg
bmFtZXNbaV0sIGZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2sob3JpZ2luLCBuYW1lc1tpXSwgZmFs
c2UpKTsKIAotICAgIGlmICghb3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tzT3JpZ2luKG9yaWdp
bikpCisgICAgaWYgKCFvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmlnaW4ob3Jp
Z2luKSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIG9yaWdpblF1b3RhTWFuYWdlcigp
LmRpc2tVc2FnZShvcmlnaW4pOworICAgIHJldHVybiBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2so
KS5kaXNrVXNhZ2Uob3JpZ2luKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJh
Y2tlcjo6dXNhZ2VGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKK3sKKyAgICBMb2Nr
ZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworCisg
ICAgcmV0dXJuIHVzYWdlRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7Cit9CisKK3Vuc2lnbmVkIGxv
bmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3Jp
Z2luKiBvcmlnaW4pCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsK
KyAgICBBU1NFUlQobV9xdW90YU1hcCk7CisgICAgcmV0dXJuIG1fcXVvdGFNYXAtPmdldChvcmln
aW4pOwogfQogCiB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpxdW90YUZvck9y
aWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFk
KCkgPT0gbV90aHJlYWQgfHwgbV9xdW90YU1hcCk7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFi
YXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAgICAgcG9wdWxhdGVPcmlnaW5zKCk7Ci0gICAgTXV0ZXhM
b2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFyZCk7Ci0gICAgcmV0dXJuIG1fcXVvdGFN
YXAtPmdldChvcmlnaW4pOworICAgIHJldHVybiBxdW90YUZvck9yaWdpbk5vTG9jayhvcmlnaW4p
OwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0UXVvdGEoU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbiwgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhKQogewotICAgIEFTU0VSVChjdXJyZW50VGhy
ZWFkKCkgPT0gbV90aHJlYWQpOwotICAgIGlmIChxdW90YUZvck9yaWdpbihvcmlnaW4pID09IHF1
b3RhKQorICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworCisg
ICAgcG9wdWxhdGVPcmlnaW5zKCk7CisgICAgaWYgKHF1b3RhRm9yT3JpZ2luTm9Mb2NrKG9yaWdp
bikgPT0gcXVvdGEpCiAgICAgICAgIHJldHVybjsKIAogICAgIG9wZW5UcmFja2VyRGF0YWJhc2Uo
dHJ1ZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CiAK
LSAgICB7Ci0gICAgICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3RhTWFwR3VhcmQp
OwotCi0gICAgICAgIGlmICghbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKSkgewotICAgICAg
ICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElOVE8g
T3JpZ2lucyBWQUxVRVMgKD8sID8pIik7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBh
cmUoKSAhPSBTUUxSZXN1bHRPaykgewotICAgICAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxl
IHRvIGVzdGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNl
SWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkpOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMiwgcXVvdGEpOwot
Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5zdGVwKCkgIT0gU1FMUmVzdWx0RG9uZSkK
LSAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9yaWdp
biAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWko
KS5kYXRhKCkpOwotICAgICAgICAgICAgfQorICAgIGlmICghbV9xdW90YU1hcC0+Y29udGFpbnMo
b3JpZ2luKSkgeworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2Us
ICJJTlNFUlQgSU5UTyBPcmlnaW5zIFZBTFVFUyAoPywgPykiKTsKKyAgICAgICAgaWYgKHN0YXRl
bWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKKyAgICAgICAgICAgIExPR19FUlJPUigi
VW5hYmxlIHRvIGVzdGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRh
dGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlVQREFURSBP
cmlnaW5zIFNFVCBxdW90YT0/IFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgICAgICAgICBib29sIGVy
cm9yID0gc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPazsKLSAgICAgICAgICAgIGlm
ICghZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEludDY0KDEsIHF1b3Rh
KTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgb3JpZ2luLT5kYXRhYmFz
ZUlkZW50aWZpZXIoKSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2lu
LT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEludDY0
KDIsIHF1b3RhKTsKIAotICAgICAgICAgICAgICAgIGVycm9yID0gIXN0YXRlbWVudC5leGVjdXRl
Q29tbWFuZCgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5zdGVw
KCkgIT0gU1FMUmVzdWx0RG9uZSkKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBlc3RhYmxpc2ggb3JpZ2luICVzIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlk
ZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAg
ICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJVUERBVEUgT3JpZ2lu
cyBTRVQgcXVvdGE9PyBXSEVSRSBvcmlnaW49PyIpOworICAgICAgICBib29sIGVycm9yID0gc3Rh
dGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPazsKKyAgICAgICAgaWYgKCFlcnJvcikgewor
ICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgxLCBxdW90YSk7CisgICAgICAgICAgICBz
dGF0ZW1lbnQuYmluZFRleHQoMiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiAKLSAg
ICAgICAgICAgIGlmIChlcnJvcikKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0
byBzZXQgcXVvdGEgJWxsdSBpbiB0cmFja2VyIGRhdGFiYXNlIGZvciBvcmlnaW4gJXMiLCBxdW90
YSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAg
ICAgICBlcnJvciA9ICFzdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKTsKICAgICAgICAgfQogCi0g
ICAgICAgIC8vIEZJWE1FOiBJcyBpdCByZWFsbHkgT0sgdG8gdXBkYXRlIHRoZSBxdW90YSBpbiBt
ZW1vcnkgaWYgd2UgZmFpbGVkIHRvIHVwZGF0ZSBpdCBvbiBkaXNrPwotICAgICAgICBtX3F1b3Rh
TWFwLT5zZXQob3JpZ2luLCBxdW90YSk7CisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIHNldCBxdW90YSAlbGx1IGluIHRyYWNrZXIgZGF0YWJhc2Ug
Zm9yIG9yaWdpbiAlcyIsIHF1b3RhLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lp
KCkuZGF0YSgpKTsKICAgICB9CiAKKyAgICAvLyBGSVhNRTogSXMgaXQgcmVhbGx5IE9LIHRvIHVw
ZGF0ZSB0aGUgcXVvdGEgaW4gbWVtb3J5IGlmIHdlIGZhaWxlZCB0byB1cGRhdGUgaXQgb24gZGlz
az8KKyAgICBtX3F1b3RhTWFwLT5zZXQob3JpZ2luLCBxdW90YSk7CisKICAgICBpZiAobV9jbGll
bnQpCiAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdpbihvcmlnaW4pOwog
fQogCiBib29sIERhdGFiYXNlVHJhY2tlcjo6YWRkRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHBhdGgpCiB7Ci0gICAgQVNT
RVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNl
R3VhcmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQobV9xdW90YU1hcCk7CiAgICAgb3BlblRyYWNr
ZXJEYXRhYmFzZSh0cnVlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAg
IHJldHVybiBmYWxzZTsKIAogICAgIC8vIE5ldyBkYXRhYmFzZSBzaG91bGQgbmV2ZXIgYmUgYWRk
ZWQgdW50aWwgdGhlIG9yaWdpbiBoYXMgYmVlbiBlc3RhYmxpc2hlZAotICAgIEFTU0VSVChoYXNF
bnRyeUZvck9yaWdpbihvcmlnaW4pKTsKKyAgICBBU1NFUlQoaGFzRW50cnlGb3JPcmlnaW5Ob0xv
Y2sob3JpZ2luKSk7CiAKICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2Us
ICJJTlNFUlQgSU5UTyBEYXRhYmFzZXMgKG9yaWdpbiwgbmFtZSwgcGF0aCkgVkFMVUVTICg/LCA/
LCA/KTsiKTsKIApAQCAtNjA1LDggKzY2MCw2IEBAIGJvb2wgRGF0YWJhc2VUcmFja2VyOjphZGRE
YXRhYmFzZShTZWN1cmkKIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFiYXNl
cygpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0KICAgICBW
ZWN0b3I8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiA+IG9yaWdpbnNDb3B5OwogICAgIG9yaWdpbnMo
b3JpZ2luc0NvcHkpOwogCkBAIC02MTQsMTkgKzY2NywyNCBAQCB2b2lkIERhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRlQWxsRGF0YWJhc2VzCiAgICAgICAgIGRlbGV0ZU9yaWdpbihvcmlnaW5zQ29weVtp
XS5nZXQoKSk7CiB9CiAKKy8vIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBt
YWtlIHN1cmUgdGhhdCBub2JvZHkgaXMgdHJ5aW5nIHRvIGNyZWF0ZSwgZGVsZXRlLCBvcGVuLCBv
ciBjbG9zZSBkYXRhYmFzZXMgaW4gdGhpcyBvcmlnaW4gd2hpbGUgdGhlIGRlbGV0aW9uIGlzCisv
LyB0YWtpbmcgcGxhY2UuCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlT3JpZ2luKFNlY3Vy
aXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3Ro
cmVhZCk7Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7Ci0gICAgaWYgKCFtX2RhdGFi
YXNlLmlzT3BlbigpKQotICAgICAgICByZXR1cm47Ci0KICAgICBWZWN0b3I8U3RyaW5nPiBkYXRh
YmFzZU5hbWVzOwotICAgIGlmICghZGF0YWJhc2VOYW1lc0Zvck9yaWdpbihvcmlnaW4sIGRhdGFi
YXNlTmFtZXMpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHJldHJpZXZlIGxpc3Qg
b2YgZGF0YWJhc2UgbmFtZXMgZm9yIG9yaWdpbiAlcyIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47CisgICAgeworICAgICAgICBN
dXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICAgICAgb3BlblRy
YWNrZXJEYXRhYmFzZShmYWxzZSk7CisgICAgICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkK
KyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIWRhdGFiYXNlTmFtZXNGb3JPcmln
aW5Ob0xvY2sob3JpZ2luLCBkYXRhYmFzZU5hbWVzKSkgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJVbmFibGUgdG8gcmV0cmlldmUgbGlzdCBvZiBkYXRhYmFzZSBuYW1lcyBmb3Igb3JpZ2luICVz
Iiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBXZSBkcm9wIHRoZSBsb2Nr
IGhlcmUgYmVjYXVzZSBob2xkaW5nIGxvY2tzIGR1cmluZyBhIGNhbGwgdG8gZGVsZXRlRGF0YWJh
c2VGaWxlIHdpbGwgZGVhZGxvY2suCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFi
YXNlTmFtZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKCFkZWxldGVEYXRhYmFzZUZpbGUo
b3JpZ2luLCBkYXRhYmFzZU5hbWVzW2ldKSkgewogICAgICAgICAgICAgLy8gRXZlbiBpZiB0aGUg
ZmlsZSBjYW4ndCBiZSBkZWxldGVkLCB3ZSB3YW50IHRvIHRyeSBhbmQgZGVsZXRlIHRoZSByZXN0
LCBkb24ndCByZXR1cm4gZWFybHkgaGVyZS4KQEAgLTYzNCw0MSArNjkyLDQyIEBAIHZvaWQgRGF0
YWJhc2VUcmFja2VyOjpkZWxldGVPcmlnaW4oU2VjdXIKICAgICAgICAgfQogICAgIH0KIAotICAg
IFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIERhdGFi
YXNlcyBXSEVSRSBvcmlnaW49PyIpOwotICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNR
TFJlc3VsdE9rKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRp
b24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9yaWdpbi0+ZGF0
YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQorICAgIHsKKyAgICAgICAgLy8gVG8gc2F0aXNmeSB0aGUgbG9jayBoaWVyYXJjaHksIHdlIGhh
dmUgdG8gbG9jayB0aGUgb3JpZ2luUXVvdGFNYW5hZ2VyIGJlZm9yZSBtX2RhdGFiYXNlR3VhcmQg
aWYgdGhlcmUncyBhbnkgY2hhbmNlIHdlJ2xsIHRvIGxvY2sgYm90aC4KKyAgICAgICAgTG9ja2Vy
PE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdl
cigpKTsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7
CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBG
Uk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyIpOworICAgICAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUg
dG8gcHJlcGFyZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFj
a2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0
KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwogCi0gICAgaWYgKCFzdGF0ZW1lbnQu
ZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRl
IGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmln
aW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KKyAgICAgICAgaWYgKCFzdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgeworICAg
ICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBkYXRhYmFz
ZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZp
ZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAot
ICAgIFNRTGl0ZVN0YXRlbWVudCBvcmlnaW5TdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBG
Uk9NIE9yaWdpbnMgV0hFUkUgb3JpZ2luPT8iKTsKLSAgICBpZiAob3JpZ2luU3RhdGVtZW50LnBy
ZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBw
cmVwYXJlIGRlbGV0aW9uIG9mIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
KyAgICAgICAgU1FMaXRlU3RhdGVtZW50IG9yaWdpblN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVM
RVRFIEZST00gT3JpZ2lucyBXSEVSRSBvcmlnaW49PyIpOworICAgICAgICBpZiAob3JpZ2luU3Rh
dGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICAgICAgTE9HX0VSUk9S
KCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwg
b3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KIAotICAgIG9yaWdpblN0YXRlbWVudC5iaW5kVGV4dCgxLCBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgb3JpZ2luU3RhdGVtZW50LmJp
bmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwogCi0gICAgaWYgKCFvcmln
aW5TdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJs
ZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRy
YWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KKyAgICAgICAgaWYgKCFvcmlnaW5TdGF0ZW1lbnQuZXhlY3V0
ZUNvbW1hbmQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBk
ZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2lu
LT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KIAotICAgIFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZUVtcHR5RGF0YWJh
c2VEaXJlY3Rvcnkob3JpZ2luUGF0aChvcmlnaW4pKTsKKyAgICAgICAgU1FMaXRlRmlsZVN5c3Rl
bTo6ZGVsZXRlRW1wdHlEYXRhYmFzZURpcmVjdG9yeShvcmlnaW5QYXRoKG9yaWdpbikpOwogCi0g
ICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW5Qb3NzaWJseUxhc3RSZWZlcmVuY2UgPSBv
cmlnaW47Ci0gICAgewotICAgICAgICBNdXRleExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1h
cEd1YXJkKTsKKyAgICAgICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW5Qb3NzaWJseUxh
c3RSZWZlcmVuY2UgPSBvcmlnaW47CiAgICAgICAgIG1fcXVvdGFNYXAtPnJlbW92ZShvcmlnaW4p
OwogCi0gICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IHF1b3RhTWFuYWdlckxvY2tl
cihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Ci0gICAgICAgIG9yaWdpblF1b3RhTWFuYWdlcigpLnJl
bW92ZU9yaWdpbihvcmlnaW4pOworICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5y
ZW1vdmVPcmlnaW4ob3JpZ2luKTsKIAogICAgICAgICAvLyBJZiB3ZSByZW1vdmVkIHRoZSBsYXN0
IG9yaWdpbiwgZG8gc29tZSBhZGRpdGlvbmFsIGRlbGV0aW9uLgogICAgICAgICBpZiAobV9xdW90
YU1hcC0+aXNFbXB0eSgpKSB7CkBAIC02NzcsMjcgKzczNiwzNCBAQCB2b2lkIERhdGFiYXNlVHJh
Y2tlcjo6ZGVsZXRlT3JpZ2luKFNlY3VyCiAgICAgICAgICAgIFNRTGl0ZUZpbGVTeXN0ZW06OmRl
bGV0ZURhdGFiYXNlRmlsZSh0cmFja2VyRGF0YWJhc2VQYXRoKCkpOwogICAgICAgICAgICBTUUxp
dGVGaWxlU3lzdGVtOjpkZWxldGVFbXB0eURhdGFiYXNlRGlyZWN0b3J5KG1fZGF0YWJhc2VEaXJl
Y3RvcnlQYXRoKTsKICAgICAgICAgfQotICAgIH0KIAotICAgIGlmIChtX2NsaWVudCkgewotICAg
ICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlPcmlnaW4ob3JpZ2luKTsKLSAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6ZSgpOyArK2kpCi0gICAg
ICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlEYXRhYmFzZShvcmlnaW4sIGRhdGFi
YXNlTmFtZXNbaV0pOworICAgICAgICBpZiAobV9jbGllbnQpIHsKKyAgICAgICAgICAgIG1fY2xp
ZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdpbihvcmlnaW4pOworICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAg
ICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5RGF0YWJhc2Uob3JpZ2luLCBkYXRhYmFz
ZU5hbWVzW2ldKTsKKyAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6
OmRlbGV0ZURhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFt
ZSkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLSAgICBvcGVu
VHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0g
ICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZSht
X2RhdGFiYXNlR3VhcmQpOworICAgICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKKyAg
ICAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
IH0KIAorICAgIC8vIFdlIGRyb3AgdGhlIGxvY2sgaGVyZSBiZWNhdXNlIGhvbGRpbmcgbG9ja3Mg
ZHVyaW5nIGEgY2FsbCB0byBkZWxldGVEYXRhYmFzZUZpbGUgd2lsbCBkZWFkbG9jay4KICAgICBp
ZiAoIWRlbGV0ZURhdGFiYXNlRmlsZShvcmlnaW4sIG5hbWUpKSB7CiAgICAgICAgIExPR19FUlJP
UigiVW5hYmxlIHRvIGRlbGV0ZSBmaWxlIGZvciBkYXRhYmFzZSAlcyBpbiBvcmlnaW4gJXMiLCBu
YW1lLmFzY2lpKCkuZGF0YSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCku
ZGF0YSgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIFRvIHNhdGlzZnkgdGhl
IGxvY2sgaGllcmFyY2h5LCB3ZSBoYXZlIHRvIGxvY2sgdGhlIG9yaWdpblF1b3RhTWFuYWdlciBi
ZWZvcmUgbV9kYXRhYmFzZUd1YXJkIGlmIHRoZXJlJ3MgYW55IGNoYW5jZSB3ZSdsbCB0byBsb2Nr
IGJvdGguCisgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2Vy
KG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9k
YXRhYmFzZUd1YXJkKTsKKwogICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIkRFTEVURSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyBBTkQgbmFtZT0/Iik7CiAg
ICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKICAgICAgICAgTE9H
X0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBkYXRhYmFzZSAlcyBmcm9tIG9y
aWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBuYW1lLmFzY2lpKCkuZGF0YSgpLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKQEAgLTcxMiwxMCArNzc4LDcgQEAgdm9p
ZCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlKFNlYwogICAgICAgICByZXR1cm47CiAg
ICAgfQogCi0gICAgewotICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1h
bmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwotICAgICAgICBvcmlnaW5RdW90YU1h
bmFnZXIoKS5yZW1vdmVEYXRhYmFzZShvcmlnaW4sIG5hbWUpOwotICAgIH0KKyAgICBvcmlnaW5R
dW90YU1hbmFnZXJOb0xvY2soKS5yZW1vdmVEYXRhYmFzZShvcmlnaW4sIG5hbWUpOwogCiAgICAg
aWYgKG1fY2xpZW50KSB7CiAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdp
bihvcmlnaW4pOwpAQCAtNzIzLDI2ICs3ODYsMzEgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRl
bGV0ZURhdGFiYXNlKFNlYwogICAgIH0KIH0KIAorLy8gZGVsZXRlRGF0YWJhc2VGaWxlIGhhcyB0
byByZWxlYXNlIGxvY2tzIGJldHdlZW4gbG9va2luZyB1cCB0aGUgbGlzdCBvZiBkYXRhYmFzZXMg
dG8gY2xvc2UgYW5kIGNsb3NpbmcgdGhlbS4gIFdoaWxlIHRoaXMgaXMgaW4gcHJvZ3Jlc3MsIHRo
ZSBjYWxsZXIKKy8vIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSBubyBuZXcgZGF0YWJh
c2VzIGFyZSBvcGVuZWQgaW4gdGhlIGZpbGUgdG8gYmUgZGVsZXRlZC4KIGJvb2wgRGF0YWJhc2VU
cmFja2VyOjpkZWxldGVEYXRhYmFzZUZpbGUoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3Qg
U3RyaW5nJiBuYW1lKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQp
OworICAgIExPR19FUlJPUigiaW4gZGVsZXRlRGF0YWJhc2VGaWxlKCVzLCVzKSIsCisgICAgICBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpLCBuYW1lLmFzY2lpKCku
ZGF0YSgpKTsKICAgICBTdHJpbmcgZnVsbFBhdGggPSBmdWxsUGF0aEZvckRhdGFiYXNlKG9yaWdp
biwgbmFtZSwgZmFsc2UpOwotICAgIGlmIChmdWxsUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKGZ1
bGxQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBMT0dfRVJST1IoIm91dCBbZW1wdHldIGRlbGV0
ZURhdGFiYXNlRmlsZSglcywlcykiLAorICAgICAgICAgIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkuYXNjaWkoKS5kYXRhKCksIG5hbWUuYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CiAKICAgICBWZWN0b3I8UmVmUHRyPERhdGFiYXNlPiA+IGRlbGV0ZWRE
YXRhYmFzZXM7CiAKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGhvbGQgdGhlIG1fb3BlbkRhdGFi
YXNlTWFwR3VhcmQgbXV0ZXggd2hlbiBjYWxsaW5nCisgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBo
b2xkIHRoZSBhbnkgbG9ja3Mgd2hlbiBjYWxsaW5nCiAgICAgLy8gRGF0YWJhc2U6Om1hcmtBc0Rl
bGV0ZWRBbmRDbG9zZSgpLCBzaW5jZSB0aGF0IGNhbiBjYXVzZSBhIGRlYWRsb2NrCiAgICAgLy8g
ZHVyaW5nIHRoZSBzeW5jaHJvbm91cyBEYXRhYmFzZVRocmVhZCBjYWxsIGl0IHRyaWdnZXJzLgot
CiAgICAgewogICAgICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRh
dGFiYXNlTWFwR3VhcmQpOwogICAgICAgICBpZiAobV9vcGVuRGF0YWJhc2VNYXApIHsKICAgICAg
ICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIG9wZW4gZGF0YWJhc2VzLCBsZXRzIGNoZWNrIGlmIHRo
ZXkgYXJlIGZvciB0aGlzIG9yaWdpbi4KICAgICAgICAgICAgIERhdGFiYXNlTmFtZU1hcCogbmFt
ZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQob3JpZ2luKTsKICAgICAgICAgICAgIGlmIChu
YW1lTWFwICYmIG5hbWVNYXAtPnNpemUoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFy
ZSBzb21lIG9wZW4gZGF0YWJhc2VzIGZvciB0aGlzIG9yaWdpbiwgbGV0cyBjaGVjaworICAgICAg
ICAgICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIG9wZW4gZGF0YWJhc2VzIGZvciB0aGlzIG9yaWdp
biwgbGV0J3MgY2hlY2sKICAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IGFyZSB0aGlzIGRhdGFi
YXNlIGJ5IG5hbWUuCiAgICAgICAgICAgICAgICAgRGF0YWJhc2VTZXQqIGRhdGFiYXNlU2V0ID0g
bmFtZU1hcC0+Z2V0KG5hbWUpOwogICAgICAgICAgICAgICAgIGlmIChkYXRhYmFzZVNldCAmJiBk
YXRhYmFzZVNldC0+c2l6ZSgpKSB7CkBAIC03NTgsMTIgKzgyNiwxMyBAQCBib29sIERhdGFiYXNl
VHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VGaWxlCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGRlbGV0ZWREYXRhYmFzZXMuc2l6ZSgpOyArK2kpCiAgICAgICAgIGRlbGV0ZWREYXRhYmFzZXNb
aV0tPm1hcmtBc0RlbGV0ZWRBbmRDbG9zZSgpOwogCisgICAgTE9HX0VSUk9SKCJvdXQgW2Z1bGxd
IGRlbGV0ZURhdGFiYXNlRmlsZSglcywlcykiLAorICAgICAgb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSwgbmFtZS5hc2NpaSgpLmRhdGEoKSk7CiAgICAgcmV0dXJu
IFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZURhdGFiYXNlRmlsZShmdWxsUGF0aCk7CiB9CiAKIHZv
aWQgRGF0YWJhc2VUcmFja2VyOjpzZXRDbGllbnQoRGF0YWJhc2VUcmFja2VyQ2xpZW50KiBjbGll
bnQpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CiAgICAgbV9j
bGllbnQgPSBjbGllbnQ7CiB9CiAKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNr
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgJKHJl
dmlzaW9uIDU1MTcwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC02MCw5ICs2MCwxMSBAQCBzdHJ1Y3QgU2VjdXJpdHlPcmlnaW5UcmFpdHM7
CiBjbGFzcyBEYXRhYmFzZVRyYWNrZXIgOiBwdWJsaWMgTm9uY29weWFibGUgewogcHVibGljOgog
ICAgIHN0YXRpYyBEYXRhYmFzZVRyYWNrZXImIHRyYWNrZXIoKTsKLSAgICAvLyBGSVhNRTogRHVl
IHRvIHdvcmtlcnMgaGF2aW5nIG11bHRpcGxlIHRocmVhZHMgaW4gYSBzaW5nbGUgcHJvY2VzcyBz
aGFyaW5nCi0gICAgLy8gYSBEYXRhYmFzZVRyYWNrZXIsIHRoaXMgc2luZ2xldG9uIHdpbGwgaGF2
ZSB0byBiZSBzeW5jaHJvbml6ZWQgb3IgbW92ZWQKLSAgICAvLyB0byBUTFMuCisgICAgLy8gVGhp
cyBzaW5nbGV0b24gd2lsbCBwb3RlbnRpYWxseSBiZSB1c2VkIGZyb20gbXVsdGlwbGUgd29ya2Vy
IHRocmVhZHMgYW5kIHRoZSBwYWdlJ3MgY29udGV4dCB0aHJlYWQgc2ltdWx0YW5lb3VzbHkuICBU
byBrZWVwIHRoaXMgc2FmZSwgaXQncworICAgIC8vIGN1cnJlbnRseSB1c2luZyA0IGxvY2tzLiAg
SW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2sgd2hlbiB0YWtpbmcgbXVsdGlwbGUgbG9ja3MsIHlv
dSBtdXN0IHRha2UgdGhlbSBpbiB0aGUgY29ycmVjdCBvcmRlcjoKKyAgICAvLyBvcmlnaW5RdW90
YU1hbmFnZXIoKSBiZWZvcmUgbV9kYXRhYmFzZUd1YXJkIG9yIG1fb3BlbkRhdGFiYXNlTWFwR3Vh
cmQKKyAgICAvLyBtX2RhdGFiYXNlR3VhcmQgYmVmb3JlIG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQK
KyAgICAvLyBub3RpZmljYXRpb25NdXRleCgpIGlzIGN1cnJlbnRseSBpbmRlcGVuZGVudCBvZiB0
aGUgb3RoZXIgbG9ja3MuCiAKICAgICBib29sIGNhbkVzdGFibGlzaERhdGFiYXNlKFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQqLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxh
eU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSk7CiAgICAgdm9pZCBzZXREYXRhYmFz
ZURldGFpbHMoU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmlu
ZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSk7CkBAIC04Nyw3ICs4
OSw3IEBAIHByaXZhdGU6CiAjaWYgIVBMQVRGT1JNKENIUk9NSVVNKQogcHVibGljOgogICAgIHZv
aWQgc2V0RGF0YWJhc2VEaXJlY3RvcnlQYXRoKGNvbnN0IFN0cmluZyYpOwotICAgIGNvbnN0IFN0
cmluZyYgZGF0YWJhc2VEaXJlY3RvcnlQYXRoKCkgY29uc3Q7CisgICAgU3RyaW5nIGRhdGFiYXNl
RGlyZWN0b3J5UGF0aCgpIGNvbnN0OwogCiAgICAgdm9pZCBvcmlnaW5zKFZlY3RvcjxSZWZQdHI8
U2VjdXJpdHlPcmlnaW4+ID4mIHJlc3VsdCk7CiAgICAgYm9vbCBkYXRhYmFzZU5hbWVzRm9yT3Jp
Z2luKFNlY3VyaXR5T3JpZ2luKiwgVmVjdG9yPFN0cmluZz4mIHJlc3VsdCk7CkBAIC0xMTQsNiAr
MTE2LDEzIEBAIHB1YmxpYzoKICAgICBib29sIGhhc0VudHJ5Rm9yT3JpZ2luKFNlY3VyaXR5T3Jp
Z2luKik7CiAKIHByaXZhdGU6CisgICAgT3JpZ2luUXVvdGFNYW5hZ2VyJiBvcmlnaW5RdW90YU1h
bmFnZXJOb0xvY2soKTsKKyAgICBib29sIGhhc0VudHJ5Rm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5
T3JpZ2luKiBvcmlnaW4pOworICAgIFN0cmluZyBmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKFNl
Y3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sIGNyZWF0ZUlmRG9lc05vdEV4
aXN0KTsKKyAgICBib29sIGRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmln
aW4qIG9yaWdpbiwgVmVjdG9yPFN0cmluZz4mIHJlc3VsdFZlY3Rvcik7CisgICAgdW5zaWduZWQg
bG9uZyBsb25nIHVzYWdlRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pOwor
ICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBxdW90YUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdp
biogb3JpZ2luKTsKKwogICAgIFN0cmluZyB0cmFja2VyRGF0YWJhc2VQYXRoKCkgY29uc3Q7CiAg
ICAgdm9pZCBvcGVuVHJhY2tlckRhdGFiYXNlKGJvb2wgY3JlYXRlSWZEb2VzTm90RXhpc3QpOwog
CkBAIC0xMjYsMTAgKzEzNSwxMSBAQCBwcml2YXRlOgogCiAgICAgYm9vbCBkZWxldGVEYXRhYmFz
ZUZpbGUoU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIG5hbWUpOwogCisgICAgLy8gVGhp
cyBsb2NrIHByb3RlY3RzIG1fZGF0YWJhc2UsIG1fcXVvdGFNYXAsIGFuZCBtX3Byb3Bvc2VkRGF0
YWJhc2VzLgorICAgIE11dGV4IG1fZGF0YWJhc2VHdWFyZDsKICAgICBTUUxpdGVEYXRhYmFzZSBt
X2RhdGFiYXNlOwogCiAgICAgdHlwZWRlZiBIYXNoTWFwPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4s
IHVuc2lnbmVkIGxvbmcgbG9uZywgU2VjdXJpdHlPcmlnaW5IYXNoPiBRdW90YU1hcDsKLSAgICBN
dXRleCBtX3F1b3RhTWFwR3VhcmQ7CiAgICAgbXV0YWJsZSBPd25QdHI8UXVvdGFNYXA+IG1fcXVv
dGFNYXA7CiAKICAgICBPd25QdHI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBtX3F1b3RhTWFuYWdlcjsK
QEAgLTEzOCwxMSArMTQ4LDggQEAgcHJpdmF0ZToKIAogICAgIERhdGFiYXNlVHJhY2tlckNsaWVu
dCogbV9jbGllbnQ7CiAKLSAgICBzdGQ6OnBhaXI8U2VjdXJpdHlPcmlnaW4qLCBEYXRhYmFzZURl
dGFpbHM+KiBtX3Byb3Bvc2VkRGF0YWJhc2U7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgVGhyZWFk
SWRlbnRpZmllciBtX3RocmVhZDsKLSNlbmRpZgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPFNlY3Vy
aXR5T3JpZ2luKiwgRGF0YWJhc2VEZXRhaWxzPiBQcm9wb3NlZERhdGFiYXNlOworICAgIEhhc2hT
ZXQ8UHJvcG9zZWREYXRhYmFzZSo+IG1fcHJvcG9zZWREYXRhYmFzZXM7CiAKICAgICBzdGF0aWMg
dm9pZCBzY2hlZHVsZUZvck5vdGlmaWNhdGlvbigpOwogICAgIHN0YXRpYyB2b2lkIG5vdGlmeURh
dGFiYXNlc0NoYW5nZWQodm9pZCopOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3Rh
TWFuYWdlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFu
YWdlci5jcHAJKHJldmlzaW9uIDU1MTcwKQorKysgV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3Rh
TWFuYWdlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDE4IEBAIE9yaWdpblF1b3Rh
TWFuYWdlcjo6T3JpZ2luUXVvdGFNYW5hZ2VyKCkKIHsKIH0KIAorYm9vbCBPcmlnaW5RdW90YU1h
bmFnZXI6OnRyeUxvY2soKQoreworICAgIGJvb2wgbG9ja2VkID0gbV91c2FnZVJlY29yZEd1YXJk
LnRyeUxvY2soKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgbV91
c2FnZVJlY29yZEd1YXJkTG9ja2VkID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIEFTU0VSVCht
X3VzYWdlUmVjb3JkR3VhcmRMb2NrZWQpOworI2VuZGlmCisgICAgcmV0dXJuIGxvY2tlZDsKK30K
Kwogdm9pZCBPcmlnaW5RdW90YU1hbmFnZXI6OmxvY2soKQogewogICAgIG1fdXNhZ2VSZWNvcmRH
dWFyZC5sb2NrKCk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oCShyZXZp
c2lvbiA1NTE3MCkKKysrIFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIuaAkod29y
a2luZyBjb3B5KQpAQCAtNDUsNiArNDUsNyBAQCBjbGFzcyBPcmlnaW5RdW90YU1hbmFnZXIgOiBw
dWJsaWMgTm9uY29wCiBwdWJsaWM6CiAgICAgT3JpZ2luUXVvdGFNYW5hZ2VyKCk7CiAKKyAgICBi
b29sIHRyeUxvY2soKTsKICAgICB2b2lkIGxvY2soKTsKICAgICB2b2lkIHVubG9jaygpOwogCg==
</data>
<flag name="review"
          id="32185"
          type_id="1"
          status="-"
          setter="dimich"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50557</attachid>
            <date>2010-03-11 16:23:09 -0800</date>
            <delta_ts>2010-03-11 18:41:52 -0800</delta_ts>
            <desc>Rolled in feedback, fixed bugs, improved Changelog</desc>
            <filename>tracker.upload.patch</filename>
            <type>text/plain</type>
            <size>48333</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTg1NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsOTIgQEAKKzIwMTAtMDMtMTEgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBS
ZWZhY3RvciBEYXRhYmFzZVRyYWNrZXIuY3BwIGZvciB0aHJlYWQgc2FmZXR5CisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDk5MQorCisgICAgICAgIFRo
aXMgZW5hYmxlcyBjYWxsaW5nIGludG8gRGF0YWJhc2VUcmFja2VyIGZyb20gbXVsdGlwbGUgY29u
dGV4dCB0aHJlYWRzLAorICAgICAgICBhcyB3aWxsIGhhcHBlbiBvbmNlIFdvcmtlcnMgY2FuIGFj
Y2VzcyB0aGUgRGF0YWJhc2UuICBJdCByZXF1aXJlZCBhIGZhaXIKKyAgICAgICAgYW1vdW50IG9m
IHJlc2h1ZmZsaW5nIG9mIGxvY2tzLiAgSSBlbmRlZCB1cCBzcGxpdHRpbmcgdGhlIHB1YmxpYwor
ICAgICAgICBpbnRlcmZhY2UgW2NhbGxzIHRoYXQgdGFrZSBsb2NrcyBhbmQgY2FsbCBwcml2YXRl
IGZ1bmN0aW9uc10gZnJvbSB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIFtjYWxscyB0aGF0
IGFzc2VydCB0aGF0IGxvY2tzIGFyZSBhbHJlYWR5IGhlbGRdIGluIG9yZGVyCisgICAgICAgIHRv
IGF2b2lkIGxvY2sgY29uZmxpY3RzLiAgSSBhbHNvIGhhZCB0byBtYWtlIHN1cmUgd2Ugd2VyZW4n
dCBzaGFyaW5nCisgICAgICAgIFN0cmluZ3Mgb3IgU2VjdXJpdHlPcmlnaW5zIGFjcm9zcyB0aHJl
YWRzLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4KKworICAgICAgICBBbGxvdyBhY2Nlc3MgdG8g
ZGF0YWJhc2UgaGFuZGxlcyBmcm9tIG11bHRpcGxlIHRocmVhZHMgSUZGIFNRTGl0ZSBpcyBuZXcg
ZW5vdWdoIGFuZCB0aGUgdXNlciByZXF1ZXN0cyBpdC4KKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwv
U1FMaXRlRGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OlNR
TGl0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpzZXRTaGFy
YWJsZSk6CisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmg6CisgICAgICAg
IChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6c3FsaXRlM0hhbmRsZSk6CisgICAgICAgIChXZWJD
b3JlOjpTUUxpdGVEYXRhYmFzZTo6c2hhcmFibGUpOgorCisgICAgICAgIFJlbW92ZSBhbiBhc3lu
Y2hyb25vdXMgY2FsbCBmcm9tIERhdGFiYXNlOjpjbG9zZSBiYWNrIHRvIHRoZSBleGVjdXRpb24g
dGhyZWFkLCBzbyB0aGF0IGNsZWFudXAgY2FuIGJlIG1vcmUgZGV0ZXJtaW5pc3RpYy4KKyAgICAg
ICAgKiBzdG9yYWdlL0RhdGFiYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpt
YXJrQXNEZWxldGVkQW5kQ2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OmNsb3Nl
KToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmg6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZTo6KToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVGFzay5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZUNsb3NlVGFzazo6ZG9QZXJmb3JtVGFzayk6CisgICAgICAgICogc3Rv
cmFnZS9EYXRhYmFzZVRocmVhZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRocmVh
ZDo6ZGF0YWJhc2VUaHJlYWQpOgorCisgICAgICAgIEFueSBTdHJpbmdzIHRoYXQgZ2V0IHN0b3Jl
ZCBpbiBEYXRhYmFzZVRyYWNrZXIsIGFuZCBhbnkgU3RyaW5ncyByZXR1cm5lZCBmcm9tIERhdGFi
YXNlVHJhY2tlciwgYXJlIG5vdyB0aHJlYWRzYWZlQ29waWVzLgorICAgICAgICBQdWJsaWMgZnVu
Y3Rpb25zIG5vdyB0YWtlIGFsbCBuZWVkZWQgbG9ja3MsIHRoZW4gZ2VuZXJhbGx5IGNhbGwgb25s
eSBwcml2YXRlIGZ1bmN0aW9ucy4KKyAgICAgICAgUHJpdmF0ZSBmdW5jdGlvbnMgbm8gbG9uZ2Vy
IHRha2UgbG9ja3MuCisgICAgICAgIG1fcXVvdGFNYXBHdWFyZCBiZWNvbWVzIG1fZGF0YWJhc2VH
dWFyZCwgYW5kIG5vdyBwcm90ZWN0cyBtX3F1b3RhTWFwLCBtX2RhdGFiYXNlLCBhbmQgbV9wcm9w
b3NlZERhdGFiYXNlcy4KKyAgICAgICAgbV9wcm9wb3NlZERhdGFiYXNlcyByZXBsYWNlcyBtX3By
b3Bvc2VkRGF0YWJhc2UsIHRvIGFjY291bnQgZm9yIHJlZW50cmFuY3kuCisgICAgICAgIG1fcXVv
dGFNYXAgaXMgY2xlYXJlZCB3aGVuZXZlciBhbiBvcmlnaW4gaXMgcmVtb3ZlZCwgc28gdGhhdCBz
dGFsZSBlbnRyaWVzIGV2ZW50dWFsbHkgZ2V0IGNsZWFuZWQgdXAuCisgICAgICAgIAorICAgICAg
ICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6RGF0YWJhc2VUcmFja2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEaXJlY3RvcnlQYXRoKToKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKToKKyAgICAgICAgKFdl
YkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dHJhY2tlckRhdGFiYXNlUGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9wZW5UcmFja2VyRGF0YWJhc2UpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpjYW5Fc3RhYmxpc2hEYXRhYmFzZSk6CisgICAgICAg
IChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yT3JpZ2luTm9Mb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW4pOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvckRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2spOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6b3JpZ2lucyk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2spOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGV0YWlsc0Zvck5hbWVBbmRPcmlnaW4p
OgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMp
OgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvckRhdGFiYXNlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW5Ob0xvY2spOgor
ICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbik6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luTm9Mb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cXVvdGFGb3JPcmlnaW4pOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpzZXRRdW90YSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmFkZERhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6ZGVsZXRlQWxsRGF0YWJhc2VzKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6ZGVsZXRlT3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJh
Y2tlcjo6ZGVsZXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2Vy
OjpkZWxldGVEYXRhYmFzZUZpbGUpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2Vy
OjpzZXRDbGllbnQpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpzY2hlZHVs
ZU5vdGlmeURhdGFiYXNlQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNr
ZXI6Om5vdGlmeURhdGFiYXNlc0NoYW5nZWQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VU
cmFja2VyLmg6CisKKyAgICAgICAgQW55IFNlY3VyaXR5T3JpZ2lucyBzdG9yZWQgaW4gT3JpZ2lu
UXVvdGFNYW5hZ2VyIGFyZSBub3cgdGhyZWFkc2FmZUNvcGllcyBvZiBpbnB1dHMuICBUaGVyZSdz
IGEgbmV3IHRyeUxvY2sgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIGV4aXN0aW5nIGxvY2so
KS4KKworICAgICAgICAqIHN0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6Ok9yaWdpblF1b3RhTWFuYWdlcjo6dHJ5TG9jayk6CisgICAgICAgIChXZWJDb3Jl
OjpPcmlnaW5RdW90YU1hbmFnZXI6OnRyYWNrT3JpZ2luKToKKyAgICAgICAgKiBzdG9yYWdlL09y
aWdpblF1b3RhTWFuYWdlci5oOgorCiAyMDEwLTAzLTExICBDaHJpcyBGbGVpemFjaCAgPGNmbGVp
emFjaEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQmV0aCBEYWtpbi4KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAJKHJldmlzaW9uIDU1ODQ2KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00OCw2ICs0OCw3IEBAIFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAg
OiBtX2RiKDApCiAgICAgLCBtX3BhZ2VTaXplKC0xKQogICAgICwgbV90cmFuc2FjdGlvbkluUHJv
Z3Jlc3MoZmFsc2UpCisgICAgLCBtX3NoYXJhYmxlKGZhbHNlKQogICAgICwgbV9vcGVuaW5nVGhy
ZWFkKDApCiB7CiB9CkBAIC0yNTIsNiArMjUzLDE3IEBAIGNvbnN0IGNoYXIqIFNRTGl0ZURhdGFi
YXNlOjpsYXN0RXJyb3JNc2cKICAgICByZXR1cm4gc3FsaXRlM19lcnJtc2cobV9kYik7CiB9CiAK
K3ZvaWQgU1FMaXRlRGF0YWJhc2U6OnNldFNoYXJhYmxlKGJvb2wgc2hhcmFibGUpCit7CisgIC8v
IFRoaXMgZG9lc24ndCBndWFyYW50ZWUgdGhhdCBTUUxpc3Qgd2FzIGNvbXBpbGVkIHdpdGggLURU
SFJFQURTQUZFLCBvciB0aGF0IHlvdSBoYXZlbid0IHR1cm5lZCBvZmYgdGhlIG11dGV4ZXMuCisj
aWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDEKKyAgbV9zaGFyYWJsZSA9IHNoYXJh
YmxlOworI2Vsc2UKKyAgQVNTRVJUX1VOVVNFRChzaGFyYWJsZSk7CisgIEFTU0VSVCgwKTsgLy8g
WW91ciBTUUxpdGUgZG9lc24ndCBzdXBwb3J0IHNoYXJpbmcgaGFuZGxlcyBhY3Jvc3MgdGhyZWFk
cy4KKyNlbmRpZgorfQorCiBpbnQgU1FMaXRlRGF0YWJhc2U6OmF1dGhvcml6ZXJGdW5jdGlvbih2
b2lkKiB1c2VyRGF0YSwgaW50IGFjdGlvbkNvZGUsIGNvbnN0IGNoYXIqIHBhcmFtZXRlcjEsIGNv
bnN0IGNoYXIqIHBhcmFtZXRlcjIsIGNvbnN0IGNoYXIqIC8qZGF0YWJhc2VOYW1lKi8sIGNvbnN0
IGNoYXIqIC8qdHJpZ2dlcl9vcl92aWV3Ki8pCiB7CiAgICAgRGF0YWJhc2VBdXRob3JpemVyKiBh
dXRoID0gc3RhdGljX2Nhc3Q8RGF0YWJhc2VBdXRob3JpemVyKj4odXNlckRhdGEpOwpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCShyZXZpc2lvbiA1NTg0NikKKysrIFdl
YkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTk3
LDcgKzk3LDcgQEAgcHVibGljOgogICAgIGNvbnN0IGNoYXIqIGxhc3RFcnJvck1zZygpOwogICAg
IAogICAgIHNxbGl0ZTMqIHNxbGl0ZTNIYW5kbGUoKSBjb25zdCB7Ci0gICAgICAgIEFTU0VSVChj
dXJyZW50VGhyZWFkKCkgPT0gbV9vcGVuaW5nVGhyZWFkKTsKKyAgICAgICAgQVNTRVJUKG1fc2hh
cmFibGUgfHwgY3VycmVudFRocmVhZCgpID09IG1fb3BlbmluZ1RocmVhZCk7CiAgICAgICAgIHJl
dHVybiBtX2RiOwogICAgIH0KICAgICAKQEAgLTEwOCw2ICsxMDgsMTMgQEAgcHVibGljOgogICAg
IHZvaWQgdW5sb2NrKCk7CiAgICAgYm9vbCBpc0F1dG9Db21taXRPbigpIGNvbnN0OwogCisgICAg
Ly8gU2V0IHRoaXMgZmxhZyB0byBhbGxvdyBhY2Nlc3MgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLiAg
Tm90IGFsbCBtdWx0aS10aHJlYWRlZCBhY2Nlc3NlcyBhcmUgc2FmZSEKKyAgICAvLyBTZWUgaHR0
cDovL3d3dy5zcWxpdGUub3JnL2N2c3RyYWMvd2lraT9wPU11bHRpVGhyZWFkaW5nIGZvciBtb3Jl
IGluZm8uCisjaWZuZGVmIE5ERUJVRworICAgIGJvb2wgc2hhcmFibGUoKSB7IHJldHVybiBtX3No
YXJhYmxlOyB9CisjZW5kaWYKKyAgICB2b2lkIHNldFNoYXJhYmxlKGJvb2wgc2hhcmFibGUpOwor
CiBwcml2YXRlOgogICAgIHN0YXRpYyBpbnQgYXV0aG9yaXplckZ1bmN0aW9uKHZvaWQqLCBpbnQs
IGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKIApA
QCAtMTIwLDYgKzEyNyw3IEBAIHByaXZhdGU6CiAgICAgaW50IG1fcGFnZVNpemU7CiAgICAgCiAg
ICAgYm9vbCBtX3RyYW5zYWN0aW9uSW5Qcm9ncmVzczsKKyAgICBib29sIG1fc2hhcmFibGU7CiAg
ICAgCiAgICAgTXV0ZXggbV9hdXRob3JpemVyTG9jazsKICAgICBSZWZQdHI8RGF0YWJhc2VBdXRo
b3JpemVyPiBtX2F1dGhvcml6ZXI7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHAJKHJldmlzaW9uIDU1
ODQ2KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
Mzg5LDYgKzM4OSwxMCBAQCB2b2lkIERhdGFiYXNlOjptYXJrQXNEZWxldGVkQW5kQ2xvc2UoKQog
CiAgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5kYXRhYmFzZVRocmVhZCgpLT5zY2hlZHVs
ZUltbWVkaWF0ZVRhc2sodGFzay5yZWxlYXNlKCkpOwogICAgIHN5bmNocm9uaXplci53YWl0Rm9y
VGFza0NvbXBsZXRpb24oKTsKKworICAgIC8vIERhdGFiYXNlQ2xvc2VUYXNrIHRlbGxzIERhdGFi
YXNlOjpjbG9zZSBub3QgdG8gZG8gdGhlc2UgdHdvIHJlbW92YWxzIHNvIHRoYXQgd2UgY2FuIGRv
IHRoZW0gaGVyZSBzeW5jaHJvbm91c2x5LgorICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+
cmVtb3ZlT3BlbkRhdGFiYXNlKHRoaXMpOworICAgIERhdGFiYXNlVHJhY2tlcjo6dHJhY2tlcigp
LnJlbW92ZU9wZW5EYXRhYmFzZSh0aGlzKTsKIH0KIAogY2xhc3MgQ29udGV4dFJlbW92ZU9wZW5E
YXRhYmFzZVRhc2sgOiBwdWJsaWMgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzayB7CkBAIC00
MTUsNyArNDE5LDcgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8RGF0YWJhc2U+IG1fZGF0YWJhc2U7
CiB9OwogCi12b2lkIERhdGFiYXNlOjpjbG9zZSgpCit2b2lkIERhdGFiYXNlOjpjbG9zZShDbG9z
ZVBvbGljeSBwb2xpY3kpCiB7CiAgICAgUmVmUHRyPERhdGFiYXNlPiBwcm90ZWN0ID0gdGhpczsK
IApAQCAtNDQ0LDcgKzQ0OCw4IEBAIHZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKICAgICB9CiAKICAg
ICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPmRhdGFiYXNlVGhyZWFkKCktPnVuc2NoZWR1bGVE
YXRhYmFzZVRhc2tzKHRoaXMpOwotICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRh
c2soQ29udGV4dFJlbW92ZU9wZW5EYXRhYmFzZVRhc2s6OmNyZWF0ZSh0aGlzKSk7CisgICAgaWYg
KHBvbGljeSA9PSBSZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0KQorICAgICAgICBtX3NjcmlwdEV4
ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKENvbnRleHRSZW1vdmVPcGVuRGF0YWJhc2VUYXNrOjpj
cmVhdGUodGhpcykpOwogfQogCiB2b2lkIERhdGFiYXNlOjpzdG9wKCkKSW5kZXg6IFdlYkNvcmUv
c3RvcmFnZS9EYXRhYmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZS5oCShyZXZpc2lvbiA1NTg0NikKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMDksNyArMTA5LDggQEAgcHVibGljOgogICAgIHZvaWQgbWFya0FzRGVs
ZXRlZEFuZENsb3NlKCk7CiAgICAgYm9vbCBkZWxldGVkKCkgY29uc3QgeyByZXR1cm4gbV9kZWxl
dGVkOyB9CiAKLSAgICB2b2lkIGNsb3NlKCk7CisgICAgZW51bSBDbG9zZVBvbGljeSB7IERvTm90
UmVtb3ZlRGF0YWJhc2VGcm9tQ29udGV4dCwgUmVtb3ZlRGF0YWJhc2VGcm9tQ29udGV4dCB9Owor
ICAgIHZvaWQgY2xvc2UoQ2xvc2VQb2xpY3kpOwogICAgIGJvb2wgb3BlbmVkKCkgY29uc3QgeyBy
ZXR1cm4gbV9vcGVuZWQ7IH0KIAogICAgIHZvaWQgc3RvcCgpOwpJbmRleDogV2ViQ29yZS9zdG9y
YWdlL0RhdGFiYXNlVGFzay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFi
YXNlVGFzay5jcHAJKHJldmlzaW9uIDU1ODQ2KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
VGFzay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExNyw3ICsxMTcsOCBAQCBEYXRhYmFzZUNsb3Nl
VGFzazo6RGF0YWJhc2VDbG9zZVRhc2soRGF0CiAKIHZvaWQgRGF0YWJhc2VDbG9zZVRhc2s6OmRv
UGVyZm9ybVRhc2soKQogewotICAgIGRhdGFiYXNlKCktPmNsb3NlKCk7CisgICAgLy8gVGVsbCB0
aGUgZGF0YWJhc2Ugbm90IHRvIGNhbGwgYmFjayB0byB0aGUgY29udGV4dCB0aHJlYWQ7IHdlJ2xs
IGhhbmRsZSBpdC4KKyAgICBkYXRhYmFzZSgpLT5jbG9zZShEYXRhYmFzZTo6RG9Ob3RSZW1vdmVE
YXRhYmFzZUZyb21Db250ZXh0KTsKIH0KIAogI2lmbmRlZiBOREVCVUcKSW5kZXg6IFdlYkNvcmUv
c3RvcmFnZS9EYXRhYmFzZVRocmVhZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdl
L0RhdGFiYXNlVGhyZWFkLmNwcAkocmV2aXNpb24gNTU4NDYpCisrKyBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VUaHJlYWQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTMsNyArMTEzLDcgQEAgdm9p
ZCogRGF0YWJhc2VUaHJlYWQ6OmRhdGFiYXNlVGhyZWFkKCkKICAgICAgICAgb3BlblNldENvcHku
c3dhcChtX29wZW5EYXRhYmFzZVNldCk7CiAgICAgICAgIERhdGFiYXNlU2V0OjppdGVyYXRvciBl
bmQgPSBvcGVuU2V0Q29weS5lbmQoKTsKICAgICAgICAgZm9yIChEYXRhYmFzZVNldDo6aXRlcmF0
b3IgaXQgPSBvcGVuU2V0Q29weS5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAg
ICgqaXQpLT5jbG9zZSgpOworICAgICAgICAgICAoKml0KS0+Y2xvc2UoRGF0YWJhc2U6OlJlbW92
ZURhdGFiYXNlRnJvbUNvbnRleHQpOwogICAgIH0KIAogICAgIC8vIERldGFjaCB0aGUgdGhyZWFk
IHNvIGl0cyByZXNvdXJjZXMgYXJlIG5vIGxvbmdlciBvZiBhbnkgY29uY2VybiB0byBhbnlvbmUg
ZWxzZQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHJldmlzaW9uIDU1ODQ2
KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTUxLDEzICs1MSwxOSBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKLU9yaWdpblF1b3RhTWFuYWdlciYgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5RdW90
YU1hbmFnZXIoKQorT3JpZ2luUXVvdGFNYW5hZ2VyJiBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblF1
b3RhTWFuYWdlck5vTG9jaygpCiB7Ci0gICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAgICAgQVNTRVJU
KG1fcXVvdGFNYW5hZ2VyKTsKICAgICByZXR1cm4gKm1fcXVvdGFNYW5hZ2VyOwogfQogCitPcmln
aW5RdW90YU1hbmFnZXImIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5hZ2VyKCkKK3sK
KyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICBwb3B1
bGF0ZU9yaWdpbnMoKTsKKyAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCk7Cit9
CisKIERhdGFiYXNlVHJhY2tlciYgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyKCkKIHsKICAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKERhdGFiYXNlVHJhY2tlciwgdHJhY2tlciwgKCkpOwpAQCAtNjYs
MzYgKzcyLDI5IEBAIERhdGFiYXNlVHJhY2tlciYgRGF0YWJhc2VUcmFja2VyOjp0cmFja2UKIAog
RGF0YWJhc2VUcmFja2VyOjpEYXRhYmFzZVRyYWNrZXIoKQogICAgIDogbV9jbGllbnQoMCkKLSAg
ICAsIG1fcHJvcG9zZWREYXRhYmFzZSgwKQotI2lmbmRlZiBOREVCVUcKLSAgICAsIG1fdGhyZWFk
KGN1cnJlbnRUaHJlYWQoKSkKLSNlbmRpZgogewogICAgIFNRTGl0ZUZpbGVTeXN0ZW06OnJlZ2lz
dGVyU1FMaXRlVkZTKCk7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURp
cmVjdG9yeVBhdGgoY29uc3QgU3RyaW5nJiBwYXRoKQogewotICAgIEFTU0VSVChjdXJyZW50VGhy
ZWFkKCkgPT0gbV90aHJlYWQpOwogICAgIEFTU0VSVCghbV9kYXRhYmFzZS5pc09wZW4oKSk7Ci0g
ICAgbV9kYXRhYmFzZURpcmVjdG9yeVBhdGggPSBwYXRoOworICAgIG1fZGF0YWJhc2VEaXJlY3Rv
cnlQYXRoID0gcGF0aC50aHJlYWRzYWZlQ29weSgpOwogfQogCi1jb25zdCBTdHJpbmcmIERhdGFi
YXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKCkgY29uc3QKK1N0cmluZyBEYXRhYmFz
ZVRyYWNrZXI6OmRhdGFiYXNlRGlyZWN0b3J5UGF0aCgpIGNvbnN0CiB7Ci0gICAgQVNTRVJUKGN1
cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgcmV0dXJuIG1fZGF0YWJhc2VEaXJlY3Rv
cnlQYXRoOworICAgIHJldHVybiBtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aC50aHJlYWRzYWZlQ29w
eSgpOwogfQogCiBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyRGF0YWJhc2VQYXRoKCkg
Y29uc3QKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKICAgICBy
ZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0aChtX2Rh
dGFiYXNlRGlyZWN0b3J5UGF0aCwgIkRhdGFiYXNlcy5kYiIpOwogfQogCiB2b2lkIERhdGFiYXNl
VHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZShib29sIGNyZWF0ZUlmRG9lc05vdEV4aXN0KQog
ewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAgIEFTU0VSVCgh
bV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAKICAgICBpZiAobV9kYXRhYmFzZS5pc09wZW4o
KSkKICAgICAgICAgcmV0dXJuOwpAQCAtMTA2LDY3ICsxMDUsODcgQEAgdm9pZCBEYXRhYmFzZVRy
YWNrZXI6Om9wZW5UcmFja2VyRGF0YWJhcwogCiAgICAgaWYgKCFtX2RhdGFiYXNlLm9wZW4oZGF0
YWJhc2VQYXRoKSkgewogICAgICAgICAvLyBGSVhNRTogV2hhdCBkbyBkbyBoZXJlPworICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlUGF0aCAlcy4iLCBkYXRhYmFzZVBh
dGguYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIG1fZGF0YWJh
c2Uuc2V0U2hhcmFibGUodHJ1ZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLnRhYmxlRXhpc3RzKCJP
cmlnaW5zIikpIHsKICAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKCJDUkVB
VEUgVEFCTEUgT3JpZ2lucyAob3JpZ2luIFRFWFQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0Us
IHF1b3RhIElOVEVHRVIgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7IikpIHsKICAgICAgICAg
ICAgIC8vIEZJWE1FOiBhbmQgaGVyZQorICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8g
Y3JlYXRlIE9yaWdpbnMgdGFibGUiKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIW1fZGF0
YWJhc2UudGFibGVFeGlzdHMoIkRhdGFiYXNlcyIpKSB7CiAgICAgICAgIGlmICghbV9kYXRhYmFz
ZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIERhdGFiYXNlcyAoZ3VpZCBJTlRFR0VSIFBS
SU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsIG9yaWdpbiBURVhULCBuYW1lIFRFWFQsIGRpc3BsYXlO
YW1lIFRFWFQsIGVzdGltYXRlZFNpemUgSU5URUdFUiwgcGF0aCBURVhUKTsiKSkgewogICAgICAg
ICAgICAgLy8gRklYTUU6IGFuZCBoZXJlCisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0
byBjcmVhdGUgRGF0YWJhc2VzIHRhYmxlIik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIGJvb2wg
RGF0YWJhc2VUcmFja2VyOjpjYW5Fc3RhYmxpc2hEYXRhYmFzZShTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiBjb250ZXh0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5h
bWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRo
cmVhZCgpID09IG1fdGhyZWFkKTsKLQotICAgIC8vIFBvcHVsYXRlIHRoZSBvcmlnaW5zIGJlZm9y
ZSB3ZSBlc3RhYmxpc2ggYSBkYXRhYmFzZTsgdGhpcyBndWFyYW50ZWVzIHRoYXQgcXVvdGFGb3JP
cmlnaW4KLSAgICAvLyBjYW4gcnVuIG9uIHRoZSBkYXRhYmFzZSB0aHJlYWQgbGF0ZXIuCi0gICAg
cG9wdWxhdGVPcmlnaW5zKCk7Ci0KICAgICBTZWN1cml0eU9yaWdpbiogb3JpZ2luID0gY29udGV4
dC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBQcm9wb3NlZERhdGFiYXNlIGRldGFpbHM7CiAKLSAg
ICAvLyBTaW5jZSB3ZSdyZSBpbW1pbmVudGx5IG9wZW5pbmcgYSBkYXRhYmFzZSB3aXRoaW4gdGhp
cyBjb250ZXh0J3Mgb3JpZ2luLCBtYWtlIHN1cmUgdGhpcyBvcmlnaW4gaXMgYmVpbmcgdHJhY2tl
ZCBieSB0aGUgUXVvdGFUcmFja2VyCi0gICAgLy8gYnkgZmV0Y2hpbmcgaXQncyBjdXJyZW50IHVz
YWdlIG5vdwotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1c2FnZSA9IHVzYWdlRm9yT3JpZ2luKG9y
aWdpbik7Ci0KLSAgICAvLyBJZiBhIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLCBpZ25vcmUgdGhl
IHBhc3NlZC1pbiBlc3RpbWF0ZWQgc2l6ZSBhbmQgc2F5IGl0J3MgT0suCi0gICAgaWYgKGhhc0Vu
dHJ5Rm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSkKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
dW5zaWduZWQgbG9uZyBsb25nIHJlcXVpcmVtZW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0
ZW1wVXNhZ2U7CisgICAgeworICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBsb2Nr
ZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJh
c2UobV9kYXRhYmFzZUd1YXJkKTsKIAotICAgIC8vIElmIHRoZSBkYXRhYmFzZSB3aWxsIGZpdCwg
YWxsb3cgaXRzIGNyZWF0aW9uLgotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZXF1aXJlbWVudCA9
IHVzYWdlICsgbWF4KDFVTCwgZXN0aW1hdGVkU2l6ZSk7Ci0gICAgaWYgKHJlcXVpcmVtZW50IDwg
dXNhZ2UpCi0gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWYgdGhlIGVzdGltYXRlZCBzaXplIGlz
IHNvIGJpZyBpdCBjYXVzZXMgYW4gb3ZlcmZsb3csIGRvbid0IGFsbG93IGNyZWF0aW9uLgotICAg
IGlmIChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbihvcmlnaW4pKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAKLSAgICAvLyBHaXZlIHRoZSBj
aHJvbWUgY2xpZW50IGEgY2hhbmNlIHRvIGluY3JlYXNlIHRoZSBxdW90YS4KLSAgICAvLyBUZW1w
b3JhcmlseSBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBwcm9wb3NlZCBkYXRhYmFzZSBhdmFpbGFi
bGUsIHNvIHRoZSBjbGllbnQgY2FuIGdldCBhdCB0aGVtLgotICAgIHBhaXI8U2VjdXJpdHlPcmln
aW4qLCBEYXRhYmFzZURldGFpbHM+IGRldGFpbHMob3JpZ2luLCBEYXRhYmFzZURldGFpbHMobmFt
ZSwgZGlzcGxheU5hbWUsIGVzdGltYXRlZFNpemUsIDApKTsKLSAgICBtX3Byb3Bvc2VkRGF0YWJh
c2UgPSAmZGV0YWlsczsKKyAgICAgICAgLy8gU2luY2Ugd2UncmUgaW1taW5lbnRseSBvcGVuaW5n
IGEgZGF0YWJhc2Ugd2l0aGluIHRoaXMgY29udGV4dCdzIG9yaWdpbiwgbWFrZSBzdXJlIHRoaXMg
b3JpZ2luIGlzIGJlaW5nIHRyYWNrZWQgYnkgdGhlIFF1b3RhVHJhY2tlcgorICAgICAgICAvLyBi
eSBmZXRjaGluZyBpdHMgY3VycmVudCB1c2FnZSBub3cuCisgICAgICAgIHVuc2lnbmVkIGxvbmcg
bG9uZyB1c2FnZSA9IHVzYWdlRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7CisKKyAgICAgICAgLy8g
SWYgYSBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cywgaWdub3JlIHRoZSBwYXNzZWQtaW4gZXN0aW1h
dGVkIHNpemUgYW5kIHNheSBpdCdzIE9LLgorICAgICAgICBpZiAoaGFzRW50cnlGb3JEYXRhYmFz
ZShvcmlnaW4sIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8g
SWYgdGhlIGRhdGFiYXNlIHdpbGwgZml0LCBhbGxvdyBpdHMgY3JlYXRpb24uCisgICAgICAgIHJl
cXVpcmVtZW50ID0gdXNhZ2UgKyBtYXgoMVVMLCBlc3RpbWF0ZWRTaXplKTsKKyAgICAgICAgdGVt
cFVzYWdlID0gdXNhZ2U7CisgICAgICAgIGlmIChyZXF1aXJlbWVudCA8IHVzYWdlKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJZiB0aGUgZXN0aW1hdGVkIHNpemUgaXMgc28gYmlnIGl0
IGNhdXNlcyBhbiBvdmVyZmxvdywgZG9uJ3QgYWxsb3cgY3JlYXRpb24uCisgICAgICAgIGlmIChy
ZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbk5vTG9jayhvcmlnaW4pKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gR2l2ZSB0aGUgY2hyb21lIGNsaWVudCBhIGNoYW5j
ZSB0byBpbmNyZWFzZSB0aGUgcXVvdGEuCisgICAgICAgIC8vIFRlbXBvcmFyaWx5IG1ha2UgdGhl
IGRldGFpbHMgb2YgdGhlIHByb3Bvc2VkIGRhdGFiYXNlIGF2YWlsYWJsZSwgc28gdGhlIGNsaWVu
dCBjYW4gZ2V0IGF0IHRoZW0uCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IGp1
c3QgcGFzcyB0aGUgZGV0YWlscyBpbnRvIHRoaXMgY2FsbCwgcmF0aGVyIHRoYW4gdXNpbmcgbV9w
cm9wb3NlZERhdGFiYXNlcy4KKyAgICAgICAgZGV0YWlscyA9IFByb3Bvc2VkRGF0YWJhc2Uob3Jp
Z2luLT50aHJlYWRzYWZlQ29weSgpLCBEYXRhYmFzZURldGFpbHMobmFtZS50aHJlYWRzYWZlQ29w
eSgpLCBkaXNwbGF5TmFtZS50aHJlYWRzYWZlQ29weSgpLCBlc3RpbWF0ZWRTaXplLCAwKSk7Cisg
ICAgICAgIG1fcHJvcG9zZWREYXRhYmFzZXMuYWRkKCZkZXRhaWxzKTsKKyAgICB9CisgICAgLy8g
RHJvcCBhbGwgbG9ja3MgYmVmb3JlIGNhbGxpbmcgb3V0OyB3ZSBkb24ndCBrbm93IHdoYXQgdGhl
eSdsbCBkby4KICAgICBjb250ZXh0LT5kYXRhYmFzZUV4Y2VlZGVkUXVvdGEobmFtZSk7Ci0gICAg
bV9wcm9wb3NlZERhdGFiYXNlID0gMDsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tE
YXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgICAgICBtX3Byb3Bvc2VkRGF0YWJhc2VzLnJl
bW92ZSgmZGV0YWlscyk7CisgICAgfQogCiAgICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdpbGwgZml0
IG5vdywgYWxsb3cgaXRzIGNyZWF0aW9uLgogICAgIHJldHVybiByZXF1aXJlbWVudCA8PSBxdW90
YUZvck9yaWdpbihvcmlnaW4pOwogfQogCitib29sIERhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlG
b3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKK3sKKyAgICBBU1NFUlQoIW1f
ZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKKyAgICBy
ZXR1cm4gbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKTsKK30KKwogYm9vbCBEYXRhYmFzZVRy
YWNrZXI6Omhhc0VudHJ5Rm9yT3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAg
QVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAgTXV0ZXhMb2NrZXIgbG9j
a0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAgICAgcG9wdWxhdGVPcmlnaW5zKCk7Ci0gICAg
TXV0ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFyZCk7Ci0gICAgcmV0dXJuIG1f
cXVvdGFNYXAtPmNvbnRhaW5zKG9yaWdpbik7CisgICAgcmV0dXJuIGhhc0VudHJ5Rm9yT3JpZ2lu
Tm9Mb2NrKG9yaWdpbik7CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvckRh
dGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VJZGVu
dGlmaWVyKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAg
IEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAgICAgb3BlblRyYWNrZXJEYXRh
YmFzZShmYWxzZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1
cm4gZmFsc2U7CkBAIC0xOTMsMTYgKzIxMiwxNyBAQCB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJh
c2VUcmFja2VyOjpnZXRNCiAKIFN0cmluZyBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblBhdGgoU2Vj
dXJpdHlPcmlnaW4qIG9yaWdpbikgY29uc3QKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgp
ID09IG1fdGhyZWFkKTsKLSAgICByZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJh
c2VGaWxlTmFtZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aCwgb3JpZ2luLT5kYXRhYmFz
ZUlkZW50aWZpZXIoKSk7CisgICAgcmV0dXJuIFNRTGl0ZUZpbGVTeXN0ZW06OmFwcGVuZERhdGFi
YXNlRmlsZU5hbWVUb1BhdGgobV9kYXRhYmFzZURpcmVjdG9yeVBhdGgudGhyZWFkc2FmZUNvcHko
KSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiB9CiAKLVN0cmluZyBEYXRhYmFzZVRy
YWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBib29sIGNyZWF0ZUlmTm90RXhpc3RzKQorU3RyaW5nIERhdGFiYXNlVHJh
Y2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBj
b25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RFeGlzdHMpCiB7Ci0gICAgQVNTRVJU
KGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3Vh
cmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQoIW9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRy
eUxvY2soKSk7CiAKLSAgICBpZiAobV9wcm9wb3NlZERhdGFiYXNlICYmIG1fcHJvcG9zZWREYXRh
YmFzZS0+Zmlyc3QgPT0gb3JpZ2luICYmIG1fcHJvcG9zZWREYXRhYmFzZS0+c2Vjb25kLm5hbWUo
KSA9PSBuYW1lKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgZm9yIChIYXNoU2V0PFBy
b3Bvc2VkRGF0YWJhc2UqPjo6aXRlcmF0b3IgaXRlciA9IG1fcHJvcG9zZWREYXRhYmFzZXMuYmVn
aW4oKTsgaXRlciAhPSBtX3Byb3Bvc2VkRGF0YWJhc2VzLmVuZCgpOyArK2l0ZXIpCisgICAgICAg
IGlmICgoKml0ZXIpLT5maXJzdCA9PSBvcmlnaW4gJiYgKCppdGVyKS0+c2Vjb25kLm5hbWUoKSA9
PSBuYW1lKQorICAgICAgICAgICAgcmV0dXJuIFN0cmluZygpOwogCiAgICAgU3RyaW5nIG9yaWdp
bklkZW50aWZpZXIgPSBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpOwogICAgIFN0cmluZyBv
cmlnaW5QYXRoID0gdGhpcy0+b3JpZ2luUGF0aChvcmlnaW4pOwpAQCAtMjEyLDcgKzIzMiw2IEBA
IFN0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWIKICAgICAgICAgcmV0dXJu
IFN0cmluZygpOwogCiAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYSBwYXRoIGZvciB0aGlzIGRhdGFi
YXNlIHlldAotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwogICAgIGlmICghbV9kYXRh
YmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwogICAgIFNRTGl0ZVN0YXRl
bWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBwYXRoIEZST00gRGF0YWJhc2VzIFdI
RVJFIG9yaWdpbj0/IEFORCBuYW1lPT87Iik7CkBAIC0yMzEsMzYgKzI1MCw0MiBAQCBTdHJpbmcg
RGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiCiAgICAgICAgIHJldHVybiBTdHJpbmco
KTsKIAogICAgIGlmIChyZXN1bHQgIT0gU1FMUmVzdWx0RG9uZSkgewotICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byByZXRyaWV2ZSBmaWxlbmFtZSBmcm9tIERhdGFiYXNlIFRyYWNrZXIgZm9y
IG9yaWdpbiAlcywgbmFtZSAlcyIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWko
KS5kYXRhKCksIG5hbWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBMT0dfRVJST1IoIkZhaWxl
ZCB0byByZXRyaWV2ZSBmaWxlbmFtZSBmcm9tIERhdGFiYXNlIFRyYWNrZXIgZm9yIG9yaWdpbiAl
cywgbmFtZSAlcyIsIG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRhKCksIG5hbWUuYXNjaWko
KS5kYXRhKCkpOwogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgfQogICAgIHN0YXRlbWVu
dC5maW5hbGl6ZSgpOwogCi0gICAgU3RyaW5nIGZpbGVOYW1lID0gU1FMaXRlRmlsZVN5c3RlbTo6
Z2V0RmlsZU5hbWVGb3JOZXdEYXRhYmFzZShvcmlnaW5QYXRoLCBuYW1lLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpLCAmbV9kYXRhYmFzZSk7CisgICAgU3RyaW5nIGZpbGVOYW1lID0gU1FM
aXRlRmlsZVN5c3RlbTo6Z2V0RmlsZU5hbWVGb3JOZXdEYXRhYmFzZShvcmlnaW5QYXRoLCBuYW1l
LCBvcmlnaW5JZGVudGlmaWVyLCAmbV9kYXRhYmFzZSk7CiAgICAgaWYgKCFhZGREYXRhYmFzZShv
cmlnaW4sIG5hbWUsIGZpbGVOYW1lKSkKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwogCiAgICAg
Ly8gSWYgdGhpcyBvcmlnaW4ncyBxdW90YSBpcyBiZWluZyB0cmFja2VkIChvcGVuIGhhbmRsZSB0
byBhIGRhdGFiYXNlIGluIHRoaXMgb3JpZ2luKSwgYWRkIHRoaXMgbmV3IGRhdGFiYXNlCiAgICAg
Ly8gdG8gdGhlIHF1b3RhIG1hbmFnZXIgbm93CiAgICAgU3RyaW5nIGZ1bGxGaWxlUGF0aCA9IFNR
TGl0ZUZpbGVTeXN0ZW06OmFwcGVuZERhdGFiYXNlRmlsZU5hbWVUb1BhdGgob3JpZ2luUGF0aCwg
ZmlsZU5hbWUpOwotICAgIHsKLSAgICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gbG9j
a2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKLSAgICAgICAgaWYgKG9yaWdpblF1b3RhTWFuYWdl
cigpLnRyYWNrc09yaWdpbihvcmlnaW4pKQotICAgICAgICAgICAgb3JpZ2luUXVvdGFNYW5hZ2Vy
KCkuYWRkRGF0YWJhc2Uob3JpZ2luLCBuYW1lLCBmdWxsRmlsZVBhdGgpOwotICAgIH0KKyAgICBp
ZiAob3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkudHJhY2tzT3JpZ2luKG9yaWdpbikpCisgICAg
ICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmFkZERhdGFiYXNlKG9yaWdpbiwgbmFtZSwg
ZnVsbEZpbGVQYXRoKTsKIAogICAgIHJldHVybiBmdWxsRmlsZVBhdGg7CiB9CiAKK1N0cmluZyBE
YXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdp
biwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sIGNyZWF0ZUlmTm90RXhpc3RzKQoreworICAgIExv
Y2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IGxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Cisg
ICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgcG9wdWxh
dGVPcmlnaW5zKCk7CisKKyAgICByZXR1cm4gZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayhvcmln
aW4sIG5hbWUsIGNyZWF0ZUlmTm90RXhpc3RzKS50aHJlYWRzYWZlQ29weSgpOworfQorCiB2b2lk
IERhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKCkKIHsKKyAgICBBU1NFUlQoIW1fZGF0
YWJhc2VHdWFyZC50cnlMb2NrKCkpOwogICAgIGlmIChtX3F1b3RhTWFwKQogICAgICAgICByZXR1
cm47CiAKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQogICAgIG1f
cXVvdGFNYXAuc2V0KG5ldyBRdW90YU1hcCk7Ci0gICAgbV9xdW90YU1hbmFnZXIuc2V0KG5ldyBP
cmlnaW5RdW90YU1hbmFnZXIpOworICAgIGlmICghbV9xdW90YU1hbmFnZXIpCisgICAgICAgIG1f
cXVvdGFNYW5hZ2VyLnNldChuZXcgT3JpZ2luUXVvdGFNYW5hZ2VyKTsKIAogICAgIG9wZW5UcmFj
a2VyRGF0YWJhc2UoZmFsc2UpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKQEAgLTI2
OCwzMCArMjkzLDMyIEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpwb3B1bGF0ZU9yaWdpbnMoKQog
CiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIG9yaWdp
biwgcXVvdGEgRlJPTSBPcmlnaW5zIik7CiAKLSAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAh
PSBTUUxSZXN1bHRPaykKKyAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRP
aykgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBwcmVwYXJlIHN0YXRlbWVudC4iKTsK
ICAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIGludCByZXN1bHQ7CiAgICAgd2hpbGUgKChy
ZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpKSA9PSBTUUxSZXN1bHRSb3cpIHsKICAgICAgICAgUmVm
UHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbjo6Y3JlYXRlRnJvbURh
dGFiYXNlSWRlbnRpZmllcihzdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKSk7Ci0gICAgICAgIG1f
cXVvdGFNYXAtPnNldChvcmlnaW4uZ2V0KCksIHN0YXRlbWVudC5nZXRDb2x1bW5JbnQ2NCgxKSk7
CisgICAgICAgIG1fcXVvdGFNYXAtPnNldChvcmlnaW4uZ2V0KCktPnRocmVhZHNhZmVDb3B5KCks
IHN0YXRlbWVudC5nZXRDb2x1bW5JbnQ2NCgxKSk7CiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAh
PSBTUUxSZXN1bHREb25lKQotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byByZWFkIGluIGFs
bCBvcmlnaW5zIGZyb20gdGhlIGRhdGFiYXNlIik7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVk
IHRvIHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UuIik7CiB9CiAKIHZvaWQg
RGF0YWJhc2VUcmFja2VyOjpvcmlnaW5zKFZlY3RvcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+ID4m
IHJlc3VsdCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAg
ICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKICAgICBwb3B1bGF0
ZU9yaWdpbnMoKTsKLSAgICBNdXRleExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJk
KTsKKyAgICBBU1NFUlQobV9xdW90YU1hcCk7CiAgICAgY29weUtleXNUb1ZlY3RvcigqbV9xdW90
YU1hcCwgcmVzdWx0KTsKIH0KIAotYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNG
b3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9yPFN0cmluZz4mIHJlc3VsdFZl
Y3RvcikKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2Nr
KFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIFZlY3RvcjxTdHJpbmc+JiByZXN1bHRWZWN0b3IpCiB7
Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAgQVNTRVJUKCFt
X2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNl
KTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
QEAgLTMxNSw0NCArMzQyLDYzIEBAIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVz
Rm9yT3IKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRGF0YWJhc2VEZXRhaWxzIERhdGFiYXNlVHJh
Y2tlcjo6ZGV0YWlsc0Zvck5hbWVBbmRPcmlnaW4oY29uc3QgU3RyaW5nJiBuYW1lLCBTZWN1cml0
eU9yaWdpbiogb3JpZ2luKQorYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JP
cmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9yPFN0cmluZz4mIHJlc3VsdFZlY3Rv
cikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQotICAgIGlm
IChtX3Byb3Bvc2VkRGF0YWJhc2UgJiYgbV9wcm9wb3NlZERhdGFiYXNlLT5maXJzdCA9PSBvcmln
aW4gJiYgbV9wcm9wb3NlZERhdGFiYXNlLT5zZWNvbmQubmFtZSgpID09IG5hbWUpCi0gICAgICAg
IHJldHVybiBtX3Byb3Bvc2VkRGF0YWJhc2UtPnNlY29uZDsKKyAgICBNdXRleExvY2tlciBsb2Nr
RGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICBWZWN0b3I8U3RyaW5nPiB0ZW1wOworICAg
IGlmICghZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayhvcmlnaW4sIHRlbXApKSB7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRlcmF0
b3IgaXRlciA9IHRlbXAuYmVnaW4oKTsgaXRlciAhPSB0ZW1wLmVuZCgpOyArK2l0ZXIpCisgICAg
ICAgIHJlc3VsdFZlY3Rvci5hcHBlbmQoaXRlci0+dGhyZWFkc2FmZUNvcHkoKSk7CisgICAgcmV0
dXJuIHRydWU7Cit9CiAKK0RhdGFiYXNlRGV0YWlscyBEYXRhYmFzZVRyYWNrZXI6OmRldGFpbHNG
b3JOYW1lQW5kT3JpZ2luKGNvbnN0IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlPcmlnaW4qIG9yaWdp
bikKK3sKICAgICBTdHJpbmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVu
dGlmaWVyKCk7CisgICAgU3RyaW5nIGRpc3BsYXlOYW1lOworICAgIGludDY0X3QgZXhwZWN0ZWRV
c2FnZTsKIAotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwotICAgIGlmICghbV9kYXRh
YmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOwotICAgIFNR
TGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBkaXNwbGF5TmFtZSwg
ZXN0aW1hdGVkU2l6ZSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyBBTkQgbmFtZT0/Iik7
Ci0gICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCi0gICAgICAgIHJl
dHVybiBEYXRhYmFzZURldGFpbHMoKTsKLQotICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmln
aW5JZGVudGlmaWVyKTsKLSAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgbmFtZSk7Ci0KLSAgICBp
bnQgcmVzdWx0ID0gc3RhdGVtZW50LnN0ZXAoKTsKLSAgICBpZiAocmVzdWx0ID09IFNRTFJlc3Vs
dERvbmUpCi0gICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKyAgICB7CisgICAgICAg
IE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogCi0gICAgaWYgKHJl
c3VsdCAhPSBTUUxSZXN1bHRSb3cpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZXRyaWV2
aW5nIGRldGFpbHMgZm9yIGRhdGFiYXNlICVzIGluIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIgZGF0
YWJhc2UiLCBuYW1lLmFzY2lpKCkuZGF0YSgpLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0
YSgpKTsKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgICAgICBmb3IgKEhh
c2hTZXQ8UHJvcG9zZWREYXRhYmFzZSo+OjppdGVyYXRvciBpdGVyID0gbV9wcm9wb3NlZERhdGFi
YXNlcy5iZWdpbigpOyBpdGVyICE9IG1fcHJvcG9zZWREYXRhYmFzZXMuZW5kKCk7ICsraXRlcikK
KyAgICAgICAgICAgIGlmICgoKml0ZXIpLT5maXJzdCA9PSBvcmlnaW4gJiYgKCppdGVyKS0+c2Vj
b25kLm5hbWUoKSA9PSBuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiAoKml0ZXIpLT5zZWNv
bmQ7CisKKyAgICAgICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CisgICAgICAgIGlmICgh
bV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMo
KTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNU
IGRpc3BsYXlOYW1lLCBlc3RpbWF0ZWRTaXplIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/
IEFORCBuYW1lPT8iKTsKKyAgICAgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVz
dWx0T2spCisgICAgICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7CisKKyAgICAgICAg
c3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZpZXIpOworICAgICAgICBzdGF0ZW1l
bnQuYmluZFRleHQoMiwgbmFtZSk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IHN0YXRlbWVudC5z
dGVwKCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gU1FMUmVzdWx0RG9uZSkKKyAgICAgICAgICAg
IHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTFJl
c3VsdFJvdykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZXRyaWV2aW5nIGRldGFp
bHMgZm9yIGRhdGFiYXNlICVzIGluIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIgZGF0YWJhc2UiLCBu
YW1lLmFzY2lpKCkuZGF0YSgpLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICAgICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKyAgICAgICAgfQorICAgICAgICBk
aXNwbGF5TmFtZSA9IHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBleHBlY3Rl
ZFVzYWdlID0gc3RhdGVtZW50LmdldENvbHVtbkludDY0KDEpOwogICAgIH0KIAotICAgIHJldHVy
biBEYXRhYmFzZURldGFpbHMobmFtZSwgc3RhdGVtZW50LmdldENvbHVtblRleHQoMCksIHN0YXRl
bWVudC5nZXRDb2x1bW5JbnQ2NCgxKSwgdXNhZ2VGb3JEYXRhYmFzZShuYW1lLCBvcmlnaW4pKTsK
KyAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKG5hbWUsIGRpc3BsYXlOYW1lLCBleHBlY3RlZFVz
YWdlLCB1c2FnZUZvckRhdGFiYXNlKG5hbWUsIG9yaWdpbikpOwogfQogCiB2b2lkIERhdGFiYXNl
VHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxzKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkaXNwbGF5TmFtZSwgdW5zaWduZWQgbG9uZyBl
c3RpbWF0ZWRTaXplKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQp
OwotCiAgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXIgPSBvcmlnaW4tPmRhdGFiYXNlSWRlbnRp
ZmllcigpOwogICAgIGludDY0X3QgZ3VpZCA9IDA7CiAKKyAgICBNdXRleExvY2tlciBsb2NrRGF0
YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKwogICAgIG9wZW5UcmFja2VyRGF0YWJhc2UodHJ1ZSk7
CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CkBAIC00MDAs
NyArNDQ2LDYgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGV0YWlscwogCiB1
bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvckRhdGFiYXNlKGNvbnN0
IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3Vy
cmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKICAgICBTdHJpbmcgcGF0aCA9IGZ1bGxQYXRoRm9y
RGF0YWJhc2Uob3JpZ2luLCBuYW1lLCBmYWxzZSk7CiAgICAgaWYgKHBhdGguaXNFbXB0eSgpKQog
ICAgICAgICByZXR1cm4gMDsKQEAgLTQyOCw3ICs0NzMsNyBAQCB2b2lkIERhdGFiYXNlVHJhY2tl
cjo6YWRkT3BlbkRhdGFiYXNlKERhCiAgICAgRGF0YWJhc2VTZXQqIGRhdGFiYXNlU2V0ID0gbmFt
ZU1hcC0+Z2V0KG5hbWUpOwogICAgIGlmICghZGF0YWJhc2VTZXQpIHsKICAgICAgICAgZGF0YWJh
c2VTZXQgPSBuZXcgRGF0YWJhc2VTZXQ7Ci0gICAgICAgIG5hbWVNYXAtPnNldChuYW1lLCBkYXRh
YmFzZVNldCk7CisgICAgICAgIG5hbWVNYXAtPnNldChuYW1lLnRocmVhZHNhZmVDb3B5KCksIGRh
dGFiYXNlU2V0KTsKICAgICB9CiAKICAgICBkYXRhYmFzZVNldC0+YWRkKGRhdGFiYXNlKTsKQEAg
LTQ0MSw2ICs0ODYsNyBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNl
CiAgICAgaWYgKCFkYXRhYmFzZSkKICAgICAgICAgcmV0dXJuOwogCisgICAgTG9ja2VyPE9yaWdp
blF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsK
ICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFiYXNlTWFwR3Vh
cmQpOwogCiAgICAgaWYgKCFtX29wZW5EYXRhYmFzZU1hcCkgewpAQCAtNDc2LDYgKzUyMiwxMCBA
QCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlCiAKICAgICBtX29wZW5E
YXRhYmFzZU1hcC0+cmVtb3ZlKGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigpKTsKICAgICBkZWxl
dGUgbmFtZU1hcDsKKyAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5yZW1vdmVPcmlnaW4o
ZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpOworCisgICAgLy8gVGhyb3cgYXdheSBtX3F1b3Rh
TWFwIHdoZW5ldmVyIHdlJ3ZlIGNsZWFyZWQgb3V0IGFuIG9yaWdpbi0tb3RoZXJ3aXNlIHdlIG5l
dmVyIGdldCByaWQgb2Ygc3RhbGUgZW50cmllcy4gIFRoZSBuZXh0IGNhbGwgdGhhdCBuZWVkcyBp
dCB3aWxsIHBvcHVsYXRlT3JpZ2lucygpLgorICAgIG1fcXVvdGFNYXAuY2xlYXIoKTsKIH0KIAog
dm9pZCBEYXRhYmFzZVRyYWNrZXI6OmdldE9wZW5EYXRhYmFzZXMoU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBIYXNoU2V0PFJlZlB0cjxEYXRhYmFzZT4gPiogZGF0
YWJhc2VzKQpAQCAtNDk2LDkyICs1NDYsMTAzIEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpnZXRP
cGVuRGF0YWJhc2VzKFMKICAgICAgICAgZGF0YWJhc2VzLT5hZGQoKml0KTsKIH0KIAotdW5zaWdu
ZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW4oU2VjdXJpdHlPcmln
aW4qIG9yaWdpbikKK3Vuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9y
T3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJl
bnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4g
bG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICBBU1NFUlQoIW9yaWdpblF1b3RhTWFu
YWdlck5vTG9jaygpLnRyeUxvY2soKSk7CiAKICAgICAvLyBVc2UgdGhlIE9yaWdpblF1b3RhTWFu
YWdlciBtZWNoYW5pc20gdG8gY2FsY3VsYXRlIHRoZSB1c2FnZQotICAgIGlmIChvcmlnaW5RdW90
YU1hbmFnZXIoKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKLSAgICAgICAgcmV0dXJuIG9yaWdpblF1
b3RhTWFuYWdlcigpLmRpc2tVc2FnZShvcmlnaW4pOworICAgIGlmIChvcmlnaW5RdW90YU1hbmFn
ZXJOb0xvY2soKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKKyAgICAgICAgcmV0dXJuIG9yaWdpblF1
b3RhTWFuYWdlck5vTG9jaygpLmRpc2tVc2FnZShvcmlnaW4pOwogCiAgICAgLy8gSWYgdGhlIE9y
aWdpblF1b3RhTWFuYWdlciBkb2Vzbid0IHRyYWNrIHRoaXMgb3JpZ2luIGFscmVhZHksIHByaW1l
IGl0IHRvIGRvIHNvCi0gICAgb3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tPcmlnaW4ob3JpZ2lu
KTsKKyAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja09yaWdpbihvcmlnaW4pOwog
CiAgICAgVmVjdG9yPFN0cmluZz4gbmFtZXM7Ci0gICAgZGF0YWJhc2VOYW1lc0Zvck9yaWdpbihv
cmlnaW4sIG5hbWVzKTsKKyAgICBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbiwg
bmFtZXMpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgKytp
KQotICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS5hZGREYXRhYmFzZShvcmlnaW4sIG5hbWVz
W2ldLCBmdWxsUGF0aEZvckRhdGFiYXNlKG9yaWdpbiwgbmFtZXNbaV0sIGZhbHNlKSk7CisgICAg
ICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmFkZERhdGFiYXNlKG9yaWdpbiwgbmFtZXNb
aV0sIGZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2sob3JpZ2luLCBuYW1lc1tpXSwgZmFsc2UpKTsK
IAotICAgIGlmICghb3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tzT3JpZ2luKG9yaWdpbikpCisg
ICAgaWYgKCFvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmlnaW4ob3JpZ2luKSkK
ICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIG9yaWdpblF1b3RhTWFuYWdlcigpLmRpc2tV
c2FnZShvcmlnaW4pOworICAgIHJldHVybiBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5kaXNr
VXNhZ2Uob3JpZ2luKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6
dXNhZ2VGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKK3sKKyAgICBMb2NrZXI8T3Jp
Z2luUXVvdGFNYW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworCisgICAgcmV0
dXJuIHVzYWdlRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9u
ZyBEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBv
cmlnaW4pCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBB
U1NFUlQobV9xdW90YU1hcCk7CisgICAgcmV0dXJuIG1fcXVvdGFNYXAtPmdldChvcmlnaW4pOwog
fQogCiB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpxdW90YUZvck9yaWdpbihT
ZWN1cml0eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0g
bV90aHJlYWQgfHwgbV9xdW90YU1hcCk7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1f
ZGF0YWJhc2VHdWFyZCk7CiAgICAgcG9wdWxhdGVPcmlnaW5zKCk7Ci0gICAgTXV0ZXhMb2NrZXIg
bG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFyZCk7Ci0gICAgcmV0dXJuIG1fcXVvdGFNYXAtPmdl
dChvcmlnaW4pOworICAgIHJldHVybiBxdW90YUZvck9yaWdpbk5vTG9jayhvcmlnaW4pOwogfQog
CiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0UXVvdGEoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwg
dW5zaWduZWQgbG9uZyBsb25nIHF1b3RhKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkg
PT0gbV90aHJlYWQpOwotICAgIGlmIChxdW90YUZvck9yaWdpbihvcmlnaW4pID09IHF1b3RhKQor
ICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworCisgICAgcG9w
dWxhdGVPcmlnaW5zKCk7CisgICAgaWYgKHF1b3RhRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbikgPT0g
cXVvdGEpCiAgICAgICAgIHJldHVybjsKIAogICAgIG9wZW5UcmFja2VyRGF0YWJhc2UodHJ1ZSk7
CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CiAKLSAgICB7
Ci0gICAgICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3RhTWFwR3VhcmQpOwotCi0g
ICAgICAgIGlmICghbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKSkgewotICAgICAgICAgICAg
U1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElOVE8gT3JpZ2lu
cyBWQUxVRVMgKD8sID8pIik7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAh
PSBTUUxSZXN1bHRPaykgewotICAgICAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVz
dGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRp
ZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkp
OwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMiwgcXVvdGEpOwotCi0gICAg
ICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5zdGVwKCkgIT0gU1FMUmVzdWx0RG9uZSkKLSAgICAg
ICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAlcyBp
biB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRh
KCkpOwotICAgICAgICAgICAgfQorICAgIGlmICghbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2lu
KSkgeworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNF
UlQgSU5UTyBPcmlnaW5zIFZBTFVFUyAoPywgPykiKTsKKyAgICAgICAgaWYgKHN0YXRlbWVudC5w
cmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxl
IHRvIGVzdGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNl
SWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlVQREFURSBPcmlnaW5z
IFNFVCBxdW90YT0/IFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgICAgICAgICBib29sIGVycm9yID0g
c3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPazsKLSAgICAgICAgICAgIGlmICghZXJy
b3IpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEludDY0KDEsIHF1b3RhKTsKLSAg
ICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRh
YmFzZUlkZW50aWZpZXIoKSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEludDY0KDIsIHF1
b3RhKTsKIAotICAgICAgICAgICAgICAgIGVycm9yID0gIXN0YXRlbWVudC5leGVjdXRlQ29tbWFu
ZCgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5zdGVwKCkgIT0g
U1FMUmVzdWx0RG9uZSkKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3Rh
Ymxpc2ggb3JpZ2luICVzIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZp
ZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBT
UUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJVUERBVEUgT3JpZ2lucyBTRVQg
cXVvdGE9PyBXSEVSRSBvcmlnaW49PyIpOworICAgICAgICBib29sIGVycm9yID0gc3RhdGVtZW50
LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPazsKKyAgICAgICAgaWYgKCFlcnJvcikgeworICAgICAg
ICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgxLCBxdW90YSk7CisgICAgICAgICAgICBzdGF0ZW1l
bnQuYmluZFRleHQoMiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiAKLSAgICAgICAg
ICAgIGlmIChlcnJvcikKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBzZXQg
cXVvdGEgJWxsdSBpbiB0cmFja2VyIGRhdGFiYXNlIGZvciBvcmlnaW4gJXMiLCBxdW90YSwgb3Jp
Z2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBl
cnJvciA9ICFzdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKTsKICAgICAgICAgfQogCi0gICAgICAg
IC8vIEZJWE1FOiBJcyBpdCByZWFsbHkgT0sgdG8gdXBkYXRlIHRoZSBxdW90YSBpbiBtZW1vcnkg
aWYgd2UgZmFpbGVkIHRvIHVwZGF0ZSBpdCBvbiBkaXNrPwotICAgICAgICBtX3F1b3RhTWFwLT5z
ZXQob3JpZ2luLCBxdW90YSk7CisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAgIExPR19F
UlJPUigiRmFpbGVkIHRvIHNldCBxdW90YSAlbGx1IGluIHRyYWNrZXIgZGF0YWJhc2UgZm9yIG9y
aWdpbiAlcyIsIHF1b3RhLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0
YSgpKTsKICAgICB9CiAKKyAgICAvLyBGSVhNRTogSXMgaXQgcmVhbGx5IE9LIHRvIHVwZGF0ZSB0
aGUgcXVvdGEgaW4gbWVtb3J5IGlmIHdlIGZhaWxlZCB0byB1cGRhdGUgaXQgb24gZGlzaz8KKyAg
ICBtX3F1b3RhTWFwLT5zZXQob3JpZ2luLT50aHJlYWRzYWZlQ29weSgpLCBxdW90YSk7CisKICAg
ICBpZiAobV9jbGllbnQpCiAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdp
bihvcmlnaW4pOwogfQogCiBib29sIERhdGFiYXNlVHJhY2tlcjo6YWRkRGF0YWJhc2UoU2VjdXJp
dHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHBhdGgp
CiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAgQVNTRVJU
KCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQobV9xdW90YU1hcCk7CiAg
ICAgb3BlblRyYWNrZXJEYXRhYmFzZSh0cnVlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVu
KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIC8vIE5ldyBkYXRhYmFzZSBzaG91bGQg
bmV2ZXIgYmUgYWRkZWQgdW50aWwgdGhlIG9yaWdpbiBoYXMgYmVlbiBlc3RhYmxpc2hlZAotICAg
IEFTU0VSVChoYXNFbnRyeUZvck9yaWdpbihvcmlnaW4pKTsKKyAgICBBU1NFUlQoaGFzRW50cnlG
b3JPcmlnaW5Ob0xvY2sob3JpZ2luKSk7CiAKICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50
KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5UTyBEYXRhYmFzZXMgKG9yaWdpbiwgbmFtZSwgcGF0aCkg
VkFMVUVTICg/LCA/LCA/KTsiKTsKIApAQCAtNjA1LDggKzY2Niw2IEBAIGJvb2wgRGF0YWJhc2VU
cmFja2VyOjphZGREYXRhYmFzZShTZWN1cmkKIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0
ZUFsbERhdGFiYXNlcygpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVh
ZCk7Ci0KICAgICBWZWN0b3I8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiA+IG9yaWdpbnNDb3B5Owog
ICAgIG9yaWdpbnMob3JpZ2luc0NvcHkpOwogCkBAIC02MTQsMTkgKzY3MywyNCBAQCB2b2lkIERh
dGFiYXNlVHJhY2tlcjo6ZGVsZXRlQWxsRGF0YWJhc2VzCiAgICAgICAgIGRlbGV0ZU9yaWdpbihv
cmlnaW5zQ29weVtpXS5nZXQoKSk7CiB9CiAKKy8vIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25z
aWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCBub2JvZHkgaXMgdHJ5aW5nIHRvIGNyZWF0ZSwgZGVs
ZXRlLCBvcGVuLCBvciBjbG9zZSBkYXRhYmFzZXMgaW4gdGhpcyBvcmlnaW4gd2hpbGUgdGhlIGRl
bGV0aW9uIGlzCisvLyB0YWtpbmcgcGxhY2UuCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRl
T3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJl
YWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7Ci0gICAg
aWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICByZXR1cm47Ci0KICAgICBWZWN0b3I8
U3RyaW5nPiBkYXRhYmFzZU5hbWVzOwotICAgIGlmICghZGF0YWJhc2VOYW1lc0Zvck9yaWdpbihv
cmlnaW4sIGRhdGFiYXNlTmFtZXMpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHJl
dHJpZXZlIGxpc3Qgb2YgZGF0YWJhc2UgbmFtZXMgZm9yIG9yaWdpbiAlcyIsIG9yaWdpbi0+ZGF0
YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47CisgICAg
eworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAg
ICAgICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CisgICAgICAgIGlmICghbV9kYXRhYmFz
ZS5pc09wZW4oKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIWRhdGFiYXNl
TmFtZXNGb3JPcmlnaW5Ob0xvY2sob3JpZ2luLCBkYXRhYmFzZU5hbWVzKSkgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmV0cmlldmUgbGlzdCBvZiBkYXRhYmFzZSBuYW1lcyBm
b3Igb3JpZ2luICVzIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEo
KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBXZSBk
cm9wIHRoZSBsb2NrIGhlcmUgYmVjYXVzZSBob2xkaW5nIGxvY2tzIGR1cmluZyBhIGNhbGwgdG8g
ZGVsZXRlRGF0YWJhc2VGaWxlIHdpbGwgZGVhZGxvY2suCiAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKCFkZWxldGVE
YXRhYmFzZUZpbGUob3JpZ2luLCBkYXRhYmFzZU5hbWVzW2ldKSkgewogICAgICAgICAgICAgLy8g
RXZlbiBpZiB0aGUgZmlsZSBjYW4ndCBiZSBkZWxldGVkLCB3ZSB3YW50IHRvIHRyeSBhbmQgZGVs
ZXRlIHRoZSByZXN0LCBkb24ndCByZXR1cm4gZWFybHkgaGVyZS4KQEAgLTYzNCw0MSArNjk4LDQy
IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpkZWxldGVPcmlnaW4oU2VjdXIKICAgICAgICAgfQog
ICAgIH0KIAotICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVU
RSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyIpOwotICAgIGlmIChzdGF0ZW1lbnQucHJl
cGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHBy
ZXBhcmUgZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIs
IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQorICAgIHsKKyAgICAgICAgLy8gVG8gc2F0aXNmeSB0aGUgbG9jayBoaWVy
YXJjaHksIHdlIGhhdmUgdG8gbG9jayB0aGUgb3JpZ2luUXVvdGFNYW5hZ2VyIGJlZm9yZSBtX2Rh
dGFiYXNlR3VhcmQgaWYgdGhlcmUncyBhbnkgY2hhbmNlIHdlJ2xsIHRvIGxvY2sgYm90aC4KKyAg
ICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdp
blF1b3RhTWFuYWdlcigpKTsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0
YWJhc2VHdWFyZCk7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIkRFTEVURSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyIpOworICAgICAgICBpZiAo
c3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4g
JXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRh
dGEoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIHN0YXRlbWVudC5i
aW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgc3RhdGVt
ZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwogCi0gICAgaWYg
KCFzdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJs
ZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRy
YWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KKyAgICAgICAgaWYgKCFzdGF0ZW1lbnQuZXhlY3V0ZUNvbW1h
bmQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlv
biBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRh
YmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KIAotICAgIFNRTGl0ZVN0YXRlbWVudCBvcmlnaW5TdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIkRFTEVURSBGUk9NIE9yaWdpbnMgV0hFUkUgb3JpZ2luPT8iKTsKLSAgICBpZiAob3JpZ2lu
U3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewotICAgICAgICBMT0dfRVJST1Io
IlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IG9yaWdpblN0YXRlbWVudChtX2Rh
dGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyBXSEVSRSBvcmlnaW49PyIpOworICAgICAgICBp
ZiAob3JpZ2luU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBvcmlnaW4gJXMgZnJv
bSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIG9yaWdpblN0YXRlbWVudC5i
aW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgb3JpZ2lu
U3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwogCi0g
ICAgaWYgKCFvcmlnaW5TdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICBMT0df
RVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdp
biAlcyBmcm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCku
ZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICAgICAgaWYgKCFvcmlnaW5TdGF0
ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUg
dG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFj
a2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0
ZUVtcHR5RGF0YWJhc2VEaXJlY3Rvcnkob3JpZ2luUGF0aChvcmlnaW4pKTsKKyAgICAgICAgU1FM
aXRlRmlsZVN5c3RlbTo6ZGVsZXRlRW1wdHlEYXRhYmFzZURpcmVjdG9yeShvcmlnaW5QYXRoKG9y
aWdpbikpOwogCi0gICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW5Qb3NzaWJseUxhc3RS
ZWZlcmVuY2UgPSBvcmlnaW47Ci0gICAgewotICAgICAgICBNdXRleExvY2tlciBsb2NrUXVvdGFN
YXAobV9xdW90YU1hcEd1YXJkKTsKKyAgICAgICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmln
aW5Qb3NzaWJseUxhc3RSZWZlcmVuY2UgPSBvcmlnaW47CiAgICAgICAgIG1fcXVvdGFNYXAtPnJl
bW92ZShvcmlnaW4pOwogCi0gICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IHF1b3Rh
TWFuYWdlckxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Ci0gICAgICAgIG9yaWdpblF1b3Rh
TWFuYWdlcigpLnJlbW92ZU9yaWdpbihvcmlnaW4pOworICAgICAgICBvcmlnaW5RdW90YU1hbmFn
ZXJOb0xvY2soKS5yZW1vdmVPcmlnaW4ob3JpZ2luKTsKIAogICAgICAgICAvLyBJZiB3ZSByZW1v
dmVkIHRoZSBsYXN0IG9yaWdpbiwgZG8gc29tZSBhZGRpdGlvbmFsIGRlbGV0aW9uLgogICAgICAg
ICBpZiAobV9xdW90YU1hcC0+aXNFbXB0eSgpKSB7CkBAIC02NzcsMjcgKzc0MiwzNCBAQCB2b2lk
IERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlT3JpZ2luKFNlY3VyCiAgICAgICAgICAgIFNRTGl0ZUZp
bGVTeXN0ZW06OmRlbGV0ZURhdGFiYXNlRmlsZSh0cmFja2VyRGF0YWJhc2VQYXRoKCkpOwogICAg
ICAgICAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVFbXB0eURhdGFiYXNlRGlyZWN0b3J5KG1f
ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKTsKICAgICAgICAgfQotICAgIH0KIAotICAgIGlmIChtX2Ns
aWVudCkgewotICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlPcmlnaW4ob3JpZ2lu
KTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6ZSgp
OyArK2kpCi0gICAgICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlEYXRhYmFzZShv
cmlnaW4sIGRhdGFiYXNlTmFtZXNbaV0pOworICAgICAgICBpZiAobV9jbGllbnQpIHsKKyAgICAg
ICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdpbihvcmlnaW4pOworICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6ZSgpOyArK2kp
CisgICAgICAgICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5RGF0YWJhc2Uob3Jp
Z2luLCBkYXRhYmFzZU5hbWVzW2ldKTsKKyAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0
IFN0cmluZyYgbmFtZSkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFk
KTsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKLSAgICBpZiAoIW1fZGF0YWJhc2Uu
aXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxv
Y2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgICAgICBvcGVuVHJhY2tlckRhdGFiYXNl
KGZhbHNlKTsKKyAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgIH0KIAorICAgIC8vIFdlIGRyb3AgdGhlIGxvY2sgaGVyZSBiZWNhdXNlIGhv
bGRpbmcgbG9ja3MgZHVyaW5nIGEgY2FsbCB0byBkZWxldGVEYXRhYmFzZUZpbGUgd2lsbCBkZWFk
bG9jay4KICAgICBpZiAoIWRlbGV0ZURhdGFiYXNlRmlsZShvcmlnaW4sIG5hbWUpKSB7CiAgICAg
ICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGRlbGV0ZSBmaWxlIGZvciBkYXRhYmFzZSAlcyBpbiBv
cmlnaW4gJXMiLCBuYW1lLmFzY2lpKCkuZGF0YSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmll
cigpLmFzY2lpKCkuZGF0YSgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIFRv
IHNhdGlzZnkgdGhlIGxvY2sgaGllcmFyY2h5LCB3ZSBoYXZlIHRvIGxvY2sgdGhlIG9yaWdpblF1
b3RhTWFuYWdlciBiZWZvcmUgbV9kYXRhYmFzZUd1YXJkIGlmIHRoZXJlJ3MgYW55IGNoYW5jZSB3
ZSdsbCB0byBsb2NrIGJvdGguCisgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFN
YW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICBNdXRleExvY2tlciBsb2Nr
RGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKwogICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1l
bnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyBBTkQg
bmFtZT0/Iik7CiAgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsK
ICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBkYXRhYmFz
ZSAlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBuYW1lLmFzY2lpKCkuZGF0YSgpLCBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKQEAgLTcxMiwxMCAr
Nzg0LDcgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlKFNlYwogICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgewotICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5h
Z2VyPiBxdW90YU1hbmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwotICAgICAgICBv
cmlnaW5RdW90YU1hbmFnZXIoKS5yZW1vdmVEYXRhYmFzZShvcmlnaW4sIG5hbWUpOwotICAgIH0K
KyAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5yZW1vdmVEYXRhYmFzZShvcmlnaW4sIG5h
bWUpOwogCiAgICAgaWYgKG1fY2xpZW50KSB7CiAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERp
ZE1vZGlmeU9yaWdpbihvcmlnaW4pOwpAQCAtNzIzLDI2ICs3OTIsMjcgQEAgdm9pZCBEYXRhYmFz
ZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlKFNlYwogICAgIH0KIH0KIAorLy8gZGVsZXRlRGF0YWJh
c2VGaWxlIGhhcyB0byByZWxlYXNlIGxvY2tzIGJldHdlZW4gbG9va2luZyB1cCB0aGUgbGlzdCBv
ZiBkYXRhYmFzZXMgdG8gY2xvc2UgYW5kIGNsb3NpbmcgdGhlbS4gIFdoaWxlIHRoaXMgaXMgaW4g
cHJvZ3Jlc3MsIHRoZSBjYWxsZXIKKy8vIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSBu
byBuZXcgZGF0YWJhc2VzIGFyZSBvcGVuZWQgaW4gdGhlIGZpbGUgdG8gYmUgZGVsZXRlZC4KIGJv
b2wgRGF0YWJhc2VUcmFja2VyOjpkZWxldGVEYXRhYmFzZUZpbGUoU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkg
PT0gbV90aHJlYWQpOwogICAgIFN0cmluZyBmdWxsUGF0aCA9IGZ1bGxQYXRoRm9yRGF0YWJhc2Uo
b3JpZ2luLCBuYW1lLCBmYWxzZSk7Ci0gICAgaWYgKGZ1bGxQYXRoLmlzRW1wdHkoKSkKKyAgICBp
ZiAoZnVsbFBhdGguaXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAog
ICAgIFZlY3RvcjxSZWZQdHI8RGF0YWJhc2U+ID4gZGVsZXRlZERhdGFiYXNlczsKIAotICAgIC8v
IE1ha2Ugc3VyZSBub3QgdG8gaG9sZCB0aGUgbV9vcGVuRGF0YWJhc2VNYXBHdWFyZCBtdXRleCB3
aGVuIGNhbGxpbmcKKyAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGhvbGQgdGhlIGFueSBsb2NrcyB3
aGVuIGNhbGxpbmcKICAgICAvLyBEYXRhYmFzZTo6bWFya0FzRGVsZXRlZEFuZENsb3NlKCksIHNp
bmNlIHRoYXQgY2FuIGNhdXNlIGEgZGVhZGxvY2sKICAgICAvLyBkdXJpbmcgdGhlIHN5bmNocm9u
b3VzIERhdGFiYXNlVGhyZWFkIGNhbGwgaXQgdHJpZ2dlcnMuCi0KICAgICB7CiAgICAgICAgIE11
dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CiAg
ICAgICAgIGlmIChtX29wZW5EYXRhYmFzZU1hcCkgewogICAgICAgICAgICAgLy8gVGhlcmUgYXJl
IHNvbWUgb3BlbiBkYXRhYmFzZXMsIGxldHMgY2hlY2sgaWYgdGhleSBhcmUgZm9yIHRoaXMgb3Jp
Z2luLgogICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1lTWFwID0gbV9vcGVuRGF0YWJh
c2VNYXAtPmdldChvcmlnaW4pOwogICAgICAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC0+
c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRhYmFz
ZXMgZm9yIHRoaXMgb3JpZ2luLCBsZXRzIGNoZWNrCisgICAgICAgICAgICAgICAgLy8gVGhlcmUg
YXJlIHNvbWUgb3BlbiBkYXRhYmFzZXMgZm9yIHRoaXMgb3JpZ2luLCBsZXQncyBjaGVjawogICAg
ICAgICAgICAgICAgIC8vIGlmIHRoZXkgYXJlIHRoaXMgZGF0YWJhc2UgYnkgbmFtZS4KICAgICAg
ICAgICAgICAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQgPSBuYW1lTWFwLT5nZXQobmFtZSk7
CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFiYXNlU2V0ICYmIGRhdGFiYXNlU2V0LT5zaXplKCkp
IHsKQEAgLTc2Myw3ICs4MzMsNiBAQCBib29sIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJh
c2VGaWxlCiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXRDbGllbnQoRGF0YWJhc2VUcmFja2Vy
Q2xpZW50KiBjbGllbnQpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVh
ZCk7CiAgICAgbV9jbGllbnQgPSBjbGllbnQ7CiB9CiAKQEAgLTc3Myw3ICs4NDIsNyBAQCBzdGF0
aWMgTXV0ZXgmIG5vdGlmaWNhdGlvbk11dGV4KCkKICAgICByZXR1cm4gbXV0ZXg7CiB9CiAKLXR5
cGVkZWYgVmVjdG9yPHBhaXI8U2VjdXJpdHlPcmlnaW4qLCBTdHJpbmc+ID4gTm90aWZpY2F0aW9u
UXVldWU7Cit0eXBlZGVmIFZlY3RvcjxwYWlyPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4sIFN0cmlu
Zz4gPiBOb3RpZmljYXRpb25RdWV1ZTsKIAogc3RhdGljIE5vdGlmaWNhdGlvblF1ZXVlJiBub3Rp
ZmljYXRpb25RdWV1ZSgpCiB7CkBAIC03ODUsNyArODU0LDcgQEAgdm9pZCBEYXRhYmFzZVRyYWNr
ZXI6OnNjaGVkdWxlTm90aWZ5RGF0YQogewogICAgIE11dGV4TG9ja2VyIGxvY2tlcihub3RpZmlj
YXRpb25NdXRleCgpKTsKIAotICAgIG5vdGlmaWNhdGlvblF1ZXVlKCkuYXBwZW5kKHBhaXI8U2Vj
dXJpdHlPcmlnaW4qLCBTdHJpbmc+KG9yaWdpbiwgbmFtZS5jcm9zc1RocmVhZFN0cmluZygpKSk7
CisgICAgbm90aWZpY2F0aW9uUXVldWUoKS5hcHBlbmQocGFpcjxSZWZQdHI8U2VjdXJpdHlPcmln
aW4+LCBTdHJpbmc+KG9yaWdpbi0+dGhyZWFkc2FmZUNvcHkoKSwgbmFtZS5jcm9zc1RocmVhZFN0
cmluZygpKSk7CiAgICAgc2NoZWR1bGVGb3JOb3RpZmljYXRpb24oKTsKIH0KIApAQCAtODIwLDcg
Kzg4OSw3IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpub3RpZnlEYXRhYmFzZXNDaGEKICAgICAg
ICAgcmV0dXJuOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5vdGlmaWNhdGlvbnMu
c2l6ZSgpOyArK2kpCi0gICAgICAgIHRoZVRyYWNrZXIubV9jbGllbnQtPmRpc3BhdGNoRGlkTW9k
aWZ5RGF0YWJhc2Uobm90aWZpY2F0aW9uc1tpXS5maXJzdCwgbm90aWZpY2F0aW9uc1tpXS5zZWNv
bmQpOworICAgICAgICB0aGVUcmFja2VyLm1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeURhdGFi
YXNlKG5vdGlmaWNhdGlvbnNbaV0uZmlyc3QuZ2V0KCksIG5vdGlmaWNhdGlvbnNbaV0uc2Vjb25k
KTsKIH0KIAogCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCShyZXZpc2lvbiA1NTg0
NikKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAkod29ya2luZyBjb3B5KQpA
QCAtNjAsOSArNjAsMTEgQEAgc3RydWN0IFNlY3VyaXR5T3JpZ2luVHJhaXRzOwogY2xhc3MgRGF0
YWJhc2VUcmFja2VyIDogcHVibGljIE5vbmNvcHlhYmxlIHsKIHB1YmxpYzoKICAgICBzdGF0aWMg
RGF0YWJhc2VUcmFja2VyJiB0cmFja2VyKCk7Ci0gICAgLy8gRklYTUU6IER1ZSB0byB3b3JrZXJz
IGhhdmluZyBtdWx0aXBsZSB0aHJlYWRzIGluIGEgc2luZ2xlIHByb2Nlc3Mgc2hhcmluZwotICAg
IC8vIGEgRGF0YWJhc2VUcmFja2VyLCB0aGlzIHNpbmdsZXRvbiB3aWxsIGhhdmUgdG8gYmUgc3lu
Y2hyb25pemVkIG9yIG1vdmVkCi0gICAgLy8gdG8gVExTLgorICAgIC8vIFRoaXMgc2luZ2xldG9u
IHdpbGwgcG90ZW50aWFsbHkgYmUgdXNlZCBmcm9tIG11bHRpcGxlIHdvcmtlciB0aHJlYWRzIGFu
ZCB0aGUgcGFnZSdzIGNvbnRleHQgdGhyZWFkIHNpbXVsdGFuZW91c2x5LiAgVG8ga2VlcCB0aGlz
IHNhZmUsIGl0J3MKKyAgICAvLyBjdXJyZW50bHkgdXNpbmcgNCBsb2Nrcy4gIEluIG9yZGVyIHRv
IGF2b2lkIGRlYWRsb2NrIHdoZW4gdGFraW5nIG11bHRpcGxlIGxvY2tzLCB5b3UgbXVzdCB0YWtl
IHRoZW0gaW4gdGhlIGNvcnJlY3Qgb3JkZXI6CisgICAgLy8gb3JpZ2luUXVvdGFNYW5hZ2VyKCkg
YmVmb3JlIG1fZGF0YWJhc2VHdWFyZCBvciBtX29wZW5EYXRhYmFzZU1hcEd1YXJkCisgICAgLy8g
bV9kYXRhYmFzZUd1YXJkIGJlZm9yZSBtX29wZW5EYXRhYmFzZU1hcEd1YXJkCisgICAgLy8gbm90
aWZpY2F0aW9uTXV0ZXgoKSBpcyBjdXJyZW50bHkgaW5kZXBlbmRlbnQgb2YgdGhlIG90aGVyIGxv
Y2tzLgogCiAgICAgYm9vbCBjYW5Fc3RhYmxpc2hEYXRhYmFzZShTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNp
Z25lZCBsb25nIGVzdGltYXRlZFNpemUpOwogICAgIHZvaWQgc2V0RGF0YWJhc2VEZXRhaWxzKFNl
Y3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlO
YW1lLCB1bnNpZ25lZCBsb25nIGVzdGltYXRlZFNpemUpOwpAQCAtODcsNyArODksNyBAQCBwcml2
YXRlOgogI2lmICFQTEFURk9STShDSFJPTUlVTSkKIHB1YmxpYzoKICAgICB2b2lkIHNldERhdGFi
YXNlRGlyZWN0b3J5UGF0aChjb25zdCBTdHJpbmcmKTsKLSAgICBjb25zdCBTdHJpbmcmIGRhdGFi
YXNlRGlyZWN0b3J5UGF0aCgpIGNvbnN0OworICAgIFN0cmluZyBkYXRhYmFzZURpcmVjdG9yeVBh
dGgoKSBjb25zdDsKIAogICAgIHZvaWQgb3JpZ2lucyhWZWN0b3I8UmVmUHRyPFNlY3VyaXR5T3Jp
Z2luPiA+JiByZXN1bHQpOwogICAgIGJvb2wgZGF0YWJhc2VOYW1lc0Zvck9yaWdpbihTZWN1cml0
eU9yaWdpbiosIFZlY3RvcjxTdHJpbmc+JiByZXN1bHQpOwpAQCAtMTE0LDYgKzExNiwxMyBAQCBw
dWJsaWM6CiAgICAgYm9vbCBoYXNFbnRyeUZvck9yaWdpbihTZWN1cml0eU9yaWdpbiopOwogCiBw
cml2YXRlOgorICAgIE9yaWdpblF1b3RhTWFuYWdlciYgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2Nr
KCk7CisgICAgYm9vbCBoYXNFbnRyeUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3Jp
Z2luKTsKKyAgICBTdHJpbmcgZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayhTZWN1cml0eU9yaWdp
biosIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZkRvZXNOb3RFeGlzdCk7CisgICAg
Ym9vbCBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4s
IFZlY3RvcjxTdHJpbmc+JiByZXN1bHRWZWN0b3IpOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1
c2FnZUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKTsKKyAgICB1bnNpZ25l
ZCBsb25nIGxvbmcgcXVvdGFGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbik7
CisKICAgICBTdHJpbmcgdHJhY2tlckRhdGFiYXNlUGF0aCgpIGNvbnN0OwogICAgIHZvaWQgb3Bl
blRyYWNrZXJEYXRhYmFzZShib29sIGNyZWF0ZUlmRG9lc05vdEV4aXN0KTsKIApAQCAtMTI2LDEw
ICsxMzUsMTEgQEAgcHJpdmF0ZToKIAogICAgIGJvb2wgZGVsZXRlRGF0YWJhc2VGaWxlKFNlY3Vy
aXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBuYW1lKTsKIAorICAgIC8vIFRoaXMgbG9jayBwcm90
ZWN0cyBtX2RhdGFiYXNlLCBtX3F1b3RhTWFwLCBhbmQgbV9wcm9wb3NlZERhdGFiYXNlcy4KKyAg
ICBNdXRleCBtX2RhdGFiYXNlR3VhcmQ7CiAgICAgU1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsK
IAogICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCB1bnNpZ25lZCBs
b25nIGxvbmcsIFNlY3VyaXR5T3JpZ2luSGFzaD4gUXVvdGFNYXA7Ci0gICAgTXV0ZXggbV9xdW90
YU1hcEd1YXJkOwogICAgIG11dGFibGUgT3duUHRyPFF1b3RhTWFwPiBtX3F1b3RhTWFwOwogCiAg
ICAgT3duUHRyPE9yaWdpblF1b3RhTWFuYWdlcj4gbV9xdW90YU1hbmFnZXI7CkBAIC0xMzgsMTEg
KzE0OCw4IEBAIHByaXZhdGU6CiAKICAgICBEYXRhYmFzZVRyYWNrZXJDbGllbnQqIG1fY2xpZW50
OwogCi0gICAgc3RkOjpwYWlyPFNlY3VyaXR5T3JpZ2luKiwgRGF0YWJhc2VEZXRhaWxzPiogbV9w
cm9wb3NlZERhdGFiYXNlOwotCi0jaWZuZGVmIE5ERUJVRwotICAgIFRocmVhZElkZW50aWZpZXIg
bV90aHJlYWQ7Ci0jZW5kaWYKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxSZWZQdHI8U2VjdXJpdHlP
cmlnaW4+LCBEYXRhYmFzZURldGFpbHM+IFByb3Bvc2VkRGF0YWJhc2U7CisgICAgSGFzaFNldDxQ
cm9wb3NlZERhdGFiYXNlKj4gbV9wcm9wb3NlZERhdGFiYXNlczsKIAogICAgIHN0YXRpYyB2b2lk
IHNjaGVkdWxlRm9yTm90aWZpY2F0aW9uKCk7CiAgICAgc3RhdGljIHZvaWQgbm90aWZ5RGF0YWJh
c2VzQ2hhbmdlZCh2b2lkKik7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5h
Z2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2Vy
LmNwcAkocmV2aXNpb24gNTU4NDYpCisrKyBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5h
Z2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsMTggQEAgT3JpZ2luUXVvdGFNYW5h
Z2VyOjpPcmlnaW5RdW90YU1hbmFnZXIoKQogewogfQogCitib29sIE9yaWdpblF1b3RhTWFuYWdl
cjo6dHJ5TG9jaygpCit7CisgICAgYm9vbCBsb2NrZWQgPSBtX3VzYWdlUmVjb3JkR3VhcmQudHJ5
TG9jaygpOworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAobG9ja2VkKQorICAgICAgICBtX3VzYWdl
UmVjb3JkR3VhcmRMb2NrZWQgPSB0cnVlOworICAgIGVsc2UKKyAgICAgICAgQVNTRVJUKG1fdXNh
Z2VSZWNvcmRHdWFyZExvY2tlZCk7CisjZW5kaWYKKyAgICByZXR1cm4gbG9ja2VkOworfQorCiB2
b2lkIE9yaWdpblF1b3RhTWFuYWdlcjo6bG9jaygpCiB7CiAgICAgbV91c2FnZVJlY29yZEd1YXJk
LmxvY2soKTsKQEAgLTYzLDcgKzc1LDcgQEAgdm9pZCBPcmlnaW5RdW90YU1hbmFnZXI6OnRyYWNr
T3JpZ2luKFBhcwogICAgIEFTU0VSVChtX3VzYWdlUmVjb3JkR3VhcmRMb2NrZWQpOwogICAgIEFT
U0VSVCghbV91c2FnZU1hcC5jb250YWlucyhvcmlnaW4uZ2V0KCkpKTsKIAotICAgIG1fdXNhZ2VN
YXAuc2V0KG9yaWdpbiwgbmV3IE9yaWdpblVzYWdlUmVjb3JkKTsKKyAgICBtX3VzYWdlTWFwLnNl
dChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIG5ldyBPcmlnaW5Vc2FnZVJlY29yZCk7CiB9CiAK
IGJvb2wgT3JpZ2luUXVvdGFNYW5hZ2VyOjp0cmFja3NPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbikgY29uc3QKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmgJKHJldmlz
aW9uIDU1ODQ2KQorKysgV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00NSw2ICs0NSw3IEBAIGNsYXNzIE9yaWdpblF1b3RhTWFuYWdlciA6IHB1
YmxpYyBOb25jb3AKIHB1YmxpYzoKICAgICBPcmlnaW5RdW90YU1hbmFnZXIoKTsKIAorICAgIGJv
b2wgdHJ5TG9jaygpOwogICAgIHZvaWQgbG9jaygpOwogICAgIHZvaWQgdW5sb2NrKCk7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50571</attachid>
            <date>2010-03-11 18:41:55 -0800</date>
            <delta_ts>2010-03-17 16:18:24 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34991-20100311184154.patch</filename>
            <type>text/plain</type>
            <size>48294</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTg1NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsOTIgQEAKKzIwMTAtMDMtMTEgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBS
ZWZhY3RvciBEYXRhYmFzZVRyYWNrZXIuY3BwIGZvciB0aHJlYWQgc2FmZXR5CisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDk5MQorCisgICAgICAgIFRo
aXMgZW5hYmxlcyBjYWxsaW5nIGludG8gRGF0YWJhc2VUcmFja2VyIGZyb20gbXVsdGlwbGUgY29u
dGV4dCB0aHJlYWRzLAorICAgICAgICBhcyB3aWxsIGhhcHBlbiBvbmNlIFdvcmtlcnMgY2FuIGFj
Y2VzcyB0aGUgRGF0YWJhc2UuICBJdCByZXF1aXJlZCBhIGZhaXIKKyAgICAgICAgYW1vdW50IG9m
IHJlc2h1ZmZsaW5nIG9mIGxvY2tzLiAgSSBlbmRlZCB1cCBzcGxpdHRpbmcgdGhlIHB1YmxpYwor
ICAgICAgICBpbnRlcmZhY2UgW2NhbGxzIHRoYXQgdGFrZSBsb2NrcyBhbmQgY2FsbCBwcml2YXRl
IGZ1bmN0aW9uc10gZnJvbSB0aGUKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIFtjYWxscyB0aGF0
IGFzc2VydCB0aGF0IGxvY2tzIGFyZSBhbHJlYWR5IGhlbGRdIGluIG9yZGVyCisgICAgICAgIHRv
IGF2b2lkIGxvY2sgY29uZmxpY3RzLiAgSSBhbHNvIGhhZCB0byBtYWtlIHN1cmUgd2Ugd2VyZW4n
dCBzaGFyaW5nCisgICAgICAgIFN0cmluZ3Mgb3IgU2VjdXJpdHlPcmlnaW5zIGFjcm9zcyB0aHJl
YWRzLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4KKworICAgICAgICBBbGxvdyBhY2Nlc3MgdG8g
ZGF0YWJhc2UgaGFuZGxlcyBmcm9tIG11bHRpcGxlIHRocmVhZHMgSUZGIFNRTGl0ZSBpcyBuZXcg
ZW5vdWdoIGFuZCB0aGUgdXNlciByZXF1ZXN0cyBpdC4KKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwv
U1FMaXRlRGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6OlNR
TGl0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpzZXRTaGFy
YWJsZSk6CisgICAgICAgICogcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmg6CisgICAgICAg
IChXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZTo6c3FsaXRlM0hhbmRsZSk6CisgICAgICAgIChXZWJD
b3JlOjpTUUxpdGVEYXRhYmFzZTo6c2hhcmFibGUpOgorCisgICAgICAgIFJlbW92ZSBhbiBhc3lu
Y2hyb25vdXMgY2FsbCBmcm9tIERhdGFiYXNlOjpjbG9zZSBiYWNrIHRvIHRoZSBleGVjdXRpb24g
dGhyZWFkLCBzbyB0aGF0IGNsZWFudXAgY2FuIGJlIG1vcmUgZGV0ZXJtaW5pc3RpYy4KKyAgICAg
ICAgKiBzdG9yYWdlL0RhdGFiYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpt
YXJrQXNEZWxldGVkQW5kQ2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OmNsb3Nl
KToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmg6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZTo6KToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVGFzay5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZUNsb3NlVGFzazo6ZG9QZXJmb3JtVGFzayk6CisgICAgICAgICogc3Rv
cmFnZS9EYXRhYmFzZVRocmVhZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRocmVh
ZDo6ZGF0YWJhc2VUaHJlYWQpOgorCisgICAgICAgIEFueSBTdHJpbmdzIHRoYXQgZ2V0IHN0b3Jl
ZCBpbiBEYXRhYmFzZVRyYWNrZXIsIGFuZCBhbnkgU3RyaW5ncyByZXR1cm5lZCBmcm9tIERhdGFi
YXNlVHJhY2tlciwgYXJlIG5vdyB0aHJlYWRzYWZlQ29waWVzLgorICAgICAgICBQdWJsaWMgZnVu
Y3Rpb25zIG5vdyB0YWtlIGFsbCBuZWVkZWQgbG9ja3MsIHRoZW4gZ2VuZXJhbGx5IGNhbGwgb25s
eSBwcml2YXRlIGZ1bmN0aW9ucy4KKyAgICAgICAgUHJpdmF0ZSBmdW5jdGlvbnMgbm8gbG9uZ2Vy
IHRha2UgbG9ja3MuCisgICAgICAgIG1fcXVvdGFNYXBHdWFyZCBiZWNvbWVzIG1fZGF0YWJhc2VH
dWFyZCwgYW5kIG5vdyBwcm90ZWN0cyBtX3F1b3RhTWFwLCBtX2RhdGFiYXNlLCBhbmQgbV9wcm9w
b3NlZERhdGFiYXNlcy4KKyAgICAgICAgbV9wcm9wb3NlZERhdGFiYXNlcyByZXBsYWNlcyBtX3By
b3Bvc2VkRGF0YWJhc2UsIHRvIGFjY291bnQgZm9yIHJlZW50cmFuY3kuCisgICAgICAgIG1fcXVv
dGFNYXAgaXMgY2xlYXJlZCB3aGVuZXZlciBhbiBvcmlnaW4gaXMgcmVtb3ZlZCwgc28gdGhhdCBz
dGFsZSBlbnRyaWVzIGV2ZW50dWFsbHkgZ2V0IGNsZWFuZWQgdXAuCisgICAgICAgIAorICAgICAg
ICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6RGF0YWJhc2VUcmFja2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEaXJlY3RvcnlQYXRoKToKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKToKKyAgICAgICAgKFdl
YkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dHJhY2tlckRhdGFiYXNlUGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9wZW5UcmFja2VyRGF0YWJhc2UpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpjYW5Fc3RhYmxpc2hEYXRhYmFzZSk6CisgICAgICAg
IChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yT3JpZ2luTm9Mb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW4pOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvckRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2spOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6b3JpZ2lucyk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2spOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGV0YWlsc0Zvck5hbWVBbmRPcmlnaW4p
OgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMp
OgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvckRhdGFiYXNlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW5Ob0xvY2spOgor
ICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbik6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luTm9Mb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6cXVvdGFGb3JPcmlnaW4pOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpzZXRRdW90YSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmFkZERhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6ZGVsZXRlQWxsRGF0YWJhc2VzKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6ZGVsZXRlT3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJh
Y2tlcjo6ZGVsZXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2Vy
OjpkZWxldGVEYXRhYmFzZUZpbGUpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2Vy
OjpzZXRDbGllbnQpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpzY2hlZHVs
ZU5vdGlmeURhdGFiYXNlQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNr
ZXI6Om5vdGlmeURhdGFiYXNlc0NoYW5nZWQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VU
cmFja2VyLmg6CisKKyAgICAgICAgQW55IFNlY3VyaXR5T3JpZ2lucyBzdG9yZWQgaW4gT3JpZ2lu
UXVvdGFNYW5hZ2VyIGFyZSBub3cgdGhyZWFkc2FmZUNvcGllcyBvZiBpbnB1dHMuICBUaGVyZSdz
IGEgbmV3IHRyeUxvY2sgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIGV4aXN0aW5nIGxvY2so
KS4KKworICAgICAgICAqIHN0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6Ok9yaWdpblF1b3RhTWFuYWdlcjo6dHJ5TG9jayk6CisgICAgICAgIChXZWJDb3Jl
OjpPcmlnaW5RdW90YU1hbmFnZXI6OnRyYWNrT3JpZ2luKToKKyAgICAgICAgKiBzdG9yYWdlL09y
aWdpblF1b3RhTWFuYWdlci5oOgorCiAyMDEwLTAzLTExICBDaHJpcyBGbGVpemFjaCAgPGNmbGVp
emFjaEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQmV0aCBEYWtpbi4KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAJKHJldmlzaW9uIDU1ODQ2KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00OCw2ICs0OCw3IEBAIFNRTGl0ZURhdGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAg
OiBtX2RiKDApCiAgICAgLCBtX3BhZ2VTaXplKC0xKQogICAgICwgbV90cmFuc2FjdGlvbkluUHJv
Z3Jlc3MoZmFsc2UpCisgICAgLCBtX3NoYXJhYmxlKGZhbHNlKQogICAgICwgbV9vcGVuaW5nVGhy
ZWFkKDApCiB7CiB9CkBAIC0yNTIsNiArMjUzLDE3IEBAIGNvbnN0IGNoYXIqIFNRTGl0ZURhdGFi
YXNlOjpsYXN0RXJyb3JNc2cKICAgICByZXR1cm4gc3FsaXRlM19lcnJtc2cobV9kYik7CiB9CiAK
K3ZvaWQgU1FMaXRlRGF0YWJhc2U6OnNldFNoYXJhYmxlKGJvb2wgc2hhcmFibGUpCit7CisgICAg
Ly8gVGhpcyBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IFNRTGlzdCB3YXMgY29tcGlsZWQgd2l0aCAt
RFRIUkVBRFNBRkUsIG9yIHRoYXQgeW91IGhhdmVuJ3QgdHVybmVkIG9mZiB0aGUgbXV0ZXhlcy4K
KyNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMQorICAgIG1fc2hhcmFibGUgPSBz
aGFyYWJsZTsKKyNlbHNlCisgICAgQVNTRVJUX1VOVVNFRChzaGFyYWJsZSk7CisgICAgQVNTRVJU
KDApOyAvLyBZb3VyIFNRTGl0ZSBkb2Vzbid0IHN1cHBvcnQgc2hhcmluZyBoYW5kbGVzIGFjcm9z
cyB0aHJlYWRzLgorI2VuZGlmCit9CisKIGludCBTUUxpdGVEYXRhYmFzZTo6YXV0aG9yaXplckZ1
bmN0aW9uKHZvaWQqIHVzZXJEYXRhLCBpbnQgYWN0aW9uQ29kZSwgY29uc3QgY2hhciogcGFyYW1l
dGVyMSwgY29uc3QgY2hhciogcGFyYW1ldGVyMiwgY29uc3QgY2hhciogLypkYXRhYmFzZU5hbWUq
LywgY29uc3QgY2hhciogLyp0cmlnZ2VyX29yX3ZpZXcqLykKIHsKICAgICBEYXRhYmFzZUF1dGhv
cml6ZXIqIGF1dGggPSBzdGF0aWNfY2FzdDxEYXRhYmFzZUF1dGhvcml6ZXIqPih1c2VyRGF0YSk7
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgJKHJldmlzaW9uIDU1ODQ2
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkod29ya2luZyBjb3B5
KQpAQCAtOTcsNyArOTcsNyBAQCBwdWJsaWM6CiAgICAgY29uc3QgY2hhciogbGFzdEVycm9yTXNn
KCk7CiAgICAgCiAgICAgc3FsaXRlMyogc3FsaXRlM0hhbmRsZSgpIGNvbnN0IHsKLSAgICAgICAg
QVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX29wZW5pbmdUaHJlYWQpOworICAgICAgICBBU1NF
UlQobV9zaGFyYWJsZSB8fCBjdXJyZW50VGhyZWFkKCkgPT0gbV9vcGVuaW5nVGhyZWFkKTsKICAg
ICAgICAgcmV0dXJuIG1fZGI7CiAgICAgfQogICAgIApAQCAtMTA4LDYgKzEwOCwxMyBAQCBwdWJs
aWM6CiAgICAgdm9pZCB1bmxvY2soKTsKICAgICBib29sIGlzQXV0b0NvbW1pdE9uKCkgY29uc3Q7
CiAKKyAgICAvLyBTZXQgdGhpcyBmbGFnIHRvIGFsbG93IGFjY2VzcyBmcm9tIG11bHRpcGxlIHRo
cmVhZHMuICBOb3QgYWxsIG11bHRpLXRocmVhZGVkIGFjY2Vzc2VzIGFyZSBzYWZlIQorICAgIC8v
IFNlZSBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvY3ZzdHJhYy93aWtpP3A9TXVsdGlUaHJlYWRpbmcg
Zm9yIG1vcmUgaW5mby4KKyNpZm5kZWYgTkRFQlVHCisgICAgYm9vbCBzaGFyYWJsZSgpIHsgcmV0
dXJuIG1fc2hhcmFibGU7IH0KKyNlbmRpZgorICAgIHZvaWQgc2V0U2hhcmFibGUoYm9vbCBzaGFy
YWJsZSk7CisKIHByaXZhdGU6CiAgICAgc3RhdGljIGludCBhdXRob3JpemVyRnVuY3Rpb24odm9p
ZCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hh
ciopOwogCkBAIC0xMjAsNiArMTI3LDcgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wYWdlU2l6ZTsK
ICAgICAKICAgICBib29sIG1fdHJhbnNhY3Rpb25JblByb2dyZXNzOworICAgIGJvb2wgbV9zaGFy
YWJsZTsKICAgICAKICAgICBNdXRleCBtX2F1dGhvcml6ZXJMb2NrOwogICAgIFJlZlB0cjxEYXRh
YmFzZUF1dGhvcml6ZXI+IG1fYXV0aG9yaXplcjsKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRh
YmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAkocmV2
aXNpb24gNTU4NDYpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zODksNiArMzg5LDEwIEBAIHZvaWQgRGF0YWJhc2U6Om1hcmtBc0RlbGV0ZWRBbmRD
bG9zZSgpCiAKICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPmRhdGFiYXNlVGhyZWFkKCkt
PnNjaGVkdWxlSW1tZWRpYXRlVGFzayh0YXNrLnJlbGVhc2UoKSk7CiAgICAgc3luY2hyb25pemVy
LndhaXRGb3JUYXNrQ29tcGxldGlvbigpOworCisgICAgLy8gRGF0YWJhc2VDbG9zZVRhc2sgdGVs
bHMgRGF0YWJhc2U6OmNsb3NlIG5vdCB0byBkbyB0aGVzZSB0d28gcmVtb3ZhbHMgc28gdGhhdCB3
ZSBjYW4gZG8gdGhlbSBoZXJlIHN5bmNocm9ub3VzbHkuCisgICAgbV9zY3JpcHRFeGVjdXRpb25D
b250ZXh0LT5yZW1vdmVPcGVuRGF0YWJhc2UodGhpcyk7CisgICAgRGF0YWJhc2VUcmFja2VyOjp0
cmFja2VyKCkucmVtb3ZlT3BlbkRhdGFiYXNlKHRoaXMpOwogfQogCiBjbGFzcyBDb250ZXh0UmVt
b3ZlT3BlbkRhdGFiYXNlVGFzayA6IHB1YmxpYyBTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNr
IHsKQEAgLTQxNSw3ICs0MTksNyBAQCBwcml2YXRlOgogICAgIFJlZlB0cjxEYXRhYmFzZT4gbV9k
YXRhYmFzZTsKIH07CiAKLXZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKK3ZvaWQgRGF0YWJhc2U6OmNs
b3NlKENsb3NlUG9saWN5IHBvbGljeSkKIHsKICAgICBSZWZQdHI8RGF0YWJhc2U+IHByb3RlY3Qg
PSB0aGlzOwogCkBAIC00NDQsNyArNDQ4LDggQEAgdm9pZCBEYXRhYmFzZTo6Y2xvc2UoKQogICAg
IH0KIAogICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+ZGF0YWJhc2VUaHJlYWQoKS0+dW5z
Y2hlZHVsZURhdGFiYXNlVGFza3ModGhpcyk7Ci0gICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0
LT5wb3N0VGFzayhDb250ZXh0UmVtb3ZlT3BlbkRhdGFiYXNlVGFzazo6Y3JlYXRlKHRoaXMpKTsK
KyAgICBpZiAocG9saWN5ID09IFJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQpCisgICAgICAgIG1f
c2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soQ29udGV4dFJlbW92ZU9wZW5EYXRhYmFz
ZVRhc2s6OmNyZWF0ZSh0aGlzKSk7CiB9CiAKIHZvaWQgRGF0YWJhc2U6OnN0b3AoKQpJbmRleDog
V2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdl
L0RhdGFiYXNlLmgJKHJldmlzaW9uIDU1ODQ2KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTEwOSw3ICsxMDksOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBt
YXJrQXNEZWxldGVkQW5kQ2xvc2UoKTsKICAgICBib29sIGRlbGV0ZWQoKSBjb25zdCB7IHJldHVy
biBtX2RlbGV0ZWQ7IH0KIAotICAgIHZvaWQgY2xvc2UoKTsKKyAgICBlbnVtIENsb3NlUG9saWN5
IHsgRG9Ob3RSZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0LCBSZW1vdmVEYXRhYmFzZUZyb21Db250
ZXh0IH07CisgICAgdm9pZCBjbG9zZShDbG9zZVBvbGljeSk7CiAgICAgYm9vbCBvcGVuZWQoKSBj
b25zdCB7IHJldHVybiBtX29wZW5lZDsgfQogCiAgICAgdm9pZCBzdG9wKCk7CkluZGV4OiBXZWJD
b3JlL3N0b3JhZ2UvRGF0YWJhc2VUYXNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUYXNrLmNwcAkocmV2aXNpb24gNTU4NDYpCisrKyBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VUYXNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDcgKzExNyw4IEBAIERhdGFi
YXNlQ2xvc2VUYXNrOjpEYXRhYmFzZUNsb3NlVGFzayhEYXQKIAogdm9pZCBEYXRhYmFzZUNsb3Nl
VGFzazo6ZG9QZXJmb3JtVGFzaygpCiB7Ci0gICAgZGF0YWJhc2UoKS0+Y2xvc2UoKTsKKyAgICAv
LyBUZWxsIHRoZSBkYXRhYmFzZSBub3QgdG8gY2FsbCBiYWNrIHRvIHRoZSBjb250ZXh0IHRocmVh
ZDsgd2UnbGwgaGFuZGxlIGl0LgorICAgIGRhdGFiYXNlKCktPmNsb3NlKERhdGFiYXNlOjpEb05v
dFJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQpOwogfQogCiAjaWZuZGVmIE5ERUJVRwpJbmRleDog
V2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwCShyZXZpc2lvbiA1NTg0NikKKysrIFdlYkNvcmUv
c3RvcmFnZS9EYXRhYmFzZVRocmVhZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExMyw3ICsxMTMs
NyBAQCB2b2lkKiBEYXRhYmFzZVRocmVhZDo6ZGF0YWJhc2VUaHJlYWQoKQogICAgICAgICBvcGVu
U2V0Q29weS5zd2FwKG1fb3BlbkRhdGFiYXNlU2V0KTsKICAgICAgICAgRGF0YWJhc2VTZXQ6Oml0
ZXJhdG9yIGVuZCA9IG9wZW5TZXRDb3B5LmVuZCgpOwogICAgICAgICBmb3IgKERhdGFiYXNlU2V0
OjppdGVyYXRvciBpdCA9IG9wZW5TZXRDb3B5LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAg
ICAgICAgICAgKCppdCktPmNsb3NlKCk7CisgICAgICAgICAgICgqaXQpLT5jbG9zZShEYXRhYmFz
ZTo6UmVtb3ZlRGF0YWJhc2VGcm9tQ29udGV4dCk7CiAgICAgfQogCiAgICAgLy8gRGV0YWNoIHRo
ZSB0aHJlYWQgc28gaXRzIHJlc291cmNlcyBhcmUgbm8gbG9uZ2VyIG9mIGFueSBjb25jZXJuIHRv
IGFueW9uZSBlbHNlCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAkocmV2aXNp
b24gNTU4NDYpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNTEsMTMgKzUxLDE5IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAotT3JpZ2luUXVvdGFNYW5hZ2VyJiBEYXRhYmFzZVRyYWNrZXI6Om9y
aWdpblF1b3RhTWFuYWdlcigpCitPcmlnaW5RdW90YU1hbmFnZXImIERhdGFiYXNlVHJhY2tlcjo6
b3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkKIHsKLSAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKICAg
ICBBU1NFUlQobV9xdW90YU1hbmFnZXIpOwogICAgIHJldHVybiAqbV9xdW90YU1hbmFnZXI7CiB9
CiAKK09yaWdpblF1b3RhTWFuYWdlciYgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5RdW90YU1hbmFn
ZXIoKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwor
ICAgIHBvcHVsYXRlT3JpZ2lucygpOworICAgIHJldHVybiBvcmlnaW5RdW90YU1hbmFnZXJOb0xv
Y2soKTsKK30KKwogRGF0YWJhc2VUcmFja2VyJiBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKQog
ewogICAgIERFRklORV9TVEFUSUNfTE9DQUwoRGF0YWJhc2VUcmFja2VyLCB0cmFja2VyLCAoKSk7
CkBAIC02NiwzNiArNzIsMjkgQEAgRGF0YWJhc2VUcmFja2VyJiBEYXRhYmFzZVRyYWNrZXI6OnRy
YWNrZQogCiBEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJhY2tlcigpCiAgICAgOiBtX2NsaWVu
dCgwKQotICAgICwgbV9wcm9wb3NlZERhdGFiYXNlKDApCi0jaWZuZGVmIE5ERUJVRwotICAgICwg
bV90aHJlYWQoY3VycmVudFRocmVhZCgpKQotI2VuZGlmCiB7CiAgICAgU1FMaXRlRmlsZVN5c3Rl
bTo6cmVnaXN0ZXJTUUxpdGVWRlMoKTsKIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnNldERh
dGFiYXNlRGlyZWN0b3J5UGF0aChjb25zdCBTdHJpbmcmIHBhdGgpCiB7Ci0gICAgQVNTRVJUKGN1
cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CiAgICAgQVNTRVJUKCFtX2RhdGFiYXNlLmlzT3Bl
bigpKTsKLSAgICBtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aCA9IHBhdGg7CisgICAgbV9kYXRhYmFz
ZURpcmVjdG9yeVBhdGggPSBwYXRoLnRocmVhZHNhZmVDb3B5KCk7CiB9CiAKLWNvbnN0IFN0cmlu
ZyYgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZURpcmVjdG9yeVBhdGgoKSBjb25zdAorU3RyaW5n
IERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKCkgY29uc3QKIHsKLSAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLSAgICByZXR1cm4gbV9kYXRhYmFz
ZURpcmVjdG9yeVBhdGg7CisgICAgcmV0dXJuIG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLnRocmVh
ZHNhZmVDb3B5KCk7CiB9CiAKIFN0cmluZyBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXJEYXRhYmFz
ZVBhdGgoKSBjb25zdAogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQp
OwogICAgIHJldHVybiBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1lVG9Q
YXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLCAiRGF0YWJhc2VzLmRiIik7CiB9CiAKIHZvaWQg
RGF0YWJhc2VUcmFja2VyOjpvcGVuVHJhY2tlckRhdGFiYXNlKGJvb2wgY3JlYXRlSWZEb2VzTm90
RXhpc3QpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAg
QVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKIAogICAgIGlmIChtX2RhdGFiYXNl
LmlzT3BlbigpKQogICAgICAgICByZXR1cm47CkBAIC0xMDYsNjcgKzEwNSw4NyBAQCB2b2lkIERh
dGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzCiAKICAgICBpZiAoIW1fZGF0YWJhc2Uu
b3BlbihkYXRhYmFzZVBhdGgpKSB7CiAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGRvIGRvIGhlcmU/
CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2VQYXRoICVzLiIsIGRh
dGFiYXNlUGF0aC5hc2NpaSgpLmRhdGEoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAg
bV9kYXRhYmFzZS5zZXRTaGFyYWJsZSh0cnVlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UudGFibGVF
eGlzdHMoIk9yaWdpbnMiKSkgewogICAgICAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1h
bmQoIkNSRUFURSBUQUJMRSBPcmlnaW5zIChvcmlnaW4gVEVYVCBVTklRVUUgT04gQ09ORkxJQ1Qg
UkVQTEFDRSwgcXVvdGEgSU5URUdFUiBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKTsiKSkgewog
ICAgICAgICAgICAgLy8gRklYTUU6IGFuZCBoZXJlCisgICAgICAgICAgICBMT0dfRVJST1IoIkZh
aWxlZCB0byBjcmVhdGUgT3JpZ2lucyB0YWJsZSIpOwogICAgICAgICB9CiAgICAgfQogICAgIGlm
ICghbV9kYXRhYmFzZS50YWJsZUV4aXN0cygiRGF0YWJhc2VzIikpIHsKICAgICAgICAgaWYgKCFt
X2RhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgRGF0YWJhc2VzIChndWlkIElO
VEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgb3JpZ2luIFRFWFQsIG5hbWUgVEVYVCwg
ZGlzcGxheU5hbWUgVEVYVCwgZXN0aW1hdGVkU2l6ZSBJTlRFR0VSLCBwYXRoIFRFWFQpOyIpKSB7
CiAgICAgICAgICAgICAvLyBGSVhNRTogYW5kIGhlcmUKKyAgICAgICAgICAgIExPR19FUlJPUigi
RmFpbGVkIHRvIGNyZWF0ZSBEYXRhYmFzZXMgdGFibGUiKTsKICAgICAgICAgfQogICAgIH0KIH0K
IAogYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmNhbkVzdGFibGlzaERhdGFiYXNlKFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQqIGNvbnRleHQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBk
aXNwbGF5TmFtZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKQogewotICAgIEFTU0VSVChj
dXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotCi0gICAgLy8gUG9wdWxhdGUgdGhlIG9yaWdp
bnMgYmVmb3JlIHdlIGVzdGFibGlzaCBhIGRhdGFiYXNlOyB0aGlzIGd1YXJhbnRlZXMgdGhhdCBx
dW90YUZvck9yaWdpbgotICAgIC8vIGNhbiBydW4gb24gdGhlIGRhdGFiYXNlIHRocmVhZCBsYXRl
ci4KLSAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKLQogICAgIFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4g
PSBjb250ZXh0LT5zZWN1cml0eU9yaWdpbigpOworICAgIFByb3Bvc2VkRGF0YWJhc2UgZGV0YWls
czsKIAotICAgIC8vIFNpbmNlIHdlJ3JlIGltbWluZW50bHkgb3BlbmluZyBhIGRhdGFiYXNlIHdp
dGhpbiB0aGlzIGNvbnRleHQncyBvcmlnaW4sIG1ha2Ugc3VyZSB0aGlzIG9yaWdpbiBpcyBiZWlu
ZyB0cmFja2VkIGJ5IHRoZSBRdW90YVRyYWNrZXIKLSAgICAvLyBieSBmZXRjaGluZyBpdCdzIGN1
cnJlbnQgdXNhZ2Ugbm93Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHVzYWdlID0gdXNhZ2VGb3JP
cmlnaW4ob3JpZ2luKTsKLQotICAgIC8vIElmIGEgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMsIGln
bm9yZSB0aGUgcGFzc2VkLWluIGVzdGltYXRlZCBzaXplIGFuZCBzYXkgaXQncyBPSy4KLSAgICBp
ZiAoaGFzRW50cnlGb3JEYXRhYmFzZShvcmlnaW4sIG5hbWUpKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVxdWlyZW1lbnQ7CisgICAgdW5zaWduZWQgbG9u
ZyBsb25nIHRlbXBVc2FnZTsKKyAgICB7CisgICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFn
ZXI+IGxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7CisgICAgICAgIE11dGV4TG9ja2VyIGxv
Y2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogCi0gICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdp
bGwgZml0LCBhbGxvdyBpdHMgY3JlYXRpb24uCi0gICAgdW5zaWduZWQgbG9uZyBsb25nIHJlcXVp
cmVtZW50ID0gdXNhZ2UgKyBtYXgoMVVMLCBlc3RpbWF0ZWRTaXplKTsKLSAgICBpZiAocmVxdWly
ZW1lbnQgPCB1c2FnZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJZiB0aGUgZXN0aW1hdGVk
IHNpemUgaXMgc28gYmlnIGl0IGNhdXNlcyBhbiBvdmVyZmxvdywgZG9uJ3QgYWxsb3cgY3JlYXRp
b24uCi0gICAgaWYgKHJlcXVpcmVtZW50IDw9IHF1b3RhRm9yT3JpZ2luKG9yaWdpbikpCi0gICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKIAotICAgIC8vIEdp
dmUgdGhlIGNocm9tZSBjbGllbnQgYSBjaGFuY2UgdG8gaW5jcmVhc2UgdGhlIHF1b3RhLgotICAg
IC8vIFRlbXBvcmFyaWx5IG1ha2UgdGhlIGRldGFpbHMgb2YgdGhlIHByb3Bvc2VkIGRhdGFiYXNl
IGF2YWlsYWJsZSwgc28gdGhlIGNsaWVudCBjYW4gZ2V0IGF0IHRoZW0uCi0gICAgcGFpcjxTZWN1
cml0eU9yaWdpbiosIERhdGFiYXNlRGV0YWlscz4gZGV0YWlscyhvcmlnaW4sIERhdGFiYXNlRGV0
YWlscyhuYW1lLCBkaXNwbGF5TmFtZSwgZXN0aW1hdGVkU2l6ZSwgMCkpOwotICAgIG1fcHJvcG9z
ZWREYXRhYmFzZSA9ICZkZXRhaWxzOworICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbW1pbmVudGx5
IG9wZW5pbmcgYSBkYXRhYmFzZSB3aXRoaW4gdGhpcyBjb250ZXh0J3Mgb3JpZ2luLCBtYWtlIHN1
cmUgdGhpcyBvcmlnaW4gaXMgYmVpbmcgdHJhY2tlZCBieSB0aGUgUXVvdGFUcmFja2VyCisgICAg
ICAgIC8vIGJ5IGZldGNoaW5nIGl0cyBjdXJyZW50IHVzYWdlIG5vdy4KKyAgICAgICAgdW5zaWdu
ZWQgbG9uZyBsb25nIHVzYWdlID0gdXNhZ2VGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKKworICAg
ICAgICAvLyBJZiBhIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLCBpZ25vcmUgdGhlIHBhc3NlZC1p
biBlc3RpbWF0ZWQgc2l6ZSBhbmQgc2F5IGl0J3MgT0suCisgICAgICAgIGlmIChoYXNFbnRyeUZv
ckRhdGFiYXNlKG9yaWdpbiwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
ICAgICAvLyBJZiB0aGUgZGF0YWJhc2Ugd2lsbCBmaXQsIGFsbG93IGl0cyBjcmVhdGlvbi4KKyAg
ICAgICAgcmVxdWlyZW1lbnQgPSB1c2FnZSArIG1heCgxVUwsIGVzdGltYXRlZFNpemUpOworICAg
ICAgICB0ZW1wVXNhZ2UgPSB1c2FnZTsKKyAgICAgICAgaWYgKHJlcXVpcmVtZW50IDwgdXNhZ2Up
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIElmIHRoZSBlc3RpbWF0ZWQgc2l6ZSBpcyBz
byBiaWcgaXQgY2F1c2VzIGFuIG92ZXJmbG93LCBkb24ndCBhbGxvdyBjcmVhdGlvbi4KKyAgICAg
ICAgaWYgKHJlcXVpcmVtZW50IDw9IHF1b3RhRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbikpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBHaXZlIHRoZSBjaHJvbWUgY2xpZW50
IGEgY2hhbmNlIHRvIGluY3JlYXNlIHRoZSBxdW90YS4KKyAgICAgICAgLy8gVGVtcG9yYXJpbHkg
bWFrZSB0aGUgZGV0YWlscyBvZiB0aGUgcHJvcG9zZWQgZGF0YWJhc2UgYXZhaWxhYmxlLCBzbyB0
aGUgY2xpZW50IGNhbiBnZXQgYXQgdGhlbS4KKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBy
ZWFsbHkganVzdCBwYXNzIHRoZSBkZXRhaWxzIGludG8gdGhpcyBjYWxsLCByYXRoZXIgdGhhbiB1
c2luZyBtX3Byb3Bvc2VkRGF0YWJhc2VzLgorICAgICAgICBkZXRhaWxzID0gUHJvcG9zZWREYXRh
YmFzZShvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIERhdGFiYXNlRGV0YWlscyhuYW1lLnRocmVh
ZHNhZmVDb3B5KCksIGRpc3BsYXlOYW1lLnRocmVhZHNhZmVDb3B5KCksIGVzdGltYXRlZFNpemUs
IDApKTsKKyAgICAgICAgbV9wcm9wb3NlZERhdGFiYXNlcy5hZGQoJmRldGFpbHMpOworICAgIH0K
KyAgICAvLyBEcm9wIGFsbCBsb2NrcyBiZWZvcmUgY2FsbGluZyBvdXQ7IHdlIGRvbid0IGtub3cg
d2hhdCB0aGV5J2xsIGRvLgogICAgIGNvbnRleHQtPmRhdGFiYXNlRXhjZWVkZWRRdW90YShuYW1l
KTsKLSAgICBtX3Byb3Bvc2VkRGF0YWJhc2UgPSAwOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2Nr
ZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIG1fcHJvcG9zZWREYXRh
YmFzZXMucmVtb3ZlKCZkZXRhaWxzKTsKKyAgICB9CiAKICAgICAvLyBJZiB0aGUgZGF0YWJhc2Ug
d2lsbCBmaXQgbm93LCBhbGxvdyBpdHMgY3JlYXRpb24uCiAgICAgcmV0dXJuIHJlcXVpcmVtZW50
IDw9IHF1b3RhRm9yT3JpZ2luKG9yaWdpbik7CiB9CiAKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpo
YXNFbnRyeUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKQoreworICAgIEFT
U0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgQVNTRVJUKG1fcXVvdGFNYXAp
OworICAgIHJldHVybiBtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pOworfQorCiBib29sIERh
dGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikK
IHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBNdXRleExv
Y2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKICAgICBwb3B1bGF0ZU9yaWdpbnMo
KTsKLSAgICBNdXRleExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJkKTsKLSAgICBy
ZXR1cm4gbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKTsKKyAgICByZXR1cm4gaGFzRW50cnlG
b3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKIH0KIAogYm9vbCBEYXRhYmFzZVRyYWNrZXI6Omhhc0Vu
dHJ5Rm9yRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRh
YmFzZUlkZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVh
ZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKICAgICBvcGVuVHJh
Y2tlckRhdGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAg
ICAgIHJldHVybiBmYWxzZTsKQEAgLTE5MywxNiArMjEyLDE3IEBAIHVuc2lnbmVkIGxvbmcgbG9u
ZyBEYXRhYmFzZVRyYWNrZXI6OmdldE0KIAogU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2lu
UGF0aChTZWN1cml0eU9yaWdpbiogb3JpZ2luKSBjb25zdAogewotICAgIEFTU0VSVChjdXJyZW50
VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotICAgIHJldHVybiBTUUxpdGVGaWxlU3lzdGVtOjphcHBl
bmREYXRhYmFzZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLCBvcmlnaW4t
PmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICByZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBw
ZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aC50aHJlYWRz
YWZlQ29weSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIH0KIAotU3RyaW5nIERh
dGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZShTZWN1cml0eU9yaWdpbiogb3JpZ2lu
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RFeGlzdHMpCitTdHJpbmcgRGF0
YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBv
cmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZk5vdEV4aXN0cykKIHsKLSAg
ICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fZGF0
YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVCghb3JpZ2luUXVvdGFNYW5hZ2VyTm9M
b2NrKCkudHJ5TG9jaygpKTsKIAotICAgIGlmIChtX3Byb3Bvc2VkRGF0YWJhc2UgJiYgbV9wcm9w
b3NlZERhdGFiYXNlLT5maXJzdCA9PSBvcmlnaW4gJiYgbV9wcm9wb3NlZERhdGFiYXNlLT5zZWNv
bmQubmFtZSgpID09IG5hbWUpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICBmb3IgKEhh
c2hTZXQ8UHJvcG9zZWREYXRhYmFzZSo+OjppdGVyYXRvciBpdGVyID0gbV9wcm9wb3NlZERhdGFi
YXNlcy5iZWdpbigpOyBpdGVyICE9IG1fcHJvcG9zZWREYXRhYmFzZXMuZW5kKCk7ICsraXRlcikK
KyAgICAgICAgaWYgKCgqaXRlciktPmZpcnN0ID09IG9yaWdpbiAmJiAoKml0ZXIpLT5zZWNvbmQu
bmFtZSgpID09IG5hbWUpCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAgICBTdHJp
bmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCk7CiAgICAg
U3RyaW5nIG9yaWdpblBhdGggPSB0aGlzLT5vcmlnaW5QYXRoKG9yaWdpbik7CkBAIC0yMTIsNyAr
MjMyLDYgQEAgU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYgogICAgICAg
ICByZXR1cm4gU3RyaW5nKCk7CiAKICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHBhdGggZm9yIHRo
aXMgZGF0YWJhc2UgeWV0Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CiAgICAgaWYg
KCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgU1FM
aXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIHBhdGggRlJPTSBEYXRh
YmFzZXMgV0hFUkUgb3JpZ2luPT8gQU5EIG5hbWU9PzsiKTsKQEAgLTIzMSwzNiArMjUwLDQyIEBA
IFN0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWIKICAgICAgICAgcmV0dXJu
IFN0cmluZygpOwogCiAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHREb25lKSB7Ci0gICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIHJldHJpZXZlIGZpbGVuYW1lIGZyb20gRGF0YWJhc2UgVHJh
Y2tlciBmb3Igb3JpZ2luICVzLCBuYW1lICVzIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIo
KS5hc2NpaSgpLmRhdGEoKSwgbmFtZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIExPR19FUlJP
UigiRmFpbGVkIHRvIHJldHJpZXZlIGZpbGVuYW1lIGZyb20gRGF0YWJhc2UgVHJhY2tlciBmb3Ig
b3JpZ2luICVzLCBuYW1lICVzIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSwgbmFt
ZS5hc2NpaSgpLmRhdGEoKSk7CiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKICAgICB9CiAgICAg
c3RhdGVtZW50LmZpbmFsaXplKCk7CiAKLSAgICBTdHJpbmcgZmlsZU5hbWUgPSBTUUxpdGVGaWxl
U3lzdGVtOjpnZXRGaWxlTmFtZUZvck5ld0RhdGFiYXNlKG9yaWdpblBhdGgsIG5hbWUsIG9yaWdp
bi0+ZGF0YWJhc2VJZGVudGlmaWVyKCksICZtX2RhdGFiYXNlKTsKKyAgICBTdHJpbmcgZmlsZU5h
bWUgPSBTUUxpdGVGaWxlU3lzdGVtOjpnZXRGaWxlTmFtZUZvck5ld0RhdGFiYXNlKG9yaWdpblBh
dGgsIG5hbWUsIG9yaWdpbklkZW50aWZpZXIsICZtX2RhdGFiYXNlKTsKICAgICBpZiAoIWFkZERh
dGFiYXNlKG9yaWdpbiwgbmFtZSwgZmlsZU5hbWUpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CiAKICAgICAvLyBJZiB0aGlzIG9yaWdpbidzIHF1b3RhIGlzIGJlaW5nIHRyYWNrZWQgKG9wZW4g
aGFuZGxlIHRvIGEgZGF0YWJhc2UgaW4gdGhpcyBvcmlnaW4pLCBhZGQgdGhpcyBuZXcgZGF0YWJh
c2UKICAgICAvLyB0byB0aGUgcXVvdGEgbWFuYWdlciBub3cKICAgICBTdHJpbmcgZnVsbEZpbGVQ
YXRoID0gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0aChvcmln
aW5QYXRoLCBmaWxlTmFtZSk7Ci0gICAgewotICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5h
Z2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwotICAgICAgICBpZiAob3JpZ2luUXVv
dGFNYW5hZ2VyKCkudHJhY2tzT3JpZ2luKG9yaWdpbikpCi0gICAgICAgICAgICBvcmlnaW5RdW90
YU1hbmFnZXIoKS5hZGREYXRhYmFzZShvcmlnaW4sIG5hbWUsIGZ1bGxGaWxlUGF0aCk7Ci0gICAg
fQorICAgIGlmIChvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmlnaW4ob3JpZ2lu
KSkKKyAgICAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkuYWRkRGF0YWJhc2Uob3JpZ2lu
LCBuYW1lLCBmdWxsRmlsZVBhdGgpOwogCiAgICAgcmV0dXJuIGZ1bGxGaWxlUGF0aDsKIH0KIAor
U3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZShTZWN1cml0eU9yaWdp
biogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RFeGlzdHMpCit7
CisgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gbG9ja2VyKG9yaWdpblF1b3RhTWFuYWdl
cigpKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAg
ICBwb3B1bGF0ZU9yaWdpbnMoKTsKKworICAgIHJldHVybiBmdWxsUGF0aEZvckRhdGFiYXNlTm9M
b2NrKG9yaWdpbiwgbmFtZSwgY3JlYXRlSWZOb3RFeGlzdHMpLnRocmVhZHNhZmVDb3B5KCk7Cit9
CisKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpwb3B1bGF0ZU9yaWdpbnMoKQogeworICAgIEFTU0VS
VCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAgICAgaWYgKG1fcXVvdGFNYXApCiAgICAg
ICAgIHJldHVybjsKIAotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwot
CiAgICAgbV9xdW90YU1hcC5zZXQobmV3IFF1b3RhTWFwKTsKLSAgICBtX3F1b3RhTWFuYWdlci5z
ZXQobmV3IE9yaWdpblF1b3RhTWFuYWdlcik7CisgICAgaWYgKCFtX3F1b3RhTWFuYWdlcikKKyAg
ICAgICAgbV9xdW90YU1hbmFnZXIuc2V0KG5ldyBPcmlnaW5RdW90YU1hbmFnZXIpOwogCiAgICAg
b3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3Blbigp
KQpAQCAtMjY4LDMwICsyOTMsMzIgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3Jp
Z2lucygpCiAKICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxF
Q1Qgb3JpZ2luLCBxdW90YSBGUk9NIE9yaWdpbnMiKTsKIAotICAgIGlmIChzdGF0ZW1lbnQucHJl
cGFyZSgpICE9IFNRTFJlc3VsdE9rKQorICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNR
TFJlc3VsdE9rKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3RhdGVt
ZW50LiIpOwogICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgaW50IHJlc3VsdDsKICAgICB3
aGlsZSAoKHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTFJlc3VsdFJvdykgewogICAg
ICAgICBSZWZQdHI8U2VjdXJpdHlPcmlnaW4+IG9yaWdpbiA9IFNlY3VyaXR5T3JpZ2luOjpjcmVh
dGVGcm9tRGF0YWJhc2VJZGVudGlmaWVyKHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApKTsKLSAg
ICAgICAgbV9xdW90YU1hcC0+c2V0KG9yaWdpbi5nZXQoKSwgc3RhdGVtZW50LmdldENvbHVtbklu
dDY0KDEpKTsKKyAgICAgICAgbV9xdW90YU1hcC0+c2V0KG9yaWdpbi5nZXQoKS0+dGhyZWFkc2Fm
ZUNvcHkoKSwgc3RhdGVtZW50LmdldENvbHVtbkludDY0KDEpKTsKICAgICB9CiAKICAgICBpZiAo
cmVzdWx0ICE9IFNRTFJlc3VsdERvbmUpCi0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJl
YWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UiKTsKKyAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRoZSBkYXRhYmFzZS4iKTsKIH0K
IAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbnMoVmVjdG9yPFJlZlB0cjxTZWN1cml0eU9y
aWdpbj4gPiYgcmVzdWx0KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJl
YWQpOworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogICAg
IHBvcHVsYXRlT3JpZ2lucygpOwotICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3Rh
TWFwR3VhcmQpOworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKICAgICBjb3B5S2V5c1RvVmVjdG9y
KCptX3F1b3RhTWFwLCByZXN1bHQpOwogfQogCi1ib29sIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJh
c2VOYW1lc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBWZWN0b3I8U3RyaW5nPiYg
cmVzdWx0VmVjdG9yKQorYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmln
aW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9yPFN0cmluZz4mIHJlc3VsdFZl
Y3RvcikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBB
U1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOwogICAgIG9wZW5UcmFja2VyRGF0YWJh
c2UoZmFsc2UpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJu
IGZhbHNlOwpAQCAtMzE1LDQ0ICszNDIsNjMgQEAgYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFi
YXNlTmFtZXNGb3JPcgogICAgIHJldHVybiB0cnVlOwogfQogCi1EYXRhYmFzZURldGFpbHMgRGF0
YWJhc2VUcmFja2VyOjpkZXRhaWxzRm9yTmFtZUFuZE9yaWdpbihjb25zdCBTdHJpbmcmIG5hbWUs
IFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCitib29sIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VO
YW1lc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBWZWN0b3I8U3RyaW5nPiYgcmVz
dWx0VmVjdG9yKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwor
ICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgIFZlY3Rv
cjxTdHJpbmc+IHRlbXA7CisgICAgaWYgKCFkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKG9y
aWdpbiwgdGVtcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChtX3Byb3Bvc2Vk
RGF0YWJhc2UgJiYgbV9wcm9wb3NlZERhdGFiYXNlLT5maXJzdCA9PSBvcmlnaW4gJiYgbV9wcm9w
b3NlZERhdGFiYXNlLT5zZWNvbmQubmFtZSgpID09IG5hbWUpCi0gICAgICAgIHJldHVybiBtX3By
b3Bvc2VkRGF0YWJhc2UtPnNlY29uZDsKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRv
ciBpdGVyID0gdGVtcC5iZWdpbigpOyBpdGVyICE9IHRlbXAuZW5kKCk7ICsraXRlcikKKyAgICAg
ICAgcmVzdWx0VmVjdG9yLmFwcGVuZChpdGVyLT50aHJlYWRzYWZlQ29weSgpKTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KIAorRGF0YWJhc2VEZXRhaWxzIERhdGFiYXNlVHJhY2tlcjo6ZGV0YWlsc0Zv
ck5hbWVBbmRPcmlnaW4oY29uc3QgU3RyaW5nJiBuYW1lLCBTZWN1cml0eU9yaWdpbiogb3JpZ2lu
KQorewogICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVyID0gb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKTsKKyAgICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgaW50NjRfdCBleHBlY3RlZFVz
YWdlOwogCi0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7Ci0gICAgaWYgKCFtX2RhdGFi
YXNlLmlzT3BlbigpKQotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7Ci0gICAgU1FM
aXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIGRpc3BsYXlOYW1lLCBl
c3RpbWF0ZWRTaXplIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT8iKTsK
LSAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKLSAgICAgICAgcmV0
dXJuIERhdGFiYXNlRGV0YWlscygpOwotCi0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdp
bklkZW50aWZpZXIpOwotICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBuYW1lKTsKLQotICAgIGlu
dCByZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpOwotICAgIGlmIChyZXN1bHQgPT0gU1FMUmVzdWx0
RG9uZSkKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgIHsKKyAgICAgICAg
TXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAKLSAgICBpZiAocmVz
dWx0ICE9IFNRTFJlc3VsdFJvdykgewotICAgICAgICBMT0dfRVJST1IoIkVycm9yIHJldHJpZXZp
bmcgZGV0YWlscyBmb3IgZGF0YWJhc2UgJXMgaW4gb3JpZ2luICVzIGZyb20gdHJhY2tlciBkYXRh
YmFzZSIsIG5hbWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRh
KCkpOwotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7CisgICAgICAgIGZvciAoSGFz
aFNldDxQcm9wb3NlZERhdGFiYXNlKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX3Byb3Bvc2VkRGF0YWJh
c2VzLmJlZ2luKCk7IGl0ZXIgIT0gbV9wcm9wb3NlZERhdGFiYXNlcy5lbmQoKTsgKytpdGVyKQor
ICAgICAgICAgICAgaWYgKCgqaXRlciktPmZpcnN0ID09IG9yaWdpbiAmJiAoKml0ZXIpLT5zZWNv
bmQubmFtZSgpID09IG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuICgqaXRlciktPnNlY29u
ZDsKKworICAgICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKKyAgICAgICAgaWYgKCFt
X2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygp
OworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1Qg
ZGlzcGxheU5hbWUsIGVzdGltYXRlZFNpemUgRlJPTSBEYXRhYmFzZXMgV0hFUkUgb3JpZ2luPT8g
QU5EIG5hbWU9PyIpOworICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1
bHRPaykKKyAgICAgICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKworICAgICAgICBz
dGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7CisgICAgICAgIHN0YXRlbWVu
dC5iaW5kVGV4dCgyLCBuYW1lKTsKKworICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdGVtZW50LnN0
ZXAoKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBTUUxSZXN1bHREb25lKQorICAgICAgICAgICAg
cmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gU1FMUmVz
dWx0Um93KSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkVycm9yIHJldHJpZXZpbmcgZGV0YWls
cyBmb3IgZGF0YWJhc2UgJXMgaW4gb3JpZ2luICVzIGZyb20gdHJhY2tlciBkYXRhYmFzZSIsIG5h
bWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbklkZW50aWZpZXIuYXNjaWkoKS5kYXRhKCkpOworICAg
ICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgICAgICB9CisgICAgICAgIGRp
c3BsYXlOYW1lID0gc3RhdGVtZW50LmdldENvbHVtblRleHQoMCk7CisgICAgICAgIGV4cGVjdGVk
VXNhZ2UgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uSW50NjQoMSk7CiAgICAgfQogCi0gICAgcmV0dXJu
IERhdGFiYXNlRGV0YWlscyhuYW1lLCBzdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKSwgc3RhdGVt
ZW50LmdldENvbHVtbkludDY0KDEpLCB1c2FnZUZvckRhdGFiYXNlKG5hbWUsIG9yaWdpbikpOwor
ICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMobmFtZSwgZGlzcGxheU5hbWUsIGV4cGVjdGVkVXNh
Z2UsIHVzYWdlRm9yRGF0YWJhc2UobmFtZSwgb3JpZ2luKSk7CiB9CiAKIHZvaWQgRGF0YWJhc2VU
cmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNpZ25lZCBsb25nIGVz
dGltYXRlZFNpemUpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7
Ci0KICAgICBTdHJpbmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCk7CiAgICAgaW50NjRfdCBndWlkID0gMDsKIAorICAgIE11dGV4TG9ja2VyIGxvY2tEYXRh
YmFzZShtX2RhdGFiYXNlR3VhcmQpOworCiAgICAgb3BlblRyYWNrZXJEYXRhYmFzZSh0cnVlKTsK
ICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybjsKQEAgLTQwMCw3
ICs0NDYsNiBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxzCiAKIHVu
c2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yRGF0YWJhc2UoY29uc3Qg
U3RyaW5nJiBuYW1lLCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFTU0VSVChjdXJy
ZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwogICAgIFN0cmluZyBwYXRoID0gZnVsbFBhdGhGb3JE
YXRhYmFzZShvcmlnaW4sIG5hbWUsIGZhbHNlKTsKICAgICBpZiAocGF0aC5pc0VtcHR5KCkpCiAg
ICAgICAgIHJldHVybiAwOwpAQCAtNDI4LDcgKzQ3Myw3IEBAIHZvaWQgRGF0YWJhc2VUcmFja2Vy
OjphZGRPcGVuRGF0YWJhc2UoRGEKICAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQgPSBuYW1l
TWFwLT5nZXQobmFtZSk7CiAgICAgaWYgKCFkYXRhYmFzZVNldCkgewogICAgICAgICBkYXRhYmFz
ZVNldCA9IG5ldyBEYXRhYmFzZVNldDsKLSAgICAgICAgbmFtZU1hcC0+c2V0KG5hbWUsIGRhdGFi
YXNlU2V0KTsKKyAgICAgICAgbmFtZU1hcC0+c2V0KG5hbWUudGhyZWFkc2FmZUNvcHkoKSwgZGF0
YWJhc2VTZXQpOwogICAgIH0KIAogICAgIGRhdGFiYXNlU2V0LT5hZGQoZGF0YWJhc2UpOwpAQCAt
NDQxLDYgKzQ4Niw3IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UK
ICAgICBpZiAoIWRhdGFiYXNlKQogICAgICAgICByZXR1cm47CiAKKyAgICBMb2NrZXI8T3JpZ2lu
UXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwog
ICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFy
ZCk7CiAKICAgICBpZiAoIW1fb3BlbkRhdGFiYXNlTWFwKSB7CkBAIC00NzYsNiArNTIyLDEwIEBA
IHZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UKIAogICAgIG1fb3BlbkRh
dGFiYXNlTWFwLT5yZW1vdmUoZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpOwogICAgIGRlbGV0
ZSBuYW1lTWFwOworICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnJlbW92ZU9yaWdpbihk
YXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSk7CisKKyAgICAvLyBUaHJvdyBhd2F5IG1fcXVvdGFN
YXAgd2hlbmV2ZXIgd2UndmUgY2xlYXJlZCBvdXQgYW4gb3JpZ2luLS1vdGhlcndpc2Ugd2UgbmV2
ZXIgZ2V0IHJpZCBvZiBzdGFsZSBlbnRyaWVzLiAgVGhlIG5leHQgY2FsbCB0aGF0IG5lZWRzIGl0
IHdpbGwgcG9wdWxhdGVPcmlnaW5zKCkuCisgICAgbV9xdW90YU1hcC5jbGVhcigpOwogfQogCiB2
b2lkIERhdGFiYXNlVHJhY2tlcjo6Z2V0T3BlbkRhdGFiYXNlcyhTZWN1cml0eU9yaWdpbiogb3Jp
Z2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIEhhc2hTZXQ8UmVmUHRyPERhdGFiYXNlPiA+KiBkYXRh
YmFzZXMpCkBAIC00OTYsOTIgKzU0NiwxMDMgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmdldE9w
ZW5EYXRhYmFzZXMoUwogICAgICAgICBkYXRhYmFzZXMtPmFkZCgqaXQpOwogfQogCi11bnNpZ25l
ZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbihTZWN1cml0eU9yaWdp
biogb3JpZ2luKQordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JP
cmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVu
dFRocmVhZCgpID09IG1fdGhyZWFkKTsKLSAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBs
b2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgIEFTU0VSVCghb3JpZ2luUXVvdGFNYW5h
Z2VyTm9Mb2NrKCkudHJ5TG9jaygpKTsKIAogICAgIC8vIFVzZSB0aGUgT3JpZ2luUXVvdGFNYW5h
Z2VyIG1lY2hhbmlzbSB0byBjYWxjdWxhdGUgdGhlIHVzYWdlCi0gICAgaWYgKG9yaWdpblF1b3Rh
TWFuYWdlcigpLnRyYWNrc09yaWdpbihvcmlnaW4pKQotICAgICAgICByZXR1cm4gb3JpZ2luUXVv
dGFNYW5hZ2VyKCkuZGlza1VzYWdlKG9yaWdpbik7CisgICAgaWYgKG9yaWdpblF1b3RhTWFuYWdl
ck5vTG9jaygpLnRyYWNrc09yaWdpbihvcmlnaW4pKQorICAgICAgICByZXR1cm4gb3JpZ2luUXVv
dGFNYW5hZ2VyTm9Mb2NrKCkuZGlza1VzYWdlKG9yaWdpbik7CiAKICAgICAvLyBJZiB0aGUgT3Jp
Z2luUXVvdGFNYW5hZ2VyIGRvZXNuJ3QgdHJhY2sgdGhpcyBvcmlnaW4gYWxyZWFkeSwgcHJpbWUg
aXQgdG8gZG8gc28KLSAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja09yaWdpbihvcmlnaW4p
OworICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrT3JpZ2luKG9yaWdpbik7CiAK
ICAgICBWZWN0b3I8U3RyaW5nPiBuYW1lczsKLSAgICBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKG9y
aWdpbiwgbmFtZXMpOworICAgIGRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2sob3JpZ2luLCBu
YW1lcyk7CiAKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyArK2kp
Ci0gICAgICAgIG9yaWdpblF1b3RhTWFuYWdlcigpLmFkZERhdGFiYXNlKG9yaWdpbiwgbmFtZXNb
aV0sIGZ1bGxQYXRoRm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lc1tpXSwgZmFsc2UpKTsKKyAgICAg
ICAgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkuYWRkRGF0YWJhc2Uob3JpZ2luLCBuYW1lc1tp
XSwgZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayhvcmlnaW4sIG5hbWVzW2ldLCBmYWxzZSkpOwog
Ci0gICAgaWYgKCFvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKKyAg
ICBpZiAoIW9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrc09yaWdpbihvcmlnaW4pKQog
ICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2VyKCkuZGlza1Vz
YWdlKG9yaWdpbik7CisgICAgcmV0dXJuIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmRpc2tV
c2FnZShvcmlnaW4pOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjp1
c2FnZUZvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luKQoreworICAgIExvY2tlcjxPcmln
aW5RdW90YU1hbmFnZXI+IGxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7CisKKyAgICByZXR1
cm4gdXNhZ2VGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25n
IERhdGFiYXNlVHJhY2tlcjo6cXVvdGFGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9y
aWdpbikKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFT
U0VSVChtX3F1b3RhTWFwKTsKKyAgICByZXR1cm4gbV9xdW90YU1hcC0+Z2V0KG9yaWdpbik7CiB9
CiAKIHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luKFNl
Y3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBt
X3RocmVhZCB8fCBtX3F1b3RhTWFwKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9k
YXRhYmFzZUd1YXJkKTsKICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKLSAgICBNdXRleExvY2tlciBs
b2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJkKTsKLSAgICByZXR1cm4gbV9xdW90YU1hcC0+Z2V0
KG9yaWdpbik7CisgICAgcmV0dXJuIHF1b3RhRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7CiB9CiAK
IHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXRRdW90YShTZWN1cml0eU9yaWdpbiogb3JpZ2luLCB1
bnNpZ25lZCBsb25nIGxvbmcgcXVvdGEpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9
PSBtX3RocmVhZCk7Ci0gICAgaWYgKHF1b3RhRm9yT3JpZ2luKG9yaWdpbikgPT0gcXVvdGEpCisg
ICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisKKyAgICBwb3B1
bGF0ZU9yaWdpbnMoKTsKKyAgICBpZiAocXVvdGFGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKSA9PSBx
dW90YSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgb3BlblRyYWNrZXJEYXRhYmFzZSh0cnVlKTsK
ICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIHsK
LSAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFyZCk7Ci0KLSAg
ICAgICAgaWYgKCFtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pKSB7Ci0gICAgICAgICAgICBT
UUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5UTyBPcmlnaW5z
IFZBTFVFUyAoPywgPykiKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9
IFNRTFJlc3VsdE9rKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0
YWJsaXNoIG9yaWdpbiAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7
Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgyLCBxdW90YSk7Ci0KLSAgICAg
ICAgICAgICAgICBpZiAoc3RhdGVtZW50LnN0ZXAoKSAhPSBTUUxSZXN1bHREb25lKQotICAgICAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2ggb3JpZ2luICVzIGlu
IHRoZSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEo
KSk7Ci0gICAgICAgICAgICB9CisgICAgaWYgKCFtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4p
KSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIklOU0VS
VCBJTlRPIE9yaWdpbnMgVkFMVUVTICg/LCA/KSIpOworICAgICAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUg
dG8gZXN0YWJsaXNoIG9yaWdpbiAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJ
ZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiVVBEQVRFIE9yaWdpbnMg
U0VUIHF1b3RhPT8gV0hFUkUgb3JpZ2luPT8iKTsKLSAgICAgICAgICAgIGJvb2wgZXJyb3IgPSBz
dGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rOwotICAgICAgICAgICAgaWYgKCFlcnJv
cikgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMSwgcXVvdGEpOwotICAg
ICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRp
ZmllcigpKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMiwgcXVv
dGEpOwogCi0gICAgICAgICAgICAgICAgZXJyb3IgPSAhc3RhdGVtZW50LmV4ZWN1dGVDb21tYW5k
KCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50LnN0ZXAoKSAhPSBT
UUxSZXN1bHREb25lKQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVzdGFi
bGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmll
cigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFNR
TGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlVQREFURSBPcmlnaW5zIFNFVCBx
dW90YT0/IFdIRVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGJvb2wgZXJyb3IgPSBzdGF0ZW1lbnQu
cHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rOworICAgICAgICBpZiAoIWVycm9yKSB7CisgICAgICAg
ICAgICBzdGF0ZW1lbnQuYmluZEludDY0KDEsIHF1b3RhKTsKKyAgICAgICAgICAgIHN0YXRlbWVu
dC5iaW5kVGV4dCgyLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIAotICAgICAgICAg
ICAgaWYgKGVycm9yKQotICAgICAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHNldCBx
dW90YSAlbGx1IGluIHRyYWNrZXIgZGF0YWJhc2UgZm9yIG9yaWdpbiAlcyIsIHF1b3RhLCBvcmln
aW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGVy
cm9yID0gIXN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAg
Ly8gRklYTUU6IElzIGl0IHJlYWxseSBPSyB0byB1cGRhdGUgdGhlIHF1b3RhIGluIG1lbW9yeSBp
ZiB3ZSBmYWlsZWQgdG8gdXBkYXRlIGl0IG9uIGRpc2s/Ci0gICAgICAgIG1fcXVvdGFNYXAtPnNl
dChvcmlnaW4sIHF1b3RhKTsKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgTE9HX0VS
Uk9SKCJGYWlsZWQgdG8gc2V0IHF1b3RhICVsbHUgaW4gdHJhY2tlciBkYXRhYmFzZSBmb3Igb3Jp
Z2luICVzIiwgcXVvdGEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRh
KCkpOwogICAgIH0KIAorICAgIC8vIEZJWE1FOiBJcyBpdCByZWFsbHkgT0sgdG8gdXBkYXRlIHRo
ZSBxdW90YSBpbiBtZW1vcnkgaWYgd2UgZmFpbGVkIHRvIHVwZGF0ZSBpdCBvbiBkaXNrPworICAg
IG1fcXVvdGFNYXAtPnNldChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIHF1b3RhKTsKKwogICAg
IGlmIChtX2NsaWVudCkKICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3JpZ2lu
KG9yaWdpbik7CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZShTZWN1cml0
eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgcGF0aCkK
IHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NFUlQo
IW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKICAg
ICBvcGVuVHJhY2tlckRhdGFiYXNlKHRydWUpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4o
KSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gTmV3IGRhdGFiYXNlIHNob3VsZCBu
ZXZlciBiZSBhZGRlZCB1bnRpbCB0aGUgb3JpZ2luIGhhcyBiZWVuIGVzdGFibGlzaGVkCi0gICAg
QVNTRVJUKGhhc0VudHJ5Rm9yT3JpZ2luKG9yaWdpbikpOworICAgIEFTU0VSVChoYXNFbnRyeUZv
ck9yaWdpbk5vTG9jayhvcmlnaW4pKTsKIAogICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQo
bV9kYXRhYmFzZSwgIklOU0VSVCBJTlRPIERhdGFiYXNlcyAob3JpZ2luLCBuYW1lLCBwYXRoKSBW
QUxVRVMgKD8sID8sID8pOyIpOwogCkBAIC02MDUsOCArNjY2LDYgQEAgYm9vbCBEYXRhYmFzZVRy
YWNrZXI6OmFkZERhdGFiYXNlKFNlY3VyaQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRl
QWxsRGF0YWJhc2VzKCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFk
KTsKLQogICAgIFZlY3RvcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+ID4gb3JpZ2luc0NvcHk7CiAg
ICAgb3JpZ2lucyhvcmlnaW5zQ29weSk7CiAKQEAgLTYxNCwxOSArNjczLDI0IEBAIHZvaWQgRGF0
YWJhc2VUcmFja2VyOjpkZWxldGVBbGxEYXRhYmFzZXMKICAgICAgICAgZGVsZXRlT3JpZ2luKG9y
aWdpbnNDb3B5W2ldLmdldCgpKTsKIH0KIAorLy8gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNp
YmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IG5vYm9keSBpcyB0cnlpbmcgdG8gY3JlYXRlLCBkZWxl
dGUsIG9wZW4sIG9yIGNsb3NlIGRhdGFiYXNlcyBpbiB0aGlzIG9yaWdpbiB3aGlsZSB0aGUgZGVs
ZXRpb24gaXMKKy8vIHRha2luZyBwbGFjZS4KIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpkZWxldGVP
cmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVh
ZCgpID09IG1fdGhyZWFkKTsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKLSAgICBp
ZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIFZlY3RvcjxT
dHJpbmc+IGRhdGFiYXNlTmFtZXM7Ci0gICAgaWYgKCFkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKG9y
aWdpbiwgZGF0YWJhc2VOYW1lcykpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmV0
cmlldmUgbGlzdCBvZiBkYXRhYmFzZSBuYW1lcyBmb3Igb3JpZ2luICVzIiwgb3JpZ2luLT5kYXRh
YmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsKKyAgICB7
CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAg
ICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKKyAgICAgICAgaWYgKCFtX2RhdGFiYXNl
LmlzT3BlbigpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghZGF0YWJhc2VO
YW1lc0Zvck9yaWdpbk5vTG9jayhvcmlnaW4sIGRhdGFiYXNlTmFtZXMpKSB7CisgICAgICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byByZXRyaWV2ZSBsaXN0IG9mIGRhdGFiYXNlIG5hbWVzIGZv
ciBvcmlnaW4gJXMiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdlIGRy
b3AgdGhlIGxvY2sgaGVyZSBiZWNhdXNlIGhvbGRpbmcgbG9ja3MgZHVyaW5nIGEgY2FsbCB0byBk
ZWxldGVEYXRhYmFzZUZpbGUgd2lsbCBkZWFkbG9jay4KICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgZGF0YWJhc2VOYW1lcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAoIWRlbGV0ZURh
dGFiYXNlRmlsZShvcmlnaW4sIGRhdGFiYXNlTmFtZXNbaV0pKSB7CiAgICAgICAgICAgICAvLyBF
dmVuIGlmIHRoZSBmaWxlIGNhbid0IGJlIGRlbGV0ZWQsIHdlIHdhbnQgdG8gdHJ5IGFuZCBkZWxl
dGUgdGhlIHJlc3QsIGRvbid0IHJldHVybiBlYXJseSBoZXJlLgpAQCAtNjM0LDQxICs2OTgsNDIg
QEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZU9yaWdpbihTZWN1cgogICAgICAgICB9CiAg
ICAgfQogCi0gICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRF
IEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgaWYgKHN0YXRlbWVudC5wcmVw
YXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJl
cGFyZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwg
b3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9CisgICAgeworICAgICAgICAvLyBUbyBzYXRpc2Z5IHRoZSBsb2NrIGhpZXJh
cmNoeSwgd2UgaGF2ZSB0byBsb2NrIHRoZSBvcmlnaW5RdW90YU1hbmFnZXIgYmVmb3JlIG1fZGF0
YWJhc2VHdWFyZCBpZiB0aGVyZSdzIGFueSBjaGFuY2Ugd2UnbGwgdG8gbG9jayBib3RoLgorICAg
ICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJMb2NrZXIob3JpZ2lu
UXVvdGFNYW5hZ2VyKCkpOworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRh
YmFzZUd1YXJkKTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNl
LCAiREVMRVRFIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGlmIChz
dGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7CisgICAgICAgICAgICBMT0dfRVJS
T1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAl
cyBmcm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0
YSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgc3RhdGVtZW50LmJp
bmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOworICAgICAgICBzdGF0ZW1l
bnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiAKLSAgICBpZiAo
IXN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxl
IHRvIGV4ZWN1dGUgZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJh
Y2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQorICAgICAgICBpZiAoIXN0YXRlbWVudC5leGVjdXRlQ29tbWFu
ZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9u
IG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQogCi0gICAgU1FMaXRlU3RhdGVtZW50IG9yaWdpblN0YXRlbWVudChtX2RhdGFiYXNl
LCAiREVMRVRFIEZST00gT3JpZ2lucyBXSEVSRSBvcmlnaW49PyIpOwotICAgIGlmIChvcmlnaW5T
dGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7Ci0gICAgICAgIExPR19FUlJPUigi
VW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2Ygb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9y
aWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgb3JpZ2luU3RhdGVtZW50KG1fZGF0
YWJhc2UsICJERUxFVEUgRlJPTSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGlm
IChvcmlnaW5TdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7CisgICAgICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIG9yaWdpbiAlcyBmcm9t
IHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgb3JpZ2luU3RhdGVtZW50LmJp
bmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOworICAgICAgICBvcmlnaW5T
dGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiAKLSAg
ICBpZiAoIW9yaWdpblN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgIExPR19F
UlJPUigiVW5hYmxlIHRvIGV4ZWN1dGUgZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2lu
ICVzIGZyb20gdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5k
YXRhKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgICAgICBpZiAoIW9yaWdpblN0YXRl
bWVudC5leGVjdXRlQ29tbWFuZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBleGVjdXRlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNr
ZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRl
RW1wdHlEYXRhYmFzZURpcmVjdG9yeShvcmlnaW5QYXRoKG9yaWdpbikpOworICAgICAgICBTUUxp
dGVGaWxlU3lzdGVtOjpkZWxldGVFbXB0eURhdGFiYXNlRGlyZWN0b3J5KG9yaWdpblBhdGgob3Jp
Z2luKSk7CiAKLSAgICBSZWZQdHI8U2VjdXJpdHlPcmlnaW4+IG9yaWdpblBvc3NpYmx5TGFzdFJl
ZmVyZW5jZSA9IG9yaWdpbjsKLSAgICB7Ci0gICAgICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1h
cChtX3F1b3RhTWFwR3VhcmQpOworICAgICAgICBSZWZQdHI8U2VjdXJpdHlPcmlnaW4+IG9yaWdp
blBvc3NpYmx5TGFzdFJlZmVyZW5jZSA9IG9yaWdpbjsKICAgICAgICAgbV9xdW90YU1hcC0+cmVt
b3ZlKG9yaWdpbik7CiAKLSAgICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFN
YW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKLSAgICAgICAgb3JpZ2luUXVvdGFN
YW5hZ2VyKCkucmVtb3ZlT3JpZ2luKG9yaWdpbik7CisgICAgICAgIG9yaWdpblF1b3RhTWFuYWdl
ck5vTG9jaygpLnJlbW92ZU9yaWdpbihvcmlnaW4pOwogCiAgICAgICAgIC8vIElmIHdlIHJlbW92
ZWQgdGhlIGxhc3Qgb3JpZ2luLCBkbyBzb21lIGFkZGl0aW9uYWwgZGVsZXRpb24uCiAgICAgICAg
IGlmIChtX3F1b3RhTWFwLT5pc0VtcHR5KCkpIHsKQEAgLTY3NywyNyArNzQyLDM0IEBAIHZvaWQg
RGF0YWJhc2VUcmFja2VyOjpkZWxldGVPcmlnaW4oU2VjdXIKICAgICAgICAgICAgU1FMaXRlRmls
ZVN5c3RlbTo6ZGVsZXRlRGF0YWJhc2VGaWxlKHRyYWNrZXJEYXRhYmFzZVBhdGgoKSk7CiAgICAg
ICAgICAgIFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZUVtcHR5RGF0YWJhc2VEaXJlY3RvcnkobV9k
YXRhYmFzZURpcmVjdG9yeVBhdGgpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgaWYgKG1fY2xp
ZW50KSB7Ci0gICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdpbihvcmlnaW4p
OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YWJhc2VOYW1lcy5zaXplKCk7
ICsraSkKLSAgICAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeURhdGFiYXNlKG9y
aWdpbiwgZGF0YWJhc2VOYW1lc1tpXSk7CisgICAgICAgIGlmIChtX2NsaWVudCkgeworICAgICAg
ICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3JpZ2luKG9yaWdpbik7CisgICAgICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YWJhc2VOYW1lcy5zaXplKCk7ICsraSkK
KyAgICAgICAgICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlEYXRhYmFzZShvcmln
aW4sIGRhdGFiYXNlTmFtZXNbaV0pOworICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIERhdGFi
YXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3Qg
U3RyaW5nJiBuYW1lKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQp
OwotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwotICAgIGlmICghbV9kYXRhYmFzZS5p
c09wZW4oKSkKLSAgICAgICAgcmV0dXJuOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9j
a0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIG9wZW5UcmFja2VyRGF0YWJhc2Uo
ZmFsc2UpOworICAgICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgfQogCisgICAgLy8gV2UgZHJvcCB0aGUgbG9jayBoZXJlIGJlY2F1c2UgaG9s
ZGluZyBsb2NrcyBkdXJpbmcgYSBjYWxsIHRvIGRlbGV0ZURhdGFiYXNlRmlsZSB3aWxsIGRlYWRs
b2NrLgogICAgIGlmICghZGVsZXRlRGF0YWJhc2VGaWxlKG9yaWdpbiwgbmFtZSkpIHsKICAgICAg
ICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgZm9yIGRhdGFiYXNlICVzIGluIG9y
aWdpbiAlcyIsIG5hbWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVy
KCkuYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gVG8g
c2F0aXNmeSB0aGUgbG9jayBoaWVyYXJjaHksIHdlIGhhdmUgdG8gbG9jayB0aGUgb3JpZ2luUXVv
dGFNYW5hZ2VyIGJlZm9yZSBtX2RhdGFiYXNlR3VhcmQgaWYgdGhlcmUncyBhbnkgY2hhbmNlIHdl
J2xsIHRvIGxvY2sgYm90aC4KKyAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1h
bmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgIE11dGV4TG9ja2VyIGxvY2tE
YXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworCiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVu
dChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBu
YW1lPT8iKTsKICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewog
ICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIGRhdGFiYXNl
ICVzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG5hbWUuYXNjaWkoKS5kYXRhKCksIG9y
aWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwpAQCAtNzEyLDEwICs3
ODQsNyBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2UoU2VjCiAgICAgICAg
IHJldHVybjsKICAgICB9CiAKLSAgICB7Ci0gICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFn
ZXI+IHF1b3RhTWFuYWdlckxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Ci0gICAgICAgIG9y
aWdpblF1b3RhTWFuYWdlcigpLnJlbW92ZURhdGFiYXNlKG9yaWdpbiwgbmFtZSk7Ci0gICAgfQor
ICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnJlbW92ZURhdGFiYXNlKG9yaWdpbiwgbmFt
ZSk7CiAKICAgICBpZiAobV9jbGllbnQpIHsKICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlk
TW9kaWZ5T3JpZ2luKG9yaWdpbik7CkBAIC03MjMsMjYgKzc5MiwyNiBAQCB2b2lkIERhdGFiYXNl
VHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2UoU2VjCiAgICAgfQogfQogCisvLyBkZWxldGVEYXRhYmFz
ZUZpbGUgaGFzIHRvIHJlbGVhc2UgbG9ja3MgYmV0d2VlbiBsb29raW5nIHVwIHRoZSBsaXN0IG9m
IGRhdGFiYXNlcyB0byBjbG9zZSBhbmQgY2xvc2luZyB0aGVtLiAgV2hpbGUgdGhpcyBpcyBpbiBw
cm9ncmVzcywgdGhlIGNhbGxlcgorLy8gaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIG5v
IG5ldyBkYXRhYmFzZXMgYXJlIG9wZW5lZCBpbiB0aGUgZmlsZSB0byBiZSBkZWxldGVkLgogYm9v
bCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlRmlsZShTZWN1cml0eU9yaWdpbiogb3Jp
Z2luLCBjb25zdCBTdHJpbmcmIG5hbWUpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9
PSBtX3RocmVhZCk7CiAgICAgU3RyaW5nIGZ1bGxQYXRoID0gZnVsbFBhdGhGb3JEYXRhYmFzZShv
cmlnaW4sIG5hbWUsIGZhbHNlKTsKICAgICBpZiAoZnVsbFBhdGguaXNFbXB0eSgpKQogICAgICAg
ICByZXR1cm4gdHJ1ZTsKIAogICAgIFZlY3RvcjxSZWZQdHI8RGF0YWJhc2U+ID4gZGVsZXRlZERh
dGFiYXNlczsKIAotICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gaG9sZCB0aGUgbV9vcGVuRGF0YWJh
c2VNYXBHdWFyZCBtdXRleCB3aGVuIGNhbGxpbmcKKyAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGhv
bGQgdGhlIGFueSBsb2NrcyB3aGVuIGNhbGxpbmcKICAgICAvLyBEYXRhYmFzZTo6bWFya0FzRGVs
ZXRlZEFuZENsb3NlKCksIHNpbmNlIHRoYXQgY2FuIGNhdXNlIGEgZGVhZGxvY2sKICAgICAvLyBk
dXJpbmcgdGhlIHN5bmNocm9ub3VzIERhdGFiYXNlVGhyZWFkIGNhbGwgaXQgdHJpZ2dlcnMuCi0K
ICAgICB7CiAgICAgICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0
YWJhc2VNYXBHdWFyZCk7CiAgICAgICAgIGlmIChtX29wZW5EYXRhYmFzZU1hcCkgewogICAgICAg
ICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRhYmFzZXMsIGxldHMgY2hlY2sgaWYgdGhl
eSBhcmUgZm9yIHRoaXMgb3JpZ2luLgogICAgICAgICAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1l
TWFwID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChvcmlnaW4pOwogICAgICAgICAgICAgaWYgKG5h
bWVNYXAgJiYgbmFtZU1hcC0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJl
IHNvbWUgb3BlbiBkYXRhYmFzZXMgZm9yIHRoaXMgb3JpZ2luLCBsZXRzIGNoZWNrCisgICAgICAg
ICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRhYmFzZXMgZm9yIHRoaXMgb3JpZ2lu
LCBsZXQncyBjaGVjawogICAgICAgICAgICAgICAgIC8vIGlmIHRoZXkgYXJlIHRoaXMgZGF0YWJh
c2UgYnkgbmFtZS4KICAgICAgICAgICAgICAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQgPSBu
YW1lTWFwLT5nZXQobmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFiYXNlU2V0ICYmIGRh
dGFiYXNlU2V0LT5zaXplKCkpIHsKQEAgLTc2Myw3ICs4MzIsNiBAQCBib29sIERhdGFiYXNlVHJh
Y2tlcjo6ZGVsZXRlRGF0YWJhc2VGaWxlCiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXRDbGll
bnQoRGF0YWJhc2VUcmFja2VyQ2xpZW50KiBjbGllbnQpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRU
aHJlYWQoKSA9PSBtX3RocmVhZCk7CiAgICAgbV9jbGllbnQgPSBjbGllbnQ7CiB9CiAKQEAgLTc3
Myw3ICs4NDEsNyBAQCBzdGF0aWMgTXV0ZXgmIG5vdGlmaWNhdGlvbk11dGV4KCkKICAgICByZXR1
cm4gbXV0ZXg7CiB9CiAKLXR5cGVkZWYgVmVjdG9yPHBhaXI8U2VjdXJpdHlPcmlnaW4qLCBTdHJp
bmc+ID4gTm90aWZpY2F0aW9uUXVldWU7Cit0eXBlZGVmIFZlY3RvcjxwYWlyPFJlZlB0cjxTZWN1
cml0eU9yaWdpbj4sIFN0cmluZz4gPiBOb3RpZmljYXRpb25RdWV1ZTsKIAogc3RhdGljIE5vdGlm
aWNhdGlvblF1ZXVlJiBub3RpZmljYXRpb25RdWV1ZSgpCiB7CkBAIC03ODUsNyArODUzLDcgQEAg
dm9pZCBEYXRhYmFzZVRyYWNrZXI6OnNjaGVkdWxlTm90aWZ5RGF0YQogewogICAgIE11dGV4TG9j
a2VyIGxvY2tlcihub3RpZmljYXRpb25NdXRleCgpKTsKIAotICAgIG5vdGlmaWNhdGlvblF1ZXVl
KCkuYXBwZW5kKHBhaXI8U2VjdXJpdHlPcmlnaW4qLCBTdHJpbmc+KG9yaWdpbiwgbmFtZS5jcm9z
c1RocmVhZFN0cmluZygpKSk7CisgICAgbm90aWZpY2F0aW9uUXVldWUoKS5hcHBlbmQocGFpcjxS
ZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBTdHJpbmc+KG9yaWdpbi0+dGhyZWFkc2FmZUNvcHkoKSwg
bmFtZS5jcm9zc1RocmVhZFN0cmluZygpKSk7CiAgICAgc2NoZWR1bGVGb3JOb3RpZmljYXRpb24o
KTsKIH0KIApAQCAtODIwLDcgKzg4OCw3IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpub3RpZnlE
YXRhYmFzZXNDaGEKICAgICAgICAgcmV0dXJuOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG5vdGlmaWNhdGlvbnMuc2l6ZSgpOyArK2kpCi0gICAgICAgIHRoZVRyYWNrZXIubV9jbGll
bnQtPmRpc3BhdGNoRGlkTW9kaWZ5RGF0YWJhc2Uobm90aWZpY2F0aW9uc1tpXS5maXJzdCwgbm90
aWZpY2F0aW9uc1tpXS5zZWNvbmQpOworICAgICAgICB0aGVUcmFja2VyLm1fY2xpZW50LT5kaXNw
YXRjaERpZE1vZGlmeURhdGFiYXNlKG5vdGlmaWNhdGlvbnNbaV0uZmlyc3QuZ2V0KCksIG5vdGlm
aWNhdGlvbnNbaV0uc2Vjb25kKTsKIH0KIAogCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2VUcmFja2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tl
ci5oCShyZXZpc2lvbiA1NTg0NikKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIu
aAkod29ya2luZyBjb3B5KQpAQCAtNjAsOSArNjAsMTEgQEAgc3RydWN0IFNlY3VyaXR5T3JpZ2lu
VHJhaXRzOwogY2xhc3MgRGF0YWJhc2VUcmFja2VyIDogcHVibGljIE5vbmNvcHlhYmxlIHsKIHB1
YmxpYzoKICAgICBzdGF0aWMgRGF0YWJhc2VUcmFja2VyJiB0cmFja2VyKCk7Ci0gICAgLy8gRklY
TUU6IER1ZSB0byB3b3JrZXJzIGhhdmluZyBtdWx0aXBsZSB0aHJlYWRzIGluIGEgc2luZ2xlIHBy
b2Nlc3Mgc2hhcmluZwotICAgIC8vIGEgRGF0YWJhc2VUcmFja2VyLCB0aGlzIHNpbmdsZXRvbiB3
aWxsIGhhdmUgdG8gYmUgc3luY2hyb25pemVkIG9yIG1vdmVkCi0gICAgLy8gdG8gVExTLgorICAg
IC8vIFRoaXMgc2luZ2xldG9uIHdpbGwgcG90ZW50aWFsbHkgYmUgdXNlZCBmcm9tIG11bHRpcGxl
IHdvcmtlciB0aHJlYWRzIGFuZCB0aGUgcGFnZSdzIGNvbnRleHQgdGhyZWFkIHNpbXVsdGFuZW91
c2x5LiAgVG8ga2VlcCB0aGlzIHNhZmUsIGl0J3MKKyAgICAvLyBjdXJyZW50bHkgdXNpbmcgNCBs
b2Nrcy4gIEluIG9yZGVyIHRvIGF2b2lkIGRlYWRsb2NrIHdoZW4gdGFraW5nIG11bHRpcGxlIGxv
Y2tzLCB5b3UgbXVzdCB0YWtlIHRoZW0gaW4gdGhlIGNvcnJlY3Qgb3JkZXI6CisgICAgLy8gb3Jp
Z2luUXVvdGFNYW5hZ2VyKCkgYmVmb3JlIG1fZGF0YWJhc2VHdWFyZCBvciBtX29wZW5EYXRhYmFz
ZU1hcEd1YXJkCisgICAgLy8gbV9kYXRhYmFzZUd1YXJkIGJlZm9yZSBtX29wZW5EYXRhYmFzZU1h
cEd1YXJkCisgICAgLy8gbm90aWZpY2F0aW9uTXV0ZXgoKSBpcyBjdXJyZW50bHkgaW5kZXBlbmRl
bnQgb2YgdGhlIG90aGVyIGxvY2tzLgogCiAgICAgYm9vbCBjYW5Fc3RhYmxpc2hEYXRhYmFzZShT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IGRpc3BsYXlOYW1lLCB1bnNpZ25lZCBsb25nIGVzdGltYXRlZFNpemUpOwogICAgIHZvaWQgc2V0
RGF0YWJhc2VEZXRhaWxzKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNpZ25lZCBsb25nIGVzdGltYXRlZFNpemUpOwpAQCAt
ODcsNyArODksNyBAQCBwcml2YXRlOgogI2lmICFQTEFURk9STShDSFJPTUlVTSkKIHB1YmxpYzoK
ICAgICB2b2lkIHNldERhdGFiYXNlRGlyZWN0b3J5UGF0aChjb25zdCBTdHJpbmcmKTsKLSAgICBj
b25zdCBTdHJpbmcmIGRhdGFiYXNlRGlyZWN0b3J5UGF0aCgpIGNvbnN0OworICAgIFN0cmluZyBk
YXRhYmFzZURpcmVjdG9yeVBhdGgoKSBjb25zdDsKIAogICAgIHZvaWQgb3JpZ2lucyhWZWN0b3I8
UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiA+JiByZXN1bHQpOwogICAgIGJvb2wgZGF0YWJhc2VOYW1l
c0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbiosIFZlY3RvcjxTdHJpbmc+JiByZXN1bHQpOwpAQCAt
MTE0LDYgKzExNiwxMyBAQCBwdWJsaWM6CiAgICAgYm9vbCBoYXNFbnRyeUZvck9yaWdpbihTZWN1
cml0eU9yaWdpbiopOwogCiBwcml2YXRlOgorICAgIE9yaWdpblF1b3RhTWFuYWdlciYgb3JpZ2lu
UXVvdGFNYW5hZ2VyTm9Mb2NrKCk7CisgICAgYm9vbCBoYXNFbnRyeUZvck9yaWdpbk5vTG9jayhT
ZWN1cml0eU9yaWdpbiogb3JpZ2luKTsKKyAgICBTdHJpbmcgZnVsbFBhdGhGb3JEYXRhYmFzZU5v
TG9jayhTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZkRv
ZXNOb3RFeGlzdCk7CisgICAgYm9vbCBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKFNlY3Vy
aXR5T3JpZ2luKiBvcmlnaW4sIFZlY3RvcjxTdHJpbmc+JiByZXN1bHRWZWN0b3IpOworICAgIHVu
c2lnbmVkIGxvbmcgbG9uZyB1c2FnZUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3Jp
Z2luKTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgcXVvdGFGb3JPcmlnaW5Ob0xvY2soU2VjdXJp
dHlPcmlnaW4qIG9yaWdpbik7CisKICAgICBTdHJpbmcgdHJhY2tlckRhdGFiYXNlUGF0aCgpIGNv
bnN0OwogICAgIHZvaWQgb3BlblRyYWNrZXJEYXRhYmFzZShib29sIGNyZWF0ZUlmRG9lc05vdEV4
aXN0KTsKIApAQCAtMTI2LDEwICsxMzUsMTEgQEAgcHJpdmF0ZToKIAogICAgIGJvb2wgZGVsZXRl
RGF0YWJhc2VGaWxlKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBuYW1lKTsKIAorICAg
IC8vIFRoaXMgbG9jayBwcm90ZWN0cyBtX2RhdGFiYXNlLCBtX3F1b3RhTWFwLCBhbmQgbV9wcm9w
b3NlZERhdGFiYXNlcy4KKyAgICBNdXRleCBtX2RhdGFiYXNlR3VhcmQ7CiAgICAgU1FMaXRlRGF0
YWJhc2UgbV9kYXRhYmFzZTsKIAogICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8U2VjdXJpdHlP
cmlnaW4+LCB1bnNpZ25lZCBsb25nIGxvbmcsIFNlY3VyaXR5T3JpZ2luSGFzaD4gUXVvdGFNYXA7
Ci0gICAgTXV0ZXggbV9xdW90YU1hcEd1YXJkOwogICAgIG11dGFibGUgT3duUHRyPFF1b3RhTWFw
PiBtX3F1b3RhTWFwOwogCiAgICAgT3duUHRyPE9yaWdpblF1b3RhTWFuYWdlcj4gbV9xdW90YU1h
bmFnZXI7CkBAIC0xMzgsMTEgKzE0OCw4IEBAIHByaXZhdGU6CiAKICAgICBEYXRhYmFzZVRyYWNr
ZXJDbGllbnQqIG1fY2xpZW50OwogCi0gICAgc3RkOjpwYWlyPFNlY3VyaXR5T3JpZ2luKiwgRGF0
YWJhc2VEZXRhaWxzPiogbV9wcm9wb3NlZERhdGFiYXNlOwotCi0jaWZuZGVmIE5ERUJVRwotICAg
IFRocmVhZElkZW50aWZpZXIgbV90aHJlYWQ7Ci0jZW5kaWYKKyAgICB0eXBlZGVmIHN0ZDo6cGFp
cjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBEYXRhYmFzZURldGFpbHM+IFByb3Bvc2VkRGF0YWJh
c2U7CisgICAgSGFzaFNldDxQcm9wb3NlZERhdGFiYXNlKj4gbV9wcm9wb3NlZERhdGFiYXNlczsK
IAogICAgIHN0YXRpYyB2b2lkIHNjaGVkdWxlRm9yTm90aWZpY2F0aW9uKCk7CiAgICAgc3RhdGlj
IHZvaWQgbm90aWZ5RGF0YWJhc2VzQ2hhbmdlZCh2b2lkKik7CkluZGV4OiBXZWJDb3JlL3N0b3Jh
Z2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uv
T3JpZ2luUXVvdGFNYW5hZ2VyLmNwcAkocmV2aXNpb24gNTU4NDYpCisrKyBXZWJDb3JlL3N0b3Jh
Z2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsMTgg
QEAgT3JpZ2luUXVvdGFNYW5hZ2VyOjpPcmlnaW5RdW90YU1hbmFnZXIoKQogewogfQogCitib29s
IE9yaWdpblF1b3RhTWFuYWdlcjo6dHJ5TG9jaygpCit7CisgICAgYm9vbCBsb2NrZWQgPSBtX3Vz
YWdlUmVjb3JkR3VhcmQudHJ5TG9jaygpOworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAobG9ja2Vk
KQorICAgICAgICBtX3VzYWdlUmVjb3JkR3VhcmRMb2NrZWQgPSB0cnVlOworICAgIGVsc2UKKyAg
ICAgICAgQVNTRVJUKG1fdXNhZ2VSZWNvcmRHdWFyZExvY2tlZCk7CisjZW5kaWYKKyAgICByZXR1
cm4gbG9ja2VkOworfQorCiB2b2lkIE9yaWdpblF1b3RhTWFuYWdlcjo6bG9jaygpCiB7CiAgICAg
bV91c2FnZVJlY29yZEd1YXJkLmxvY2soKTsKQEAgLTYzLDcgKzc1LDcgQEAgdm9pZCBPcmlnaW5R
dW90YU1hbmFnZXI6OnRyYWNrT3JpZ2luKFBhcwogICAgIEFTU0VSVChtX3VzYWdlUmVjb3JkR3Vh
cmRMb2NrZWQpOwogICAgIEFTU0VSVCghbV91c2FnZU1hcC5jb250YWlucyhvcmlnaW4uZ2V0KCkp
KTsKIAotICAgIG1fdXNhZ2VNYXAuc2V0KG9yaWdpbiwgbmV3IE9yaWdpblVzYWdlUmVjb3JkKTsK
KyAgICBtX3VzYWdlTWFwLnNldChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIG5ldyBPcmlnaW5V
c2FnZVJlY29yZCk7CiB9CiAKIGJvb2wgT3JpZ2luUXVvdGFNYW5hZ2VyOjp0cmFja3NPcmlnaW4o
U2VjdXJpdHlPcmlnaW4qIG9yaWdpbikgY29uc3QKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9Pcmln
aW5RdW90YU1hbmFnZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVv
dGFNYW5hZ2VyLmgJKHJldmlzaW9uIDU1ODQ2KQorKysgV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1
b3RhTWFuYWdlci5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSw3IEBAIGNsYXNzIE9yaWdp
blF1b3RhTWFuYWdlciA6IHB1YmxpYyBOb25jb3AKIHB1YmxpYzoKICAgICBPcmlnaW5RdW90YU1h
bmFnZXIoKTsKIAorICAgIGJvb2wgdHJ5TG9jaygpOwogICAgIHZvaWQgbG9jaygpOwogICAgIHZv
aWQgdW5sb2NrKCk7CiAK
</data>
<flag name="review"
          id="33743"
          type_id="1"
          status="-"
          setter="dimich"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50968</attachid>
            <date>2010-03-17 16:18:24 -0700</date>
            <delta_ts>2010-03-19 11:51:59 -0700</delta_ts>
            <desc>Roll in more feedback, add protections against simultaneous create+delete of databases.</desc>
            <filename>tracker.patch</filename>
            <type>text/plain</type>
            <size>57639</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NjEzMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTEwIEBACisyMDEwLTAzLTE3ICBFcmljIFVocmhhbmUgIDxlcmljdUBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
UmVmYWN0b3IgRGF0YWJhc2VUcmFja2VyLmNwcCBmb3IgdGhyZWFkIHNhZmV0eQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5OTEKKworICAgICAgICBU
aGlzIGVuYWJsZXMgY2FsbGluZyBpbnRvIERhdGFiYXNlVHJhY2tlciBmcm9tIG11bHRpcGxlIGNv
bnRleHQgdGhyZWFkcywKKyAgICAgICAgYXMgd2lsbCBoYXBwZW4gb25jZSBXb3JrZXJzIGNhbiBh
Y2Nlc3MgdGhlIERhdGFiYXNlLiAgSXQgcmVxdWlyZWQgYSBmYWlyCisgICAgICAgIGFtb3VudCBv
ZiByZXNodWZmbGluZyBvZiBsb2Nrcy4gIEkgZW5kZWQgdXAgc3BsaXR0aW5nIHRoZSBwdWJsaWMK
KyAgICAgICAgaW50ZXJmYWNlIFtjYWxscyB0aGF0IHRha2UgbG9ja3MgYW5kIGNhbGwgcHJpdmF0
ZSBmdW5jdGlvbnNdIGZyb20gdGhlCisgICAgICAgIGltcGxlbWVudGF0aW9ucyBbY2FsbHMgdGhh
dCBhc3NlcnQgdGhhdCBsb2NrcyBhcmUgYWxyZWFkeSBoZWxkXSBpbiBvcmRlcgorICAgICAgICB0
byBhdm9pZCBsb2NrIGNvbmZsaWN0cy4gIEkgYWxzbyBoYWQgdG8gbWFrZSBzdXJlIHdlIHdlcmVu
J3Qgc2hhcmluZworICAgICAgICBTdHJpbmdzIG9yIFNlY3VyaXR5T3JpZ2lucyBhY3Jvc3MgdGhy
ZWFkcy4KKworICAgICAgICBObyBuZXcgdGVzdHMuCisKKyAgICAgICAgQWxsb3cgYWNjZXNzIHRv
IGRhdGFiYXNlIGhhbmRsZXMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIElGRiBTUUxpdGUgaXMgbmV3
IGVub3VnaCBhbmQgdGhlIHVzZXIgcmVxdWVzdHMgaXQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9z
cWwvU1FMaXRlRGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6
OlNRTGl0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpkaXNh
YmxlVGhyZWFkaW5nQ2hlY2tzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJh
c2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpzcWxpdGUzSGFuZGxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpkaXNhYmxlVGhyZWFkaW5nQ2hlY2tz
KToKKworICAgICAgICBSZW1vdmUgYW4gYXN5bmNocm9ub3VzIGNhbGwgZnJvbSBEYXRhYmFzZTo6
Y2xvc2UgYmFjayB0byB0aGUgZXhlY3V0aW9uIHRocmVhZCwgc28gdGhhdCBjbGVhbnVwIGNhbiBi
ZSBtb3JlIGRldGVybWluaXN0aWMuCisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjptYXJrQXNEZWxldGVkQW5kQ2xvc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OmNsb3NlKToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFi
YXNlLmg6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6KToKKyAgICAgICAgKiBzdG9yYWdl
L0RhdGFiYXNlRGV0YWlscy5oOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VEZXRhaWxzOjpE
YXRhYmFzZURldGFpbHMpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VEZXRhaWxzOjp0aHJl
YWQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUYXNrLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlQ2xvc2VUYXNrOjpkb1BlcmZvcm1UYXNrKToKKyAgICAgICAgKiBzdG9yYWdl
L0RhdGFiYXNlVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpk
YXRhYmFzZVRocmVhZCk6CisKKyAgICAgICAgQW55IFN0cmluZ3MgdGhhdCBnZXQgc3RvcmVkIGlu
IERhdGFiYXNlVHJhY2tlciwgYW5kIGFueSBTdHJpbmdzIHJldHVybmVkIGZyb20gRGF0YWJhc2VU
cmFja2VyLCBhcmUgbm93IHRocmVhZHNhZmVDb3BpZXMuCisgICAgICAgIFB1YmxpYyBmdW5jdGlv
bnMgbm93IHRha2UgYWxsIG5lZWRlZCBsb2NrcywgdGhlbiBnZW5lcmFsbHkgY2FsbCBvbmx5IHBy
aXZhdGUgZnVuY3Rpb25zIFt0aGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9uczogZGVsZXRpb24gZnVu
Y3Rpb25zIGFuZCBvcmlnaW5zKCldLgorICAgICAgICBQcml2YXRlIGZ1bmN0aW9ucyBubyBsb25n
ZXIgdGFrZSBsb2Nrcy4KKyAgICAgICAgbV9xdW90YU1hcEd1YXJkIGJlY29tZXMgbV9kYXRhYmFz
ZUd1YXJkLCBhbmQgbm93IHByb3RlY3RzIG1fZGF0YWJhc2UsIG1fcXVvdGFNYXAsIG1fcHJvcG9z
ZWREYXRhYmFzZXMsIG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLCBtX29yaWdpbnNCZWluZ0RlbGV0
ZWQsIG1fYmVpbmdDcmVhdGVkLCBhbmQgbV9iZWluZ0RlbGV0ZWQuCisgICAgICAgIG1fcHJvcG9z
ZWREYXRhYmFzZXMgcmVwbGFjZXMgbV9wcm9wb3NlZERhdGFiYXNlLCB0byBhY2NvdW50IGZvciBy
ZWVudHJhbmN5LgorCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKyAgICAg
ICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlck5vTG9jayk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlcik6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJhY2tlcik6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGlyZWN0b3J5UGF0aCk6CisgICAgICAgIChXZWJD
b3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlRGlyZWN0b3J5UGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXJEYXRhYmFzZVBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpvcGVuVHJhY2tlckRhdGFiYXNlKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0YWJsaXNoRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvck9yaWdpbk5vTG9jayk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yT3JpZ2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JEYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3JpZ2lucyk6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbnMpOgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbik6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRldGFpbHNGb3JOYW1lQW5kT3JpZ2lu
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JEYXRhYmFzZSk6
CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yT3JpZ2luTm9Mb2NrKToK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW4pOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpxdW90YUZvck9yaWdpbk5vTG9jayk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2V0UXVvdGEpOgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFiYXNlcyk6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZU9yaWdpbik6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRy
YWNrZXI6OmRlbGV0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRlRGF0YWJhc2VGaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tl
cjo6c2V0Q2xpZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2NoZWR1
bGVOb3RpZnlEYXRhYmFzZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFj
a2VyOjpub3RpZnlEYXRhYmFzZXNDaGFuZ2VkKToKKworICAgICAgICBUaGVzZSBmdW5jdGlvbnMg
a2VlcCB0cmFjayBvZiBpbi1wcm9ncmVzcyBkZWxldGlvbnMgYW5kIGNyZWF0aW9ucywgc28gdGhh
dCB3ZSBjYW4gbWFrZSBzdXJlIG5vYm9keSBldmVyeSBkZWxldGVzIGEgZGF0YWJhc2UgZmlsZSB3
aGlsZSBhIGxpdmUgZGF0YWJhc2UgaXMgdXNpbmcgaXQuCisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmNhbkNyZWF0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6cmVjb3JkQ3JlYXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmRvbmVDcmVhdGluZ0RhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6Y3JlYXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmRvbmVEZWxldGluZ0RhdGFiYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGVsZXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZU9yaWdpbik6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmRlbGV0aW5nT3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6RGF0
YWJhc2VUcmFja2VyOjpkb25lRGVsZXRpbmdPcmlnaW4pOgorCisgICAgICAgIEFueSBTZWN1cml0
eU9yaWdpbnMgc3RvcmVkIGluIE9yaWdpblF1b3RhTWFuYWdlciBhcmUgbm93IHRocmVhZHNhZmVD
b3BpZXMgb2YgaW5wdXRzLiAgVGhlcmUncyBhIG5ldyB0cnlMb2NrKCkgZnVuY3Rpb24gaW4gYWRk
aXRpb24gdG8gdGhlIGV4aXN0aW5nIGxvY2soKS4KKworICAgICAgICAqIHN0b3JhZ2UvT3JpZ2lu
UXVvdGFNYW5hZ2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok9yaWdpblF1b3RhTWFuYWdlcjo6
dHJ5TG9jayk6CisgICAgICAgIChXZWJDb3JlOjpPcmlnaW5RdW90YU1hbmFnZXI6OnRyYWNrT3Jp
Z2luKToKKyAgICAgICAgKiBzdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oOgorCiAyMDEwLTAz
LTE3ICBEbWl0cnkgVGl0b3YgIDxkaW1pY2hAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0
ZURhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVE
YXRhYmFzZS5jcHAJKHJldmlzaW9uIDU2MDcyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FM
aXRlRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCw3IEBAIFNRTGl0ZURh
dGFiYXNlOjpTUUxpdGVEYXRhYmFzZSgpCiAgICAgOiBtX2RiKDApCiAgICAgLCBtX3BhZ2VTaXpl
KC0xKQogICAgICwgbV90cmFuc2FjdGlvbkluUHJvZ3Jlc3MoZmFsc2UpCisgICAgLCBtX3NoYXJh
YmxlKGZhbHNlKQogICAgICwgbV9vcGVuaW5nVGhyZWFkKDApCiB7CiB9CkBAIC0yNTIsNiArMjUz
LDE4IEBAIGNvbnN0IGNoYXIqIFNRTGl0ZURhdGFiYXNlOjpsYXN0RXJyb3JNc2cKICAgICByZXR1
cm4gc3FsaXRlM19lcnJtc2cobV9kYik7CiB9CiAKKyNpZm5kZWYgTkRFQlVHCit2b2lkIFNRTGl0
ZURhdGFiYXNlOjpkaXNhYmxlVGhyZWFkaW5nQ2hlY2tzKCkKK3sKKyAgICAvLyBUaGlzIGRvZXNu
J3QgZ3VhcmFudGVlIHRoYXQgU1FMaXN0IHdhcyBjb21waWxlZCB3aXRoIC1EVEhSRUFEU0FGRSwg
b3IgdGhhdCB5b3UgaGF2ZW4ndCB0dXJuZWQgb2ZmIHRoZSBtdXRleGVzLgorI2lmIFNRTElURV9W
RVJTSU9OX05VTUJFUiA+PSAzMDAzMDAxCisgICAgbV9zaGFyYWJsZSA9IHRydWU7CisjZWxzZQor
ICAgIEFTU0VSVCgwKTsgLy8gWW91ciBTUUxpdGUgZG9lc24ndCBzdXBwb3J0IHNoYXJpbmcgaGFu
ZGxlcyBhY3Jvc3MgdGhyZWFkcy4KKyNlbmRpZgorfQorI2VuZGlmCisKIGludCBTUUxpdGVEYXRh
YmFzZTo6YXV0aG9yaXplckZ1bmN0aW9uKHZvaWQqIHVzZXJEYXRhLCBpbnQgYWN0aW9uQ29kZSwg
Y29uc3QgY2hhciogcGFyYW1ldGVyMSwgY29uc3QgY2hhciogcGFyYW1ldGVyMiwgY29uc3QgY2hh
ciogLypkYXRhYmFzZU5hbWUqLywgY29uc3QgY2hhciogLyp0cmlnZ2VyX29yX3ZpZXcqLykKIHsK
ICAgICBEYXRhYmFzZUF1dGhvcml6ZXIqIGF1dGggPSBzdGF0aWNfY2FzdDxEYXRhYmFzZUF1dGhv
cml6ZXIqPih1c2VyRGF0YSk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRh
YmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNl
LmgJKHJldmlzaW9uIDU2MDcyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJh
c2UuaAkod29ya2luZyBjb3B5KQpAQCAtOTcsNyArOTcsNyBAQCBwdWJsaWM6CiAgICAgY29uc3Qg
Y2hhciogbGFzdEVycm9yTXNnKCk7CiAgICAgCiAgICAgc3FsaXRlMyogc3FsaXRlM0hhbmRsZSgp
IGNvbnN0IHsKLSAgICAgICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX29wZW5pbmdUaHJl
YWQpOworICAgICAgICBBU1NFUlQobV9zaGFyYWJsZSB8fCBjdXJyZW50VGhyZWFkKCkgPT0gbV9v
cGVuaW5nVGhyZWFkKTsKICAgICAgICAgcmV0dXJuIG1fZGI7CiAgICAgfQogICAgIApAQCAtMTA4
LDYgKzEwOCwxNCBAQCBwdWJsaWM6CiAgICAgdm9pZCB1bmxvY2soKTsKICAgICBib29sIGlzQXV0
b0NvbW1pdE9uKCkgY29uc3Q7CiAKKyAgICAvLyBTZXQgdGhpcyBmbGFnIHRvIGFsbG93IGFjY2Vz
cyBmcm9tIG11bHRpcGxlIHRocmVhZHMuICBOb3QgYWxsIG11bHRpLXRocmVhZGVkIGFjY2Vzc2Vz
IGFyZSBzYWZlIQorICAgIC8vIFNlZSBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvY3ZzdHJhYy93aWtp
P3A9TXVsdGlUaHJlYWRpbmcgZm9yIG1vcmUgaW5mby4KKyNpZm5kZWYgTkRFQlVHCisgICAgdm9p
ZCBkaXNhYmxlVGhyZWFkaW5nQ2hlY2tzKCk7CisjZWxzZQorICAgIHZvaWQgZGlzYWJsZVRocmVh
ZGluZ0NoZWNrcygpIHt9CisjZW5kaWYKKwogcHJpdmF0ZToKICAgICBzdGF0aWMgaW50IGF1dGhv
cml6ZXJGdW5jdGlvbih2b2lkKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0
IGNoYXIqLCBjb25zdCBjaGFyKik7CiAKQEAgLTEyMCw2ICsxMjgsNyBAQCBwcml2YXRlOgogICAg
IGludCBtX3BhZ2VTaXplOwogICAgIAogICAgIGJvb2wgbV90cmFuc2FjdGlvbkluUHJvZ3Jlc3M7
CisgICAgYm9vbCBtX3NoYXJhYmxlOwogICAgIAogICAgIE11dGV4IG1fYXV0aG9yaXplckxvY2s7
CiAgICAgUmVmUHRyPERhdGFiYXNlQXV0aG9yaXplcj4gbV9hdXRob3JpemVyOwpJbmRleDogV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2UuY3BwCShyZXZpc2lvbiA1NjA3MikKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4OSw2ICszODksMTAgQEAgdm9pZCBEYXRhYmFzZTo6
bWFya0FzRGVsZXRlZEFuZENsb3NlKCkKIAogICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+
ZGF0YWJhc2VUaHJlYWQoKS0+c2NoZWR1bGVJbW1lZGlhdGVUYXNrKHRhc2sucmVsZWFzZSgpKTsK
ICAgICBzeW5jaHJvbml6ZXIud2FpdEZvclRhc2tDb21wbGV0aW9uKCk7CisKKyAgICAvLyBEYXRh
YmFzZUNsb3NlVGFzayB0ZWxscyBEYXRhYmFzZTo6Y2xvc2Ugbm90IHRvIGRvIHRoZXNlIHR3byBy
ZW1vdmFscyBzbyB0aGF0IHdlIGNhbiBkbyB0aGVtIGhlcmUgc3luY2hyb25vdXNseS4KKyAgICBt
X3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPnJlbW92ZU9wZW5EYXRhYmFzZSh0aGlzKTsKKyAgICBE
YXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKS5yZW1vdmVPcGVuRGF0YWJhc2UodGhpcyk7CiB9CiAK
IGNsYXNzIENvbnRleHRSZW1vdmVPcGVuRGF0YWJhc2VUYXNrIDogcHVibGljIFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQ6OlRhc2sgewpAQCAtNDE1LDcgKzQxOSw3IEBAIHByaXZhdGU6CiAgICAgUmVm
UHRyPERhdGFiYXNlPiBtX2RhdGFiYXNlOwogfTsKIAotdm9pZCBEYXRhYmFzZTo6Y2xvc2UoKQor
dm9pZCBEYXRhYmFzZTo6Y2xvc2UoQ2xvc2VQb2xpY3kgcG9saWN5KQogewogICAgIFJlZlB0cjxE
YXRhYmFzZT4gcHJvdGVjdCA9IHRoaXM7CiAKQEAgLTQ0NCw3ICs0NDgsOCBAQCB2b2lkIERhdGFi
YXNlOjpjbG9zZSgpCiAgICAgfQogCiAgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5kYXRh
YmFzZVRocmVhZCgpLT51bnNjaGVkdWxlRGF0YWJhc2VUYXNrcyh0aGlzKTsKLSAgICBtX3Njcmlw
dEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKENvbnRleHRSZW1vdmVPcGVuRGF0YWJhc2VUYXNr
OjpjcmVhdGUodGhpcykpOworICAgIGlmIChwb2xpY3kgPT0gUmVtb3ZlRGF0YWJhc2VGcm9tQ29u
dGV4dCkKKyAgICAgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5wb3N0VGFzayhDb250ZXh0
UmVtb3ZlT3BlbkRhdGFiYXNlVGFzazo6Y3JlYXRlKHRoaXMpKTsKIH0KIAogdm9pZCBEYXRhYmFz
ZTo6c3RvcCgpCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuaAkocmV2aXNpb24gNTYwNzIpCisrKyBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTA5LDcgKzEwOSw4IEBAIHB1
YmxpYzoKICAgICB2b2lkIG1hcmtBc0RlbGV0ZWRBbmRDbG9zZSgpOwogICAgIGJvb2wgZGVsZXRl
ZCgpIGNvbnN0IHsgcmV0dXJuIG1fZGVsZXRlZDsgfQogCi0gICAgdm9pZCBjbG9zZSgpOworICAg
IGVudW0gQ2xvc2VQb2xpY3kgeyBEb05vdFJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQsIFJlbW92
ZURhdGFiYXNlRnJvbUNvbnRleHQgfTsKKyAgICB2b2lkIGNsb3NlKENsb3NlUG9saWN5KTsKICAg
ICBib29sIG9wZW5lZCgpIGNvbnN0IHsgcmV0dXJuIG1fb3BlbmVkOyB9CiAKICAgICB2b2lkIHN0
b3AoKTsKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZURldGFpbHMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VEZXRhaWxzLmgJKHJldmlzaW9uIDU2MDcyKQor
KysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlRGV0YWlscy5oCSh3b3JraW5nIGNvcHkpCkBAIC00
MSw2ICs0MSw5IEBAIHB1YmxpYzoKICAgICAgICAgOiBtX2V4cGVjdGVkVXNhZ2UoMCkKICAgICAg
ICAgLCBtX2N1cnJlbnRVc2FnZSgwKQogICAgIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIG1f
dGhyZWFkID0gY3VycmVudFRocmVhZCgpOworI2VuZGlmCiAgICAgfQogCiAgICAgRGF0YWJhc2VE
ZXRhaWxzKGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlO
YW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgZXhwZWN0ZWRVc2FnZSwgdW5zaWduZWQgbG9uZyBsb25n
IGN1cnJlbnRVc2FnZSkKQEAgLTQ5LDE5ICs1MiwyNyBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9l
eHBlY3RlZFVzYWdlKGV4cGVjdGVkVXNhZ2UpCiAgICAgICAgICwgbV9jdXJyZW50VXNhZ2UoY3Vy
cmVudFVzYWdlKQogICAgIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIG1fdGhyZWFkID0gY3Vy
cmVudFRocmVhZCgpOworI2VuZGlmCiAgICAgfQogCiAgICAgY29uc3QgU3RyaW5nJiBuYW1lKCkg
Y29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CiAgICAgY29uc3QgU3RyaW5nJiBkaXNwbGF5TmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fZGlzcGxheU5hbWU7IH0KICAgICB1bnNpZ25lZCBsb25nIGxvbmcg
ZXhwZWN0ZWRVc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwZWN0ZWRVc2FnZTsgfQogICAgIHVu
c2lnbmVkIGxvbmcgbG9uZyBjdXJyZW50VXNhZ2UoKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnRV
c2FnZTsgfQorI2lmbmRlZiBOREVCVUcKKyAgICBUaHJlYWRJZGVudGlmaWVyIHRocmVhZCgpIGNv
bnN0IHsgcmV0dXJuIG1fdGhyZWFkOyB9CisjZW5kaWYKIAogcHJpdmF0ZToKICAgICBTdHJpbmcg
bV9uYW1lOwogICAgIFN0cmluZyBtX2Rpc3BsYXlOYW1lOwogICAgIHVuc2lnbmVkIGxvbmcgbG9u
ZyBtX2V4cGVjdGVkVXNhZ2U7CiAgICAgdW5zaWduZWQgbG9uZyBsb25nIG1fY3VycmVudFVzYWdl
OwotCisjaWZuZGVmIE5ERUJVRworICAgIFRocmVhZElkZW50aWZpZXIgbV90aHJlYWQ7CisjZW5k
aWYKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9E
YXRhYmFzZVRhc2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRh
c2suY3BwCShyZXZpc2lvbiA1NjA3MikKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRhc2su
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTcsNyArMTE3LDggQEAgRGF0YWJhc2VDbG9zZVRhc2s6
OkRhdGFiYXNlQ2xvc2VUYXNrKERhdAogCiB2b2lkIERhdGFiYXNlQ2xvc2VUYXNrOjpkb1BlcmZv
cm1UYXNrKCkKIHsKLSAgICBkYXRhYmFzZSgpLT5jbG9zZSgpOworICAgIC8vIFRlbGwgdGhlIGRh
dGFiYXNlIG5vdCB0byBjYWxsIGJhY2sgdG8gdGhlIGNvbnRleHQgdGhyZWFkOyB3ZSdsbCBoYW5k
bGUgaXQuCisgICAgZGF0YWJhc2UoKS0+Y2xvc2UoRGF0YWJhc2U6OkRvTm90UmVtb3ZlRGF0YWJh
c2VGcm9tQ29udGV4dCk7CiB9CiAKICNpZm5kZWYgTkRFQlVHCkluZGV4OiBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2VUaHJlYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRh
YmFzZVRocmVhZC5jcHAJKHJldmlzaW9uIDU2MDcyKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFi
YXNlVGhyZWFkLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTEzLDcgKzExMyw3IEBAIHZvaWQqIERh
dGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCgpCiAgICAgICAgIG9wZW5TZXRDb3B5LnN3YXAo
bV9vcGVuRGF0YWJhc2VTZXQpOwogICAgICAgICBEYXRhYmFzZVNldDo6aXRlcmF0b3IgZW5kID0g
b3BlblNldENvcHkuZW5kKCk7CiAgICAgICAgIGZvciAoRGF0YWJhc2VTZXQ6Oml0ZXJhdG9yIGl0
ID0gb3BlblNldENvcHkuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAoKml0
KS0+Y2xvc2UoKTsKKyAgICAgICAgICAgKCppdCktPmNsb3NlKERhdGFiYXNlOjpSZW1vdmVEYXRh
YmFzZUZyb21Db250ZXh0KTsKICAgICB9CiAKICAgICAvLyBEZXRhY2ggdGhlIHRocmVhZCBzbyBp
dHMgcmVzb3VyY2VzIGFyZSBubyBsb25nZXIgb2YgYW55IGNvbmNlcm4gdG8gYW55b25lIGVsc2UK
SW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuY3BwCShyZXZpc2lvbiA1NjA3MikKKysr
IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01
MSwxMyArNTEsMTkgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCi1PcmlnaW5RdW90YU1hbmFnZXImIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5h
Z2VyKCkKK09yaWdpblF1b3RhTWFuYWdlciYgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5RdW90YU1h
bmFnZXJOb0xvY2soKQogewotICAgIHBvcHVsYXRlT3JpZ2lucygpOwogICAgIEFTU0VSVChtX3F1
b3RhTWFuYWdlcik7CiAgICAgcmV0dXJuICptX3F1b3RhTWFuYWdlcjsKIH0KIAorT3JpZ2luUXVv
dGFNYW5hZ2VyJiBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlcigpCit7CisgICAg
TXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgcG9wdWxhdGVP
cmlnaW5zKCk7CisgICAgcmV0dXJuIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpOworfQorCiBE
YXRhYmFzZVRyYWNrZXImIERhdGFiYXNlVHJhY2tlcjo6dHJhY2tlcigpCiB7CiAgICAgREVGSU5F
X1NUQVRJQ19MT0NBTChEYXRhYmFzZVRyYWNrZXIsIHRyYWNrZXIsICgpKTsKQEAgLTY2LDM2ICs3
MiwzMCBAQCBEYXRhYmFzZVRyYWNrZXImIERhdGFiYXNlVHJhY2tlcjo6dHJhY2tlCiAKIERhdGFi
YXNlVHJhY2tlcjo6RGF0YWJhc2VUcmFja2VyKCkKICAgICA6IG1fY2xpZW50KDApCi0gICAgLCBt
X3Byb3Bvc2VkRGF0YWJhc2UoMCkKLSNpZm5kZWYgTkRFQlVHCi0gICAgLCBtX3RocmVhZChjdXJy
ZW50VGhyZWFkKCkpCi0jZW5kaWYKIHsKICAgICBTUUxpdGVGaWxlU3lzdGVtOjpyZWdpc3RlclNR
TGl0ZVZGUygpOwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEaXJlY3Rv
cnlQYXRoKGNvbnN0IFN0cmluZyYgcGF0aCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgp
ID09IG1fdGhyZWFkKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1
YXJkKTsKICAgICBBU1NFUlQoIW1fZGF0YWJhc2UuaXNPcGVuKCkpOwotICAgIG1fZGF0YWJhc2VE
aXJlY3RvcnlQYXRoID0gcGF0aDsKKyAgICBtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aCA9IHBhdGgu
dGhyZWFkc2FmZUNvcHkoKTsKIH0KIAotY29uc3QgU3RyaW5nJiBEYXRhYmFzZVRyYWNrZXI6OmRh
dGFiYXNlRGlyZWN0b3J5UGF0aCgpIGNvbnN0CitTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpkYXRh
YmFzZURpcmVjdG9yeVBhdGgoKSBjb25zdAogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkg
PT0gbV90aHJlYWQpOwotICAgIHJldHVybiBtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aDsKKyAgICBy
ZXR1cm4gbV9kYXRhYmFzZURpcmVjdG9yeVBhdGgudGhyZWFkc2FmZUNvcHkoKTsKIH0KIAogU3Ry
aW5nIERhdGFiYXNlVHJhY2tlcjo6dHJhY2tlckRhdGFiYXNlUGF0aCgpIGNvbnN0CiB7Ci0gICAg
QVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CiAgICAgcmV0dXJuIFNRTGl0ZUZp
bGVTeXN0ZW06OmFwcGVuZERhdGFiYXNlRmlsZU5hbWVUb1BhdGgobV9kYXRhYmFzZURpcmVjdG9y
eVBhdGgsICJEYXRhYmFzZXMuZGIiKTsKIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6Om9wZW5U
cmFja2VyRGF0YWJhc2UoYm9vbCBjcmVhdGVJZkRvZXNOb3RFeGlzdCkKIHsKLSAgICBBU1NFUlQo
Y3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFy
ZC50cnlMb2NrKCkpOwogCiAgICAgaWYgKG1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJl
dHVybjsKQEAgLTEwNiw2NyArMTA2LDk4IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpvcGVuVHJh
Y2tlckRhdGFiYXMKIAogICAgIGlmICghbV9kYXRhYmFzZS5vcGVuKGRhdGFiYXNlUGF0aCkpIHsK
ICAgICAgICAgLy8gRklYTUU6IFdoYXQgZG8gZG8gaGVyZT8KKyAgICAgICAgTE9HX0VSUk9SKCJG
YWlsZWQgdG8gb3BlbiBkYXRhYmFzZVBhdGggJXMuIiwgZGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0
YSgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBtX2RhdGFiYXNlLmRpc2FibGVUaHJl
YWRpbmdDaGVja3MoKTsKICAgICBpZiAoIW1fZGF0YWJhc2UudGFibGVFeGlzdHMoIk9yaWdpbnMi
KSkgewogICAgICAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBUQUJM
RSBPcmlnaW5zIChvcmlnaW4gVEVYVCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgcXVvdGEg
SU5URUdFUiBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKTsiKSkgewogICAgICAgICAgICAgLy8g
RklYTUU6IGFuZCBoZXJlCisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUg
T3JpZ2lucyB0YWJsZSIpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghbV9kYXRhYmFzZS50
YWJsZUV4aXN0cygiRGF0YWJhc2VzIikpIHsKICAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmV4ZWN1
dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgRGF0YWJhc2VzIChndWlkIElOVEVHRVIgUFJJTUFSWSBL
RVkgQVVUT0lOQ1JFTUVOVCwgb3JpZ2luIFRFWFQsIG5hbWUgVEVYVCwgZGlzcGxheU5hbWUgVEVY
VCwgZXN0aW1hdGVkU2l6ZSBJTlRFR0VSLCBwYXRoIFRFWFQpOyIpKSB7CiAgICAgICAgICAgICAv
LyBGSVhNRTogYW5kIGhlcmUKKyAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0
ZSBEYXRhYmFzZXMgdGFibGUiKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogYm9vbCBEYXRhYmFz
ZVRyYWNrZXI6OmNhbkVzdGFibGlzaERhdGFiYXNlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNv
bnRleHQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkaXNwbGF5TmFtZSwgdW5z
aWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkg
PT0gbV90aHJlYWQpOworICAgIFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4gPSBjb250ZXh0LT5zZWN1
cml0eU9yaWdpbigpOworICAgIFByb3Bvc2VkRGF0YWJhc2UgZGV0YWlsczsKIAotICAgIC8vIFBv
cHVsYXRlIHRoZSBvcmlnaW5zIGJlZm9yZSB3ZSBlc3RhYmxpc2ggYSBkYXRhYmFzZTsgdGhpcyBn
dWFyYW50ZWVzIHRoYXQgcXVvdGFGb3JPcmlnaW4KLSAgICAvLyBjYW4gcnVuIG9uIHRoZSBkYXRh
YmFzZSB0aHJlYWQgbGF0ZXIuCi0gICAgcG9wdWxhdGVPcmlnaW5zKCk7CisgICAgdW5zaWduZWQg
bG9uZyBsb25nIHJlcXVpcmVtZW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wVXNhZ2U7
CisgICAgeworICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBsb2NrZXIob3JpZ2lu
UXVvdGFNYW5hZ2VyKCkpOworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRh
YmFzZUd1YXJkKTsKIAotICAgIFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4gPSBjb250ZXh0LT5zZWN1
cml0eU9yaWdpbigpOworICAgICAgICBpZiAoIWNhbkNyZWF0ZURhdGFiYXNlKG9yaWdpbiwgbmFt
ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBTaW5jZSB3ZSdyZSBpbW1p
bmVudGx5IG9wZW5pbmcgYSBkYXRhYmFzZSB3aXRoaW4gdGhpcyBjb250ZXh0J3Mgb3JpZ2luLCBt
YWtlIHN1cmUgdGhpcyBvcmlnaW4gaXMgYmVpbmcgdHJhY2tlZCBieSB0aGUgUXVvdGFUcmFja2Vy
Ci0gICAgLy8gYnkgZmV0Y2hpbmcgaXQncyBjdXJyZW50IHVzYWdlIG5vdwotICAgIHVuc2lnbmVk
IGxvbmcgbG9uZyB1c2FnZSA9IHVzYWdlRm9yT3JpZ2luKG9yaWdpbik7CisgICAgICAgIHJlY29y
ZENyZWF0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKIAotICAgIC8vIElmIGEgZGF0YWJhc2Ug
YWxyZWFkeSBleGlzdHMsIGlnbm9yZSB0aGUgcGFzc2VkLWluIGVzdGltYXRlZCBzaXplIGFuZCBz
YXkgaXQncyBPSy4KLSAgICBpZiAoaGFzRW50cnlGb3JEYXRhYmFzZShvcmlnaW4sIG5hbWUpKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAKLSAgICAv
LyBJZiB0aGUgZGF0YWJhc2Ugd2lsbCBmaXQsIGFsbG93IGl0cyBjcmVhdGlvbi4KLSAgICB1bnNp
Z25lZCBsb25nIGxvbmcgcmVxdWlyZW1lbnQgPSB1c2FnZSArIG1heCgxVUwsIGVzdGltYXRlZFNp
emUpOwotICAgIGlmIChyZXF1aXJlbWVudCA8IHVzYWdlKQotICAgICAgICByZXR1cm4gZmFsc2U7
IC8vIElmIHRoZSBlc3RpbWF0ZWQgc2l6ZSBpcyBzbyBiaWcgaXQgY2F1c2VzIGFuIG92ZXJmbG93
LCBkb24ndCBhbGxvdyBjcmVhdGlvbi4KLSAgICBpZiAocmVxdWlyZW1lbnQgPD0gcXVvdGFGb3JP
cmlnaW4ob3JpZ2luKSkKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIFNpbmNlIHdl
J3JlIGltbWluZW50bHkgb3BlbmluZyBhIGRhdGFiYXNlIHdpdGhpbiB0aGlzIGNvbnRleHQncyBv
cmlnaW4sIG1ha2Ugc3VyZSB0aGlzIG9yaWdpbiBpcyBiZWluZyB0cmFja2VkIGJ5IHRoZSBRdW90
YVRyYWNrZXIKKyAgICAgICAgLy8gYnkgZmV0Y2hpbmcgaXRzIGN1cnJlbnQgdXNhZ2Ugbm93Lgor
ICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdXNhZ2UgPSB1c2FnZUZvck9yaWdpbk5vTG9jayhv
cmlnaW4pOworCisgICAgICAgIC8vIElmIGEgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMsIGlnbm9y
ZSB0aGUgcGFzc2VkLWluIGVzdGltYXRlZCBzaXplIGFuZCBzYXkgaXQncyBPSy4KKyAgICAgICAg
aWYgKGhhc0VudHJ5Rm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOwogCi0gICAgLy8gR2l2ZSB0aGUgY2hyb21lIGNsaWVudCBhIGNoYW5jZSB0byBpbmNy
ZWFzZSB0aGUgcXVvdGEuCi0gICAgLy8gVGVtcG9yYXJpbHkgbWFrZSB0aGUgZGV0YWlscyBvZiB0
aGUgcHJvcG9zZWQgZGF0YWJhc2UgYXZhaWxhYmxlLCBzbyB0aGUgY2xpZW50IGNhbiBnZXQgYXQg
dGhlbS4KLSAgICBwYWlyPFNlY3VyaXR5T3JpZ2luKiwgRGF0YWJhc2VEZXRhaWxzPiBkZXRhaWxz
KG9yaWdpbiwgRGF0YWJhc2VEZXRhaWxzKG5hbWUsIGRpc3BsYXlOYW1lLCBlc3RpbWF0ZWRTaXpl
LCAwKSk7Ci0gICAgbV9wcm9wb3NlZERhdGFiYXNlID0gJmRldGFpbHM7CisgICAgICAgIC8vIElm
IHRoZSBkYXRhYmFzZSB3aWxsIGZpdCwgYWxsb3cgaXRzIGNyZWF0aW9uLgorICAgICAgICByZXF1
aXJlbWVudCA9IHVzYWdlICsgbWF4KDFVTCwgZXN0aW1hdGVkU2l6ZSk7CisgICAgICAgIHRlbXBV
c2FnZSA9IHVzYWdlOworICAgICAgICBpZiAocmVxdWlyZW1lbnQgPCB1c2FnZSkgeworICAgICAg
ICAgICAgZG9uZUNyZWF0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsgLy8gSWYgdGhlIGVzdGltYXRlZCBzaXplIGlzIHNvIGJpZyBpdCBjYXVzZXMg
YW4gb3ZlcmZsb3csIGRvbid0IGFsbG93IGNyZWF0aW9uLgorICAgICAgICB9CisgICAgICAgIGlm
IChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbk5vTG9jayhvcmlnaW4pKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gR2l2ZSB0aGUgY2hyb21lIGNsaWVudCBhIGNo
YW5jZSB0byBpbmNyZWFzZSB0aGUgcXVvdGEuCisgICAgICAgIC8vIFRlbXBvcmFyaWx5IG1ha2Ug
dGhlIGRldGFpbHMgb2YgdGhlIHByb3Bvc2VkIGRhdGFiYXNlIGF2YWlsYWJsZSwgc28gdGhlIGNs
aWVudCBjYW4gZ2V0IGF0IHRoZW0uCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5
IGp1c3QgcGFzcyB0aGUgZGV0YWlscyBpbnRvIHRoaXMgY2FsbCwgcmF0aGVyIHRoYW4gdXNpbmcg
bV9wcm9wb3NlZERhdGFiYXNlcy4KKyAgICAgICAgZGV0YWlscyA9IFByb3Bvc2VkRGF0YWJhc2Uo
b3JpZ2luLT50aHJlYWRzYWZlQ29weSgpLCBEYXRhYmFzZURldGFpbHMobmFtZS50aHJlYWRzYWZl
Q29weSgpLCBkaXNwbGF5TmFtZS50aHJlYWRzYWZlQ29weSgpLCBlc3RpbWF0ZWRTaXplLCAwKSk7
CisgICAgICAgIG1fcHJvcG9zZWREYXRhYmFzZXMuYWRkKCZkZXRhaWxzKTsKKyAgICB9CisgICAg
Ly8gRHJvcCBhbGwgbG9ja3MgYmVmb3JlIGNhbGxpbmcgb3V0OyB3ZSBkb24ndCBrbm93IHdoYXQg
dGhleSdsbCBkby4KICAgICBjb250ZXh0LT5kYXRhYmFzZUV4Y2VlZGVkUXVvdGEobmFtZSk7Ci0g
ICAgbV9wcm9wb3NlZERhdGFiYXNlID0gMDsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxv
Y2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgICAgICBtX3Byb3Bvc2VkRGF0YWJhc2Vz
LnJlbW92ZSgmZGV0YWlscyk7CisgICAgfQogCiAgICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdpbGwg
Zml0IG5vdywgYWxsb3cgaXRzIGNyZWF0aW9uLgotICAgIHJldHVybiByZXF1aXJlbWVudCA8PSBx
dW90YUZvck9yaWdpbihvcmlnaW4pOworICAgIGlmIChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9y
aWdpbihvcmlnaW4pKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRvbmVDcmVhdGluZ0Rh
dGFiYXNlKG9yaWdpbiwgbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERhdGFi
YXNlVHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdp
bikKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VS
VChtX3F1b3RhTWFwKTsKKyAgICByZXR1cm4gbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKTsK
IH0KIAogYm9vbCBEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yT3JpZ2luKFNlY3VyaXR5T3Jp
Z2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7
CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAgICAgcG9w
dWxhdGVPcmlnaW5zKCk7Ci0gICAgTXV0ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBH
dWFyZCk7Ci0gICAgcmV0dXJuIG1fcXVvdGFNYXAtPmNvbnRhaW5zKG9yaWdpbik7CisgICAgcmV0
dXJuIGhhc0VudHJ5Rm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7CiB9CiAKIGJvb2wgRGF0YWJhc2VU
cmFja2VyOjpoYXNFbnRyeUZvckRhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0
IFN0cmluZyYgZGF0YWJhc2VJZGVudGlmaWVyKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFk
KCkgPT0gbV90aHJlYWQpOworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7
CiAgICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlz
T3BlbigpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xOTMsMTYgKzIyNCwxNyBAQCB1bnNp
Z25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpnZXRNCiAKIFN0cmluZyBEYXRhYmFzZVRy
YWNrZXI6Om9yaWdpblBhdGgoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikgY29uc3QKIHsKLSAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLSAgICByZXR1cm4gU1FMaXRlRmls
ZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5
UGF0aCwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CisgICAgcmV0dXJuIFNRTGl0ZUZp
bGVTeXN0ZW06OmFwcGVuZERhdGFiYXNlRmlsZU5hbWVUb1BhdGgobV9kYXRhYmFzZURpcmVjdG9y
eVBhdGgudGhyZWFkc2FmZUNvcHkoKSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiB9
CiAKLVN0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2UoU2VjdXJpdHlP
cmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sIGNyZWF0ZUlmTm90RXhpc3Rz
KQorU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayhTZWN1
cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RF
eGlzdHMpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAg
QVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQoIW9yaWdpblF1
b3RhTWFuYWdlck5vTG9jaygpLnRyeUxvY2soKSk7CiAKLSAgICBpZiAobV9wcm9wb3NlZERhdGFi
YXNlICYmIG1fcHJvcG9zZWREYXRhYmFzZS0+Zmlyc3QgPT0gb3JpZ2luICYmIG1fcHJvcG9zZWRE
YXRhYmFzZS0+c2Vjb25kLm5hbWUoKSA9PSBuYW1lKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CisgICAgZm9yIChIYXNoU2V0PFByb3Bvc2VkRGF0YWJhc2UqPjo6aXRlcmF0b3IgaXRlciA9IG1f
cHJvcG9zZWREYXRhYmFzZXMuYmVnaW4oKTsgaXRlciAhPSBtX3Byb3Bvc2VkRGF0YWJhc2VzLmVu
ZCgpOyArK2l0ZXIpCisgICAgICAgIGlmICgoKml0ZXIpLT5maXJzdCA9PSBvcmlnaW4gJiYgKCpp
dGVyKS0+c2Vjb25kLm5hbWUoKSA9PSBuYW1lKQorICAgICAgICAgICAgcmV0dXJuIFN0cmluZygp
OwogCiAgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXIgPSBvcmlnaW4tPmRhdGFiYXNlSWRlbnRp
ZmllcigpOwogICAgIFN0cmluZyBvcmlnaW5QYXRoID0gdGhpcy0+b3JpZ2luUGF0aChvcmlnaW4p
OwpAQCAtMjEyLDcgKzI0NCw2IEBAIFN0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9y
RGF0YWIKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwogCiAgICAgLy8gU2VlIGlmIHdlIGhhdmUg
YSBwYXRoIGZvciB0aGlzIGRhdGFiYXNlIHlldAotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFs
c2UpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuIFN0cmlu
ZygpOwogICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBw
YXRoIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT87Iik7CkBAIC0yMzEs
MzYgKzI2Miw0MiBAQCBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiCiAg
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKIAogICAgIGlmIChyZXN1bHQgIT0gU1FMUmVzdWx0RG9u
ZSkgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byByZXRyaWV2ZSBmaWxlbmFtZSBmcm9t
IERhdGFiYXNlIFRyYWNrZXIgZm9yIG9yaWdpbiAlcywgbmFtZSAlcyIsIG9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCksIG5hbWUuYXNjaWkoKS5kYXRhKCkpOworICAg
ICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byByZXRyaWV2ZSBmaWxlbmFtZSBmcm9tIERhdGFiYXNl
IFRyYWNrZXIgZm9yIG9yaWdpbiAlcywgbmFtZSAlcyIsIG9yaWdpbklkZW50aWZpZXIuYXNjaWko
KS5kYXRhKCksIG5hbWUuYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CiAgICAgfQogICAgIHN0YXRlbWVudC5maW5hbGl6ZSgpOwogCi0gICAgU3RyaW5nIGZpbGVOYW1l
ID0gU1FMaXRlRmlsZVN5c3RlbTo6Z2V0RmlsZU5hbWVGb3JOZXdEYXRhYmFzZShvcmlnaW5QYXRo
LCBuYW1lLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLCAmbV9kYXRhYmFzZSk7CisgICAg
U3RyaW5nIGZpbGVOYW1lID0gU1FMaXRlRmlsZVN5c3RlbTo6Z2V0RmlsZU5hbWVGb3JOZXdEYXRh
YmFzZShvcmlnaW5QYXRoLCBuYW1lLCBvcmlnaW5JZGVudGlmaWVyLCAmbV9kYXRhYmFzZSk7CiAg
ICAgaWYgKCFhZGREYXRhYmFzZShvcmlnaW4sIG5hbWUsIGZpbGVOYW1lKSkKICAgICAgICAgcmV0
dXJuIFN0cmluZygpOwogCiAgICAgLy8gSWYgdGhpcyBvcmlnaW4ncyBxdW90YSBpcyBiZWluZyB0
cmFja2VkIChvcGVuIGhhbmRsZSB0byBhIGRhdGFiYXNlIGluIHRoaXMgb3JpZ2luKSwgYWRkIHRo
aXMgbmV3IGRhdGFiYXNlCiAgICAgLy8gdG8gdGhlIHF1b3RhIG1hbmFnZXIgbm93CiAgICAgU3Ry
aW5nIGZ1bGxGaWxlUGF0aCA9IFNRTGl0ZUZpbGVTeXN0ZW06OmFwcGVuZERhdGFiYXNlRmlsZU5h
bWVUb1BhdGgob3JpZ2luUGF0aCwgZmlsZU5hbWUpOwotICAgIHsKLSAgICAgICAgTG9ja2VyPE9y
aWdpblF1b3RhTWFuYWdlcj4gbG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKLSAgICAgICAg
aWYgKG9yaWdpblF1b3RhTWFuYWdlcigpLnRyYWNrc09yaWdpbihvcmlnaW4pKQotICAgICAgICAg
ICAgb3JpZ2luUXVvdGFNYW5hZ2VyKCkuYWRkRGF0YWJhc2Uob3JpZ2luLCBuYW1lLCBmdWxsRmls
ZVBhdGgpOwotICAgIH0KKyAgICBpZiAob3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkudHJhY2tz
T3JpZ2luKG9yaWdpbikpCisgICAgICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmFkZERh
dGFiYXNlKG9yaWdpbiwgbmFtZSwgZnVsbEZpbGVQYXRoKTsKIAogICAgIHJldHVybiBmdWxsRmls
ZVBhdGg7CiB9CiAKK1N0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2Uo
U2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sIGNyZWF0ZUlm
Tm90RXhpc3RzKQoreworICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IGxvY2tlcihvcmln
aW5RdW90YU1hbmFnZXIoKSk7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJh
c2VHdWFyZCk7CisgICAgcG9wdWxhdGVPcmlnaW5zKCk7CisKKyAgICByZXR1cm4gZnVsbFBhdGhG
b3JEYXRhYmFzZU5vTG9jayhvcmlnaW4sIG5hbWUsIGNyZWF0ZUlmTm90RXhpc3RzKS50aHJlYWRz
YWZlQ29weSgpOworfQorCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKCkK
IHsKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOwogICAgIGlmIChtX3F1
b3RhTWFwKQogICAgICAgICByZXR1cm47CiAKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09
IG1fdGhyZWFkKTsKLQogICAgIG1fcXVvdGFNYXAuc2V0KG5ldyBRdW90YU1hcCk7Ci0gICAgbV9x
dW90YU1hbmFnZXIuc2V0KG5ldyBPcmlnaW5RdW90YU1hbmFnZXIpOworICAgIGlmICghbV9xdW90
YU1hbmFnZXIpCisgICAgICAgIG1fcXVvdGFNYW5hZ2VyLnNldChuZXcgT3JpZ2luUXVvdGFNYW5h
Z2VyKTsKIAogICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwogICAgIGlmICghbV9kYXRh
YmFzZS5pc09wZW4oKSkKQEAgLTI2OCwzMCArMzA1LDMyIEBAIHZvaWQgRGF0YWJhc2VUcmFja2Vy
Ojpwb3B1bGF0ZU9yaWdpbnMoKQogCiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2Rh
dGFiYXNlLCAiU0VMRUNUIG9yaWdpbiwgcXVvdGEgRlJPTSBPcmlnaW5zIik7CiAKLSAgICBpZiAo
c3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKKyAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBw
cmVwYXJlIHN0YXRlbWVudC4iKTsKICAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIGludCBy
ZXN1bHQ7CiAgICAgd2hpbGUgKChyZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpKSA9PSBTUUxSZXN1
bHRSb3cpIHsKICAgICAgICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW4gPSBTZWN1cml0
eU9yaWdpbjo6Y3JlYXRlRnJvbURhdGFiYXNlSWRlbnRpZmllcihzdGF0ZW1lbnQuZ2V0Q29sdW1u
VGV4dCgwKSk7Ci0gICAgICAgIG1fcXVvdGFNYXAtPnNldChvcmlnaW4uZ2V0KCksIHN0YXRlbWVu
dC5nZXRDb2x1bW5JbnQ2NCgxKSk7CisgICAgICAgIG1fcXVvdGFNYXAtPnNldChvcmlnaW4uZ2V0
KCktPnRocmVhZHNhZmVDb3B5KCksIHN0YXRlbWVudC5nZXRDb2x1bW5JbnQ2NCgxKSk7CiAgICAg
fQogCiAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHREb25lKQotICAgICAgICBMT0dfRVJST1Io
IkZhaWxlZCB0byByZWFkIGluIGFsbCBvcmlnaW5zIGZyb20gdGhlIGRhdGFiYXNlIik7CisgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgaW4gYWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0
YWJhc2UuIik7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5zKFZlY3RvcjxSZWZQ
dHI8U2VjdXJpdHlPcmlnaW4+ID4mIHJlc3VsdCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVh
ZCgpID09IG1fdGhyZWFkKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFz
ZUd1YXJkKTsKICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKLSAgICBNdXRleExvY2tlciBsb2NrUXVv
dGFNYXAobV9xdW90YU1hcEd1YXJkKTsKKyAgICBBU1NFUlQobV9xdW90YU1hcCk7CiAgICAgY29w
eUtleXNUb1ZlY3RvcigqbV9xdW90YU1hcCwgcmVzdWx0KTsKIH0KIAotYm9vbCBEYXRhYmFzZVRy
YWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVj
dG9yPFN0cmluZz4mIHJlc3VsdFZlY3RvcikKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFz
ZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIFZlY3RvcjxTdHJp
bmc+JiByZXN1bHRWZWN0b3IpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3Ro
cmVhZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKICAgICBvcGVu
VHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMxNSw0NCArMzU0LDY1IEBAIGJvb2wgRGF0YWJhc2VU
cmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3IKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotRGF0YWJh
c2VEZXRhaWxzIERhdGFiYXNlVHJhY2tlcjo6ZGV0YWlsc0Zvck5hbWVBbmRPcmlnaW4oY29uc3Qg
U3RyaW5nJiBuYW1lLCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKQorYm9vbCBEYXRhYmFzZVRyYWNr
ZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9y
PFN0cmluZz4mIHJlc3VsdFZlY3RvcikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09
IG1fdGhyZWFkKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJk
KTsKKyAgICBWZWN0b3I8U3RyaW5nPiB0ZW1wOworICAgIGlmICghZGF0YWJhc2VOYW1lc0Zvck9y
aWdpbk5vTG9jayhvcmlnaW4sIHRlbXApKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBp
ZiAobV9wcm9wb3NlZERhdGFiYXNlICYmIG1fcHJvcG9zZWREYXRhYmFzZS0+Zmlyc3QgPT0gb3Jp
Z2luICYmIG1fcHJvcG9zZWREYXRhYmFzZS0+c2Vjb25kLm5hbWUoKSA9PSBuYW1lKQotICAgICAg
ICByZXR1cm4gbV9wcm9wb3NlZERhdGFiYXNlLT5zZWNvbmQ7CisgICAgZm9yIChWZWN0b3I8U3Ry
aW5nPjo6aXRlcmF0b3IgaXRlciA9IHRlbXAuYmVnaW4oKTsgaXRlciAhPSB0ZW1wLmVuZCgpOyAr
K2l0ZXIpCisgICAgICAgIHJlc3VsdFZlY3Rvci5hcHBlbmQoaXRlci0+dGhyZWFkc2FmZUNvcHko
KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CiAKK0RhdGFiYXNlRGV0YWlscyBEYXRhYmFzZVRyYWNr
ZXI6OmRldGFpbHNGb3JOYW1lQW5kT3JpZ2luKGNvbnN0IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlP
cmlnaW4qIG9yaWdpbikKK3sKICAgICBTdHJpbmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdpbi0+
ZGF0YWJhc2VJZGVudGlmaWVyKCk7CisgICAgU3RyaW5nIGRpc3BsYXlOYW1lOworICAgIGludDY0
X3QgZXhwZWN0ZWRVc2FnZTsKIAotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwotICAg
IGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWls
cygpOwotICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBk
aXNwbGF5TmFtZSwgZXN0aW1hdGVkU2l6ZSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyBB
TkQgbmFtZT0/Iik7Ci0gICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2sp
Ci0gICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKLQotICAgIHN0YXRlbWVudC5iaW5k
VGV4dCgxLCBvcmlnaW5JZGVudGlmaWVyKTsKLSAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgbmFt
ZSk7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1
YXJkKTsKIAotICAgIGludCByZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpOwotICAgIGlmIChyZXN1
bHQgPT0gU1FMUmVzdWx0RG9uZSkKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOwor
ICAgICAgICBmb3IgKEhhc2hTZXQ8UHJvcG9zZWREYXRhYmFzZSo+OjppdGVyYXRvciBpdGVyID0g
bV9wcm9wb3NlZERhdGFiYXNlcy5iZWdpbigpOyBpdGVyICE9IG1fcHJvcG9zZWREYXRhYmFzZXMu
ZW5kKCk7ICsraXRlcikKKyAgICAgICAgICAgIGlmICgoKml0ZXIpLT5maXJzdCA9PSBvcmlnaW4g
JiYgKCppdGVyKS0+c2Vjb25kLm5hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgQVNT
RVJUKCgqaXRlciktPnNlY29uZC50aHJlYWQoKSA9PSBjdXJyZW50VGhyZWFkKCkpOworICAgICAg
ICAgICAgICAgIHJldHVybiAoKml0ZXIpLT5zZWNvbmQ7CisgICAgICAgICAgICB9CiAKLSAgICBp
ZiAocmVzdWx0ICE9IFNRTFJlc3VsdFJvdykgewotICAgICAgICBMT0dfRVJST1IoIkVycm9yIHJl
dHJpZXZpbmcgZGV0YWlscyBmb3IgZGF0YWJhc2UgJXMgaW4gb3JpZ2luICVzIGZyb20gdHJhY2tl
ciBkYXRhYmFzZSIsIG5hbWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbklkZW50aWZpZXIuYXNjaWko
KS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7CisgICAgICAgIG9w
ZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOworICAgICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVu
KCkpCisgICAgICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7CisgICAgICAgIFNRTGl0
ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBkaXNwbGF5TmFtZSwgZXN0
aW1hdGVkU2l6ZSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49PyBBTkQgbmFtZT0/Iik7Cisg
ICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQorICAgICAgICAg
ICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworCisgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4
dCgxLCBvcmlnaW5JZGVudGlmaWVyKTsKKyAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDIsIG5h
bWUpOworCisgICAgICAgIGludCByZXN1bHQgPSBzdGF0ZW1lbnQuc3RlcCgpOworICAgICAgICBp
ZiAocmVzdWx0ID09IFNRTFJlc3VsdERvbmUpCisgICAgICAgICAgICByZXR1cm4gRGF0YWJhc2VE
ZXRhaWxzKCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHRSb3cpIHsKKyAgICAg
ICAgICAgIExPR19FUlJPUigiRXJyb3IgcmV0cmlldmluZyBkZXRhaWxzIGZvciBkYXRhYmFzZSAl
cyBpbiBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIGRhdGFiYXNlIiwgbmFtZS5hc2NpaSgpLmRhdGEo
KSwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm4g
RGF0YWJhc2VEZXRhaWxzKCk7CisgICAgICAgIH0KKyAgICAgICAgZGlzcGxheU5hbWUgPSBzdGF0
ZW1lbnQuZ2V0Q29sdW1uVGV4dCgwKTsKKyAgICAgICAgZXhwZWN0ZWRVc2FnZSA9IHN0YXRlbWVu
dC5nZXRDb2x1bW5JbnQ2NCgxKTsKICAgICB9CiAKLSAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxz
KG5hbWUsIHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApLCBzdGF0ZW1lbnQuZ2V0Q29sdW1uSW50
NjQoMSksIHVzYWdlRm9yRGF0YWJhc2UobmFtZSwgb3JpZ2luKSk7CisgICAgcmV0dXJuIERhdGFi
YXNlRGV0YWlscyhuYW1lLCBkaXNwbGF5TmFtZSwgZXhwZWN0ZWRVc2FnZSwgdXNhZ2VGb3JEYXRh
YmFzZShuYW1lLCBvcmlnaW4pKTsKIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnNldERhdGFi
YXNlRGV0YWlscyhTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6ZSkKIHsK
LSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQogICAgIFN0cmluZyBv
cmlnaW5JZGVudGlmaWVyID0gb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKTsKICAgICBpbnQ2
NF90IGd1aWQgPSAwOwogCisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VH
dWFyZCk7CisKICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKHRydWUpOwogICAgIGlmICghbV9kYXRh
YmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuOwpAQCAtNDAwLDcgKzQ2MCw2IEBAIHZvaWQg
RGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMKIAogdW5zaWduZWQgbG9uZyBsb25n
IERhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JEYXRhYmFzZShjb25zdCBTdHJpbmcmIG5hbWUsIFNl
Y3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBt
X3RocmVhZCk7CiAgICAgU3RyaW5nIHBhdGggPSBmdWxsUGF0aEZvckRhdGFiYXNlKG9yaWdpbiwg
bmFtZSwgZmFsc2UpOwogICAgIGlmIChwYXRoLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIDA7
CkBAIC00MjIsMTggKzQ4MSwyMSBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFi
YXNlKERhCiAgICAgRGF0YWJhc2VOYW1lTWFwKiBuYW1lTWFwID0gbV9vcGVuRGF0YWJhc2VNYXAt
PmdldChkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSk7CiAgICAgaWYgKCFuYW1lTWFwKSB7CiAg
ICAgICAgIG5hbWVNYXAgPSBuZXcgRGF0YWJhc2VOYW1lTWFwOwotICAgICAgICBtX29wZW5EYXRh
YmFzZU1hcC0+c2V0KGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigpLCBuYW1lTWFwKTsKKyAgICAg
ICAgbV9vcGVuRGF0YWJhc2VNYXAtPnNldChkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKS0+dGhy
ZWFkc2FmZUNvcHkoKSwgbmFtZU1hcCk7CiAgICAgfQogCiAgICAgRGF0YWJhc2VTZXQqIGRhdGFi
YXNlU2V0ID0gbmFtZU1hcC0+Z2V0KG5hbWUpOwogICAgIGlmICghZGF0YWJhc2VTZXQpIHsKICAg
ICAgICAgZGF0YWJhc2VTZXQgPSBuZXcgRGF0YWJhc2VTZXQ7Ci0gICAgICAgIG5hbWVNYXAtPnNl
dChuYW1lLCBkYXRhYmFzZVNldCk7CisgICAgICAgIG5hbWVNYXAtPnNldChuYW1lLnRocmVhZHNh
ZmVDb3B5KCksIGRhdGFiYXNlU2V0KTsKICAgICB9CiAKICAgICBkYXRhYmFzZVNldC0+YWRkKGRh
dGFiYXNlKTsKIAogICAgIExPRyhTdG9yYWdlQVBJLCAiQWRkZWQgb3BlbiBEYXRhYmFzZSAlcyAo
JXApXG4iLCBkYXRhYmFzZS0+c3RyaW5nSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpLCBkYXRh
YmFzZSk7CisKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsK
KyAgICBkb25lQ3JlYXRpbmdEYXRhYmFzZShkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSwgZGF0
YWJhc2UtPnN0cmluZ0lkZW50aWZpZXIoKSk7CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpy
ZW1vdmVPcGVuRGF0YWJhc2UoRGF0YWJhc2UqIGRhdGFiYXNlKQpAQCAtNDQxLDYgKzUwMyw4IEBA
IHZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UKICAgICBpZiAoIWRhdGFi
YXNlKQogICAgICAgICByZXR1cm47CiAKKyAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBx
dW90YU1hbmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgIE11dGV4TG9ja2Vy
IGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogICAgIE11dGV4TG9ja2VyIG9wZW5EYXRh
YmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CiAKICAgICBpZiAoIW1fb3BlbkRh
dGFiYXNlTWFwKSB7CkBAIC00NzYsNiArNTQwLDcgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnJl
bW92ZU9wZW5EYXRhYmFzZQogCiAgICAgbV9vcGVuRGF0YWJhc2VNYXAtPnJlbW92ZShkYXRhYmFz
ZS0+c2VjdXJpdHlPcmlnaW4oKSk7CiAgICAgZGVsZXRlIG5hbWVNYXA7CisgICAgb3JpZ2luUXVv
dGFNYW5hZ2VyTm9Mb2NrKCkucmVtb3ZlT3JpZ2luKGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigp
KTsKIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmdldE9wZW5EYXRhYmFzZXMoU2VjdXJpdHlP
cmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBIYXNoU2V0PFJlZlB0cjxEYXRhYmFz
ZT4gPiogZGF0YWJhc2VzKQpAQCAtNDk2LDkyICs1NjEsMTAzIEBAIHZvaWQgRGF0YWJhc2VUcmFj
a2VyOjpnZXRPcGVuRGF0YWJhc2VzKFMKICAgICAgICAgZGF0YWJhc2VzLT5hZGQoKml0KTsKIH0K
IAotdW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW4oU2Vj
dXJpdHlPcmlnaW4qIG9yaWdpbikKK3Vuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6
OnVzYWdlRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNT
RVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgTG9ja2VyPE9yaWdpblF1b3Rh
TWFuYWdlcj4gbG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICBBU1NFUlQoIW9yaWdp
blF1b3RhTWFuYWdlck5vTG9jaygpLnRyeUxvY2soKSk7CiAKICAgICAvLyBVc2UgdGhlIE9yaWdp
blF1b3RhTWFuYWdlciBtZWNoYW5pc20gdG8gY2FsY3VsYXRlIHRoZSB1c2FnZQotICAgIGlmIChv
cmlnaW5RdW90YU1hbmFnZXIoKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKLSAgICAgICAgcmV0dXJu
IG9yaWdpblF1b3RhTWFuYWdlcigpLmRpc2tVc2FnZShvcmlnaW4pOworICAgIGlmIChvcmlnaW5R
dW90YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKKyAgICAgICAgcmV0dXJu
IG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmRpc2tVc2FnZShvcmlnaW4pOwogCiAgICAgLy8g
SWYgdGhlIE9yaWdpblF1b3RhTWFuYWdlciBkb2Vzbid0IHRyYWNrIHRoaXMgb3JpZ2luIGFscmVh
ZHksIHByaW1lIGl0IHRvIGRvIHNvCi0gICAgb3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tPcmln
aW4ob3JpZ2luKTsKKyAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja09yaWdpbihv
cmlnaW4pOwogCiAgICAgVmVjdG9yPFN0cmluZz4gbmFtZXM7Ci0gICAgZGF0YWJhc2VOYW1lc0Zv
ck9yaWdpbihvcmlnaW4sIG5hbWVzKTsKKyAgICBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2Nr
KG9yaWdpbiwgbmFtZXMpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5hbWVzLnNp
emUoKTsgKytpKQotICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS5hZGREYXRhYmFzZShvcmln
aW4sIG5hbWVzW2ldLCBmdWxsUGF0aEZvckRhdGFiYXNlKG9yaWdpbiwgbmFtZXNbaV0sIGZhbHNl
KSk7CisgICAgICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmFkZERhdGFiYXNlKG9yaWdp
biwgbmFtZXNbaV0sIGZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2sob3JpZ2luLCBuYW1lc1tpXSwg
ZmFsc2UpKTsKIAotICAgIGlmICghb3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJhY2tzT3JpZ2luKG9y
aWdpbikpCisgICAgaWYgKCFvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmlnaW4o
b3JpZ2luKSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIG9yaWdpblF1b3RhTWFuYWdl
cigpLmRpc2tVc2FnZShvcmlnaW4pOworICAgIHJldHVybiBvcmlnaW5RdW90YU1hbmFnZXJOb0xv
Y2soKS5kaXNrVXNhZ2Uob3JpZ2luKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNl
VHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKK3sKKyAgICBM
b2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwor
CisgICAgcmV0dXJuIHVzYWdlRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7Cit9CisKK3Vuc2lnbmVk
IGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5
T3JpZ2luKiBvcmlnaW4pCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygp
KTsKKyAgICBBU1NFUlQobV9xdW90YU1hcCk7CisgICAgcmV0dXJuIG1fcXVvdGFNYXAtPmdldChv
cmlnaW4pOwogfQogCiB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpxdW90YUZv
ck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFTU0VSVChjdXJyZW50VGhy
ZWFkKCkgPT0gbV90aHJlYWQgfHwgbV9xdW90YU1hcCk7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0Rh
dGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAgICAgcG9wdWxhdGVPcmlnaW5zKCk7Ci0gICAgTXV0
ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFyZCk7Ci0gICAgcmV0dXJuIG1fcXVv
dGFNYXAtPmdldChvcmlnaW4pOworICAgIHJldHVybiBxdW90YUZvck9yaWdpbk5vTG9jayhvcmln
aW4pOwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0UXVvdGEoU2VjdXJpdHlPcmlnaW4q
IG9yaWdpbiwgdW5zaWduZWQgbG9uZyBsb25nIHF1b3RhKQogewotICAgIEFTU0VSVChjdXJyZW50
VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotICAgIGlmIChxdW90YUZvck9yaWdpbihvcmlnaW4pID09
IHF1b3RhKQorICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwor
CisgICAgcG9wdWxhdGVPcmlnaW5zKCk7CisgICAgaWYgKHF1b3RhRm9yT3JpZ2luTm9Mb2NrKG9y
aWdpbikgPT0gcXVvdGEpCiAgICAgICAgIHJldHVybjsKIAogICAgIG9wZW5UcmFja2VyRGF0YWJh
c2UodHJ1ZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm47
CiAKLSAgICB7Ci0gICAgICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3RhTWFwR3Vh
cmQpOwotCi0gICAgICAgIGlmICghbV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKSkgewotICAg
ICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElO
VE8gT3JpZ2lucyBWQUxVRVMgKD8sID8pIik7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewotICAgICAgICAgICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIGVzdGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVu
dGlmaWVyKCkpOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMiwgcXVvdGEp
OwotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5zdGVwKCkgIT0gU1FMUmVzdWx0RG9u
ZSkKLSAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9y
aWdpbiAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNj
aWkoKS5kYXRhKCkpOwotICAgICAgICAgICAgfQorICAgIGlmICghbV9xdW90YU1hcC0+Y29udGFp
bnMob3JpZ2luKSkgeworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJh
c2UsICJJTlNFUlQgSU5UTyBPcmlnaW5zIFZBTFVFUyAoPywgPykiKTsKKyAgICAgICAgaWYgKHN0
YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiVW5hYmxlIHRvIGVzdGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4t
PmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlVQREFU
RSBPcmlnaW5zIFNFVCBxdW90YT0/IFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgICAgICAgICBib29s
IGVycm9yID0gc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPazsKLSAgICAgICAgICAg
IGlmICghZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZEludDY0KDEsIHF1
b3RhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgb3JpZ2luLT5kYXRh
YmFzZUlkZW50aWZpZXIoKSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3Jp
Z2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZElu
dDY0KDIsIHF1b3RhKTsKIAotICAgICAgICAgICAgICAgIGVycm9yID0gIXN0YXRlbWVudC5leGVj
dXRlQ29tbWFuZCgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5z
dGVwKCkgIT0gU1FMUmVzdWx0RG9uZSkKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJs
ZSB0byBlc3RhYmxpc2ggb3JpZ2luICVzIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFz
ZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2Ugewor
ICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJVUERBVEUgT3Jp
Z2lucyBTRVQgcXVvdGE9PyBXSEVSRSBvcmlnaW49PyIpOworICAgICAgICBib29sIGVycm9yID0g
c3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPazsKKyAgICAgICAgaWYgKCFlcnJvcikg
eworICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgxLCBxdW90YSk7CisgICAgICAgICAg
ICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CiAK
LSAgICAgICAgICAgIGlmIChlcnJvcikKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxl
ZCB0byBzZXQgcXVvdGEgJWxsdSBpbiB0cmFja2VyIGRhdGFiYXNlIGZvciBvcmlnaW4gJXMiLCBx
dW90YSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAg
ICAgICAgICBlcnJvciA9ICFzdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKTsKICAgICAgICAgfQog
Ci0gICAgICAgIC8vIEZJWE1FOiBJcyBpdCByZWFsbHkgT0sgdG8gdXBkYXRlIHRoZSBxdW90YSBp
biBtZW1vcnkgaWYgd2UgZmFpbGVkIHRvIHVwZGF0ZSBpdCBvbiBkaXNrPwotICAgICAgICBtX3F1
b3RhTWFwLT5zZXQob3JpZ2luLCBxdW90YSk7CisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHNldCBxdW90YSAlbGx1IGluIHRyYWNrZXIgZGF0YWJh
c2UgZm9yIG9yaWdpbiAlcyIsIHF1b3RhLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFz
Y2lpKCkuZGF0YSgpKTsKICAgICB9CiAKKyAgICAvLyBGSVhNRTogSXMgaXQgcmVhbGx5IE9LIHRv
IHVwZGF0ZSB0aGUgcXVvdGEgaW4gbWVtb3J5IGlmIHdlIGZhaWxlZCB0byB1cGRhdGUgaXQgb24g
ZGlzaz8KKyAgICBtX3F1b3RhTWFwLT5zZXQob3JpZ2luLT50aHJlYWRzYWZlQ29weSgpLCBxdW90
YSk7CisKICAgICBpZiAobV9jbGllbnQpCiAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1v
ZGlmeU9yaWdpbihvcmlnaW4pOwogfQogCiBib29sIERhdGFiYXNlVHJhY2tlcjo6YWRkRGF0YWJh
c2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIHBhdGgpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Cisg
ICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQobV9xdW90
YU1hcCk7CiAgICAgb3BlblRyYWNrZXJEYXRhYmFzZSh0cnVlKTsKICAgICBpZiAoIW1fZGF0YWJh
c2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIC8vIE5ldyBkYXRhYmFz
ZSBzaG91bGQgbmV2ZXIgYmUgYWRkZWQgdW50aWwgdGhlIG9yaWdpbiBoYXMgYmVlbiBlc3RhYmxp
c2hlZAotICAgIEFTU0VSVChoYXNFbnRyeUZvck9yaWdpbihvcmlnaW4pKTsKKyAgICBBU1NFUlQo
aGFzRW50cnlGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKSk7CiAKICAgICBTUUxpdGVTdGF0ZW1lbnQg
c3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5UTyBEYXRhYmFzZXMgKG9yaWdpbiwgbmFt
ZSwgcGF0aCkgVkFMVUVTICg/LCA/LCA/KTsiKTsKIApAQCAtNjA1LDggKzY4MSw2IEBAIGJvb2wg
RGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZShTZWN1cmkKIAogdm9pZCBEYXRhYmFzZVRyYWNr
ZXI6OmRlbGV0ZUFsbERhdGFiYXNlcygpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9
PSBtX3RocmVhZCk7Ci0KICAgICBWZWN0b3I8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiA+IG9yaWdp
bnNDb3B5OwogICAgIG9yaWdpbnMob3JpZ2luc0NvcHkpOwogCkBAIC02MTQsMTkgKzY4OCwzMCBA
QCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlQWxsRGF0YWJhc2VzCiAgICAgICAgIGRlbGV0
ZU9yaWdpbihvcmlnaW5zQ29weVtpXS5nZXQoKSk7CiB9CiAKKy8vIEl0IGlzIHRoZSBjYWxsZXIn
cyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCBub2JvZHkgaXMgdHJ5aW5nIHRvIGNy
ZWF0ZSwgZGVsZXRlLCBvcGVuLCBvciBjbG9zZSBkYXRhYmFzZXMgaW4gdGhpcyBvcmlnaW4gd2hp
bGUgdGhlIGRlbGV0aW9uIGlzCisvLyB0YWtpbmcgcGxhY2UuCiB2b2lkIERhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRlT3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1
cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxz
ZSk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQotICAgICAgICByZXR1cm47Ci0KICAg
ICBWZWN0b3I8U3RyaW5nPiBkYXRhYmFzZU5hbWVzOwotICAgIGlmICghZGF0YWJhc2VOYW1lc0Zv
ck9yaWdpbihvcmlnaW4sIGRhdGFiYXNlTmFtZXMpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIHJldHJpZXZlIGxpc3Qgb2YgZGF0YWJhc2UgbmFtZXMgZm9yIG9yaWdpbiAlcyIsIG9y
aWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1
cm47CisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1
YXJkKTsKKyAgICAgICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CisgICAgICAgIGlmICgh
bV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAo
IWRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2sob3JpZ2luLCBkYXRhYmFzZU5hbWVzKSkgewor
ICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmV0cmlldmUgbGlzdCBvZiBkYXRhYmFz
ZSBuYW1lcyBmb3Igb3JpZ2luICVzIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2Np
aSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYg
KCFjYW5EZWxldGVPcmlnaW4ob3JpZ2luKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJUcmll
ZCB0byBkZWxldGUgYW4gb3JpZ2luICglcykgd2hpbGUgZWl0aGVyIGNyZWF0aW5nIGRhdGFiYXNl
IGluIGl0IG9yIGFscmVhZHkgZGVsZXRpbmcgaXQiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmll
cigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVjb3JkRGVsZXRpbmdPcmlnaW4ob3Jp
Z2luKTsKICAgICB9CiAKKyAgICAvLyBXZSBkcm9wIHRoZSBsb2NrIGhlcmUgYmVjYXVzZSBob2xk
aW5nIGxvY2tzIGR1cmluZyBhIGNhbGwgdG8gZGVsZXRlRGF0YWJhc2VGaWxlIHdpbGwgZGVhZGxv
Y2suCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6ZSgpOyAr
K2kpIHsKICAgICAgICAgaWYgKCFkZWxldGVEYXRhYmFzZUZpbGUob3JpZ2luLCBkYXRhYmFzZU5h
bWVzW2ldKSkgewogICAgICAgICAgICAgLy8gRXZlbiBpZiB0aGUgZmlsZSBjYW4ndCBiZSBkZWxl
dGVkLCB3ZSB3YW50IHRvIHRyeSBhbmQgZGVsZXRlIHRoZSByZXN0LCBkb24ndCByZXR1cm4gZWFy
bHkgaGVyZS4KQEAgLTYzNCw0MSArNzE5LDQ1IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpkZWxl
dGVPcmlnaW4oU2VjdXIKICAgICAgICAgfQogICAgIH0KIAotICAgIFNRTGl0ZVN0YXRlbWVudCBz
dGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIERhdGFiYXNlcyBXSEVSRSBvcmlnaW49
PyIpOwotICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7Ci0gICAg
ICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZy
b20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCku
YXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHsKKyAgICAgICAg
Ly8gVG8gc2F0aXNmeSB0aGUgbG9jayBoaWVyYXJjaHksIHdlIGhhdmUgdG8gbG9jayB0aGUgb3Jp
Z2luUXVvdGFNYW5hZ2VyIGJlZm9yZSBtX2RhdGFiYXNlR3VhcmQgaWYgdGhlcmUncyBhbnkgY2hh
bmNlIHdlJ2xsIHRvIGxvY2sgYm90aC4KKyAgICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdl
cj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICAgICAgTXV0
ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIFNRTGl0ZVN0
YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIERhdGFiYXNlcyBXSEVS
RSBvcmlnaW49PyIpOwogCi0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkpOworICAgICAgICBkb25lRGVsZXRpbmdPcmlnaW4ob3JpZ2luKTsKIAot
ICAgIGlmICghc3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCkpIHsKLSAgICAgICAgTE9HX0VSUk9S
KCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMg
ZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEo
KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFy
ZSgpICE9IFNRTFJlc3VsdE9rKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBw
cmVwYXJlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIi
LCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgU1FMaXRlU3RhdGVtZW50IG9yaWdpblN0YXRl
bWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyBXSEVSRSBvcmlnaW49PyIpOwot
ICAgIGlmIChvcmlnaW5TdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7Ci0gICAg
ICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2Ygb3JpZ2luICVzIGZy
b20gdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwg
b3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7CisKKyAgICAgICAgaWYgKCFzdGF0ZW1lbnQu
ZXhlY3V0ZUNvbW1hbmQoKSkgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhl
Y3V0ZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwg
b3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KIAotICAgIG9yaWdpblN0YXRlbWVudC5iaW5kVGV4dCgxLCBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IG9y
aWdpblN0YXRlbWVudChtX2RhdGFiYXNlLCAiREVMRVRFIEZST00gT3JpZ2lucyBXSEVSRSBvcmln
aW49PyIpOworICAgICAgICBpZiAob3JpZ2luU3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1
bHRPaykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlv
biBvZiBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIo
KS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAg
IGlmICghb3JpZ2luU3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCkpIHsKLSAgICAgICAgTE9HX0VS
Uk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4g
JXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRh
dGEoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgICAgIG9yaWdpblN0YXRlbWVudC5i
aW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIAotICAgIFNRTGl0ZUZp
bGVTeXN0ZW06OmRlbGV0ZUVtcHR5RGF0YWJhc2VEaXJlY3Rvcnkob3JpZ2luUGF0aChvcmlnaW4p
KTsKKyAgICAgICAgaWYgKCFvcmlnaW5TdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKSkgeworICAg
ICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxldGlvbiBvZiBkYXRhYmFz
ZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZp
ZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAot
ICAgIFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gb3JpZ2luUG9zc2libHlMYXN0UmVmZXJlbmNlID0g
b3JpZ2luOwotICAgIHsKLSAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFN
YXBHdWFyZCk7CisgICAgICAgIFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZUVtcHR5RGF0YWJhc2VE
aXJlY3Rvcnkob3JpZ2luUGF0aChvcmlnaW4pKTsKKworICAgICAgICBSZWZQdHI8U2VjdXJpdHlP
cmlnaW4+IG9yaWdpblBvc3NpYmx5TGFzdFJlZmVyZW5jZSA9IG9yaWdpbjsKICAgICAgICAgbV9x
dW90YU1hcC0+cmVtb3ZlKG9yaWdpbik7CiAKLSAgICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFu
YWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKLSAgICAgICAg
b3JpZ2luUXVvdGFNYW5hZ2VyKCkucmVtb3ZlT3JpZ2luKG9yaWdpbik7CisgICAgICAgIG9yaWdp
blF1b3RhTWFuYWdlck5vTG9jaygpLnJlbW92ZU9yaWdpbihvcmlnaW4pOwogCiAgICAgICAgIC8v
IElmIHdlIHJlbW92ZWQgdGhlIGxhc3Qgb3JpZ2luLCBkbyBzb21lIGFkZGl0aW9uYWwgZGVsZXRp
b24uCiAgICAgICAgIGlmIChtX3F1b3RhTWFwLT5pc0VtcHR5KCkpIHsKQEAgLTY3NywzMCArNzY2
LDE1OSBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlT3JpZ2luKFNlY3VyCiAgICAgICAg
ICAgIFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZURhdGFiYXNlRmlsZSh0cmFja2VyRGF0YWJhc2VQ
YXRoKCkpOwogICAgICAgICAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVFbXB0eURhdGFiYXNl
RGlyZWN0b3J5KG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoKTsKICAgICAgICAgfQorCisgICAgICAg
IGlmIChtX2NsaWVudCkgeworICAgICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5
T3JpZ2luKG9yaWdpbik7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0
YWJhc2VOYW1lcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICBtX2NsaWVudC0+ZGlzcGF0
Y2hEaWRNb2RpZnlEYXRhYmFzZShvcmlnaW4sIGRhdGFiYXNlTmFtZXNbaV0pOworICAgICAgICB9
CiAgICAgfQorfQogCi0gICAgaWYgKG1fY2xpZW50KSB7Ci0gICAgICAgIG1fY2xpZW50LT5kaXNw
YXRjaERpZE1vZGlmeU9yaWdpbihvcmlnaW4pOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgZGF0YWJhc2VOYW1lcy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIG1fY2xpZW50LT5k
aXNwYXRjaERpZE1vZGlmeURhdGFiYXNlKG9yaWdpbiwgZGF0YWJhc2VOYW1lc1tpXSk7Citib29s
IERhdGFiYXNlVHJhY2tlcjo6Y2FuQ3JlYXRlRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdp
biwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRy
eUxvY2soKSk7CisgICAgLy8gQ2FuJ3QgY3JlYXRlIGEgZGF0YWJhc2Ugd2hpbGUgc29tZW9uZSBl
bHNlIGlzIGRlbGV0aW5nIGl0OyB0aGVyZSdzIGEgcmlzayBvZiBsZWF2aW5nIHVudHJhY2tlZCBk
YXRhYmFzZSBkZWJyaXMgb24gdGhlIGRpc2suCisgICAgcmV0dXJuICFkZWxldGluZ0RhdGFiYXNl
KG9yaWdpbiwgbmFtZSkgJiYgIWRlbGV0aW5nT3JpZ2luKG9yaWdpbik7Cit9CisKK3ZvaWQgRGF0
YWJhc2VUcmFja2VyOjpyZWNvcmRDcmVhdGluZ0RhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmln
aW4sIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50
cnlMb2NrKCkpOworICAgIE5hbWVDb3VudE1hcCogbmFtZU1hcCA9IG1fYmVpbmdDcmVhdGVkLmdl
dChvcmlnaW4pOworICAgIGlmICghbmFtZU1hcCkgeworICAgICAgICBuYW1lTWFwID0gbmV3IE5h
bWVDb3VudE1hcCgpOworICAgICAgICBtX2JlaW5nQ3JlYXRlZC5zZXQob3JpZ2luLT50aHJlYWRz
YWZlQ29weSgpLCBuYW1lTWFwKTsKICAgICB9CisgICAgbG9uZyBjb3VudCA9IG5hbWVNYXAtPmdl
dChuYW1lKTsKKyAgICBuYW1lTWFwLT5zZXQobmFtZS50aHJlYWRzYWZlQ29weSgpLCBjb3VudCAr
IDEpOworfQorCit2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZG9uZUNyZWF0aW5nRGF0YWJhc2UoU2Vj
dXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVCgh
bV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgTmFtZUNvdW50TWFwKiBuYW1lTWFwID0g
bV9iZWluZ0NyZWF0ZWQuZ2V0KG9yaWdpbik7CisgICAgaWYgKG5hbWVNYXApIHsKKyAgICAgICAg
bG9uZyBjb3VudCA9IG5hbWVNYXAtPmdldChuYW1lKTsKKyAgICAgICAgQVNTRVJUKGNvdW50ID4g
MCk7CisgICAgICAgIGlmIChjb3VudCA8PSAxKSB7CisgICAgICAgICAgICBuYW1lTWFwLT5yZW1v
dmUobmFtZSk7CisgICAgICAgICAgICBpZiAobmFtZU1hcC0+aXNFbXB0eSgpKSB7CisgICAgICAg
ICAgICAgICAgbV9iZWluZ0NyZWF0ZWQucmVtb3ZlKG9yaWdpbik7CisgICAgICAgICAgICAgICAg
ZGVsZXRlIG5hbWVNYXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgbmFtZU1hcC0+c2V0KG5hbWUsIGNvdW50IC0gMSk7CisgICAgfSBlbHNlCisgICAgICAgIEFT
U0VSVChmYWxzZSk7Cit9CisKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpjcmVhdGluZ0RhdGFiYXNl
KFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NF
UlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIE5hbWVDb3VudE1hcCogbmFtZU1h
cCA9IG1fYmVpbmdDcmVhdGVkLmdldChvcmlnaW4pOworICAgIHJldHVybiBuYW1lTWFwICYmIG5h
bWVNYXAtPmdldChuYW1lKTsKK30KKworYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZURh
dGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAg
ICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIHJldHVybiAhY3JlYXRp
bmdEYXRhYmFzZShvcmlnaW4sIG5hbWUpICYmICFkZWxldGluZ0RhdGFiYXNlKG9yaWdpbiwgbmFt
ZSk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZWNvcmREZWxldGluZ0RhdGFiYXNlKFNl
Y3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NFUlQo
IW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVChjYW5EZWxldGVEYXRhYmFz
ZShvcmlnaW4sIG5hbWUpKTsKKyAgICBOYW1lU2V0KiBuYW1lU2V0ID0gbV9iZWluZ0RlbGV0ZWQu
Z2V0KG9yaWdpbik7CisgICAgaWYgKCFuYW1lU2V0KSB7CisgICAgICAgIG5hbWVTZXQgPSBuZXcg
TmFtZVNldCgpOworICAgICAgICBtX2JlaW5nRGVsZXRlZC5zZXQob3JpZ2luLT50aHJlYWRzYWZl
Q29weSgpLCBuYW1lU2V0KTsKKyAgICB9CisgICAgQVNTRVJUKCFuYW1lU2V0LT5jb250YWlucyhu
YW1lKSk7CisgICAgbmFtZVNldC0+YWRkKG5hbWUudGhyZWFkc2FmZUNvcHkoKSk7Cit9CisKK3Zv
aWQgRGF0YWJhc2VUcmFja2VyOjpkb25lRGVsZXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAq
b3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3Vh
cmQudHJ5TG9jaygpKTsKKyAgICBOYW1lU2V0KiBuYW1lU2V0ID0gbV9iZWluZ0RlbGV0ZWQuZ2V0
KG9yaWdpbik7CisgICAgaWYgKG5hbWVTZXQpIHsKKyAgICAgICAgQVNTRVJUKG5hbWVTZXQtPmNv
bnRhaW5zKG5hbWUpKTsKKyAgICAgICAgbmFtZVNldC0+cmVtb3ZlKG5hbWUpOworICAgICAgICBp
ZiAobmFtZVNldC0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtX2JlaW5nRGVsZXRlZC5yZW1v
dmUob3JpZ2luKTsKKyAgICAgICAgICAgIGRlbGV0ZSBuYW1lU2V0OworICAgICAgICB9CisgICAg
fSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICB9Cit9CisKK2Jvb2wgRGF0YWJh
c2VUcmFja2VyOjpkZWxldGluZ0RhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0
IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkp
OworICAgIE5hbWVTZXQqIG5hbWVTZXQgPSBtX2JlaW5nRGVsZXRlZC5nZXQob3JpZ2luKTsKKyAg
ICByZXR1cm4gbmFtZVNldCAmJiBuYW1lU2V0LT5jb250YWlucyhuYW1lKTsKK30KKworYm9vbCBE
YXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZU9yaWdpbihTZWN1cml0eU9yaWdpbiAqb3JpZ2luKQor
eworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgcmV0dXJuICEo
ZGVsZXRpbmdPcmlnaW4ob3JpZ2luKSB8fCBtX2JlaW5nQ3JlYXRlZC5nZXQob3JpZ2luKSk7Cit9
CisKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpkZWxldGluZ09yaWdpbihTZWN1cml0eU9yaWdpbiAq
b3JpZ2luKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAg
cmV0dXJuIG1fb3JpZ2luc0JlaW5nRGVsZXRlZC5jb250YWlucyhvcmlnaW4pOworfQorCit2b2lk
IERhdGFiYXNlVHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdPcmlnaW4oU2VjdXJpdHlPcmlnaW4gKm9y
aWdpbikKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFT
U0VSVCghZGVsZXRpbmdPcmlnaW4ob3JpZ2luKSk7CisgICAgbV9vcmlnaW5zQmVpbmdEZWxldGVk
LmFkZChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCkpOworfQorCit2b2lkIERhdGFiYXNlVHJhY2tl
cjo6ZG9uZURlbGV0aW5nT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4pCit7CisgICAgQVNT
RVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQoZGVsZXRpbmdPcmln
aW4ob3JpZ2luKSk7CisgICAgbV9vcmlnaW5zQmVpbmdEZWxldGVkLnJlbW92ZShvcmlnaW4pOwog
fQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4q
IG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFk
KCkgPT0gbV90aHJlYWQpOwotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwotICAgIGlm
ICghbV9kYXRhYmFzZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOworICAgIHsKKyAgICAgICAg
TXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIG9wZW5U
cmFja2VyRGF0YWJhc2UoZmFsc2UpOworICAgICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCFjYW5EZWxldGVEYXRhYmFzZShv
cmlnaW4sIG5hbWUpKSB7CisgICAgICAgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlY29yZERlbGV0aW5nRGF0YWJhc2Uob3JpZ2lu
LCBuYW1lKTsKKyAgICB9CiAKKyAgICAvLyBXZSBkcm9wIHRoZSBsb2NrIGhlcmUgYmVjYXVzZSBo
b2xkaW5nIGxvY2tzIGR1cmluZyBhIGNhbGwgdG8gZGVsZXRlRGF0YWJhc2VGaWxlIHdpbGwgZGVh
ZGxvY2suCiAgICAgaWYgKCFkZWxldGVEYXRhYmFzZUZpbGUob3JpZ2luLCBuYW1lKSkgewogICAg
ICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBkZWxldGUgZmlsZSBmb3IgZGF0YWJhc2UgJXMgaW4g
b3JpZ2luICVzIiwgbmFtZS5hc2NpaSgpLmRhdGEoKSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZp
ZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZSht
X2RhdGFiYXNlR3VhcmQpOworICAgICAgICBkb25lRGVsZXRpbmdEYXRhYmFzZShvcmlnaW4sIG5h
bWUpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gVG8gc2F0aXNmeSB0aGUgbG9j
ayBoaWVyYXJjaHksIHdlIGhhdmUgdG8gbG9jayB0aGUgb3JpZ2luUXVvdGFNYW5hZ2VyIGJlZm9y
ZSBtX2RhdGFiYXNlR3VhcmQgaWYgdGhlcmUncyBhbnkgY2hhbmNlIHdlJ2xsIHRvIGxvY2sgYm90
aC4KKyAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJMb2NrZXIob3Jp
Z2luUXVvdGFNYW5hZ2VyKCkpOworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFi
YXNlR3VhcmQpOworCiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAi
REVMRVRFIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT8iKTsKICAgICBp
ZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewogICAgICAgICBMT0dfRVJS
T1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIGRhdGFiYXNlICVzIGZyb20gb3JpZ2lu
ICVzIGZyb20gdHJhY2tlciIsIG5hbWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbi0+ZGF0YWJhc2VJ
ZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBkb25lRGVsZXRpbmdEYXRhYmFz
ZShvcmlnaW4sIG5hbWUpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC03MDksNDAgKzky
Nyw0NiBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2UoU2VjCiAKICAgICBp
ZiAoIXN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7CiAgICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIGV4ZWN1dGUgZGVsZXRpb24gb2YgZGF0YWJhc2UgJXMgZnJvbSBvcmlnaW4gJXMgZnJv
bSB0cmFja2VyIiwgbmFtZS5hc2NpaSgpLmRhdGEoKSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZp
ZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIGRvbmVEZWxldGluZ0RhdGFiYXNlKG9yaWdp
biwgbmFtZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICB7Ci0gICAgICAgIExvY2tl
cjxPcmlnaW5RdW90YU1hbmFnZXI+IHF1b3RhTWFuYWdlckxvY2tlcihvcmlnaW5RdW90YU1hbmFn
ZXIoKSk7Ci0gICAgICAgIG9yaWdpblF1b3RhTWFuYWdlcigpLnJlbW92ZURhdGFiYXNlKG9yaWdp
biwgbmFtZSk7Ci0gICAgfQorICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnJlbW92ZURh
dGFiYXNlKG9yaWdpbiwgbmFtZSk7CiAKICAgICBpZiAobV9jbGllbnQpIHsKICAgICAgICAgbV9j
bGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3JpZ2luKG9yaWdpbik7CiAgICAgICAgIG1fY2xpZW50
LT5kaXNwYXRjaERpZE1vZGlmeURhdGFiYXNlKG9yaWdpbiwgbmFtZSk7CiAgICAgfQorICAgIGRv
bmVEZWxldGluZ0RhdGFiYXNlKG9yaWdpbiwgbmFtZSk7CiB9CiAKKy8vIGRlbGV0ZURhdGFiYXNl
RmlsZSBoYXMgdG8gcmVsZWFzZSBsb2NrcyBiZXR3ZWVuIGxvb2tpbmcgdXAgdGhlIGxpc3Qgb2Yg
ZGF0YWJhc2VzIHRvIGNsb3NlIGFuZCBjbG9zaW5nIHRoZW0uICBXaGlsZSB0aGlzIGlzIGluIHBy
b2dyZXNzLCB0aGUgY2FsbGVyCisvLyBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgbm8g
bmV3IGRhdGFiYXNlcyBhcmUgb3BlbmVkIGluIHRoZSBmaWxlIHRvIGJlIGRlbGV0ZWQuCiBib29s
IERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VGaWxlKFNlY3VyaXR5T3JpZ2luKiBvcmln
aW4sIGNvbnN0IFN0cmluZyYgbmFtZSkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09
IG1fdGhyZWFkKTsKICAgICBTdHJpbmcgZnVsbFBhdGggPSBmdWxsUGF0aEZvckRhdGFiYXNlKG9y
aWdpbiwgbmFtZSwgZmFsc2UpOwogICAgIGlmIChmdWxsUGF0aC5pc0VtcHR5KCkpCiAgICAgICAg
IHJldHVybiB0cnVlOwogCisjaWZuZGVmIE5ERUJVRworICAgIHsKKyAgICBNdXRleExvY2tlciBs
b2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICBBU1NFUlQoZGVsZXRpbmdEYXRhYmFz
ZShvcmlnaW4sIG5hbWUpIHx8IGRlbGV0aW5nT3JpZ2luKG9yaWdpbikpOworICAgIH0KKyNlbmRp
ZgorCiAgICAgVmVjdG9yPFJlZlB0cjxEYXRhYmFzZT4gPiBkZWxldGVkRGF0YWJhc2VzOwogCi0g
ICAgLy8gTWFrZSBzdXJlIG5vdCB0byBob2xkIHRoZSBtX29wZW5EYXRhYmFzZU1hcEd1YXJkIG11
dGV4IHdoZW4gY2FsbGluZworICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gaG9sZCB0aGUgYW55IGxv
Y2tzIHdoZW4gY2FsbGluZwogICAgIC8vIERhdGFiYXNlOjptYXJrQXNEZWxldGVkQW5kQ2xvc2Uo
KSwgc2luY2UgdGhhdCBjYW4gY2F1c2UgYSBkZWFkbG9jawogICAgIC8vIGR1cmluZyB0aGUgc3lu
Y2hyb25vdXMgRGF0YWJhc2VUaHJlYWQgY2FsbCBpdCB0cmlnZ2Vycy4KLQogICAgIHsKICAgICAg
ICAgTXV0ZXhMb2NrZXIgb3BlbkRhdGFiYXNlTWFwTG9jayhtX29wZW5EYXRhYmFzZU1hcEd1YXJk
KTsKICAgICAgICAgaWYgKG1fb3BlbkRhdGFiYXNlTWFwKSB7CiAgICAgICAgICAgICAvLyBUaGVy
ZSBhcmUgc29tZSBvcGVuIGRhdGFiYXNlcywgbGV0cyBjaGVjayBpZiB0aGV5IGFyZSBmb3IgdGhp
cyBvcmlnaW4uCiAgICAgICAgICAgICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5E
YXRhYmFzZU1hcC0+Z2V0KG9yaWdpbik7CiAgICAgICAgICAgICBpZiAobmFtZU1hcCAmJiBuYW1l
TWFwLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgc29tZSBvcGVuIGRh
dGFiYXNlcyBmb3IgdGhpcyBvcmlnaW4sIGxldHMgY2hlY2sKKyAgICAgICAgICAgICAgICAvLyBU
aGVyZSBhcmUgc29tZSBvcGVuIGRhdGFiYXNlcyBmb3IgdGhpcyBvcmlnaW4sIGxldCdzIGNoZWNr
CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhleSBhcmUgdGhpcyBkYXRhYmFzZSBieSBuYW1lLgog
ICAgICAgICAgICAgICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9IG5hbWVNYXAtPmdldChu
YW1lKTsKICAgICAgICAgICAgICAgICBpZiAoZGF0YWJhc2VTZXQgJiYgZGF0YWJhc2VTZXQtPnNp
emUoKSkgewpAQCAtNzYzLDcgKzk4Nyw2IEBAIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpkZWxldGVE
YXRhYmFzZUZpbGUKIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnNldENsaWVudChEYXRhYmFzZVRy
YWNrZXJDbGllbnQqIGNsaWVudCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1f
dGhyZWFkKTsKICAgICBtX2NsaWVudCA9IGNsaWVudDsKIH0KIApAQCAtNzczLDcgKzk5Niw3IEBA
IHN0YXRpYyBNdXRleCYgbm90aWZpY2F0aW9uTXV0ZXgoKQogICAgIHJldHVybiBtdXRleDsKIH0K
IAotdHlwZWRlZiBWZWN0b3I8cGFpcjxTZWN1cml0eU9yaWdpbiosIFN0cmluZz4gPiBOb3RpZmlj
YXRpb25RdWV1ZTsKK3R5cGVkZWYgVmVjdG9yPHBhaXI8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiwg
U3RyaW5nPiA+IE5vdGlmaWNhdGlvblF1ZXVlOwogCiBzdGF0aWMgTm90aWZpY2F0aW9uUXVldWUm
IG5vdGlmaWNhdGlvblF1ZXVlKCkKIHsKQEAgLTc4NSw3ICsxMDA4LDcgQEAgdm9pZCBEYXRhYmFz
ZVRyYWNrZXI6OnNjaGVkdWxlTm90aWZ5RGF0YQogewogICAgIE11dGV4TG9ja2VyIGxvY2tlcihu
b3RpZmljYXRpb25NdXRleCgpKTsKIAotICAgIG5vdGlmaWNhdGlvblF1ZXVlKCkuYXBwZW5kKHBh
aXI8U2VjdXJpdHlPcmlnaW4qLCBTdHJpbmc+KG9yaWdpbiwgbmFtZS5jcm9zc1RocmVhZFN0cmlu
ZygpKSk7CisgICAgbm90aWZpY2F0aW9uUXVldWUoKS5hcHBlbmQocGFpcjxSZWZQdHI8U2VjdXJp
dHlPcmlnaW4+LCBTdHJpbmc+KG9yaWdpbi0+dGhyZWFkc2FmZUNvcHkoKSwgbmFtZS5jcm9zc1Ro
cmVhZFN0cmluZygpKSk7CiAgICAgc2NoZWR1bGVGb3JOb3RpZmljYXRpb24oKTsKIH0KIApAQCAt
ODIwLDcgKzEwNDMsNyBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6bm90aWZ5RGF0YWJhc2VzQ2hh
CiAgICAgICAgIHJldHVybjsKIAogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBub3RpZmlj
YXRpb25zLnNpemUoKTsgKytpKQotICAgICAgICB0aGVUcmFja2VyLm1fY2xpZW50LT5kaXNwYXRj
aERpZE1vZGlmeURhdGFiYXNlKG5vdGlmaWNhdGlvbnNbaV0uZmlyc3QsIG5vdGlmaWNhdGlvbnNb
aV0uc2Vjb25kKTsKKyAgICAgICAgdGhlVHJhY2tlci5tX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2Rp
ZnlEYXRhYmFzZShub3RpZmljYXRpb25zW2ldLmZpcnN0LmdldCgpLCBub3RpZmljYXRpb25zW2ld
LnNlY29uZCk7CiB9CiAKIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAkocmV2aXNp
b24gNTYwNzIpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTYwLDkgKzYwLDExIEBAIHN0cnVjdCBTZWN1cml0eU9yaWdpblRyYWl0czsKIGNs
YXNzIERhdGFiYXNlVHJhY2tlciA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiBwdWJsaWM6CiAgICAg
c3RhdGljIERhdGFiYXNlVHJhY2tlciYgdHJhY2tlcigpOwotICAgIC8vIEZJWE1FOiBEdWUgdG8g
d29ya2VycyBoYXZpbmcgbXVsdGlwbGUgdGhyZWFkcyBpbiBhIHNpbmdsZSBwcm9jZXNzIHNoYXJp
bmcKLSAgICAvLyBhIERhdGFiYXNlVHJhY2tlciwgdGhpcyBzaW5nbGV0b24gd2lsbCBoYXZlIHRv
IGJlIHN5bmNocm9uaXplZCBvciBtb3ZlZAotICAgIC8vIHRvIFRMUy4KKyAgICAvLyBUaGlzIHNp
bmdsZXRvbiB3aWxsIHBvdGVudGlhbGx5IGJlIHVzZWQgZnJvbSBtdWx0aXBsZSB3b3JrZXIgdGhy
ZWFkcyBhbmQgdGhlIHBhZ2UncyBjb250ZXh0IHRocmVhZCBzaW11bHRhbmVvdXNseS4gIFRvIGtl
ZXAgdGhpcyBzYWZlLCBpdCdzCisgICAgLy8gY3VycmVudGx5IHVzaW5nIDQgbG9ja3MuICBJbiBv
cmRlciB0byBhdm9pZCBkZWFkbG9jayB3aGVuIHRha2luZyBtdWx0aXBsZSBsb2NrcywgeW91IG11
c3QgdGFrZSB0aGVtIGluIHRoZSBjb3JyZWN0IG9yZGVyOgorICAgIC8vIG9yaWdpblF1b3RhTWFu
YWdlcigpIGJlZm9yZSBtX2RhdGFiYXNlR3VhcmQgb3IgbV9vcGVuRGF0YWJhc2VNYXBHdWFyZAor
ICAgIC8vIG1fZGF0YWJhc2VHdWFyZCBiZWZvcmUgbV9vcGVuRGF0YWJhc2VNYXBHdWFyZAorICAg
IC8vIG5vdGlmaWNhdGlvbk11dGV4KCkgaXMgY3VycmVudGx5IGluZGVwZW5kZW50IG9mIHRoZSBv
dGhlciBsb2Nrcy4KIAogICAgIGJvb2wgY2FuRXN0YWJsaXNoRGF0YWJhc2UoU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCosIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkaXNwbGF5TmFt
ZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKTsKICAgICB2b2lkIHNldERhdGFiYXNlRGV0
YWlscyhTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBk
aXNwbGF5TmFtZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKTsKQEAgLTg3LDcgKzg5LDcg
QEAgcHJpdmF0ZToKICNpZiAhUExBVEZPUk0oQ0hST01JVU0pCiBwdWJsaWM6CiAgICAgdm9pZCBz
ZXREYXRhYmFzZURpcmVjdG9yeVBhdGgoY29uc3QgU3RyaW5nJik7Ci0gICAgY29uc3QgU3RyaW5n
JiBkYXRhYmFzZURpcmVjdG9yeVBhdGgoKSBjb25zdDsKKyAgICBTdHJpbmcgZGF0YWJhc2VEaXJl
Y3RvcnlQYXRoKCkgY29uc3Q7CiAKICAgICB2b2lkIG9yaWdpbnMoVmVjdG9yPFJlZlB0cjxTZWN1
cml0eU9yaWdpbj4gPiYgcmVzdWx0KTsKICAgICBib29sIGRhdGFiYXNlTmFtZXNGb3JPcmlnaW4o
U2VjdXJpdHlPcmlnaW4qLCBWZWN0b3I8U3RyaW5nPiYgcmVzdWx0KTsKQEAgLTExNCw2ICsxMTYs
MTMgQEAgcHVibGljOgogICAgIGJvb2wgaGFzRW50cnlGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4q
KTsKIAogcHJpdmF0ZToKKyAgICBPcmlnaW5RdW90YU1hbmFnZXImIG9yaWdpblF1b3RhTWFuYWdl
ck5vTG9jaygpOworICAgIGJvb2wgaGFzRW50cnlGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmln
aW4qIG9yaWdpbik7CisgICAgU3RyaW5nIGZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2soU2VjdXJp
dHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZEb2VzTm90RXhpc3Qp
OworICAgIGJvb2wgZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiog
b3JpZ2luLCBWZWN0b3I8U3RyaW5nPiYgcmVzdWx0VmVjdG9yKTsKKyAgICB1bnNpZ25lZCBsb25n
IGxvbmcgdXNhZ2VGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbik7CisgICAg
dW5zaWduZWQgbG9uZyBsb25nIHF1b3RhRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBv
cmlnaW4pOworCiAgICAgU3RyaW5nIHRyYWNrZXJEYXRhYmFzZVBhdGgoKSBjb25zdDsKICAgICB2
b2lkIG9wZW5UcmFja2VyRGF0YWJhc2UoYm9vbCBjcmVhdGVJZkRvZXNOb3RFeGlzdCk7CiAKQEAg
LTEyNiwxMCArMTM1LDExIEBAIHByaXZhdGU6CiAKICAgICBib29sIGRlbGV0ZURhdGFiYXNlRmls
ZShTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgbmFtZSk7CiAKKyAgICAvLyBUaGlzIGxv
Y2sgcHJvdGVjdHMgbV9kYXRhYmFzZSwgbV9xdW90YU1hcCwgbV9wcm9wb3NlZERhdGFiYXNlcywg
bV9kYXRhYmFzZURpcmVjdG9yeVBhdGgsIG1fb3JpZ2luc0JlaW5nRGVsZXRlZCwgbV9iZWluZ0Ny
ZWF0ZWQsIGFuZCBtX2JlaW5nRGVsZXRlZC4KKyAgICBNdXRleCBtX2RhdGFiYXNlR3VhcmQ7CiAg
ICAgU1FMaXRlRGF0YWJhc2UgbV9kYXRhYmFzZTsKIAogICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQ
dHI8U2VjdXJpdHlPcmlnaW4+LCB1bnNpZ25lZCBsb25nIGxvbmcsIFNlY3VyaXR5T3JpZ2luSGFz
aD4gUXVvdGFNYXA7Ci0gICAgTXV0ZXggbV9xdW90YU1hcEd1YXJkOwogICAgIG11dGFibGUgT3du
UHRyPFF1b3RhTWFwPiBtX3F1b3RhTWFwOwogCiAgICAgT3duUHRyPE9yaWdpblF1b3RhTWFuYWdl
cj4gbV9xdW90YU1hbmFnZXI7CkBAIC0xMzgsMTEgKzE0OCwyNyBAQCBwcml2YXRlOgogCiAgICAg
RGF0YWJhc2VUcmFja2VyQ2xpZW50KiBtX2NsaWVudDsKIAotICAgIHN0ZDo6cGFpcjxTZWN1cml0
eU9yaWdpbiosIERhdGFiYXNlRGV0YWlscz4qIG1fcHJvcG9zZWREYXRhYmFzZTsKKyAgICB0eXBl
ZGVmIHN0ZDo6cGFpcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBEYXRhYmFzZURldGFpbHM+IFBy
b3Bvc2VkRGF0YWJhc2U7CisgICAgSGFzaFNldDxQcm9wb3NlZERhdGFiYXNlKj4gbV9wcm9wb3Nl
ZERhdGFiYXNlczsKIAotI2lmbmRlZiBOREVCVUcKLSAgICBUaHJlYWRJZGVudGlmaWVyIG1fdGhy
ZWFkOwotI2VuZGlmCisgICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgbG9uZz4gTmFtZUNvdW50
TWFwOworICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBOYW1lQ291
bnRNYXAqLCBTZWN1cml0eU9yaWdpbkhhc2g+IENyZWF0ZVNldDsKKyAgICBDcmVhdGVTZXQgbV9i
ZWluZ0NyZWF0ZWQ7CisgICAgdHlwZWRlZiBIYXNoU2V0PFN0cmluZz4gTmFtZVNldDsKKyAgICBI
YXNoTWFwPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4sIE5hbWVTZXQqLCBTZWN1cml0eU9yaWdpbkhh
c2g+IG1fYmVpbmdEZWxldGVkOworICAgIEhhc2hTZXQ8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiwg
U2VjdXJpdHlPcmlnaW5IYXNoPiBtX29yaWdpbnNCZWluZ0RlbGV0ZWQ7CisgICAgYm9vbCBjYW5D
cmVhdGVEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUp
OworICAgIHZvaWQgcmVjb3JkQ3JlYXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2lu
LCBjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIHZvaWQgZG9uZUNyZWF0aW5nRGF0YWJhc2UoU2Vj
dXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKTsKKyAgICBib29sIGNyZWF0
aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKTsK
KyAgICBib29sIGNhbkRlbGV0ZURhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0
IFN0cmluZyYgbmFtZSk7CisgICAgdm9pZCByZWNvcmREZWxldGluZ0RhdGFiYXNlKFNlY3VyaXR5
T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgdm9pZCBkb25lRGVsZXRp
bmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUpOwor
ICAgIGJvb2wgZGVsZXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBT
dHJpbmcmIG5hbWUpOworICAgIGJvb2wgY2FuRGVsZXRlT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpv
cmlnaW4pOworICAgIGJvb2wgZGVsZXRpbmdPcmlnaW4oU2VjdXJpdHlPcmlnaW4gKm9yaWdpbik7
CisgICAgdm9pZCByZWNvcmREZWxldGluZ09yaWdpbihTZWN1cml0eU9yaWdpbiAqb3JpZ2luKTsK
KyAgICB2b2lkIGRvbmVEZWxldGluZ09yaWdpbihTZWN1cml0eU9yaWdpbiAqb3JpZ2luKTsKIAog
ICAgIHN0YXRpYyB2b2lkIHNjaGVkdWxlRm9yTm90aWZpY2F0aW9uKCk7CiAgICAgc3RhdGljIHZv
aWQgbm90aWZ5RGF0YWJhc2VzQ2hhbmdlZCh2b2lkKik7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uv
T3JpZ2luUXVvdGFNYW5hZ2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvT3Jp
Z2luUXVvdGFNYW5hZ2VyLmNwcAkocmV2aXNpb24gNTYwNzIpCisrKyBXZWJDb3JlL3N0b3JhZ2Uv
T3JpZ2luUXVvdGFNYW5hZ2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsMTggQEAg
T3JpZ2luUXVvdGFNYW5hZ2VyOjpPcmlnaW5RdW90YU1hbmFnZXIoKQogewogfQogCitib29sIE9y
aWdpblF1b3RhTWFuYWdlcjo6dHJ5TG9jaygpCit7CisgICAgYm9vbCBsb2NrZWQgPSBtX3VzYWdl
UmVjb3JkR3VhcmQudHJ5TG9jaygpOworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAobG9ja2VkKQor
ICAgICAgICBtX3VzYWdlUmVjb3JkR3VhcmRMb2NrZWQgPSB0cnVlOworICAgIGVsc2UKKyAgICAg
ICAgQVNTRVJUKG1fdXNhZ2VSZWNvcmRHdWFyZExvY2tlZCk7CisjZW5kaWYKKyAgICByZXR1cm4g
bG9ja2VkOworfQorCiB2b2lkIE9yaWdpblF1b3RhTWFuYWdlcjo6bG9jaygpCiB7CiAgICAgbV91
c2FnZVJlY29yZEd1YXJkLmxvY2soKTsKQEAgLTYzLDcgKzc1LDcgQEAgdm9pZCBPcmlnaW5RdW90
YU1hbmFnZXI6OnRyYWNrT3JpZ2luKFBhcwogICAgIEFTU0VSVChtX3VzYWdlUmVjb3JkR3VhcmRM
b2NrZWQpOwogICAgIEFTU0VSVCghbV91c2FnZU1hcC5jb250YWlucyhvcmlnaW4uZ2V0KCkpKTsK
IAotICAgIG1fdXNhZ2VNYXAuc2V0KG9yaWdpbiwgbmV3IE9yaWdpblVzYWdlUmVjb3JkKTsKKyAg
ICBtX3VzYWdlTWFwLnNldChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIG5ldyBPcmlnaW5Vc2Fn
ZVJlY29yZCk7CiB9CiAKIGJvb2wgT3JpZ2luUXVvdGFNYW5hZ2VyOjp0cmFja3NPcmlnaW4oU2Vj
dXJpdHlPcmlnaW4qIG9yaWdpbikgY29uc3QKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5R
dW90YU1hbmFnZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFN
YW5hZ2VyLmgJKHJldmlzaW9uIDU2MDcyKQorKysgV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3Rh
TWFuYWdlci5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSw3IEBAIGNsYXNzIE9yaWdpblF1
b3RhTWFuYWdlciA6IHB1YmxpYyBOb25jb3AKIHB1YmxpYzoKICAgICBPcmlnaW5RdW90YU1hbmFn
ZXIoKTsKIAorICAgIGJvb2wgdHJ5TG9jaygpOwogICAgIHZvaWQgbG9jaygpOwogICAgIHZvaWQg
dW5sb2NrKCk7CiAK
</data>
<flag name="review"
          id="34152"
          type_id="1"
          status="-"
          setter="dimich"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51177</attachid>
            <date>2010-03-19 11:51:59 -0700</date>
            <delta_ts>2010-03-19 12:35:35 -0700</delta_ts>
            <desc>Removed static variable optimization in SecurityOrigin::databaseIdentifier</desc>
            <filename>tracker1.patch</filename>
            <type>text/plain</type>
            <size>58186</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NjI0MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTEwIEBACisyMDEwLTAzLTE5ICBFcmljIFVocmhhbmUgIDxlcmljdUBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
UmVmYWN0b3IgRGF0YWJhc2VUcmFja2VyLmNwcCBmb3IgdGhyZWFkIHNhZmV0eQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5OTEKKworICAgICAgICBU
aGlzIGVuYWJsZXMgY2FsbGluZyBpbnRvIERhdGFiYXNlVHJhY2tlciBmcm9tIG11bHRpcGxlIGNv
bnRleHQgdGhyZWFkcywKKyAgICAgICAgYXMgd2lsbCBoYXBwZW4gb25jZSBXb3JrZXJzIGNhbiBh
Y2Nlc3MgdGhlIERhdGFiYXNlLiAgSXQgcmVxdWlyZWQgYSBmYWlyCisgICAgICAgIGFtb3VudCBv
ZiByZXNodWZmbGluZyBvZiBsb2Nrcy4gIEkgZW5kZWQgdXAgc3BsaXR0aW5nIHRoZSBwdWJsaWMK
KyAgICAgICAgaW50ZXJmYWNlIFtjYWxscyB0aGF0IHRha2UgbG9ja3MgYW5kIGNhbGwgcHJpdmF0
ZSBmdW5jdGlvbnNdIGZyb20gdGhlCisgICAgICAgIGltcGxlbWVudGF0aW9ucyBbY2FsbHMgdGhh
dCBhc3NlcnQgdGhhdCBsb2NrcyBhcmUgYWxyZWFkeSBoZWxkXSBpbiBvcmRlcgorICAgICAgICB0
byBhdm9pZCBsb2NrIGNvbmZsaWN0cy4gIEkgYWxzbyBoYWQgdG8gbWFrZSBzdXJlIHdlIHdlcmVu
J3Qgc2hhcmluZworICAgICAgICBTdHJpbmdzIG9yIFNlY3VyaXR5T3JpZ2lucyBhY3Jvc3MgdGhy
ZWFkcy4KKworICAgICAgICBObyBuZXcgdGVzdHMuCisKKyAgICAgICAgQWxsb3cgYWNjZXNzIHRv
IGRhdGFiYXNlIGhhbmRsZXMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIElGRiBTUUxpdGUgaXMgbmV3
IGVub3VnaCBhbmQgdGhlIHVzZXIgcmVxdWVzdHMgaXQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9z
cWwvU1FMaXRlRGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6
OlNRTGl0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpkaXNh
YmxlVGhyZWFkaW5nQ2hlY2tzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJh
c2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpzcWxpdGUzSGFuZGxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpkaXNhYmxlVGhyZWFkaW5nQ2hlY2tz
KToKKworICAgICAgICBSZW1vdmUgYW4gYXN5bmNocm9ub3VzIGNhbGwgZnJvbSBEYXRhYmFzZTo6
Y2xvc2UgYmFjayB0byB0aGUgZXhlY3V0aW9uIHRocmVhZCwgc28gdGhhdCBjbGVhbnVwIGNhbiBi
ZSBtb3JlIGRldGVybWluaXN0aWMuCisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjptYXJrQXNEZWxldGVkQW5kQ2xvc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OmNsb3NlKToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFi
YXNlLmg6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6KToKKyAgICAgICAgKiBzdG9yYWdl
L0RhdGFiYXNlRGV0YWlscy5oOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VEZXRhaWxzOjpE
YXRhYmFzZURldGFpbHMpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VEZXRhaWxzOjp0aHJl
YWQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUYXNrLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlQ2xvc2VUYXNrOjpkb1BlcmZvcm1UYXNrKToKKyAgICAgICAgKiBzdG9yYWdl
L0RhdGFiYXNlVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpk
YXRhYmFzZVRocmVhZCk6CisKKyAgICAgICAgQW55IFN0cmluZ3MgdGhhdCBnZXQgc3RvcmVkIGlu
IERhdGFiYXNlVHJhY2tlciwgYW5kIGFueSBTdHJpbmdzIHJldHVybmVkIGZyb20gRGF0YWJhc2VU
cmFja2VyLCBhcmUgbm93IHRocmVhZHNhZmVDb3BpZXMuCisgICAgICAgIFB1YmxpYyBmdW5jdGlv
bnMgbm93IHRha2UgYWxsIG5lZWRlZCBsb2NrcywgdGhlbiBnZW5lcmFsbHkgY2FsbCBvbmx5IHBy
aXZhdGUgZnVuY3Rpb25zIFt0aGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9uczogZGVsZXRpb24gZnVu
Y3Rpb25zIGFuZCBvcmlnaW5zKCldLgorICAgICAgICBQcml2YXRlIGZ1bmN0aW9ucyBubyBsb25n
ZXIgdGFrZSBsb2Nrcy4KKyAgICAgICAgbV9xdW90YU1hcEd1YXJkIGJlY29tZXMgbV9kYXRhYmFz
ZUd1YXJkLCBhbmQgbm93IHByb3RlY3RzIG1fZGF0YWJhc2UsIG1fcXVvdGFNYXAsIG1fcHJvcG9z
ZWREYXRhYmFzZXMsIG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLCBtX29yaWdpbnNCZWluZ0RlbGV0
ZWQsIG1fYmVpbmdDcmVhdGVkLCBhbmQgbV9iZWluZ0RlbGV0ZWQuCisgICAgICAgIG1fcHJvcG9z
ZWREYXRhYmFzZXMgcmVwbGFjZXMgbV9wcm9wb3NlZERhdGFiYXNlLCB0byBhY2NvdW50IGZvciBy
ZWVudHJhbmN5LgorCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKyAgICAg
ICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlck5vTG9jayk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlcik6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJhY2tlcik6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGlyZWN0b3J5UGF0aCk6CisgICAgICAgIChXZWJD
b3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlRGlyZWN0b3J5UGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXJEYXRhYmFzZVBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpvcGVuVHJhY2tlckRhdGFiYXNlKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0YWJsaXNoRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvck9yaWdpbk5vTG9jayk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yT3JpZ2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JEYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3JpZ2lucyk6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbnMpOgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbik6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRldGFpbHNGb3JOYW1lQW5kT3JpZ2lu
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JEYXRhYmFzZSk6
CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yT3JpZ2luTm9Mb2NrKToK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW4pOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpxdW90YUZvck9yaWdpbk5vTG9jayk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2V0UXVvdGEpOgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFiYXNlcyk6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZU9yaWdpbik6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRy
YWNrZXI6OmRlbGV0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRlRGF0YWJhc2VGaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tl
cjo6c2V0Q2xpZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2NoZWR1
bGVOb3RpZnlEYXRhYmFzZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFj
a2VyOjpub3RpZnlEYXRhYmFzZXNDaGFuZ2VkKToKKworICAgICAgICBUaGVzZSBmdW5jdGlvbnMg
a2VlcCB0cmFjayBvZiBpbi1wcm9ncmVzcyBkZWxldGlvbnMgYW5kIGNyZWF0aW9ucywgc28gdGhh
dCB3ZSBjYW4gbWFrZSBzdXJlIG5vYm9keSBldmVyeSBkZWxldGVzIGEgZGF0YWJhc2UgZmlsZSB3
aGlsZSBhIGxpdmUgZGF0YWJhc2UgaXMgdXNpbmcgaXQuCisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmNhbkNyZWF0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6cmVjb3JkQ3JlYXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmRvbmVDcmVhdGluZ0RhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6Y3JlYXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmRvbmVEZWxldGluZ0RhdGFiYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGVsZXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZU9yaWdpbik6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmRlbGV0aW5nT3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6RGF0
YWJhc2VUcmFja2VyOjpkb25lRGVsZXRpbmdPcmlnaW4pOgorCisgICAgICAgIEFueSBTZWN1cml0
eU9yaWdpbnMgc3RvcmVkIGluIE9yaWdpblF1b3RhTWFuYWdlciBhcmUgbm93IHRocmVhZHNhZmVD
b3BpZXMgb2YgaW5wdXRzLiAgVGhlcmUncyBhIG5ldyB0cnlMb2NrKCkgZnVuY3Rpb24gaW4gYWRk
aXRpb24gdG8gdGhlIGV4aXN0aW5nIGxvY2soKS4KKworICAgICAgICAqIHN0b3JhZ2UvT3JpZ2lu
UXVvdGFNYW5hZ2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok9yaWdpblF1b3RhTWFuYWdlcjo6
dHJ5TG9jayk6CisgICAgICAgIChXZWJDb3JlOjpPcmlnaW5RdW90YU1hbmFnZXI6OnRyYWNrT3Jp
Z2luKToKKyAgICAgICAgKiBzdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oOgorCiAyMDEwLTAz
LTE5ICBMYXN6bG8gR29tYm9zICA8bGFzemxvLjEuZ29tYm9zQG5va2lhLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBTaW1vbiBIYXVzbWFubi4KSW5kZXg6IFdlYkNvcmUvcGFnZS9TZWN1cml0
eU9yaWdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL1NlY3VyaXR5T3JpZ2luLmNw
cAkocmV2aXNpb24gNTYyNDMpCisrKyBXZWJDb3JlL3BhZ2UvU2VjdXJpdHlPcmlnaW4uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00NjIsNyArNDYyLDcgQEAgc3RhdGljIFN0cmluZyBlbmNvZGVkSG9z
dChjb25zdCBTdHJpbmcmIAogCiBTdHJpbmcgU2VjdXJpdHlPcmlnaW46OmRhdGFiYXNlSWRlbnRp
ZmllcigpIGNvbnN0IAogewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoU3RyaW5nLCBzZXBhcmF0
b3JTdHJpbmcsICgmU2VwYXJhdG9yQ2hhcmFjdGVyLCAxKSk7CisgICAgU3RyaW5nIHNlcGFyYXRv
clN0cmluZygmU2VwYXJhdG9yQ2hhcmFjdGVyLCAxKTsKIAogICAgIGlmIChtX2VuY29kZWRIb3N0
LmlzRW1wdHkoKSkKICAgICAgICAgbV9lbmNvZGVkSG9zdCA9IGVuY29kZWRIb3N0KG1faG9zdCk7
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA1
NjI0MykKKysrIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDgsNiArNDgsNyBAQCBTUUxpdGVEYXRhYmFzZTo6U1FMaXRlRGF0YWJhc2Uo
KQogICAgIDogbV9kYigwKQogICAgICwgbV9wYWdlU2l6ZSgtMSkKICAgICAsIG1fdHJhbnNhY3Rp
b25JblByb2dyZXNzKGZhbHNlKQorICAgICwgbV9zaGFyYWJsZShmYWxzZSkKICAgICAsIG1fb3Bl
bmluZ1RocmVhZCgwKQogewogfQpAQCAtMjUyLDYgKzI1MywxOCBAQCBjb25zdCBjaGFyKiBTUUxp
dGVEYXRhYmFzZTo6bGFzdEVycm9yTXNnCiAgICAgcmV0dXJuIHNxbGl0ZTNfZXJybXNnKG1fZGIp
OwogfQogCisjaWZuZGVmIE5ERUJVRwordm9pZCBTUUxpdGVEYXRhYmFzZTo6ZGlzYWJsZVRocmVh
ZGluZ0NoZWNrcygpCit7CisgICAgLy8gVGhpcyBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IFNRTGlz
dCB3YXMgY29tcGlsZWQgd2l0aCAtRFRIUkVBRFNBRkUsIG9yIHRoYXQgeW91IGhhdmVuJ3QgdHVy
bmVkIG9mZiB0aGUgbXV0ZXhlcy4KKyNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAw
MQorICAgIG1fc2hhcmFibGUgPSB0cnVlOworI2Vsc2UKKyAgICBBU1NFUlQoMCk7IC8vIFlvdXIg
U1FMaXRlIGRvZXNuJ3Qgc3VwcG9ydCBzaGFyaW5nIGhhbmRsZXMgYWNyb3NzIHRocmVhZHMuCisj
ZW5kaWYKK30KKyNlbmRpZgorCiBpbnQgU1FMaXRlRGF0YWJhc2U6OmF1dGhvcml6ZXJGdW5jdGlv
bih2b2lkKiB1c2VyRGF0YSwgaW50IGFjdGlvbkNvZGUsIGNvbnN0IGNoYXIqIHBhcmFtZXRlcjEs
IGNvbnN0IGNoYXIqIHBhcmFtZXRlcjIsIGNvbnN0IGNoYXIqIC8qZGF0YWJhc2VOYW1lKi8sIGNv
bnN0IGNoYXIqIC8qdHJpZ2dlcl9vcl92aWV3Ki8pCiB7CiAgICAgRGF0YWJhc2VBdXRob3JpemVy
KiBhdXRoID0gc3RhdGljX2Nhc3Q8RGF0YWJhc2VBdXRob3JpemVyKj4odXNlckRhdGEpOwpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCShyZXZpc2lvbiA1NjI0MykKKysr
IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTk3LDcgKzk3LDcgQEAgcHVibGljOgogICAgIGNvbnN0IGNoYXIqIGxhc3RFcnJvck1zZygpOwog
ICAgIAogICAgIHNxbGl0ZTMqIHNxbGl0ZTNIYW5kbGUoKSBjb25zdCB7Ci0gICAgICAgIEFTU0VS
VChjdXJyZW50VGhyZWFkKCkgPT0gbV9vcGVuaW5nVGhyZWFkKTsKKyAgICAgICAgQVNTRVJUKG1f
c2hhcmFibGUgfHwgY3VycmVudFRocmVhZCgpID09IG1fb3BlbmluZ1RocmVhZCk7CiAgICAgICAg
IHJldHVybiBtX2RiOwogICAgIH0KICAgICAKQEAgLTEwOCw2ICsxMDgsMTQgQEAgcHVibGljOgog
ICAgIHZvaWQgdW5sb2NrKCk7CiAgICAgYm9vbCBpc0F1dG9Db21taXRPbigpIGNvbnN0OwogCisg
ICAgLy8gU2V0IHRoaXMgZmxhZyB0byBhbGxvdyBhY2Nlc3MgZnJvbSBtdWx0aXBsZSB0aHJlYWRz
LiAgTm90IGFsbCBtdWx0aS10aHJlYWRlZCBhY2Nlc3NlcyBhcmUgc2FmZSEKKyAgICAvLyBTZWUg
aHR0cDovL3d3dy5zcWxpdGUub3JnL2N2c3RyYWMvd2lraT9wPU11bHRpVGhyZWFkaW5nIGZvciBt
b3JlIGluZm8uCisjaWZuZGVmIE5ERUJVRworICAgIHZvaWQgZGlzYWJsZVRocmVhZGluZ0NoZWNr
cygpOworI2Vsc2UKKyAgICB2b2lkIGRpc2FibGVUaHJlYWRpbmdDaGVja3MoKSB7fQorI2VuZGlm
CisKIHByaXZhdGU6CiAgICAgc3RhdGljIGludCBhdXRob3JpemVyRnVuY3Rpb24odm9pZCosIGlu
dCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOwog
CkBAIC0xMjAsNiArMTI4LDcgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wYWdlU2l6ZTsKICAgICAK
ICAgICBib29sIG1fdHJhbnNhY3Rpb25JblByb2dyZXNzOworICAgIGJvb2wgbV9zaGFyYWJsZTsK
ICAgICAKICAgICBNdXRleCBtX2F1dGhvcml6ZXJMb2NrOwogICAgIFJlZlB0cjxEYXRhYmFzZUF1
dGhvcml6ZXI+IG1fYXV0aG9yaXplcjsKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAkocmV2aXNpb24g
NTYyNDMpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zODksNiArMzg5LDEwIEBAIHZvaWQgRGF0YWJhc2U6Om1hcmtBc0RlbGV0ZWRBbmRDbG9zZSgp
CiAKICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPmRhdGFiYXNlVGhyZWFkKCktPnNjaGVk
dWxlSW1tZWRpYXRlVGFzayh0YXNrLnJlbGVhc2UoKSk7CiAgICAgc3luY2hyb25pemVyLndhaXRG
b3JUYXNrQ29tcGxldGlvbigpOworCisgICAgLy8gRGF0YWJhc2VDbG9zZVRhc2sgdGVsbHMgRGF0
YWJhc2U6OmNsb3NlIG5vdCB0byBkbyB0aGVzZSB0d28gcmVtb3ZhbHMgc28gdGhhdCB3ZSBjYW4g
ZG8gdGhlbSBoZXJlIHN5bmNocm9ub3VzbHkuCisgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0
LT5yZW1vdmVPcGVuRGF0YWJhc2UodGhpcyk7CisgICAgRGF0YWJhc2VUcmFja2VyOjp0cmFja2Vy
KCkucmVtb3ZlT3BlbkRhdGFiYXNlKHRoaXMpOwogfQogCiBjbGFzcyBDb250ZXh0UmVtb3ZlT3Bl
bkRhdGFiYXNlVGFzayA6IHB1YmxpYyBTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrIHsKQEAg
LTQxNSw3ICs0MTksNyBAQCBwcml2YXRlOgogICAgIFJlZlB0cjxEYXRhYmFzZT4gbV9kYXRhYmFz
ZTsKIH07CiAKLXZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKK3ZvaWQgRGF0YWJhc2U6OmNsb3NlKENs
b3NlUG9saWN5IHBvbGljeSkKIHsKICAgICBSZWZQdHI8RGF0YWJhc2U+IHByb3RlY3QgPSB0aGlz
OwogCkBAIC00NDQsNyArNDQ4LDggQEAgdm9pZCBEYXRhYmFzZTo6Y2xvc2UoKQogICAgIH0KIAog
ICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+ZGF0YWJhc2VUaHJlYWQoKS0+dW5zY2hlZHVs
ZURhdGFiYXNlVGFza3ModGhpcyk7Ci0gICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5wb3N0
VGFzayhDb250ZXh0UmVtb3ZlT3BlbkRhdGFiYXNlVGFzazo6Y3JlYXRlKHRoaXMpKTsKKyAgICBp
ZiAocG9saWN5ID09IFJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQpCisgICAgICAgIG1fc2NyaXB0
RXhlY3V0aW9uQ29udGV4dC0+cG9zdFRhc2soQ29udGV4dFJlbW92ZU9wZW5EYXRhYmFzZVRhc2s6
OmNyZWF0ZSh0aGlzKSk7CiB9CiAKIHZvaWQgRGF0YWJhc2U6OnN0b3AoKQpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFi
YXNlLmgJKHJldmlzaW9uIDU2MjQzKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTEwOSw3ICsxMDksOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBtYXJrQXNE
ZWxldGVkQW5kQ2xvc2UoKTsKICAgICBib29sIGRlbGV0ZWQoKSBjb25zdCB7IHJldHVybiBtX2Rl
bGV0ZWQ7IH0KIAotICAgIHZvaWQgY2xvc2UoKTsKKyAgICBlbnVtIENsb3NlUG9saWN5IHsgRG9O
b3RSZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0LCBSZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0IH07
CisgICAgdm9pZCBjbG9zZShDbG9zZVBvbGljeSk7CiAgICAgYm9vbCBvcGVuZWQoKSBjb25zdCB7
IHJldHVybiBtX29wZW5lZDsgfQogCiAgICAgdm9pZCBzdG9wKCk7CkluZGV4OiBXZWJDb3JlL3N0
b3JhZ2UvRGF0YWJhc2VEZXRhaWxzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0Rh
dGFiYXNlRGV0YWlscy5oCShyZXZpc2lvbiA1NjI0MykKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRh
YmFzZURldGFpbHMuaAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsOSBAQCBwdWJsaWM6CiAg
ICAgICAgIDogbV9leHBlY3RlZFVzYWdlKDApCiAgICAgICAgICwgbV9jdXJyZW50VXNhZ2UoMCkK
ICAgICB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICBtX3RocmVhZCA9IGN1cnJlbnRUaHJlYWQo
KTsKKyNlbmRpZgogICAgIH0KIAogICAgIERhdGFiYXNlRGV0YWlscyhjb25zdCBTdHJpbmcmIGRh
dGFiYXNlTmFtZSwgY29uc3QgU3RyaW5nJiBkaXNwbGF5TmFtZSwgdW5zaWduZWQgbG9uZyBsb25n
IGV4cGVjdGVkVXNhZ2UsIHVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyZW50VXNhZ2UpCkBAIC00OSwx
OSArNTIsMjcgQEAgcHVibGljOgogICAgICAgICAsIG1fZXhwZWN0ZWRVc2FnZShleHBlY3RlZFVz
YWdlKQogICAgICAgICAsIG1fY3VycmVudFVzYWdlKGN1cnJlbnRVc2FnZSkKICAgICB7CisjaWZu
ZGVmIE5ERUJVRworICAgICAgICBtX3RocmVhZCA9IGN1cnJlbnRUaHJlYWQoKTsKKyNlbmRpZgog
ICAgIH0KIAogICAgIGNvbnN0IFN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsg
fQogICAgIGNvbnN0IFN0cmluZyYgZGlzcGxheU5hbWUoKSBjb25zdCB7IHJldHVybiBtX2Rpc3Bs
YXlOYW1lOyB9CiAgICAgdW5zaWduZWQgbG9uZyBsb25nIGV4cGVjdGVkVXNhZ2UoKSBjb25zdCB7
IHJldHVybiBtX2V4cGVjdGVkVXNhZ2U7IH0KICAgICB1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVu
dFVzYWdlKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50VXNhZ2U7IH0KKyNpZm5kZWYgTkRFQlVH
CisgICAgVGhyZWFkSWRlbnRpZmllciB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtX3RocmVhZDsg
fQorI2VuZGlmCiAKIHByaXZhdGU6CiAgICAgU3RyaW5nIG1fbmFtZTsKICAgICBTdHJpbmcgbV9k
aXNwbGF5TmFtZTsKICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbV9leHBlY3RlZFVzYWdlOwogICAg
IHVuc2lnbmVkIGxvbmcgbG9uZyBtX2N1cnJlbnRVc2FnZTsKLQorI2lmbmRlZiBOREVCVUcKKyAg
ICBUaHJlYWRJZGVudGlmaWVyIG1fdGhyZWFkOworI2VuZGlmCiB9OwogCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUYXNrLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUYXNrLmNwcAkocmV2aXNpb24gNTYyNDMp
CisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUYXNrLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTE3LDcgKzExNyw4IEBAIERhdGFiYXNlQ2xvc2VUYXNrOjpEYXRhYmFzZUNsb3NlVGFzayhEYXQK
IAogdm9pZCBEYXRhYmFzZUNsb3NlVGFzazo6ZG9QZXJmb3JtVGFzaygpCiB7Ci0gICAgZGF0YWJh
c2UoKS0+Y2xvc2UoKTsKKyAgICAvLyBUZWxsIHRoZSBkYXRhYmFzZSBub3QgdG8gY2FsbCBiYWNr
IHRvIHRoZSBjb250ZXh0IHRocmVhZDsgd2UnbGwgaGFuZGxlIGl0LgorICAgIGRhdGFiYXNlKCkt
PmNsb3NlKERhdGFiYXNlOjpEb05vdFJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQpOwogfQogCiAj
aWZuZGVmIE5ERUJVRwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwCShyZXZpc2lv
biA1NjI0MykKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTExMyw3ICsxMTMsNyBAQCB2b2lkKiBEYXRhYmFzZVRocmVhZDo6ZGF0YWJhc2VU
aHJlYWQoKQogICAgICAgICBvcGVuU2V0Q29weS5zd2FwKG1fb3BlbkRhdGFiYXNlU2V0KTsKICAg
ICAgICAgRGF0YWJhc2VTZXQ6Oml0ZXJhdG9yIGVuZCA9IG9wZW5TZXRDb3B5LmVuZCgpOwogICAg
ICAgICBmb3IgKERhdGFiYXNlU2V0OjppdGVyYXRvciBpdCA9IG9wZW5TZXRDb3B5LmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgICAgKCppdCktPmNsb3NlKCk7CisgICAgICAgICAg
ICgqaXQpLT5jbG9zZShEYXRhYmFzZTo6UmVtb3ZlRGF0YWJhc2VGcm9tQ29udGV4dCk7CiAgICAg
fQogCiAgICAgLy8gRGV0YWNoIHRoZSB0aHJlYWQgc28gaXRzIHJlc291cmNlcyBhcmUgbm8gbG9u
Z2VyIG9mIGFueSBjb25jZXJuIHRvIGFueW9uZSBlbHNlCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VUcmFja2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2VUcmFja2VyLmNwcAkocmV2aXNpb24gNTYyNDMpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2VUcmFja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTEsMTMgKzUxLDE5IEBAIHVzaW5nIG5h
bWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotT3JpZ2luUXVvdGFNYW5hZ2Vy
JiBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlcigpCitPcmlnaW5RdW90YU1hbmFn
ZXImIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkKIHsKLSAgICBw
b3B1bGF0ZU9yaWdpbnMoKTsKICAgICBBU1NFUlQobV9xdW90YU1hbmFnZXIpOwogICAgIHJldHVy
biAqbV9xdW90YU1hbmFnZXI7CiB9CiAKK09yaWdpblF1b3RhTWFuYWdlciYgRGF0YWJhc2VUcmFj
a2VyOjpvcmlnaW5RdW90YU1hbmFnZXIoKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFz
ZShtX2RhdGFiYXNlR3VhcmQpOworICAgIHBvcHVsYXRlT3JpZ2lucygpOworICAgIHJldHVybiBv
cmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKTsKK30KKwogRGF0YWJhc2VUcmFja2VyJiBEYXRhYmFz
ZVRyYWNrZXI6OnRyYWNrZXIoKQogewogICAgIERFRklORV9TVEFUSUNfTE9DQUwoRGF0YWJhc2VU
cmFja2VyLCB0cmFja2VyLCAoKSk7CkBAIC02NiwzNiArNzIsMzAgQEAgRGF0YWJhc2VUcmFja2Vy
JiBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZQogCiBEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJh
Y2tlcigpCiAgICAgOiBtX2NsaWVudCgwKQotICAgICwgbV9wcm9wb3NlZERhdGFiYXNlKDApCi0j
aWZuZGVmIE5ERUJVRwotICAgICwgbV90aHJlYWQoY3VycmVudFRocmVhZCgpKQotI2VuZGlmCiB7
CiAgICAgU1FMaXRlRmlsZVN5c3RlbTo6cmVnaXN0ZXJTUUxpdGVWRlMoKTsKIH0KIAogdm9pZCBE
YXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGlyZWN0b3J5UGF0aChjb25zdCBTdHJpbmcmIHBh
dGgpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAgTXV0
ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAgICAgQVNTRVJUKCFtX2Rh
dGFiYXNlLmlzT3BlbigpKTsKLSAgICBtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aCA9IHBhdGg7Cisg
ICAgbV9kYXRhYmFzZURpcmVjdG9yeVBhdGggPSBwYXRoLnRocmVhZHNhZmVDb3B5KCk7CiB9CiAK
LWNvbnN0IFN0cmluZyYgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZURpcmVjdG9yeVBhdGgoKSBj
b25zdAorU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRoKCkgY29u
c3QKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLSAgICByZXR1
cm4gbV9kYXRhYmFzZURpcmVjdG9yeVBhdGg7CisgICAgcmV0dXJuIG1fZGF0YWJhc2VEaXJlY3Rv
cnlQYXRoLnRocmVhZHNhZmVDb3B5KCk7CiB9CiAKIFN0cmluZyBEYXRhYmFzZVRyYWNrZXI6OnRy
YWNrZXJEYXRhYmFzZVBhdGgoKSBjb25zdAogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkg
PT0gbV90aHJlYWQpOwogICAgIHJldHVybiBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFz
ZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLCAiRGF0YWJhc2VzLmRiIik7
CiB9CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpvcGVuVHJhY2tlckRhdGFiYXNlKGJvb2wgY3Jl
YXRlSWZEb2VzTm90RXhpc3QpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3Ro
cmVhZCk7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKIAogICAgIGlm
IChtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CkBAIC0xMDYsNjcgKzEwNiw5
OCBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzCiAKICAgICBpZiAo
IW1fZGF0YWJhc2Uub3BlbihkYXRhYmFzZVBhdGgpKSB7CiAgICAgICAgIC8vIEZJWE1FOiBXaGF0
IGRvIGRvIGhlcmU/CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2VQ
YXRoICVzLiIsIGRhdGFiYXNlUGF0aC5hc2NpaSgpLmRhdGEoKSk7CiAgICAgICAgIHJldHVybjsK
ICAgICB9CisgICAgbV9kYXRhYmFzZS5kaXNhYmxlVGhyZWFkaW5nQ2hlY2tzKCk7CiAgICAgaWYg
KCFtX2RhdGFiYXNlLnRhYmxlRXhpc3RzKCJPcmlnaW5zIikpIHsKICAgICAgICAgaWYgKCFtX2Rh
dGFiYXNlLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgT3JpZ2lucyAob3JpZ2luIFRFWFQg
VU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHF1b3RhIElOVEVHRVIgTk9UIE5VTEwgT04gQ09O
RkxJQ1QgRkFJTCk7IikpIHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBhbmQgaGVyZQorICAgICAg
ICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIE9yaWdpbnMgdGFibGUiKTsKICAgICAg
ICAgfQogICAgIH0KICAgICBpZiAoIW1fZGF0YWJhc2UudGFibGVFeGlzdHMoIkRhdGFiYXNlcyIp
KSB7CiAgICAgICAgIGlmICghbV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxF
IERhdGFiYXNlcyAoZ3VpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsIG9yaWdp
biBURVhULCBuYW1lIFRFWFQsIGRpc3BsYXlOYW1lIFRFWFQsIGVzdGltYXRlZFNpemUgSU5URUdF
UiwgcGF0aCBURVhUKTsiKSkgewogICAgICAgICAgICAgLy8gRklYTUU6IGFuZCBoZXJlCisgICAg
ICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgRGF0YWJhc2VzIHRhYmxlIik7CiAg
ICAgICAgIH0KICAgICB9CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpjYW5Fc3RhYmxpc2hE
YXRhYmFzZShTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0LCBjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1hdGVkU2l6
ZSkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBTZWN1
cml0eU9yaWdpbiogb3JpZ2luID0gY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBQcm9w
b3NlZERhdGFiYXNlIGRldGFpbHM7CiAKLSAgICAvLyBQb3B1bGF0ZSB0aGUgb3JpZ2lucyBiZWZv
cmUgd2UgZXN0YWJsaXNoIGEgZGF0YWJhc2U7IHRoaXMgZ3VhcmFudGVlcyB0aGF0IHF1b3RhRm9y
T3JpZ2luCi0gICAgLy8gY2FuIHJ1biBvbiB0aGUgZGF0YWJhc2UgdGhyZWFkIGxhdGVyLgotICAg
IHBvcHVsYXRlT3JpZ2lucygpOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZXF1aXJlbWVudDsK
KyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcFVzYWdlOworICAgIHsKKyAgICAgICAgTG9ja2Vy
PE9yaWdpblF1b3RhTWFuYWdlcj4gbG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAgICAg
ICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAKLSAgICBTZWN1
cml0eU9yaWdpbiogb3JpZ2luID0gY29udGV4dC0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICAgICAg
aWYgKCFjYW5DcmVhdGVEYXRhYmFzZShvcmlnaW4sIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwogCi0gICAgLy8gU2luY2Ugd2UncmUgaW1taW5lbnRseSBvcGVuaW5nIGEgZGF0YWJh
c2Ugd2l0aGluIHRoaXMgY29udGV4dCdzIG9yaWdpbiwgbWFrZSBzdXJlIHRoaXMgb3JpZ2luIGlz
IGJlaW5nIHRyYWNrZWQgYnkgdGhlIFF1b3RhVHJhY2tlcgotICAgIC8vIGJ5IGZldGNoaW5nIGl0
J3MgY3VycmVudCB1c2FnZSBub3cKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgdXNhZ2UgPSB1c2Fn
ZUZvck9yaWdpbihvcmlnaW4pOworICAgICAgICByZWNvcmRDcmVhdGluZ0RhdGFiYXNlKG9yaWdp
biwgbmFtZSk7CiAKLSAgICAvLyBJZiBhIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLCBpZ25vcmUg
dGhlIHBhc3NlZC1pbiBlc3RpbWF0ZWQgc2l6ZSBhbmQgc2F5IGl0J3MgT0suCi0gICAgaWYgKGhh
c0VudHJ5Rm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIHBvcHVsYXRlT3JpZ2lucygpOwogCi0gICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdpbGwg
Zml0LCBhbGxvdyBpdHMgY3JlYXRpb24uCi0gICAgdW5zaWduZWQgbG9uZyBsb25nIHJlcXVpcmVt
ZW50ID0gdXNhZ2UgKyBtYXgoMVVMLCBlc3RpbWF0ZWRTaXplKTsKLSAgICBpZiAocmVxdWlyZW1l
bnQgPCB1c2FnZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJZiB0aGUgZXN0aW1hdGVkIHNp
emUgaXMgc28gYmlnIGl0IGNhdXNlcyBhbiBvdmVyZmxvdywgZG9uJ3QgYWxsb3cgY3JlYXRpb24u
Ci0gICAgaWYgKHJlcXVpcmVtZW50IDw9IHF1b3RhRm9yT3JpZ2luKG9yaWdpbikpCi0gICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbW1pbmVudGx5IG9wZW5pbmcg
YSBkYXRhYmFzZSB3aXRoaW4gdGhpcyBjb250ZXh0J3Mgb3JpZ2luLCBtYWtlIHN1cmUgdGhpcyBv
cmlnaW4gaXMgYmVpbmcgdHJhY2tlZCBieSB0aGUgUXVvdGFUcmFja2VyCisgICAgICAgIC8vIGJ5
IGZldGNoaW5nIGl0cyBjdXJyZW50IHVzYWdlIG5vdy4KKyAgICAgICAgdW5zaWduZWQgbG9uZyBs
b25nIHVzYWdlID0gdXNhZ2VGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKKworICAgICAgICAvLyBJ
ZiBhIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLCBpZ25vcmUgdGhlIHBhc3NlZC1pbiBlc3RpbWF0
ZWQgc2l6ZSBhbmQgc2F5IGl0J3MgT0suCisgICAgICAgIGlmIChoYXNFbnRyeUZvckRhdGFiYXNl
KG9yaWdpbiwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIC8vIEdpdmUg
dGhlIGNocm9tZSBjbGllbnQgYSBjaGFuY2UgdG8gaW5jcmVhc2UgdGhlIHF1b3RhLgotICAgIC8v
IFRlbXBvcmFyaWx5IG1ha2UgdGhlIGRldGFpbHMgb2YgdGhlIHByb3Bvc2VkIGRhdGFiYXNlIGF2
YWlsYWJsZSwgc28gdGhlIGNsaWVudCBjYW4gZ2V0IGF0IHRoZW0uCi0gICAgcGFpcjxTZWN1cml0
eU9yaWdpbiosIERhdGFiYXNlRGV0YWlscz4gZGV0YWlscyhvcmlnaW4sIERhdGFiYXNlRGV0YWls
cyhuYW1lLCBkaXNwbGF5TmFtZSwgZXN0aW1hdGVkU2l6ZSwgMCkpOwotICAgIG1fcHJvcG9zZWRE
YXRhYmFzZSA9ICZkZXRhaWxzOworICAgICAgICAvLyBJZiB0aGUgZGF0YWJhc2Ugd2lsbCBmaXQs
IGFsbG93IGl0cyBjcmVhdGlvbi4KKyAgICAgICAgcmVxdWlyZW1lbnQgPSB1c2FnZSArIG1heCgx
VUwsIGVzdGltYXRlZFNpemUpOworICAgICAgICB0ZW1wVXNhZ2UgPSB1c2FnZTsKKyAgICAgICAg
aWYgKHJlcXVpcmVtZW50IDwgdXNhZ2UpIHsKKyAgICAgICAgICAgIGRvbmVDcmVhdGluZ0RhdGFi
YXNlKG9yaWdpbiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIElmIHRoZSBl
c3RpbWF0ZWQgc2l6ZSBpcyBzbyBiaWcgaXQgY2F1c2VzIGFuIG92ZXJmbG93LCBkb24ndCBhbGxv
dyBjcmVhdGlvbi4KKyAgICAgICAgfQorICAgICAgICBpZiAocmVxdWlyZW1lbnQgPD0gcXVvdGFG
b3JPcmlnaW5Ob0xvY2sob3JpZ2luKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
ICAgIC8vIEdpdmUgdGhlIGNocm9tZSBjbGllbnQgYSBjaGFuY2UgdG8gaW5jcmVhc2UgdGhlIHF1
b3RhLgorICAgICAgICAvLyBUZW1wb3JhcmlseSBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBwcm9w
b3NlZCBkYXRhYmFzZSBhdmFpbGFibGUsIHNvIHRoZSBjbGllbnQgY2FuIGdldCBhdCB0aGVtLgor
ICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSBqdXN0IHBhc3MgdGhlIGRldGFpbHMg
aW50byB0aGlzIGNhbGwsIHJhdGhlciB0aGFuIHVzaW5nIG1fcHJvcG9zZWREYXRhYmFzZXMuCisg
ICAgICAgIGRldGFpbHMgPSBQcm9wb3NlZERhdGFiYXNlKG9yaWdpbi0+dGhyZWFkc2FmZUNvcHko
KSwgRGF0YWJhc2VEZXRhaWxzKG5hbWUudGhyZWFkc2FmZUNvcHkoKSwgZGlzcGxheU5hbWUudGhy
ZWFkc2FmZUNvcHkoKSwgZXN0aW1hdGVkU2l6ZSwgMCkpOworICAgICAgICBtX3Byb3Bvc2VkRGF0
YWJhc2VzLmFkZCgmZGV0YWlscyk7CisgICAgfQorICAgIC8vIERyb3AgYWxsIGxvY2tzIGJlZm9y
ZSBjYWxsaW5nIG91dDsgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZXknbGwgZG8uCiAgICAgY29udGV4
dC0+ZGF0YWJhc2VFeGNlZWRlZFF1b3RhKG5hbWUpOwotICAgIG1fcHJvcG9zZWREYXRhYmFzZSA9
IDA7CisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1
YXJkKTsKKyAgICAgICAgbV9wcm9wb3NlZERhdGFiYXNlcy5yZW1vdmUoJmRldGFpbHMpOworICAg
IH0KIAogICAgIC8vIElmIHRoZSBkYXRhYmFzZSB3aWxsIGZpdCBub3csIGFsbG93IGl0cyBjcmVh
dGlvbi4KLSAgICByZXR1cm4gcmVxdWlyZW1lbnQgPD0gcXVvdGFGb3JPcmlnaW4ob3JpZ2luKTsK
KyAgICBpZiAocmVxdWlyZW1lbnQgPD0gcXVvdGFGb3JPcmlnaW4ob3JpZ2luKSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBkb25lQ3JlYXRpbmdEYXRhYmFzZShvcmlnaW4sIG5hbWUpOwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9y
T3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCit7CisgICAgQVNTRVJUKCFtX2Rh
dGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQobV9xdW90YU1hcCk7CisgICAgcmV0
dXJuIG1fcXVvdGFNYXAtPmNvbnRhaW5zKG9yaWdpbik7CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFj
a2VyOjpoYXNFbnRyeUZvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFT
U0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAgIE11dGV4TG9ja2VyIGxvY2tE
YXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogICAgIHBvcHVsYXRlT3JpZ2lucygpOwotICAgIE11
dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3RhTWFwR3VhcmQpOwotICAgIHJldHVybiBtX3F1
b3RhTWFwLT5jb250YWlucyhvcmlnaW4pOworICAgIHJldHVybiBoYXNFbnRyeUZvck9yaWdpbk5v
TG9jayhvcmlnaW4pOwogfQogCiBib29sIERhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JEYXRh
YmFzZShTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlSWRlbnRp
ZmllcikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBB
U1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOwogICAgIG9wZW5UcmFja2VyRGF0YWJh
c2UoZmFsc2UpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJu
IGZhbHNlOwpAQCAtMTkzLDE2ICsyMjQsMTcgQEAgdW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNl
VHJhY2tlcjo6Z2V0TQogCiBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5QYXRoKFNlY3Vy
aXR5T3JpZ2luKiBvcmlnaW4pIGNvbnN0CiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9
PSBtX3RocmVhZCk7Ci0gICAgcmV0dXJuIFNRTGl0ZUZpbGVTeXN0ZW06OmFwcGVuZERhdGFiYXNl
RmlsZU5hbWVUb1BhdGgobV9kYXRhYmFzZURpcmVjdG9yeVBhdGgsIG9yaWdpbi0+ZGF0YWJhc2VJ
ZGVudGlmaWVyKCkpOworICAgIHJldHVybiBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFz
ZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLnRocmVhZHNhZmVDb3B5KCks
IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwogfQogCi1TdHJpbmcgRGF0YWJhc2VUcmFj
a2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0
cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZk5vdEV4aXN0cykKK1N0cmluZyBEYXRhYmFzZVRyYWNr
ZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29u
c3QgU3RyaW5nJiBuYW1lLCBib29sIGNyZWF0ZUlmTm90RXhpc3RzKQogewotICAgIEFTU0VSVChj
dXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJk
LnRyeUxvY2soKSk7CisgICAgQVNTRVJUKCFvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cnlM
b2NrKCkpOwogCi0gICAgaWYgKG1fcHJvcG9zZWREYXRhYmFzZSAmJiBtX3Byb3Bvc2VkRGF0YWJh
c2UtPmZpcnN0ID09IG9yaWdpbiAmJiBtX3Byb3Bvc2VkRGF0YWJhc2UtPnNlY29uZC5uYW1lKCkg
PT0gbmFtZSkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIGZvciAoSGFzaFNldDxQcm9w
b3NlZERhdGFiYXNlKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX3Byb3Bvc2VkRGF0YWJhc2VzLmJlZ2lu
KCk7IGl0ZXIgIT0gbV9wcm9wb3NlZERhdGFiYXNlcy5lbmQoKTsgKytpdGVyKQorICAgICAgICBp
ZiAoKCppdGVyKS0+Zmlyc3QgPT0gb3JpZ2luICYmICgqaXRlciktPnNlY29uZC5uYW1lKCkgPT0g
bmFtZSkKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKIAogICAgIFN0cmluZyBvcmlnaW5J
ZGVudGlmaWVyID0gb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKTsKICAgICBTdHJpbmcgb3Jp
Z2luUGF0aCA9IHRoaXMtPm9yaWdpblBhdGgob3JpZ2luKTsKQEAgLTIxMiw3ICsyNDQsNiBAQCBT
dHJpbmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiCiAgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKIAogICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGEgcGF0aCBmb3IgdGhpcyBkYXRhYmFz
ZSB5ZXQKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJh
c2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKICAgICBTUUxpdGVTdGF0ZW1l
bnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1QgcGF0aCBGUk9NIERhdGFiYXNlcyBXSEVS
RSBvcmlnaW49PyBBTkQgbmFtZT0/OyIpOwpAQCAtMjMxLDM2ICsyNjIsNDIgQEAgU3RyaW5nIERh
dGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYgogICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CiAKICAgICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdERvbmUpIHsKLSAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gcmV0cmlldmUgZmlsZW5hbWUgZnJvbSBEYXRhYmFzZSBUcmFja2VyIGZvciBv
cmlnaW4gJXMsIG5hbWUgJXMiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCku
ZGF0YSgpLCBuYW1lLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQg
dG8gcmV0cmlldmUgZmlsZW5hbWUgZnJvbSBEYXRhYmFzZSBUcmFja2VyIGZvciBvcmlnaW4gJXMs
IG5hbWUgJXMiLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpLCBuYW1lLmFzY2lpKCku
ZGF0YSgpKTsKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwogICAgIH0KICAgICBzdGF0ZW1lbnQu
ZmluYWxpemUoKTsKIAotICAgIFN0cmluZyBmaWxlTmFtZSA9IFNRTGl0ZUZpbGVTeXN0ZW06Omdl
dEZpbGVOYW1lRm9yTmV3RGF0YWJhc2Uob3JpZ2luUGF0aCwgbmFtZSwgb3JpZ2luLT5kYXRhYmFz
ZUlkZW50aWZpZXIoKSwgJm1fZGF0YWJhc2UpOworICAgIFN0cmluZyBmaWxlTmFtZSA9IFNRTGl0
ZUZpbGVTeXN0ZW06OmdldEZpbGVOYW1lRm9yTmV3RGF0YWJhc2Uob3JpZ2luUGF0aCwgbmFtZSwg
b3JpZ2luSWRlbnRpZmllciwgJm1fZGF0YWJhc2UpOwogICAgIGlmICghYWRkRGF0YWJhc2Uob3Jp
Z2luLCBuYW1lLCBmaWxlTmFtZSkpCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKIAogICAgIC8v
IElmIHRoaXMgb3JpZ2luJ3MgcXVvdGEgaXMgYmVpbmcgdHJhY2tlZCAob3BlbiBoYW5kbGUgdG8g
YSBkYXRhYmFzZSBpbiB0aGlzIG9yaWdpbiksIGFkZCB0aGlzIG5ldyBkYXRhYmFzZQogICAgIC8v
IHRvIHRoZSBxdW90YSBtYW5hZ2VyIG5vdwogICAgIFN0cmluZyBmdWxsRmlsZVBhdGggPSBTUUxp
dGVGaWxlU3lzdGVtOjphcHBlbmREYXRhYmFzZUZpbGVOYW1lVG9QYXRoKG9yaWdpblBhdGgsIGZp
bGVOYW1lKTsKLSAgICB7Ci0gICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IGxvY2tl
cihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Ci0gICAgICAgIGlmIChvcmlnaW5RdW90YU1hbmFnZXIo
KS50cmFja3NPcmlnaW4ob3JpZ2luKSkKLSAgICAgICAgICAgIG9yaWdpblF1b3RhTWFuYWdlcigp
LmFkZERhdGFiYXNlKG9yaWdpbiwgbmFtZSwgZnVsbEZpbGVQYXRoKTsKLSAgICB9CisgICAgaWYg
KG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrc09yaWdpbihvcmlnaW4pKQorICAgICAg
ICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5hZGREYXRhYmFzZShvcmlnaW4sIG5hbWUsIGZ1
bGxGaWxlUGF0aCk7CiAKICAgICByZXR1cm4gZnVsbEZpbGVQYXRoOwogfQogCitTdHJpbmcgRGF0
YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4s
IGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZk5vdEV4aXN0cykKK3sKKyAgICBMb2Nr
ZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBsb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAg
IE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgIHBvcHVsYXRl
T3JpZ2lucygpOworCisgICAgcmV0dXJuIGZ1bGxQYXRoRm9yRGF0YWJhc2VOb0xvY2sob3JpZ2lu
LCBuYW1lLCBjcmVhdGVJZk5vdEV4aXN0cykudGhyZWFkc2FmZUNvcHkoKTsKK30KKwogdm9pZCBE
YXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3JpZ2lucygpCiB7CisgICAgQVNTRVJUKCFtX2RhdGFi
YXNlR3VhcmQudHJ5TG9jaygpKTsKICAgICBpZiAobV9xdW90YU1hcCkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0KICAgICBtX3F1
b3RhTWFwLnNldChuZXcgUXVvdGFNYXApOwotICAgIG1fcXVvdGFNYW5hZ2VyLnNldChuZXcgT3Jp
Z2luUXVvdGFNYW5hZ2VyKTsKKyAgICBpZiAoIW1fcXVvdGFNYW5hZ2VyKQorICAgICAgICBtX3F1
b3RhTWFuYWdlci5zZXQobmV3IE9yaWdpblF1b3RhTWFuYWdlcik7CiAKICAgICBvcGVuVHJhY2tl
ckRhdGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCkBAIC0yNjgs
MzAgKzMwNSwzMiBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cG9wdWxhdGVPcmlnaW5zKCkKIAog
ICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlNFTEVDVCBvcmlnaW4s
IHF1b3RhIEZST00gT3JpZ2lucyIpOwogCi0gICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0g
U1FMUmVzdWx0T2spCisgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2sp
IHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcHJlcGFyZSBzdGF0ZW1lbnQuIik7CiAg
ICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBpbnQgcmVzdWx0OwogICAgIHdoaWxlICgocmVz
dWx0ID0gc3RhdGVtZW50LnN0ZXAoKSkgPT0gU1FMUmVzdWx0Um93KSB7CiAgICAgICAgIFJlZlB0
cjxTZWN1cml0eU9yaWdpbj4gb3JpZ2luID0gU2VjdXJpdHlPcmlnaW46OmNyZWF0ZUZyb21EYXRh
YmFzZUlkZW50aWZpZXIoc3RhdGVtZW50LmdldENvbHVtblRleHQoMCkpOwotICAgICAgICBtX3F1
b3RhTWFwLT5zZXQob3JpZ2luLmdldCgpLCBzdGF0ZW1lbnQuZ2V0Q29sdW1uSW50NjQoMSkpOwor
ICAgICAgICBtX3F1b3RhTWFwLT5zZXQob3JpZ2luLmdldCgpLT50aHJlYWRzYWZlQ29weSgpLCBz
dGF0ZW1lbnQuZ2V0Q29sdW1uSW50NjQoMSkpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0g
U1FMUmVzdWx0RG9uZSkKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBpbiBhbGwg
b3JpZ2lucyBmcm9tIHRoZSBkYXRhYmFzZSIpOworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0
byByZWFkIGluIGFsbCBvcmlnaW5zIGZyb20gdGhlIGRhdGFiYXNlLiIpOwogfQogCiB2b2lkIERh
dGFiYXNlVHJhY2tlcjo6b3JpZ2lucyhWZWN0b3I8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiA+JiBy
ZXN1bHQpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAg
TXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAgICAgcG9wdWxhdGVP
cmlnaW5zKCk7Ci0gICAgTXV0ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFyZCk7
CisgICAgQVNTRVJUKG1fcXVvdGFNYXApOwogICAgIGNvcHlLZXlzVG9WZWN0b3IoKm1fcXVvdGFN
YXAsIHJlc3VsdCk7CiB9CiAKLWJvb2wgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9y
T3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIFZlY3RvcjxTdHJpbmc+JiByZXN1bHRWZWN0
b3IpCitib29sIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayhT
ZWN1cml0eU9yaWdpbiogb3JpZ2luLCBWZWN0b3I8U3RyaW5nPiYgcmVzdWx0VmVjdG9yKQogewot
ICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAgIEFTU0VSVCghbV9k
YXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAgICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7
CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBA
IC0zMTUsNDQgKzM1NCw2NSBAQCBib29sIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zv
ck9yCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLURhdGFiYXNlRGV0YWlscyBEYXRhYmFzZVRyYWNr
ZXI6OmRldGFpbHNGb3JOYW1lQW5kT3JpZ2luKGNvbnN0IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlP
cmlnaW4qIG9yaWdpbikKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3Jp
Z2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIFZlY3RvcjxTdHJpbmc+JiByZXN1bHRWZWN0b3Ip
CiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAgTXV0ZXhM
b2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgVmVjdG9yPFN0cmluZz4g
dGVtcDsKKyAgICBpZiAoIWRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2sob3JpZ2luLCB0ZW1w
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKG1fcHJvcG9zZWREYXRhYmFzZSAm
JiBtX3Byb3Bvc2VkRGF0YWJhc2UtPmZpcnN0ID09IG9yaWdpbiAmJiBtX3Byb3Bvc2VkRGF0YWJh
c2UtPnNlY29uZC5uYW1lKCkgPT0gbmFtZSkKLSAgICAgICAgcmV0dXJuIG1fcHJvcG9zZWREYXRh
YmFzZS0+c2Vjb25kOworICAgIGZvciAoVmVjdG9yPFN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSB0
ZW1wLmJlZ2luKCk7IGl0ZXIgIT0gdGVtcC5lbmQoKTsgKytpdGVyKQorICAgICAgICByZXN1bHRW
ZWN0b3IuYXBwZW5kKGl0ZXItPnRocmVhZHNhZmVDb3B5KCkpOworICAgIHJldHVybiB0cnVlOwor
fQogCitEYXRhYmFzZURldGFpbHMgRGF0YWJhc2VUcmFja2VyOjpkZXRhaWxzRm9yTmFtZUFuZE9y
aWdpbihjb25zdCBTdHJpbmcmIG5hbWUsIFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCit7CiAgICAg
U3RyaW5nIG9yaWdpbklkZW50aWZpZXIgPSBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpOwor
ICAgIFN0cmluZyBkaXNwbGF5TmFtZTsKKyAgICBpbnQ2NF90IGV4cGVjdGVkVXNhZ2U7CiAKLSAg
ICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVu
KCkpCi0gICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKLSAgICBTUUxpdGVTdGF0ZW1l
bnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1QgZGlzcGxheU5hbWUsIGVzdGltYXRlZFNp
emUgRlJPTSBEYXRhYmFzZXMgV0hFUkUgb3JpZ2luPT8gQU5EIG5hbWU9PyIpOwotICAgIGlmIChz
dGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKQotICAgICAgICByZXR1cm4gRGF0YWJh
c2VEZXRhaWxzKCk7Ci0KLSAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmll
cik7Ci0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDIsIG5hbWUpOworICAgIHsKKyAgICAgICAgTXV0
ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CiAKLSAgICBpbnQgcmVzdWx0
ID0gc3RhdGVtZW50LnN0ZXAoKTsKLSAgICBpZiAocmVzdWx0ID09IFNRTFJlc3VsdERvbmUpCi0g
ICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFBy
b3Bvc2VkRGF0YWJhc2UqPjo6aXRlcmF0b3IgaXRlciA9IG1fcHJvcG9zZWREYXRhYmFzZXMuYmVn
aW4oKTsgaXRlciAhPSBtX3Byb3Bvc2VkRGF0YWJhc2VzLmVuZCgpOyArK2l0ZXIpCisgICAgICAg
ICAgICBpZiAoKCppdGVyKS0+Zmlyc3QgPT0gb3JpZ2luICYmICgqaXRlciktPnNlY29uZC5uYW1l
KCkgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgIEFTU0VSVCgoKml0ZXIpLT5zZWNvbmQudGhy
ZWFkKCkgPT0gY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCppdGVy
KS0+c2Vjb25kOworICAgICAgICAgICAgfQogCi0gICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHRS
b3cpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZXRyaWV2aW5nIGRldGFpbHMgZm9yIGRh
dGFiYXNlICVzIGluIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIgZGF0YWJhc2UiLCBuYW1lLmFzY2lp
KCkuZGF0YSgpLCBvcmlnaW5JZGVudGlmaWVyLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0
dXJuIERhdGFiYXNlRGV0YWlscygpOworICAgICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNl
KTsKKyAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICAgICAgcmV0dXJu
IERhdGFiYXNlRGV0YWlscygpOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1f
ZGF0YWJhc2UsICJTRUxFQ1QgZGlzcGxheU5hbWUsIGVzdGltYXRlZFNpemUgRlJPTSBEYXRhYmFz
ZXMgV0hFUkUgb3JpZ2luPT8gQU5EIG5hbWU9PyIpOworICAgICAgICBpZiAoc3RhdGVtZW50LnBy
ZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKKyAgICAgICAgICAgIHJldHVybiBEYXRhYmFzZURldGFp
bHMoKTsKKworICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luSWRlbnRpZmllcik7
CisgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBuYW1lKTsKKworICAgICAgICBpbnQgcmVz
dWx0ID0gc3RhdGVtZW50LnN0ZXAoKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBTUUxSZXN1bHRE
b25lKQorICAgICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworCisgICAgICAgIGlm
IChyZXN1bHQgIT0gU1FMUmVzdWx0Um93KSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkVycm9y
IHJldHJpZXZpbmcgZGV0YWlscyBmb3IgZGF0YWJhc2UgJXMgaW4gb3JpZ2luICVzIGZyb20gdHJh
Y2tlciBkYXRhYmFzZSIsIG5hbWUuYXNjaWkoKS5kYXRhKCksIG9yaWdpbklkZW50aWZpZXIuYXNj
aWkoKS5kYXRhKCkpOworICAgICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscygpOworICAg
ICAgICB9CisgICAgICAgIGRpc3BsYXlOYW1lID0gc3RhdGVtZW50LmdldENvbHVtblRleHQoMCk7
CisgICAgICAgIGV4cGVjdGVkVXNhZ2UgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uSW50NjQoMSk7CiAg
ICAgfQogCi0gICAgcmV0dXJuIERhdGFiYXNlRGV0YWlscyhuYW1lLCBzdGF0ZW1lbnQuZ2V0Q29s
dW1uVGV4dCgwKSwgc3RhdGVtZW50LmdldENvbHVtbkludDY0KDEpLCB1c2FnZUZvckRhdGFiYXNl
KG5hbWUsIG9yaWdpbikpOworICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMobmFtZSwgZGlzcGxh
eU5hbWUsIGV4cGVjdGVkVXNhZ2UsIHVzYWdlRm9yRGF0YWJhc2UobmFtZSwgb3JpZ2luKSk7CiB9
CiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMoU2VjdXJpdHlPcmln
aW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1l
LCB1bnNpZ25lZCBsb25nIGVzdGltYXRlZFNpemUpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJl
YWQoKSA9PSBtX3RocmVhZCk7Ci0KICAgICBTdHJpbmcgb3JpZ2luSWRlbnRpZmllciA9IG9yaWdp
bi0+ZGF0YWJhc2VJZGVudGlmaWVyKCk7CiAgICAgaW50NjRfdCBndWlkID0gMDsKIAorICAgIE11
dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworCiAgICAgb3BlblRyYWNr
ZXJEYXRhYmFzZSh0cnVlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAg
IHJldHVybjsKQEAgLTQwMCw3ICs0NjAsNiBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0RGF0
YWJhc2VEZXRhaWxzCiAKIHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnVzYWdl
Rm9yRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBuYW1lLCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKQog
ewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwogICAgIFN0cmluZyBw
YXRoID0gZnVsbFBhdGhGb3JEYXRhYmFzZShvcmlnaW4sIG5hbWUsIGZhbHNlKTsKICAgICBpZiAo
cGF0aC5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNDIyLDE4ICs0ODEsMjEgQEAg
dm9pZCBEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZShEYQogICAgIERhdGFiYXNlTmFt
ZU1hcCogbmFtZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQoZGF0YWJhc2UtPnNlY3VyaXR5
T3JpZ2luKCkpOwogICAgIGlmICghbmFtZU1hcCkgewogICAgICAgICBuYW1lTWFwID0gbmV3IERh
dGFiYXNlTmFtZU1hcDsKLSAgICAgICAgbV9vcGVuRGF0YWJhc2VNYXAtPnNldChkYXRhYmFzZS0+
c2VjdXJpdHlPcmlnaW4oKSwgbmFtZU1hcCk7CisgICAgICAgIG1fb3BlbkRhdGFiYXNlTWFwLT5z
ZXQoZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCktPnRocmVhZHNhZmVDb3B5KCksIG5hbWVNYXAp
OwogICAgIH0KIAogICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9IG5hbWVNYXAtPmdldChu
YW1lKTsKICAgICBpZiAoIWRhdGFiYXNlU2V0KSB7CiAgICAgICAgIGRhdGFiYXNlU2V0ID0gbmV3
IERhdGFiYXNlU2V0OwotICAgICAgICBuYW1lTWFwLT5zZXQobmFtZSwgZGF0YWJhc2VTZXQpOwor
ICAgICAgICBuYW1lTWFwLT5zZXQobmFtZS50aHJlYWRzYWZlQ29weSgpLCBkYXRhYmFzZVNldCk7
CiAgICAgfQogCiAgICAgZGF0YWJhc2VTZXQtPmFkZChkYXRhYmFzZSk7CiAKICAgICBMT0coU3Rv
cmFnZUFQSSwgIkFkZGVkIG9wZW4gRGF0YWJhc2UgJXMgKCVwKVxuIiwgZGF0YWJhc2UtPnN0cmlu
Z0lkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSwgZGF0YWJhc2UpOworCisgICAgTXV0ZXhMb2Nr
ZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgZG9uZUNyZWF0aW5nRGF0YWJh
c2UoZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCksIGRhdGFiYXNlLT5zdHJpbmdJZGVudGlmaWVy
KCkpOwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlKERhdGFi
YXNlKiBkYXRhYmFzZSkKQEAgLTQ0MSw2ICs1MDMsOCBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6
cmVtb3ZlT3BlbkRhdGFiYXNlCiAgICAgaWYgKCFkYXRhYmFzZSkKICAgICAgICAgcmV0dXJuOwog
CisgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdp
blF1b3RhTWFuYWdlcigpKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFz
ZUd1YXJkKTsKICAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFi
YXNlTWFwR3VhcmQpOwogCiAgICAgaWYgKCFtX29wZW5EYXRhYmFzZU1hcCkgewpAQCAtNDc2LDYg
KzU0MCw3IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UKIAogICAg
IG1fb3BlbkRhdGFiYXNlTWFwLT5yZW1vdmUoZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpOwog
ICAgIGRlbGV0ZSBuYW1lTWFwOworICAgIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnJlbW92
ZU9yaWdpbihkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSk7CiB9CiAKIHZvaWQgRGF0YWJhc2VU
cmFja2VyOjpnZXRPcGVuRGF0YWJhc2VzKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0
cmluZyYgbmFtZSwgSGFzaFNldDxSZWZQdHI8RGF0YWJhc2U+ID4qIGRhdGFiYXNlcykKQEAgLTQ5
Niw5MiArNTYxLDEwMyBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6Z2V0T3BlbkRhdGFiYXNlcyhT
CiAgICAgICAgIGRhdGFiYXNlcy0+YWRkKCppdCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgbG9uZyBE
YXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yT3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCit1
bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbk5vTG9jayhT
ZWN1cml0eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0g
bV90aHJlYWQpOwotICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IGxvY2tlcihvcmlnaW5R
dW90YU1hbmFnZXIoKSk7CisgICAgQVNTRVJUKCFvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50
cnlMb2NrKCkpOwogCiAgICAgLy8gVXNlIHRoZSBPcmlnaW5RdW90YU1hbmFnZXIgbWVjaGFuaXNt
IHRvIGNhbGN1bGF0ZSB0aGUgdXNhZ2UKLSAgICBpZiAob3JpZ2luUXVvdGFNYW5hZ2VyKCkudHJh
Y2tzT3JpZ2luKG9yaWdpbikpCi0gICAgICAgIHJldHVybiBvcmlnaW5RdW90YU1hbmFnZXIoKS5k
aXNrVXNhZ2Uob3JpZ2luKTsKKyAgICBpZiAob3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkudHJh
Y2tzT3JpZ2luKG9yaWdpbikpCisgICAgICAgIHJldHVybiBvcmlnaW5RdW90YU1hbmFnZXJOb0xv
Y2soKS5kaXNrVXNhZ2Uob3JpZ2luKTsKIAogICAgIC8vIElmIHRoZSBPcmlnaW5RdW90YU1hbmFn
ZXIgZG9lc24ndCB0cmFjayB0aGlzIG9yaWdpbiBhbHJlYWR5LCBwcmltZSBpdCB0byBkbyBzbwot
ICAgIG9yaWdpblF1b3RhTWFuYWdlcigpLnRyYWNrT3JpZ2luKG9yaWdpbik7CisgICAgb3JpZ2lu
UXVvdGFNYW5hZ2VyTm9Mb2NrKCkudHJhY2tPcmlnaW4ob3JpZ2luKTsKIAogICAgIFZlY3RvcjxT
dHJpbmc+IG5hbWVzOwotICAgIGRhdGFiYXNlTmFtZXNGb3JPcmlnaW4ob3JpZ2luLCBuYW1lcyk7
CisgICAgZGF0YWJhc2VOYW1lc0Zvck9yaWdpbk5vTG9jayhvcmlnaW4sIG5hbWVzKTsKIAogICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYW1lcy5zaXplKCk7ICsraSkKLSAgICAgICAgb3Jp
Z2luUXVvdGFNYW5hZ2VyKCkuYWRkRGF0YWJhc2Uob3JpZ2luLCBuYW1lc1tpXSwgZnVsbFBhdGhG
b3JEYXRhYmFzZShvcmlnaW4sIG5hbWVzW2ldLCBmYWxzZSkpOworICAgICAgICBvcmlnaW5RdW90
YU1hbmFnZXJOb0xvY2soKS5hZGREYXRhYmFzZShvcmlnaW4sIG5hbWVzW2ldLCBmdWxsUGF0aEZv
ckRhdGFiYXNlTm9Mb2NrKG9yaWdpbiwgbmFtZXNbaV0sIGZhbHNlKSk7CiAKLSAgICBpZiAoIW9y
aWdpblF1b3RhTWFuYWdlcigpLnRyYWNrc09yaWdpbihvcmlnaW4pKQorICAgIGlmICghb3JpZ2lu
UXVvdGFNYW5hZ2VyTm9Mb2NrKCkudHJhY2tzT3JpZ2luKG9yaWdpbikpCiAgICAgICAgIHJldHVy
biAwOwotICAgIHJldHVybiBvcmlnaW5RdW90YU1hbmFnZXIoKS5kaXNrVXNhZ2Uob3JpZ2luKTsK
KyAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkuZGlza1VzYWdlKG9yaWdpbik7
Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yT3JpZ2lu
KFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCit7CisgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdl
cj4gbG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKworICAgIHJldHVybiB1c2FnZUZvck9y
aWdpbk5vTG9jayhvcmlnaW4pOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFj
a2VyOjpxdW90YUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKQoreworICAg
IEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgQVNTRVJUKG1fcXVvdGFN
YXApOworICAgIHJldHVybiBtX3F1b3RhTWFwLT5nZXQob3JpZ2luKTsKIH0KIAogdW5zaWduZWQg
bG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6cXVvdGFGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4q
IG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkIHx8IG1f
cXVvdGFNYXApOworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQp
OwogICAgIHBvcHVsYXRlT3JpZ2lucygpOwotICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcCht
X3F1b3RhTWFwR3VhcmQpOwotICAgIHJldHVybiBtX3F1b3RhTWFwLT5nZXQob3JpZ2luKTsKKyAg
ICByZXR1cm4gcXVvdGFGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKIH0KIAogdm9pZCBEYXRhYmFz
ZVRyYWNrZXI6OnNldFF1b3RhKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIHVuc2lnbmVkIGxvbmcg
bG9uZyBxdW90YSkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsK
LSAgICBpZiAocXVvdGFGb3JPcmlnaW4ob3JpZ2luKSA9PSBxdW90YSkKKyAgICBNdXRleExvY2tl
ciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKworICAgIHBvcHVsYXRlT3JpZ2lucygp
OworICAgIGlmIChxdW90YUZvck9yaWdpbk5vTG9jayhvcmlnaW4pID09IHF1b3RhKQogICAgICAg
ICByZXR1cm47CiAKICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKHRydWUpOwogICAgIGlmICghbV9k
YXRhYmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgewotICAgICAgICBNdXRl
eExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJkKTsKLQotICAgICAgICBpZiAoIW1f
cXVvdGFNYXAtPmNvbnRhaW5zKG9yaWdpbikpIHsKLSAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVu
dCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIklOU0VSVCBJTlRPIE9yaWdpbnMgVkFMVUVTICg/LCA/
KSIpOwotICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2sp
IHsKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2ggb3JpZ2lu
ICVzIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgp
LmRhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXRlbWVu
dC5iaW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKLSAgICAgICAgICAg
ICAgICBzdGF0ZW1lbnQuYmluZEludDY0KDIsIHF1b3RhKTsKLQotICAgICAgICAgICAgICAgIGlm
IChzdGF0ZW1lbnQuc3RlcCgpICE9IFNRTFJlc3VsdERvbmUpCi0gICAgICAgICAgICAgICAgICAg
IExPR19FUlJPUigiVW5hYmxlIHRvIGVzdGFibGlzaCBvcmlnaW4gJXMgaW4gdGhlIHRyYWNrZXIi
LCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAg
ICAgIH0KKyAgICBpZiAoIW1fcXVvdGFNYXAtPmNvbnRhaW5zKG9yaWdpbikpIHsKKyAgICAgICAg
U1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiSU5TRVJUIElOVE8gT3JpZ2lu
cyBWQUxVRVMgKD8sID8pIik7CisgICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNR
TFJlc3VsdE9rKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2gg
b3JpZ2luICVzIGluIHRoZSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5h
c2NpaSgpLmRhdGEoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTUUxpdGVTdGF0
ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJVUERBVEUgT3JpZ2lucyBTRVQgcXVvdGE9PyBX
SEVSRSBvcmlnaW49PyIpOwotICAgICAgICAgICAgYm9vbCBlcnJvciA9IHN0YXRlbWVudC5wcmVw
YXJlKCkgIT0gU1FMUmVzdWx0T2s7Ci0gICAgICAgICAgICBpZiAoIWVycm9yKSB7Ci0gICAgICAg
ICAgICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgxLCBxdW90YSk7Ci0gICAgICAgICAgICAgICAg
c3RhdGVtZW50LmJpbmRUZXh0KDIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOworICAg
ICAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVy
KCkpOworICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgyLCBxdW90YSk7CiAKLSAgICAg
ICAgICAgICAgICBlcnJvciA9ICFzdGF0ZW1lbnQuZXhlY3V0ZUNvbW1hbmQoKTsKLSAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuc3RlcCgpICE9IFNRTFJlc3VsdERvbmUp
CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9yaWdpbiAl
cyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5k
YXRhKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50
IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiVVBEQVRFIE9yaWdpbnMgU0VUIHF1b3RhPT8gV0hFUkUg
b3JpZ2luPT8iKTsKKyAgICAgICAgYm9vbCBlcnJvciA9IHN0YXRlbWVudC5wcmVwYXJlKCkgIT0g
U1FMUmVzdWx0T2s7CisgICAgICAgIGlmICghZXJyb3IpIHsKKyAgICAgICAgICAgIHN0YXRlbWVu
dC5iaW5kSW50NjQoMSwgcXVvdGEpOworICAgICAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDIs
IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwogCi0gICAgICAgICAgICBpZiAoZXJyb3Ip
Ci0gICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHF1b3RhICVsbHUgaW4g
dHJhY2tlciBkYXRhYmFzZSBmb3Igb3JpZ2luICVzIiwgcXVvdGEsIG9yaWdpbi0+ZGF0YWJhc2VJ
ZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgZXJyb3IgPSAhc3RhdGVt
ZW50LmV4ZWN1dGVDb21tYW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBGSVhNRTogSXMg
aXQgcmVhbGx5IE9LIHRvIHVwZGF0ZSB0aGUgcXVvdGEgaW4gbWVtb3J5IGlmIHdlIGZhaWxlZCB0
byB1cGRhdGUgaXQgb24gZGlzaz8KLSAgICAgICAgbV9xdW90YU1hcC0+c2V0KG9yaWdpbiwgcXVv
dGEpOworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0
byBzZXQgcXVvdGEgJWxsdSBpbiB0cmFja2VyIGRhdGFiYXNlIGZvciBvcmlnaW4gJXMiLCBxdW90
YSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CiAgICAgfQog
CisgICAgLy8gRklYTUU6IElzIGl0IHJlYWxseSBPSyB0byB1cGRhdGUgdGhlIHF1b3RhIGluIG1l
bW9yeSBpZiB3ZSBmYWlsZWQgdG8gdXBkYXRlIGl0IG9uIGRpc2s/CisgICAgbV9xdW90YU1hcC0+
c2V0KG9yaWdpbi0+dGhyZWFkc2FmZUNvcHkoKSwgcXVvdGEpOworCiAgICAgaWYgKG1fY2xpZW50
KQogICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlPcmlnaW4ob3JpZ2luKTsKIH0K
IAogYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmFkZERhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmln
aW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBwYXRoKQogewotICAgIEFTU0VS
VChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1
YXJkLnRyeUxvY2soKSk7CisgICAgQVNTRVJUKG1fcXVvdGFNYXApOwogICAgIG9wZW5UcmFja2Vy
RGF0YWJhc2UodHJ1ZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKICAgICAvLyBOZXcgZGF0YWJhc2Ugc2hvdWxkIG5ldmVyIGJlIGFkZGVk
IHVudGlsIHRoZSBvcmlnaW4gaGFzIGJlZW4gZXN0YWJsaXNoZWQKLSAgICBBU1NFUlQoaGFzRW50
cnlGb3JPcmlnaW4ob3JpZ2luKSk7CisgICAgQVNTRVJUKGhhc0VudHJ5Rm9yT3JpZ2luTm9Mb2Nr
KG9yaWdpbikpOwogCiAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAi
SU5TRVJUIElOVE8gRGF0YWJhc2VzIChvcmlnaW4sIG5hbWUsIHBhdGgpIFZBTFVFUyAoPywgPywg
Pyk7Iik7CiAKQEAgLTYwNSw4ICs2ODEsNiBAQCBib29sIERhdGFiYXNlVHJhY2tlcjo6YWRkRGF0
YWJhc2UoU2VjdXJpCiAKIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpkZWxldGVBbGxEYXRhYmFzZXMo
KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotCiAgICAgVmVj
dG9yPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gPiBvcmlnaW5zQ29weTsKICAgICBvcmlnaW5zKG9y
aWdpbnNDb3B5KTsKIApAQCAtNjE0LDE5ICs2ODgsMzAgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6
OmRlbGV0ZUFsbERhdGFiYXNlcwogICAgICAgICBkZWxldGVPcmlnaW4ob3JpZ2luc0NvcHlbaV0u
Z2V0KCkpOwogfQogCisvLyBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFr
ZSBzdXJlIHRoYXQgbm9ib2R5IGlzIHRyeWluZyB0byBjcmVhdGUsIGRlbGV0ZSwgb3Blbiwgb3Ig
Y2xvc2UgZGF0YWJhc2VzIGluIHRoaXMgb3JpZ2luIHdoaWxlIHRoZSBkZWxldGlvbiBpcworLy8g
dGFraW5nIHBsYWNlLgogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZU9yaWdpbihTZWN1cml0
eU9yaWdpbiogb3JpZ2luKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJl
YWQpOwotICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFsc2UpOwotICAgIGlmICghbV9kYXRhYmFz
ZS5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgVmVjdG9yPFN0cmluZz4gZGF0YWJh
c2VOYW1lczsKLSAgICBpZiAoIWRhdGFiYXNlTmFtZXNGb3JPcmlnaW4ob3JpZ2luLCBkYXRhYmFz
ZU5hbWVzKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byByZXRyaWV2ZSBsaXN0IG9m
IGRhdGFiYXNlIG5hbWVzIGZvciBvcmlnaW4gJXMiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmll
cigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOworICAgIHsKKyAgICAgICAgTXV0
ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisgICAgICAgIG9wZW5UcmFj
a2VyRGF0YWJhc2UoZmFsc2UpOworICAgICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCFkYXRhYmFzZU5hbWVzRm9yT3JpZ2lu
Tm9Mb2NrKG9yaWdpbiwgZGF0YWJhc2VOYW1lcykpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigi
VW5hYmxlIHRvIHJldHJpZXZlIGxpc3Qgb2YgZGF0YWJhc2UgbmFtZXMgZm9yIG9yaWdpbiAlcyIs
IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghY2FuRGVsZXRlT3JpZ2luKG9yaWdp
bikpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiVHJpZWQgdG8gZGVsZXRlIGFuIG9yaWdpbiAo
JXMpIHdoaWxlIGVpdGhlciBjcmVhdGluZyBkYXRhYmFzZSBpbiBpdCBvciBhbHJlYWR5IGRlbGV0
aW5nIGl0Iiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Cisg
ICAgICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgICAgIHJlY29yZERlbGV0aW5nT3JpZ2luKG9yaWdpbik7CiAgICAgfQogCisgICAgLy8g
V2UgZHJvcCB0aGUgbG9jayBoZXJlIGJlY2F1c2UgaG9sZGluZyBsb2NrcyBkdXJpbmcgYSBjYWxs
IHRvIGRlbGV0ZURhdGFiYXNlRmlsZSB3aWxsIGRlYWRsb2NrLgogICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBkYXRhYmFzZU5hbWVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGlmICghZGVs
ZXRlRGF0YWJhc2VGaWxlKG9yaWdpbiwgZGF0YWJhc2VOYW1lc1tpXSkpIHsKICAgICAgICAgICAg
IC8vIEV2ZW4gaWYgdGhlIGZpbGUgY2FuJ3QgYmUgZGVsZXRlZCwgd2Ugd2FudCB0byB0cnkgYW5k
IGRlbGV0ZSB0aGUgcmVzdCwgZG9uJ3QgcmV0dXJuIGVhcmx5IGhlcmUuCkBAIC02MzQsNDEgKzcx
OSw0NSBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlT3JpZ2luKFNlY3VyCiAgICAgICAg
IH0KICAgICB9CiAKLSAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJE
RUxFVEUgRlJPTSBEYXRhYmFzZXMgV0hFUkUgb3JpZ2luPT8iKTsKLSAgICBpZiAoc3RhdGVtZW50
LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBwcmVwYXJlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNr
ZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KKyAgICB7CisgICAgICAgIC8vIFRvIHNhdGlzZnkgdGhlIGxvY2sg
aGllcmFyY2h5LCB3ZSBoYXZlIHRvIGxvY2sgdGhlIG9yaWdpblF1b3RhTWFuYWdlciBiZWZvcmUg
bV9kYXRhYmFzZUd1YXJkIGlmIHRoZXJlJ3MgYW55IGNoYW5jZSB3ZSdsbCB0byBsb2NrIGJvdGgu
CisgICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IHF1b3RhTWFuYWdlckxvY2tlcihv
cmlnaW5RdW90YU1hbmFnZXIoKSk7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZSht
X2RhdGFiYXNlR3VhcmQpOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0
YWJhc2UsICJERUxFVEUgRlJPTSBEYXRhYmFzZXMgV0hFUkUgb3JpZ2luPT8iKTsKIAotICAgIHN0
YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKKyAgICAg
ICAgZG9uZURlbGV0aW5nT3JpZ2luKG9yaWdpbik7CiAKLSAgICBpZiAoIXN0YXRlbWVudC5leGVj
dXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGV4ZWN1dGUgZGVs
ZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9yaWdpbi0+
ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQorICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewor
ICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBkYXRh
YmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
IAotICAgIFNRTGl0ZVN0YXRlbWVudCBvcmlnaW5TdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVU
RSBGUk9NIE9yaWdpbnMgV0hFUkUgb3JpZ2luPT8iKTsKLSAgICBpZiAob3JpZ2luU3RhdGVtZW50
LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBwcmVwYXJlIGRlbGV0aW9uIG9mIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRh
dGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KKyAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkpOworCisgICAgICAgIGlmICghc3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCkpIHsKKyAg
ICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGV4ZWN1dGUgZGVsZXRpb24gb2YgZGF0YWJh
c2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAK
LSAgICBvcmlnaW5TdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZp
ZXIoKSk7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBvcmlnaW5TdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIkRFTEVURSBGUk9NIE9yaWdpbnMgV0hFUkUgb3JpZ2luPT8iKTsKKyAgICAgICAgaWYgKG9y
aWdpblN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKKyAgICAgICAgICAgIExP
R19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2Ygb3JpZ2luICVzIGZyb20gdHJh
Y2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICBpZiAoIW9yaWdpblN0YXRlbWVudC5l
eGVjdXRlQ29tbWFuZCgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGV4ZWN1dGUg
ZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9yaWdp
bi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQorICAgICAgICBvcmlnaW5TdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRh
YmFzZUlkZW50aWZpZXIoKSk7CiAKLSAgICBTUUxpdGVGaWxlU3lzdGVtOjpkZWxldGVFbXB0eURh
dGFiYXNlRGlyZWN0b3J5KG9yaWdpblBhdGgob3JpZ2luKSk7CisgICAgICAgIGlmICghb3JpZ2lu
U3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCkpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIGV4ZWN1dGUgZGVsZXRpb24gb2YgZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20g
dHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICBSZWZQdHI8U2VjdXJpdHlPcmln
aW4+IG9yaWdpblBvc3NpYmx5TGFzdFJlZmVyZW5jZSA9IG9yaWdpbjsKLSAgICB7Ci0gICAgICAg
IE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3RhTWFwR3VhcmQpOworICAgICAgICBTUUxp
dGVGaWxlU3lzdGVtOjpkZWxldGVFbXB0eURhdGFiYXNlRGlyZWN0b3J5KG9yaWdpblBhdGgob3Jp
Z2luKSk7CisKKyAgICAgICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW5Qb3NzaWJseUxh
c3RSZWZlcmVuY2UgPSBvcmlnaW47CiAgICAgICAgIG1fcXVvdGFNYXAtPnJlbW92ZShvcmlnaW4p
OwogCi0gICAgICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IHF1b3RhTWFuYWdlckxvY2tl
cihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Ci0gICAgICAgIG9yaWdpblF1b3RhTWFuYWdlcigpLnJl
bW92ZU9yaWdpbihvcmlnaW4pOworICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5y
ZW1vdmVPcmlnaW4ob3JpZ2luKTsKIAogICAgICAgICAvLyBJZiB3ZSByZW1vdmVkIHRoZSBsYXN0
IG9yaWdpbiwgZG8gc29tZSBhZGRpdGlvbmFsIGRlbGV0aW9uLgogICAgICAgICBpZiAobV9xdW90
YU1hcC0+aXNFbXB0eSgpKSB7CkBAIC02NzcsMzAgKzc2NiwxNTkgQEAgdm9pZCBEYXRhYmFzZVRy
YWNrZXI6OmRlbGV0ZU9yaWdpbihTZWN1cgogICAgICAgICAgICBTUUxpdGVGaWxlU3lzdGVtOjpk
ZWxldGVEYXRhYmFzZUZpbGUodHJhY2tlckRhdGFiYXNlUGF0aCgpKTsKICAgICAgICAgICAgU1FM
aXRlRmlsZVN5c3RlbTo6ZGVsZXRlRW1wdHlEYXRhYmFzZURpcmVjdG9yeShtX2RhdGFiYXNlRGly
ZWN0b3J5UGF0aCk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobV9jbGllbnQpIHsKKyAgICAg
ICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeU9yaWdpbihvcmlnaW4pOworICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6ZSgpOyArK2kp
CisgICAgICAgICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5RGF0YWJhc2Uob3Jp
Z2luLCBkYXRhYmFzZU5hbWVzW2ldKTsKKyAgICAgICAgfQogICAgIH0KK30KIAotICAgIGlmICht
X2NsaWVudCkgewotICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlPcmlnaW4ob3Jp
Z2luKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGFiYXNlTmFtZXMuc2l6
ZSgpOyArK2kpCi0gICAgICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlEYXRhYmFz
ZShvcmlnaW4sIGRhdGFiYXNlTmFtZXNbaV0pOworYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmNhbkNy
ZWF0ZURhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSkK
K3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIC8vIENhbid0
IGNyZWF0ZSBhIGRhdGFiYXNlIHdoaWxlIHNvbWVvbmUgZWxzZSBpcyBkZWxldGluZyBpdDsgdGhl
cmUncyBhIHJpc2sgb2YgbGVhdmluZyB1bnRyYWNrZWQgZGF0YWJhc2UgZGVicmlzIG9uIHRoZSBk
aXNrLgorICAgIHJldHVybiAhZGVsZXRpbmdEYXRhYmFzZShvcmlnaW4sIG5hbWUpICYmICFkZWxl
dGluZ09yaWdpbihvcmlnaW4pOworfQorCit2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVjb3JkQ3Jl
YXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUp
Cit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBOYW1lQ291
bnRNYXAqIG5hbWVNYXAgPSBtX2JlaW5nQ3JlYXRlZC5nZXQob3JpZ2luKTsKKyAgICBpZiAoIW5h
bWVNYXApIHsKKyAgICAgICAgbmFtZU1hcCA9IG5ldyBOYW1lQ291bnRNYXAoKTsKKyAgICAgICAg
bV9iZWluZ0NyZWF0ZWQuc2V0KG9yaWdpbi0+dGhyZWFkc2FmZUNvcHkoKSwgbmFtZU1hcCk7CiAg
ICAgfQorICAgIGxvbmcgY291bnQgPSBuYW1lTWFwLT5nZXQobmFtZSk7CisgICAgbmFtZU1hcC0+
c2V0KG5hbWUudGhyZWFkc2FmZUNvcHkoKSwgY291bnQgKyAxKTsKK30KKwordm9pZCBEYXRhYmFz
ZVRyYWNrZXI6OmRvbmVDcmVhdGluZ0RhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNv
bnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2Nr
KCkpOworICAgIE5hbWVDb3VudE1hcCogbmFtZU1hcCA9IG1fYmVpbmdDcmVhdGVkLmdldChvcmln
aW4pOworICAgIGlmIChuYW1lTWFwKSB7CisgICAgICAgIGxvbmcgY291bnQgPSBuYW1lTWFwLT5n
ZXQobmFtZSk7CisgICAgICAgIEFTU0VSVChjb3VudCA+IDApOworICAgICAgICBpZiAoY291bnQg
PD0gMSkgeworICAgICAgICAgICAgbmFtZU1hcC0+cmVtb3ZlKG5hbWUpOworICAgICAgICAgICAg
aWYgKG5hbWVNYXAtPmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1fYmVpbmdDcmVhdGVk
LnJlbW92ZShvcmlnaW4pOworICAgICAgICAgICAgICAgIGRlbGV0ZSBuYW1lTWFwOworICAgICAg
ICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5hbWVNYXAtPnNldChuYW1lLCBj
b3VudCAtIDEpOworICAgIH0gZWxzZQorICAgICAgICBBU1NFUlQoZmFsc2UpOworfQorCitib29s
IERhdGFiYXNlVHJhY2tlcjo6Y3JlYXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2lu
LCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5
TG9jaygpKTsKKyAgICBOYW1lQ291bnRNYXAqIG5hbWVNYXAgPSBtX2JlaW5nQ3JlYXRlZC5nZXQo
b3JpZ2luKTsKKyAgICByZXR1cm4gbmFtZU1hcCAmJiBuYW1lTWFwLT5nZXQobmFtZSk7Cit9CisK
K2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpjYW5EZWxldGVEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAq
b3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3Vh
cmQudHJ5TG9jaygpKTsKKyAgICByZXR1cm4gIWNyZWF0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1l
KSAmJiAhZGVsZXRpbmdEYXRhYmFzZShvcmlnaW4sIG5hbWUpOworfQorCit2b2lkIERhdGFiYXNl
VHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBj
b25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9j
aygpKTsKKyAgICBBU1NFUlQoY2FuRGVsZXRlRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSk7CisgICAg
TmFtZVNldCogbmFtZVNldCA9IG1fYmVpbmdEZWxldGVkLmdldChvcmlnaW4pOworICAgIGlmICgh
bmFtZVNldCkgeworICAgICAgICBuYW1lU2V0ID0gbmV3IE5hbWVTZXQoKTsKKyAgICAgICAgbV9i
ZWluZ0RlbGV0ZWQuc2V0KG9yaWdpbi0+dGhyZWFkc2FmZUNvcHkoKSwgbmFtZVNldCk7CisgICAg
fQorICAgIEFTU0VSVCghbmFtZVNldC0+Y29udGFpbnMobmFtZSkpOworICAgIG5hbWVTZXQtPmFk
ZChuYW1lLnRocmVhZHNhZmVDb3B5KCkpOworfQorCit2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZG9u
ZURlbGV0aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBu
YW1lKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgTmFt
ZVNldCogbmFtZVNldCA9IG1fYmVpbmdEZWxldGVkLmdldChvcmlnaW4pOworICAgIGlmIChuYW1l
U2V0KSB7CisgICAgICAgIEFTU0VSVChuYW1lU2V0LT5jb250YWlucyhuYW1lKSk7CisgICAgICAg
IG5hbWVTZXQtPnJlbW92ZShuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVTZXQtPmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgbV9iZWluZ0RlbGV0ZWQucmVtb3ZlKG9yaWdpbik7CisgICAgICAgICAg
ICBkZWxldGUgbmFtZVNldDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VS
VChmYWxzZSk7CisgICAgfQorfQorCitib29sIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRpbmdEYXRh
YmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAg
QVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBOYW1lU2V0KiBuYW1lU2V0
ID0gbV9iZWluZ0RlbGV0ZWQuZ2V0KG9yaWdpbik7CisgICAgcmV0dXJuIG5hbWVTZXQgJiYgbmFt
ZVNldC0+Y29udGFpbnMobmFtZSk7Cit9CisKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpjYW5EZWxl
dGVPcmlnaW4oU2VjdXJpdHlPcmlnaW4gKm9yaWdpbikKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJh
c2VHdWFyZC50cnlMb2NrKCkpOworICAgIHJldHVybiAhKGRlbGV0aW5nT3JpZ2luKG9yaWdpbikg
fHwgbV9iZWluZ0NyZWF0ZWQuZ2V0KG9yaWdpbikpOworfQorCitib29sIERhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRpbmdPcmlnaW4oU2VjdXJpdHlPcmlnaW4gKm9yaWdpbikKK3sKKyAgICBBU1NFUlQo
IW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIHJldHVybiBtX29yaWdpbnNCZWluZ0Rl
bGV0ZWQuY29udGFpbnMob3JpZ2luKTsKK30KKwordm9pZCBEYXRhYmFzZVRyYWNrZXI6OnJlY29y
ZERlbGV0aW5nT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4pCit7CisgICAgQVNTRVJUKCFt
X2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICBBU1NFUlQoIWRlbGV0aW5nT3JpZ2luKG9y
aWdpbikpOworICAgIG1fb3JpZ2luc0JlaW5nRGVsZXRlZC5hZGQob3JpZ2luLT50aHJlYWRzYWZl
Q29weSgpKTsKK30KKwordm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRvbmVEZWxldGluZ09yaWdpbihT
ZWN1cml0eU9yaWdpbiAqb3JpZ2luKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRy
eUxvY2soKSk7CisgICAgQVNTRVJUKGRlbGV0aW5nT3JpZ2luKG9yaWdpbikpOworICAgIG1fb3Jp
Z2luc0JlaW5nRGVsZXRlZC5yZW1vdmUob3JpZ2luKTsKIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNr
ZXI6OmRlbGV0ZURhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYg
bmFtZSkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLSAgICBv
cGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKLSAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkp
Ci0gICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFz
ZShtX2RhdGFiYXNlR3VhcmQpOworICAgICAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsK
KyAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIGlmICghY2FuRGVsZXRlRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSkgeworICAgICAg
ICAgICAgQVNTRVJUKEZBTFNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAg
ICAgICByZWNvcmREZWxldGluZ0RhdGFiYXNlKG9yaWdpbiwgbmFtZSk7CisgICAgfQogCisgICAg
Ly8gV2UgZHJvcCB0aGUgbG9jayBoZXJlIGJlY2F1c2UgaG9sZGluZyBsb2NrcyBkdXJpbmcgYSBj
YWxsIHRvIGRlbGV0ZURhdGFiYXNlRmlsZSB3aWxsIGRlYWRsb2NrLgogICAgIGlmICghZGVsZXRl
RGF0YWJhc2VGaWxlKG9yaWdpbiwgbmFtZSkpIHsKICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUg
dG8gZGVsZXRlIGZpbGUgZm9yIGRhdGFiYXNlICVzIGluIG9yaWdpbiAlcyIsIG5hbWUuYXNjaWko
KS5kYXRhKCksIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwor
ICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICAg
ICAgZG9uZURlbGV0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KIAorICAgIC8vIFRvIHNhdGlzZnkgdGhlIGxvY2sgaGllcmFyY2h5LCB3ZSBoYXZlIHRv
IGxvY2sgdGhlIG9yaWdpblF1b3RhTWFuYWdlciBiZWZvcmUgbV9kYXRhYmFzZUd1YXJkIGlmIHRo
ZXJlJ3MgYW55IGNoYW5jZSB3ZSdsbCB0byBsb2NrIGJvdGguCisgICAgTG9ja2VyPE9yaWdpblF1
b3RhTWFuYWdlcj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKKyAg
ICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKwogICAgIFNRTGl0
ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIkRFTEVURSBGUk9NIERhdGFiYXNlcyBX
SEVSRSBvcmlnaW49PyBBTkQgbmFtZT0/Iik7CiAgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkg
IT0gU1FMUmVzdWx0T2spIHsKICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBk
ZWxldGlvbiBvZiBkYXRhYmFzZSAlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBuYW1l
LmFzY2lpKCkuZGF0YSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0
YSgpKTsKKyAgICAgICAgZG9uZURlbGV0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KIApAQCAtNzA5LDQwICs5MjcsNDYgQEAgdm9pZCBEYXRhYmFzZVRy
YWNrZXI6OmRlbGV0ZURhdGFiYXNlKFNlYwogCiAgICAgaWYgKCFzdGF0ZW1lbnQuZXhlY3V0ZUNv
bW1hbmQoKSkgewogICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9u
IG9mIGRhdGFiYXNlICVzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG5hbWUuYXNjaWko
KS5kYXRhKCksIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwor
ICAgICAgICBkb25lRGVsZXRpbmdEYXRhYmFzZShvcmlnaW4sIG5hbWUpOwogICAgICAgICByZXR1
cm47CiAgICAgfQogCi0gICAgewotICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBx
dW90YU1hbmFnZXJMb2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwotICAgICAgICBvcmlnaW5R
dW90YU1hbmFnZXIoKS5yZW1vdmVEYXRhYmFzZShvcmlnaW4sIG5hbWUpOwotICAgIH0KKyAgICBv
cmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5yZW1vdmVEYXRhYmFzZShvcmlnaW4sIG5hbWUpOwog
CiAgICAgaWYgKG1fY2xpZW50KSB7CiAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlm
eU9yaWdpbihvcmlnaW4pOwogICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlEYXRh
YmFzZShvcmlnaW4sIG5hbWUpOwogICAgIH0KKyAgICBkb25lRGVsZXRpbmdEYXRhYmFzZShvcmln
aW4sIG5hbWUpOwogfQogCisvLyBkZWxldGVEYXRhYmFzZUZpbGUgaGFzIHRvIHJlbGVhc2UgbG9j
a3MgYmV0d2VlbiBsb29raW5nIHVwIHRoZSBsaXN0IG9mIGRhdGFiYXNlcyB0byBjbG9zZSBhbmQg
Y2xvc2luZyB0aGVtLiAgV2hpbGUgdGhpcyBpcyBpbiBwcm9ncmVzcywgdGhlIGNhbGxlcgorLy8g
aXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIG5vIG5ldyBkYXRhYmFzZXMgYXJlIG9wZW5l
ZCBpbiB0aGUgZmlsZSB0byBiZSBkZWxldGVkLgogYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0
ZURhdGFiYXNlRmlsZShTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUp
CiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CiAgICAgU3RyaW5n
IGZ1bGxQYXRoID0gZnVsbFBhdGhGb3JEYXRhYmFzZShvcmlnaW4sIG5hbWUsIGZhbHNlKTsKICAg
ICBpZiAoZnVsbFBhdGguaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAorI2lmbmRl
ZiBOREVCVUcKKyAgICB7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VH
dWFyZCk7CisgICAgQVNTRVJUKGRlbGV0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSB8fCBkZWxl
dGluZ09yaWdpbihvcmlnaW4pKTsKKyAgICB9CisjZW5kaWYKKwogICAgIFZlY3RvcjxSZWZQdHI8
RGF0YWJhc2U+ID4gZGVsZXRlZERhdGFiYXNlczsKIAotICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8g
aG9sZCB0aGUgbV9vcGVuRGF0YWJhc2VNYXBHdWFyZCBtdXRleCB3aGVuIGNhbGxpbmcKKyAgICAv
LyBNYWtlIHN1cmUgbm90IHRvIGhvbGQgdGhlIGFueSBsb2NrcyB3aGVuIGNhbGxpbmcKICAgICAv
LyBEYXRhYmFzZTo6bWFya0FzRGVsZXRlZEFuZENsb3NlKCksIHNpbmNlIHRoYXQgY2FuIGNhdXNl
IGEgZGVhZGxvY2sKICAgICAvLyBkdXJpbmcgdGhlIHN5bmNocm9ub3VzIERhdGFiYXNlVGhyZWFk
IGNhbGwgaXQgdHJpZ2dlcnMuCi0KICAgICB7CiAgICAgICAgIE11dGV4TG9ja2VyIG9wZW5EYXRh
YmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CiAgICAgICAgIGlmIChtX29wZW5E
YXRhYmFzZU1hcCkgewogICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRhYmFz
ZXMsIGxldHMgY2hlY2sgaWYgdGhleSBhcmUgZm9yIHRoaXMgb3JpZ2luLgogICAgICAgICAgICAg
RGF0YWJhc2VOYW1lTWFwKiBuYW1lTWFwID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChvcmlnaW4p
OwogICAgICAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC0+c2l6ZSgpKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRhYmFzZXMgZm9yIHRoaXMgb3JpZ2lu
LCBsZXRzIGNoZWNrCisgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3BlbiBkYXRh
YmFzZXMgZm9yIHRoaXMgb3JpZ2luLCBsZXQncyBjaGVjawogICAgICAgICAgICAgICAgIC8vIGlm
IHRoZXkgYXJlIHRoaXMgZGF0YWJhc2UgYnkgbmFtZS4KICAgICAgICAgICAgICAgICBEYXRhYmFz
ZVNldCogZGF0YWJhc2VTZXQgPSBuYW1lTWFwLT5nZXQobmFtZSk7CiAgICAgICAgICAgICAgICAg
aWYgKGRhdGFiYXNlU2V0ICYmIGRhdGFiYXNlU2V0LT5zaXplKCkpIHsKQEAgLTc2Myw3ICs5ODcs
NiBAQCBib29sIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlRGF0YWJhc2VGaWxlCiAKIHZvaWQgRGF0
YWJhc2VUcmFja2VyOjpzZXRDbGllbnQoRGF0YWJhc2VUcmFja2VyQ2xpZW50KiBjbGllbnQpCiB7
Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CiAgICAgbV9jbGllbnQg
PSBjbGllbnQ7CiB9CiAKQEAgLTc3Myw3ICs5OTYsNyBAQCBzdGF0aWMgTXV0ZXgmIG5vdGlmaWNh
dGlvbk11dGV4KCkKICAgICByZXR1cm4gbXV0ZXg7CiB9CiAKLXR5cGVkZWYgVmVjdG9yPHBhaXI8
U2VjdXJpdHlPcmlnaW4qLCBTdHJpbmc+ID4gTm90aWZpY2F0aW9uUXVldWU7Cit0eXBlZGVmIFZl
Y3RvcjxwYWlyPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4sIFN0cmluZz4gPiBOb3RpZmljYXRpb25R
dWV1ZTsKIAogc3RhdGljIE5vdGlmaWNhdGlvblF1ZXVlJiBub3RpZmljYXRpb25RdWV1ZSgpCiB7
CkBAIC03ODUsNyArMTAwOCw3IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpzY2hlZHVsZU5vdGlm
eURhdGEKIHsKICAgICBNdXRleExvY2tlciBsb2NrZXIobm90aWZpY2F0aW9uTXV0ZXgoKSk7CiAK
LSAgICBub3RpZmljYXRpb25RdWV1ZSgpLmFwcGVuZChwYWlyPFNlY3VyaXR5T3JpZ2luKiwgU3Ry
aW5nPihvcmlnaW4sIG5hbWUuY3Jvc3NUaHJlYWRTdHJpbmcoKSkpOworICAgIG5vdGlmaWNhdGlv
blF1ZXVlKCkuYXBwZW5kKHBhaXI8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiwgU3RyaW5nPihvcmln
aW4tPnRocmVhZHNhZmVDb3B5KCksIG5hbWUuY3Jvc3NUaHJlYWRTdHJpbmcoKSkpOwogICAgIHNj
aGVkdWxlRm9yTm90aWZpY2F0aW9uKCk7CiB9CiAKQEAgLTgyMCw3ICsxMDQzLDcgQEAgdm9pZCBE
YXRhYmFzZVRyYWNrZXI6Om5vdGlmeURhdGFiYXNlc0NoYQogICAgICAgICByZXR1cm47CiAKICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbm90aWZpY2F0aW9ucy5zaXplKCk7ICsraSkKLSAg
ICAgICAgdGhlVHJhY2tlci5tX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlEYXRhYmFzZShub3Rp
ZmljYXRpb25zW2ldLmZpcnN0LCBub3RpZmljYXRpb25zW2ldLnNlY29uZCk7CisgICAgICAgIHRo
ZVRyYWNrZXIubV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5RGF0YWJhc2Uobm90aWZpY2F0aW9u
c1tpXS5maXJzdC5nZXQoKSwgbm90aWZpY2F0aW9uc1tpXS5zZWNvbmQpOwogfQogCiAKSW5kZXg6
IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgJKHJldmlzaW9uIDU2MjQzKQorKysgV2ViQ29yZS9z
dG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02MCw5ICs2MCwxMSBA
QCBzdHJ1Y3QgU2VjdXJpdHlPcmlnaW5UcmFpdHM7CiBjbGFzcyBEYXRhYmFzZVRyYWNrZXIgOiBw
dWJsaWMgTm9uY29weWFibGUgewogcHVibGljOgogICAgIHN0YXRpYyBEYXRhYmFzZVRyYWNrZXIm
IHRyYWNrZXIoKTsKLSAgICAvLyBGSVhNRTogRHVlIHRvIHdvcmtlcnMgaGF2aW5nIG11bHRpcGxl
IHRocmVhZHMgaW4gYSBzaW5nbGUgcHJvY2VzcyBzaGFyaW5nCi0gICAgLy8gYSBEYXRhYmFzZVRy
YWNrZXIsIHRoaXMgc2luZ2xldG9uIHdpbGwgaGF2ZSB0byBiZSBzeW5jaHJvbml6ZWQgb3IgbW92
ZWQKLSAgICAvLyB0byBUTFMuCisgICAgLy8gVGhpcyBzaW5nbGV0b24gd2lsbCBwb3RlbnRpYWxs
eSBiZSB1c2VkIGZyb20gbXVsdGlwbGUgd29ya2VyIHRocmVhZHMgYW5kIHRoZSBwYWdlJ3MgY29u
dGV4dCB0aHJlYWQgc2ltdWx0YW5lb3VzbHkuICBUbyBrZWVwIHRoaXMgc2FmZSwgaXQncworICAg
IC8vIGN1cnJlbnRseSB1c2luZyA0IGxvY2tzLiAgSW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2sg
d2hlbiB0YWtpbmcgbXVsdGlwbGUgbG9ja3MsIHlvdSBtdXN0IHRha2UgdGhlbSBpbiB0aGUgY29y
cmVjdCBvcmRlcjoKKyAgICAvLyBvcmlnaW5RdW90YU1hbmFnZXIoKSBiZWZvcmUgbV9kYXRhYmFz
ZUd1YXJkIG9yIG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQKKyAgICAvLyBtX2RhdGFiYXNlR3VhcmQg
YmVmb3JlIG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQKKyAgICAvLyBub3RpZmljYXRpb25NdXRleCgp
IGlzIGN1cnJlbnRseSBpbmRlcGVuZGVudCBvZiB0aGUgb3RoZXIgbG9ja3MuCiAKICAgICBib29s
IGNhbkVzdGFibGlzaERhdGFiYXNlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBjb25zdCBTdHJp
bmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcgZXN0aW1h
dGVkU2l6ZSk7CiAgICAgdm9pZCBzZXREYXRhYmFzZURldGFpbHMoU2VjdXJpdHlPcmlnaW4qLCBj
b25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxv
bmcgZXN0aW1hdGVkU2l6ZSk7CkBAIC04Nyw3ICs4OSw3IEBAIHByaXZhdGU6CiAjaWYgIVBMQVRG
T1JNKENIUk9NSVVNKQogcHVibGljOgogICAgIHZvaWQgc2V0RGF0YWJhc2VEaXJlY3RvcnlQYXRo
KGNvbnN0IFN0cmluZyYpOwotICAgIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VEaXJlY3RvcnlQYXRo
KCkgY29uc3Q7CisgICAgU3RyaW5nIGRhdGFiYXNlRGlyZWN0b3J5UGF0aCgpIGNvbnN0OwogCiAg
ICAgdm9pZCBvcmlnaW5zKFZlY3RvcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+ID4mIHJlc3VsdCk7
CiAgICAgYm9vbCBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKFNlY3VyaXR5T3JpZ2luKiwgVmVjdG9y
PFN0cmluZz4mIHJlc3VsdCk7CkBAIC0xMTQsNiArMTE2LDEzIEBAIHB1YmxpYzoKICAgICBib29s
IGhhc0VudHJ5Rm9yT3JpZ2luKFNlY3VyaXR5T3JpZ2luKik7CiAKIHByaXZhdGU6CisgICAgT3Jp
Z2luUXVvdGFNYW5hZ2VyJiBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKTsKKyAgICBib29sIGhh
c0VudHJ5Rm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pOworICAgIFN0cmlu
ZyBmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5n
JiBuYW1lLCBib29sIGNyZWF0ZUlmRG9lc05vdEV4aXN0KTsKKyAgICBib29sIGRhdGFiYXNlTmFt
ZXNGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9yPFN0cmluZz4m
IHJlc3VsdFZlY3Rvcik7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHVzYWdlRm9yT3JpZ2luTm9M
b2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBxdW90
YUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKTsKKwogICAgIFN0cmluZyB0
cmFja2VyRGF0YWJhc2VQYXRoKCkgY29uc3Q7CiAgICAgdm9pZCBvcGVuVHJhY2tlckRhdGFiYXNl
KGJvb2wgY3JlYXRlSWZEb2VzTm90RXhpc3QpOwogCkBAIC0xMjYsMTAgKzEzNSwxMSBAQCBwcml2
YXRlOgogCiAgICAgYm9vbCBkZWxldGVEYXRhYmFzZUZpbGUoU2VjdXJpdHlPcmlnaW4qLCBjb25z
dCBTdHJpbmcmIG5hbWUpOwogCisgICAgLy8gVGhpcyBsb2NrIHByb3RlY3RzIG1fZGF0YWJhc2Us
IG1fcXVvdGFNYXAsIG1fcHJvcG9zZWREYXRhYmFzZXMsIG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRo
LCBtX29yaWdpbnNCZWluZ0RlbGV0ZWQsIG1fYmVpbmdDcmVhdGVkLCBhbmQgbV9iZWluZ0RlbGV0
ZWQuCisgICAgTXV0ZXggbV9kYXRhYmFzZUd1YXJkOwogICAgIFNRTGl0ZURhdGFiYXNlIG1fZGF0
YWJhc2U7CiAKICAgICB0eXBlZGVmIEhhc2hNYXA8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiwgdW5z
aWduZWQgbG9uZyBsb25nLCBTZWN1cml0eU9yaWdpbkhhc2g+IFF1b3RhTWFwOwotICAgIE11dGV4
IG1fcXVvdGFNYXBHdWFyZDsKICAgICBtdXRhYmxlIE93blB0cjxRdW90YU1hcD4gbV9xdW90YU1h
cDsKIAogICAgIE93blB0cjxPcmlnaW5RdW90YU1hbmFnZXI+IG1fcXVvdGFNYW5hZ2VyOwpAQCAt
MTM4LDExICsxNDgsMjcgQEAgcHJpdmF0ZToKIAogICAgIERhdGFiYXNlVHJhY2tlckNsaWVudCog
bV9jbGllbnQ7CiAKLSAgICBzdGQ6OnBhaXI8U2VjdXJpdHlPcmlnaW4qLCBEYXRhYmFzZURldGFp
bHM+KiBtX3Byb3Bvc2VkRGF0YWJhc2U7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8UmVmUHRyPFNl
Y3VyaXR5T3JpZ2luPiwgRGF0YWJhc2VEZXRhaWxzPiBQcm9wb3NlZERhdGFiYXNlOworICAgIEhh
c2hTZXQ8UHJvcG9zZWREYXRhYmFzZSo+IG1fcHJvcG9zZWREYXRhYmFzZXM7CiAKLSNpZm5kZWYg
TkRFQlVHCi0gICAgVGhyZWFkSWRlbnRpZmllciBtX3RocmVhZDsKLSNlbmRpZgorICAgIHR5cGVk
ZWYgSGFzaE1hcDxTdHJpbmcsIGxvbmc+IE5hbWVDb3VudE1hcDsKKyAgICB0eXBlZGVmIEhhc2hN
YXA8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiwgTmFtZUNvdW50TWFwKiwgU2VjdXJpdHlPcmlnaW5I
YXNoPiBDcmVhdGVTZXQ7CisgICAgQ3JlYXRlU2V0IG1fYmVpbmdDcmVhdGVkOworICAgIHR5cGVk
ZWYgSGFzaFNldDxTdHJpbmc+IE5hbWVTZXQ7CisgICAgSGFzaE1hcDxSZWZQdHI8U2VjdXJpdHlP
cmlnaW4+LCBOYW1lU2V0KiwgU2VjdXJpdHlPcmlnaW5IYXNoPiBtX2JlaW5nRGVsZXRlZDsKKyAg
ICBIYXNoU2V0PFJlZlB0cjxTZWN1cml0eU9yaWdpbj4sIFNlY3VyaXR5T3JpZ2luSGFzaD4gbV9v
cmlnaW5zQmVpbmdEZWxldGVkOworICAgIGJvb2wgY2FuQ3JlYXRlRGF0YWJhc2UoU2VjdXJpdHlP
cmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKTsKKyAgICB2b2lkIHJlY29yZENyZWF0
aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKTsK
KyAgICB2b2lkIGRvbmVDcmVhdGluZ0RhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNv
bnN0IFN0cmluZyYgbmFtZSk7CisgICAgYm9vbCBjcmVhdGluZ0RhdGFiYXNlKFNlY3VyaXR5T3Jp
Z2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgYm9vbCBjYW5EZWxldGVEYXRh
YmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIHZv
aWQgcmVjb3JkRGVsZXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBT
dHJpbmcmIG5hbWUpOworICAgIHZvaWQgZG9uZURlbGV0aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmln
aW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKTsKKyAgICBib29sIGRlbGV0aW5nRGF0YWJh
c2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKTsKKyAgICBib29s
IGNhbkRlbGV0ZU9yaWdpbihTZWN1cml0eU9yaWdpbiAqb3JpZ2luKTsKKyAgICBib29sIGRlbGV0
aW5nT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4pOworICAgIHZvaWQgcmVjb3JkRGVsZXRp
bmdPcmlnaW4oU2VjdXJpdHlPcmlnaW4gKm9yaWdpbik7CisgICAgdm9pZCBkb25lRGVsZXRpbmdP
cmlnaW4oU2VjdXJpdHlPcmlnaW4gKm9yaWdpbik7CiAKICAgICBzdGF0aWMgdm9pZCBzY2hlZHVs
ZUZvck5vdGlmaWNhdGlvbigpOwogICAgIHN0YXRpYyB2b2lkIG5vdGlmeURhdGFiYXNlc0NoYW5n
ZWQodm9pZCopOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5jcHAJKHJl
dmlzaW9uIDU2MjQzKQorKysgV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDE4IEBAIE9yaWdpblF1b3RhTWFuYWdlcjo6T3Jp
Z2luUXVvdGFNYW5hZ2VyKCkKIHsKIH0KIAorYm9vbCBPcmlnaW5RdW90YU1hbmFnZXI6OnRyeUxv
Y2soKQoreworICAgIGJvb2wgbG9ja2VkID0gbV91c2FnZVJlY29yZEd1YXJkLnRyeUxvY2soKTsK
KyNpZm5kZWYgTkRFQlVHCisgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgbV91c2FnZVJlY29yZEd1
YXJkTG9ja2VkID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIEFTU0VSVChtX3VzYWdlUmVjb3Jk
R3VhcmRMb2NrZWQpOworI2VuZGlmCisgICAgcmV0dXJuIGxvY2tlZDsKK30KKwogdm9pZCBPcmln
aW5RdW90YU1hbmFnZXI6OmxvY2soKQogewogICAgIG1fdXNhZ2VSZWNvcmRHdWFyZC5sb2NrKCk7
CkBAIC02Myw3ICs3NSw3IEBAIHZvaWQgT3JpZ2luUXVvdGFNYW5hZ2VyOjp0cmFja09yaWdpbihQ
YXMKICAgICBBU1NFUlQobV91c2FnZVJlY29yZEd1YXJkTG9ja2VkKTsKICAgICBBU1NFUlQoIW1f
dXNhZ2VNYXAuY29udGFpbnMob3JpZ2luLmdldCgpKSk7CiAKLSAgICBtX3VzYWdlTWFwLnNldChv
cmlnaW4sIG5ldyBPcmlnaW5Vc2FnZVJlY29yZCk7CisgICAgbV91c2FnZU1hcC5zZXQob3JpZ2lu
LT50aHJlYWRzYWZlQ29weSgpLCBuZXcgT3JpZ2luVXNhZ2VSZWNvcmQpOwogfQogCiBib29sIE9y
aWdpblF1b3RhTWFuYWdlcjo6dHJhY2tzT3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pIGNv
bnN0CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oCShyZXZpc2lvbiA1NjI0
MykKKysrIFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIuaAkod29ya2luZyBjb3B5
KQpAQCAtNDUsNiArNDUsNyBAQCBjbGFzcyBPcmlnaW5RdW90YU1hbmFnZXIgOiBwdWJsaWMgTm9u
Y29wCiBwdWJsaWM6CiAgICAgT3JpZ2luUXVvdGFNYW5hZ2VyKCk7CiAKKyAgICBib29sIHRyeUxv
Y2soKTsKICAgICB2b2lkIGxvY2soKTsKICAgICB2b2lkIHVubG9jaygpOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51180</attachid>
            <date>2010-03-19 12:35:35 -0700</date>
            <delta_ts>2010-03-19 20:03:44 -0700</delta_ts>
            <desc>Added Changelog entry for static variable change.</desc>
            <filename>tracker2.patch</filename>
            <type>text/plain</type>
            <size>58418</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NjI0MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTE0IEBACisyMDEwLTAzLTE5ICBFcmljIFVocmhhbmUgIDxlcmljdUBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
UmVmYWN0b3IgRGF0YWJhc2VUcmFja2VyLmNwcCBmb3IgdGhyZWFkIHNhZmV0eQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5OTEKKworICAgICAgICBU
aGlzIGVuYWJsZXMgY2FsbGluZyBpbnRvIERhdGFiYXNlVHJhY2tlciBmcm9tIG11bHRpcGxlIGNv
bnRleHQgdGhyZWFkcywKKyAgICAgICAgYXMgd2lsbCBoYXBwZW4gb25jZSBXb3JrZXJzIGNhbiBh
Y2Nlc3MgdGhlIERhdGFiYXNlLiAgSXQgcmVxdWlyZWQgYSBmYWlyCisgICAgICAgIGFtb3VudCBv
ZiByZXNodWZmbGluZyBvZiBsb2Nrcy4gIEkgZW5kZWQgdXAgc3BsaXR0aW5nIHRoZSBwdWJsaWMK
KyAgICAgICAgaW50ZXJmYWNlIFtjYWxscyB0aGF0IHRha2UgbG9ja3MgYW5kIGNhbGwgcHJpdmF0
ZSBmdW5jdGlvbnNdIGZyb20gdGhlCisgICAgICAgIGltcGxlbWVudGF0aW9ucyBbY2FsbHMgdGhh
dCBhc3NlcnQgdGhhdCBsb2NrcyBhcmUgYWxyZWFkeSBoZWxkXSBpbiBvcmRlcgorICAgICAgICB0
byBhdm9pZCBsb2NrIGNvbmZsaWN0cy4gIEkgYWxzbyBoYWQgdG8gbWFrZSBzdXJlIHdlIHdlcmVu
J3Qgc2hhcmluZworICAgICAgICBTdHJpbmdzIG9yIFNlY3VyaXR5T3JpZ2lucyBhY3Jvc3MgdGhy
ZWFkcy4KKworICAgICAgICBObyBuZXcgdGVzdHMuCisKKyAgICAgICAgQWxsb3cgYWNjZXNzIHRv
IGRhdGFiYXNlIGhhbmRsZXMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIElGRiBTUUxpdGUgaXMgbmV3
IGVub3VnaCBhbmQgdGhlIHVzZXIgcmVxdWVzdHMgaXQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9z
cWwvU1FMaXRlRGF0YWJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2U6
OlNRTGl0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpkaXNh
YmxlVGhyZWFkaW5nQ2hlY2tzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJh
c2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpzcWxpdGUzSGFuZGxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlNRTGl0ZURhdGFiYXNlOjpkaXNhYmxlVGhyZWFkaW5nQ2hlY2tz
KToKKworICAgICAgICBSZW1vdmUgYW4gYXN5bmNocm9ub3VzIGNhbGwgZnJvbSBEYXRhYmFzZTo6
Y2xvc2UgYmFjayB0byB0aGUgZXhlY3V0aW9uIHRocmVhZCwgc28gdGhhdCBjbGVhbnVwIGNhbiBi
ZSBtb3JlIGRldGVybWluaXN0aWMuCisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjptYXJrQXNEZWxldGVkQW5kQ2xvc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OmNsb3NlKToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFi
YXNlLmg6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6KToKKyAgICAgICAgKiBzdG9yYWdl
L0RhdGFiYXNlRGV0YWlscy5oOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VEZXRhaWxzOjpE
YXRhYmFzZURldGFpbHMpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VEZXRhaWxzOjp0aHJl
YWQpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUYXNrLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlQ2xvc2VUYXNrOjpkb1BlcmZvcm1UYXNrKToKKyAgICAgICAgKiBzdG9yYWdl
L0RhdGFiYXNlVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpk
YXRhYmFzZVRocmVhZCk6CisKKyAgICAgICAgQW55IFN0cmluZ3MgdGhhdCBnZXQgc3RvcmVkIGlu
IERhdGFiYXNlVHJhY2tlciwgYW5kIGFueSBTdHJpbmdzIHJldHVybmVkIGZyb20gRGF0YWJhc2VU
cmFja2VyLCBhcmUgbm93IHRocmVhZHNhZmVDb3BpZXMuCisgICAgICAgIFB1YmxpYyBmdW5jdGlv
bnMgbm93IHRha2UgYWxsIG5lZWRlZCBsb2NrcywgdGhlbiBnZW5lcmFsbHkgY2FsbCBvbmx5IHBy
aXZhdGUgZnVuY3Rpb25zIFt0aGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9uczogZGVsZXRpb24gZnVu
Y3Rpb25zIGFuZCBvcmlnaW5zKCldLgorICAgICAgICBQcml2YXRlIGZ1bmN0aW9ucyBubyBsb25n
ZXIgdGFrZSBsb2Nrcy4KKyAgICAgICAgbV9xdW90YU1hcEd1YXJkIGJlY29tZXMgbV9kYXRhYmFz
ZUd1YXJkLCBhbmQgbm93IHByb3RlY3RzIG1fZGF0YWJhc2UsIG1fcXVvdGFNYXAsIG1fcHJvcG9z
ZWREYXRhYmFzZXMsIG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLCBtX29yaWdpbnNCZWluZ0RlbGV0
ZWQsIG1fYmVpbmdDcmVhdGVkLCBhbmQgbV9iZWluZ0RlbGV0ZWQuCisgICAgICAgIG1fcHJvcG9z
ZWREYXRhYmFzZXMgcmVwbGFjZXMgbV9wcm9wb3NlZERhdGFiYXNlLCB0byBhY2NvdW50IGZvciBy
ZWVudHJhbmN5LgorCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaDoKKyAgICAg
ICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlck5vTG9jayk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlcik6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJhY2tlcik6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OnNldERhdGFiYXNlRGlyZWN0b3J5UGF0aCk6CisgICAgICAgIChXZWJD
b3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlRGlyZWN0b3J5UGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXJEYXRhYmFzZVBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpvcGVuVHJhY2tlckRhdGFiYXNlKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0YWJsaXNoRGF0YWJhc2UpOgorICAgICAg
ICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpoYXNFbnRyeUZvck9yaWdpbk5vTG9jayk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9yT3JpZ2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6aGFzRW50cnlGb3JEYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3JpZ2lucyk6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbnMpOgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUcmFja2VyOjpkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zvck9yaWdpbik6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmRldGFpbHNGb3JOYW1lQW5kT3JpZ2lu
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JEYXRhYmFzZSk6
CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9yT3JpZ2luTm9Mb2NrKToK
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW4pOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpxdW90YUZvck9yaWdpbk5vTG9jayk6Cisg
ICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2V0UXVvdGEpOgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZUFsbERhdGFiYXNlcyk6CisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmRlbGV0ZU9yaWdpbik6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRy
YWNrZXI6OmRlbGV0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tl
cjo6ZGVsZXRlRGF0YWJhc2VGaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tl
cjo6c2V0Q2xpZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2NoZWR1
bGVOb3RpZnlEYXRhYmFzZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFj
a2VyOjpub3RpZnlEYXRhYmFzZXNDaGFuZ2VkKToKKworICAgICAgICBUaGVzZSBmdW5jdGlvbnMg
a2VlcCB0cmFjayBvZiBpbi1wcm9ncmVzcyBkZWxldGlvbnMgYW5kIGNyZWF0aW9ucywgc28gdGhh
dCB3ZSBjYW4gbWFrZSBzdXJlIG5vYm9keSBldmVyeSBkZWxldGVzIGEgZGF0YWJhc2UgZmlsZSB3
aGlsZSBhIGxpdmUgZGF0YWJhc2UgaXMgdXNpbmcgaXQuCisgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRyYWNrZXI6OmNhbkNyZWF0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6cmVjb3JkQ3JlYXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmRvbmVDcmVhdGluZ0RhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlVHJhY2tlcjo6Y3JlYXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZURhdGFiYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmRvbmVEZWxldGluZ0RhdGFiYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRhdGFiYXNlVHJhY2tlcjo6ZGVsZXRpbmdEYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZVRyYWNrZXI6OmNhbkRlbGV0ZU9yaWdpbik6CisgICAgICAgIChXZWJDb3JlOjpE
YXRhYmFzZVRyYWNrZXI6OmRlbGV0aW5nT3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFi
YXNlVHJhY2tlcjo6cmVjb3JkRGVsZXRpbmdPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6RGF0
YWJhc2VUcmFja2VyOjpkb25lRGVsZXRpbmdPcmlnaW4pOgorCisgICAgICAgIEFueSBTZWN1cml0
eU9yaWdpbnMgc3RvcmVkIGluIE9yaWdpblF1b3RhTWFuYWdlciBhcmUgbm93IHRocmVhZHNhZmVD
b3BpZXMgb2YgaW5wdXRzLiAgVGhlcmUncyBhIG5ldyB0cnlMb2NrKCkgZnVuY3Rpb24gaW4gYWRk
aXRpb24gdG8gdGhlIGV4aXN0aW5nIGxvY2soKS4KKworICAgICAgICAqIHN0b3JhZ2UvT3JpZ2lu
UXVvdGFNYW5hZ2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok9yaWdpblF1b3RhTWFuYWdlcjo6
dHJ5TG9jayk6CisgICAgICAgIChXZWJDb3JlOjpPcmlnaW5RdW90YU1hbmFnZXI6OnRyYWNrT3Jp
Z2luKToKKyAgICAgICAgKiBzdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oOgorCisgICAgICAg
ICogcGFnZS9TZWN1cml0eU9yaWdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTZWN1cml0eU9y
aWdpbjo6ZGF0YWJhc2VJZGVudGlmaWVyKToKKyAgICAgICAgUmVtb3ZlZCBERUZJTkVfU1RBVElD
X0xPQ0FMIHdyYXBwZXIgb24gYSBsb2NhbCB2YXJpYWJsZTsgaXQgYXBwZWFycyB0byBoYXZlIGJl
ZW4gYSBzbWFsbCBvcHRpbWl6YXRpb24sIGJ1dCBpdCdzIG5vdCB0aHJlYWQtc2FmZS4KKwogMjAx
MC0wMy0xOSAgTGFzemxvIEdvbWJvcyAgPGxhc3psby4xLmdvbWJvc0Bub2tpYS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgU2ltb24gSGF1c21hbm4uCkluZGV4OiBXZWJDb3JlL3BhZ2UvU2Vj
dXJpdHlPcmlnaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9TZWN1cml0eU9yaWdp
bi5jcHAJKHJldmlzaW9uIDU2MjQzKQorKysgV2ViQ29yZS9wYWdlL1NlY3VyaXR5T3JpZ2luLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDYyLDcgKzQ2Miw3IEBAIHN0YXRpYyBTdHJpbmcgZW5jb2Rl
ZEhvc3QoY29uc3QgU3RyaW5nJiAKIAogU3RyaW5nIFNlY3VyaXR5T3JpZ2luOjpkYXRhYmFzZUlk
ZW50aWZpZXIoKSBjb25zdCAKIHsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgc2Vw
YXJhdG9yU3RyaW5nLCAoJlNlcGFyYXRvckNoYXJhY3RlciwgMSkpOworICAgIFN0cmluZyBzZXBh
cmF0b3JTdHJpbmcoJlNlcGFyYXRvckNoYXJhY3RlciwgMSk7CiAKICAgICBpZiAobV9lbmNvZGVk
SG9zdC5pc0VtcHR5KCkpCiAgICAgICAgIG1fZW5jb2RlZEhvc3QgPSBlbmNvZGVkSG9zdChtX2hv
c3QpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmNwcAkocmV2aXNp
b24gNTYyNDMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4LDcgQEAgU1FMaXRlRGF0YWJhc2U6OlNRTGl0ZURhdGFi
YXNlKCkKICAgICA6IG1fZGIoMCkKICAgICAsIG1fcGFnZVNpemUoLTEpCiAgICAgLCBtX3RyYW5z
YWN0aW9uSW5Qcm9ncmVzcyhmYWxzZSkKKyAgICAsIG1fc2hhcmFibGUoZmFsc2UpCiAgICAgLCBt
X29wZW5pbmdUaHJlYWQoMCkKIHsKIH0KQEAgLTI1Miw2ICsyNTMsMTggQEAgY29uc3QgY2hhciog
U1FMaXRlRGF0YWJhc2U6Omxhc3RFcnJvck1zZwogICAgIHJldHVybiBzcWxpdGUzX2Vycm1zZyht
X2RiKTsKIH0KIAorI2lmbmRlZiBOREVCVUcKK3ZvaWQgU1FMaXRlRGF0YWJhc2U6OmRpc2FibGVU
aHJlYWRpbmdDaGVja3MoKQoreworICAgIC8vIFRoaXMgZG9lc24ndCBndWFyYW50ZWUgdGhhdCBT
UUxpc3Qgd2FzIGNvbXBpbGVkIHdpdGggLURUSFJFQURTQUZFLCBvciB0aGF0IHlvdSBoYXZlbid0
IHR1cm5lZCBvZmYgdGhlIG11dGV4ZXMuCisjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMw
MDMwMDEKKyAgICBtX3NoYXJhYmxlID0gdHJ1ZTsKKyNlbHNlCisgICAgQVNTRVJUKDApOyAvLyBZ
b3VyIFNRTGl0ZSBkb2Vzbid0IHN1cHBvcnQgc2hhcmluZyBoYW5kbGVzIGFjcm9zcyB0aHJlYWRz
LgorI2VuZGlmCit9CisjZW5kaWYKKwogaW50IFNRTGl0ZURhdGFiYXNlOjphdXRob3JpemVyRnVu
Y3Rpb24odm9pZCogdXNlckRhdGEsIGludCBhY3Rpb25Db2RlLCBjb25zdCBjaGFyKiBwYXJhbWV0
ZXIxLCBjb25zdCBjaGFyKiBwYXJhbWV0ZXIyLCBjb25zdCBjaGFyKiAvKmRhdGFiYXNlTmFtZSov
LCBjb25zdCBjaGFyKiAvKnRyaWdnZXJfb3JfdmlldyovKQogewogICAgIERhdGFiYXNlQXV0aG9y
aXplciogYXV0aCA9IHN0YXRpY19jYXN0PERhdGFiYXNlQXV0aG9yaXplcio+KHVzZXJEYXRhKTsK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vc3FsL1NRTGl0ZURhdGFiYXNlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9zcWwvU1FMaXRlRGF0YWJhc2UuaAkocmV2aXNpb24gNTYyNDMp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL3NxbC9TUUxpdGVEYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC05Nyw3ICs5Nyw3IEBAIHB1YmxpYzoKICAgICBjb25zdCBjaGFyKiBsYXN0RXJyb3JNc2co
KTsKICAgICAKICAgICBzcWxpdGUzKiBzcWxpdGUzSGFuZGxlKCkgY29uc3QgewotICAgICAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fb3BlbmluZ1RocmVhZCk7CisgICAgICAgIEFTU0VS
VChtX3NoYXJhYmxlIHx8IGN1cnJlbnRUaHJlYWQoKSA9PSBtX29wZW5pbmdUaHJlYWQpOwogICAg
ICAgICByZXR1cm4gbV9kYjsKICAgICB9CiAgICAgCkBAIC0xMDgsNiArMTA4LDE0IEBAIHB1Ymxp
YzoKICAgICB2b2lkIHVubG9jaygpOwogICAgIGJvb2wgaXNBdXRvQ29tbWl0T24oKSBjb25zdDsK
IAorICAgIC8vIFNldCB0aGlzIGZsYWcgdG8gYWxsb3cgYWNjZXNzIGZyb20gbXVsdGlwbGUgdGhy
ZWFkcy4gIE5vdCBhbGwgbXVsdGktdGhyZWFkZWQgYWNjZXNzZXMgYXJlIHNhZmUhCisgICAgLy8g
U2VlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jdnN0cmFjL3dpa2k/cD1NdWx0aVRocmVhZGluZyBm
b3IgbW9yZSBpbmZvLgorI2lmbmRlZiBOREVCVUcKKyAgICB2b2lkIGRpc2FibGVUaHJlYWRpbmdD
aGVja3MoKTsKKyNlbHNlCisgICAgdm9pZCBkaXNhYmxlVGhyZWFkaW5nQ2hlY2tzKCkge30KKyNl
bmRpZgorCiBwcml2YXRlOgogICAgIHN0YXRpYyBpbnQgYXV0aG9yaXplckZ1bmN0aW9uKHZvaWQq
LCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIq
KTsKIApAQCAtMTIwLDYgKzEyOCw3IEBAIHByaXZhdGU6CiAgICAgaW50IG1fcGFnZVNpemU7CiAg
ICAgCiAgICAgYm9vbCBtX3RyYW5zYWN0aW9uSW5Qcm9ncmVzczsKKyAgICBib29sIG1fc2hhcmFi
bGU7CiAgICAgCiAgICAgTXV0ZXggbV9hdXRob3JpemVyTG9jazsKICAgICBSZWZQdHI8RGF0YWJh
c2VBdXRob3JpemVyPiBtX2F1dGhvcml6ZXI7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHAJKHJldmlz
aW9uIDU2MjQzKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzg5LDYgKzM4OSwxMCBAQCB2b2lkIERhdGFiYXNlOjptYXJrQXNEZWxldGVkQW5kQ2xv
c2UoKQogCiAgICAgbV9zY3JpcHRFeGVjdXRpb25Db250ZXh0LT5kYXRhYmFzZVRocmVhZCgpLT5z
Y2hlZHVsZUltbWVkaWF0ZVRhc2sodGFzay5yZWxlYXNlKCkpOwogICAgIHN5bmNocm9uaXplci53
YWl0Rm9yVGFza0NvbXBsZXRpb24oKTsKKworICAgIC8vIERhdGFiYXNlQ2xvc2VUYXNrIHRlbGxz
IERhdGFiYXNlOjpjbG9zZSBub3QgdG8gZG8gdGhlc2UgdHdvIHJlbW92YWxzIHNvIHRoYXQgd2Ug
Y2FuIGRvIHRoZW0gaGVyZSBzeW5jaHJvbm91c2x5LgorICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29u
dGV4dC0+cmVtb3ZlT3BlbkRhdGFiYXNlKHRoaXMpOworICAgIERhdGFiYXNlVHJhY2tlcjo6dHJh
Y2tlcigpLnJlbW92ZU9wZW5EYXRhYmFzZSh0aGlzKTsKIH0KIAogY2xhc3MgQ29udGV4dFJlbW92
ZU9wZW5EYXRhYmFzZVRhc2sgOiBwdWJsaWMgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzayB7
CkBAIC00MTUsNyArNDE5LDcgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8RGF0YWJhc2U+IG1fZGF0
YWJhc2U7CiB9OwogCi12b2lkIERhdGFiYXNlOjpjbG9zZSgpCit2b2lkIERhdGFiYXNlOjpjbG9z
ZShDbG9zZVBvbGljeSBwb2xpY3kpCiB7CiAgICAgUmVmUHRyPERhdGFiYXNlPiBwcm90ZWN0ID0g
dGhpczsKIApAQCAtNDQ0LDcgKzQ0OCw4IEBAIHZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKICAgICB9
CiAKICAgICBtX3NjcmlwdEV4ZWN1dGlvbkNvbnRleHQtPmRhdGFiYXNlVGhyZWFkKCktPnVuc2No
ZWR1bGVEYXRhYmFzZVRhc2tzKHRoaXMpOwotICAgIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dC0+
cG9zdFRhc2soQ29udGV4dFJlbW92ZU9wZW5EYXRhYmFzZVRhc2s6OmNyZWF0ZSh0aGlzKSk7Cisg
ICAgaWYgKHBvbGljeSA9PSBSZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0KQorICAgICAgICBtX3Nj
cmlwdEV4ZWN1dGlvbkNvbnRleHQtPnBvc3RUYXNrKENvbnRleHRSZW1vdmVPcGVuRGF0YWJhc2VU
YXNrOjpjcmVhdGUodGhpcykpOwogfQogCiB2b2lkIERhdGFiYXNlOjpzdG9wKCkKSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9E
YXRhYmFzZS5oCShyZXZpc2lvbiA1NjI0MykKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0xMDksNyArMTA5LDggQEAgcHVibGljOgogICAgIHZvaWQgbWFy
a0FzRGVsZXRlZEFuZENsb3NlKCk7CiAgICAgYm9vbCBkZWxldGVkKCkgY29uc3QgeyByZXR1cm4g
bV9kZWxldGVkOyB9CiAKLSAgICB2b2lkIGNsb3NlKCk7CisgICAgZW51bSBDbG9zZVBvbGljeSB7
IERvTm90UmVtb3ZlRGF0YWJhc2VGcm9tQ29udGV4dCwgUmVtb3ZlRGF0YWJhc2VGcm9tQ29udGV4
dCB9OworICAgIHZvaWQgY2xvc2UoQ2xvc2VQb2xpY3kpOwogICAgIGJvb2wgb3BlbmVkKCkgY29u
c3QgeyByZXR1cm4gbV9vcGVuZWQ7IH0KIAogICAgIHZvaWQgc3RvcCgpOwpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlRGV0YWlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFn
ZS9EYXRhYmFzZURldGFpbHMuaAkocmV2aXNpb24gNTYyNDMpCisrKyBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VEZXRhaWxzLmgJKHdvcmtpbmcgY29weSkKQEAgLTQxLDYgKzQxLDkgQEAgcHVibGlj
OgogICAgICAgICA6IG1fZXhwZWN0ZWRVc2FnZSgwKQogICAgICAgICAsIG1fY3VycmVudFVzYWdl
KDApCiAgICAgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgbV90aHJlYWQgPSBjdXJyZW50VGhy
ZWFkKCk7CisjZW5kaWYKICAgICB9CiAKICAgICBEYXRhYmFzZURldGFpbHMoY29uc3QgU3RyaW5n
JiBkYXRhYmFzZU5hbWUsIGNvbnN0IFN0cmluZyYgZGlzcGxheU5hbWUsIHVuc2lnbmVkIGxvbmcg
bG9uZyBleHBlY3RlZFVzYWdlLCB1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudFVzYWdlKQpAQCAt
NDksMTkgKzUyLDI3IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX2V4cGVjdGVkVXNhZ2UoZXhwZWN0
ZWRVc2FnZSkKICAgICAgICAgLCBtX2N1cnJlbnRVc2FnZShjdXJyZW50VXNhZ2UpCiAgICAgewor
I2lmbmRlZiBOREVCVUcKKyAgICAgICAgbV90aHJlYWQgPSBjdXJyZW50VGhyZWFkKCk7CisjZW5k
aWYKICAgICB9CiAKICAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25h
bWU7IH0KICAgICBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9k
aXNwbGF5TmFtZTsgfQogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBleHBlY3RlZFVzYWdlKCkgY29u
c3QgeyByZXR1cm4gbV9leHBlY3RlZFVzYWdlOyB9CiAgICAgdW5zaWduZWQgbG9uZyBsb25nIGN1
cnJlbnRVc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFVzYWdlOyB9CisjaWZuZGVmIE5E
RUJVRworICAgIFRocmVhZElkZW50aWZpZXIgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbV90aHJl
YWQ7IH0KKyNlbmRpZgogCiBwcml2YXRlOgogICAgIFN0cmluZyBtX25hbWU7CiAgICAgU3RyaW5n
IG1fZGlzcGxheU5hbWU7CiAgICAgdW5zaWduZWQgbG9uZyBsb25nIG1fZXhwZWN0ZWRVc2FnZTsK
ICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbV9jdXJyZW50VXNhZ2U7Ci0KKyNpZm5kZWYgTkRFQlVH
CisgICAgVGhyZWFkSWRlbnRpZmllciBtX3RocmVhZDsKKyNlbmRpZgogfTsKIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAJKHJldmlzaW9uIDU2
MjQzKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGFzay5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTExNyw3ICsxMTcsOCBAQCBEYXRhYmFzZUNsb3NlVGFzazo6RGF0YWJhc2VDbG9zZVRhc2so
RGF0CiAKIHZvaWQgRGF0YWJhc2VDbG9zZVRhc2s6OmRvUGVyZm9ybVRhc2soKQogewotICAgIGRh
dGFiYXNlKCktPmNsb3NlKCk7CisgICAgLy8gVGVsbCB0aGUgZGF0YWJhc2Ugbm90IHRvIGNhbGwg
YmFjayB0byB0aGUgY29udGV4dCB0aHJlYWQ7IHdlJ2xsIGhhbmRsZSBpdC4KKyAgICBkYXRhYmFz
ZSgpLT5jbG9zZShEYXRhYmFzZTo6RG9Ob3RSZW1vdmVEYXRhYmFzZUZyb21Db250ZXh0KTsKIH0K
IAogI2lmbmRlZiBOREVCVUcKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcAkocmV2
aXNpb24gNTYyNDMpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMTMsNyArMTEzLDcgQEAgdm9pZCogRGF0YWJhc2VUaHJlYWQ6OmRhdGFi
YXNlVGhyZWFkKCkKICAgICAgICAgb3BlblNldENvcHkuc3dhcChtX29wZW5EYXRhYmFzZVNldCk7
CiAgICAgICAgIERhdGFiYXNlU2V0OjppdGVyYXRvciBlbmQgPSBvcGVuU2V0Q29weS5lbmQoKTsK
ICAgICAgICAgZm9yIChEYXRhYmFzZVNldDo6aXRlcmF0b3IgaXQgPSBvcGVuU2V0Q29weS5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICgqaXQpLT5jbG9zZSgpOworICAgICAg
ICAgICAoKml0KS0+Y2xvc2UoRGF0YWJhc2U6OlJlbW92ZURhdGFiYXNlRnJvbUNvbnRleHQpOwog
ICAgIH0KIAogICAgIC8vIERldGFjaCB0aGUgdGhyZWFkIHNvIGl0cyByZXNvdXJjZXMgYXJlIG5v
IGxvbmdlciBvZiBhbnkgY29uY2VybiB0byBhbnlvbmUgZWxzZQpJbmRleDogV2ViQ29yZS9zdG9y
YWdlL0RhdGFiYXNlVHJhY2tlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0Rh
dGFiYXNlVHJhY2tlci5jcHAJKHJldmlzaW9uIDU2MjQzKQorKysgV2ViQ29yZS9zdG9yYWdlL0Rh
dGFiYXNlVHJhY2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUxLDEzICs1MSwxOSBAQCB1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLU9yaWdpblF1b3RhTWFu
YWdlciYgRGF0YWJhc2VUcmFja2VyOjpvcmlnaW5RdW90YU1hbmFnZXIoKQorT3JpZ2luUXVvdGFN
YW5hZ2VyJiBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpCiB7Ci0g
ICAgcG9wdWxhdGVPcmlnaW5zKCk7CiAgICAgQVNTRVJUKG1fcXVvdGFNYW5hZ2VyKTsKICAgICBy
ZXR1cm4gKm1fcXVvdGFNYW5hZ2VyOwogfQogCitPcmlnaW5RdW90YU1hbmFnZXImIERhdGFiYXNl
VHJhY2tlcjo6b3JpZ2luUXVvdGFNYW5hZ2VyKCkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrRGF0
YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKKyAgICByZXR1
cm4gb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCk7Cit9CisKIERhdGFiYXNlVHJhY2tlciYgRGF0
YWJhc2VUcmFja2VyOjp0cmFja2VyKCkKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERhdGFi
YXNlVHJhY2tlciwgdHJhY2tlciwgKCkpOwpAQCAtNjYsMzYgKzcyLDMwIEBAIERhdGFiYXNlVHJh
Y2tlciYgRGF0YWJhc2VUcmFja2VyOjp0cmFja2UKIAogRGF0YWJhc2VUcmFja2VyOjpEYXRhYmFz
ZVRyYWNrZXIoKQogICAgIDogbV9jbGllbnQoMCkKLSAgICAsIG1fcHJvcG9zZWREYXRhYmFzZSgw
KQotI2lmbmRlZiBOREVCVUcKLSAgICAsIG1fdGhyZWFkKGN1cnJlbnRUaHJlYWQoKSkKLSNlbmRp
ZgogewogICAgIFNRTGl0ZUZpbGVTeXN0ZW06OnJlZ2lzdGVyU1FMaXRlVkZTKCk7CiB9CiAKIHZv
aWQgRGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURpcmVjdG9yeVBhdGgoY29uc3QgU3RyaW5n
JiBwYXRoKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAg
IE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogICAgIEFTU0VSVCgh
bV9kYXRhYmFzZS5pc09wZW4oKSk7Ci0gICAgbV9kYXRhYmFzZURpcmVjdG9yeVBhdGggPSBwYXRo
OworICAgIG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoID0gcGF0aC50aHJlYWRzYWZlQ29weSgpOwog
fQogCi1jb25zdCBTdHJpbmcmIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VEaXJlY3RvcnlQYXRo
KCkgY29uc3QKK1N0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlRGlyZWN0b3J5UGF0aCgp
IGNvbnN0CiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0gICAg
cmV0dXJuIG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoOworICAgIHJldHVybiBtX2RhdGFiYXNlRGly
ZWN0b3J5UGF0aC50aHJlYWRzYWZlQ29weSgpOwogfQogCiBTdHJpbmcgRGF0YWJhc2VUcmFja2Vy
Ojp0cmFja2VyRGF0YWJhc2VQYXRoKCkgY29uc3QKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVh
ZCgpID09IG1fdGhyZWFkKTsKICAgICByZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0
YWJhc2VGaWxlTmFtZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aCwgIkRhdGFiYXNlcy5k
YiIpOwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6b3BlblRyYWNrZXJEYXRhYmFzZShib29s
IGNyZWF0ZUlmRG9lc05vdEV4aXN0KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0g
bV90aHJlYWQpOworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAKICAg
ICBpZiAobV9kYXRhYmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMTA2LDY3ICsx
MDYsOTggQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6Om9wZW5UcmFja2VyRGF0YWJhcwogCiAgICAg
aWYgKCFtX2RhdGFiYXNlLm9wZW4oZGF0YWJhc2VQYXRoKSkgewogICAgICAgICAvLyBGSVhNRTog
V2hhdCBkbyBkbyBoZXJlPworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGRhdGFi
YXNlUGF0aCAlcy4iLCBkYXRhYmFzZVBhdGguYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICByZXR1
cm47CiAgICAgfQorICAgIG1fZGF0YWJhc2UuZGlzYWJsZVRocmVhZGluZ0NoZWNrcygpOwogICAg
IGlmICghbV9kYXRhYmFzZS50YWJsZUV4aXN0cygiT3JpZ2lucyIpKSB7CiAgICAgICAgIGlmICgh
bV9kYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIE9yaWdpbnMgKG9yaWdpbiBU
RVhUIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCBxdW90YSBJTlRFR0VSIE5PVCBOVUxMIE9O
IENPTkZMSUNUIEZBSUwpOyIpKSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogYW5kIGhlcmUKKyAg
ICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBPcmlnaW5zIHRhYmxlIik7CiAg
ICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFtX2RhdGFiYXNlLnRhYmxlRXhpc3RzKCJEYXRhYmFz
ZXMiKSkgewogICAgICAgICBpZiAoIW1fZGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBU
QUJMRSBEYXRhYmFzZXMgKGd1aWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCBv
cmlnaW4gVEVYVCwgbmFtZSBURVhULCBkaXNwbGF5TmFtZSBURVhULCBlc3RpbWF0ZWRTaXplIElO
VEVHRVIsIHBhdGggVEVYVCk7IikpIHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBhbmQgaGVyZQor
ICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIERhdGFiYXNlcyB0YWJsZSIp
OwogICAgICAgICB9CiAgICAgfQogfQogCiBib29sIERhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0YWJs
aXNoRGF0YWJhc2UoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCwgY29uc3QgU3RyaW5n
JiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNpZ25lZCBsb25nIGVzdGltYXRl
ZFNpemUpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7CisgICAg
U2VjdXJpdHlPcmlnaW4qIG9yaWdpbiA9IGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCk7CisgICAg
UHJvcG9zZWREYXRhYmFzZSBkZXRhaWxzOwogCi0gICAgLy8gUG9wdWxhdGUgdGhlIG9yaWdpbnMg
YmVmb3JlIHdlIGVzdGFibGlzaCBhIGRhdGFiYXNlOyB0aGlzIGd1YXJhbnRlZXMgdGhhdCBxdW90
YUZvck9yaWdpbgotICAgIC8vIGNhbiBydW4gb24gdGhlIGRhdGFiYXNlIHRocmVhZCBsYXRlci4K
LSAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVxdWlyZW1l
bnQ7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXBVc2FnZTsKKyAgICB7CisgICAgICAgIExv
Y2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IGxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7Cisg
ICAgICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogCi0gICAg
U2VjdXJpdHlPcmlnaW4qIG9yaWdpbiA9IGNvbnRleHQtPnNlY3VyaXR5T3JpZ2luKCk7CisgICAg
ICAgIGlmICghY2FuQ3JlYXRlRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKIAotICAgIC8vIFNpbmNlIHdlJ3JlIGltbWluZW50bHkgb3BlbmluZyBhIGRh
dGFiYXNlIHdpdGhpbiB0aGlzIGNvbnRleHQncyBvcmlnaW4sIG1ha2Ugc3VyZSB0aGlzIG9yaWdp
biBpcyBiZWluZyB0cmFja2VkIGJ5IHRoZSBRdW90YVRyYWNrZXIKLSAgICAvLyBieSBmZXRjaGlu
ZyBpdCdzIGN1cnJlbnQgdXNhZ2Ugbm93Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHVzYWdlID0g
dXNhZ2VGb3JPcmlnaW4ob3JpZ2luKTsKKyAgICAgICAgcmVjb3JkQ3JlYXRpbmdEYXRhYmFzZShv
cmlnaW4sIG5hbWUpOwogCi0gICAgLy8gSWYgYSBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cywgaWdu
b3JlIHRoZSBwYXNzZWQtaW4gZXN0aW1hdGVkIHNpemUgYW5kIHNheSBpdCdzIE9LLgotICAgIGlm
IChoYXNFbnRyeUZvckRhdGFiYXNlKG9yaWdpbiwgbmFtZSkpCi0gICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKIAotICAgIC8vIElmIHRoZSBkYXRhYmFzZSB3
aWxsIGZpdCwgYWxsb3cgaXRzIGNyZWF0aW9uLgotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZXF1
aXJlbWVudCA9IHVzYWdlICsgbWF4KDFVTCwgZXN0aW1hdGVkU2l6ZSk7Ci0gICAgaWYgKHJlcXVp
cmVtZW50IDwgdXNhZ2UpCi0gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWYgdGhlIGVzdGltYXRl
ZCBzaXplIGlzIHNvIGJpZyBpdCBjYXVzZXMgYW4gb3ZlcmZsb3csIGRvbid0IGFsbG93IGNyZWF0
aW9uLgotICAgIGlmIChyZXF1aXJlbWVudCA8PSBxdW90YUZvck9yaWdpbihvcmlnaW4pKQotICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gU2luY2Ugd2UncmUgaW1taW5lbnRseSBvcGVu
aW5nIGEgZGF0YWJhc2Ugd2l0aGluIHRoaXMgY29udGV4dCdzIG9yaWdpbiwgbWFrZSBzdXJlIHRo
aXMgb3JpZ2luIGlzIGJlaW5nIHRyYWNrZWQgYnkgdGhlIFF1b3RhVHJhY2tlcgorICAgICAgICAv
LyBieSBmZXRjaGluZyBpdHMgY3VycmVudCB1c2FnZSBub3cuCisgICAgICAgIHVuc2lnbmVkIGxv
bmcgbG9uZyB1c2FnZSA9IHVzYWdlRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7CisKKyAgICAgICAg
Ly8gSWYgYSBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cywgaWdub3JlIHRoZSBwYXNzZWQtaW4gZXN0
aW1hdGVkIHNpemUgYW5kIHNheSBpdCdzIE9LLgorICAgICAgICBpZiAoaGFzRW50cnlGb3JEYXRh
YmFzZShvcmlnaW4sIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAvLyBH
aXZlIHRoZSBjaHJvbWUgY2xpZW50IGEgY2hhbmNlIHRvIGluY3JlYXNlIHRoZSBxdW90YS4KLSAg
ICAvLyBUZW1wb3JhcmlseSBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBwcm9wb3NlZCBkYXRhYmFz
ZSBhdmFpbGFibGUsIHNvIHRoZSBjbGllbnQgY2FuIGdldCBhdCB0aGVtLgotICAgIHBhaXI8U2Vj
dXJpdHlPcmlnaW4qLCBEYXRhYmFzZURldGFpbHM+IGRldGFpbHMob3JpZ2luLCBEYXRhYmFzZURl
dGFpbHMobmFtZSwgZGlzcGxheU5hbWUsIGVzdGltYXRlZFNpemUsIDApKTsKLSAgICBtX3Byb3Bv
c2VkRGF0YWJhc2UgPSAmZGV0YWlsczsKKyAgICAgICAgLy8gSWYgdGhlIGRhdGFiYXNlIHdpbGwg
Zml0LCBhbGxvdyBpdHMgY3JlYXRpb24uCisgICAgICAgIHJlcXVpcmVtZW50ID0gdXNhZ2UgKyBt
YXgoMVVMLCBlc3RpbWF0ZWRTaXplKTsKKyAgICAgICAgdGVtcFVzYWdlID0gdXNhZ2U7CisgICAg
ICAgIGlmIChyZXF1aXJlbWVudCA8IHVzYWdlKSB7CisgICAgICAgICAgICBkb25lQ3JlYXRpbmdE
YXRhYmFzZShvcmlnaW4sIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJZiB0
aGUgZXN0aW1hdGVkIHNpemUgaXMgc28gYmlnIGl0IGNhdXNlcyBhbiBvdmVyZmxvdywgZG9uJ3Qg
YWxsb3cgY3JlYXRpb24uCisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcXVpcmVtZW50IDw9IHF1
b3RhRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgICAgICAvLyBHaXZlIHRoZSBjaHJvbWUgY2xpZW50IGEgY2hhbmNlIHRvIGluY3JlYXNlIHRo
ZSBxdW90YS4KKyAgICAgICAgLy8gVGVtcG9yYXJpbHkgbWFrZSB0aGUgZGV0YWlscyBvZiB0aGUg
cHJvcG9zZWQgZGF0YWJhc2UgYXZhaWxhYmxlLCBzbyB0aGUgY2xpZW50IGNhbiBnZXQgYXQgdGhl
bS4KKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCByZWFsbHkganVzdCBwYXNzIHRoZSBkZXRh
aWxzIGludG8gdGhpcyBjYWxsLCByYXRoZXIgdGhhbiB1c2luZyBtX3Byb3Bvc2VkRGF0YWJhc2Vz
LgorICAgICAgICBkZXRhaWxzID0gUHJvcG9zZWREYXRhYmFzZShvcmlnaW4tPnRocmVhZHNhZmVD
b3B5KCksIERhdGFiYXNlRGV0YWlscyhuYW1lLnRocmVhZHNhZmVDb3B5KCksIGRpc3BsYXlOYW1l
LnRocmVhZHNhZmVDb3B5KCksIGVzdGltYXRlZFNpemUsIDApKTsKKyAgICAgICAgbV9wcm9wb3Nl
ZERhdGFiYXNlcy5hZGQoJmRldGFpbHMpOworICAgIH0KKyAgICAvLyBEcm9wIGFsbCBsb2NrcyBi
ZWZvcmUgY2FsbGluZyBvdXQ7IHdlIGRvbid0IGtub3cgd2hhdCB0aGV5J2xsIGRvLgogICAgIGNv
bnRleHQtPmRhdGFiYXNlRXhjZWVkZWRRdW90YShuYW1lKTsKLSAgICBtX3Byb3Bvc2VkRGF0YWJh
c2UgPSAwOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJh
c2VHdWFyZCk7CisgICAgICAgIG1fcHJvcG9zZWREYXRhYmFzZXMucmVtb3ZlKCZkZXRhaWxzKTsK
KyAgICB9CiAKICAgICAvLyBJZiB0aGUgZGF0YWJhc2Ugd2lsbCBmaXQgbm93LCBhbGxvdyBpdHMg
Y3JlYXRpb24uCi0gICAgcmV0dXJuIHJlcXVpcmVtZW50IDw9IHF1b3RhRm9yT3JpZ2luKG9yaWdp
bik7CisgICAgaWYgKHJlcXVpcmVtZW50IDw9IHF1b3RhRm9yT3JpZ2luKG9yaWdpbikpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgZG9uZUNyZWF0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1l
KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpoYXNFbnRy
eUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKQoreworICAgIEFTU0VSVCgh
bV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgQVNTRVJUKG1fcXVvdGFNYXApOworICAg
IHJldHVybiBtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pOwogfQogCiBib29sIERhdGFiYXNl
VHJhY2tlcjo6aGFzRW50cnlGb3JPcmlnaW4oU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAg
ICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBNdXRleExvY2tlciBs
b2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKLSAg
ICBNdXRleExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJkKTsKLSAgICByZXR1cm4g
bV9xdW90YU1hcC0+Y29udGFpbnMob3JpZ2luKTsKKyAgICByZXR1cm4gaGFzRW50cnlGb3JPcmln
aW5Ob0xvY2sob3JpZ2luKTsKIH0KIAogYm9vbCBEYXRhYmFzZVRyYWNrZXI6Omhhc0VudHJ5Rm9y
RGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZUlk
ZW50aWZpZXIpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Cisg
ICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKICAgICBvcGVuVHJhY2tlckRh
dGFiYXNlKGZhbHNlKTsKICAgICBpZiAoIW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKQEAgLTE5MywxNiArMjI0LDE3IEBAIHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRh
YmFzZVRyYWNrZXI6OmdldE0KIAogU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6b3JpZ2luUGF0aChT
ZWN1cml0eU9yaWdpbiogb3JpZ2luKSBjb25zdAogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFk
KCkgPT0gbV90aHJlYWQpOwotICAgIHJldHVybiBTUUxpdGVGaWxlU3lzdGVtOjphcHBlbmREYXRh
YmFzZUZpbGVOYW1lVG9QYXRoKG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpKTsKKyAgICByZXR1cm4gU1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0
YWJhc2VGaWxlTmFtZVRvUGF0aChtX2RhdGFiYXNlRGlyZWN0b3J5UGF0aC50aHJlYWRzYWZlQ29w
eSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIH0KIAotU3RyaW5nIERhdGFiYXNl
VHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZShTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25z
dCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RFeGlzdHMpCitTdHJpbmcgRGF0YWJhc2VU
cmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4s
IGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZk5vdEV4aXN0cykKIHsKLSAgICBBU1NF
UlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VH
dWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVCghb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCku
dHJ5TG9jaygpKTsKIAotICAgIGlmIChtX3Byb3Bvc2VkRGF0YWJhc2UgJiYgbV9wcm9wb3NlZERh
dGFiYXNlLT5maXJzdCA9PSBvcmlnaW4gJiYgbV9wcm9wb3NlZERhdGFiYXNlLT5zZWNvbmQubmFt
ZSgpID09IG5hbWUpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICBmb3IgKEhhc2hTZXQ8
UHJvcG9zZWREYXRhYmFzZSo+OjppdGVyYXRvciBpdGVyID0gbV9wcm9wb3NlZERhdGFiYXNlcy5i
ZWdpbigpOyBpdGVyICE9IG1fcHJvcG9zZWREYXRhYmFzZXMuZW5kKCk7ICsraXRlcikKKyAgICAg
ICAgaWYgKCgqaXRlciktPmZpcnN0ID09IG9yaWdpbiAmJiAoKml0ZXIpLT5zZWNvbmQubmFtZSgp
ID09IG5hbWUpCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAgICBTdHJpbmcgb3Jp
Z2luSWRlbnRpZmllciA9IG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCk7CiAgICAgU3RyaW5n
IG9yaWdpblBhdGggPSB0aGlzLT5vcmlnaW5QYXRoKG9yaWdpbik7CkBAIC0yMTIsNyArMjQ0LDYg
QEAgU3RyaW5nIERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYgogICAgICAgICByZXR1
cm4gU3RyaW5nKCk7CiAKICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHBhdGggZm9yIHRoaXMgZGF0
YWJhc2UgeWV0Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7CiAgICAgaWYgKCFtX2Rh
dGFiYXNlLmlzT3BlbigpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgU1FMaXRlU3Rh
dGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIHBhdGggRlJPTSBEYXRhYmFzZXMg
V0hFUkUgb3JpZ2luPT8gQU5EIG5hbWU9PzsiKTsKQEAgLTIzMSwzNiArMjYyLDQyIEBAIFN0cmlu
ZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWIKICAgICAgICAgcmV0dXJuIFN0cmlu
ZygpOwogCiAgICAgaWYgKHJlc3VsdCAhPSBTUUxSZXN1bHREb25lKSB7Ci0gICAgICAgIExPR19F
UlJPUigiRmFpbGVkIHRvIHJldHJpZXZlIGZpbGVuYW1lIGZyb20gRGF0YWJhc2UgVHJhY2tlciBm
b3Igb3JpZ2luICVzLCBuYW1lICVzIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2Np
aSgpLmRhdGEoKSwgbmFtZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIExPR19FUlJPUigiRmFp
bGVkIHRvIHJldHJpZXZlIGZpbGVuYW1lIGZyb20gRGF0YWJhc2UgVHJhY2tlciBmb3Igb3JpZ2lu
ICVzLCBuYW1lICVzIiwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSwgbmFtZS5hc2Np
aSgpLmRhdGEoKSk7CiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKICAgICB9CiAgICAgc3RhdGVt
ZW50LmZpbmFsaXplKCk7CiAKLSAgICBTdHJpbmcgZmlsZU5hbWUgPSBTUUxpdGVGaWxlU3lzdGVt
OjpnZXRGaWxlTmFtZUZvck5ld0RhdGFiYXNlKG9yaWdpblBhdGgsIG5hbWUsIG9yaWdpbi0+ZGF0
YWJhc2VJZGVudGlmaWVyKCksICZtX2RhdGFiYXNlKTsKKyAgICBTdHJpbmcgZmlsZU5hbWUgPSBT
UUxpdGVGaWxlU3lzdGVtOjpnZXRGaWxlTmFtZUZvck5ld0RhdGFiYXNlKG9yaWdpblBhdGgsIG5h
bWUsIG9yaWdpbklkZW50aWZpZXIsICZtX2RhdGFiYXNlKTsKICAgICBpZiAoIWFkZERhdGFiYXNl
KG9yaWdpbiwgbmFtZSwgZmlsZU5hbWUpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKICAg
ICAvLyBJZiB0aGlzIG9yaWdpbidzIHF1b3RhIGlzIGJlaW5nIHRyYWNrZWQgKG9wZW4gaGFuZGxl
IHRvIGEgZGF0YWJhc2UgaW4gdGhpcyBvcmlnaW4pLCBhZGQgdGhpcyBuZXcgZGF0YWJhc2UKICAg
ICAvLyB0byB0aGUgcXVvdGEgbWFuYWdlciBub3cKICAgICBTdHJpbmcgZnVsbEZpbGVQYXRoID0g
U1FMaXRlRmlsZVN5c3RlbTo6YXBwZW5kRGF0YWJhc2VGaWxlTmFtZVRvUGF0aChvcmlnaW5QYXRo
LCBmaWxlTmFtZSk7Ci0gICAgewotICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBs
b2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwotICAgICAgICBpZiAob3JpZ2luUXVvdGFNYW5h
Z2VyKCkudHJhY2tzT3JpZ2luKG9yaWdpbikpCi0gICAgICAgICAgICBvcmlnaW5RdW90YU1hbmFn
ZXIoKS5hZGREYXRhYmFzZShvcmlnaW4sIG5hbWUsIGZ1bGxGaWxlUGF0aCk7Ci0gICAgfQorICAg
IGlmIChvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKKyAg
ICAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkuYWRkRGF0YWJhc2Uob3JpZ2luLCBuYW1l
LCBmdWxsRmlsZVBhdGgpOwogCiAgICAgcmV0dXJuIGZ1bGxGaWxlUGF0aDsKIH0KIAorU3RyaW5n
IERhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFzZShTZWN1cml0eU9yaWdpbiogb3Jp
Z2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgY3JlYXRlSWZOb3RFeGlzdHMpCit7CisgICAg
TG9ja2VyPE9yaWdpblF1b3RhTWFuYWdlcj4gbG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsK
KyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICBwb3B1
bGF0ZU9yaWdpbnMoKTsKKworICAgIHJldHVybiBmdWxsUGF0aEZvckRhdGFiYXNlTm9Mb2NrKG9y
aWdpbiwgbmFtZSwgY3JlYXRlSWZOb3RFeGlzdHMpLnRocmVhZHNhZmVDb3B5KCk7Cit9CisKIHZv
aWQgRGF0YWJhc2VUcmFja2VyOjpwb3B1bGF0ZU9yaWdpbnMoKQogeworICAgIEFTU0VSVCghbV9k
YXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CiAgICAgaWYgKG1fcXVvdGFNYXApCiAgICAgICAgIHJl
dHVybjsKIAotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotCiAgICAg
bV9xdW90YU1hcC5zZXQobmV3IFF1b3RhTWFwKTsKLSAgICBtX3F1b3RhTWFuYWdlci5zZXQobmV3
IE9yaWdpblF1b3RhTWFuYWdlcik7CisgICAgaWYgKCFtX3F1b3RhTWFuYWdlcikKKyAgICAgICAg
bV9xdW90YU1hbmFnZXIuc2V0KG5ldyBPcmlnaW5RdW90YU1hbmFnZXIpOwogCiAgICAgb3BlblRy
YWNrZXJEYXRhYmFzZShmYWxzZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQpAQCAt
MjY4LDMwICszMDUsMzIgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnBvcHVsYXRlT3JpZ2lucygp
CiAKICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJTRUxFQ1Qgb3Jp
Z2luLCBxdW90YSBGUk9NIE9yaWdpbnMiKTsKIAotICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgp
ICE9IFNRTFJlc3VsdE9rKQorICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3Vs
dE9rKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgc3RhdGVtZW50LiIp
OwogICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgaW50IHJlc3VsdDsKICAgICB3aGlsZSAo
KHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCkpID09IFNRTFJlc3VsdFJvdykgewogICAgICAgICBS
ZWZQdHI8U2VjdXJpdHlPcmlnaW4+IG9yaWdpbiA9IFNlY3VyaXR5T3JpZ2luOjpjcmVhdGVGcm9t
RGF0YWJhc2VJZGVudGlmaWVyKHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApKTsKLSAgICAgICAg
bV9xdW90YU1hcC0+c2V0KG9yaWdpbi5nZXQoKSwgc3RhdGVtZW50LmdldENvbHVtbkludDY0KDEp
KTsKKyAgICAgICAgbV9xdW90YU1hcC0+c2V0KG9yaWdpbi5nZXQoKS0+dGhyZWFkc2FmZUNvcHko
KSwgc3RhdGVtZW50LmdldENvbHVtbkludDY0KDEpKTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0
ICE9IFNRTFJlc3VsdERvbmUpCi0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgaW4g
YWxsIG9yaWdpbnMgZnJvbSB0aGUgZGF0YWJhc2UiKTsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWls
ZWQgdG8gcmVhZCBpbiBhbGwgb3JpZ2lucyBmcm9tIHRoZSBkYXRhYmFzZS4iKTsKIH0KIAogdm9p
ZCBEYXRhYmFzZVRyYWNrZXI6Om9yaWdpbnMoVmVjdG9yPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4g
PiYgcmVzdWx0KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwor
ICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogICAgIHBvcHVs
YXRlT3JpZ2lucygpOwotICAgIE11dGV4TG9ja2VyIGxvY2tRdW90YU1hcChtX3F1b3RhTWFwR3Vh
cmQpOworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKICAgICBjb3B5S2V5c1RvVmVjdG9yKCptX3F1
b3RhTWFwLCByZXN1bHQpOwogfQogCi1ib29sIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1l
c0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBWZWN0b3I8U3RyaW5nPiYgcmVzdWx0
VmVjdG9yKQorYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xv
Y2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgVmVjdG9yPFN0cmluZz4mIHJlc3VsdFZlY3RvcikK
IHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NFUlQo
IW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOwogICAgIG9wZW5UcmFja2VyRGF0YWJhc2UoZmFs
c2UpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKICAgICAgICAgcmV0dXJuIGZhbHNl
OwpAQCAtMzE1LDQ0ICszNTQsNjUgQEAgYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRhdGFiYXNlTmFt
ZXNGb3JPcgogICAgIHJldHVybiB0cnVlOwogfQogCi1EYXRhYmFzZURldGFpbHMgRGF0YWJhc2VU
cmFja2VyOjpkZXRhaWxzRm9yTmFtZUFuZE9yaWdpbihjb25zdCBTdHJpbmcmIG5hbWUsIFNlY3Vy
aXR5T3JpZ2luKiBvcmlnaW4pCitib29sIERhdGFiYXNlVHJhY2tlcjo6ZGF0YWJhc2VOYW1lc0Zv
ck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBWZWN0b3I8U3RyaW5nPiYgcmVzdWx0VmVj
dG9yKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOworICAgIE11
dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgIFZlY3RvcjxTdHJp
bmc+IHRlbXA7CisgICAgaWYgKCFkYXRhYmFzZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbiwg
dGVtcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChtX3Byb3Bvc2VkRGF0YWJh
c2UgJiYgbV9wcm9wb3NlZERhdGFiYXNlLT5maXJzdCA9PSBvcmlnaW4gJiYgbV9wcm9wb3NlZERh
dGFiYXNlLT5zZWNvbmQubmFtZSgpID09IG5hbWUpCi0gICAgICAgIHJldHVybiBtX3Byb3Bvc2Vk
RGF0YWJhc2UtPnNlY29uZDsKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRvciBpdGVy
ID0gdGVtcC5iZWdpbigpOyBpdGVyICE9IHRlbXAuZW5kKCk7ICsraXRlcikKKyAgICAgICAgcmVz
dWx0VmVjdG9yLmFwcGVuZChpdGVyLT50aHJlYWRzYWZlQ29weSgpKTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KIAorRGF0YWJhc2VEZXRhaWxzIERhdGFiYXNlVHJhY2tlcjo6ZGV0YWlsc0Zvck5hbWVB
bmRPcmlnaW4oY29uc3QgU3RyaW5nJiBuYW1lLCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKQorewog
ICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVyID0gb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIo
KTsKKyAgICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgaW50NjRfdCBleHBlY3RlZFVzYWdlOwog
Ci0gICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlz
T3BlbigpKQotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7Ci0gICAgU1FMaXRlU3Rh
dGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiU0VMRUNUIGRpc3BsYXlOYW1lLCBlc3RpbWF0
ZWRTaXplIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT8iKTsKLSAgICBp
ZiAoc3RhdGVtZW50LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKLSAgICAgICAgcmV0dXJuIERh
dGFiYXNlRGV0YWlscygpOwotCi0gICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50
aWZpZXIpOwotICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBuYW1lKTsKKyAgICB7CisgICAgICAg
IE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOwogCi0gICAgaW50IHJl
c3VsdCA9IHN0YXRlbWVudC5zdGVwKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBTUUxSZXN1bHREb25l
KQotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKCk7CisgICAgICAgIGZvciAoSGFzaFNl
dDxQcm9wb3NlZERhdGFiYXNlKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX3Byb3Bvc2VkRGF0YWJhc2Vz
LmJlZ2luKCk7IGl0ZXIgIT0gbV9wcm9wb3NlZERhdGFiYXNlcy5lbmQoKTsgKytpdGVyKQorICAg
ICAgICAgICAgaWYgKCgqaXRlciktPmZpcnN0ID09IG9yaWdpbiAmJiAoKml0ZXIpLT5zZWNvbmQu
bmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoKCppdGVyKS0+c2Vjb25k
LnRocmVhZCgpID09IGN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgq
aXRlciktPnNlY29uZDsKKyAgICAgICAgICAgIH0KIAotICAgIGlmIChyZXN1bHQgIT0gU1FMUmVz
dWx0Um93KSB7Ci0gICAgICAgIExPR19FUlJPUigiRXJyb3IgcmV0cmlldmluZyBkZXRhaWxzIGZv
ciBkYXRhYmFzZSAlcyBpbiBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIGRhdGFiYXNlIiwgbmFtZS5h
c2NpaSgpLmRhdGEoKSwgb3JpZ2luSWRlbnRpZmllci5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAg
IHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKyAgICAgICAgb3BlblRyYWNrZXJEYXRhYmFzZShm
YWxzZSk7CisgICAgICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgICAgIHJl
dHVybiBEYXRhYmFzZURldGFpbHMoKTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVu
dChtX2RhdGFiYXNlLCAiU0VMRUNUIGRpc3BsYXlOYW1lLCBlc3RpbWF0ZWRTaXplIEZST00gRGF0
YWJhc2VzIFdIRVJFIG9yaWdpbj0/IEFORCBuYW1lPT8iKTsKKyAgICAgICAgaWYgKHN0YXRlbWVu
dC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spCisgICAgICAgICAgICByZXR1cm4gRGF0YWJhc2VE
ZXRhaWxzKCk7CisKKyAgICAgICAgc3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbklkZW50aWZp
ZXIpOworICAgICAgICBzdGF0ZW1lbnQuYmluZFRleHQoMiwgbmFtZSk7CisKKyAgICAgICAgaW50
IHJlc3VsdCA9IHN0YXRlbWVudC5zdGVwKCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gU1FMUmVz
dWx0RG9uZSkKKyAgICAgICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsKKworICAgICAg
ICBpZiAocmVzdWx0ICE9IFNRTFJlc3VsdFJvdykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJF
cnJvciByZXRyaWV2aW5nIGRldGFpbHMgZm9yIGRhdGFiYXNlICVzIGluIG9yaWdpbiAlcyBmcm9t
IHRyYWNrZXIgZGF0YWJhc2UiLCBuYW1lLmFzY2lpKCkuZGF0YSgpLCBvcmlnaW5JZGVudGlmaWVy
LmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMoKTsK
KyAgICAgICAgfQorICAgICAgICBkaXNwbGF5TmFtZSA9IHN0YXRlbWVudC5nZXRDb2x1bW5UZXh0
KDApOworICAgICAgICBleHBlY3RlZFVzYWdlID0gc3RhdGVtZW50LmdldENvbHVtbkludDY0KDEp
OwogICAgIH0KIAotICAgIHJldHVybiBEYXRhYmFzZURldGFpbHMobmFtZSwgc3RhdGVtZW50Lmdl
dENvbHVtblRleHQoMCksIHN0YXRlbWVudC5nZXRDb2x1bW5JbnQ2NCgxKSwgdXNhZ2VGb3JEYXRh
YmFzZShuYW1lLCBvcmlnaW4pKTsKKyAgICByZXR1cm4gRGF0YWJhc2VEZXRhaWxzKG5hbWUsIGRp
c3BsYXlOYW1lLCBleHBlY3RlZFVzYWdlLCB1c2FnZUZvckRhdGFiYXNlKG5hbWUsIG9yaWdpbikp
OwogfQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxzKFNlY3VyaXR5
T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBkaXNwbGF5
TmFtZSwgdW5zaWduZWQgbG9uZyBlc3RpbWF0ZWRTaXplKQogewotICAgIEFTU0VSVChjdXJyZW50
VGhyZWFkKCkgPT0gbV90aHJlYWQpOwotCiAgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXIgPSBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpOwogICAgIGludDY0X3QgZ3VpZCA9IDA7CiAKKyAg
ICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKwogICAgIG9wZW5U
cmFja2VyRGF0YWJhc2UodHJ1ZSk7CiAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3BlbigpKQogICAg
ICAgICByZXR1cm47CkBAIC00MDAsNyArNDYwLDYgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnNl
dERhdGFiYXNlRGV0YWlscwogCiB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjp1
c2FnZUZvckRhdGFiYXNlKGNvbnN0IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlPcmlnaW4qIG9yaWdp
bikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKICAgICBTdHJp
bmcgcGF0aCA9IGZ1bGxQYXRoRm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lLCBmYWxzZSk7CiAgICAg
aWYgKHBhdGguaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gMDsKQEAgLTQyMiwxOCArNDgxLDIx
IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjphZGRPcGVuRGF0YWJhc2UoRGEKICAgICBEYXRhYmFz
ZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KGRhdGFiYXNlLT5zZWN1
cml0eU9yaWdpbigpKTsKICAgICBpZiAoIW5hbWVNYXApIHsKICAgICAgICAgbmFtZU1hcCA9IG5l
dyBEYXRhYmFzZU5hbWVNYXA7Ci0gICAgICAgIG1fb3BlbkRhdGFiYXNlTWFwLT5zZXQoZGF0YWJh
c2UtPnNlY3VyaXR5T3JpZ2luKCksIG5hbWVNYXApOworICAgICAgICBtX29wZW5EYXRhYmFzZU1h
cC0+c2V0KGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigpLT50aHJlYWRzYWZlQ29weSgpLCBuYW1l
TWFwKTsKICAgICB9CiAKICAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQgPSBuYW1lTWFwLT5n
ZXQobmFtZSk7CiAgICAgaWYgKCFkYXRhYmFzZVNldCkgewogICAgICAgICBkYXRhYmFzZVNldCA9
IG5ldyBEYXRhYmFzZVNldDsKLSAgICAgICAgbmFtZU1hcC0+c2V0KG5hbWUsIGRhdGFiYXNlU2V0
KTsKKyAgICAgICAgbmFtZU1hcC0+c2V0KG5hbWUudGhyZWFkc2FmZUNvcHkoKSwgZGF0YWJhc2VT
ZXQpOwogICAgIH0KIAogICAgIGRhdGFiYXNlU2V0LT5hZGQoZGF0YWJhc2UpOwogCiAgICAgTE9H
KFN0b3JhZ2VBUEksICJBZGRlZCBvcGVuIERhdGFiYXNlICVzICglcClcbiIsIGRhdGFiYXNlLT5z
dHJpbmdJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCksIGRhdGFiYXNlKTsKKworICAgIE11dGV4
TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgIGRvbmVDcmVhdGluZ0Rh
dGFiYXNlKGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigpLCBkYXRhYmFzZS0+c3RyaW5nSWRlbnRp
ZmllcigpKTsKIH0KIAogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZShE
YXRhYmFzZSogZGF0YWJhc2UpCkBAIC00NDEsNiArNTAzLDggQEAgdm9pZCBEYXRhYmFzZVRyYWNr
ZXI6OnJlbW92ZU9wZW5EYXRhYmFzZQogICAgIGlmICghZGF0YWJhc2UpCiAgICAgICAgIHJldHVy
bjsKIAorICAgIExvY2tlcjxPcmlnaW5RdW90YU1hbmFnZXI+IHF1b3RhTWFuYWdlckxvY2tlcihv
cmlnaW5RdW90YU1hbmFnZXIoKSk7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0
YWJhc2VHdWFyZCk7CiAgICAgTXV0ZXhMb2NrZXIgb3BlbkRhdGFiYXNlTWFwTG9jayhtX29wZW5E
YXRhYmFzZU1hcEd1YXJkKTsKIAogICAgIGlmICghbV9vcGVuRGF0YWJhc2VNYXApIHsKQEAgLTQ3
Niw2ICs1NDAsNyBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlCiAK
ICAgICBtX29wZW5EYXRhYmFzZU1hcC0+cmVtb3ZlKGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigp
KTsKICAgICBkZWxldGUgbmFtZU1hcDsKKyAgICBvcmlnaW5RdW90YU1hbmFnZXJOb0xvY2soKS5y
ZW1vdmVPcmlnaW4oZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkpOwogfQogCiB2b2lkIERhdGFi
YXNlVHJhY2tlcjo6Z2V0T3BlbkRhdGFiYXNlcyhTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25z
dCBTdHJpbmcmIG5hbWUsIEhhc2hTZXQ8UmVmUHRyPERhdGFiYXNlPiA+KiBkYXRhYmFzZXMpCkBA
IC00OTYsOTIgKzU2MSwxMDMgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmdldE9wZW5EYXRhYmFz
ZXMoUwogICAgICAgICBkYXRhYmFzZXMtPmFkZCgqaXQpOwogfQogCi11bnNpZ25lZCBsb25nIGxv
bmcgRGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2lu
KQordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJhY2tlcjo6dXNhZ2VGb3JPcmlnaW5Ob0xv
Y2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgp
ID09IG1fdGhyZWFkKTsKLSAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBsb2NrZXIob3Jp
Z2luUXVvdGFNYW5hZ2VyKCkpOworICAgIEFTU0VSVCghb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2Nr
KCkudHJ5TG9jaygpKTsKIAogICAgIC8vIFVzZSB0aGUgT3JpZ2luUXVvdGFNYW5hZ2VyIG1lY2hh
bmlzbSB0byBjYWxjdWxhdGUgdGhlIHVzYWdlCi0gICAgaWYgKG9yaWdpblF1b3RhTWFuYWdlcigp
LnRyYWNrc09yaWdpbihvcmlnaW4pKQotICAgICAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2Vy
KCkuZGlza1VzYWdlKG9yaWdpbik7CisgICAgaWYgKG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygp
LnRyYWNrc09yaWdpbihvcmlnaW4pKQorICAgICAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2Vy
Tm9Mb2NrKCkuZGlza1VzYWdlKG9yaWdpbik7CiAKICAgICAvLyBJZiB0aGUgT3JpZ2luUXVvdGFN
YW5hZ2VyIGRvZXNuJ3QgdHJhY2sgdGhpcyBvcmlnaW4gYWxyZWFkeSwgcHJpbWUgaXQgdG8gZG8g
c28KLSAgICBvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja09yaWdpbihvcmlnaW4pOworICAgIG9y
aWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrT3JpZ2luKG9yaWdpbik7CiAKICAgICBWZWN0
b3I8U3RyaW5nPiBuYW1lczsKLSAgICBkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKG9yaWdpbiwgbmFt
ZXMpOworICAgIGRhdGFiYXNlTmFtZXNGb3JPcmlnaW5Ob0xvY2sob3JpZ2luLCBuYW1lcyk7CiAK
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyArK2kpCi0gICAgICAg
IG9yaWdpblF1b3RhTWFuYWdlcigpLmFkZERhdGFiYXNlKG9yaWdpbiwgbmFtZXNbaV0sIGZ1bGxQ
YXRoRm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lc1tpXSwgZmFsc2UpKTsKKyAgICAgICAgb3JpZ2lu
UXVvdGFNYW5hZ2VyTm9Mb2NrKCkuYWRkRGF0YWJhc2Uob3JpZ2luLCBuYW1lc1tpXSwgZnVsbFBh
dGhGb3JEYXRhYmFzZU5vTG9jayhvcmlnaW4sIG5hbWVzW2ldLCBmYWxzZSkpOwogCi0gICAgaWYg
KCFvcmlnaW5RdW90YU1hbmFnZXIoKS50cmFja3NPcmlnaW4ob3JpZ2luKSkKKyAgICBpZiAoIW9y
aWdpblF1b3RhTWFuYWdlck5vTG9jaygpLnRyYWNrc09yaWdpbihvcmlnaW4pKQogICAgICAgICBy
ZXR1cm4gMDsKLSAgICByZXR1cm4gb3JpZ2luUXVvdGFNYW5hZ2VyKCkuZGlza1VzYWdlKG9yaWdp
bik7CisgICAgcmV0dXJuIG9yaWdpblF1b3RhTWFuYWdlck5vTG9jaygpLmRpc2tVc2FnZShvcmln
aW4pOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9y
aWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luKQoreworICAgIExvY2tlcjxPcmlnaW5RdW90YU1h
bmFnZXI+IGxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7CisKKyAgICByZXR1cm4gdXNhZ2VG
b3JPcmlnaW5Ob0xvY2sob3JpZ2luKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNl
VHJhY2tlcjo6cXVvdGFGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbikKK3sK
KyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVChtX3F1
b3RhTWFwKTsKKyAgICByZXR1cm4gbV9xdW90YU1hcC0+Z2V0KG9yaWdpbik7CiB9CiAKIHVuc2ln
bmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnF1b3RhRm9yT3JpZ2luKFNlY3VyaXR5T3Jp
Z2luKiBvcmlnaW4pCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCB8
fCBtX3F1b3RhTWFwKTsKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YWJhc2UobV9kYXRhYmFzZUd1
YXJkKTsKICAgICBwb3B1bGF0ZU9yaWdpbnMoKTsKLSAgICBNdXRleExvY2tlciBsb2NrUXVvdGFN
YXAobV9xdW90YU1hcEd1YXJkKTsKLSAgICByZXR1cm4gbV9xdW90YU1hcC0+Z2V0KG9yaWdpbik7
CisgICAgcmV0dXJuIHF1b3RhRm9yT3JpZ2luTm9Mb2NrKG9yaWdpbik7CiB9CiAKIHZvaWQgRGF0
YWJhc2VUcmFja2VyOjpzZXRRdW90YShTZWN1cml0eU9yaWdpbiogb3JpZ2luLCB1bnNpZ25lZCBs
b25nIGxvbmcgcXVvdGEpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVh
ZCk7Ci0gICAgaWYgKHF1b3RhRm9yT3JpZ2luKG9yaWdpbikgPT0gcXVvdGEpCisgICAgTXV0ZXhM
b2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisKKyAgICBwb3B1bGF0ZU9yaWdp
bnMoKTsKKyAgICBpZiAocXVvdGFGb3JPcmlnaW5Ob0xvY2sob3JpZ2luKSA9PSBxdW90YSkKICAg
ICAgICAgcmV0dXJuOwogCiAgICAgb3BlblRyYWNrZXJEYXRhYmFzZSh0cnVlKTsKICAgICBpZiAo
IW1fZGF0YWJhc2UuaXNPcGVuKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIHsKLSAgICAgICAg
TXV0ZXhMb2NrZXIgbG9ja1F1b3RhTWFwKG1fcXVvdGFNYXBHdWFyZCk7Ci0KLSAgICAgICAgaWYg
KCFtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pKSB7Ci0gICAgICAgICAgICBTUUxpdGVTdGF0
ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJJTlNFUlQgSU5UTyBPcmlnaW5zIFZBTFVFUyAo
PywgPykiKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3Vs
dE9rKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJsaXNoIG9y
aWdpbiAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNj
aWkoKS5kYXRhKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0
ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7Ci0gICAgICAg
ICAgICAgICAgc3RhdGVtZW50LmJpbmRJbnQ2NCgyLCBxdW90YSk7Ci0KLSAgICAgICAgICAgICAg
ICBpZiAoc3RhdGVtZW50LnN0ZXAoKSAhPSBTUUxSZXN1bHREb25lKQotICAgICAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2ggb3JpZ2luICVzIGluIHRoZSB0cmFj
a2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAg
ICAgICAgICB9CisgICAgaWYgKCFtX3F1b3RhTWFwLT5jb250YWlucyhvcmlnaW4pKSB7CisgICAg
ICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIklOU0VSVCBJTlRPIE9y
aWdpbnMgVkFMVUVTICg/LCA/KSIpOworICAgICAgICBpZiAoc3RhdGVtZW50LnByZXBhcmUoKSAh
PSBTUUxSZXN1bHRPaykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXN0YWJs
aXNoIG9yaWdpbiAlcyBpbiB0aGUgdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVy
KCkuYXNjaWkoKS5kYXRhKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU1FMaXRl
U3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNlLCAiVVBEQVRFIE9yaWdpbnMgU0VUIHF1b3Rh
PT8gV0hFUkUgb3JpZ2luPT8iKTsKLSAgICAgICAgICAgIGJvb2wgZXJyb3IgPSBzdGF0ZW1lbnQu
cHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rOwotICAgICAgICAgICAgaWYgKCFlcnJvcikgewotICAg
ICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMSwgcXVvdGEpOwotICAgICAgICAgICAg
ICAgIHN0YXRlbWVudC5iaW5kVGV4dCgyLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsK
KyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRp
ZmllcigpKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kSW50NjQoMiwgcXVvdGEpOwogCi0g
ICAgICAgICAgICAgICAgZXJyb3IgPSAhc3RhdGVtZW50LmV4ZWN1dGVDb21tYW5kKCk7Ci0gICAg
ICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50LnN0ZXAoKSAhPSBTUUxSZXN1bHRE
b25lKQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGVzdGFibGlzaCBvcmln
aW4gJXMgaW4gdGhlIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lp
KCkuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFNRTGl0ZVN0YXRl
bWVudCBzdGF0ZW1lbnQobV9kYXRhYmFzZSwgIlVQREFURSBPcmlnaW5zIFNFVCBxdW90YT0/IFdI
RVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGJvb2wgZXJyb3IgPSBzdGF0ZW1lbnQucHJlcGFyZSgp
ICE9IFNRTFJlc3VsdE9rOworICAgICAgICBpZiAoIWVycm9yKSB7CisgICAgICAgICAgICBzdGF0
ZW1lbnQuYmluZEludDY0KDEsIHF1b3RhKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4
dCgyLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpKTsKIAotICAgICAgICAgICAgaWYgKGVy
cm9yKQotICAgICAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHNldCBxdW90YSAlbGx1
IGluIHRyYWNrZXIgZGF0YWJhc2UgZm9yIG9yaWdpbiAlcyIsIHF1b3RhLCBvcmlnaW4tPmRhdGFi
YXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGVycm9yID0gIXN0
YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gRklYTUU6
IElzIGl0IHJlYWxseSBPSyB0byB1cGRhdGUgdGhlIHF1b3RhIGluIG1lbW9yeSBpZiB3ZSBmYWls
ZWQgdG8gdXBkYXRlIGl0IG9uIGRpc2s/Ci0gICAgICAgIG1fcXVvdGFNYXAtPnNldChvcmlnaW4s
IHF1b3RhKTsKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWls
ZWQgdG8gc2V0IHF1b3RhICVsbHUgaW4gdHJhY2tlciBkYXRhYmFzZSBmb3Igb3JpZ2luICVzIiwg
cXVvdGEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOwogICAg
IH0KIAorICAgIC8vIEZJWE1FOiBJcyBpdCByZWFsbHkgT0sgdG8gdXBkYXRlIHRoZSBxdW90YSBp
biBtZW1vcnkgaWYgd2UgZmFpbGVkIHRvIHVwZGF0ZSBpdCBvbiBkaXNrPworICAgIG1fcXVvdGFN
YXAtPnNldChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIHF1b3RhKTsKKwogICAgIGlmIChtX2Ns
aWVudCkKICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3JpZ2luKG9yaWdpbik7
CiB9CiAKIGJvb2wgRGF0YWJhc2VUcmFja2VyOjphZGREYXRhYmFzZShTZWN1cml0eU9yaWdpbiog
b3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgcGF0aCkKIHsKLSAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fZGF0YWJh
c2VHdWFyZC50cnlMb2NrKCkpOworICAgIEFTU0VSVChtX3F1b3RhTWFwKTsKICAgICBvcGVuVHJh
Y2tlckRhdGFiYXNlKHRydWUpOwogICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gTmV3IGRhdGFiYXNlIHNob3VsZCBuZXZlciBiZSBh
ZGRlZCB1bnRpbCB0aGUgb3JpZ2luIGhhcyBiZWVuIGVzdGFibGlzaGVkCi0gICAgQVNTRVJUKGhh
c0VudHJ5Rm9yT3JpZ2luKG9yaWdpbikpOworICAgIEFTU0VSVChoYXNFbnRyeUZvck9yaWdpbk5v
TG9jayhvcmlnaW4pKTsKIAogICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQobV9kYXRhYmFz
ZSwgIklOU0VSVCBJTlRPIERhdGFiYXNlcyAob3JpZ2luLCBuYW1lLCBwYXRoKSBWQUxVRVMgKD8s
ID8sID8pOyIpOwogCkBAIC02MDUsOCArNjgxLDYgQEAgYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmFk
ZERhdGFiYXNlKFNlY3VyaQogCiB2b2lkIERhdGFiYXNlVHJhY2tlcjo6ZGVsZXRlQWxsRGF0YWJh
c2VzKCkKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkKTsKLQogICAg
IFZlY3RvcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+ID4gb3JpZ2luc0NvcHk7CiAgICAgb3JpZ2lu
cyhvcmlnaW5zQ29weSk7CiAKQEAgLTYxNCwxOSArNjg4LDMwIEBAIHZvaWQgRGF0YWJhc2VUcmFj
a2VyOjpkZWxldGVBbGxEYXRhYmFzZXMKICAgICAgICAgZGVsZXRlT3JpZ2luKG9yaWdpbnNDb3B5
W2ldLmdldCgpKTsKIH0KIAorLy8gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRv
IG1ha2Ugc3VyZSB0aGF0IG5vYm9keSBpcyB0cnlpbmcgdG8gY3JlYXRlLCBkZWxldGUsIG9wZW4s
IG9yIGNsb3NlIGRhdGFiYXNlcyBpbiB0aGlzIG9yaWdpbiB3aGlsZSB0aGUgZGVsZXRpb24gaXMK
Ky8vIHRha2luZyBwbGFjZS4KIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpkZWxldGVPcmlnaW4oU2Vj
dXJpdHlPcmlnaW4qIG9yaWdpbikKIHsKLSAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1f
dGhyZWFkKTsKLSAgICBvcGVuVHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKLSAgICBpZiAoIW1fZGF0
YWJhc2UuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIFZlY3RvcjxTdHJpbmc+IGRh
dGFiYXNlTmFtZXM7Ci0gICAgaWYgKCFkYXRhYmFzZU5hbWVzRm9yT3JpZ2luKG9yaWdpbiwgZGF0
YWJhc2VOYW1lcykpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmV0cmlldmUgbGlz
dCBvZiBkYXRhYmFzZSBuYW1lcyBmb3Igb3JpZ2luICVzIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50
aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAg
IE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFiYXNlR3VhcmQpOworICAgICAgICBvcGVu
VHJhY2tlckRhdGFiYXNlKGZhbHNlKTsKKyAgICAgICAgaWYgKCFtX2RhdGFiYXNlLmlzT3Blbigp
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghZGF0YWJhc2VOYW1lc0Zvck9y
aWdpbk5vTG9jayhvcmlnaW4sIGRhdGFiYXNlTmFtZXMpKSB7CisgICAgICAgICAgICBMT0dfRVJS
T1IoIlVuYWJsZSB0byByZXRyaWV2ZSBsaXN0IG9mIGRhdGFiYXNlIG5hbWVzIGZvciBvcmlnaW4g
JXMiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNhbkRlbGV0ZU9yaWdpbihv
cmlnaW4pKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlRyaWVkIHRvIGRlbGV0ZSBhbiBvcmln
aW4gKCVzKSB3aGlsZSBlaXRoZXIgY3JlYXRpbmcgZGF0YWJhc2UgaW4gaXQgb3IgYWxyZWFkeSBk
ZWxldGluZyBpdCIsIG9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkp
OworICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICByZWNvcmREZWxldGluZ09yaWdpbihvcmlnaW4pOwogICAgIH0KIAorICAg
IC8vIFdlIGRyb3AgdGhlIGxvY2sgaGVyZSBiZWNhdXNlIGhvbGRpbmcgbG9ja3MgZHVyaW5nIGEg
Y2FsbCB0byBkZWxldGVEYXRhYmFzZUZpbGUgd2lsbCBkZWFkbG9jay4KICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgZGF0YWJhc2VOYW1lcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAo
IWRlbGV0ZURhdGFiYXNlRmlsZShvcmlnaW4sIGRhdGFiYXNlTmFtZXNbaV0pKSB7CiAgICAgICAg
ICAgICAvLyBFdmVuIGlmIHRoZSBmaWxlIGNhbid0IGJlIGRlbGV0ZWQsIHdlIHdhbnQgdG8gdHJ5
IGFuZCBkZWxldGUgdGhlIHJlc3QsIGRvbid0IHJldHVybiBlYXJseSBoZXJlLgpAQCAtNjM0LDQx
ICs3MTksNDUgQEAgdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZU9yaWdpbihTZWN1cgogICAg
ICAgICB9CiAgICAgfQogCi0gICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudChtX2RhdGFiYXNl
LCAiREVMRVRFIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgaWYgKHN0YXRl
bWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFi
bGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBkYXRhYmFzZXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0
cmFja2VyIiwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9CisgICAgeworICAgICAgICAvLyBUbyBzYXRpc2Z5IHRoZSBs
b2NrIGhpZXJhcmNoeSwgd2UgaGF2ZSB0byBsb2NrIHRoZSBvcmlnaW5RdW90YU1hbmFnZXIgYmVm
b3JlIG1fZGF0YWJhc2VHdWFyZCBpZiB0aGVyZSdzIGFueSBjaGFuY2Ugd2UnbGwgdG8gbG9jayBi
b3RoLgorICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJMb2Nr
ZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0YWJh
c2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCht
X2RhdGFiYXNlLCAiREVMRVRFIEZST00gRGF0YWJhc2VzIFdIRVJFIG9yaWdpbj0/Iik7CiAKLSAg
ICBzdGF0ZW1lbnQuYmluZFRleHQoMSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSk7Cisg
ICAgICAgIGRvbmVEZWxldGluZ09yaWdpbihvcmlnaW4pOwogCi0gICAgaWYgKCFzdGF0ZW1lbnQu
ZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRl
IGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmln
aW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KKyAgICAgICAgaWYgKHN0YXRlbWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2sp
IHsKKyAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBhcmUgZGVsZXRpb24gb2Yg
ZGF0YWJhc2VzIGZyb20gb3JpZ2luICVzIGZyb20gdHJhY2tlciIsIG9yaWdpbi0+ZGF0YWJhc2VJ
ZGVudGlmaWVyKCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CiAKLSAgICBTUUxpdGVTdGF0ZW1lbnQgb3JpZ2luU3RhdGVtZW50KG1fZGF0YWJhc2UsICJE
RUxFVEUgRlJPTSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7Ci0gICAgaWYgKG9yaWdpblN0YXRl
bWVudC5wcmVwYXJlKCkgIT0gU1FMUmVzdWx0T2spIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFi
bGUgdG8gcHJlcGFyZSBkZWxldGlvbiBvZiBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwgb3JpZ2lu
LT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9CisgICAgICAgIHN0YXRlbWVudC5iaW5kVGV4dCgxLCBvcmlnaW4tPmRhdGFiYXNlSWRl
bnRpZmllcigpKTsKKworICAgICAgICBpZiAoIXN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7
CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGRh
dGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRl
bnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQogCi0gICAgb3JpZ2luU3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+ZGF0YWJhc2VJZGVu
dGlmaWVyKCkpOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgb3JpZ2luU3RhdGVtZW50KG1fZGF0
YWJhc2UsICJERUxFVEUgRlJPTSBPcmlnaW5zIFdIRVJFIG9yaWdpbj0/Iik7CisgICAgICAgIGlm
IChvcmlnaW5TdGF0ZW1lbnQucHJlcGFyZSgpICE9IFNRTFJlc3VsdE9rKSB7CisgICAgICAgICAg
ICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGRlbGV0aW9uIG9mIG9yaWdpbiAlcyBmcm9t
IHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgaWYgKCFvcmlnaW5TdGF0ZW1l
bnQuZXhlY3V0ZUNvbW1hbmQoKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBleGVj
dXRlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBv
cmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KKyAgICAgICAgb3JpZ2luU3RhdGVtZW50LmJpbmRUZXh0KDEsIG9yaWdpbi0+
ZGF0YWJhc2VJZGVudGlmaWVyKCkpOwogCi0gICAgU1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRW1w
dHlEYXRhYmFzZURpcmVjdG9yeShvcmlnaW5QYXRoKG9yaWdpbikpOworICAgICAgICBpZiAoIW9y
aWdpblN0YXRlbWVudC5leGVjdXRlQ29tbWFuZCgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
IlVuYWJsZSB0byBleGVjdXRlIGRlbGV0aW9uIG9mIGRhdGFiYXNlcyBmcm9tIG9yaWdpbiAlcyBm
cm9tIHRyYWNrZXIiLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgUmVmUHRyPFNlY3VyaXR5
T3JpZ2luPiBvcmlnaW5Qb3NzaWJseUxhc3RSZWZlcmVuY2UgPSBvcmlnaW47Ci0gICAgewotICAg
ICAgICBNdXRleExvY2tlciBsb2NrUXVvdGFNYXAobV9xdW90YU1hcEd1YXJkKTsKKyAgICAgICAg
U1FMaXRlRmlsZVN5c3RlbTo6ZGVsZXRlRW1wdHlEYXRhYmFzZURpcmVjdG9yeShvcmlnaW5QYXRo
KG9yaWdpbikpOworCisgICAgICAgIFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gb3JpZ2luUG9zc2li
bHlMYXN0UmVmZXJlbmNlID0gb3JpZ2luOwogICAgICAgICBtX3F1b3RhTWFwLT5yZW1vdmUob3Jp
Z2luKTsKIAotICAgICAgICBMb2NrZXI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBxdW90YU1hbmFnZXJM
b2NrZXIob3JpZ2luUXVvdGFNYW5hZ2VyKCkpOwotICAgICAgICBvcmlnaW5RdW90YU1hbmFnZXIo
KS5yZW1vdmVPcmlnaW4ob3JpZ2luKTsKKyAgICAgICAgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2Nr
KCkucmVtb3ZlT3JpZ2luKG9yaWdpbik7CiAKICAgICAgICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGUg
bGFzdCBvcmlnaW4sIGRvIHNvbWUgYWRkaXRpb25hbCBkZWxldGlvbi4KICAgICAgICAgaWYgKG1f
cXVvdGFNYXAtPmlzRW1wdHkoKSkgewpAQCAtNjc3LDMwICs3NjYsMTU5IEBAIHZvaWQgRGF0YWJh
c2VUcmFja2VyOjpkZWxldGVPcmlnaW4oU2VjdXIKICAgICAgICAgICAgU1FMaXRlRmlsZVN5c3Rl
bTo6ZGVsZXRlRGF0YWJhc2VGaWxlKHRyYWNrZXJEYXRhYmFzZVBhdGgoKSk7CiAgICAgICAgICAg
IFNRTGl0ZUZpbGVTeXN0ZW06OmRlbGV0ZUVtcHR5RGF0YWJhc2VEaXJlY3RvcnkobV9kYXRhYmFz
ZURpcmVjdG9yeVBhdGgpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fY2xpZW50KSB7Cisg
ICAgICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRNb2RpZnlPcmlnaW4ob3JpZ2luKTsKKyAg
ICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkYXRhYmFzZU5hbWVzLnNpemUoKTsg
KytpKQorICAgICAgICAgICAgICAgIG1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeURhdGFiYXNl
KG9yaWdpbiwgZGF0YWJhc2VOYW1lc1tpXSk7CisgICAgICAgIH0KICAgICB9Cit9CiAKLSAgICBp
ZiAobV9jbGllbnQpIHsKLSAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5T3JpZ2lu
KG9yaWdpbik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkYXRhYmFzZU5hbWVz
LnNpemUoKTsgKytpKQotICAgICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5RGF0
YWJhc2Uob3JpZ2luLCBkYXRhYmFzZU5hbWVzW2ldKTsKK2Jvb2wgRGF0YWJhc2VUcmFja2VyOjpj
YW5DcmVhdGVEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5h
bWUpCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICAvLyBD
YW4ndCBjcmVhdGUgYSBkYXRhYmFzZSB3aGlsZSBzb21lb25lIGVsc2UgaXMgZGVsZXRpbmcgaXQ7
IHRoZXJlJ3MgYSByaXNrIG9mIGxlYXZpbmcgdW50cmFja2VkIGRhdGFiYXNlIGRlYnJpcyBvbiB0
aGUgZGlzay4KKyAgICByZXR1cm4gIWRlbGV0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKSAmJiAh
ZGVsZXRpbmdPcmlnaW4ob3JpZ2luKTsKK30KKwordm9pZCBEYXRhYmFzZVRyYWNrZXI6OnJlY29y
ZENyZWF0aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBu
YW1lKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgTmFt
ZUNvdW50TWFwKiBuYW1lTWFwID0gbV9iZWluZ0NyZWF0ZWQuZ2V0KG9yaWdpbik7CisgICAgaWYg
KCFuYW1lTWFwKSB7CisgICAgICAgIG5hbWVNYXAgPSBuZXcgTmFtZUNvdW50TWFwKCk7CisgICAg
ICAgIG1fYmVpbmdDcmVhdGVkLnNldChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIG5hbWVNYXAp
OwogICAgIH0KKyAgICBsb25nIGNvdW50ID0gbmFtZU1hcC0+Z2V0KG5hbWUpOworICAgIG5hbWVN
YXAtPnNldChuYW1lLnRocmVhZHNhZmVDb3B5KCksIGNvdW50ICsgMSk7Cit9CisKK3ZvaWQgRGF0
YWJhc2VUcmFja2VyOjpkb25lQ3JlYXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2lu
LCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5
TG9jaygpKTsKKyAgICBOYW1lQ291bnRNYXAqIG5hbWVNYXAgPSBtX2JlaW5nQ3JlYXRlZC5nZXQo
b3JpZ2luKTsKKyAgICBpZiAobmFtZU1hcCkgeworICAgICAgICBsb25nIGNvdW50ID0gbmFtZU1h
cC0+Z2V0KG5hbWUpOworICAgICAgICBBU1NFUlQoY291bnQgPiAwKTsKKyAgICAgICAgaWYgKGNv
dW50IDw9IDEpIHsKKyAgICAgICAgICAgIG5hbWVNYXAtPnJlbW92ZShuYW1lKTsKKyAgICAgICAg
ICAgIGlmIChuYW1lTWFwLT5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtX2JlaW5nQ3Jl
YXRlZC5yZW1vdmUob3JpZ2luKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbmFtZU1hcDsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBuYW1lTWFwLT5zZXQobmFt
ZSwgY291bnQgLSAxKTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNTRVJUKGZhbHNlKTsKK30KKwor
Ym9vbCBEYXRhYmFzZVRyYWNrZXI6OmNyZWF0aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9y
aWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJk
LnRyeUxvY2soKSk7CisgICAgTmFtZUNvdW50TWFwKiBuYW1lTWFwID0gbV9iZWluZ0NyZWF0ZWQu
Z2V0KG9yaWdpbik7CisgICAgcmV0dXJuIG5hbWVNYXAgJiYgbmFtZU1hcC0+Z2V0KG5hbWUpOwor
fQorCitib29sIERhdGFiYXNlVHJhY2tlcjo6Y2FuRGVsZXRlRGF0YWJhc2UoU2VjdXJpdHlPcmln
aW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFz
ZUd1YXJkLnRyeUxvY2soKSk7CisgICAgcmV0dXJuICFjcmVhdGluZ0RhdGFiYXNlKG9yaWdpbiwg
bmFtZSkgJiYgIWRlbGV0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKK30KKwordm9pZCBEYXRh
YmFzZVRyYWNrZXI6OnJlY29yZERlbGV0aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdp
biwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRy
eUxvY2soKSk7CisgICAgQVNTRVJUKGNhbkRlbGV0ZURhdGFiYXNlKG9yaWdpbiwgbmFtZSkpOwor
ICAgIE5hbWVTZXQqIG5hbWVTZXQgPSBtX2JlaW5nRGVsZXRlZC5nZXQob3JpZ2luKTsKKyAgICBp
ZiAoIW5hbWVTZXQpIHsKKyAgICAgICAgbmFtZVNldCA9IG5ldyBOYW1lU2V0KCk7CisgICAgICAg
IG1fYmVpbmdEZWxldGVkLnNldChvcmlnaW4tPnRocmVhZHNhZmVDb3B5KCksIG5hbWVTZXQpOwor
ICAgIH0KKyAgICBBU1NFUlQoIW5hbWVTZXQtPmNvbnRhaW5zKG5hbWUpKTsKKyAgICBuYW1lU2V0
LT5hZGQobmFtZS50aHJlYWRzYWZlQ29weSgpKTsKK30KKwordm9pZCBEYXRhYmFzZVRyYWNrZXI6
OmRvbmVEZWxldGluZ0RhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmlu
ZyYgbmFtZSkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFyZC50cnlMb2NrKCkpOworICAg
IE5hbWVTZXQqIG5hbWVTZXQgPSBtX2JlaW5nRGVsZXRlZC5nZXQob3JpZ2luKTsKKyAgICBpZiAo
bmFtZVNldCkgeworICAgICAgICBBU1NFUlQobmFtZVNldC0+Y29udGFpbnMobmFtZSkpOworICAg
ICAgICBuYW1lU2V0LT5yZW1vdmUobmFtZSk7CisgICAgICAgIGlmIChuYW1lU2V0LT5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIG1fYmVpbmdEZWxldGVkLnJlbW92ZShvcmlnaW4pOworICAgICAg
ICAgICAgZGVsZXRlIG5hbWVTZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBB
U1NFUlQoZmFsc2UpOworICAgIH0KK30KKworYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0aW5n
RGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKQorewor
ICAgIEFTU0VSVCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgTmFtZVNldCogbmFt
ZVNldCA9IG1fYmVpbmdEZWxldGVkLmdldChvcmlnaW4pOworICAgIHJldHVybiBuYW1lU2V0ICYm
IG5hbWVTZXQtPmNvbnRhaW5zKG5hbWUpOworfQorCitib29sIERhdGFiYXNlVHJhY2tlcjo6Y2Fu
RGVsZXRlT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4pCit7CisgICAgQVNTRVJUKCFtX2Rh
dGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICByZXR1cm4gIShkZWxldGluZ09yaWdpbihvcmln
aW4pIHx8IG1fYmVpbmdDcmVhdGVkLmdldChvcmlnaW4pKTsKK30KKworYm9vbCBEYXRhYmFzZVRy
YWNrZXI6OmRlbGV0aW5nT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4pCit7CisgICAgQVNT
RVJUKCFtX2RhdGFiYXNlR3VhcmQudHJ5TG9jaygpKTsKKyAgICByZXR1cm4gbV9vcmlnaW5zQmVp
bmdEZWxldGVkLmNvbnRhaW5zKG9yaWdpbik7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpy
ZWNvcmREZWxldGluZ09yaWdpbihTZWN1cml0eU9yaWdpbiAqb3JpZ2luKQoreworICAgIEFTU0VS
VCghbV9kYXRhYmFzZUd1YXJkLnRyeUxvY2soKSk7CisgICAgQVNTRVJUKCFkZWxldGluZ09yaWdp
bihvcmlnaW4pKTsKKyAgICBtX29yaWdpbnNCZWluZ0RlbGV0ZWQuYWRkKG9yaWdpbi0+dGhyZWFk
c2FmZUNvcHkoKSk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpkb25lRGVsZXRpbmdPcmln
aW4oU2VjdXJpdHlPcmlnaW4gKm9yaWdpbikKK3sKKyAgICBBU1NFUlQoIW1fZGF0YWJhc2VHdWFy
ZC50cnlMb2NrKCkpOworICAgIEFTU0VSVChkZWxldGluZ09yaWdpbihvcmlnaW4pKTsKKyAgICBt
X29yaWdpbnNCZWluZ0RlbGV0ZWQucmVtb3ZlKG9yaWdpbik7CiB9CiAKIHZvaWQgRGF0YWJhc2VU
cmFja2VyOjpkZWxldGVEYXRhYmFzZShTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJp
bmcmIG5hbWUpCiB7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBtX3RocmVhZCk7Ci0g
ICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxzZSk7Ci0gICAgaWYgKCFtX2RhdGFiYXNlLmlzT3Bl
bigpKQotICAgICAgICByZXR1cm47CisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrRGF0
YWJhc2UobV9kYXRhYmFzZUd1YXJkKTsKKyAgICAgICAgb3BlblRyYWNrZXJEYXRhYmFzZShmYWxz
ZSk7CisgICAgICAgIGlmICghbV9kYXRhYmFzZS5pc09wZW4oKSkKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICBpZiAoIWNhbkRlbGV0ZURhdGFiYXNlKG9yaWdpbiwgbmFtZSkpIHsKKyAg
ICAgICAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICAgICAgcmVjb3JkRGVsZXRpbmdEYXRhYmFzZShvcmlnaW4sIG5hbWUpOworICAgIH0KIAor
ICAgIC8vIFdlIGRyb3AgdGhlIGxvY2sgaGVyZSBiZWNhdXNlIGhvbGRpbmcgbG9ja3MgZHVyaW5n
IGEgY2FsbCB0byBkZWxldGVEYXRhYmFzZUZpbGUgd2lsbCBkZWFkbG9jay4KICAgICBpZiAoIWRl
bGV0ZURhdGFiYXNlRmlsZShvcmlnaW4sIG5hbWUpKSB7CiAgICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIGRlbGV0ZSBmaWxlIGZvciBkYXRhYmFzZSAlcyBpbiBvcmlnaW4gJXMiLCBuYW1lLmFz
Y2lpKCkuZGF0YSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7Cisg
ICAgICAgIGRvbmVEZWxldGluZ0RhdGFiYXNlKG9yaWdpbiwgbmFtZSk7CiAgICAgICAgIHJldHVy
bjsKICAgICB9CiAKKyAgICAvLyBUbyBzYXRpc2Z5IHRoZSBsb2NrIGhpZXJhcmNoeSwgd2UgaGF2
ZSB0byBsb2NrIHRoZSBvcmlnaW5RdW90YU1hbmFnZXIgYmVmb3JlIG1fZGF0YWJhc2VHdWFyZCBp
ZiB0aGVyZSdzIGFueSBjaGFuY2Ugd2UnbGwgdG8gbG9jayBib3RoLgorICAgIExvY2tlcjxPcmln
aW5RdW90YU1hbmFnZXI+IHF1b3RhTWFuYWdlckxvY2tlcihvcmlnaW5RdW90YU1hbmFnZXIoKSk7
CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGFiYXNlKG1fZGF0YWJhc2VHdWFyZCk7CisKICAgICBT
UUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50KG1fZGF0YWJhc2UsICJERUxFVEUgRlJPTSBEYXRhYmFz
ZXMgV0hFUkUgb3JpZ2luPT8gQU5EIG5hbWU9PyIpOwogICAgIGlmIChzdGF0ZW1lbnQucHJlcGFy
ZSgpICE9IFNRTFJlc3VsdE9rKSB7CiAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHByZXBh
cmUgZGVsZXRpb24gb2YgZGF0YWJhc2UgJXMgZnJvbSBvcmlnaW4gJXMgZnJvbSB0cmFja2VyIiwg
bmFtZS5hc2NpaSgpLmRhdGEoKSwgb3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKS5hc2NpaSgp
LmRhdGEoKSk7CisgICAgICAgIGRvbmVEZWxldGluZ0RhdGFiYXNlKG9yaWdpbiwgbmFtZSk7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTcwOSw0MCArOTI3LDQ2IEBAIHZvaWQgRGF0YWJh
c2VUcmFja2VyOjpkZWxldGVEYXRhYmFzZShTZWMKIAogICAgIGlmICghc3RhdGVtZW50LmV4ZWN1
dGVDb21tYW5kKCkpIHsKICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZXhlY3V0ZSBkZWxl
dGlvbiBvZiBkYXRhYmFzZSAlcyBmcm9tIG9yaWdpbiAlcyBmcm9tIHRyYWNrZXIiLCBuYW1lLmFz
Y2lpKCkuZGF0YSgpLCBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgZG9uZURlbGV0aW5nRGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKICAgICAgICAg
cmV0dXJuOwogICAgIH0KIAotICAgIHsKLSAgICAgICAgTG9ja2VyPE9yaWdpblF1b3RhTWFuYWdl
cj4gcXVvdGFNYW5hZ2VyTG9ja2VyKG9yaWdpblF1b3RhTWFuYWdlcigpKTsKLSAgICAgICAgb3Jp
Z2luUXVvdGFNYW5hZ2VyKCkucmVtb3ZlRGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKLSAgICB9Cisg
ICAgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCkucmVtb3ZlRGF0YWJhc2Uob3JpZ2luLCBuYW1l
KTsKIAogICAgIGlmIChtX2NsaWVudCkgewogICAgICAgICBtX2NsaWVudC0+ZGlzcGF0Y2hEaWRN
b2RpZnlPcmlnaW4ob3JpZ2luKTsKICAgICAgICAgbV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5
RGF0YWJhc2Uob3JpZ2luLCBuYW1lKTsKICAgICB9CisgICAgZG9uZURlbGV0aW5nRGF0YWJhc2Uo
b3JpZ2luLCBuYW1lKTsKIH0KIAorLy8gZGVsZXRlRGF0YWJhc2VGaWxlIGhhcyB0byByZWxlYXNl
IGxvY2tzIGJldHdlZW4gbG9va2luZyB1cCB0aGUgbGlzdCBvZiBkYXRhYmFzZXMgdG8gY2xvc2Ug
YW5kIGNsb3NpbmcgdGhlbS4gIFdoaWxlIHRoaXMgaXMgaW4gcHJvZ3Jlc3MsIHRoZSBjYWxsZXIK
Ky8vIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSBubyBuZXcgZGF0YWJhc2VzIGFyZSBv
cGVuZWQgaW4gdGhlIGZpbGUgdG8gYmUgZGVsZXRlZC4KIGJvb2wgRGF0YWJhc2VUcmFja2VyOjpk
ZWxldGVEYXRhYmFzZUZpbGUoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBu
YW1lKQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwogICAgIFN0
cmluZyBmdWxsUGF0aCA9IGZ1bGxQYXRoRm9yRGF0YWJhc2Uob3JpZ2luLCBuYW1lLCBmYWxzZSk7
CiAgICAgaWYgKGZ1bGxQYXRoLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKKyNp
Zm5kZWYgTkRFQlVHCisgICAgeworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhYmFzZShtX2RhdGFi
YXNlR3VhcmQpOworICAgIEFTU0VSVChkZWxldGluZ0RhdGFiYXNlKG9yaWdpbiwgbmFtZSkgfHwg
ZGVsZXRpbmdPcmlnaW4ob3JpZ2luKSk7CisgICAgfQorI2VuZGlmCisKICAgICBWZWN0b3I8UmVm
UHRyPERhdGFiYXNlPiA+IGRlbGV0ZWREYXRhYmFzZXM7CiAKLSAgICAvLyBNYWtlIHN1cmUgbm90
IHRvIGhvbGQgdGhlIG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQgbXV0ZXggd2hlbiBjYWxsaW5nCisg
ICAgLy8gTWFrZSBzdXJlIG5vdCB0byBob2xkIHRoZSBhbnkgbG9ja3Mgd2hlbiBjYWxsaW5nCiAg
ICAgLy8gRGF0YWJhc2U6Om1hcmtBc0RlbGV0ZWRBbmRDbG9zZSgpLCBzaW5jZSB0aGF0IGNhbiBj
YXVzZSBhIGRlYWRsb2NrCiAgICAgLy8gZHVyaW5nIHRoZSBzeW5jaHJvbm91cyBEYXRhYmFzZVRo
cmVhZCBjYWxsIGl0IHRyaWdnZXJzLgotCiAgICAgewogICAgICAgICBNdXRleExvY2tlciBvcGVu
RGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOwogICAgICAgICBpZiAobV9v
cGVuRGF0YWJhc2VNYXApIHsKICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIG9wZW4gZGF0
YWJhc2VzLCBsZXRzIGNoZWNrIGlmIHRoZXkgYXJlIGZvciB0aGlzIG9yaWdpbi4KICAgICAgICAg
ICAgIERhdGFiYXNlTmFtZU1hcCogbmFtZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQob3Jp
Z2luKTsKICAgICAgICAgICAgIGlmIChuYW1lTWFwICYmIG5hbWVNYXAtPnNpemUoKSkgewotICAg
ICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIG9wZW4gZGF0YWJhc2VzIGZvciB0aGlzIG9y
aWdpbiwgbGV0cyBjaGVjaworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIG9wZW4g
ZGF0YWJhc2VzIGZvciB0aGlzIG9yaWdpbiwgbGV0J3MgY2hlY2sKICAgICAgICAgICAgICAgICAv
LyBpZiB0aGV5IGFyZSB0aGlzIGRhdGFiYXNlIGJ5IG5hbWUuCiAgICAgICAgICAgICAgICAgRGF0
YWJhc2VTZXQqIGRhdGFiYXNlU2V0ID0gbmFtZU1hcC0+Z2V0KG5hbWUpOwogICAgICAgICAgICAg
ICAgIGlmIChkYXRhYmFzZVNldCAmJiBkYXRhYmFzZVNldC0+c2l6ZSgpKSB7CkBAIC03NjMsNyAr
OTg3LDYgQEAgYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmRlbGV0ZURhdGFiYXNlRmlsZQogCiB2b2lk
IERhdGFiYXNlVHJhY2tlcjo6c2V0Q2xpZW50KERhdGFiYXNlVHJhY2tlckNsaWVudCogY2xpZW50
KQogewotICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwogICAgIG1fY2xp
ZW50ID0gY2xpZW50OwogfQogCkBAIC03NzMsNyArOTk2LDcgQEAgc3RhdGljIE11dGV4JiBub3Rp
ZmljYXRpb25NdXRleCgpCiAgICAgcmV0dXJuIG11dGV4OwogfQogCi10eXBlZGVmIFZlY3Rvcjxw
YWlyPFNlY3VyaXR5T3JpZ2luKiwgU3RyaW5nPiA+IE5vdGlmaWNhdGlvblF1ZXVlOwordHlwZWRl
ZiBWZWN0b3I8cGFpcjxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBTdHJpbmc+ID4gTm90aWZpY2F0
aW9uUXVldWU7CiAKIHN0YXRpYyBOb3RpZmljYXRpb25RdWV1ZSYgbm90aWZpY2F0aW9uUXVldWUo
KQogewpAQCAtNzg1LDcgKzEwMDgsNyBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6c2NoZWR1bGVO
b3RpZnlEYXRhCiB7CiAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG5vdGlmaWNhdGlvbk11dGV4KCkp
OwogCi0gICAgbm90aWZpY2F0aW9uUXVldWUoKS5hcHBlbmQocGFpcjxTZWN1cml0eU9yaWdpbios
IFN0cmluZz4ob3JpZ2luLCBuYW1lLmNyb3NzVGhyZWFkU3RyaW5nKCkpKTsKKyAgICBub3RpZmlj
YXRpb25RdWV1ZSgpLmFwcGVuZChwYWlyPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4sIFN0cmluZz4o
b3JpZ2luLT50aHJlYWRzYWZlQ29weSgpLCBuYW1lLmNyb3NzVGhyZWFkU3RyaW5nKCkpKTsKICAg
ICBzY2hlZHVsZUZvck5vdGlmaWNhdGlvbigpOwogfQogCkBAIC04MjAsNyArMTA0Myw3IEBAIHZv
aWQgRGF0YWJhc2VUcmFja2VyOjpub3RpZnlEYXRhYmFzZXNDaGEKICAgICAgICAgcmV0dXJuOwog
CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5vdGlmaWNhdGlvbnMuc2l6ZSgpOyArK2kp
Ci0gICAgICAgIHRoZVRyYWNrZXIubV9jbGllbnQtPmRpc3BhdGNoRGlkTW9kaWZ5RGF0YWJhc2Uo
bm90aWZpY2F0aW9uc1tpXS5maXJzdCwgbm90aWZpY2F0aW9uc1tpXS5zZWNvbmQpOworICAgICAg
ICB0aGVUcmFja2VyLm1fY2xpZW50LT5kaXNwYXRjaERpZE1vZGlmeURhdGFiYXNlKG5vdGlmaWNh
dGlvbnNbaV0uZmlyc3QuZ2V0KCksIG5vdGlmaWNhdGlvbnNbaV0uc2Vjb25kKTsKIH0KIAogCklu
ZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCShyZXZpc2lvbiA1NjI0MykKKysrIFdlYkNv
cmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNjAsOSArNjAs
MTEgQEAgc3RydWN0IFNlY3VyaXR5T3JpZ2luVHJhaXRzOwogY2xhc3MgRGF0YWJhc2VUcmFja2Vy
IDogcHVibGljIE5vbmNvcHlhYmxlIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgRGF0YWJhc2VUcmFj
a2VyJiB0cmFja2VyKCk7Ci0gICAgLy8gRklYTUU6IER1ZSB0byB3b3JrZXJzIGhhdmluZyBtdWx0
aXBsZSB0aHJlYWRzIGluIGEgc2luZ2xlIHByb2Nlc3Mgc2hhcmluZwotICAgIC8vIGEgRGF0YWJh
c2VUcmFja2VyLCB0aGlzIHNpbmdsZXRvbiB3aWxsIGhhdmUgdG8gYmUgc3luY2hyb25pemVkIG9y
IG1vdmVkCi0gICAgLy8gdG8gVExTLgorICAgIC8vIFRoaXMgc2luZ2xldG9uIHdpbGwgcG90ZW50
aWFsbHkgYmUgdXNlZCBmcm9tIG11bHRpcGxlIHdvcmtlciB0aHJlYWRzIGFuZCB0aGUgcGFnZSdz
IGNvbnRleHQgdGhyZWFkIHNpbXVsdGFuZW91c2x5LiAgVG8ga2VlcCB0aGlzIHNhZmUsIGl0J3MK
KyAgICAvLyBjdXJyZW50bHkgdXNpbmcgNCBsb2Nrcy4gIEluIG9yZGVyIHRvIGF2b2lkIGRlYWRs
b2NrIHdoZW4gdGFraW5nIG11bHRpcGxlIGxvY2tzLCB5b3UgbXVzdCB0YWtlIHRoZW0gaW4gdGhl
IGNvcnJlY3Qgb3JkZXI6CisgICAgLy8gb3JpZ2luUXVvdGFNYW5hZ2VyKCkgYmVmb3JlIG1fZGF0
YWJhc2VHdWFyZCBvciBtX29wZW5EYXRhYmFzZU1hcEd1YXJkCisgICAgLy8gbV9kYXRhYmFzZUd1
YXJkIGJlZm9yZSBtX29wZW5EYXRhYmFzZU1hcEd1YXJkCisgICAgLy8gbm90aWZpY2F0aW9uTXV0
ZXgoKSBpcyBjdXJyZW50bHkgaW5kZXBlbmRlbnQgb2YgdGhlIG90aGVyIGxvY2tzLgogCiAgICAg
Ym9vbCBjYW5Fc3RhYmxpc2hEYXRhYmFzZShTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNpZ25lZCBsb25nIGVz
dGltYXRlZFNpemUpOwogICAgIHZvaWQgc2V0RGF0YWJhc2VEZXRhaWxzKFNlY3VyaXR5T3JpZ2lu
KiwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGRpc3BsYXlOYW1lLCB1bnNpZ25l
ZCBsb25nIGVzdGltYXRlZFNpemUpOwpAQCAtODcsNyArODksNyBAQCBwcml2YXRlOgogI2lmICFQ
TEFURk9STShDSFJPTUlVTSkKIHB1YmxpYzoKICAgICB2b2lkIHNldERhdGFiYXNlRGlyZWN0b3J5
UGF0aChjb25zdCBTdHJpbmcmKTsKLSAgICBjb25zdCBTdHJpbmcmIGRhdGFiYXNlRGlyZWN0b3J5
UGF0aCgpIGNvbnN0OworICAgIFN0cmluZyBkYXRhYmFzZURpcmVjdG9yeVBhdGgoKSBjb25zdDsK
IAogICAgIHZvaWQgb3JpZ2lucyhWZWN0b3I8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiA+JiByZXN1
bHQpOwogICAgIGJvb2wgZGF0YWJhc2VOYW1lc0Zvck9yaWdpbihTZWN1cml0eU9yaWdpbiosIFZl
Y3RvcjxTdHJpbmc+JiByZXN1bHQpOwpAQCAtMTE0LDYgKzExNiwxMyBAQCBwdWJsaWM6CiAgICAg
Ym9vbCBoYXNFbnRyeUZvck9yaWdpbihTZWN1cml0eU9yaWdpbiopOwogCiBwcml2YXRlOgorICAg
IE9yaWdpblF1b3RhTWFuYWdlciYgb3JpZ2luUXVvdGFNYW5hZ2VyTm9Mb2NrKCk7CisgICAgYm9v
bCBoYXNFbnRyeUZvck9yaWdpbk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKTsKKyAgICBT
dHJpbmcgZnVsbFBhdGhGb3JEYXRhYmFzZU5vTG9jayhTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0
cmluZyYgbmFtZSwgYm9vbCBjcmVhdGVJZkRvZXNOb3RFeGlzdCk7CisgICAgYm9vbCBkYXRhYmFz
ZU5hbWVzRm9yT3JpZ2luTm9Mb2NrKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIFZlY3RvcjxTdHJp
bmc+JiByZXN1bHRWZWN0b3IpOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1c2FnZUZvck9yaWdp
bk5vTG9jayhTZWN1cml0eU9yaWdpbiogb3JpZ2luKTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcg
cXVvdGFGb3JPcmlnaW5Ob0xvY2soU2VjdXJpdHlPcmlnaW4qIG9yaWdpbik7CisKICAgICBTdHJp
bmcgdHJhY2tlckRhdGFiYXNlUGF0aCgpIGNvbnN0OwogICAgIHZvaWQgb3BlblRyYWNrZXJEYXRh
YmFzZShib29sIGNyZWF0ZUlmRG9lc05vdEV4aXN0KTsKIApAQCAtMTI2LDEwICsxMzUsMTEgQEAg
cHJpdmF0ZToKIAogICAgIGJvb2wgZGVsZXRlRGF0YWJhc2VGaWxlKFNlY3VyaXR5T3JpZ2luKiwg
Y29uc3QgU3RyaW5nJiBuYW1lKTsKIAorICAgIC8vIFRoaXMgbG9jayBwcm90ZWN0cyBtX2RhdGFi
YXNlLCBtX3F1b3RhTWFwLCBtX3Byb3Bvc2VkRGF0YWJhc2VzLCBtX2RhdGFiYXNlRGlyZWN0b3J5
UGF0aCwgbV9vcmlnaW5zQmVpbmdEZWxldGVkLCBtX2JlaW5nQ3JlYXRlZCwgYW5kIG1fYmVpbmdE
ZWxldGVkLgorICAgIE11dGV4IG1fZGF0YWJhc2VHdWFyZDsKICAgICBTUUxpdGVEYXRhYmFzZSBt
X2RhdGFiYXNlOwogCiAgICAgdHlwZWRlZiBIYXNoTWFwPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4s
IHVuc2lnbmVkIGxvbmcgbG9uZywgU2VjdXJpdHlPcmlnaW5IYXNoPiBRdW90YU1hcDsKLSAgICBN
dXRleCBtX3F1b3RhTWFwR3VhcmQ7CiAgICAgbXV0YWJsZSBPd25QdHI8UXVvdGFNYXA+IG1fcXVv
dGFNYXA7CiAKICAgICBPd25QdHI8T3JpZ2luUXVvdGFNYW5hZ2VyPiBtX3F1b3RhTWFuYWdlcjsK
QEAgLTEzOCwxMSArMTQ4LDI3IEBAIHByaXZhdGU6CiAKICAgICBEYXRhYmFzZVRyYWNrZXJDbGll
bnQqIG1fY2xpZW50OwogCi0gICAgc3RkOjpwYWlyPFNlY3VyaXR5T3JpZ2luKiwgRGF0YWJhc2VE
ZXRhaWxzPiogbV9wcm9wb3NlZERhdGFiYXNlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPFJlZlB0
cjxTZWN1cml0eU9yaWdpbj4sIERhdGFiYXNlRGV0YWlscz4gUHJvcG9zZWREYXRhYmFzZTsKKyAg
ICBIYXNoU2V0PFByb3Bvc2VkRGF0YWJhc2UqPiBtX3Byb3Bvc2VkRGF0YWJhc2VzOwogCi0jaWZu
ZGVmIE5ERUJVRwotICAgIFRocmVhZElkZW50aWZpZXIgbV90aHJlYWQ7Ci0jZW5kaWYKKyAgICB0
eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBsb25nPiBOYW1lQ291bnRNYXA7CisgICAgdHlwZWRlZiBI
YXNoTWFwPFJlZlB0cjxTZWN1cml0eU9yaWdpbj4sIE5hbWVDb3VudE1hcCosIFNlY3VyaXR5T3Jp
Z2luSGFzaD4gQ3JlYXRlU2V0OworICAgIENyZWF0ZVNldCBtX2JlaW5nQ3JlYXRlZDsKKyAgICB0
eXBlZGVmIEhhc2hTZXQ8U3RyaW5nPiBOYW1lU2V0OworICAgIEhhc2hNYXA8UmVmUHRyPFNlY3Vy
aXR5T3JpZ2luPiwgTmFtZVNldCosIFNlY3VyaXR5T3JpZ2luSGFzaD4gbV9iZWluZ0RlbGV0ZWQ7
CisgICAgSGFzaFNldDxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBTZWN1cml0eU9yaWdpbkhhc2g+
IG1fb3JpZ2luc0JlaW5nRGVsZXRlZDsKKyAgICBib29sIGNhbkNyZWF0ZURhdGFiYXNlKFNlY3Vy
aXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgdm9pZCByZWNvcmRD
cmVhdGluZ0RhdGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFt
ZSk7CisgICAgdm9pZCBkb25lQ3JlYXRpbmdEYXRhYmFzZShTZWN1cml0eU9yaWdpbiAqb3JpZ2lu
LCBjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIGJvb2wgY3JlYXRpbmdEYXRhYmFzZShTZWN1cml0
eU9yaWdpbiAqb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIGJvb2wgY2FuRGVsZXRl
RGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lKTsKKyAg
ICB2b2lkIHJlY29yZERlbGV0aW5nRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4gKm9yaWdpbiwgY29u
c3QgU3RyaW5nJiBuYW1lKTsKKyAgICB2b2lkIGRvbmVEZWxldGluZ0RhdGFiYXNlKFNlY3VyaXR5
T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgYm9vbCBkZWxldGluZ0Rh
dGFiYXNlKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAg
Ym9vbCBjYW5EZWxldGVPcmlnaW4oU2VjdXJpdHlPcmlnaW4gKm9yaWdpbik7CisgICAgYm9vbCBk
ZWxldGluZ09yaWdpbihTZWN1cml0eU9yaWdpbiAqb3JpZ2luKTsKKyAgICB2b2lkIHJlY29yZERl
bGV0aW5nT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4pOworICAgIHZvaWQgZG9uZURlbGV0
aW5nT3JpZ2luKFNlY3VyaXR5T3JpZ2luICpvcmlnaW4pOwogCiAgICAgc3RhdGljIHZvaWQgc2No
ZWR1bGVGb3JOb3RpZmljYXRpb24oKTsKICAgICBzdGF0aWMgdm9pZCBub3RpZnlEYXRhYmFzZXND
aGFuZ2VkKHZvaWQqKTsKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIuY3Bw
CShyZXZpc2lvbiA1NjI0MykKKysrIFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Miw2ICs0MiwxOCBAQCBPcmlnaW5RdW90YU1hbmFnZXI6
Ok9yaWdpblF1b3RhTWFuYWdlcigpCiB7CiB9CiAKK2Jvb2wgT3JpZ2luUXVvdGFNYW5hZ2VyOjp0
cnlMb2NrKCkKK3sKKyAgICBib29sIGxvY2tlZCA9IG1fdXNhZ2VSZWNvcmRHdWFyZC50cnlMb2Nr
KCk7CisjaWZuZGVmIE5ERUJVRworICAgIGlmIChsb2NrZWQpCisgICAgICAgIG1fdXNhZ2VSZWNv
cmRHdWFyZExvY2tlZCA9IHRydWU7CisgICAgZWxzZQorICAgICAgICBBU1NFUlQobV91c2FnZVJl
Y29yZEd1YXJkTG9ja2VkKTsKKyNlbmRpZgorICAgIHJldHVybiBsb2NrZWQ7Cit9CisKIHZvaWQg
T3JpZ2luUXVvdGFNYW5hZ2VyOjpsb2NrKCkKIHsKICAgICBtX3VzYWdlUmVjb3JkR3VhcmQubG9j
aygpOwpAQCAtNjMsNyArNzUsNyBAQCB2b2lkIE9yaWdpblF1b3RhTWFuYWdlcjo6dHJhY2tPcmln
aW4oUGFzCiAgICAgQVNTRVJUKG1fdXNhZ2VSZWNvcmRHdWFyZExvY2tlZCk7CiAgICAgQVNTRVJU
KCFtX3VzYWdlTWFwLmNvbnRhaW5zKG9yaWdpbi5nZXQoKSkpOwogCi0gICAgbV91c2FnZU1hcC5z
ZXQob3JpZ2luLCBuZXcgT3JpZ2luVXNhZ2VSZWNvcmQpOworICAgIG1fdXNhZ2VNYXAuc2V0KG9y
aWdpbi0+dGhyZWFkc2FmZUNvcHkoKSwgbmV3IE9yaWdpblVzYWdlUmVjb3JkKTsKIH0KIAogYm9v
bCBPcmlnaW5RdW90YU1hbmFnZXI6OnRyYWNrc09yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2lu
KSBjb25zdApJbmRleDogV2ViQ29yZS9zdG9yYWdlL09yaWdpblF1b3RhTWFuYWdlci5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9PcmlnaW5RdW90YU1hbmFnZXIuaAkocmV2aXNpb24g
NTYyNDMpCisrKyBXZWJDb3JlL3N0b3JhZ2UvT3JpZ2luUXVvdGFNYW5hZ2VyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAgY2xhc3MgT3JpZ2luUXVvdGFNYW5hZ2VyIDogcHVibGlj
IE5vbmNvcAogcHVibGljOgogICAgIE9yaWdpblF1b3RhTWFuYWdlcigpOwogCisgICAgYm9vbCB0
cnlMb2NrKCk7CiAgICAgdm9pZCBsb2NrKCk7CiAgICAgdm9pZCB1bmxvY2soKTsKIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>