<?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>34619</bug_id>
          
          <creation_ts>2010-02-04 15:11:28 -0800</creation_ts>
          <short_desc>Add a way to cancel/ignore transactions on a database</short_desc>
          <delta_ts>2010-02-08 13:21:33 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dumitru Daniliuc">dumi</reporter>
          <assigned_to name="Dumitru Daniliuc">dumi</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>eisinger</cc>
    
    <cc>ericu</cc>
    
    <cc>jorlow</cc>
    
    <cc>michaeln</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>187954</commentid>
    <comment_count>0</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-02-04 15:11:28 -0800</bug_when>
    <thetext>When the user wants to clear all browsing data, Chromium needs to be able to delete all DB files. In order to do that, we need to have a way to cancel/ignore transactions on a database, and close the handle to that DB file.

This could lead to canceled/ignored transactions and undefined app behavior, but we believe the user&apos;s request to clear all browsing data is more important.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188342</commentid>
    <comment_count>1</comment_count>
      <attachid>48269</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-02-05 15:35:52 -0800</bug_when>
    <thetext>Created attachment 48269
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188369</commentid>
    <comment_count>2</comment_count>
      <attachid>48269</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-02-05 17:14:46 -0800</bug_when>
    <thetext>Comment on attachment 48269
patch

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 54448)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,20 @@
&gt; +2010-02-05  Dumitru Daniliuc  &lt;dumi@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Adding a way to get the set of all open database handles pointing
&gt; +        to a given database.
&gt; +
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=34619
&gt; +

Maybe add a few more details?


&gt; ===================================================================
&gt; --- WebCore/storage/DatabaseTracker.h	(revision 54448)
&gt; +++ WebCore/storage/DatabaseTracker.h	(working copy)
&gt; @@ -69,12 +70,20 @@ public:
&gt;  
&gt;      void addOpenDatabase(Database*);
&gt;      void removeOpenDatabase(Database*);
&gt; +    void getOpenDatabases(const String&amp; originIdentifier, const String&amp; name, HashSet&lt;Database*&gt;* databases);

This probably should be a hash set of ref pointers.


&gt; Index: WebCore/storage/chromium/DatabaseTrackerChromium.cpp
&gt; ===================================================================
&gt; --- WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(revision 54448)
&gt; +++ WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(working copy)
&gt; @@ -38,6 +38,7 @@
&gt;  #include &quot;QuotaTracker.h&quot;
&gt;  #include &quot;ScriptExecutionContext.h&quot;
&gt;  #include &quot;SecurityOrigin.h&quot;
&gt; +#include &quot;SecurityOriginHash.h&quot;
&gt;  #include &quot;SQLiteFileSystem.h&quot;
&gt;  #include &lt;wtf/HashSet.h&gt;
&gt;  #include &lt;wtf/MainThread.h&gt;
&gt; @@ -76,6 +77,29 @@ String DatabaseTracker::fullPathForDatab
&gt;  void DatabaseTracker::addOpenDatabase(Database* database)
&gt;  {

Don&apos;t we need this code in the non-Chromium version too?

If so, maybe there&apos;s even some way to share more code?  For example have a common parent class?  Just a thought.


&gt; @@ -102,14 +126,55 @@ private:
&gt;  
&gt;  void DatabaseTracker::removeOpenDatabase(Database* database)
&gt;  {
&gt; +    if (!database)
&gt; +        return;
&gt; +
&gt;      if (!database-&gt;scriptExecutionContext()-&gt;isContextThread()) {
&gt;          database-&gt;scriptExecutionContext()-&gt;postTask(TrackerRemoveOpenDatabaseTask::create(database));
&gt;          return;
&gt;      }
&gt;  
&gt; +    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
&gt; +    ASSERT(m_openDatabaseMap);
&gt; +    DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(database-&gt;securityOrigin());
&gt; +    ASSERT(nameMap);
&gt; +    String name(database-&gt;stringIdentifier());
&gt; +    DatabaseSet* databaseSet = nameMap-&gt;get(name);
&gt; +    ASSERT(databaseSet);
&gt; +    databaseSet-&gt;remove(database);
&gt; +
&gt; +    if (databaseSet-&gt;isEmpty()) {
&gt; +        nameMap-&gt;remove(name);
&gt; +        delete databaseSet;
&gt; +        if (nameMap-&gt;isEmpty()) {
&gt; +            m_openDatabaseMap-&gt;remove(database-&gt;securityOrigin());
&gt; +            delete nameMap;

I wish there was some way to avoid this, but I can&apos;t think of any that wouldn&apos;t be more complex.

&gt; +        }
&gt; +    }
&gt; +
&gt;      DatabaseObserver::databaseClosed(database);
&gt;  }
&gt;  
&gt; +
&gt; +void DatabaseTracker::getOpenDatabases(const String&amp; originIdentifier, const String&amp; name, HashSet&lt;Database*&gt;* databases)

This method should probably take in a SecurityOrigin pointer.

&gt; +{

Maybe you should clear the databases hash set or at least assert it&apos;s empty?


&gt; Index: WebKit/chromium/public/WebDatabase.h
&gt; ===================================================================
&gt; --- WebKit/chromium/public/WebDatabase.h	(revision 54448)
&gt; +++ WebKit/chromium/public/WebDatabase.h	(working copy)
&gt; @@ -72,6 +72,8 @@ public:
&gt;      WEBKIT_API static void updateDatabaseSize(
&gt;          const WebString&amp; originIdentifier, const WebString&amp; databaseName,
&gt;          unsigned long long databaseSize, unsigned long long spaceAvailable);
&gt; +    WEBKIT_API static void closeDatabaseImmediately(
&gt; +        const WebString&amp; originIdentifier, const WebString&amp; databaseName);

Instead of an origin identifier, it should probably take in a &quot;const WebSecurityOrigin&amp;&quot;.

&gt;  
&gt;  #if WEBKIT_IMPLEMENTATION
&gt;      WebDatabase(const WTF::PassRefPtr&lt;WebCore::Database&gt;&amp;);
&gt; Index: WebKit/chromium/src/WebDatabase.cpp
&gt; ===================================================================
&gt; --- WebKit/chromium/src/WebDatabase.cpp	(revision 54448)
&gt; +++ WebKit/chromium/src/WebDatabase.cpp	(working copy)
&gt; @@ -32,7 +32,9 @@
&gt;  #include &quot;WebDatabase.h&quot;
&gt;  
&gt;  #include &quot;Database.h&quot;
&gt; +#include &quot;DatabaseTask.h&quot;
&gt;  #include &quot;DatabaseThread.h&quot;
&gt; +#include &quot;DatabaseTracker.h&quot;
&gt;  #include &quot;Document.h&quot;
&gt;  #include &quot;KURL.h&quot;
&gt;  #include &quot;QuotaTracker.h&quot;
&gt; @@ -106,6 +108,21 @@ void WebDatabase::updateDatabaseSize(
&gt;          originIdentifier, databaseName, databaseSize, spaceAvailable);
&gt;  }
&gt;  
&gt; +void WebDatabase::closeDatabaseImmediately(
&gt; +    const WebString&amp; originIdentifier, const WebString&amp; databaseName)

Seems like those lines could be combined.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188370</commentid>
    <comment_count>3</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-02-05 17:17:37 -0800</bug_when>
    <thetext>Oops, lost the context for this one:

&gt; &gt; +{
&gt; 
&gt; Maybe you should clear the databases hash set or at least assert it&apos;s empty?
&gt;


It was supposed to be this:

&gt; +void DatabaseTracker::getOpenDatabases(const String&amp; originIdentifier, const String&amp; name, HashSet&lt;Database*&gt;* databases)
&gt; +{

Maybe you should clear the databases hash set or at least assert it&apos;s empty?

&gt; +    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
&gt; +    if (!m_openDatabaseMap)
&gt; +        return;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188378</commentid>
    <comment_count>4</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-02-05 18:22:44 -0800</bug_when>
    <thetext>&gt; +++ WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(working copy)
&gt; @@ -38,6 +38,7 @@
&gt;  #include &quot;QuotaTracker.h&quot;
&gt;  #include &quot;ScriptExecutionContext.h&quot;
&gt;  #include &quot;SecurityOrigin.h&quot;
&gt; +#include &quot;SecurityOriginHash.h&quot;
&gt;  #include &quot;SQLiteFileSystem.h&quot;
&gt;  #include &lt;wtf/HashSet.h&gt;
&gt;  #include &lt;wtf/MainThread.h&gt;
&gt; @@ -76,6 +77,29 @@ String DatabaseTracker::fullPathForDatab
&gt;  void DatabaseTracker::addOpenDatabase(Database* database)
&gt;  {
&gt;      ASSERT(database-&gt;scriptExecutionContext()-&gt;isContextThread());

This should never be called with null database; note the line just above.

&gt; +    if (!database)
&gt; +      return;





&gt;  void DatabaseTracker::removeOpenDatabase(Database* database)
&gt;  {

Can this ever be called with null database?

&gt; +    if (!database)
&gt; +        return;
&gt; +</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188381</commentid>
    <comment_count>5</comment_count>
      <attachid>48278</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-02-05 18:31:19 -0800</bug_when>
    <thetext>Created attachment 48278
patch

(In reply to comment #2)
&gt; (From update of attachment 48269 [details])
&gt; &gt; Index: WebCore/ChangeLog
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/ChangeLog	(revision 54448)
&gt; &gt; +++ WebCore/ChangeLog	(working copy)
&gt; &gt; @@ -1,3 +1,20 @@
&gt; &gt; +2010-02-05  Dumitru Daniliuc  &lt;dumi@chromium.org&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        Adding a way to get the set of all open database handles pointing
&gt; &gt; +        to a given database.
&gt; &gt; +
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=34619
&gt; &gt; +
&gt; 
&gt; Maybe add a few more details?

done.

&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/storage/DatabaseTracker.h	(revision 54448)
&gt; &gt; +++ WebCore/storage/DatabaseTracker.h	(working copy)
&gt; &gt; @@ -69,12 +70,20 @@ public:
&gt; &gt;  
&gt; &gt;      void addOpenDatabase(Database*);
&gt; &gt;      void removeOpenDatabase(Database*);
&gt; &gt; +    void getOpenDatabases(const String&amp; originIdentifier, const String&amp; name, HashSet&lt;Database*&gt;* databases);
&gt; 
&gt; This probably should be a hash set of ref pointers.

done.

&gt; &gt; Index: WebCore/storage/chromium/DatabaseTrackerChromium.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(revision 54448)
&gt; &gt; +++ WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(working copy)
&gt; &gt; @@ -38,6 +38,7 @@
&gt; &gt;  #include &quot;QuotaTracker.h&quot;
&gt; &gt;  #include &quot;ScriptExecutionContext.h&quot;
&gt; &gt;  #include &quot;SecurityOrigin.h&quot;
&gt; &gt; +#include &quot;SecurityOriginHash.h&quot;
&gt; &gt;  #include &quot;SQLiteFileSystem.h&quot;
&gt; &gt;  #include &lt;wtf/HashSet.h&gt;
&gt; &gt;  #include &lt;wtf/MainThread.h&gt;
&gt; &gt; @@ -76,6 +77,29 @@ String DatabaseTracker::fullPathForDatab
&gt; &gt;  void DatabaseTracker::addOpenDatabase(Database* database)
&gt; &gt;  {
&gt; 
&gt; Don&apos;t we need this code in the non-Chromium version too?
&gt; 
&gt; If so, maybe there&apos;s even some way to share more code?  For example have a
&gt; common parent class?  Just a thought.

i need to refactor DatabaseTracker.{h|cpp} to remove the #ifdefs. i can try to share some of this code then. for nwo though, i don&apos;t think there&apos;s a much better way to do this.

&gt; &gt; +        }
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt;      DatabaseObserver::databaseClosed(database);
&gt; &gt;  }
&gt; &gt;  
&gt; &gt; +
&gt; &gt; +void DatabaseTracker::getOpenDatabases(const String&amp; originIdentifier, const String&amp; name, HashSet&lt;Database*&gt;* databases)
&gt; 
&gt; This method should probably take in a SecurityOrigin pointer.

done.

&gt; &gt; +{
&gt; 
&gt; Maybe you should clear the databases hash set or at least assert it&apos;s empty?

i don&apos;t think we need to do this. for example, the caller might want to get all handles for DBs A, B and C. i don&apos;t think we should force it to use 3 different hash sets.

&gt; &gt; Index: WebKit/chromium/public/WebDatabase.h
&gt; &gt; ===================================================================
&gt; &gt; --- WebKit/chromium/public/WebDatabase.h	(revision 54448)
&gt; &gt; +++ WebKit/chromium/public/WebDatabase.h	(working copy)
&gt; &gt; @@ -72,6 +72,8 @@ public:
&gt; &gt;      WEBKIT_API static void updateDatabaseSize(
&gt; &gt;          const WebString&amp; originIdentifier, const WebString&amp; databaseName,
&gt; &gt;          unsigned long long databaseSize, unsigned long long spaceAvailable);
&gt; &gt; +    WEBKIT_API static void closeDatabaseImmediately(
&gt; &gt; +        const WebString&amp; originIdentifier, const WebString&amp; databaseName);
&gt; 
&gt; Instead of an origin identifier, it should probably take in a &quot;const
&gt; WebSecurityOrigin&amp;&quot;.

the caller operates on strings and is unaware of WebSecurityOrigins. i think it might be better to leave it this way, especially since updateDatabaseSize() uses strings too.

&gt; &gt;  #if WEBKIT_IMPLEMENTATION
&gt; &gt;      WebDatabase(const WTF::PassRefPtr&lt;WebCore::Database&gt;&amp;);
&gt; &gt; Index: WebKit/chromium/src/WebDatabase.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebKit/chromium/src/WebDatabase.cpp	(revision 54448)
&gt; &gt; +++ WebKit/chromium/src/WebDatabase.cpp	(working copy)
&gt; &gt; @@ -32,7 +32,9 @@
&gt; &gt;  #include &quot;WebDatabase.h&quot;
&gt; &gt;  
&gt; &gt;  #include &quot;Database.h&quot;
&gt; &gt; +#include &quot;DatabaseTask.h&quot;
&gt; &gt;  #include &quot;DatabaseThread.h&quot;
&gt; &gt; +#include &quot;DatabaseTracker.h&quot;
&gt; &gt;  #include &quot;Document.h&quot;
&gt; &gt;  #include &quot;KURL.h&quot;
&gt; &gt;  #include &quot;QuotaTracker.h&quot;
&gt; &gt; @@ -106,6 +108,21 @@ void WebDatabase::updateDatabaseSize(
&gt; &gt;          originIdentifier, databaseName, databaseSize, spaceAvailable);
&gt; &gt;  }
&gt; &gt;  
&gt; &gt; +void WebDatabase::closeDatabaseImmediately(
&gt; &gt; +    const WebString&amp; originIdentifier, const WebString&amp; databaseName)
&gt; 
&gt; Seems like those lines could be combined.

done.


(In reply to comment #4)
&gt; &gt; +++ WebCore/storage/chromium/DatabaseTrackerChromium.cpp	(working copy)
&gt; &gt; @@ -38,6 +38,7 @@
&gt; &gt;  #include &quot;QuotaTracker.h&quot;
&gt; &gt;  #include &quot;ScriptExecutionContext.h&quot;
&gt; &gt;  #include &quot;SecurityOrigin.h&quot;
&gt; &gt; +#include &quot;SecurityOriginHash.h&quot;
&gt; &gt;  #include &quot;SQLiteFileSystem.h&quot;
&gt; &gt;  #include &lt;wtf/HashSet.h&gt;
&gt; &gt;  #include &lt;wtf/MainThread.h&gt;
&gt; &gt; @@ -76,6 +77,29 @@ String DatabaseTracker::fullPathForDatab
&gt; &gt;  void DatabaseTracker::addOpenDatabase(Database* database)
&gt; &gt;  {
&gt; &gt;      ASSERT(database-&gt;scriptExecutionContext()-&gt;isContextThread());
&gt; 
&gt; This should never be called with null database; note the line just above.
&gt; 
&gt; &gt; +    if (!database)
&gt; &gt; +      return;

removed.

&gt; &gt;  void DatabaseTracker::removeOpenDatabase(Database* database)
&gt; &gt;  {
&gt; 
&gt; Can this ever be called with null database?
&gt; 
&gt; &gt; +    if (!database)
&gt; &gt; +        return;

i don&apos;t think so. removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188384</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-02-05 19:01:25 -0800</bug_when>
    <thetext>Attachment 48278 did not build on chromium:
Build output: http://webkit-commit-queue.appspot.com/results/238526</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188402</commentid>
    <comment_count>7</comment_count>
      <attachid>48278</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-02-05 21:17:53 -0800</bug_when>
    <thetext>Comment on attachment 48278
patch

All your comments seem reasonable.


&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 54456)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,22 @@
&gt; +2010-02-05  Dumitru Daniliuc  &lt;dumi@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Adding a way to get the set of all open database handles pointing
&gt; +        to a given database. Sometimes we need to be able to close all
&gt; +        handles to a database as soon as possible (to delete the DB file,
&gt; +        for example).
&gt; +
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=34619

Please use the change log style of

Headline.
http://bug.link

Details
and
more
details.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188747</commentid>
    <comment_count>8</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2010-02-08 13:21:33 -0800</bug_when>
    <thetext>Changed the format of the comments in ChangeLogs. Also, fixed the chromium build problem.

Landed as r54506.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48269</attachid>
            <date>2010-02-05 15:35:52 -0800</date>
            <delta_ts>2010-02-05 18:31:19 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>10142</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NDQ0OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjAgQEAKKzIwMTAtMDItMDUgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgYSB3YXkgdG8gZ2V0IHRoZSBzZXQgb2YgYWxsIG9wZW4gZGF0YWJhc2UgaGFuZGxl
cyBwb2ludGluZworICAgICAgICB0byBhIGdpdmVuIGRhdGFiYXNlLgorCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDYxOQorCisgICAgICAgICogc3Rv
cmFnZS9EYXRhYmFzZVRyYWNrZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFj
a2VyOjpnZXRPcGVuRGF0YWJhc2VzKToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tl
ci5oOgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjphZGRPcGVuRGF0YWJhc2Up
OgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2Up
OgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjpnZXRPcGVuRGF0YWJhc2VzKToK
KwogMjAxMC0wMi0wNSAgRW5yaWNhIENhc3VjY2kgIDxlbnJpY2FAYXBwbGUuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IFNpbW9uIEZyYXNlci4KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRh
YmFzZVRyYWNrZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRy
YWNrZXIuY3BwCShyZXZpc2lvbiA1NDQ0OCkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRy
YWNrZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NzgsNiArNDc4LDI1IEBAIHZvaWQgRGF0YWJh
c2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2UKICAgICBkZWxldGUgbmFtZU1hcDsKIH0KIAor
dm9pZCBEYXRhYmFzZVRyYWNrZXI6OmdldE9wZW5EYXRhYmFzZXMoY29uc3QgU3RyaW5nJiBvcmln
aW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIG5hbWUsIEhhc2hTZXQ8RGF0YWJhc2UqPiogZGF0
YWJhc2VzKQoreworICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0
YWJhc2VNYXBHdWFyZCk7CisgICAgaWYgKCFtX29wZW5EYXRhYmFzZU1hcCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW4gPSBTZWN1cml0eU9yaWdp
bjo6Y3JlYXRlRnJvbURhdGFiYXNlSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKKyAgICBE
YXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KG9yaWdpbi5n
ZXQoKSk7CisgICAgaWYgKCFuYW1lTWFwKQorICAgICAgICByZXR1cm47CisKKyAgICBEYXRhYmFz
ZVNldCogZGF0YWJhc2VTZXQgPSBuYW1lTWFwLT5nZXQobmFtZSk7CisgICAgaWYgKCFkYXRhYmFz
ZVNldCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChEYXRhYmFzZVNldDo6aXRlcmF0b3Ig
aXQgPSBkYXRhYmFzZVNldC0+YmVnaW4oKTsgaXQgIT0gZGF0YWJhc2VTZXQtPmVuZCgpOyArK2l0
KQorICAgICAgICBkYXRhYmFzZXMtPmFkZCgqaXQpOworfQorCiB1bnNpZ25lZCBsb25nIGxvbmcg
RGF0YWJhc2VUcmFja2VyOjp1c2FnZUZvck9yaWdpbihTZWN1cml0eU9yaWdpbiogb3JpZ2luKQog
ewogICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWQpOwpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFn
ZS9EYXRhYmFzZVRyYWNrZXIuaAkocmV2aXNpb24gNTQ0NDgpCisrKyBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VUcmFja2VyLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDEzICszMiwxMyBAQAogI2lm
IEVOQUJMRShEQVRBQkFTRSkKIAogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVk
ZSAiU3RyaW5nSGFzaC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3Rm
L0hhc2hTZXQuaD4KIAogI2lmICFQTEFURk9STShDSFJPTUlVTSkKICNpbmNsdWRlICJEYXRhYmFz
ZURldGFpbHMuaCIKICNpbmNsdWRlICJTUUxpdGVEYXRhYmFzZS5oIgotI2luY2x1ZGUgIlN0cmlu
Z0hhc2guaCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoU2V0
Lmg+CiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgogI2VuZGlmIC8vICFQTEFURk9STShDSFJPTUlV
TSkKIApAQCAtNDgsMTEgKzQ4LDEyIEBAIGNsYXNzIERhdGFiYXNlOwogY2xhc3MgU2NyaXB0RXhl
Y3V0aW9uQ29udGV4dDsKIGNsYXNzIFNlY3VyaXR5T3JpZ2luOwogCitzdHJ1Y3QgU2VjdXJpdHlP
cmlnaW5IYXNoOworCiAjaWYgIVBMQVRGT1JNKENIUk9NSVVNKQogY2xhc3MgRGF0YWJhc2VUcmFj
a2VyQ2xpZW50OwogY2xhc3MgT3JpZ2luUXVvdGFNYW5hZ2VyOwogCi1zdHJ1Y3QgU2VjdXJpdHlP
cmlnaW5IYXNoOwogc3RydWN0IFNlY3VyaXR5T3JpZ2luVHJhaXRzOwogI2VuZGlmIC8vICFQTEFU
Rk9STShDSFJPTUlVTSkKIApAQCAtNjksMTIgKzcwLDIwIEBAIHB1YmxpYzoKIAogICAgIHZvaWQg
YWRkT3BlbkRhdGFiYXNlKERhdGFiYXNlKik7CiAgICAgdm9pZCByZW1vdmVPcGVuRGF0YWJhc2Uo
RGF0YWJhc2UqKTsKKyAgICB2b2lkIGdldE9wZW5EYXRhYmFzZXMoY29uc3QgU3RyaW5nJiBvcmln
aW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIG5hbWUsIEhhc2hTZXQ8RGF0YWJhc2UqPiogZGF0
YWJhc2VzKTsKIAogICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRNYXhTaXplRm9yRGF0YWJhc2Uo
Y29uc3QgRGF0YWJhc2UqKTsKIAogcHJpdmF0ZToKICAgICBEYXRhYmFzZVRyYWNrZXIoKTsKIAor
ICAgIHR5cGVkZWYgSGFzaFNldDxEYXRhYmFzZSo+IERhdGFiYXNlU2V0OworICAgIHR5cGVkZWYg
SGFzaE1hcDxTdHJpbmcsIERhdGFiYXNlU2V0Kj4gRGF0YWJhc2VOYW1lTWFwOworICAgIHR5cGVk
ZWYgSGFzaE1hcDxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBEYXRhYmFzZU5hbWVNYXAqLCBTZWN1
cml0eU9yaWdpbkhhc2g+IERhdGFiYXNlT3JpZ2luTWFwOworCisgICAgTXV0ZXggbV9vcGVuRGF0
YWJhc2VNYXBHdWFyZDsKKyAgICBtdXRhYmxlIE93blB0cjxEYXRhYmFzZU9yaWdpbk1hcD4gbV9v
cGVuRGF0YWJhc2VNYXA7CisKICNpZiAhUExBVEZPUk0oQ0hST01JVU0pCiBwdWJsaWM6CiAgICAg
dm9pZCBzZXREYXRhYmFzZURpcmVjdG9yeVBhdGgoY29uc3QgU3RyaW5nJik7CkBAIC0xMjMsMTMg
KzEzMiw2IEBAIHByaXZhdGU6CiAgICAgTXV0ZXggbV9xdW90YU1hcEd1YXJkOwogICAgIG11dGFi
bGUgT3duUHRyPFF1b3RhTWFwPiBtX3F1b3RhTWFwOwogCi0gICAgdHlwZWRlZiBIYXNoU2V0PERh
dGFiYXNlKj4gRGF0YWJhc2VTZXQ7Ci0gICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgRGF0YWJh
c2VTZXQqPiBEYXRhYmFzZU5hbWVNYXA7Ci0gICAgdHlwZWRlZiBIYXNoTWFwPFJlZlB0cjxTZWN1
cml0eU9yaWdpbj4sIERhdGFiYXNlTmFtZU1hcCosIFNlY3VyaXR5T3JpZ2luSGFzaD4gRGF0YWJh
c2VPcmlnaW5NYXA7Ci0KLSAgICBNdXRleCBtX29wZW5EYXRhYmFzZU1hcEd1YXJkOwotICAgIG11
dGFibGUgT3duUHRyPERhdGFiYXNlT3JpZ2luTWFwPiBtX29wZW5EYXRhYmFzZU1hcDsKLQogICAg
IE93blB0cjxPcmlnaW5RdW90YU1hbmFnZXI+IG1fcXVvdGFNYW5hZ2VyOwogCiAgICAgU3RyaW5n
IG1fZGF0YWJhc2VEaXJlY3RvcnlQYXRoOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVt
L0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3Jh
Z2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA1NDQ0OCkK
KysrIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJRdW90YVRyYWNrZXIu
aCIKICNpbmNsdWRlICJTY3JpcHRFeGVjdXRpb25Db250ZXh0LmgiCiAjaW5jbHVkZSAiU2VjdXJp
dHlPcmlnaW4uaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbkhhc2guaCIKICNpbmNsdWRlICJT
UUxpdGVGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3
dGYvTWFpblRocmVhZC5oPgpAQCAtNzYsNiArNzcsMjkgQEAgU3RyaW5nIERhdGFiYXNlVHJhY2tl
cjo6ZnVsbFBhdGhGb3JEYXRhYgogdm9pZCBEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFz
ZShEYXRhYmFzZSogZGF0YWJhc2UpCiB7CiAgICAgQVNTRVJUKGRhdGFiYXNlLT5zY3JpcHRFeGVj
dXRpb25Db250ZXh0KCktPmlzQ29udGV4dFRocmVhZCgpKTsKKyAgICBpZiAoIWRhdGFiYXNlKQor
ICAgICAgcmV0dXJuOworCisgICAgTXV0ZXhMb2NrZXIgb3BlbkRhdGFiYXNlTWFwTG9jayhtX29w
ZW5EYXRhYmFzZU1hcEd1YXJkKTsKKworICAgIGlmICghbV9vcGVuRGF0YWJhc2VNYXApCisgICAg
ICAgIG1fb3BlbkRhdGFiYXNlTWFwLnNldChuZXcgRGF0YWJhc2VPcmlnaW5NYXAoKSk7CisKKyAg
ICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KGRhdGFi
YXNlLT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICBpZiAoIW5hbWVNYXApIHsKKyAgICAgICAgbmFt
ZU1hcCA9IG5ldyBEYXRhYmFzZU5hbWVNYXAoKTsKKyAgICAgICAgbV9vcGVuRGF0YWJhc2VNYXAt
PnNldChkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSwgbmFtZU1hcCk7CisgICAgfQorCisgICAg
U3RyaW5nIG5hbWUoZGF0YWJhc2UtPnN0cmluZ0lkZW50aWZpZXIoKSk7CisgICAgRGF0YWJhc2VT
ZXQqIGRhdGFiYXNlU2V0ID0gbmFtZU1hcC0+Z2V0KG5hbWUpOworICAgIGlmICghZGF0YWJhc2VT
ZXQpIHsKKyAgICAgICAgZGF0YWJhc2VTZXQgPSBuZXcgRGF0YWJhc2VTZXQoKTsKKyAgICAgICAg
bmFtZU1hcC0+c2V0KG5hbWUsIGRhdGFiYXNlU2V0KTsKKyAgICB9CisKKyAgICBkYXRhYmFzZVNl
dC0+YWRkKGRhdGFiYXNlKTsKKwogICAgIERhdGFiYXNlT2JzZXJ2ZXI6OmRhdGFiYXNlT3BlbmVk
KGRhdGFiYXNlKTsKIH0KIApAQCAtMTAyLDE0ICsxMjYsNTUgQEAgcHJpdmF0ZToKIAogdm9pZCBE
YXRhYmFzZVRyYWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZShEYXRhYmFzZSogZGF0YWJhc2UpCiB7
CisgICAgaWYgKCFkYXRhYmFzZSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgaWYgKCFkYXRhYmFz
ZS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLT5pc0NvbnRleHRUaHJlYWQoKSkgewogICAgICAg
ICBkYXRhYmFzZS0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLT5wb3N0VGFzayhUcmFja2VyUmVt
b3ZlT3BlbkRhdGFiYXNlVGFzazo6Y3JlYXRlKGRhdGFiYXNlKSk7CiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAKKyAgICBNdXRleExvY2tlciBvcGVuRGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFi
YXNlTWFwR3VhcmQpOworICAgIEFTU0VSVChtX29wZW5EYXRhYmFzZU1hcCk7CisgICAgRGF0YWJh
c2VOYW1lTWFwKiBuYW1lTWFwID0gbV9vcGVuRGF0YWJhc2VNYXAtPmdldChkYXRhYmFzZS0+c2Vj
dXJpdHlPcmlnaW4oKSk7CisgICAgQVNTRVJUKG5hbWVNYXApOworICAgIFN0cmluZyBuYW1lKGRh
dGFiYXNlLT5zdHJpbmdJZGVudGlmaWVyKCkpOworICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNl
dCA9IG5hbWVNYXAtPmdldChuYW1lKTsKKyAgICBBU1NFUlQoZGF0YWJhc2VTZXQpOworICAgIGRh
dGFiYXNlU2V0LT5yZW1vdmUoZGF0YWJhc2UpOworCisgICAgaWYgKGRhdGFiYXNlU2V0LT5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgbmFtZU1hcC0+cmVtb3ZlKG5hbWUpOworICAgICAgICBkZWxldGUg
ZGF0YWJhc2VTZXQ7CisgICAgICAgIGlmIChuYW1lTWFwLT5pc0VtcHR5KCkpIHsKKyAgICAgICAg
ICAgIG1fb3BlbkRhdGFiYXNlTWFwLT5yZW1vdmUoZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCkp
OworICAgICAgICAgICAgZGVsZXRlIG5hbWVNYXA7CisgICAgICAgIH0KKyAgICB9CisKICAgICBE
YXRhYmFzZU9ic2VydmVyOjpkYXRhYmFzZUNsb3NlZChkYXRhYmFzZSk7CiB9CiAKKwordm9pZCBE
YXRhYmFzZVRyYWNrZXI6OmdldE9wZW5EYXRhYmFzZXMoY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVu
dGlmaWVyLCBjb25zdCBTdHJpbmcmIG5hbWUsIEhhc2hTZXQ8RGF0YWJhc2UqPiogZGF0YWJhc2Vz
KQoreworICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VN
YXBHdWFyZCk7CisgICAgaWYgKCFtX29wZW5EYXRhYmFzZU1hcCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgUmVmUHRyPFNlY3VyaXR5T3JpZ2luPiBvcmlnaW4gPSBTZWN1cml0eU9yaWdpbjo6Y3Jl
YXRlRnJvbURhdGFiYXNlSWRlbnRpZmllcihvcmlnaW5JZGVudGlmaWVyKTsKKyAgICBEYXRhYmFz
ZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KG9yaWdpbi5nZXQoKSk7
CisgICAgaWYgKCFuYW1lTWFwKQorICAgICAgICByZXR1cm47CisKKyAgICBEYXRhYmFzZVNldCog
ZGF0YWJhc2VTZXQgPSBuYW1lTWFwLT5nZXQobmFtZSk7CisgICAgaWYgKCFkYXRhYmFzZVNldCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChEYXRhYmFzZVNldDo6aXRlcmF0b3IgaXQgPSBk
YXRhYmFzZVNldC0+YmVnaW4oKTsgaXQgIT0gZGF0YWJhc2VTZXQtPmVuZCgpOyArK2l0KQorICAg
ICAgICBkYXRhYmFzZXMtPmFkZCgqaXQpOworfQorCiB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJh
c2VUcmFja2VyOjpnZXRNYXhTaXplRm9yRGF0YWJhc2UoY29uc3QgRGF0YWJhc2UqIGRhdGFiYXNl
KQogewogICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gZGF0YWJhc2UtPnNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQoKS0+ZGF0YWJhc2VUaHJlYWQoKS0+Z2V0VGhyZWFkSUQoKSk7CkluZGV4OiBX
ZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU0NDQ4KQorKysgV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwko
d29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDEwLTAyLTA1ICBEdW1pdHJ1IERhbmls
aXVjICA8ZHVtaUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkaW5nIGEgd2F5IHRvIGNsb3NlIGFsbCBkYXRhYmFzZSBoYW5k
bGVzIHBvaW50aW5nIHRvIGEgY2VydGFpbgorICAgICAgICBkYXRhYmFzZSBhcyBzb29uIGFzIHBv
c3NpYmxlLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNDYxOQorCisgICAgICAgICogcHVibGljL1dlYkRhdGFiYXNlLmg6CisgICAgICAgICogc3Jj
L1dlYkRhdGFiYXNlLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViRGF0YWJhc2U6OmNsb3NlRGF0
YWJhc2VJbW1lZGlhdGVseSk6CisKIDIwMTAtMDItMDUgIEphbWVzIEhhd2tpbnMgIDxqaGF3a2lu
c0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQgTGV2aW4uCkluZGV4
OiBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYkRhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L2Nocm9taXVtL3B1YmxpYy9XZWJEYXRhYmFzZS5oCShyZXZpc2lvbiA1NDQ0OCkKKysrIFdl
YktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViRGF0YWJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNzIs
NiArNzIsOCBAQCBwdWJsaWM6CiAgICAgV0VCS0lUX0FQSSBzdGF0aWMgdm9pZCB1cGRhdGVEYXRh
YmFzZVNpemUoCiAgICAgICAgIGNvbnN0IFdlYlN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29u
c3QgV2ViU3RyaW5nJiBkYXRhYmFzZU5hbWUsCiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBk
YXRhYmFzZVNpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyBzcGFjZUF2YWlsYWJsZSk7CisgICAgV0VC
S0lUX0FQSSBzdGF0aWMgdm9pZCBjbG9zZURhdGFiYXNlSW1tZWRpYXRlbHkoCisgICAgICAgIGNv
bnN0IFdlYlN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3QgV2ViU3RyaW5nJiBkYXRhYmFz
ZU5hbWUpOwogCiAjaWYgV0VCS0lUX0lNUExFTUVOVEFUSU9OCiAgICAgV2ViRGF0YWJhc2UoY29u
c3QgV1RGOjpQYXNzUmVmUHRyPFdlYkNvcmU6OkRhdGFiYXNlPiYpOwpJbmRleDogV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJEYXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJEYXRhYmFzZS5jcHAJKHJldmlzaW9uIDU0NDQ4KQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJEYXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMyLDkgQEAKICNp
bmNsdWRlICJXZWJEYXRhYmFzZS5oIgogCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRl
ICJEYXRhYmFzZVRhc2suaCIKICNpbmNsdWRlICJEYXRhYmFzZVRocmVhZC5oIgorI2luY2x1ZGUg
IkRhdGFiYXNlVHJhY2tlci5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiS1VS
TC5oIgogI2luY2x1ZGUgIlF1b3RhVHJhY2tlci5oIgpAQCAtMTA2LDYgKzEwOCwyMSBAQCB2b2lk
IFdlYkRhdGFiYXNlOjp1cGRhdGVEYXRhYmFzZVNpemUoCiAgICAgICAgIG9yaWdpbklkZW50aWZp
ZXIsIGRhdGFiYXNlTmFtZSwgZGF0YWJhc2VTaXplLCBzcGFjZUF2YWlsYWJsZSk7CiB9CiAKK3Zv
aWQgV2ViRGF0YWJhc2U6OmNsb3NlRGF0YWJhc2VJbW1lZGlhdGVseSgKKyAgICBjb25zdCBXZWJT
dHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFdlYlN0cmluZyYgZGF0YWJhc2VOYW1lKQor
eworICAgIEhhc2hTZXQ8RGF0YWJhc2UqPiBkYXRhYmFzZUhhbmRsZXM7CisgICAgRGF0YWJhc2VU
cmFja2VyOjp0cmFja2VyKCkuZ2V0T3BlbkRhdGFiYXNlcyhvcmlnaW5JZGVudGlmaWVyLCBkYXRh
YmFzZU5hbWUsICZkYXRhYmFzZUhhbmRsZXMpOworICAgIGZvciAoSGFzaFNldDxEYXRhYmFzZSo+
OjppdGVyYXRvciBpdCA9IGRhdGFiYXNlSGFuZGxlcy5iZWdpbigpOyBpdCAhPSBkYXRhYmFzZUhh
bmRsZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgRGF0YWJhc2UqIGRhdGFiYXNlID0gKml0Owor
ICAgICAgICBEYXRhYmFzZVRocmVhZCogZGF0YWJhc2VUaHJlYWQgPSBkYXRhYmFzZS0+c2NyaXB0
RXhlY3V0aW9uQ29udGV4dCgpLT5kYXRhYmFzZVRocmVhZCgpOworICAgICAgICBpZiAoZGF0YWJh
c2VUaHJlYWQgJiYgIWRhdGFiYXNlVGhyZWFkLT50ZXJtaW5hdGlvblJlcXVlc3RlZCgpKSB7Cisg
ICAgICAgICAgICBkYXRhYmFzZS0+c3RvcCgpOworICAgICAgICAgICAgZGF0YWJhc2VUaHJlYWQt
PnNjaGVkdWxlVGFzayhEYXRhYmFzZUNsb3NlVGFzazo6Y3JlYXRlKGRhdGFiYXNlLCAwKSk7Cisg
ICAgICAgIH0KKyAgICB9Cit9CisKIFdlYkRhdGFiYXNlOjpXZWJEYXRhYmFzZShjb25zdCBXVEY6
OlBhc3NSZWZQdHI8RGF0YWJhc2U+JiBkYXRhYmFzZSkKICAgICA6IG1fcHJpdmF0ZShzdGF0aWNf
Y2FzdDxXZWJEYXRhYmFzZVByaXZhdGUqPihkYXRhYmFzZS5yZWxlYXNlUmVmKCkpKQogewo=
</data>
<flag name="review"
          id="30915"
          type_id="1"
          status="-"
          setter="jorlow"
    />
    <flag name="commit-queue"
          id="30916"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48278</attachid>
            <date>2010-02-05 18:31:19 -0800</date>
            <delta_ts>2010-02-05 21:17:52 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>9952</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NDQ1NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjIgQEAKKzIwMTAtMDItMDUgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgYSB3YXkgdG8gZ2V0IHRoZSBzZXQgb2YgYWxsIG9wZW4gZGF0YWJhc2UgaGFuZGxl
cyBwb2ludGluZworICAgICAgICB0byBhIGdpdmVuIGRhdGFiYXNlLiBTb21ldGltZXMgd2UgbmVl
ZCB0byBiZSBhYmxlIHRvIGNsb3NlIGFsbAorICAgICAgICBoYW5kbGVzIHRvIGEgZGF0YWJhc2Ug
YXMgc29vbiBhcyBwb3NzaWJsZSAodG8gZGVsZXRlIHRoZSBEQiBmaWxlLAorICAgICAgICBmb3Ig
ZXhhbXBsZSkuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTM0NjE5CisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmdldE9wZW5EYXRhYmFzZXMpOgorICAgICAg
ICAqIHN0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmg6CisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1
bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFz
ZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRy
YWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRy
YWNrZXI6OmdldE9wZW5EYXRhYmFzZXMpOgorCiAyMDEwLTAyLTA1ICBDaHJpcyBNYXJyaW4gIDxj
bWFycmluQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTaW1vbiBGcmFzZXIuCklu
ZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAkocmV2aXNpb24gNTQ0NTYpCisrKyBX
ZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDc4
LDYgKzQ3OCwyNCBAQCB2b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlCiAg
ICAgZGVsZXRlIG5hbWVNYXA7CiB9CiAKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpnZXRPcGVuRGF0
YWJhc2VzKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgSGFzaFNl
dDxSZWZQdHI8RGF0YWJhc2U+ID4qIGRhdGFiYXNlcykKK3sKKyAgICBNdXRleExvY2tlciBvcGVu
RGF0YWJhc2VNYXBMb2NrKG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQpOworICAgIGlmICghbV9vcGVu
RGF0YWJhc2VNYXApCisgICAgICAgIHJldHVybjsKKworICAgIERhdGFiYXNlTmFtZU1hcCogbmFt
ZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQob3JpZ2luKTsKKyAgICBpZiAoIW5hbWVNYXAp
CisgICAgICAgIHJldHVybjsKKworICAgIERhdGFiYXNlU2V0KiBkYXRhYmFzZVNldCA9IG5hbWVN
YXAtPmdldChuYW1lKTsKKyAgICBpZiAoIWRhdGFiYXNlU2V0KQorICAgICAgICByZXR1cm47CisK
KyAgICBmb3IgKERhdGFiYXNlU2V0OjppdGVyYXRvciBpdCA9IGRhdGFiYXNlU2V0LT5iZWdpbigp
OyBpdCAhPSBkYXRhYmFzZVNldC0+ZW5kKCk7ICsraXQpCisgICAgICAgIGRhdGFiYXNlcy0+YWRk
KCppdCk7Cit9CisKIHVuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OnVzYWdlRm9y
T3JpZ2luKFNlY3VyaXR5T3JpZ2luKiBvcmlnaW4pCiB7CiAgICAgQVNTRVJUKGN1cnJlbnRUaHJl
YWQoKSA9PSBtX3RocmVhZCk7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUcmFja2Vy
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVHJhY2tlci5oCShyZXZp
c2lvbiA1NDQ1NikKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRyYWNrZXIuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzIsMTMgKzMyLDEzIEBACiAjaWYgRU5BQkxFKERBVEFCQVNFKQogCiAjaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVk
ZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogCiAjaWYgIVBMQVRG
T1JNKENIUk9NSVVNKQogI2luY2x1ZGUgIkRhdGFiYXNlRGV0YWlscy5oIgogI2luY2x1ZGUgIlNR
TGl0ZURhdGFiYXNlLmgiCi0jaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgotI2luY2x1ZGUgPHd0Zi9I
YXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CiAjZW5kaWYgLy8gIVBMQVRGT1JNKENIUk9NSVVNKQogCkBAIC00OCwxMSArNDgsMTIgQEAg
Y2xhc3MgRGF0YWJhc2U7CiBjbGFzcyBTY3JpcHRFeGVjdXRpb25Db250ZXh0OwogY2xhc3MgU2Vj
dXJpdHlPcmlnaW47CiAKK3N0cnVjdCBTZWN1cml0eU9yaWdpbkhhc2g7CisKICNpZiAhUExBVEZP
Uk0oQ0hST01JVU0pCiBjbGFzcyBEYXRhYmFzZVRyYWNrZXJDbGllbnQ7CiBjbGFzcyBPcmlnaW5R
dW90YU1hbmFnZXI7CiAKLXN0cnVjdCBTZWN1cml0eU9yaWdpbkhhc2g7CiBzdHJ1Y3QgU2VjdXJp
dHlPcmlnaW5UcmFpdHM7CiAjZW5kaWYgLy8gIVBMQVRGT1JNKENIUk9NSVVNKQogCkBAIC02OSwx
MiArNzAsMjAgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGRPcGVuRGF0YWJhc2UoRGF0YWJhc2Uq
KTsKICAgICB2b2lkIHJlbW92ZU9wZW5EYXRhYmFzZShEYXRhYmFzZSopOworICAgIHZvaWQgZ2V0
T3BlbkRhdGFiYXNlcyhTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUs
IEhhc2hTZXQ8UmVmUHRyPERhdGFiYXNlPiA+KiBkYXRhYmFzZXMpOwogCiAgICAgdW5zaWduZWQg
bG9uZyBsb25nIGdldE1heFNpemVGb3JEYXRhYmFzZShjb25zdCBEYXRhYmFzZSopOwogCiBwcml2
YXRlOgogICAgIERhdGFiYXNlVHJhY2tlcigpOwogCisgICAgdHlwZWRlZiBIYXNoU2V0PERhdGFi
YXNlKj4gRGF0YWJhc2VTZXQ7CisgICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgRGF0YWJhc2VT
ZXQqPiBEYXRhYmFzZU5hbWVNYXA7CisgICAgdHlwZWRlZiBIYXNoTWFwPFJlZlB0cjxTZWN1cml0
eU9yaWdpbj4sIERhdGFiYXNlTmFtZU1hcCosIFNlY3VyaXR5T3JpZ2luSGFzaD4gRGF0YWJhc2VP
cmlnaW5NYXA7CisKKyAgICBNdXRleCBtX29wZW5EYXRhYmFzZU1hcEd1YXJkOworICAgIG11dGFi
bGUgT3duUHRyPERhdGFiYXNlT3JpZ2luTWFwPiBtX29wZW5EYXRhYmFzZU1hcDsKKwogI2lmICFQ
TEFURk9STShDSFJPTUlVTSkKIHB1YmxpYzoKICAgICB2b2lkIHNldERhdGFiYXNlRGlyZWN0b3J5
UGF0aChjb25zdCBTdHJpbmcmKTsKQEAgLTEyMywxMyArMTMyLDYgQEAgcHJpdmF0ZToKICAgICBN
dXRleCBtX3F1b3RhTWFwR3VhcmQ7CiAgICAgbXV0YWJsZSBPd25QdHI8UXVvdGFNYXA+IG1fcXVv
dGFNYXA7CiAKLSAgICB0eXBlZGVmIEhhc2hTZXQ8RGF0YWJhc2UqPiBEYXRhYmFzZVNldDsKLSAg
ICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBEYXRhYmFzZVNldCo+IERhdGFiYXNlTmFtZU1hcDsK
LSAgICB0eXBlZGVmIEhhc2hNYXA8UmVmUHRyPFNlY3VyaXR5T3JpZ2luPiwgRGF0YWJhc2VOYW1l
TWFwKiwgU2VjdXJpdHlPcmlnaW5IYXNoPiBEYXRhYmFzZU9yaWdpbk1hcDsKLQotICAgIE11dGV4
IG1fb3BlbkRhdGFiYXNlTWFwR3VhcmQ7Ci0gICAgbXV0YWJsZSBPd25QdHI8RGF0YWJhc2VPcmln
aW5NYXA+IG1fb3BlbkRhdGFiYXNlTWFwOwotCiAgICAgT3duUHRyPE9yaWdpblF1b3RhTWFuYWdl
cj4gbV9xdW90YU1hbmFnZXI7CiAKICAgICBTdHJpbmcgbV9kYXRhYmFzZURpcmVjdG9yeVBhdGg7
CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNr
ZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDU0NDU2KQorKysgV2ViQ29yZS9zdG9yYWdlL2Nocm9t
aXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiAr
MzgsNyBAQAogI2luY2x1ZGUgIlF1b3RhVHJhY2tlci5oIgogI2luY2x1ZGUgIlNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQuaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNl
Y3VyaXR5T3JpZ2luSGFzaC5oIgogI2luY2x1ZGUgIlNRTGl0ZUZpbGVTeXN0ZW0uaCIKICNpbmNs
dWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CkBAIC03Niw2
ICs3NywyNSBAQCBTdHJpbmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiCiB2b2lk
IERhdGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFiYXNlKERhdGFiYXNlKiBkYXRhYmFzZSkKIHsK
ICAgICBBU1NFUlQoZGF0YWJhc2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKS0+aXNDb250ZXh0
VGhyZWFkKCkpOworICAgIE11dGV4TG9ja2VyIG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0
YWJhc2VNYXBHdWFyZCk7CisgICAgaWYgKCFtX29wZW5EYXRhYmFzZU1hcCkKKyAgICAgICAgbV9v
cGVuRGF0YWJhc2VNYXAuc2V0KG5ldyBEYXRhYmFzZU9yaWdpbk1hcCgpKTsKKworICAgIERhdGFi
YXNlTmFtZU1hcCogbmFtZU1hcCA9IG1fb3BlbkRhdGFiYXNlTWFwLT5nZXQoZGF0YWJhc2UtPnNl
Y3VyaXR5T3JpZ2luKCkpOworICAgIGlmICghbmFtZU1hcCkgeworICAgICAgICBuYW1lTWFwID0g
bmV3IERhdGFiYXNlTmFtZU1hcCgpOworICAgICAgICBtX29wZW5EYXRhYmFzZU1hcC0+c2V0KGRh
dGFiYXNlLT5zZWN1cml0eU9yaWdpbigpLCBuYW1lTWFwKTsKKyAgICB9CisKKyAgICBTdHJpbmcg
bmFtZShkYXRhYmFzZS0+c3RyaW5nSWRlbnRpZmllcigpKTsKKyAgICBEYXRhYmFzZVNldCogZGF0
YWJhc2VTZXQgPSBuYW1lTWFwLT5nZXQobmFtZSk7CisgICAgaWYgKCFkYXRhYmFzZVNldCkgewor
ICAgICAgICBkYXRhYmFzZVNldCA9IG5ldyBEYXRhYmFzZVNldCgpOworICAgICAgICBuYW1lTWFw
LT5zZXQobmFtZSwgZGF0YWJhc2VTZXQpOworICAgIH0KKworICAgIGRhdGFiYXNlU2V0LT5hZGQo
ZGF0YWJhc2UpOworCiAgICAgRGF0YWJhc2VPYnNlcnZlcjo6ZGF0YWJhc2VPcGVuZWQoZGF0YWJh
c2UpOwogfQogCkBAIC0xMDcsOSArMTI3LDQ2IEBAIHZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1v
dmVPcGVuRGF0YWJhc2UKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIE11dGV4TG9ja2Vy
IG9wZW5EYXRhYmFzZU1hcExvY2sobV9vcGVuRGF0YWJhc2VNYXBHdWFyZCk7CisgICAgQVNTRVJU
KG1fb3BlbkRhdGFiYXNlTWFwKTsKKyAgICBEYXRhYmFzZU5hbWVNYXAqIG5hbWVNYXAgPSBtX29w
ZW5EYXRhYmFzZU1hcC0+Z2V0KGRhdGFiYXNlLT5zZWN1cml0eU9yaWdpbigpKTsKKyAgICBBU1NF
UlQobmFtZU1hcCk7CisgICAgU3RyaW5nIG5hbWUoZGF0YWJhc2UtPnN0cmluZ0lkZW50aWZpZXIo
KSk7CisgICAgRGF0YWJhc2VTZXQqIGRhdGFiYXNlU2V0ID0gbmFtZU1hcC0+Z2V0KG5hbWUpOwor
ICAgIEFTU0VSVChkYXRhYmFzZVNldCk7CisgICAgZGF0YWJhc2VTZXQtPnJlbW92ZShkYXRhYmFz
ZSk7CisKKyAgICBpZiAoZGF0YWJhc2VTZXQtPmlzRW1wdHkoKSkgeworICAgICAgICBuYW1lTWFw
LT5yZW1vdmUobmFtZSk7CisgICAgICAgIGRlbGV0ZSBkYXRhYmFzZVNldDsKKyAgICAgICAgaWYg
KG5hbWVNYXAtPmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbV9vcGVuRGF0YWJhc2VNYXAtPnJl
bW92ZShkYXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKSk7CisgICAgICAgICAgICBkZWxldGUgbmFt
ZU1hcDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIERhdGFiYXNlT2JzZXJ2ZXI6OmRhdGFiYXNl
Q2xvc2VkKGRhdGFiYXNlKTsKIH0KIAorCit2b2lkIERhdGFiYXNlVHJhY2tlcjo6Z2V0T3BlbkRh
dGFiYXNlcyhTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBTdHJpbmcmIG5hbWUsIEhhc2hT
ZXQ8UmVmUHRyPERhdGFiYXNlPiA+KiBkYXRhYmFzZXMpCit7CisgICAgTXV0ZXhMb2NrZXIgb3Bl
bkRhdGFiYXNlTWFwTG9jayhtX29wZW5EYXRhYmFzZU1hcEd1YXJkKTsKKyAgICBpZiAoIW1fb3Bl
bkRhdGFiYXNlTWFwKQorICAgICAgICByZXR1cm47CisKKyAgICBEYXRhYmFzZU5hbWVNYXAqIG5h
bWVNYXAgPSBtX29wZW5EYXRhYmFzZU1hcC0+Z2V0KG9yaWdpbik7CisgICAgaWYgKCFuYW1lTWFw
KQorICAgICAgICByZXR1cm47CisKKyAgICBEYXRhYmFzZVNldCogZGF0YWJhc2VTZXQgPSBuYW1l
TWFwLT5nZXQobmFtZSk7CisgICAgaWYgKCFkYXRhYmFzZVNldCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgZm9yIChEYXRhYmFzZVNldDo6aXRlcmF0b3IgaXQgPSBkYXRhYmFzZVNldC0+YmVnaW4o
KTsgaXQgIT0gZGF0YWJhc2VTZXQtPmVuZCgpOyArK2l0KQorICAgICAgICBkYXRhYmFzZXMtPmFk
ZCgqaXQpOworfQorCiB1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpnZXRNYXhT
aXplRm9yRGF0YWJhc2UoY29uc3QgRGF0YWJhc2UqIGRhdGFiYXNlKQogewogICAgIEFTU0VSVChj
dXJyZW50VGhyZWFkKCkgPT0gZGF0YWJhc2UtPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKS0+ZGF0
YWJhc2VUaHJlYWQoKS0+Z2V0VGhyZWFkSUQoKSk7CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9u
IDU0NDU2KQorKysgV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAt
MSwzICsxLDE2IEBACisyMDEwLTAyLTA1ICBEdW1pdHJ1IERhbmlsaXVjICA8ZHVtaUBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkaW5nIGEgd2F5IHRvIGNsb3NlIGFsbCBkYXRhYmFzZSBoYW5kbGVzIHBvaW50aW5nIHRvIGEg
Y2VydGFpbgorICAgICAgICBkYXRhYmFzZSBhcyBzb29uIGFzIHBvc3NpYmxlLgorCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDYxOQorCisgICAgICAg
ICogcHVibGljL1dlYkRhdGFiYXNlLmg6CisgICAgICAgICogc3JjL1dlYkRhdGFiYXNlLmNwcDoK
KyAgICAgICAgKFdlYktpdDo6V2ViRGF0YWJhc2U6OmNsb3NlRGF0YWJhc2VJbW1lZGlhdGVseSk6
CisKIDIwMTAtMDItMDUgIEphbWVzIEhhd2tpbnMgIDxqaGF3a2luc0BjaHJvbWl1bS5vcmc+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQgTGV2aW4uCkluZGV4OiBXZWJLaXQvY2hyb21pdW0v
cHVibGljL1dlYkRhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3B1Ymxp
Yy9XZWJEYXRhYmFzZS5oCShyZXZpc2lvbiA1NDQ1NikKKysrIFdlYktpdC9jaHJvbWl1bS9wdWJs
aWMvV2ViRGF0YWJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNzIsNiArNzIsOCBAQCBwdWJsaWM6
CiAgICAgV0VCS0lUX0FQSSBzdGF0aWMgdm9pZCB1cGRhdGVEYXRhYmFzZVNpemUoCiAgICAgICAg
IGNvbnN0IFdlYlN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3QgV2ViU3RyaW5nJiBkYXRh
YmFzZU5hbWUsCiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhYmFzZVNpemUsIHVuc2ln
bmVkIGxvbmcgbG9uZyBzcGFjZUF2YWlsYWJsZSk7CisgICAgV0VCS0lUX0FQSSBzdGF0aWMgdm9p
ZCBjbG9zZURhdGFiYXNlSW1tZWRpYXRlbHkoCisgICAgICAgIGNvbnN0IFdlYlN0cmluZyYgb3Jp
Z2luSWRlbnRpZmllciwgY29uc3QgV2ViU3RyaW5nJiBkYXRhYmFzZU5hbWUpOwogCiAjaWYgV0VC
S0lUX0lNUExFTUVOVEFUSU9OCiAgICAgV2ViRGF0YWJhc2UoY29uc3QgV1RGOjpQYXNzUmVmUHRy
PFdlYkNvcmU6OkRhdGFiYXNlPiYpOwpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJEYXRh
YmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJEYXRhYmFzZS5j
cHAJKHJldmlzaW9uIDU0NDU2KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJEYXRhYmFzZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMyLDkgQEAKICNpbmNsdWRlICJXZWJEYXRhYmFz
ZS5oIgogCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVRhc2suaCIK
ICNpbmNsdWRlICJEYXRhYmFzZVRocmVhZC5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVHJhY2tlci5o
IgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiS1VSTC5oIgogI2luY2x1ZGUgIlF1
b3RhVHJhY2tlci5oIgpAQCAtMTA2LDYgKzEwOCwyMiBAQCB2b2lkIFdlYkRhdGFiYXNlOjp1cGRh
dGVEYXRhYmFzZVNpemUoCiAgICAgICAgIG9yaWdpbklkZW50aWZpZXIsIGRhdGFiYXNlTmFtZSwg
ZGF0YWJhc2VTaXplLCBzcGFjZUF2YWlsYWJsZSk7CiB9CiAKK3ZvaWQgV2ViRGF0YWJhc2U6OmNs
b3NlRGF0YWJhc2VJbW1lZGlhdGVseShjb25zdCBXZWJTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIs
IGNvbnN0IFdlYlN0cmluZyYgZGF0YWJhc2VOYW1lKQoreworICAgIEhhc2hTZXQ8UmVmUHRyPERh
dGFiYXNlPj4gZGF0YWJhc2VIYW5kbGVzOworICAgIFBhc3NSZWZQdHI8U2VjdXJpdHlPcmlnaW4+
IG9yaWdpblBycCgqV2ViU2VjdXJpdHlPcmlnaW46OmNyZWF0ZUZyb21EYXRhYmFzZUlkZW50aWZp
ZXIob3JpZ2luSWRlbnRpZmllcikpOworICAgIFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gb3JpZ2lu
ID0gb3JpZ2luUHJwOworICAgIERhdGFiYXNlVHJhY2tlcjo6dHJhY2tlcigpLmdldE9wZW5EYXRh
YmFzZXMob3JpZ2luLmdldCgpLCBkYXRhYmFzZU5hbWUsICZkYXRhYmFzZUhhbmRsZXMpOworICAg
IGZvciAoSGFzaFNldDxSZWZQdHI8RGF0YWJhc2U+ID46Oml0ZXJhdG9yIGl0ID0gZGF0YWJhc2VI
YW5kbGVzLmJlZ2luKCk7IGl0ICE9IGRhdGFiYXNlSGFuZGxlcy5lbmQoKTsgKytpdCkgeworICAg
ICAgICBEYXRhYmFzZSogZGF0YWJhc2UgPSBpdC0+Z2V0KCk7CisgICAgICAgIERhdGFiYXNlVGhy
ZWFkKiBkYXRhYmFzZVRocmVhZCA9IGRhdGFiYXNlLT5zY3JpcHRFeGVjdXRpb25Db250ZXh0KCkt
PmRhdGFiYXNlVGhyZWFkKCk7CisgICAgICAgIGlmIChkYXRhYmFzZVRocmVhZCAmJiAhZGF0YWJh
c2VUaHJlYWQtPnRlcm1pbmF0aW9uUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgIGRhdGFiYXNl
LT5zdG9wKCk7CisgICAgICAgICAgICBkYXRhYmFzZVRocmVhZC0+c2NoZWR1bGVUYXNrKERhdGFi
YXNlQ2xvc2VUYXNrOjpjcmVhdGUoZGF0YWJhc2UsIDApKTsKKyAgICAgICAgfQorICAgIH0KK30K
KwogV2ViRGF0YWJhc2U6OldlYkRhdGFiYXNlKGNvbnN0IFdURjo6UGFzc1JlZlB0cjxEYXRhYmFz
ZT4mIGRhdGFiYXNlKQogICAgIDogbV9wcml2YXRlKHN0YXRpY19jYXN0PFdlYkRhdGFiYXNlUHJp
dmF0ZSo+KGRhdGFiYXNlLnJlbGVhc2VSZWYoKSkpCiB7Cg==
</data>
<flag name="review"
          id="30926"
          type_id="1"
          status="+"
          setter="jorlow"
    />
    <flag name="commit-queue"
          id="30927"
          type_id="3"
          status="-"
          setter="dumi"
    />
          </attachment>
      

    </bug>

</bugzilla>