<?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>25711</bug_id>
          
          <creation_ts>2009-05-11 17:54:38 -0700</creation_ts>
          <short_desc>HTML5 Database becomes locked if a transaction is in progress when the page is refreshed.</short_desc>
          <delta_ts>2009-07-07 07:33:46 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>HasReduction, InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andrew Grieve">agrieve</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>andreip</cc>
    
    <cc>beidson</cc>
    
    <cc>benm</cc>
    
    <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>jmalonzo</cc>
    
    <cc>jorlow</cc>
    
    <cc>koivisto</cc>
    
    <cc>michaeln</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>120755</commentid>
    <comment_count>0</comment_count>
    <who name="Andrew Grieve">agrieve</who>
    <bug_when>2009-05-11 17:54:38 -0700</bug_when>
    <thetext>Happens with both read and write transactions. See attached test harness for reproducing the bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>120756</commentid>
    <comment_count>1</comment_count>
      <attachid>30212</attachid>
    <who name="Andrew Grieve">agrieve</who>
    <bug_when>2009-05-11 17:55:34 -0700</bug_when>
    <thetext>Created attachment 30212
Test harness for reproducing the bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121488</commentid>
    <comment_count>2</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-15 04:47:13 -0700</bug_when>
    <thetext>I have a fix for this bug here: https://bugs.webkit.org/show_bug.cgi?id=25788</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121959</commentid>
    <comment_count>3</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-05-19 13:11:23 -0700</bug_when>
    <thetext>&lt;rdar://problem/6860537&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121972</commentid>
    <comment_count>4</comment_count>
      <attachid>30483</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-19 14:24:09 -0700</bug_when>
    <thetext>Created attachment 30483
Proposed fix and layout test

Copied this fix across from duplicate bug 25788. I will close the duplicate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121974</commentid>
    <comment_count>5</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-19 14:24:50 -0700</bug_when>
    <thetext>*** Bug 25788 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121975</commentid>
    <comment_count>6</comment_count>
      <attachid>30483</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-19 14:26:21 -0700</bug_when>
    <thetext>Comment on attachment 30483
Proposed fix and layout test

Seems like the sleep should be shared/abstracted in WTF.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122648</commentid>
    <comment_count>7</comment_count>
      <attachid>30483</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-22 06:59:56 -0700</bug_when>
    <thetext>Comment on attachment 30483
Proposed fix and layout test

Mostly style violations:
http://webkit.org/coding/coding-style.html

 622 int Database::busyHandler(void* p, int n) {
bad argument names, { goes on a new line

no { } needed:
4     while (n--) {
 625         millis += 1.2*millis;
 626     }
although we&apos;ve been inconsistend w/ whiles.

Also spacing between 1.2 and millis (Which should be a full name, like milliseconds)

We use constants instead of defines where possible:
 55 #define MAX_SQLITE_BUSY_WAIT_TIME 30000

Variable names:
 122     static int busyHandler(void* p, int n);

Tabs in the layout tests.

Otherwise this looks fine in general, but really you shoudl have Bradee look at it for content once style is fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122672</commentid>
    <comment_count>8</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-22 08:31:28 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Seems like the sleep should be shared/abstracted in WTF.

Agreed, that sounds like a good idea. I was actually looking in WTF for a sleep function which is how I found the code in TCSpinLock :) Shall I add a new file pair (say Sleep.h|cpp) or is there a better place in  WTF for them to go already?

(In reply to comment #7)
&gt; (From update of attachment 30483 [review])
&gt; Mostly style violations:
&gt; http://webkit.org/coding/coding-style.html
&gt; 

Thanks for the style points Eric, I will fix them up and check out the style guide.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122682</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-22 09:27:39 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; Agreed, that sounds like a good idea. I was actually looking in WTF for a sleep
&gt; function which is how I found the code in TCSpinLock :) Shall I add a new file
&gt; pair (say Sleep.h|cpp) or is there a better place in  WTF for them to go
&gt; already?

I think they could go with the threading functions since they&apos;re used together.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123148</commentid>
    <comment_count>10</comment_count>
      <attachid>30672</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-26 10:57:57 -0700</bug_when>
    <thetext>Created attachment 30672
Corrects style and moves the sleep into WTF.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123439</commentid>
    <comment_count>11</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-05-28 11:22:14 -0700</bug_when>
    <thetext>&gt; +    m_sqliteDatabase.setBusyHandler(&amp;Database::busyHandler);
...
&gt; +int Database::busyHandler(void* context, int consecutiveInvocations)
&gt; +{
&gt; +    UNUSED_PARAM(context);
&gt; +
&gt; +    int milliseconds = 100;
&gt; +    while (consecutiveInvocations--)
&gt; +        milliseconds += 1.2F * milliseconds;
&gt; +	WTF::sleepMilliseconds(milliseconds);
&gt; +    return milliseconds &gt;= MAX_SQLITE_BUSY_WAIT_TIME ? 0 : 1;
&gt; +}


Do you actually need a custom busyHandler? The default busy handler in sqlite has reasonable backoff logic built in (see sqliteDefaultBusyCallback). So I wonder if you can accomplish the same thing with less code in webcore... just database.setBusyTimeout(30seconds).

Also, about the backoff logic in your handler... I think its not going to do what you want.

It looks like it will not return 0 until the handler sleeps at least 30 seconds in one go. The total time prior to a sqlite function failing with a SQLITE_BUSY error is going to be considerably longer than 30 seconds since sqlite will be calling it repeatedly until its either no longer busy or the handler returns 0;

Also, theres extra whitespace in front of WTF::sleepMilliseconds</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123448</commentid>
    <comment_count>12</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-28 12:57:46 -0700</bug_when>
    <thetext>Hi Michael,

&gt; 
&gt; Do you actually need a custom busyHandler? The default busy handler in sqlite
&gt; has reasonable backoff logic built in (see sqliteDefaultBusyCallback). So I
&gt; wonder if you can accomplish the same thing with less code in webcore... just
&gt; database.setBusyTimeout(30seconds).

Ah, I see. I wasn&apos;t aware of sqliteDefaultBusyCallback and that that was how the setBusyTimeout function was implemented. It seems to work fine, so I&apos;ll send a new patch to use it instead.

Thanks for the tip!
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123456</commentid>
    <comment_count>13</comment_count>
      <attachid>30747</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-28 13:46:05 -0700</bug_when>
    <thetext>Created attachment 30747
New patch and layout test

Uses the default busy timeout rather than a custom busy handler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123458</commentid>
    <comment_count>14</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-05-28 14:00:44 -0700</bug_when>
    <thetext>Less is more ;)

&gt; file: Database.cpp
&gt; #include &lt;wtf/Threading.h&gt;

You may not need this addition anymore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123472</commentid>
    <comment_count>15</comment_count>
      <attachid>30751</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-05-28 14:40:27 -0700</bug_when>
    <thetext>Created attachment 30751
New patch.

Thanks Michael :)

Also fixed a typo in the Changelog entry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124132</commentid>
    <comment_count>16</comment_count>
      <attachid>30902</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-03 05:17:10 -0700</bug_when>
    <thetext>Created attachment 30902
Makes the layout test pass on Windows.

Stops calling an unnecessary (and unimplemented on windows) layoutTestController method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124748</commentid>
    <comment_count>17</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-08 04:26:35 -0700</bug_when>
    <thetext>Ping...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125035</commentid>
    <comment_count>18</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-06-09 16:36:26 -0700</bug_when>
    <thetext>I don&apos;t have review rights... but fwiw...

File: WebCore/storage/SQLTransaction.cpp

nit: A comment in handleTransactionError could read differently
// No error callback, so fast-forward to:
// No error callback or the database is stopping, so fast-forward to:
Actually, you may want to remove the comment since it just says in english what the branching logic is clearly doing... doesn&apos;t add value really.

If inCallback &amp;&amp; m_database-&gt;stopped(), can you bump into the same problem with scheduling the next cleanupAfterTransactionErrorCallback step? If that combo can&apos;t happen, maybe add an ASSERT. Or if that combo can happen, maybe just if (stopped) {cleanupAfter(); return;} at the top of the method.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125149</commentid>
    <comment_count>19</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-10 10:06:08 -0700</bug_when>
    <thetext>(In reply to comment #18)

Thanks again for the comments Michael.

&gt; If inCallback &amp;&amp; m_database-&gt;stopped(), can you bump into the same problem with
&gt; scheduling the next cleanupAfterTransactionErrorCallback step? If that combo
&gt; can&apos;t happen, maybe add an ASSERT. Or if that combo can happen, maybe just if
&gt; (stopped) {cleanupAfter(); return;} at the top of the method.

Good catch! This got me thinking and I believe that we need to protect each point that cleanup steps may be executed from the database having been stopped. The main thread could stop the database at any time, therefore it&apos;s imperative that after a statement is executed we ensure that the commit or rollback steps can be completed synchronously if the database has been stopped. I&apos;ve checked that each path of execution after m_currentStatement-&gt;execute in SQLTransaction::runCurrentStatement can do this and I think it&apos;s now OK.

Sending a new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125152</commentid>
    <comment_count>20</comment_count>
      <attachid>31133</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-10 10:07:46 -0700</bug_when>
    <thetext>Created attachment 31133
New patch.

See comment above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125363</commentid>
    <comment_count>21</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-06-11 12:57:26 -0700</bug_when>
    <thetext>I think you may have some race conditions?

Database::stop() can get called at any time while the db thread is working. So in the following...

 506         if (m_database-&gt;stopped()) {
 507             LOG(StorageAPI, &quot;Database stopped, executing cleanupAfterTransactionErrorCallback for transaction %p\n&quot;, this);
 508             cleanupAfterTransactionErrorCallback();
 509         } else {
 510             m_nextStep = &amp;SQLTransaction::cleanupAfterTransactionErrorCallback;
 511             LOG(StorageAPI, &quot;Scheduling cleanupAfterTransactionErrorCallback for transaction %p\n&quot;, this);
 512             m_database-&gt;scheduleTransactionStep(this);
 513         }

... stopped() can return false on line 506, but by the time we get to line 512 it would return true


Maybe instead scheduleTransactionStep() could return a boolean value indicating if the step was scheduled or not due to stop having been called. And should interlock with the stop() method. If false is returned, the db thread would run the cleanup code.

void Database::scheduleTransactionStep(SQLTransaction* transaction)
{
    MutexLocker locker(m_stopMutex);
    if (stopped())
      return false;
    if (m_document-&gt;databaseThread()) {
        RefPtr&lt;DatabaseTransactionTask&gt; task = DatabaseTransactionTask::create(transaction);
        LOG(StorageAPI, &quot;Scheduling DatabaseTransactionTask %p for the transaction step\n&quot;, task.get());
        m_document-&gt;databaseThread()-&gt;scheduleTask(task.release());
    }
    return true;
}

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126262</commentid>
    <comment_count>22</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-16 12:36:04 -0700</bug_when>
    <thetext>Thanks again for the comments Michael. You&apos;re right, that would be a race condition. It&apos;s been a while since I looked at the root of this bug/patch so I decided to go back and try a different approach... I think the new solution is much cleaner. The SQLite documentation mentions that if you call sqlite3_close on a database with an open transaction, that transaction is automatically rolled back. The call to close needs to come from the database thread so that we can be sure a statement isn&apos;t executing when the call is made. So, my new approach is to maintain a list in the DatabaseThread class of the databases that we have worked on in that thread. Before that thread terminates, I iterate that list and invoke close on each database. So if a transaction had scheduled cleanup steps on the thread asynchronously it doesn&apos;t matter as the transaction will  be rolled back and the database unlocked.

New patch to follow, any comments appreciated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126263</commentid>
    <comment_count>23</comment_count>
      <attachid>31364</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-16 12:40:52 -0700</bug_when>
    <thetext>Created attachment 31364
New patch.

New patch as above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126276</commentid>
    <comment_count>24</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-06-16 13:40:02 -0700</bug_when>
    <thetext>A more systemic approach... nice!

In general I like it. &quot;If the thread is shutting down, be sure to close any handles the thread has ever worked with.&quot; More systemically addresses the cause of the bug you&apos;re bumping into.

I think this approach is valid since tasks for a given Database are always handled on the same DatabaseThread (looks like theres a db thread per document). If that were ever to change, this approach may not be valid. Not sure what the Database &apos;owners&apos; have in mind for future developments.

Have you considered removing the the handle from the collection when a DatabaseCloseTask executes on the thread? The expected case is that none in the collection should need to be closed. May be nice of that corresponded with an empty collection. A method on Database could be useful for determining when the Database needs to be added/removed from the set... bool Database.isOpen(). After task execution, if isOpen() add it, otherwise remove it.

I think you can use HashSet&lt;RefPtr&lt;Database&gt; &gt; to avoid the manual addref/removeref calls. And after iterating and calling close on them, clear the collection to drop the refs.


</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126435</commentid>
    <comment_count>25</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-17 04:24:51 -0700</bug_when>
    <thetext>(In reply to comment #24)

Thanks again Michael. :)

&gt; I think this approach is valid since tasks for a given Database are always
&gt; handled on the same DatabaseThread (looks like theres a db thread per
&gt; document).

That&apos;s right.

&gt; If that were ever to change, this approach may not be valid. Not
&gt; sure what the Database &apos;owners&apos; have in mind for future developments.

Any webkit reviewers care to comment?

&gt; Have you considered removing the the handle from the collection when a
&gt; DatabaseCloseTask executes on the thread? The expected case is that none in the
&gt; collection should need to be closed. May be nice of that corresponded with an
&gt; empty collection. A method on Database could be useful for determining when the
&gt; Database needs to be added/removed from the set... bool Database.isOpen().
&gt; After task execution, if isOpen() add it, otherwise remove it.

Done.

&gt; I think you can use HashSet&lt;RefPtr&lt;Database&gt; &gt; to avoid the manual
&gt; addref/removeref calls. And after iterating and calling close on them, clear
&gt; the collection to drop the refs.

Done.

New patch on the way! :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126437</commentid>
    <comment_count>26</comment_count>
      <attachid>31408</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-17 04:32:17 -0700</bug_when>
    <thetext>Created attachment 31408
New patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127659</commentid>
    <comment_count>27</comment_count>
      <attachid>31408</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2009-06-23 12:45:03 -0700</bug_when>
    <thetext>Comment on attachment 31408
New patch.

It seems unfortunate that we have to add another database tracking mechanism. There is already the DatabaseTracker and per Document set of databases. The Document set seems to hold similar documents as the new per-db-thread set. 

&gt; +        Database* database = task-&gt;database();
&gt; +        if (database-&gt;opened()) 
&gt; +            recordDatabaseOpen(database);
&gt; +        else
&gt; +            recordDatabaseClosed(database);
&gt; +

This seems unoptimal. The task loop is not really the right place. Could you remove this code, protect the m_databases set with a mutex and record the databases directly from Database ctor/dtor? Then this

&gt; +    DatabaseSet::iterator end = m_databases.end();
&gt; +    for (DatabaseSet::iterator it = m_databases.begin(); it != end; ++it)
&gt; +        (*it)-&gt;close();

could just check for closed() state before invoking close() (or it could be done in close() itself)

Minor nits:

&gt;      void close();
&gt; +    bool opened() const { return m_open; }

Names should match. Rename m_open to m_opened.

&gt; +    // If we sleep for more the 30 seconds while blocked on SQLITE_BUSY, give up.
&gt; +    static const int MAX_SQLITE_BUSY_WAIT_TIME = 30000;

WebKit style is to use camel case for constants too. This does not seem to need to be in header, top of the .cpp would be better.

r- for now, I think at least the recordDatabaseOpen/recordDatabaseClosed in task loop should be cleaned up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128484</commentid>
    <comment_count>28</comment_count>
      <attachid>31934</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-26 08:40:16 -0700</bug_when>
    <thetext>Created attachment 31934
New patch based on Antti&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128498</commentid>
    <comment_count>29</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-06-26 10:18:15 -0700</bug_when>
    <thetext>Is the Mutex really needed? Can it be replaced with ASSERT(isDatabaseThread())? I think the db should always be opened/close on the db thread, that looks like the intent of things, why not assert it.

The code right now looks like it depends on being able to reenter the mutex since the loop at thread end locks it and the db.close method will also grab the lock. Is WTF::Mutex reentrant on all platforms?


</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129127</commentid>
    <comment_count>30</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-06-30 12:01:59 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; Is the Mutex really needed? Can it be replaced with ASSERT(isDatabaseThread())?
&gt; I think the db should always be opened/close on the db thread, that looks like
&gt; the intent of things, why not assert it.
&gt; 
&gt; The code right now looks like it depends on being able to reenter the mutex
&gt; since the loop at thread end locks it and the db.close method will also grab
&gt; the lock. Is WTF::Mutex reentrant on all platforms?
&gt; 

Thanks for the review Michael. It seems that the platform mutexes are not guaranteed to be recursive so this strategy isn&apos;t going to work. After some discussion I&apos;ve decided to move the code for tracking the databases currently opened on a particular thread into the DatabaseTracker (which seems an appropriate place :)). The tracker now has a hash map of thread -&gt; DatabaseSet and whenever a database is added/removed from the tracker I update this set too. I added a new function on the tracker that iterates this map for a given database thread and executes the close. I call that function just before the database thread exits.

Patch is on the way!


</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129177</commentid>
    <comment_count>31</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-06-30 14:38:38 -0700</bug_when>
    <thetext>Hmmmm... I liked how the collection was a private detail of DatabaseThread. The &quot;don&apos;t forget to close what you opened&quot; behavior was well encapsulated in that class, no other agency was involved. Its been gradually moving away from that with greater fine grained dependencies of other database classes just a ptr deref away from each other, first more into the Database class, and now into the DatabaseTracker class.

The reason I mention this is that we have plans to &quot;split&quot; the DatabaseTracker class for use in chrome&apos;s multi-process, sandboxed world. This function (maintaining a collection of what database is opened on what thread and then acting on that at thread end) would be one more hair to split along those lines.

Removing the test after execution of each DatabaseTask was an improvement. The only real issue with that improvement was the Mutex usage (a smaller issue was copying the collection on exit). I think open/close is always be called on the database thread directly. If thats true, please consider simply removing the Mutex.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129300</commentid>
    <comment_count>32</comment_count>
      <attachid>32125</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-07-01 08:46:21 -0700</bug_when>
    <thetext>Created attachment 32125
New patch. (please do not land this version)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129304</commentid>
    <comment_count>33</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-07-01 08:57:28 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; Hmmmm... I liked how the collection was a private detail of DatabaseThread. The
&gt; &quot;don&apos;t forget to close what you opened&quot; behavior was well encapsulated in that
&gt; class, no other agency was involved. Its been gradually moving away from that
&gt; with greater fine grained dependencies of other database classes just a ptr
&gt; deref away from each other, first more into the Database class, and now into
&gt; the DatabaseTracker class.
&gt; 
&gt; The reason I mention this is that we have plans to &quot;split&quot; the DatabaseTracker
&gt; class for use in chrome&apos;s multi-process, sandboxed world. This function
&gt; (maintaining a collection of what database is opened on what thread and then
&gt; acting on that at thread end) would be one more hair to split along those
&gt; lines.
&gt; 
&gt; Removing the test after execution of each DatabaseTask was an improvement. The
&gt; only real issue with that improvement was the Mutex usage (a smaller issue was
&gt; copying the collection on exit). I think open/close is always be called on the
&gt; database thread directly. If thats true, please consider simply removing the
&gt; Mutex.
&gt; 

OK, if leaving it in the DatabaseThread makes the coming restructuring for Chrome easier, I&apos;m fine with that. I&apos;m not sure there&apos;s a better way to iterate the set other than taking a copy as we call close on each value in the set, which then removes it from the set and hence modifies what we&apos;re iterating over. I guess we could instead construct a vector of databases to close and then loop over it to actually call close... does rather seem like six of one and half a dozen of the other though :). I&apos;ve removed the mutex and replaced it with a couple of asserts.

Cheers, Ben</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129512</commentid>
    <comment_count>34</comment_count>
      <attachid>32125</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2009-07-02 09:21:42 -0700</bug_when>
    <thetext>Comment on attachment 32125
New patch. (please do not land this version)

Is it really always true that recordDatabaseOpen/recordDatabaseClose can&apos;t get called in the database thread? If so then obviously you won&apos;t need mutexes, but please make sure.

&gt; +    // Close the databases that we ran transactions on. This ensures that if any transactions are still open, they are rolled back and we don&apos;t leave the database in an
&gt; +    // inconsistent or locked state.
&gt; +    if (m_openDatabaseSet.size() &gt; 0) {
&gt; +        // As the call to close will modify the original set, we must take a copy to iterate over.
&gt; +        DatabaseSet openSetCopy = m_openDatabaseSet;
&gt; +        DatabaseSet::iterator end = openSetCopy.end();
&gt; +        for (DatabaseSet::iterator it = openSetCopy.begin(); it != end; ++it)
&gt; +           (*it)-&gt;close();

You should use HashSet::swap() instead of making a copy before iterating.

r=me with swap()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129542</commentid>
    <comment_count>35</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-07-02 12:01:15 -0700</bug_when>
    <thetext>Hi Antti!

Thanks for the review, glad that we&apos;re very almost done!

&gt; Is it really always true that recordDatabaseOpen/recordDatabaseClose can&apos;t get
&gt; called in the database thread? If so then obviously you won&apos;t need mutexes, but
&gt; please make sure.

Yes, at the moment the only times recoredDatabaseOpen/Close are called are in DatabaseOpen/Close tasks that run on the database thread, or in the code I added to close the databases before the thread terminates (naturally on the database thread).

&gt; &gt; +    // Close the databases that we ran transactions on. This ensures that if any transactions are still open, they are rolled back and we don&apos;t leave the database in an
&gt; &gt; +    // inconsistent or locked state.
&gt; &gt; +    if (m_openDatabaseSet.size() &gt; 0) {
&gt; &gt; +        // As the call to close will modify the original set, we must take a copy to iterate over.
&gt; &gt; +        DatabaseSet openSetCopy = m_openDatabaseSet;
&gt; &gt; +        DatabaseSet::iterator end = openSetCopy.end();
&gt; &gt; +        for (DatabaseSet::iterator it = openSetCopy.begin(); it != end; ++it)
&gt; &gt; +           (*it)-&gt;close();
&gt; 
&gt; You should use HashSet::swap() instead of making a copy before iterating.

OK, but if I do that then in the case where a database is closed by this code, the ASSERT(m_openDatabaseSet.contains(database)) in recordDatabaseClosed() called by Database::close() will fail as we will have swapped the set with an empty set. What is preferable? Keep as is and do the copy and ASSERT in recordDatabaseClosed (I don&apos;t think this is often going to be a very large copy) or use swap instead of copy and remove the assert? In my opinion keeping the assert is nicer. What do you think?

Thanks, Ben
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129592</commentid>
    <comment_count>36</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2009-07-02 15:04:12 -0700</bug_when>
    <thetext>(In reply to comment #35)
&gt; Hi Antti!
&gt; 
&gt; Thanks for the review, glad that we&apos;re very almost done!
&gt; 
&gt; &gt; Is it really always true that recordDatabaseOpen/recordDatabaseClose can&apos;t get
&gt; &gt; called in the database thread? If so then obviously you won&apos;t need mutexes, but
&gt; &gt; please make sure.
&gt; 
&gt; Yes, at the moment the only times recoredDatabaseOpen/Close are called are in
&gt; DatabaseOpen/Close tasks that run on the database thread, or in the code I
&gt; added to close the databases before the thread terminates (naturally on the
&gt; database thread).
&gt; 
&gt; &gt; &gt; +    // Close the databases that we ran transactions on. This ensures that if any transactions are still open, they are rolled back and we don&apos;t leave the database in an
&gt; &gt; &gt; +    // inconsistent or locked state.
&gt; &gt; &gt; +    if (m_openDatabaseSet.size() &gt; 0) {
&gt; &gt; &gt; +        // As the call to close will modify the original set, we must take a copy to iterate over.
&gt; &gt; &gt; +        DatabaseSet openSetCopy = m_openDatabaseSet;
&gt; &gt; &gt; +        DatabaseSet::iterator end = openSetCopy.end();
&gt; &gt; &gt; +        for (DatabaseSet::iterator it = openSetCopy.begin(); it != end; ++it)
&gt; &gt; &gt; +           (*it)-&gt;close();
&gt; &gt; 
&gt; &gt; You should use HashSet::swap() instead of making a copy before iterating.
&gt; 
&gt; OK, but if I do that then in the case where a database is closed by this code,
&gt; the ASSERT(m_openDatabaseSet.contains(database)) in recordDatabaseClosed()
&gt; called by Database::close() will fail as we will have swapped the set with an
&gt; empty set. What is preferable? Keep as is and do the copy and ASSERT in
&gt; recordDatabaseClosed (I don&apos;t think this is often going to be a very large
&gt; copy) or use swap instead of copy and remove the assert? In my opinion keeping
&gt; the assert is nicer. What do you think?

I think you could just change the assert: ASSERT(m_queue.killed() || m_openDatabaseSet.contains(database)).

Asserts as they are won&apos;t catch anything interesting during termination (you obviously are removing only databases that are in the set since you are iterating the set). 


&gt; Thanks, Ben
&gt; </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129639</commentid>
    <comment_count>37</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-02 17:49:17 -0700</bug_when>
    <thetext>I&apos;ll leave this to someone else to land since there are modifications left for the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>129702</commentid>
    <comment_count>38</comment_count>
      <attachid>32235</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-07-03 04:16:45 -0700</bug_when>
    <thetext>Created attachment 32235
Patch addressing Antti&apos;s final comments. (please submit this version of the patch)

Implements swap instead of a copy and changes the assert as per Antti&apos;s comments. As it&apos;s a small change to an r+&apos;d patch I&apos;m not marking the old patch obsolete so that this remains in the queue of bugs with patches ready to submit, hope that is OK.

Cheers, Ben</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>130204</commentid>
    <comment_count>39</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-07-07 07:33:46 -0700</bug_when>
    <thetext>(In reply to comment #38)
&gt; Created an attachment (id=32235) [details]
&gt; Patch addressing Antti&apos;s final comments. (please submit this version of the
&gt; patch)
&gt; 
&gt; Implements swap instead of a copy and changes the assert as per Antti&apos;s
&gt; comments. As it&apos;s a small change to an r+&apos;d patch I&apos;m not marking the old patch
&gt; obsolete so that this remains in the queue of bugs with patches ready to
&gt; submit, hope that is OK.
&gt; 
&gt; Cheers, Ben

Landed in r45594. I fixed two style issues with the braces below before landing. 

&gt; +void DatabaseThread::recordDatabaseOpen(Database* database) {
&gt; +    ASSERT(currentThread() == m_threadID);
&gt; +    ASSERT(database);
&gt; +    ASSERT(!m_openDatabaseSet.contains(database));
&gt; +    m_openDatabaseSet.add(database);
&gt; +}
&gt; +
&gt; +void DatabaseThread::recordDatabaseClosed(Database* database) {
&gt; +    ASSERT(currentThread() == m_threadID);
&gt; +    ASSERT(database);
&gt; +    ASSERT(m_queue.killed() || m_openDatabaseSet.contains(database));
&gt; +    m_openDatabaseSet.remove(database);
&gt; +}
&gt; +
&gt;  void DatabaseThread::scheduleTask(PassRefPtr&lt;DatabaseTask&gt; task)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>30212</attachid>
            <date>2009-05-11 17:55:34 -0700</date>
            <delta_ts>2009-05-11 17:55:34 -0700</delta_ts>
            <desc>Test harness for reproducing the bug.</desc>
            <filename>html5dbbug2.html</filename>
            <type>text/html</type>
            <size>3075</size>
            <attacher name="Andrew Grieve">agrieve</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgo8dGl0bGU+SFRNTCA1IERhdGFiYXNlIEJ1ZyAyPC90aXRsZT4KPC9oZWFk
Pgo8Ym9keT4KPGgxPkhUTUwgNSBEYXRhYmFzZSBCdWcgMjwvaDE+CjxwcmU+ClRoZSBCdWc6IElm
IHRoZSBwYWdlIGlzIHJlZnJlc2hlZCB3aGlsZSBhIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNz
LAp0aGVuIHRoZSBkYXRhYmFzZSBnZXRzIGxvY2tlZCB1bnRpbCB0aGUgYnJvd3NlciBpcyByZXN0
YXJ0ZWQuIFRoaXMgYnVnCmFwcGVhcnMgaW4gR21haWwncyBuZXcgaVBob25lIHdlYiBpbnRlcmZh
Y2UuCgpIb3cgdG8gcmVwcm9kdWNlIHVzaW5nIFdyaXRlcyAoYnVnICMxKToKMS4gVXNlIHRoZSBi
ZWxvdyBidXR0b25zIHRvIGVuc3VyZSBkYiByZWFkcyAmIHdyaXRlcyBhcmUgd29ya2luZy4KMi4g
Q2xpY2sgdGhlICJEbyBXcml0ZSBUeCBhbmQgUmVmcmVzaCIgYnV0dG9uLgozLiBSZXBlYXQgc3Rl
cCBvbmUgYWdhaW4gYW5kIG5vdGljZSB0aGUgd3JpdGUgdHJhbnNhY3Rpb25zIGFyZSBmYWlsaW5n
LgoKQ2xvc2UgdGhlIGJyb3dzZXIgYW5kIG9wZW4gaXQgYWdhaW4gdG8gcGVyZm9ybSB0aGlzIG5l
eHQgdGVzdC4KCkhvdyB0byByZXByb2R1Y2UgdXNpbmcgUmVhZHMgKGJ1ZyAjMik6CjEuIFVzZSB0
aGUgYmVsb3cgYnV0dG9ucyB0byBlbnN1cmUgZGIgcmVhZHMgJiB3cml0ZXMgYXJlIHdvcmtpbmcu
CjIuIENsaWNrIHRoZSAiRG8gUmVhZCBUeCBhbmQgUmVmcmVzaCIgYnV0dG9uLgozLiBOb3RpY2Ug
dGhhdCB5b3UgY2FuIGRvIGFzIG1hbnkgcmVhZHMgYXMgeW91IHdhbnQsIGJ1dCBkbyBhIHNpbmds
ZSB3cml0ZSBhbmQgaXQgbG9ja3MgdXAuCjQuIFJlcGVhdCBzdGVwIG9uZSBhZ2FpbiBhbmQgbm90
aWNlIHRoZSB3cml0ZSB0cmFuc2FjdGlvbnMgYXJlIGZhaWxpbmcuCgo8L3ByZT4KCjxidXR0b24g
b25jbGljaz0idGVzdFdyaXRlcygpIj5UZXN0IGRiIHdyaXRlczwvYnV0dG9uPgo8YnV0dG9uIG9u
Y2xpY2s9InRlc3RSZWFkcygpIj5UZXN0IGRiIHJlYWRzPC9idXR0b24+CjxidXR0b24gb25jbGlj
az0iZG9Xcml0ZUJ1ZygpIj5EbyBXcml0ZSBUeCBhbmQgUmVmcmVzaCAoYnVnICMxKTwvYnV0dG9u
Pgo8YnV0dG9uIG9uY2xpY2s9ImRvUmVhZEJ1ZygpIj5EbyBSZWFkIFR4IGFuZCBSZWZyZXNoIChi
dWcgIzIpPC9idXR0b24+CjxkaXYgaWQ9Im1zZ3MiPjwvZGl2Pgo8c2NyaXB0PgoKdmFyIGRiID0g
d2luZG93Lm9wZW5EYXRhYmFzZSgnZGJidWcyJywgJycsICdkYmJ1ZzInLCAxMDI0MDApOwoKZGIu
dHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsKICAgIHR4LmV4ZWN1dGVTcWwoJ0NSRUFURSBUQUJM
RSBJRiBOT1QgRVhJU1RTIGhlYWx0aCAoa2V5IFZBUkNIQVIoMTYpIFBSSU1BUlkgS0VZKTsnKTsK
fSk7CgpmdW5jdGlvbiBsb2cobXNnKSB7CiAgdmFyIG1zZ0RpdiA9IGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKCdtc2dzJyk7CiAgdmFyIG5ld01zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rp
dicpOwogIG5ld01zZy5pbm5lclRleHQgPSBtc2c7CiAgbXNnRGl2LmFwcGVuZENoaWxkKG5ld01z
Zyk7Cn0KCmZ1bmN0aW9uIGRvUmVhZEJ1ZygpIHsKICB2YXIgc3RhcnRNcyA9ICtuZXcgRGF0ZTsK
ICBmdW5jdGlvbiBuZXh0UmVhZCh0eCkgewogICAgaWYgKCtuZXcgRGF0ZSAtIHN0YXJ0TXMgPCAz
MDApIHsKICAgICAgdHguZXhlY3V0ZVNxbCgnU0VMRUNUICogZnJvbSBoZWFsdGgnLCBudWxsLCBu
ZXh0UmVhZCk7CiAgICB9CiAgfQogIGRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7CiAgICBs
b2coJ0VudGVyZWQgVHJhbnNhY3Rpb24nKTsKICAgIG5leHRSZWFkKHR4KTsKICAgIGxvY2F0aW9u
LnJlbG9hZCgpOwogIH0sIGVycm9ySGFuZGxlciwgZnVuY3Rpb24oKSB7CiAgICBsb2coJ3RyYW5z
YWN0aW9uIGNvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGRvV3JpdGVCdWcoKSB7CiAgdmFy
IHN0YXJ0TXMgPSArbmV3IERhdGU7CiAgZnVuY3Rpb24gbmV4dFVwZGF0ZSh0eCkgewogICAgaWYg
KCtuZXcgRGF0ZSAtIHN0YXJ0TXMgPCAzMDApIHsKICAgICAgdHguZXhlY3V0ZVNxbCgnSU5TRVJU
IElOVE8gaGVhbHRoIFZBTFVFUyg/KTsnLCBbJycgKyAoK25ldyBEYXRlKV0sIG5leHRVcGRhdGUp
OwogICAgfQogIH0KICBkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgewogICAgbG9nKCdFbnRl
cmVkIFRyYW5zYWN0aW9uJyk7CiAgICBuZXh0VXBkYXRlKHR4KTsKICAgIGxvY2F0aW9uLnJlbG9h
ZCgpOwogIH0sIGVycm9ySGFuZGxlciwgZnVuY3Rpb24oKSB7CiAgICBsb2coJ3RyYW5zYWN0aW9u
IGNvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvcikgewogIGxv
ZygnREIgdHJhbnNhY3Rpb24gZXJyb3IsIGNvZGU6ICcgKyBlcnJvci5jb2RlICsgJywgbXNnOiAn
ICsgZXJyb3IubWVzc2FnZSk7Cn0KCmZ1bmN0aW9uIHRlc3RSZWFkcygpIHsKICBsb2coJ1RyeWlu
ZyB0byByZWFkIHRpbWVzdGFtcC4nKTsKICBkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgewog
ICAgdHguZXhlY3V0ZVNxbCgnU0VMRUNUICogZnJvbSBoZWFsdGgnLCBudWxsLCBmdW5jdGlvbih0
eCwgcmVzdWx0KSB7CiAgICAgIGxvZygnUmV0cmlldmVkIHZhbHVlOiAnICsgcmVzdWx0LnJvd3Mu
aXRlbSgwKS5rZXkpOwogICAgfSk7CiAgfSwgZXJyb3JIYW5kbGVyLCBmdW5jdGlvbigpIHsKICAg
IGxvZygndHJhbnNhY3Rpb24gY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gdGVzdFdyaXRl
cygpIHsKICBsb2coJ1RyeWluZyB0byB3cml0ZSB0aW1lc3RhbXAuJyk7CiAgdmFyIHZhbHVlID0g
JycgKyAoK25ldyBEYXRlKTsKICBkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgewogICAgdHgu
ZXhlY3V0ZVNxbCgnREVMRVRFIEZST00gaGVhbHRoJyk7ICAgIAogICAgdHguZXhlY3V0ZVNxbCgn
SU5TRVJUIElOVE8gaGVhbHRoIFZBTFVFUyg/KTsnLCBbdmFsdWVdKTsKICB9LCBlcnJvckhhbmRs
ZXIsIGZ1bmN0aW9uKCkgewogICAgbG9nKCd0cmFuc2FjdGlvbiBjb21wbGV0ZS4gV3JvdGUgdGlt
ZXN0YW1wOiAnICsgdmFsdWUpOwogIH0pOwp9Cgo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30483</attachid>
            <date>2009-05-19 14:24:09 -0700</date>
            <delta_ts>2009-05-26 10:57:57 -0700</delta_ts>
            <desc>Proposed fix and layout test</desc>
            <filename>25711.txt</filename>
            <type>text/plain</type>
            <size>11723</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQzNzA3KQ0KKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
DQpAQCAtMSwzICsxLDIxIEBADQorMjAwOS0wNS0xNCAgQmVuIE11cmRvY2ggIDxiZW5tQGdvb2ds
ZS5jb20+DQorDQorICAgICAgICBJZiBhIGRhdGFiYXNlIHRyYW5zYWN0aW9uIGlzIGludGVycnVw
dGVkIGJ5IGEgbmF2aWdhdGlvbiBhY3Rpb24sIHRoZSBsb2NrIG9uIHRoYXQgZGF0YWJhc2UgaXMg
bmV2ZXIgcmVsaW5xdWlzaGVkIGFuZCBzdWJzZXF1ZW50IGFjY2Vzc2VzIHRvIHRoYXQgZGF0YWJh
c2UgZmFpbC4NCisgICAgICAgIA0KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI1Nzg4DQorICAgICAgICANCisgICAgICAgIFRlc3Q6IHN0b3JhZ2UvZGF0
YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbA0KKw0KKyAgICAgICAgKiBzdG9yYWdlL0RhdGFi
YXNlLmNwcDoNCisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6cGVyZm9ybU9wZW5BbmRWZXJp
ZnkpOg0KKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpidXN5SGFuZGxlcik6DQorICAgICAg
ICAqIHN0b3JhZ2UvRGF0YWJhc2UuaDoNCisgICAgICAgICogc3RvcmFnZS9TUUxUcmFuc2FjdGlv
bi5jcHA6DQorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246Om9wZW5UcmFuc2FjdGlv
bkFuZFByZWZsaWdodCk6DQorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OnJ1bkN1
cnJlbnRTdGF0ZW1lbnQpOg0KKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpoYW5k
bGVDdXJyZW50U3RhdGVtZW50RXJyb3IpOg0KKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0
aW9uOjpoYW5kbGVUcmFuc2FjdGlvbkVycm9yKToNCisNCiAyMDA5LTA1LTE0ICBZdXJ5IFNlbWlr
aGF0c2t5IDx5dXJ5c0BjaHJvbWl1bS5vcmc+DQogDQogICAgICAgICBSZXZpZXdlZCBieSBEaW1p
dHJpIEdsYXprb3YuDQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcA0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQ0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHAJKHJldmlzaW9uIDQzNzAyKQ0K
KysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkNCkBAIC01MSw2
ICs1MSw5IEBADQogI2luY2x1ZGUgIlNRTGl0ZVN0YXRlbWVudC5oIg0KICNpbmNsdWRlICJTUUxS
ZXN1bHRTZXQuaCINCiAjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4NCisjaWYgIVBMQVRGT1JN
KFdJTl9PUykNCisjaW5jbHVkZSA8dGltZS5oPiAvLyBmb3IgbmFub3NsZWVwIGluIERhdGFiYXNl
OjpidXN5SGFuZGxlcg0KKyNlbmRpZg0KICNlbmRpZg0KIA0KICNpZiBVU0UoSlNDKQ0KQEAgLTQy
OCw2ICs0MzEsNyBAQCBib29sIERhdGFiYXNlOjpwZXJmb3JtT3BlbkFuZFZlcmlmeShFeGNlDQog
DQogICAgIEFTU0VSVChtX2RhdGFiYXNlQXV0aG9yaXplcik7DQogICAgIG1fc3FsaXRlRGF0YWJh
c2Uuc2V0QXV0aG9yaXplcihtX2RhdGFiYXNlQXV0aG9yaXplcik7DQorICAgIG1fc3FsaXRlRGF0
YWJhc2Uuc2V0QnVzeUhhbmRsZXIoJkRhdGFiYXNlOjpidXN5SGFuZGxlcik7DQogDQogICAgIGlm
ICghbV9zcWxpdGVEYXRhYmFzZS50YWJsZUV4aXN0cyhkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSkp
IHsNCiAgICAgICAgIGlmICghbV9zcWxpdGVEYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRF
IFRBQkxFICIgKyBkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSArICIgKGtleSBURVhUIE5PVCBOVUxM
IE9OIENPTkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsdmFsdWUgVEVYVCBO
T1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKTsiKSkgew0KQEAgLTYxNSw2ICs2MTksMjQgQEAgU3Ry
aW5nIERhdGFiYXNlOjpzdHJpbmdJZGVudGlmaWVyKCkgY29ucw0KICAgICByZXR1cm4gbV9uYW1l
LmNvcHkoKTsNCiB9DQogDQoraW50IERhdGFiYXNlOjpidXN5SGFuZGxlcih2b2lkKiBwLCBpbnQg
bikgew0KKyAgICBpbnQgbWlsbGlzID0gMTAwOw0KKyAgICB3aGlsZSAobi0tKSB7DQorICAgICAg
ICBtaWxsaXMgKz0gMS4yKm1pbGxpczsNCisgICAgfQ0KKw0KKyAgICAvLyBDb2RlIGZvciBzbGVl
cGluZyBpcyB0YWtlbiBmcm9tIHd0Zi9UQ1NwaW5Mb2NrLmgNCisjaWYgUExBVEZPUk0oV0lOX09T
KQ0KKyAgICBTbGVlcChtaWxsaXMpOw0KKyNlbHNlDQorICAgIHN0cnVjdCB0aW1lc3BlYyB0bTsN
CisgICAgdG0udHZfc2VjID0gbWlsbGlzIC8gMTAwMDsNCisgICAgdG0udHZfbnNlYyA9IChtaWxs
aXMgJSAxMDAwKSAqIDEwMDAwMDA7DQorICAgIG5hbm9zbGVlcCgmdG0sIE5VTEwpOw0KKyNlbmRp
Zg0KKyAgICByZXR1cm4gbWlsbGlzID49IE1BWF9TUUxJVEVfQlVTWV9XQUlUX1RJTUUgPyAwIDog
MTsNCit9DQorDQogI2VuZGlmDQogDQogfQ0KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZS5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHJldmlzaW9u
IDQzNzAyKQ0KKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpDQpA
QCAtNTAsNiArNTAsMTAgQEANCiAjZW5kaWYNCiANCiAjaWYgRU5BQkxFKERBVEFCQVNFKQ0KKw0K
Ky8vIElmIHdlIHNsZWVwIGZvciBtb3JlIHRoZSAzMCBzZWNvbmRzIHdoaWxlIGJsb2NrZWQgb24g
U1FMSVRFX0JVU1ksIGdpdmUgdXAuDQorI2RlZmluZSBNQVhfU1FMSVRFX0JVU1lfV0FJVF9USU1F
IDMwMDAwDQorDQogbmFtZXNwYWNlIFdlYkNvcmUgew0KIA0KIGNsYXNzIERhdGFiYXNlQXV0aG9y
aXplcjsNCkBAIC0xMTUsNiArMTE5LDggQEAgcHVibGljOg0KIA0KICAgICBWZWN0b3I8U3RyaW5n
PiBwZXJmb3JtR2V0VGFibGVOYW1lcygpOw0KIA0KKyAgICBzdGF0aWMgaW50IGJ1c3lIYW5kbGVy
KHZvaWQqIHAsIGludCBuKTsNCisNCiBwcml2YXRlOg0KICAgICBEYXRhYmFzZShEb2N1bWVudCog
ZG9jdW1lbnQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBleHBlY3RlZFZlcnNp
b24pOw0KIA0KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHANCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0NCi0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCShyZXZpc2lvbiA0
MzcwMikNCisrKyBXZWJDb3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCSh3b3JraW5nIGNv
cHkpDQpAQCAtMjIwLDcgKzIyMCw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246Om9wZW5UcmFuc2Fj
dGlvbkFuZFANCiAgICAgbV9kYXRhYmFzZS0+bV9kYXRhYmFzZUF1dGhvcml6ZXItPmVuYWJsZSgp
OyAgICANCiAgICAgDQogICAgIC8vIFRyYW5zYWN0aW9uIFN0ZXBzIDErMiAtIE9wZW4gYSB0cmFu
c2FjdGlvbiB0byB0aGUgZGF0YWJhc2UsIGp1bXBpbmcgdG8gdGhlIGVycm9yIGNhbGxiYWNrIGlm
IHRoYXQgZmFpbHMNCi0gICAgaWYgKCFtX3NxbGl0ZVRyYW5zYWN0aW9uLT5pblByb2dyZXNzKCkp
IHsNCisgICAgaWYgKCFtX3NxbGl0ZVRyYW5zYWN0aW9uLT5pblByb2dyZXNzKCkgJiYgIW1fZGF0
YWJhc2UtPnN0b3BwZWQoKSkgew0KICAgICAgICAgQVNTRVJUKCFtX2RhdGFiYXNlLT5tX3NxbGl0
ZURhdGFiYXNlLnRyYW5zYWN0aW9uSW5Qcm9ncmVzcygpKTsNCiAgICAgICAgIG1fc3FsaXRlVHJh
bnNhY3Rpb24uY2xlYXIoKTsNCiAgICAgICAgIG1fdHJhbnNhY3Rpb25FcnJvciA9IFNRTEVycm9y
OjpjcmVhdGUoMCwgInVuYWJsZSB0byBvcGVuIGEgdHJhbnNhY3Rpb24gdG8gdGhlIGRhdGFiYXNl
Iik7DQpAQCAtMzIzLDYgKzMyMywxNCBAQCBib29sIFNRTFRyYW5zYWN0aW9uOjpydW5DdXJyZW50
U3RhdGVtZW50DQogICAgIG1fZGF0YWJhc2UtPm1fZGF0YWJhc2VBdXRob3JpemVyLT5yZXNldCgp
Ow0KICAgICANCiAgICAgaWYgKG1fY3VycmVudFN0YXRlbWVudC0+ZXhlY3V0ZShtX2RhdGFiYXNl
LmdldCgpKSkgew0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGFiYXNlIGhhcyBiZWVuIHN0
b3BwZWQuIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBhd2F5IGZyb20g
dGhlIHBhZ2UuDQorICAgICAgICAvLyBSdW4gdGhlIGVycm9yIHN0ZXBzIHN5bmNocm9ub3VzbHkg
dG8gZW5zdXJlIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiB0aWRpZXMgaXRzZWxmIHVwLiBJZiB0aGUg
ZGF0YWJhc2UgdGhyZWFkDQorICAgICAgICAvLyBoYXMgYmVlbiBhc2tlZCB0byBkaWUsIHRoZW4g
d2Ugd2lsbCBiZSB1bmFibGUgdG8gc2NoZWR1bGUgYXN5bmNocm9ub3VzIGNsZWFuIHVwIHN0ZXBz
Lg0KKyAgICAgICAgaWYobV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7DQorICAgICAgICAgICAgaGFu
ZGxlQ3VycmVudFN0YXRlbWVudEVycm9yKCk7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0K
KyAgICAgICAgfQ0KKw0KICAgICAgICAgaWYgKG1fZGF0YWJhc2UtPm1fZGF0YWJhc2VBdXRob3Jp
emVyLT5sYXN0QWN0aW9uQ2hhbmdlZERhdGFiYXNlKCkpIHsNCiAgICAgICAgICAgICAvLyBGbGFn
IHRoaXMgdHJhbnNhY3Rpb24gYXMgaGF2aW5nIGNoYW5nZWQgdGhlIGRhdGFiYXNlIGZvciBsYXRl
ciBkZWxlZ2F0ZSBub3RpZmljYXRpb24NCiAgICAgICAgICAgICBtX21vZGlmaWVkRGF0YWJhc2Ug
PSB0cnVlOw0KQEAgLTM1Nyw4ICszNjUsOCBAQCBib29sIFNRTFRyYW5zYWN0aW9uOjpydW5DdXJy
ZW50U3RhdGVtZW50DQogdm9pZCBTUUxUcmFuc2FjdGlvbjo6aGFuZGxlQ3VycmVudFN0YXRlbWVu
dEVycm9yKCkNCiB7DQogICAgIC8vIFRyYW5zYWN0aW9uIFN0ZXBzIDYuZXJyb3IgLSBDYWxsIHRo
ZSBzdGF0ZW1lbnQncyBlcnJvciBjYWxsYmFjaywgYnV0IGlmIHRoZXJlIHdhcyBubyBlcnJvciBj
YWxsYmFjaywNCi0gICAgLy8ganVtcCB0byB0aGUgdHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJhY2sN
Ci0gICAgaWYgKG1fY3VycmVudFN0YXRlbWVudC0+aGFzU3RhdGVtZW50RXJyb3JDYWxsYmFjaygp
KSB7DQorICAgIC8vIG9yIHRoZSBkYXRhYmFzZSBoYXMgYmVlbiBzdG9wcGVkIGp1bXAgdG8gdGhl
IHRyYW5zYWN0aW9uIGVycm9yIGNhbGxiYWNrDQorICAgIGlmIChtX2N1cnJlbnRTdGF0ZW1lbnQt
Pmhhc1N0YXRlbWVudEVycm9yQ2FsbGJhY2soKSAmJiAhbV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7
DQogICAgICAgICBtX25leHRTdGVwID0gJlNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyU3RhdGVtZW50
Q2FsbGJhY2s7DQogICAgICAgICBMT0coU3RvcmFnZUFQSSwgIlNjaGVkdWxpbmcgZGVsaXZlclN0
YXRlbWVudENhbGxiYWNrIGZvciB0cmFuc2FjdGlvbiAlcFxuIiwgdGhpcyk7DQogICAgICAgICBt
X2RhdGFiYXNlLT5zY2hlZHVsZVRyYW5zYWN0aW9uQ2FsbGJhY2sodGhpcyk7DQpAQCAtNDgwLDcg
KzQ4OCw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclN1Y2Nlc3MNCiANCiB2
b2lkIFNRTFRyYW5zYWN0aW9uOjpoYW5kbGVUcmFuc2FjdGlvbkVycm9yKGJvb2wgaW5DYWxsYmFj
aykNCiB7DQotICAgIGlmIChtX2Vycm9yQ2FsbGJhY2spIHsNCisgICAgaWYgKG1fZXJyb3JDYWxs
YmFjayAmJiAhbV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7DQogICAgICAgICBpZiAoaW5DYWxsYmFj
aykNCiAgICAgICAgICAgICBkZWxpdmVyVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKCk7DQogICAg
ICAgICBlbHNlIHsNCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cNCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t
LSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDQzNzA3KQ0KKysrIExheW91dFRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQ0KQEAgLTEsMyArMSwxMyBAQA0KKzIwMDktMDUtMTQg
IEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29tPg0KKw0KKyAgICAgICAgSWYgYSBkYXRhYmFz
ZSB0cmFuc2FjdGlvbiBpcyBpbnRlcnJ1cHRlZCBieSBhIG5hdmlnYXRpb24gYWN0aW9uLCB0aGUg
bG9jayBvbiB0aGF0IGRhdGFiYXNlIGlzIG5ldmVyIHJlbGlucXVpc2hlZCBhbmQgc3Vic2VxdWVu
dCBhY2Nlc3NlcyB0byB0aGF0IGRhdGFiYXNlIGZhaWwuDQorICAgICAgICANCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTc4OA0KKw0KKyAgICAgICAg
KiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dDogQWRkZWQu
DQorICAgICAgICAqIHN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbDogQWRk
ZWQuDQorICAgICAgICAqIHN0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVs
b2FkLTIuaHRtbDogQWRkZWQuDQorDQogMjAwOS0wNS0xNCAgQWRhbSBSb2JlbiAgPGFyb2JlbkBh
cHBsZS5jb20+DQogDQogICAgICAgICBBZGQgYSB0aW1pbmctb3V0IHRlc3QgdG8gdGhlIFdpbmRv
d3MgU2tpcHBlZCBmaWxlDQpJbmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBMYXlvdXRUZXN0cy9z
dG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dAkocmV2aXNpb24g
MCkNCisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkNCkBAIC0wLDAgKzEsMyBAQA0KK0luc2VydGluZyBzb21l
IGRhdGENCitUZXN0IHBhcnQgMiBDb21wbGV0ZQ0KKw0KDQpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBM
YXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4
dA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fXw0KQWRkZWQ6IGVvbC1zdHlsZQ0KICAgKyBuYXRpdmUNCg0KSW5kZXg6IExh
eW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbA0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQ0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQu
aHRtbAkocmV2aXNpb24gMCkNCisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2st
YWZ0ZXItcmVsb2FkLmh0bWwJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDczIEBADQorPGh0bWw+
DQorPGhlYWQ+DQorPHNjcmlwdD4NCit2YXIgZGF0YWJhc2U7DQordmFyIHRpbWVvdXQ7DQorDQor
ZnVuY3Rpb24gbG9nKG1lc3NhZ2UpDQorew0KKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi
Y29uc29sZSIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4iOw0KK30NCisNCitmdW5jdGlv
biBmaW5pc2hUZXN0KCkNCit7DQorICAgIGxvZygiVGVzdCBwYXJ0IDEgQ29tcGxldGUiKTsNCisg
ICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikNCisgICAgICAgIGxheW91dFRlc3RD
b250cm9sbGVyLm5vdGlmeURvbmUoKTsNCit9DQorDQorZnVuY3Rpb24gZXJyb3JGdW5jdGlvbih0
eCwgZXJyb3IpDQorew0KKwljbGVhclRpbWVvdXQodGltZW91dCk7DQorICAgIGxvZygiVGVzdCBm
YWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7DQorICAgIGZpbmlzaFRlc3QoKTsNCit9DQorDQor
ZnVuY3Rpb24gYWRkRGF0YShkYikNCit7DQorICAgIGRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4
KSB7IA0KKyAgICAgICAgbG9nKCJJbnNlcnRpbmcgc29tZSBkYXRhIik7DQorICAgICAgICAvLyBJ
bnNlcnQgYSBsYXJnZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdpbGwgdGFrZSBhIGxpdHRsZSB3aGls
ZSB0byBydW4uIFNjaGVkdWxlIGEgdGltb3V0IHRvIHJ1biB0aGF0IHdpbGwgbG9hZCBhIG5ldyBw
YWdlDQorICAgICAgICAvLyB3aGlsc3QgdGhlIHRyYW5zYWN0aW9uIGlzIHN0aWxsIGluIHByb2dy
ZXNzLCBpbnRlcnJ1cHRpbmcgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHNob3VsZCBub3QgbGVhdmUg
dGhlIGRhdGFiYXNlIGxvY2tlZCBhbmQgb24NCisgICAgICAgIC8vIHRoZSBuZXh0IHBhZ2Ugd2Ug
c2hvdWxkIGJlIGFibGUgdG8gaW5zZXJ0IHNvbWUgbW9yZSBkYXRhLg0KKyAgICAgICAgdGltZW91
dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGxvY2F0aW9uLmhyZWYgPSAiLi9yZXNvdXJjZXMv
ZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sIjsgfSwxMCk7DQorICAgICAgICB0eC5l
eGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAocmFuZG9t
QmxvYig1MTIwMDAwKSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0
aW9uKTsNCisgICAgfSwgZXJyb3JGdW5jdGlvbiwgZnVuY3Rpb24oKSB7IA0KKyAgICAgICAgZmlu
aXNoVGVzdCgpOw0KKyAgICB9KTsNCit9DQorDQorZnVuY3Rpb24gcnVuVGVzdCgpDQorew0KKyAg
ICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7DQorICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci5jbGVhckFsbERhdGFiYXNlcygpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIuc2V0RGF0YWJhc2VRdW90YSg1MTMwMDAwKTsNCisgICAgICAgIGxheW91dFRlc3RDb250
cm9sbGVyLmR1bXBEYXRhYmFzZUNhbGxiYWNrcygpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIuZHVtcEFzVGV4dCgpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVu
dGlsRG9uZSgpOw0KKyAgICB9DQorICAgIA0KKyAgICB0cnkgew0KKyAgICAgICAgZGF0YWJhc2Ug
PSBvcGVuRGF0YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3QiLCAiMS4wIiwgIlRlc3QgZm9yIGRhdGFi
YXNlIGxvY2tpbmciLCA1MTMwMDAwKTsNCisgICAgfSBjYXRjaCAoZSkgew0KKwkgICAgbG9nKCJF
cnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7DQorCSAgICBmaW5pc2hUZXN0KCk7DQor
ICAgIH0NCisgICAgDQorICAgIGRhdGFiYXNlLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7DQor
ICAgICAgICBsb2coIkFkZGluZyBhIHRhYmxlIik7DQorICAgICAgICB0eC5leGVjdXRlU3FsKCJD
UkVBVEUgVEFCTEUgRGF0YVRlc3QgKHRlc3REYXRhKSIsIFtdLCBmdW5jdGlvbih0eCwgcmVzdWx0
KSB7IH0sIGVycm9yRnVuY3Rpb24pOyANCisgICAgfSwgZXJyb3JGdW5jdGlvbiwgZnVuY3Rpb24o
KSB7IA0KKyAgICAgICAgYWRkRGF0YShkYXRhYmFzZSk7IA0KKyAgICB9KTsNCit9DQorDQorPC9z
Y3JpcHQ+DQorPC9oZWFkPg0KKw0KKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4NCis8cHJlIGlk
PSJjb25zb2xlIj4NCis8L3ByZT4NCis8L2JvZHk+DQorDQorPC9odG1sPg0KDQpQcm9wZXJ0eSBj
aGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2Fk
Lmh0bWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18NCkFkZGVkOiBlb2wtc3R5bGUNCiAgICsgbmF0aXZlDQoNCkluZGV4
OiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9h
ZC0yLmh0bWwNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0NCi0tLSBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9k
YXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwJKHJldmlzaW9uIDApDQorKysgTGF5b3V0
VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1s
CShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw2MCBAQA0KKzxodG1sPg0KKzxoZWFkPg0KKzxzY3Jp
cHQ+DQordmFyIGRhdGFiYXNlOw0KKw0KK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQ0KK3sNCisgICAg
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSAr
ICI8YnI+IjsNCit9DQorDQorZnVuY3Rpb24gZmluaXNoVGVzdCgpDQorew0KKyAgICBsb2coIlRl
c3QgcGFydCAyIENvbXBsZXRlIik7DQorICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xs
ZXIpDQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7DQorfQ0KKw0K
K2Z1bmN0aW9uIGVycm9yRnVuY3Rpb24odHgsIGVycm9yKQ0KK3sNCisgICAgbG9nKCJUZXN0IGZh
aWxlZCAtICIgKyBlcnJvci5tZXNzYWdlKTsNCisgICAgZmluaXNoVGVzdCgpOw0KK30NCisNCitm
dW5jdGlvbiBhZGREYXRhKGRiKQ0KK3sNCisgICAgZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgp
IHsgDQorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRhdGEiKTsNCisNCisgICAgICAgIHR4
LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIERhdGFUZXN0ICh0ZXN0RGF0YSkgVkFMVUVTICg/KSIs
IFsiQSJdLCBmdW5jdGlvbih0eCwgcmVzdWx0KSB7IH0sIGVycm9yRnVuY3Rpb24pOw0KKyAgICB9
LCBmdW5jdGlvbigpe30sIGZ1bmN0aW9uKCkgeyANCisgICAgICAgIGZpbmlzaFRlc3QoKTsNCisg
ICAgfSk7DQorfQ0KKw0KK2Z1bmN0aW9uIHJ1blRlc3QoKQ0KK3sNCisgICAgaWYgKHdpbmRvdy5s
YXlvdXRUZXN0Q29udHJvbGxlcikgew0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVt
cERhdGFiYXNlQ2FsbGJhY2tzKCk7DQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1w
QXNUZXh0KCk7DQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7
DQorICAgIH0NCisgICAgDQorICAgIHRyeSB7DQorICAgIAlkYXRhYmFzZSA9IG9wZW5EYXRhYmFz
ZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVzdCBmb3IgZGF0YWJhc2UgbG9ja2luZyIs
IDUxMzAwMDApOw0KKyAgICAgICAgYWRkRGF0YShkYXRhYmFzZSk7DQorICAgIH0gY2F0Y2goZSkg
ew0KKwkgICAgbG9nKCJFcnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7DQorCSAgICBm
aW5pc2hUZXN0KCk7DQorICAgIH0NCit9DQorDQorPC9zY3JpcHQ+DQorPC9oZWFkPg0KKw0KKzxi
b2R5IG9ubG9hZD0icnVuVGVzdCgpIj4NCis8cHJlIGlkPSJjb25zb2xlIj4NCis8L3ByZT4NCis8
L2JvZHk+DQorDQorPC9odG1sPg0KDQpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9z
dG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwNCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18NCkFkZGVkOiBlb2wtc3R5bGUNCiAgICsgbmF0aXZlDQo=
</data>
<flag name="review"
          id="15388"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30672</attachid>
            <date>2009-05-26 10:57:57 -0700</date>
            <delta_ts>2009-05-28 13:46:05 -0700</delta_ts>
            <desc>Corrects style and moves the sleep into WTF.</desc>
            <filename>25711-final.txt</filename>
            <type>text/plain</type>
            <size>15783</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ0MTUwKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTkgQEAKKzIwMDktMDUtMjYgIEJlbiBNdXJk
b2NoICA8YmVubUBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorICAgICAgICBJZiBhIGRhdGFiYXNlIHRyYW5zYWN0aW9uIGlzIGludGVycnVwdGVkIGJ5
IGEgbmF2aWdhdGlvbiBhY3Rpb24sIHRoZSBsb2NrIG9uIHRoYXQgZGF0YWJhc2UgaXMgbmV2ZXIg
cmVsaW5xdWlzaGVkIGFuZCBzdWJzZXF1ZW50IGFjY2Vzc2VzIHRvIHRoYXQgZGF0YWJhc2UgZmFp
bC4KKyAgICAgICAgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yNTc4OAorICAgICAgICAKKyAgICAgICAgVGVzdDogc3RvcmFnZS9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC5odG1sCisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS5leHA6CisgICAg
ICAgICogSmF2YVNjcmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
LmRlZjoKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2
YVNjcmlwdENvcmVfZGVidWcuZGVmOgorICAgICAgICAqIHd0Zi9UaHJlYWRpbmcuY3BwOgorICAg
ICAgICAoV1RGOjpzbGVlcE1pbGxpc2Vjb25kcyk6CisgICAgICAgICogd3RmL1RocmVhZGluZy5o
OgorCiAyMDA5LTA1LTI1ICBEYXZpZCBMZXZpbiAgPGxldmluQGNocm9taXVtLm9yZz4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBNYWNpZWogU3RhY2hvd2lhayBhbmQgT2xpdmVyIEh1bnQuCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZXhwCShyZXZpc2lvbiA0NDA1NSkKKysrIEphdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAkod29ya2luZyBjb3B5KQpAQCAtMjkyLDYgKzI5NCw3
IEBAIF9fWk4zV1RGMTVUaHJlYWRDb25kaXRpb25DMUV2CiBfX1pOM1dURjE1VGhyZWFkQ29uZGl0
aW9uRDFFdgogX19aTjNXVEYxNmNhbGxPbk1haW5UaHJlYWRFUEZ2UHZFUzBfCiBfX1pOM1dURjE2
ZmFzdFplcm9lZE1hbGxvY0VtCitfX1pOM1dURjE3c2xlZXBNaWxsaXNlY29uZHNFaQogX19aTjNX
VEYxOWluaXRpYWxpemVUaHJlYWRpbmdFdgogX19aTjNXVEYyMGZhc3RNYWxsb2NTdGF0aXN0aWNz
RXYKIF9fWk4zV1RGMjFSZWZDb3VudGVkTGVha0NvdW50ZXIxNnN1cHByZXNzTWVzc2FnZXNFUEtj
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUuZGVmCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5kZWYJKHJldmlz
aW9uIDQ0MDU1KQorKysgSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL0phdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmRlZgkod29ya2luZyBjb3B5KQpAQCAtMjA2LDYgKzIw
Niw3IEBAIEVYUE9SVFMKICAgICA/c2V0T3JkZXJMb3dlckZpcnN0QENvbGxhdG9yQFdURkBAUUFF
WF9OQFoKICAgICA/c2V0VXBTdGF0aWNGdW5jdGlvblNsb3RASlNDQEBZQVhQQVZFeGVjU3RhdGVA
MUBQQlZIYXNoRW50cnlAMUBQQVZKU09iamVjdEAxQEFCVklkZW50aWZpZXJAMUBBQVZQcm9wZXJ0
eVNsb3RAMUBAWgogICAgID9zaWduYWxAVGhyZWFkQ29uZGl0aW9uQFdURkBAUUFFWFhaCisgICAg
P3NsZWVwTWlsbGlzZWNvbmRzQFdURkBAWUFYSEBaCiAgICAgP3Nsb3dBcHBlbmRATWFya2VkQXJn
dW1lbnRCdWZmZXJASlNDQEBBQUVYVkpTVmFsdWVAMkBAWgogICAgID9zdGFydElnbm9yaW5nTGVh
a3NAU3RydWN0dXJlQEpTQ0BAU0FYWFoKICAgICA/c3RhcnRQcm9maWxpbmdAUHJvZmlsZXJASlND
QEBRQUVYUEFWRXhlY1N0YXRlQDJAQUJWVVN0cmluZ0AyQEBaCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmVfZGVi
dWcuZGVmCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJv
ai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZV9kZWJ1Zy5kZWYJKHJldmlzaW9uIDQ0MDU1
KQorKysgSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3Jl
L0phdmFTY3JpcHRDb3JlX2RlYnVnLmRlZgkod29ya2luZyBjb3B5KQpAQCAtMjA2LDYgKzIwNiw3
IEBAIEVYUE9SVFMKICAgICA/c2V0T3JkZXJMb3dlckZpcnN0QENvbGxhdG9yQFdURkBAUUFFWF9O
QFoKICAgICA/c2V0VXBTdGF0aWNGdW5jdGlvblNsb3RASlNDQEBZQVhQQVZFeGVjU3RhdGVAMUBQ
QlZIYXNoRW50cnlAMUBQQVZKU09iamVjdEAxQEFCVklkZW50aWZpZXJAMUBBQVZQcm9wZXJ0eVNs
b3RAMUBAWgogICAgID9zaWduYWxAVGhyZWFkQ29uZGl0aW9uQFdURkBAUUFFWFhaCisgICAgP3Ns
ZWVwTWlsbGlzZWNvbmRzQFdURkBAWUFYSEBaCiAgICAgP3Nsb3dBcHBlbmRATWFya2VkQXJndW1l
bnRCdWZmZXJASlNDQEBBQUVYVkpTVmFsdWVAMkBAWgogICAgID9zdGFydElnbm9yaW5nTGVha3NA
U3RydWN0dXJlQEpTQ0BAU0FYWFoKICAgICA/c3RhcnRQcm9maWxpbmdAUHJvZmlsZXJASlNDQEBR
QUVYUEFWRXhlY1N0YXRlQDJAQUJWVVN0cmluZ0AyQEBaCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93
dGYvVGhyZWFkaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvVGhyZWFk
aW5nLmNwcAkocmV2aXNpb24gNDQwNTUpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvVGhyZWFkaW5n
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsMTAgQEAKIAogI2luY2x1ZGUgPHN0cmlu
Zy5oPgogCisjaWYgIVBMQVRGT1JNKFdJTl9PUykgJiYgIVBMQVRGT1JNKFdJTl9DRSkKKyNpbmNs
dWRlIDx0aW1lLmg+CisjZW5kaWYKKwogbmFtZXNwYWNlIFdURiB7CiAKIHN0cnVjdCBOZXdUaHJl
YWRDb250ZXh0IHsKQEAgLTk0LDQgKzk4LDE2IEBAIFRocmVhZElkZW50aWZpZXIgY3JlYXRlVGhy
ZWFkKFRocmVhZEZ1bmMKIH0KICNlbmRpZgogCit2b2lkIHNsZWVwTWlsbGlzZWNvbmRzKGludCBt
aWxsaXNlY29uZHMpCit7CisjaWYgUExBVEZPUk0oV0lOX09TKSB8fCBQTEFURk9STShXSU5fQ0Up
CisgICAgU2xlZXAobWlsbGlzZWNvbmRzKTsKKyNlbHNlCisgICAgc3RydWN0IHRpbWVzcGVjIHRt
OworICAgIHRtLnR2X3NlYyA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7CisgICAgdG0udHZfbnNlYyA9
IChtaWxsaXNlY29uZHMgJSAxMDAwKSAqIDEwMDAwMDA7CisgICAgbmFub3NsZWVwKCZ0bSwgTlVM
TCk7CisjZW5kaWYKK30KKwogfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS93dGYvVGhyZWFkaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL1RocmVh
ZGluZy5oCShyZXZpc2lvbiA0NDA1NSkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9UaHJlYWRpbmcu
aAkod29ya2luZyBjb3B5KQpAQCAtMjkzLDYgKzI5Myw4IEBAIHZvaWQgaW5pdGlhbGl6ZVRocmVh
ZGluZygpOwogdm9pZCBsb2NrQXRvbWljYWxseUluaXRpYWxpemVkU3RhdGljTXV0ZXgoKTsKIHZv
aWQgdW5sb2NrQXRvbWljYWxseUluaXRpYWxpemVkU3RhdGljTXV0ZXgoKTsKIAordm9pZCBzbGVl
cE1pbGxpc2Vjb25kcyhpbnQgbWlsbGlzZWNvbmRzKTsKKwogfSAvLyBuYW1lc3BhY2UgV1RGCiAK
IHVzaW5nIFdURjo6TXV0ZXg7CkluZGV4OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNDQxNTApCisrKyBXZWJDb3JlL0NoYW5nZUxv
Zwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBACisyMDA5LTA1LTI2ICBCZW4gTXVyZG9j
aCAgPGJlbm1AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKyAgICAgICAgSWYgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBpcyBpbnRlcnJ1cHRlZCBieSBh
IG5hdmlnYXRpb24gYWN0aW9uLCB0aGUgbG9jayBvbiB0aGF0IGRhdGFiYXNlIGlzIG5ldmVyIHJl
bGlucXVpc2hlZCBhbmQgc3Vic2VxdWVudCBhY2Nlc3NlcyB0byB0aGF0IGRhdGFiYXNlIGZhaWwu
CisgICAgICAgIAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjU3ODgKKworICAgICAgICBUZXN0OiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVs
b2FkLmh0bWwKKworICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2UuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6RGF0YWJhc2U6OnBlcmZvcm1PcGVuQW5kVmVyaWZ5KToKKyAgICAgICAgKFdlYkNvcmU6
OkRhdGFiYXNlOjpidXN5SGFuZGxlcik6CisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZS5oOgor
ICAgICAgICAqIHN0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6
U1FMVHJhbnNhY3Rpb246Om9wZW5UcmFuc2FjdGlvbkFuZFByZWZsaWdodCk6CisgICAgICAgIChX
ZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6cnVuQ3VycmVudFN0YXRlbWVudCk6CisgICAgICAgIChX
ZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6aGFuZGxlQ3VycmVudFN0YXRlbWVudEVycm9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpoYW5kbGVUcmFuc2FjdGlvbkVycm9yKToK
KwogMjAwOS0wNS0yNiAgU3RlcGhlbiBXaGl0ZSAgPHNlbm9yYmxhbmNvQGNocm9taXVtLm9yZz4K
IAogICAgICAgICBSZXZpZXdlZCBieSBEaW1pdHJpIEdsYXprb3YuCkluZGV4OiBXZWJDb3JlL3N0
b3JhZ2UvRGF0YWJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZS5jcHAJKHJldmlzaW9uIDQ0MDU1KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgIlNRTGl0ZVN0YXRlbWVu
dC5oIgogI2luY2x1ZGUgIlNRTFJlc3VsdFNldC5oIgogI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFk
Lmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgogI2VuZGlmCiAKICNpZiBVU0UoSlNDKQpA
QCAtNDI4LDYgKzQyOSw3IEBAIGJvb2wgRGF0YWJhc2U6OnBlcmZvcm1PcGVuQW5kVmVyaWZ5KEV4
Y2UKIAogICAgIEFTU0VSVChtX2RhdGFiYXNlQXV0aG9yaXplcik7CiAgICAgbV9zcWxpdGVEYXRh
YmFzZS5zZXRBdXRob3JpemVyKG1fZGF0YWJhc2VBdXRob3JpemVyKTsKKyAgICBtX3NxbGl0ZURh
dGFiYXNlLnNldEJ1c3lIYW5kbGVyKCZEYXRhYmFzZTo6YnVzeUhhbmRsZXIpOwogCiAgICAgaWYg
KCFtX3NxbGl0ZURhdGFiYXNlLnRhYmxlRXhpc3RzKGRhdGFiYXNlSW5mb1RhYmxlTmFtZSgpKSkg
ewogICAgICAgICBpZiAoIW1fc3FsaXRlRGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBU
QUJMRSAiICsgZGF0YWJhc2VJbmZvVGFibGVOYW1lKCkgKyAiIChrZXkgVEVYVCBOT1QgTlVMTCBP
TiBDT05GTElDVCBGQUlMIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLHZhbHVlIFRFWFQgTk9U
IE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7IikpIHsKQEAgLTYxNSw2ICs2MTcsMTcgQEAgU3RyaW5n
IERhdGFiYXNlOjpzdHJpbmdJZGVudGlmaWVyKCkgY29ucwogICAgIHJldHVybiBtX25hbWUuY29w
eSgpOwogfQogCitpbnQgRGF0YWJhc2U6OmJ1c3lIYW5kbGVyKHZvaWQqIGNvbnRleHQsIGludCBj
b25zZWN1dGl2ZUludm9jYXRpb25zKQoreworICAgIFVOVVNFRF9QQVJBTShjb250ZXh0KTsKKwor
ICAgIGludCBtaWxsaXNlY29uZHMgPSAxMDA7CisgICAgd2hpbGUgKGNvbnNlY3V0aXZlSW52b2Nh
dGlvbnMtLSkKKyAgICAgICAgbWlsbGlzZWNvbmRzICs9IDEuMkYgKiBtaWxsaXNlY29uZHM7CisJ
V1RGOjpzbGVlcE1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMpOworICAgIHJldHVybiBtaWxsaXNl
Y29uZHMgPj0gTUFYX1NRTElURV9CVVNZX1dBSVRfVElNRSA/IDAgOiAxOworfQorCiAjZW5kaWYK
IAogfQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHJldmlzaW9uIDQ0MDU1KQorKysgV2ViQ29yZS9zdG9y
YWdlL0RhdGFiYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTExNSw2ICsxMTUsOCBAQCBwdWJsaWM6
CiAKICAgICBWZWN0b3I8U3RyaW5nPiBwZXJmb3JtR2V0VGFibGVOYW1lcygpOwogCisgICAgc3Rh
dGljIGludCBidXN5SGFuZGxlcih2b2lkKiBjb250ZXh0LCBpbnQgY29uc2VjdXRpdmVJbnZvY2F0
aW9ucyk7CisKIHByaXZhdGU6CiAgICAgRGF0YWJhc2UoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25z
dCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgZXhwZWN0ZWRWZXJzaW9uKTsKIApAQCAtMTQ0
LDYgKzE0Niw5IEBAIHByaXZhdGU6CiAgICAgU1FMaXRlRGF0YWJhc2UgbV9zcWxpdGVEYXRhYmFz
ZTsKICAgICBSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVyPiBtX2RhdGFiYXNlQXV0aG9yaXplcjsK
IAorICAgIC8vIElmIHdlIHNsZWVwIGZvciBtb3JlIHRoZSAzMCBzZWNvbmRzIHdoaWxlIGJsb2Nr
ZWQgb24gU1FMSVRFX0JVU1ksIGdpdmUgdXAuCisgICAgc3RhdGljIGNvbnN0IGludCBNQVhfU1FM
SVRFX0JVU1lfV0FJVF9USU1FID0gMzAwMDA7CisKICNpZm5kZWYgTkRFQlVHCiAgICAgU3RyaW5n
IGRhdGFiYXNlRGVidWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9zZWN1cml0eU9yaWdpbi0+dG9T
dHJpbmcoKSArICI6OiIgKyBtX25hbWU7IH0KICNlbmRpZgpJbmRleDogV2ViQ29yZS9zdG9yYWdl
L1NRTFRyYW5zYWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvU1FMVHJh
bnNhY3Rpb24uY3BwCShyZXZpc2lvbiA0NDA1NSkKKysrIFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFu
c2FjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyMCw3ICsyMjAsNyBAQCB2b2lkIFNRTFRy
YW5zYWN0aW9uOjpvcGVuVHJhbnNhY3Rpb25BbmRQCiAgICAgbV9kYXRhYmFzZS0+bV9kYXRhYmFz
ZUF1dGhvcml6ZXItPmVuYWJsZSgpOyAgICAKICAgICAKICAgICAvLyBUcmFuc2FjdGlvbiBTdGVw
cyAxKzIgLSBPcGVuIGEgdHJhbnNhY3Rpb24gdG8gdGhlIGRhdGFiYXNlLCBqdW1waW5nIHRvIHRo
ZSBlcnJvciBjYWxsYmFjayBpZiB0aGF0IGZhaWxzCi0gICAgaWYgKCFtX3NxbGl0ZVRyYW5zYWN0
aW9uLT5pblByb2dyZXNzKCkpIHsKKyAgICBpZiAoIW1fc3FsaXRlVHJhbnNhY3Rpb24tPmluUHJv
Z3Jlc3MoKSAmJiAhbV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7CiAgICAgICAgIEFTU0VSVCghbV9k
YXRhYmFzZS0+bV9zcWxpdGVEYXRhYmFzZS50cmFuc2FjdGlvbkluUHJvZ3Jlc3MoKSk7CiAgICAg
ICAgIG1fc3FsaXRlVHJhbnNhY3Rpb24uY2xlYXIoKTsKICAgICAgICAgbV90cmFuc2FjdGlvbkVy
cm9yID0gU1FMRXJyb3I6OmNyZWF0ZSgwLCAidW5hYmxlIHRvIG9wZW4gYSB0cmFuc2FjdGlvbiB0
byB0aGUgZGF0YWJhc2UiKTsKQEAgLTMyMyw2ICszMjMsMTQgQEAgYm9vbCBTUUxUcmFuc2FjdGlv
bjo6cnVuQ3VycmVudFN0YXRlbWVudAogICAgIG1fZGF0YWJhc2UtPm1fZGF0YWJhc2VBdXRob3Jp
emVyLT5yZXNldCgpOwogICAgIAogICAgIGlmIChtX2N1cnJlbnRTdGF0ZW1lbnQtPmV4ZWN1dGUo
bV9kYXRhYmFzZS5nZXQoKSkpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGFiYXNlIGhh
cyBiZWVuIHN0b3BwZWQuIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBh
d2F5IGZyb20gdGhlIHBhZ2UuCisgICAgICAgIC8vIFJ1biB0aGUgZXJyb3Igc3RlcHMgc3luY2hy
b25vdXNseSB0byBlbnN1cmUgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHRpZGllcyBpdHNlbGYgdXAu
IElmIHRoZSBkYXRhYmFzZSB0aHJlYWQKKyAgICAgICAgLy8gaGFzIGJlZW4gYXNrZWQgdG8gZGll
LCB0aGVuIHdlIHdpbGwgYmUgdW5hYmxlIHRvIHNjaGVkdWxlIGFzeW5jaHJvbm91cyBjbGVhbiB1
cCBzdGVwcy4KKyAgICAgICAgaWYobV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7CisgICAgICAgICAg
ICBoYW5kbGVDdXJyZW50U3RhdGVtZW50RXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtX2RhdGFiYXNlLT5tX2RhdGFiYXNlQXV0aG9y
aXplci0+bGFzdEFjdGlvbkNoYW5nZWREYXRhYmFzZSgpKSB7CiAgICAgICAgICAgICAvLyBGbGFn
IHRoaXMgdHJhbnNhY3Rpb24gYXMgaGF2aW5nIGNoYW5nZWQgdGhlIGRhdGFiYXNlIGZvciBsYXRl
ciBkZWxlZ2F0ZSBub3RpZmljYXRpb24KICAgICAgICAgICAgIG1fbW9kaWZpZWREYXRhYmFzZSA9
IHRydWU7CkBAIC0zNTcsOCArMzY1LDggQEAgYm9vbCBTUUxUcmFuc2FjdGlvbjo6cnVuQ3VycmVu
dFN0YXRlbWVudAogdm9pZCBTUUxUcmFuc2FjdGlvbjo6aGFuZGxlQ3VycmVudFN0YXRlbWVudEVy
cm9yKCkKIHsKICAgICAvLyBUcmFuc2FjdGlvbiBTdGVwcyA2LmVycm9yIC0gQ2FsbCB0aGUgc3Rh
dGVtZW50J3MgZXJyb3IgY2FsbGJhY2ssIGJ1dCBpZiB0aGVyZSB3YXMgbm8gZXJyb3IgY2FsbGJh
Y2ssCi0gICAgLy8ganVtcCB0byB0aGUgdHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJhY2sKLSAgICBp
ZiAobV9jdXJyZW50U3RhdGVtZW50LT5oYXNTdGF0ZW1lbnRFcnJvckNhbGxiYWNrKCkpIHsKKyAg
ICAvLyBvciB0aGUgZGF0YWJhc2UgaGFzIGJlZW4gc3RvcHBlZCBqdW1wIHRvIHRoZSB0cmFuc2Fj
dGlvbiBlcnJvciBjYWxsYmFjaworICAgIGlmIChtX2N1cnJlbnRTdGF0ZW1lbnQtPmhhc1N0YXRl
bWVudEVycm9yQ2FsbGJhY2soKSAmJiAhbV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7CiAgICAgICAg
IG1fbmV4dFN0ZXAgPSAmU1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJTdGF0ZW1lbnRDYWxsYmFjazsK
ICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJTY2hlZHVsaW5nIGRlbGl2ZXJTdGF0ZW1lbnRDYWxs
YmFjayBmb3IgdHJhbnNhY3Rpb24gJXBcbiIsIHRoaXMpOwogICAgICAgICBtX2RhdGFiYXNlLT5z
Y2hlZHVsZVRyYW5zYWN0aW9uQ2FsbGJhY2sodGhpcyk7CkBAIC00ODAsNyArNDg4LDcgQEAgdm9p
ZCBTUUxUcmFuc2FjdGlvbjo6Y2xlYW51cEFmdGVyU3VjY2VzcwogCiB2b2lkIFNRTFRyYW5zYWN0
aW9uOjpoYW5kbGVUcmFuc2FjdGlvbkVycm9yKGJvb2wgaW5DYWxsYmFjaykKIHsKLSAgICBpZiAo
bV9lcnJvckNhbGxiYWNrKSB7CisgICAgaWYgKG1fZXJyb3JDYWxsYmFjayAmJiAhbV9kYXRhYmFz
ZS0+c3RvcHBlZCgpKSB7CiAgICAgICAgIGlmIChpbkNhbGxiYWNrKQogICAgICAgICAgICAgZGVs
aXZlclRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjaygpOwogICAgICAgICBlbHNlIHsKSW5kZXg6IExh
eW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJ
KHJldmlzaW9uIDQ0MTUwKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsMTYgQEAKKzIwMDktMDUtMjYgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICBJZiBh
IGRhdGFiYXNlIHRyYW5zYWN0aW9uIGlzIGludGVycnVwdGVkIGJ5IGEgbmF2aWdhdGlvbiBhY3Rp
b24sIHRoZSBsb2NrIG9uIHRoYXQgZGF0YWJhc2UgaXMgbmV2ZXIgcmVsaW5xdWlzaGVkIGFuZCBz
dWJzZXF1ZW50IGFjY2Vzc2VzIHRvIHRoYXQgZGF0YWJhc2UgZmFpbC4KKyAgICAgICAgCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTc4OAorICAgICAg
ICAKKyAgICAgICAgVGVzdDogc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1s
CisKKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVk
LnR4dDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9h
ZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC0yLmh0bWw6IEFkZGVkLgorCiAyMDA5LTA1LTI1ICBBZGFtIEJhcnRoICA8
YWJhcnRoQHdlYmtpdC5vZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpJbmRl
eDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3Rl
ZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFm
dGVyLXJlbG9hZC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9zdG9y
YWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwzIEBACitJbnNlcnRpbmcgc29tZSBkYXRhCitUZXN0IHBhcnQgMiBDb21wbGV0
ZQorCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxv
Y2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dApfX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0
eWxlCiAgICsgbmF0aXZlCgpJbmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0
YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw3MyBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQ+Cit2YXIgZGF0YWJhc2U7Cit2
YXIgdGltZW91dDsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsKK30K
KworZnVuY3Rpb24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJUZXN0IHBhcnQgMSBDb21wbGV0
ZSIpOworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxheW91
dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24gZXJyb3JGdW5jdGlv
bih0eCwgZXJyb3IpCit7CisgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOworICAgIGxvZygiVGVz
dCBmYWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7CisgICAgZmluaXNoVGVzdCgpOworfQorCitm
dW5jdGlvbiBhZGREYXRhKGRiKQoreworICAgIGRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7
IAorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRhdGEiKTsKKyAgICAgICAgLy8gSW5zZXJ0
IGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgdGhhdCB3aWxsIHRha2UgYSBsaXR0bGUgd2hpbGUgdG8g
cnVuLiBTY2hlZHVsZSBhIHRpbW91dCB0byBydW4gdGhhdCB3aWxsIGxvYWQgYSBuZXcgcGFnZQor
ICAgICAgICAvLyB3aGlsc3QgdGhlIHRyYW5zYWN0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzLCBp
bnRlcnJ1cHRpbmcgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHNob3VsZCBub3QgbGVhdmUgdGhlIGRh
dGFiYXNlIGxvY2tlZCBhbmQgb24KKyAgICAgICAgLy8gdGhlIG5leHQgcGFnZSB3ZSBzaG91bGQg
YmUgYWJsZSB0byBpbnNlcnQgc29tZSBtb3JlIGRhdGEuCisgICAgICAgIHRpbWVvdXQgPSBzZXRU
aW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5ocmVmID0gIi4vcmVzb3VyY2VzL2RhdGFiYXNl
LWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbCI7IH0sMTApOworICAgICAgICB0eC5leGVjdXRlU3Fs
KCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAocmFuZG9tQmxvYig1MTIw
MDAwKSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0aW9uKTsKKyAg
ICB9LCBlcnJvckZ1bmN0aW9uLCBmdW5jdGlvbigpIHsgCisgICAgICAgIGZpbmlzaFRlc3QoKTsK
KyAgICB9KTsKK30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlv
dXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5jbGVhckFs
bERhdGFiYXNlcygpOworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5zZXREYXRhYmFzZVF1
b3RhKDUxMzAwMDApOworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wRGF0YWJhc2VD
YWxsYmFja3MoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOwor
ICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorICAg
IAorICAgIHRyeSB7CisgICAgICAgIGRhdGFiYXNlID0gb3BlbkRhdGFiYXNlKCJEYXRhYmFzZUxv
Y2tUZXN0IiwgIjEuMCIsICJUZXN0IGZvciBkYXRhYmFzZSBsb2NraW5nIiwgNTEzMDAwMCk7Cisg
ICAgfSBjYXRjaCAoZSkgeworICAgICAgICBsb2coIkVycm9yIC0gY291bGQgbm90IG9wZW4gZGF0
YWJhc2UiKTsKKyAgICAgICAgZmluaXNoVGVzdCgpOworICAgIH0KKyAgICAKKyAgICBkYXRhYmFz
ZS50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeworICAgICAgICBsb2coIkFkZGluZyBhIHRhYmxl
Iik7CisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBEYXRhVGVzdCAodGVzdERh
dGEpIiwgW10sIGZ1bmN0aW9uKHR4LCByZXN1bHQpIHsgfSwgZXJyb3JGdW5jdGlvbik7IAorICAg
IH0sIGVycm9yRnVuY3Rpb24sIGZ1bmN0aW9uKCkgeyAKKyAgICAgICAgYWRkRGF0YShkYXRhYmFz
ZSk7IAorICAgIH0pOworfQorCis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkgb25sb2FkPSJy
dW5UZXN0KCkiPgorPHByZSBpZD0iY29uc29sZSI+Cis8L3ByZT4KKzwvYm9keT4KKworPC9odG1s
PgoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC5odG1sCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBu
YXRpdmUKCkluZGV4OiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC0yLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9y
ZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCShyZXZpc2lvbiAwKQor
KysgTGF5b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxv
YWQtMi5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYwIEBACis8aHRtbD4KKzxoZWFkPgor
PHNjcmlwdD4KK3ZhciBkYXRhYmFzZTsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAg
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSAr
ICI8YnI+IjsKK30KKworZnVuY3Rpb24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJUZXN0IHBh
cnQgMiBDb21wbGV0ZSIpOworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisg
ICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24g
ZXJyb3JGdW5jdGlvbih0eCwgZXJyb3IpCit7CisgICAgbG9nKCJUZXN0IGZhaWxlZCAtICIgKyBl
cnJvci5tZXNzYWdlKTsKKyAgICBmaW5pc2hUZXN0KCk7Cit9CisKK2Z1bmN0aW9uIGFkZERhdGEo
ZGIpCit7CisgICAgZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsgCisgICAgICAgIGxvZygi
SW5zZXJ0aW5nIHNvbWUgZGF0YSIpOworCisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJ
TlRPIERhdGFUZXN0ICh0ZXN0RGF0YSkgVkFMVUVTICg/KSIsIFsiQSJdLCBmdW5jdGlvbih0eCwg
cmVzdWx0KSB7IH0sIGVycm9yRnVuY3Rpb24pOworICAgIH0sIGZ1bmN0aW9uKCl7fSwgZnVuY3Rp
b24oKSB7IAorICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgfSk7Cit9CisKK2Z1bmN0aW9uIHJ1
blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAg
ICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCk7CisgICAgICAg
IGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENv
bnRyb2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKyAgICAKKyAgICB0cnkgeworICAgICAg
ICBkYXRhYmFzZSA9IG9wZW5EYXRhYmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVz
dCBmb3IgZGF0YWJhc2UgbG9ja2luZyIsIDUxMzAwMDApOworICAgICAgICBhZGREYXRhKGRhdGFi
YXNlKTsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgbG9nKCJFcnJvciAtIGNvdWxkIG5vdCBv
cGVuIGRhdGFiYXNlIik7CisgICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9Cit9CisKKzwvc2Ny
aXB0PgorPC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+Cis8cHJlIGlkPSJjb25z
b2xlIj4KKzwvcHJlPgorPC9ib2R5PgorCis8L2h0bWw+CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBM
YXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0y
Lmh0bWwKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30747</attachid>
            <date>2009-05-28 13:46:05 -0700</date>
            <delta_ts>2009-05-28 14:40:27 -0700</delta_ts>
            <desc>New patch and layout test</desc>
            <filename>25711-patch.txt</filename>
            <type>text/plain</type>
            <size>11167</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQ0MTUwKQ0KKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
DQpAQCAtMSwzICsxLDIyIEBADQorMjAwOS0wNS0yNiAgQmVuIE11cmRvY2ggIDxiZW5tQGdvb2ds
ZS5jb20+DQorDQorICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4NCisgICAgICAg
IElmIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gaXMgaW50ZXJydXB0ZWQgYnkgYSBuYXZpZ2F0aW9u
IGFjdGlvbiwgdGhlIGxvY2sgb24gdGhhdCBkYXRhYmFzZSBpcyBuZXZlciByZWxpbnF1aXNoZWQg
YW5kIHN1YnNlcXVlbnQgYWNjZXNzZXMgdG8gdGhhdCBkYXRhYmFzZSBmYWlsLg0KKyAgICAgICAg
DQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU3ODgN
CisNCisgICAgICAgIFRlc3Q6IHN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRt
bA0KKw0KKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmNwcDoNCisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZTo6cGVyZm9ybU9wZW5BbmRWZXJpZnkpOg0KKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlOjpidXN5SGFuZGxlcik6DQorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2UuaDoNCisg
ICAgICAgICogc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHA6DQorICAgICAgICAoV2ViQ29yZTo6
U1FMVHJhbnNhY3Rpb246Om9wZW5UcmFuc2FjdGlvbkFuZFByZWZsaWdodCk6DQorICAgICAgICAo
V2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OnJ1bkN1cnJlbnRTdGF0ZW1lbnQpOg0KKyAgICAgICAg
KFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpoYW5kbGVDdXJyZW50U3RhdGVtZW50RXJyb3IpOg0K
KyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpoYW5kbGVUcmFuc2FjdGlvbkVycm9y
KToNCisNCiAyMDA5LTA1LTI2ICBTdGVwaGVuIFdoaXRlICA8c2Vub3JibGFuY29AY2hyb21pdW0u
b3JnPg0KIA0KICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292Lg0KSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL3N0b3Jh
Z2UvRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA0NDA1NSkNCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0
YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtNTEsNiArNTEsNyBAQA0KICNpbmNsdWRlICJT
UUxpdGVTdGF0ZW1lbnQuaCINCiAjaW5jbHVkZSAiU1FMUmVzdWx0U2V0LmgiDQogI2luY2x1ZGUg
PHd0Zi9NYWluVGhyZWFkLmg+DQorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4NCiAjZW5kaWYN
CiANCiAjaWYgVVNFKEpTQykNCkBAIC00MjgsNiArNDI5LDcgQEAgYm9vbCBEYXRhYmFzZTo6cGVy
Zm9ybU9wZW5BbmRWZXJpZnkoRXhjZQ0KIA0KICAgICBBU1NFUlQobV9kYXRhYmFzZUF1dGhvcml6
ZXIpOw0KICAgICBtX3NxbGl0ZURhdGFiYXNlLnNldEF1dGhvcml6ZXIobV9kYXRhYmFzZUF1dGhv
cml6ZXIpOw0KKyAgICBtX3NxbGl0ZURhdGFiYXNlLnNldEJ1c3lUaW1lb3V0KE1BWF9TUUxJVEVf
QlVTWV9XQUlUX1RJTUUpOw0KIA0KICAgICBpZiAoIW1fc3FsaXRlRGF0YWJhc2UudGFibGVFeGlz
dHMoZGF0YWJhc2VJbmZvVGFibGVOYW1lKCkpKSB7DQogICAgICAgICBpZiAoIW1fc3FsaXRlRGF0
YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBUQUJMRSAiICsgZGF0YWJhc2VJbmZvVGFibGVO
YW1lKCkgKyAiIChrZXkgVEVYVCBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMIFVOSVFVRSBPTiBD
T05GTElDVCBSRVBMQUNFLHZhbHVlIFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7Iikp
IHsNCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuaA0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdl
YkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCShyZXZpc2lvbiA0NDA1NSkNCisrKyBXZWJDb3JlL3N0
b3JhZ2UvRGF0YWJhc2UuaAkod29ya2luZyBjb3B5KQ0KQEAgLTE0NCw2ICsxNDYsOSBAQCBwcml2
YXRlOg0KICAgICBTUUxpdGVEYXRhYmFzZSBtX3NxbGl0ZURhdGFiYXNlOw0KICAgICBSZWZQdHI8
RGF0YWJhc2VBdXRob3JpemVyPiBtX2RhdGFiYXNlQXV0aG9yaXplcjsNCiANCisgICAgLy8gSWYg
d2Ugc2xlZXAgZm9yIG1vcmUgdGhlIDMwIHNlY29uZHMgd2hpbGUgYmxvY2tlZCBvbiBTUUxJVEVf
QlVTWSwgZ2l2ZSB1cC4NCisgICAgc3RhdGljIGNvbnN0IGludCBNQVhfU1FMSVRFX0JVU1lfV0FJ
VF9USU1FID0gMzAwMDA7DQorDQogI2lmbmRlZiBOREVCVUcNCiAgICAgU3RyaW5nIGRhdGFiYXNl
RGVidWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9zZWN1cml0eU9yaWdpbi0+dG9TdHJpbmcoKSAr
ICI6OiIgKyBtX25hbWU7IH0NCiAjZW5kaWYNCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvU1FMVHJh
bnNhY3Rpb24uY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0
aW9uLmNwcAkocmV2aXNpb24gNDQwNTUpDQorKysgV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0
aW9uLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTIyMCw3ICsyMjAsNyBAQCB2b2lkIFNRTFRyYW5z
YWN0aW9uOjpvcGVuVHJhbnNhY3Rpb25BbmRQDQogICAgIG1fZGF0YWJhc2UtPm1fZGF0YWJhc2VB
dXRob3JpemVyLT5lbmFibGUoKTsgICAgDQogICAgIA0KICAgICAvLyBUcmFuc2FjdGlvbiBTdGVw
cyAxKzIgLSBPcGVuIGEgdHJhbnNhY3Rpb24gdG8gdGhlIGRhdGFiYXNlLCBqdW1waW5nIHRvIHRo
ZSBlcnJvciBjYWxsYmFjayBpZiB0aGF0IGZhaWxzDQotICAgIGlmICghbV9zcWxpdGVUcmFuc2Fj
dGlvbi0+aW5Qcm9ncmVzcygpKSB7DQorICAgIGlmICghbV9zcWxpdGVUcmFuc2FjdGlvbi0+aW5Q
cm9ncmVzcygpICYmICFtX2RhdGFiYXNlLT5zdG9wcGVkKCkpIHsNCiAgICAgICAgIEFTU0VSVCgh
bV9kYXRhYmFzZS0+bV9zcWxpdGVEYXRhYmFzZS50cmFuc2FjdGlvbkluUHJvZ3Jlc3MoKSk7DQog
ICAgICAgICBtX3NxbGl0ZVRyYW5zYWN0aW9uLmNsZWFyKCk7DQogICAgICAgICBtX3RyYW5zYWN0
aW9uRXJyb3IgPSBTUUxFcnJvcjo6Y3JlYXRlKDAsICJ1bmFibGUgdG8gb3BlbiBhIHRyYW5zYWN0
aW9uIHRvIHRoZSBkYXRhYmFzZSIpOw0KQEAgLTMyMyw2ICszMjMsMTQgQEAgYm9vbCBTUUxUcmFu
c2FjdGlvbjo6cnVuQ3VycmVudFN0YXRlbWVudA0KICAgICBtX2RhdGFiYXNlLT5tX2RhdGFiYXNl
QXV0aG9yaXplci0+cmVzZXQoKTsNCiAgICAgDQogICAgIGlmIChtX2N1cnJlbnRTdGF0ZW1lbnQt
PmV4ZWN1dGUobV9kYXRhYmFzZS5nZXQoKSkpIHsNCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBk
YXRhYmFzZSBoYXMgYmVlbiBzdG9wcGVkLiBUaGlzIG1heSBoYXBwZW4gd2hlbiB0aGUgdXNlciBu
YXZpZ2F0ZXMgYXdheSBmcm9tIHRoZSBwYWdlLg0KKyAgICAgICAgLy8gUnVuIHRoZSBlcnJvciBz
dGVwcyBzeW5jaHJvbm91c2x5IHRvIGVuc3VyZSB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gdGlkaWVz
IGl0c2VsZiB1cC4gSWYgdGhlIGRhdGFiYXNlIHRocmVhZA0KKyAgICAgICAgLy8gaGFzIGJlZW4g
YXNrZWQgdG8gZGllLCB0aGVuIHdlIHdpbGwgYmUgdW5hYmxlIHRvIHNjaGVkdWxlIGFzeW5jaHJv
bm91cyBjbGVhbiB1cCBzdGVwcy4NCisgICAgICAgIGlmKG1fZGF0YWJhc2UtPnN0b3BwZWQoKSkg
ew0KKyAgICAgICAgICAgIGhhbmRsZUN1cnJlbnRTdGF0ZW1lbnRFcnJvcigpOw0KKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCiAgICAgICAgIGlmIChtX2RhdGFiYXNl
LT5tX2RhdGFiYXNlQXV0aG9yaXplci0+bGFzdEFjdGlvbkNoYW5nZWREYXRhYmFzZSgpKSB7DQog
ICAgICAgICAgICAgLy8gRmxhZyB0aGlzIHRyYW5zYWN0aW9uIGFzIGhhdmluZyBjaGFuZ2VkIHRo
ZSBkYXRhYmFzZSBmb3IgbGF0ZXIgZGVsZWdhdGUgbm90aWZpY2F0aW9uDQogICAgICAgICAgICAg
bV9tb2RpZmllZERhdGFiYXNlID0gdHJ1ZTsNCkBAIC0zNTcsOCArMzY1LDggQEAgYm9vbCBTUUxU
cmFuc2FjdGlvbjo6cnVuQ3VycmVudFN0YXRlbWVudA0KIHZvaWQgU1FMVHJhbnNhY3Rpb246Omhh
bmRsZUN1cnJlbnRTdGF0ZW1lbnRFcnJvcigpDQogew0KICAgICAvLyBUcmFuc2FjdGlvbiBTdGVw
cyA2LmVycm9yIC0gQ2FsbCB0aGUgc3RhdGVtZW50J3MgZXJyb3IgY2FsbGJhY2ssIGJ1dCBpZiB0
aGVyZSB3YXMgbm8gZXJyb3IgY2FsbGJhY2ssDQotICAgIC8vIGp1bXAgdG8gdGhlIHRyYW5zYWN0
aW9uIGVycm9yIGNhbGxiYWNrDQotICAgIGlmIChtX2N1cnJlbnRTdGF0ZW1lbnQtPmhhc1N0YXRl
bWVudEVycm9yQ2FsbGJhY2soKSkgew0KKyAgICAvLyBvciB0aGUgZGF0YWJhc2UgaGFzIGJlZW4g
c3RvcHBlZCBqdW1wIHRvIHRoZSB0cmFuc2FjdGlvbiBlcnJvciBjYWxsYmFjaw0KKyAgICBpZiAo
bV9jdXJyZW50U3RhdGVtZW50LT5oYXNTdGF0ZW1lbnRFcnJvckNhbGxiYWNrKCkgJiYgIW1fZGF0
YWJhc2UtPnN0b3BwZWQoKSkgew0KICAgICAgICAgbV9uZXh0U3RlcCA9ICZTUUxUcmFuc2FjdGlv
bjo6ZGVsaXZlclN0YXRlbWVudENhbGxiYWNrOw0KICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJT
Y2hlZHVsaW5nIGRlbGl2ZXJTdGF0ZW1lbnRDYWxsYmFjayBmb3IgdHJhbnNhY3Rpb24gJXBcbiIs
IHRoaXMpOw0KICAgICAgICAgbV9kYXRhYmFzZS0+c2NoZWR1bGVUcmFuc2FjdGlvbkNhbGxiYWNr
KHRoaXMpOw0KQEAgLTQ4MCw3ICs0ODgsNyBAQCB2b2lkIFNRTFRyYW5zYWN0aW9uOjpjbGVhbnVw
QWZ0ZXJTdWNjZXNzDQogDQogdm9pZCBTUUxUcmFuc2FjdGlvbjo6aGFuZGxlVHJhbnNhY3Rpb25F
cnJvcihib29sIGluQ2FsbGJhY2spDQogew0KLSAgICBpZiAobV9lcnJvckNhbGxiYWNrKSB7DQor
ICAgIGlmIChtX2Vycm9yQ2FsbGJhY2sgJiYgIW1fZGF0YWJhc2UtPnN0b3BwZWQoKSkgew0KICAg
ICAgICAgaWYgKGluQ2FsbGJhY2spDQogICAgICAgICAgICAgZGVsaXZlclRyYW5zYWN0aW9uRXJy
b3JDYWxsYmFjaygpOw0KICAgICAgICAgZWxzZSB7DQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09DQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA0NDE1
MCkNCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkNCkBAIC0xLDMgKzEs
MTYgQEANCisyMDA5LTA1LTI2ICBCZW4gTXVyZG9jaCAgPGJlbm1AZ29vZ2xlLmNvbT4NCisNCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLg0KKyAgICAgICAgSWYgYSBkYXRhYmFz
ZSB0cmFuc2FjdGlvbiBpcyBpbnRlcnJ1cHRlZCBieSBhIG5hdmlnYXRpb24gYWN0aW9uLCB0aGUg
bG9jayBvbiB0aGF0IGRhdGFiYXNlIGlzIG5ldmVyIHJlbGlucXVpc2hlZCBhbmQgc3Vic2VxdWVu
dCBhY2Nlc3NlcyB0byB0aGF0IGRhdGFiYXNlIGZhaWwuDQorICAgICAgICANCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTc4OA0KKyAgICAgICAgDQor
ICAgICAgICBUZXN0OiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwNCisN
CisgICAgICAgICogc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50
eHQ6IEFkZGVkLg0KKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2Fk
Lmh0bWw6IEFkZGVkLg0KKyAgICAgICAgKiBzdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC0yLmh0bWw6IEFkZGVkLg0KKw0KIDIwMDktMDUtMjUgIEFkYW0gQmFydGgg
IDxhYmFydGhAd2Via2l0Lm9nPg0KIA0KICAgICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdlaW5pZy4N
CkluZGV4OiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4
cGVjdGVkLnR4dA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2Ut
bG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQ0KKysrIExheW91dFRl
c3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0CShyZXZp
c2lvbiAwKQ0KQEAgLTAsMCArMSwzIEBADQorSW5zZXJ0aW5nIHNvbWUgZGF0YQ0KK1Rlc3QgcGFy
dCAyIENvbXBsZXRlDQorDQoNClByb3BlcnR5IGNoYW5nZXMgb246IExheW91dFRlc3RzL3N0b3Jh
Z2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0DQpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpB
ZGRlZDogc3ZuOmVvbC1zdHlsZQ0KICAgKyBuYXRpdmUNCg0KSW5kZXg6IExheW91dFRlc3RzL3N0
b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbA0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIExh
eW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNp
b24gMCkNCisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2Fk
Lmh0bWwJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDczIEBADQorPGh0bWw+DQorPGhlYWQ+DQor
PHNjcmlwdD4NCit2YXIgZGF0YWJhc2U7DQordmFyIHRpbWVvdXQ7DQorDQorZnVuY3Rpb24gbG9n
KG1lc3NhZ2UpDQorew0KKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29uc29sZSIpLmlu
bmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4iOw0KK30NCisNCitmdW5jdGlvbiBmaW5pc2hUZXN0
KCkNCit7DQorICAgIGxvZygiVGVzdCBwYXJ0IDEgQ29tcGxldGUiKTsNCisgICAgaWYgKHdpbmRv
dy5sYXlvdXRUZXN0Q29udHJvbGxlcikNCisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5v
dGlmeURvbmUoKTsNCit9DQorDQorZnVuY3Rpb24gZXJyb3JGdW5jdGlvbih0eCwgZXJyb3IpDQor
ew0KKyAgICBjbGVhclRpbWVvdXQodGltZW91dCk7DQorICAgIGxvZygiVGVzdCBmYWlsZWQgLSAi
ICsgZXJyb3IubWVzc2FnZSk7DQorICAgIGZpbmlzaFRlc3QoKTsNCit9DQorDQorZnVuY3Rpb24g
YWRkRGF0YShkYikNCit7DQorICAgIGRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7IA0KKyAg
ICAgICAgbG9nKCJJbnNlcnRpbmcgc29tZSBkYXRhIik7DQorICAgICAgICAvLyBJbnNlcnQgYSBs
YXJnZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdpbGwgdGFrZSBhIGxpdHRsZSB3aGlsZSB0byBydW4u
IFNjaGVkdWxlIGEgdGltb3V0IHRvIHJ1biB0aGF0IHdpbGwgbG9hZCBhIG5ldyBwYWdlDQorICAg
ICAgICAvLyB3aGlsc3QgdGhlIHRyYW5zYWN0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzLCBpbnRl
cnJ1cHRpbmcgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHNob3VsZCBub3QgbGVhdmUgdGhlIGRhdGFi
YXNlIGxvY2tlZCBhbmQgb24NCisgICAgICAgIC8vIHRoZSBuZXh0IHBhZ2Ugd2Ugc2hvdWxkIGJl
IGFibGUgdG8gaW5zZXJ0IHNvbWUgbW9yZSBkYXRhLg0KKyAgICAgICAgdGltZW91dCA9IHNldFRp
bWVvdXQoZnVuY3Rpb24oKSB7IGxvY2F0aW9uLmhyZWYgPSAiLi9yZXNvdXJjZXMvZGF0YWJhc2Ut
bG9jay1hZnRlci1yZWxvYWQtMi5odG1sIjsgfSwxMCk7DQorICAgICAgICB0eC5leGVjdXRlU3Fs
KCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAocmFuZG9tQmxvYig1MTIw
MDAwKSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0aW9uKTsNCisg
ICAgfSwgZXJyb3JGdW5jdGlvbiwgZnVuY3Rpb24oKSB7IA0KKyAgICAgICAgZmluaXNoVGVzdCgp
Ow0KKyAgICB9KTsNCit9DQorDQorZnVuY3Rpb24gcnVuVGVzdCgpDQorew0KKyAgICBpZiAod2lu
ZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7DQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxl
ci5jbGVhckFsbERhdGFiYXNlcygpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0
RGF0YWJhc2VRdW90YSg1MTMwMDAwKTsNCisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1
bXBEYXRhYmFzZUNhbGxiYWNrcygpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVt
cEFzVGV4dCgpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgp
Ow0KKyAgICB9DQorICAgIA0KKyAgICB0cnkgew0KKyAgICAgICAgZGF0YWJhc2UgPSBvcGVuRGF0
YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3QiLCAiMS4wIiwgIlRlc3QgZm9yIGRhdGFiYXNlIGxvY2tp
bmciLCA1MTMwMDAwKTsNCisgICAgfSBjYXRjaCAoZSkgew0KKyAgICAgICAgbG9nKCJFcnJvciAt
IGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7DQorICAgICAgICBmaW5pc2hUZXN0KCk7DQorICAg
IH0NCisgICAgDQorICAgIGRhdGFiYXNlLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7DQorICAg
ICAgICBsb2coIkFkZGluZyBhIHRhYmxlIik7DQorICAgICAgICB0eC5leGVjdXRlU3FsKCJDUkVB
VEUgVEFCTEUgRGF0YVRlc3QgKHRlc3REYXRhKSIsIFtdLCBmdW5jdGlvbih0eCwgcmVzdWx0KSB7
IH0sIGVycm9yRnVuY3Rpb24pOyANCisgICAgfSwgZXJyb3JGdW5jdGlvbiwgZnVuY3Rpb24oKSB7
IA0KKyAgICAgICAgYWRkRGF0YShkYXRhYmFzZSk7IA0KKyAgICB9KTsNCit9DQorDQorPC9zY3Jp
cHQ+DQorPC9oZWFkPg0KKw0KKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4NCis8cHJlIGlkPSJj
b25zb2xlIj4NCis8L3ByZT4NCis8L2JvZHk+DQorDQorPC9odG1sPg0KDQpQcm9wZXJ0eSBjaGFu
Z2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0
bWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX18NCkFkZGVkOiBzdm46ZW9sLXN0eWxlDQogICArIG5hdGl2ZQ0KDQpJbmRl
eDogTGF5b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxv
YWQtMi5odG1sDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMv
ZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCShyZXZpc2lvbiAwKQ0KKysrIExheW91
dFRlc3RzL3N0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRt
bAkocmV2aXNpb24gMCkNCkBAIC0wLDAgKzEsNjAgQEANCis8aHRtbD4NCis8aGVhZD4NCis8c2Ny
aXB0Pg0KK3ZhciBkYXRhYmFzZTsNCisNCitmdW5jdGlvbiBsb2cobWVzc2FnZSkNCit7DQorICAg
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2Ug
KyAiPGJyPiI7DQorfQ0KKw0KK2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQ0KK3sNCisgICAgbG9nKCJU
ZXN0IHBhcnQgMiBDb21wbGV0ZSIpOw0KKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9s
bGVyKQ0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOw0KK30NCisN
CitmdW5jdGlvbiBlcnJvckZ1bmN0aW9uKHR4LCBlcnJvcikNCit7DQorICAgIGxvZygiVGVzdCBm
YWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7DQorICAgIGZpbmlzaFRlc3QoKTsNCit9DQorDQor
ZnVuY3Rpb24gYWRkRGF0YShkYikNCit7DQorICAgIGRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4
KSB7IA0KKyAgICAgICAgbG9nKCJJbnNlcnRpbmcgc29tZSBkYXRhIik7DQorDQorICAgICAgICB0
eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAoPyki
LCBbIkEiXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0aW9uKTsNCisgICAg
fSwgZnVuY3Rpb24oKXt9LCBmdW5jdGlvbigpIHsgDQorICAgICAgICBmaW5pc2hUZXN0KCk7DQor
ICAgIH0pOw0KK30NCisNCitmdW5jdGlvbiBydW5UZXN0KCkNCit7DQorICAgIGlmICh3aW5kb3cu
bGF5b3V0VGVzdENvbnRyb2xsZXIpIHsNCisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1
bXBEYXRhYmFzZUNhbGxiYWNrcygpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVt
cEFzVGV4dCgpOw0KKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgp
Ow0KKyAgICB9DQorICAgIA0KKyAgICB0cnkgew0KKyAgICAgICAgZGF0YWJhc2UgPSBvcGVuRGF0
YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3QiLCAiMS4wIiwgIlRlc3QgZm9yIGRhdGFiYXNlIGxvY2tp
bmciLCA1MTMwMDAwKTsNCisgICAgICAgIGFkZERhdGEoZGF0YWJhc2UpOw0KKyAgICB9IGNhdGNo
KGUpIHsNCisgICAgICAgIGxvZygiRXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBkYXRhYmFzZSIpOw0K
KyAgICAgICAgZmluaXNoVGVzdCgpOw0KKyAgICB9DQorfQ0KKw0KKzwvc2NyaXB0Pg0KKzwvaGVh
ZD4NCisNCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+DQorPHByZSBpZD0iY29uc29sZSI+DQor
PC9wcmU+DQorPC9ib2R5Pg0KKw0KKzwvaHRtbD4NCg0KUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5
b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5o
dG1sDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fDQpBZGRlZDogc3ZuOmVvbC1zdHlsZQ0KICAgKyBuYXRpdmUNCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30751</attachid>
            <date>2009-05-28 14:40:27 -0700</date>
            <delta_ts>2009-06-03 05:18:12 -0700</delta_ts>
            <desc>New patch.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>10957</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDQ0MTUwKQ0KKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
DQpAQCAtMSwzICsxLDIyIEBADQorMjAwOS0wNS0yNiAgQmVuIE11cmRvY2ggIDxiZW5tQGdvb2ds
ZS5jb20+DQorDQorICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4NCisgICAgICAg
IElmIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gaXMgaW50ZXJydXB0ZWQgYnkgYSBuYXZpZ2F0aW9u
IGFjdGlvbiwgdGhlIGxvY2sgb24gdGhhdCBkYXRhYmFzZSBpcyBuZXZlciByZWxpbnF1aXNoZWQg
YW5kIHN1YnNlcXVlbnQgYWNjZXNzZXMgdG8gdGhhdCBkYXRhYmFzZSBmYWlsLg0KKyAgICAgICAg
DQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU3MTEN
CisNCisgICAgICAgIFRlc3Q6IHN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRt
bA0KKw0KKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmNwcDoNCisgICAgICAgIChXZWJDb3Jl
OjpEYXRhYmFzZTo6cGVyZm9ybU9wZW5BbmRWZXJpZnkpOg0KKyAgICAgICAgKiBzdG9yYWdlL0Rh
dGFiYXNlLmg6DQorICAgICAgICAqIHN0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwOg0KKyAgICAg
ICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpvcGVuVHJhbnNhY3Rpb25BbmRQcmVmbGlnaHQp
Og0KKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpydW5DdXJyZW50U3RhdGVtZW50
KToNCisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6aGFuZGxlQ3VycmVudFN0YXRl
bWVudEVycm9yKToNCisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6aGFuZGxlVHJh
bnNhY3Rpb25FcnJvcik6DQorDQogMjAwOS0wNS0yNiAgU3RlcGhlbiBXaGl0ZSAgPHNlbm9yYmxh
bmNvQGNocm9taXVtLm9yZz4NCiANCiAgICAgICAgIFJldmlld2VkIGJ5IERpbWl0cmkgR2xhemtv
di4NCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3BwDQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0g
V2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAkocmV2aXNpb24gNDQwNTUpDQorKysgV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTQyOCw2ICs0MjksNyBA
QCBib29sIERhdGFiYXNlOjpwZXJmb3JtT3BlbkFuZFZlcmlmeShFeGNlDQogDQogICAgIEFTU0VS
VChtX2RhdGFiYXNlQXV0aG9yaXplcik7DQogICAgIG1fc3FsaXRlRGF0YWJhc2Uuc2V0QXV0aG9y
aXplcihtX2RhdGFiYXNlQXV0aG9yaXplcik7DQorICAgIG1fc3FsaXRlRGF0YWJhc2Uuc2V0QnVz
eVRpbWVvdXQoTUFYX1NRTElURV9CVVNZX1dBSVRfVElNRSk7DQogDQogICAgIGlmICghbV9zcWxp
dGVEYXRhYmFzZS50YWJsZUV4aXN0cyhkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSkpIHsNCiAgICAg
ICAgIGlmICghbV9zcWxpdGVEYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFICIg
KyBkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSArICIgKGtleSBURVhUIE5PVCBOVUxMIE9OIENPTkZM
SUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsdmFsdWUgVEVYVCBOT1QgTlVMTCBP
TiBDT05GTElDVCBGQUlMKTsiKSkgew0KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5o
DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHJldmlzaW9uIDQ0
MDU1KQ0KKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCSh3b3JraW5nIGNvcHkpDQpAQCAt
MTQ0LDYgKzE0Niw5IEBAIHByaXZhdGU6DQogICAgIFNRTGl0ZURhdGFiYXNlIG1fc3FsaXRlRGF0
YWJhc2U7DQogICAgIFJlZlB0cjxEYXRhYmFzZUF1dGhvcml6ZXI+IG1fZGF0YWJhc2VBdXRob3Jp
emVyOw0KIA0KKyAgICAvLyBJZiB3ZSBzbGVlcCBmb3IgbW9yZSB0aGUgMzAgc2Vjb25kcyB3aGls
ZSBibG9ja2VkIG9uIFNRTElURV9CVVNZLCBnaXZlIHVwLg0KKyAgICBzdGF0aWMgY29uc3QgaW50
IE1BWF9TUUxJVEVfQlVTWV9XQUlUX1RJTUUgPSAzMDAwMDsNCisNCiAjaWZuZGVmIE5ERUJVRw0K
ICAgICBTdHJpbmcgZGF0YWJhc2VEZWJ1Z05hbWUoKSBjb25zdCB7IHJldHVybiBtX3NlY3VyaXR5
T3JpZ2luLT50b1N0cmluZygpICsgIjo6IiArIG1fbmFtZTsgfQ0KICNlbmRpZg0KSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHANCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3Jl
L3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCShyZXZpc2lvbiA0NDA1NSkNCisrKyBXZWJDb3Jl
L3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpDQpAQCAtMjIwLDcgKzIy
MCw3IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246Om9wZW5UcmFuc2FjdGlvbkFuZFANCiAgICAgbV9k
YXRhYmFzZS0+bV9kYXRhYmFzZUF1dGhvcml6ZXItPmVuYWJsZSgpOyAgICANCiAgICAgDQogICAg
IC8vIFRyYW5zYWN0aW9uIFN0ZXBzIDErMiAtIE9wZW4gYSB0cmFuc2FjdGlvbiB0byB0aGUgZGF0
YWJhc2UsIGp1bXBpbmcgdG8gdGhlIGVycm9yIGNhbGxiYWNrIGlmIHRoYXQgZmFpbHMNCi0gICAg
aWYgKCFtX3NxbGl0ZVRyYW5zYWN0aW9uLT5pblByb2dyZXNzKCkpIHsNCisgICAgaWYgKCFtX3Nx
bGl0ZVRyYW5zYWN0aW9uLT5pblByb2dyZXNzKCkgJiYgIW1fZGF0YWJhc2UtPnN0b3BwZWQoKSkg
ew0KICAgICAgICAgQVNTRVJUKCFtX2RhdGFiYXNlLT5tX3NxbGl0ZURhdGFiYXNlLnRyYW5zYWN0
aW9uSW5Qcm9ncmVzcygpKTsNCiAgICAgICAgIG1fc3FsaXRlVHJhbnNhY3Rpb24uY2xlYXIoKTsN
CiAgICAgICAgIG1fdHJhbnNhY3Rpb25FcnJvciA9IFNRTEVycm9yOjpjcmVhdGUoMCwgInVuYWJs
ZSB0byBvcGVuIGEgdHJhbnNhY3Rpb24gdG8gdGhlIGRhdGFiYXNlIik7DQpAQCAtMzIzLDYgKzMy
MywxNCBAQCBib29sIFNRTFRyYW5zYWN0aW9uOjpydW5DdXJyZW50U3RhdGVtZW50DQogICAgIG1f
ZGF0YWJhc2UtPm1fZGF0YWJhc2VBdXRob3JpemVyLT5yZXNldCgpOw0KICAgICANCiAgICAgaWYg
KG1fY3VycmVudFN0YXRlbWVudC0+ZXhlY3V0ZShtX2RhdGFiYXNlLmdldCgpKSkgew0KKyAgICAg
ICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGFiYXNlIGhhcyBiZWVuIHN0b3BwZWQuIFRoaXMgbWF5IGhh
cHBlbiB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBhd2F5IGZyb20gdGhlIHBhZ2UuDQorICAgICAg
ICAvLyBSdW4gdGhlIGVycm9yIHN0ZXBzIHN5bmNocm9ub3VzbHkgdG8gZW5zdXJlIHRoYXQgdGhp
cyB0cmFuc2FjdGlvbiB0aWRpZXMgaXRzZWxmIHVwLiBJZiB0aGUgZGF0YWJhc2UgdGhyZWFkDQor
ICAgICAgICAvLyBoYXMgYmVlbiBhc2tlZCB0byBkaWUsIHRoZW4gd2Ugd2lsbCBiZSB1bmFibGUg
dG8gc2NoZWR1bGUgYXN5bmNocm9ub3VzIGNsZWFuIHVwIHN0ZXBzLg0KKyAgICAgICAgaWYobV9k
YXRhYmFzZS0+c3RvcHBlZCgpKSB7DQorICAgICAgICAgICAgaGFuZGxlQ3VycmVudFN0YXRlbWVu
dEVycm9yKCk7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KICAg
ICAgICAgaWYgKG1fZGF0YWJhc2UtPm1fZGF0YWJhc2VBdXRob3JpemVyLT5sYXN0QWN0aW9uQ2hh
bmdlZERhdGFiYXNlKCkpIHsNCiAgICAgICAgICAgICAvLyBGbGFnIHRoaXMgdHJhbnNhY3Rpb24g
YXMgaGF2aW5nIGNoYW5nZWQgdGhlIGRhdGFiYXNlIGZvciBsYXRlciBkZWxlZ2F0ZSBub3RpZmlj
YXRpb24NCiAgICAgICAgICAgICBtX21vZGlmaWVkRGF0YWJhc2UgPSB0cnVlOw0KQEAgLTM1Nyw4
ICszNjUsOCBAQCBib29sIFNRTFRyYW5zYWN0aW9uOjpydW5DdXJyZW50U3RhdGVtZW50DQogdm9p
ZCBTUUxUcmFuc2FjdGlvbjo6aGFuZGxlQ3VycmVudFN0YXRlbWVudEVycm9yKCkNCiB7DQogICAg
IC8vIFRyYW5zYWN0aW9uIFN0ZXBzIDYuZXJyb3IgLSBDYWxsIHRoZSBzdGF0ZW1lbnQncyBlcnJv
ciBjYWxsYmFjaywgYnV0IGlmIHRoZXJlIHdhcyBubyBlcnJvciBjYWxsYmFjaywNCi0gICAgLy8g
anVtcCB0byB0aGUgdHJhbnNhY3Rpb24gZXJyb3IgY2FsbGJhY2sNCi0gICAgaWYgKG1fY3VycmVu
dFN0YXRlbWVudC0+aGFzU3RhdGVtZW50RXJyb3JDYWxsYmFjaygpKSB7DQorICAgIC8vIG9yIHRo
ZSBkYXRhYmFzZSBoYXMgYmVlbiBzdG9wcGVkIGp1bXAgdG8gdGhlIHRyYW5zYWN0aW9uIGVycm9y
IGNhbGxiYWNrDQorICAgIGlmIChtX2N1cnJlbnRTdGF0ZW1lbnQtPmhhc1N0YXRlbWVudEVycm9y
Q2FsbGJhY2soKSAmJiAhbV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7DQogICAgICAgICBtX25leHRT
dGVwID0gJlNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyU3RhdGVtZW50Q2FsbGJhY2s7DQogICAgICAg
ICBMT0coU3RvcmFnZUFQSSwgIlNjaGVkdWxpbmcgZGVsaXZlclN0YXRlbWVudENhbGxiYWNrIGZv
ciB0cmFuc2FjdGlvbiAlcFxuIiwgdGhpcyk7DQogICAgICAgICBtX2RhdGFiYXNlLT5zY2hlZHVs
ZVRyYW5zYWN0aW9uQ2FsbGJhY2sodGhpcyk7DQpAQCAtNDgwLDcgKzQ4OCw3IEBAIHZvaWQgU1FM
VHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclN1Y2Nlc3MNCiANCiB2b2lkIFNRTFRyYW5zYWN0aW9u
OjpoYW5kbGVUcmFuc2FjdGlvbkVycm9yKGJvb2wgaW5DYWxsYmFjaykNCiB7DQotICAgIGlmICht
X2Vycm9yQ2FsbGJhY2spIHsNCisgICAgaWYgKG1fZXJyb3JDYWxsYmFjayAmJiAhbV9kYXRhYmFz
ZS0+c3RvcHBlZCgpKSB7DQogICAgICAgICBpZiAoaW5DYWxsYmFjaykNCiAgICAgICAgICAgICBk
ZWxpdmVyVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKCk7DQogICAgICAgICBlbHNlIHsNCkluZGV4
OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cJKHJldmlzaW9uIDQ0MTUwKQ0KKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQ0KQEAgLTEsMyArMSwxNiBAQA0KKzIwMDktMDUtMjYgIEJlbiBNdXJkb2NoICA8YmVu
bUBnb29nbGUuY29tPg0KKw0KKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuDQor
ICAgICAgICBJZiBhIGRhdGFiYXNlIHRyYW5zYWN0aW9uIGlzIGludGVycnVwdGVkIGJ5IGEgbmF2
aWdhdGlvbiBhY3Rpb24sIHRoZSBsb2NrIG9uIHRoYXQgZGF0YWJhc2UgaXMgbmV2ZXIgcmVsaW5x
dWlzaGVkIGFuZCBzdWJzZXF1ZW50IGFjY2Vzc2VzIHRvIHRoYXQgZGF0YWJhc2UgZmFpbC4NCisg
ICAgICAgIA0KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI1NzExDQorICAgICAgICANCisgICAgICAgIFRlc3Q6IHN0b3JhZ2UvZGF0YWJhc2UtbG9jay1h
ZnRlci1yZWxvYWQuaHRtbA0KKw0KKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0
ZXItcmVsb2FkLWV4cGVjdGVkLnR4dDogQWRkZWQuDQorICAgICAgICAqIHN0b3JhZ2UvZGF0YWJh
c2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbDogQWRkZWQuDQorICAgICAgICAqIHN0b3JhZ2UvcmVz
b3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbDogQWRkZWQuDQorDQogMjAw
OS0wNS0yNSAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub2c+DQogDQogICAgICAgICBSZXZp
ZXdlZCBieSBTYW0gV2VpbmlnLg0KSW5kZXg6IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2Ut
bG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0DQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gTGF5b3V0VGVz
dHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQJKHJldmlz
aW9uIDApDQorKysgTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9h
ZC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDMgQEANCitJbnNlcnRpbmcg
c29tZSBkYXRhDQorVGVzdCBwYXJ0IDIgQ29tcGxldGUNCisNCg0KUHJvcGVydHkgY2hhbmdlcyBv
bjogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3Rl
ZC50eHQNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18NCkFkZGVkOiBzdm46ZW9sLXN0eWxlDQogICArIG5hdGl2ZQ0KDQpJ
bmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1s
DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09DQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVy
LXJlbG9hZC5odG1sCShyZXZpc2lvbiAwKQ0KKysrIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJh
c2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNpb24gMCkNCkBAIC0wLDAgKzEsNzMgQEAN
Cis8aHRtbD4NCis8aGVhZD4NCis8c2NyaXB0Pg0KK3ZhciBkYXRhYmFzZTsNCit2YXIgdGltZW91
dDsNCisNCitmdW5jdGlvbiBsb2cobWVzc2FnZSkNCit7DQorICAgIGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7DQorfQ0KKw0K
K2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQ0KK3sNCisgICAgbG9nKCJUZXN0IHBhcnQgMSBDb21wbGV0
ZSIpOw0KKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQ0KKyAgICAgICAgbGF5
b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOw0KK30NCisNCitmdW5jdGlvbiBlcnJvckZ1
bmN0aW9uKHR4LCBlcnJvcikNCit7DQorICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsNCisgICAg
bG9nKCJUZXN0IGZhaWxlZCAtICIgKyBlcnJvci5tZXNzYWdlKTsNCisgICAgZmluaXNoVGVzdCgp
Ow0KK30NCisNCitmdW5jdGlvbiBhZGREYXRhKGRiKQ0KK3sNCisgICAgZGIudHJhbnNhY3Rpb24o
ZnVuY3Rpb24odHgpIHsgDQorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRhdGEiKTsNCisg
ICAgICAgIC8vIEluc2VydCBhIGxhcmdlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2lsbCB0YWtlIGEg
bGl0dGxlIHdoaWxlIHRvIHJ1bi4gU2NoZWR1bGUgYSB0aW1vdXQgdG8gcnVuIHRoYXQgd2lsbCBs
b2FkIGEgbmV3IHBhZ2UNCisgICAgICAgIC8vIHdoaWxzdCB0aGUgdHJhbnNhY3Rpb24gaXMgc3Rp
bGwgaW4gcHJvZ3Jlc3MsIGludGVycnVwdGluZyB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgc2hvdWxk
IG5vdCBsZWF2ZSB0aGUgZGF0YWJhc2UgbG9ja2VkIGFuZCBvbg0KKyAgICAgICAgLy8gdGhlIG5l
eHQgcGFnZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQgc29tZSBtb3JlIGRhdGEuDQorICAg
ICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24uaHJlZiA9ICIu
L3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwiOyB9LDEwKTsNCisg
ICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIERhdGFUZXN0ICh0ZXN0RGF0YSkgVkFM
VUVTIChyYW5kb21CbG9iKDUxMjAwMDApKSIsIFtdLCBmdW5jdGlvbih0eCwgcmVzdWx0KSB7IH0s
IGVycm9yRnVuY3Rpb24pOw0KKyAgICB9LCBlcnJvckZ1bmN0aW9uLCBmdW5jdGlvbigpIHsgDQor
ICAgICAgICBmaW5pc2hUZXN0KCk7DQorICAgIH0pOw0KK30NCisNCitmdW5jdGlvbiBydW5UZXN0
KCkNCit7DQorICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsNCisgICAgICAg
IGxheW91dFRlc3RDb250cm9sbGVyLmNsZWFyQWxsRGF0YWJhc2VzKCk7DQorICAgICAgICBsYXlv
dXRUZXN0Q29udHJvbGxlci5zZXREYXRhYmFzZVF1b3RhKDUxMzAwMDApOw0KKyAgICAgICAgbGF5
b3V0VGVzdENvbnRyb2xsZXIuZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCk7DQorICAgICAgICBsYXlv
dXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7DQorICAgICAgICBsYXlvdXRUZXN0Q29udHJv
bGxlci53YWl0VW50aWxEb25lKCk7DQorICAgIH0NCisgICAgDQorICAgIHRyeSB7DQorICAgICAg
ICBkYXRhYmFzZSA9IG9wZW5EYXRhYmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVz
dCBmb3IgZGF0YWJhc2UgbG9ja2luZyIsIDUxMzAwMDApOw0KKyAgICB9IGNhdGNoIChlKSB7DQor
ICAgICAgICBsb2coIkVycm9yIC0gY291bGQgbm90IG9wZW4gZGF0YWJhc2UiKTsNCisgICAgICAg
IGZpbmlzaFRlc3QoKTsNCisgICAgfQ0KKyAgICANCisgICAgZGF0YWJhc2UudHJhbnNhY3Rpb24o
ZnVuY3Rpb24odHgpIHsNCisgICAgICAgIGxvZygiQWRkaW5nIGEgdGFibGUiKTsNCisgICAgICAg
IHR4LmV4ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBEYXRhVGVzdCAodGVzdERhdGEpIiwgW10sIGZ1
bmN0aW9uKHR4LCByZXN1bHQpIHsgfSwgZXJyb3JGdW5jdGlvbik7IA0KKyAgICB9LCBlcnJvckZ1
bmN0aW9uLCBmdW5jdGlvbigpIHsgDQorICAgICAgICBhZGREYXRhKGRhdGFiYXNlKTsgDQorICAg
IH0pOw0KK30NCisNCis8L3NjcmlwdD4NCis8L2hlYWQ+DQorDQorPGJvZHkgb25sb2FkPSJydW5U
ZXN0KCkiPg0KKzxwcmUgaWQ9ImNvbnNvbGUiPg0KKzwvcHJlPg0KKzwvYm9keT4NCisNCis8L2h0
bWw+DQoNClByb3BlcnR5IGNoYW5nZXMgb246IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2Ut
bG9jay1hZnRlci1yZWxvYWQuaHRtbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KQWRkZWQ6IHN2bjplb2wtc3R5bGUN
CiAgICsgbmF0aXZlDQoNCkluZGV4OiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRh
YmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwNCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBMYXlvdXRUZXN0
cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwJKHJl
dmlzaW9uIDApDQorKysgTGF5b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9j
ay1hZnRlci1yZWxvYWQtMi5odG1sCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw2MCBAQA0KKzxo
dG1sPg0KKzxoZWFkPg0KKzxzY3JpcHQ+DQordmFyIGRhdGFiYXNlOw0KKw0KK2Z1bmN0aW9uIGxv
ZyhtZXNzYWdlKQ0KK3sNCisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5p
bm5lckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsNCit9DQorDQorZnVuY3Rpb24gZmluaXNoVGVz
dCgpDQorew0KKyAgICBsb2coIlRlc3QgcGFydCAyIENvbXBsZXRlIik7DQorICAgIGlmICh3aW5k
b3cubGF5b3V0VGVzdENvbnRyb2xsZXIpDQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5u
b3RpZnlEb25lKCk7DQorfQ0KKw0KK2Z1bmN0aW9uIGVycm9yRnVuY3Rpb24odHgsIGVycm9yKQ0K
K3sNCisgICAgbG9nKCJUZXN0IGZhaWxlZCAtICIgKyBlcnJvci5tZXNzYWdlKTsNCisgICAgZmlu
aXNoVGVzdCgpOw0KK30NCisNCitmdW5jdGlvbiBhZGREYXRhKGRiKQ0KK3sNCisgICAgZGIudHJh
bnNhY3Rpb24oZnVuY3Rpb24odHgpIHsgDQorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRh
dGEiKTsNCisNCisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIERhdGFUZXN0ICh0
ZXN0RGF0YSkgVkFMVUVTICg/KSIsIFsiQSJdLCBmdW5jdGlvbih0eCwgcmVzdWx0KSB7IH0sIGVy
cm9yRnVuY3Rpb24pOw0KKyAgICB9LCBmdW5jdGlvbigpe30sIGZ1bmN0aW9uKCkgeyANCisgICAg
ICAgIGZpbmlzaFRlc3QoKTsNCisgICAgfSk7DQorfQ0KKw0KK2Z1bmN0aW9uIHJ1blRlc3QoKQ0K
K3sNCisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgew0KKyAgICAgICAgbGF5
b3V0VGVzdENvbnRyb2xsZXIuZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCk7DQorICAgICAgICBsYXlv
dXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7DQorICAgICAgICBsYXlvdXRUZXN0Q29udHJv
bGxlci53YWl0VW50aWxEb25lKCk7DQorICAgIH0NCisgICAgDQorICAgIHRyeSB7DQorICAgICAg
ICBkYXRhYmFzZSA9IG9wZW5EYXRhYmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVz
dCBmb3IgZGF0YWJhc2UgbG9ja2luZyIsIDUxMzAwMDApOw0KKyAgICAgICAgYWRkRGF0YShkYXRh
YmFzZSk7DQorICAgIH0gY2F0Y2goZSkgew0KKyAgICAgICAgbG9nKCJFcnJvciAtIGNvdWxkIG5v
dCBvcGVuIGRhdGFiYXNlIik7DQorICAgICAgICBmaW5pc2hUZXN0KCk7DQorICAgIH0NCit9DQor
DQorPC9zY3JpcHQ+DQorPC9oZWFkPg0KKw0KKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4NCis8
cHJlIGlkPSJjb25zb2xlIj4NCis8L3ByZT4NCis8L2JvZHk+DQorDQorPC9odG1sPg0KDQpQcm9w
ZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1s
b2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCkFkZGVkOiBzdm46ZW9sLXN0eWxl
DQogICArIG5hdGl2ZQ==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30902</attachid>
            <date>2009-06-03 05:17:10 -0700</date>
            <delta_ts>2009-06-10 10:07:46 -0700</delta_ts>
            <desc>Makes the layout test pass on Windows.</desc>
            <filename>25711-patch.txt</filename>
            <type>text/plain</type>
            <size>10363</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDM4MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjAgQEAKKzIwMDktMDYtMDMgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIElmIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gaXMgaW50ZXJydXB0ZWQgYnkg
YSBuYXZpZ2F0aW9uIGFjdGlvbiwgdGhlIGxvY2sgb24gdGhhdCBkYXRhYmFzZSBpcyBuZXZlciBy
ZWxpbnF1aXNoZWQgYW5kIHN1YnNlcXVlbnQgYWNjZXNzZXMgdG8gdGhhdCBkYXRhYmFzZSBmYWls
LgorICAgICAgICAgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yNTcxMQorCisgICAgICAgIFRlc3Q6IHN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1y
ZWxvYWQuaHRtbAorCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZTo6cGVyZm9ybU9wZW5BbmRWZXJpZnkpOgorICAgICAgICAqIHN0b3Jh
Z2UvRGF0YWJhc2UuaDoKKyAgICAgICAgKiBzdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uOjpvcGVuVHJhbnNhY3Rpb25BbmRQcmVmbGln
aHQpOgorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OnJ1bkN1cnJlbnRTdGF0ZW1l
bnQpOgorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb246OmhhbmRsZUN1cnJlbnRTdGF0
ZW1lbnRFcnJvcik6CisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6aGFuZGxlVHJh
bnNhY3Rpb25FcnJvcik6CisKIDIwMDktMDYtMDIgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUu
Y29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmlkIEh5YXR0LgpJbmRleDogV2ViQ29yZS9z
dG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2UuY3BwCShyZXZpc2lvbiA0NDM3OCkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQyOCw2ICs0MjgsNyBAQCBib29sIERhdGFiYXNlOjpwZXJmb3Jt
T3BlbkFuZFZlcmlmeShFeGNlCiAKICAgICBBU1NFUlQobV9kYXRhYmFzZUF1dGhvcml6ZXIpOwog
ICAgIG1fc3FsaXRlRGF0YWJhc2Uuc2V0QXV0aG9yaXplcihtX2RhdGFiYXNlQXV0aG9yaXplcik7
CisgICAgbV9zcWxpdGVEYXRhYmFzZS5zZXRCdXN5VGltZW91dChNQVhfU1FMSVRFX0JVU1lfV0FJ
VF9USU1FKTsKIAogICAgIGlmICghbV9zcWxpdGVEYXRhYmFzZS50YWJsZUV4aXN0cyhkYXRhYmFz
ZUluZm9UYWJsZU5hbWUoKSkpIHsKICAgICAgICAgaWYgKCFtX3NxbGl0ZURhdGFiYXNlLmV4ZWN1
dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgIiArIGRhdGFiYXNlSW5mb1RhYmxlTmFtZSgpICsgIiAo
a2V5IFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQ
TEFDRSx2YWx1ZSBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwpOyIpKSB7CkluZGV4OiBX
ZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2UuaAkocmV2aXNpb24gNDQzNzgpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2Uu
aAkod29ya2luZyBjb3B5KQpAQCAtMTQ0LDYgKzE0NCw5IEBAIHByaXZhdGU6CiAgICAgU1FMaXRl
RGF0YWJhc2UgbV9zcWxpdGVEYXRhYmFzZTsKICAgICBSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVy
PiBtX2RhdGFiYXNlQXV0aG9yaXplcjsKIAorICAgIC8vIElmIHdlIHNsZWVwIGZvciBtb3JlIHRo
ZSAzMCBzZWNvbmRzIHdoaWxlIGJsb2NrZWQgb24gU1FMSVRFX0JVU1ksIGdpdmUgdXAuCisgICAg
c3RhdGljIGNvbnN0IGludCBNQVhfU1FMSVRFX0JVU1lfV0FJVF9USU1FID0gMzAwMDA7CisKICNp
Zm5kZWYgTkRFQlVHCiAgICAgU3RyaW5nIGRhdGFiYXNlRGVidWdOYW1lKCkgY29uc3QgeyByZXR1
cm4gbV9zZWN1cml0eU9yaWdpbi0+dG9TdHJpbmcoKSArICI6OiIgKyBtX25hbWU7IH0KICNlbmRp
ZgpJbmRleDogV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCShyZXZpc2lvbiA0NDM3OCkKKysr
IFdlYkNvcmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIx
OSw3ICsyMTksNyBAQCB2b2lkIFNRTFRyYW5zYWN0aW9uOjpvcGVuVHJhbnNhY3Rpb25BbmRQCiAg
ICAgbV9kYXRhYmFzZS0+bV9kYXRhYmFzZUF1dGhvcml6ZXItPmVuYWJsZSgpOyAgICAKICAgICAK
ICAgICAvLyBUcmFuc2FjdGlvbiBTdGVwcyAxKzIgLSBPcGVuIGEgdHJhbnNhY3Rpb24gdG8gdGhl
IGRhdGFiYXNlLCBqdW1waW5nIHRvIHRoZSBlcnJvciBjYWxsYmFjayBpZiB0aGF0IGZhaWxzCi0g
ICAgaWYgKCFtX3NxbGl0ZVRyYW5zYWN0aW9uLT5pblByb2dyZXNzKCkpIHsKKyAgICBpZiAoIW1f
c3FsaXRlVHJhbnNhY3Rpb24tPmluUHJvZ3Jlc3MoKSAmJiAhbV9kYXRhYmFzZS0+c3RvcHBlZCgp
KSB7CiAgICAgICAgIEFTU0VSVCghbV9kYXRhYmFzZS0+bV9zcWxpdGVEYXRhYmFzZS50cmFuc2Fj
dGlvbkluUHJvZ3Jlc3MoKSk7CiAgICAgICAgIG1fc3FsaXRlVHJhbnNhY3Rpb24uY2xlYXIoKTsK
ICAgICAgICAgbV90cmFuc2FjdGlvbkVycm9yID0gU1FMRXJyb3I6OmNyZWF0ZSgwLCAidW5hYmxl
IHRvIG9wZW4gYSB0cmFuc2FjdGlvbiB0byB0aGUgZGF0YWJhc2UiKTsKQEAgLTMyMiw2ICszMjIs
MTQgQEAgYm9vbCBTUUxUcmFuc2FjdGlvbjo6cnVuQ3VycmVudFN0YXRlbWVudAogICAgIG1fZGF0
YWJhc2UtPm1fZGF0YWJhc2VBdXRob3JpemVyLT5yZXNldCgpOwogICAgIAogICAgIGlmIChtX2N1
cnJlbnRTdGF0ZW1lbnQtPmV4ZWN1dGUobV9kYXRhYmFzZS5nZXQoKSkpIHsKKyAgICAgICAgLy8g
Q2hlY2sgaWYgdGhlIGRhdGFiYXNlIGhhcyBiZWVuIHN0b3BwZWQuIFRoaXMgbWF5IGhhcHBlbiB3
aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBhd2F5IGZyb20gdGhlIHBhZ2UuCisgICAgICAgIC8vIFJ1
biB0aGUgZXJyb3Igc3RlcHMgc3luY2hyb25vdXNseSB0byBlbnN1cmUgdGhhdCB0aGlzIHRyYW5z
YWN0aW9uIHRpZGllcyBpdHNlbGYgdXAuIElmIHRoZSBkYXRhYmFzZSB0aHJlYWQKKyAgICAgICAg
Ly8gaGFzIGJlZW4gYXNrZWQgdG8gZGllLCB0aGVuIHdlIHdpbGwgYmUgdW5hYmxlIHRvIHNjaGVk
dWxlIGFzeW5jaHJvbm91cyBjbGVhbiB1cCBzdGVwcy4KKyAgICAgICAgaWYobV9kYXRhYmFzZS0+
c3RvcHBlZCgpKSB7CisgICAgICAgICAgICBoYW5kbGVDdXJyZW50U3RhdGVtZW50RXJyb3IoKTsK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtX2Rh
dGFiYXNlLT5tX2RhdGFiYXNlQXV0aG9yaXplci0+bGFzdEFjdGlvbkNoYW5nZWREYXRhYmFzZSgp
KSB7CiAgICAgICAgICAgICAvLyBGbGFnIHRoaXMgdHJhbnNhY3Rpb24gYXMgaGF2aW5nIGNoYW5n
ZWQgdGhlIGRhdGFiYXNlIGZvciBsYXRlciBkZWxlZ2F0ZSBub3RpZmljYXRpb24KICAgICAgICAg
ICAgIG1fbW9kaWZpZWREYXRhYmFzZSA9IHRydWU7CkBAIC0zNTYsOCArMzY0LDggQEAgYm9vbCBT
UUxUcmFuc2FjdGlvbjo6cnVuQ3VycmVudFN0YXRlbWVudAogdm9pZCBTUUxUcmFuc2FjdGlvbjo6
aGFuZGxlQ3VycmVudFN0YXRlbWVudEVycm9yKCkKIHsKICAgICAvLyBUcmFuc2FjdGlvbiBTdGVw
cyA2LmVycm9yIC0gQ2FsbCB0aGUgc3RhdGVtZW50J3MgZXJyb3IgY2FsbGJhY2ssIGJ1dCBpZiB0
aGVyZSB3YXMgbm8gZXJyb3IgY2FsbGJhY2ssCi0gICAgLy8ganVtcCB0byB0aGUgdHJhbnNhY3Rp
b24gZXJyb3IgY2FsbGJhY2sKLSAgICBpZiAobV9jdXJyZW50U3RhdGVtZW50LT5oYXNTdGF0ZW1l
bnRFcnJvckNhbGxiYWNrKCkpIHsKKyAgICAvLyBvciB0aGUgZGF0YWJhc2UgaGFzIGJlZW4gc3Rv
cHBlZCBqdW1wIHRvIHRoZSB0cmFuc2FjdGlvbiBlcnJvciBjYWxsYmFjaworICAgIGlmIChtX2N1
cnJlbnRTdGF0ZW1lbnQtPmhhc1N0YXRlbWVudEVycm9yQ2FsbGJhY2soKSAmJiAhbV9kYXRhYmFz
ZS0+c3RvcHBlZCgpKSB7CiAgICAgICAgIG1fbmV4dFN0ZXAgPSAmU1FMVHJhbnNhY3Rpb246OmRl
bGl2ZXJTdGF0ZW1lbnRDYWxsYmFjazsKICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJTY2hlZHVs
aW5nIGRlbGl2ZXJTdGF0ZW1lbnRDYWxsYmFjayBmb3IgdHJhbnNhY3Rpb24gJXBcbiIsIHRoaXMp
OwogICAgICAgICBtX2RhdGFiYXNlLT5zY2hlZHVsZVRyYW5zYWN0aW9uQ2FsbGJhY2sodGhpcyk7
CkBAIC00NzgsNyArNDg2LDcgQEAgdm9pZCBTUUxUcmFuc2FjdGlvbjo6Y2xlYW51cEFmdGVyU3Vj
Y2VzcwogCiB2b2lkIFNRTFRyYW5zYWN0aW9uOjpoYW5kbGVUcmFuc2FjdGlvbkVycm9yKGJvb2wg
aW5DYWxsYmFjaykKIHsKLSAgICBpZiAobV9lcnJvckNhbGxiYWNrKSB7CisgICAgaWYgKG1fZXJy
b3JDYWxsYmFjayAmJiAhbV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7CiAgICAgICAgIGlmIChpbkNh
bGxiYWNrKQogICAgICAgICAgICAgZGVsaXZlclRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjaygpOwog
ICAgICAgICBlbHNlIHsKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ0MzgwKQorKysgTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMDktMDYtMDMgIEJl
biBNdXJkb2NoICA8YmVubUBnb29nbGUuY29tPgorCisgICAgICAgIElmIGEgZGF0YWJhc2UgdHJh
bnNhY3Rpb24gaXMgaW50ZXJydXB0ZWQgYnkgYSBuYXZpZ2F0aW9uIGFjdGlvbiwgdGhlIGxvY2sg
b24gdGhhdCBkYXRhYmFzZSBpcyBuZXZlciByZWxpbnF1aXNoZWQgYW5kIHN1YnNlcXVlbnQgYWNj
ZXNzZXMgdG8gdGhhdCBkYXRhYmFzZSBmYWlsLgorICAgICAgICAgCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTcxMQorCisgICAgICAgICogc3RvcmFn
ZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAg
ICAqIHN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbDogQWRkZWQuCisgICAg
ICAgICogc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1s
OiBBZGRlZC4KKwogMjAwOS0wNi0wMyAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQHdlYmtpdC5v
cmc+CiAKICAgICAgICAgUnViYmVyLXN0YW1wZWQgYnkgTWFyayBSb3dlLgpJbmRleDogTGF5b3V0
VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9h
ZC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFi
YXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSwzIEBACitJbnNlcnRpbmcgc29tZSBkYXRhCitUZXN0IHBhcnQgMiBDb21wbGV0ZQorCgpQcm9w
ZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXIt
cmVsb2FkLWV4cGVjdGVkLnR4dApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsg
bmF0aXZlCgpJbmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJl
bG9hZC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9j
ay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL3N0b3JhZ2Uv
ZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3
MSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQ+Cit2YXIgZGF0YWJhc2U7Cit2YXIgdGltZW91
dDsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsKK30KKworZnVuY3Rp
b24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJUZXN0IHBhcnQgMSBDb21wbGV0ZSIpOworICAg
IGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxheW91dFRlc3RDb250
cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24gZXJyb3JGdW5jdGlvbih0eCwgZXJy
b3IpCit7CisgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOworICAgIGxvZygiVGVzdCBmYWlsZWQg
LSAiICsgZXJyb3IubWVzc2FnZSk7CisgICAgZmluaXNoVGVzdCgpOworfQorCitmdW5jdGlvbiBh
ZGREYXRhKGRiKQoreworICAgIGRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7IAorICAgICAg
ICBsb2coIkluc2VydGluZyBzb21lIGRhdGEiKTsKKyAgICAgICAgLy8gSW5zZXJ0IGEgbGFyZ2Ug
YW1vdW50IG9mIGRhdGEgdGhhdCB3aWxsIHRha2UgYSBsaXR0bGUgd2hpbGUgdG8gcnVuLiBTY2hl
ZHVsZSBhIHRpbW91dCB0byBydW4gdGhhdCB3aWxsIGxvYWQgYSBuZXcgcGFnZQorICAgICAgICAv
LyB3aGlsc3QgdGhlIHRyYW5zYWN0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzLCBpbnRlcnJ1cHRp
bmcgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHNob3VsZCBub3QgbGVhdmUgdGhlIGRhdGFiYXNlIGxv
Y2tlZCBhbmQgb24KKyAgICAgICAgLy8gdGhlIG5leHQgcGFnZSB3ZSBzaG91bGQgYmUgYWJsZSB0
byBpbnNlcnQgc29tZSBtb3JlIGRhdGEuCisgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1
bmN0aW9uKCkgeyBsb2NhdGlvbi5ocmVmID0gIi4vcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0
ZXItcmVsb2FkLTIuaHRtbCI7IH0sMTApOworICAgICAgICB0eC5leGVjdXRlU3FsKCJJTlNFUlQg
SU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAocmFuZG9tQmxvYig1MjQyODcwKSkiLCBb
XSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0aW9uKTsKKyAgICB9LCBlcnJv
ckZ1bmN0aW9uLCBmdW5jdGlvbigpIHsgCisgICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9KTsK
K30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29u
dHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5jbGVhckFsbERhdGFiYXNl
cygpOworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAg
IGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisgICAgCisgICAg
dHJ5IHsKKyAgICAgICAgZGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3Qi
LCAiMS4wIiwgIlRlc3QgZm9yIGRhdGFiYXNlIGxvY2tpbmciLCA1MjQyODgwKTsKKyAgICB9IGNh
dGNoIChlKSB7CisgICAgICAgIGxvZygiRXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBkYXRhYmFzZSIp
OworICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgfQorICAgIAorICAgIGRhdGFiYXNlLnRyYW5z
YWN0aW9uKGZ1bmN0aW9uKHR4KSB7CisgICAgICAgIGxvZygiQWRkaW5nIGEgdGFibGUiKTsKKyAg
ICAgICAgdHguZXhlY3V0ZVNxbCgiQ1JFQVRFIFRBQkxFIERhdGFUZXN0ICh0ZXN0RGF0YSkiLCBb
XSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0aW9uKTsgCisgICAgfSwgZXJy
b3JGdW5jdGlvbiwgZnVuY3Rpb24oKSB7IAorICAgICAgICBhZGREYXRhKGRhdGFiYXNlKTsgCisg
ICAgfSk7Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3Qo
KSI+Cis8cHJlIGlkPSJjb25zb2xlIj4KKzwvcHJlPgorPC9ib2R5PgorCis8L2h0bWw+CgpQcm9w
ZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXIt
cmVsb2FkLmh0bWwKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoK
SW5kZXg6IExheW91dFRlc3RzL3N0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXIt
cmVsb2FkLTIuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNl
cy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlv
dXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0
bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTkgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0
PgordmFyIGRhdGFiYXNlOworCitmdW5jdGlvbiBsb2cobWVzc2FnZSkKK3sKKyAgICBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgiY29uc29sZSIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4i
OworfQorCitmdW5jdGlvbiBmaW5pc2hUZXN0KCkKK3sKKyAgICBsb2coIlRlc3QgcGFydCAyIENv
bXBsZXRlIik7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAgICAg
bGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOworfQorCitmdW5jdGlvbiBlcnJvckZ1
bmN0aW9uKHR4LCBlcnJvcikKK3sKKyAgICBsb2coIlRlc3QgZmFpbGVkIC0gIiArIGVycm9yLm1l
c3NhZ2UpOworICAgIGZpbmlzaFRlc3QoKTsKK30KKworZnVuY3Rpb24gYWRkRGF0YShkYikKK3sK
KyAgICBkYi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeyAKKyAgICAgICAgbG9nKCJJbnNlcnRp
bmcgc29tZSBkYXRhIik7CisKKyAgICAgICAgdHguZXhlY3V0ZVNxbCgiSU5TRVJUIElOVE8gRGF0
YVRlc3QgKHRlc3REYXRhKSBWQUxVRVMgKD8pIiwgWyJBIl0sIGZ1bmN0aW9uKHR4LCByZXN1bHQp
IHsgfSwgZXJyb3JGdW5jdGlvbik7CisgICAgfSwgZnVuY3Rpb24oKXt9LCBmdW5jdGlvbigpIHsg
CisgICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gcnVuVGVzdCgp
Cit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlv
dXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9s
bGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisgICAgCisgICAgdHJ5IHsKKyAgICAgICAgZGF0
YWJhc2UgPSBvcGVuRGF0YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3QiLCAiMS4wIiwgIlRlc3QgZm9y
IGRhdGFiYXNlIGxvY2tpbmciLCA1MjQyODgwKTsKKyAgICAgICAgYWRkRGF0YShkYXRhYmFzZSk7
CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIGxvZygiRXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBk
YXRhYmFzZSIpOworICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgfQorfQorCis8L3NjcmlwdD4K
KzwvaGVhZD4KKworPGJvZHkgb25sb2FkPSJydW5UZXN0KCkiPgorPHByZSBpZD0iY29uc29sZSI+
Cis8L3ByZT4KKzwvYm9keT4KKworPC9odG1sPgoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0
VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1s
Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31133</attachid>
            <date>2009-06-10 10:07:46 -0700</date>
            <delta_ts>2009-06-16 12:40:52 -0700</delta_ts>
            <desc>New patch.</desc>
            <filename>25711-1006.txt</filename>
            <type>text/plain</type>
            <size>12277</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDU2NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjAgQEAKKzIwMDktMDYtMTAgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIElmIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gaXMgaW50ZXJydXB0ZWQgYnkg
YSBuYXZpZ2F0aW9uIGFjdGlvbiwgdGhlIGxvY2sgb24gdGhhdCBkYXRhYmFzZSBpcyBuZXZlciBy
ZWxpbnF1aXNoZWQgYW5kIHN1YnNlcXVlbnQgYWNjZXNzZXMgdG8gdGhhdCBkYXRhYmFzZSBmYWls
LgorICAgICAgICAgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yNTcxMQorICAgICAgICAKKyAgICAgICAgVGVzdDogc3RvcmFnZS9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC5odG1sCisgICAgICAgIAorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2Uu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OnBlcmZvcm1PcGVuQW5kVmVyaWZ5KTog
SW5zdGFsbCBhIGJ1c3kgdGltZW91dCBzbyB0aGF0IG5ldyBzdGF0ZW1lbnRzIGNhbiB3YWl0IGZv
ciB0aGUgZGF0YWJhc2UgdG8gYmUgdW5sb2NrZWQuCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFz
ZS5oOgorICAgICAgICAqIHN0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6U1FMVHJhbnNhY3Rpb246OnJ1bkN1cnJlbnRTdGF0ZW1lbnQpOiBDaGVjayB0byBzZWUg
aWYgdGhlIGRhdGFiYXNlIHdhcyBzdG9wcGVkIHdoaWxzdCBhIHN0YXRlbWVudCB3YXMgZXhlY3V0
aW5nIGFuZCB0cmVhdCB0aGF0IGFzIGEgc3RhdGVtZW50IGVycm9yLgorICAgICAgICAoV2ViQ29y
ZTo6U1FMVHJhbnNhY3Rpb246OmRlbGl2ZXJTdWNjZXNzQ2FsbGJhY2spOiBFbnN1cmUgdGhhdCBp
ZiB0aGUgZGF0YWJhc2UgaGFzIGJlZW4gc3RvcHBlZCwgY2xlYW51cCBzdGVwcyBjYW4gYmUgcnVu
IHN5bmNocm9ub3VzbHkuCisgICAgICAgIChXZWJDb3JlOjpTUUxUcmFuc2FjdGlvbjo6aGFuZGxl
VHJhbnNhY3Rpb25FcnJvcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rp
b246OmRlbGl2ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2spOiBEaXR0by4KKwogMjAwOS0wNi0x
MCAgQnJlbnQgRnVsZ2hhbSAgPGJmdWxnaGFtQHdlYmtpdC5vcmc+CiAKICAgICAgICAgQnVpbGQg
Y29ycmVjdCBmb3IgV2luZG93cyBDYWlybyB0YXJnZXRzLgpJbmRleDogV2ViQ29yZS9zdG9yYWdl
L0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3Bw
CShyZXZpc2lvbiA0NDU0OSkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQyOCw2ICs0MjgsNyBAQCBib29sIERhdGFiYXNlOjpwZXJmb3JtT3BlbkFu
ZFZlcmlmeShFeGNlCiAKICAgICBBU1NFUlQobV9kYXRhYmFzZUF1dGhvcml6ZXIpOwogICAgIG1f
c3FsaXRlRGF0YWJhc2Uuc2V0QXV0aG9yaXplcihtX2RhdGFiYXNlQXV0aG9yaXplcik7CisgICAg
bV9zcWxpdGVEYXRhYmFzZS5zZXRCdXN5VGltZW91dChNQVhfU1FMSVRFX0JVU1lfV0FJVF9USU1F
KTsKIAogICAgIGlmICghbV9zcWxpdGVEYXRhYmFzZS50YWJsZUV4aXN0cyhkYXRhYmFzZUluZm9U
YWJsZU5hbWUoKSkpIHsKICAgICAgICAgaWYgKCFtX3NxbGl0ZURhdGFiYXNlLmV4ZWN1dGVDb21t
YW5kKCJDUkVBVEUgVEFCTEUgIiArIGRhdGFiYXNlSW5mb1RhYmxlTmFtZSgpICsgIiAoa2V5IFRF
WFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSx2
YWx1ZSBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwpOyIpKSB7CkluZGV4OiBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2UuaAkocmV2aXNpb24gNDQ1NDkpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuaAkod29y
a2luZyBjb3B5KQpAQCAtMTQ0LDYgKzE0NCw5IEBAIHByaXZhdGU6CiAgICAgU1FMaXRlRGF0YWJh
c2UgbV9zcWxpdGVEYXRhYmFzZTsKICAgICBSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVyPiBtX2Rh
dGFiYXNlQXV0aG9yaXplcjsKIAorICAgIC8vIElmIHdlIHNsZWVwIGZvciBtb3JlIHRoZSAzMCBz
ZWNvbmRzIHdoaWxlIGJsb2NrZWQgb24gU1FMSVRFX0JVU1ksIGdpdmUgdXAuCisgICAgc3RhdGlj
IGNvbnN0IGludCBNQVhfU1FMSVRFX0JVU1lfV0FJVF9USU1FID0gMzAwMDA7CisKICNpZm5kZWYg
TkRFQlVHCiAgICAgU3RyaW5nIGRhdGFiYXNlRGVidWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9z
ZWN1cml0eU9yaWdpbi0+dG9TdHJpbmcoKSArICI6OiIgKyBtX25hbWU7IH0KICNlbmRpZgpJbmRl
eDogV2ViQ29yZS9zdG9yYWdlL1NRTFRyYW5zYWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3N0b3JhZ2UvU1FMVHJhbnNhY3Rpb24uY3BwCShyZXZpc2lvbiA0NDU0OSkKKysrIFdlYkNv
cmUvc3RvcmFnZS9TUUxUcmFuc2FjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyMiw2ICsz
MjIsMTIgQEAgYm9vbCBTUUxUcmFuc2FjdGlvbjo6cnVuQ3VycmVudFN0YXRlbWVudAogICAgIG1f
ZGF0YWJhc2UtPm1fZGF0YWJhc2VBdXRob3JpemVyLT5yZXNldCgpOwogICAgIAogICAgIGlmICht
X2N1cnJlbnRTdGF0ZW1lbnQtPmV4ZWN1dGUobV9kYXRhYmFzZS5nZXQoKSkpIHsKKyAgICAgICAg
Ly8gVGhlIGRhdGFiYXNlIHdhcyBzdG9wcGVkIHdoaWxzdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGV4
ZWN1dGluZy4gVHJlYXQgdGhpcyBhcyBhbiBlcnJvciBhbmQgYWJvcnQgdGhlIHRyYW5zYWN0aW9u
LgorICAgICAgICBpZiAobV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7CisgICAgICAgICAgICBoYW5k
bGVDdXJyZW50U3RhdGVtZW50RXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorCiAgICAgICAgIGlmIChtX2RhdGFiYXNlLT5tX2RhdGFiYXNlQXV0aG9yaXplci0+
bGFzdEFjdGlvbkNoYW5nZWREYXRhYmFzZSgpKSB7CiAgICAgICAgICAgICAvLyBGbGFnIHRoaXMg
dHJhbnNhY3Rpb24gYXMgaGF2aW5nIGNoYW5nZWQgdGhlIGRhdGFiYXNlIGZvciBsYXRlciBkZWxl
Z2F0ZSBub3RpZmljYXRpb24KICAgICAgICAgICAgIG1fbW9kaWZpZWREYXRhYmFzZSA9IHRydWU7
CkBAIC0zNDEsNyArMzQ3LDcgQEAgYm9vbCBTUUxUcmFuc2FjdGlvbjo6cnVuQ3VycmVudFN0YXRl
bWVudAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgCi0gICAgaWYgKG1fY3VycmVu
dFN0YXRlbWVudC0+bGFzdEV4ZWN1dGlvbkZhaWxlZER1ZVRvUXVvdGEoKSkgeworICAgIGlmICht
X2N1cnJlbnRTdGF0ZW1lbnQtPmxhc3RFeGVjdXRpb25GYWlsZWREdWVUb1F1b3RhKCkgJiYgIW1f
ZGF0YWJhc2UtPnN0b3BwZWQoKSkgewogICAgICAgICBtX25leHRTdGVwID0gJlNRTFRyYW5zYWN0
aW9uOjpkZWxpdmVyUXVvdGFJbmNyZWFzZUNhbGxiYWNrOwogICAgICAgICBMT0coU3RvcmFnZUFQ
SSwgIlNjaGVkdWxpbmcgZGVsaXZlclF1b3RhSW5jcmVhc2VDYWxsYmFjayBmb3IgdHJhbnNhY3Rp
b24gJXBcbiIsIHRoaXMpOwogICAgICAgICBtX2RhdGFiYXNlLT5zY2hlZHVsZVRyYW5zYWN0aW9u
Q2FsbGJhY2sodGhpcyk7CkBAIC00NjIsOSArNDY4LDE0IEBAIHZvaWQgU1FMVHJhbnNhY3Rpb246
OmRlbGl2ZXJTdWNjZXNzQ2FsbGIKIAogICAgIC8vIFNjaGVkdWxlIGEgInBvc3Qtc3VjY2VzcyBj
YWxsYmFjayIgc3RlcCB0byByZXR1cm4gY29udHJvbCB0byB0aGUgZGF0YWJhc2UgdGhyZWFkIGlu
IGNhc2UgdGhlcmUKICAgICAvLyBhcmUgZnVydGhlciB0cmFuc2FjdGlvbnMgcXVldWVkIHVwIGZv
ciB0aGlzIERhdGFiYXNlCi0gICAgbV9uZXh0U3RlcCA9ICZTUUxUcmFuc2FjdGlvbjo6Y2xlYW51
cEFmdGVyU3VjY2Vzc0NhbGxiYWNrOwotICAgIExPRyhTdG9yYWdlQVBJLCAiU2NoZWR1bGluZyBj
bGVhbnVwQWZ0ZXJTdWNjZXNzQ2FsbGJhY2sgZm9yIHRyYW5zYWN0aW9uICVwXG4iLCB0aGlzKTsK
LSAgICBtX2RhdGFiYXNlLT5zY2hlZHVsZVRyYW5zYWN0aW9uU3RlcCh0aGlzKTsKKyAgICBpZiAo
bV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7CisgICAgICAgIExPRyhTdG9yYWdlQVBJLCAiRGF0YWJh
c2UgaGFzIGJlZW4gc3RvcHBlZCwgZXhlY3V0aW5nIGNsZWFudXBBZnRlclN1Y2Nlc3NDYWxsYmFj
ayBmb3IgdHJhbnNhY3Rpb24gJXBcbiIsIHRoaXMpOworICAgICAgICBjbGVhbnVwQWZ0ZXJTdWNj
ZXNzQ2FsbGJhY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX25leHRTdGVwID0gJlNRTFRy
YW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJTdWNjZXNzQ2FsbGJhY2s7CisgICAgICAgIExPRyhTdG9y
YWdlQVBJLCAiU2NoZWR1bGluZyBjbGVhbnVwQWZ0ZXJTdWNjZXNzQ2FsbGJhY2sgZm9yIHRyYW5z
YWN0aW9uICVwXG4iLCB0aGlzKTsKKyAgICAgICAgbV9kYXRhYmFzZS0+c2NoZWR1bGVUcmFuc2Fj
dGlvblN0ZXAodGhpcyk7CisgICAgfQogfQogCiB2b2lkIFNRTFRyYW5zYWN0aW9uOjpjbGVhbnVw
QWZ0ZXJTdWNjZXNzQ2FsbGJhY2soKQpAQCAtNDkyLDkgKzUwMywxNCBAQCB2b2lkIFNRTFRyYW5z
YWN0aW9uOjpoYW5kbGVUcmFuc2FjdGlvbkVyCiAgICAgLy8gTm8gZXJyb3IgY2FsbGJhY2ssIHNv
IGZhc3QtZm9yd2FyZCB0bzoKICAgICAvLyBUcmFuc2FjdGlvbiBTdGVwIDEyIC0gUm9sbGJhY2sg
dGhlIHRyYW5zYWN0aW9uLgogICAgIGlmIChpbkNhbGxiYWNrKSB7Ci0gICAgICAgIG1fbmV4dFN0
ZXAgPSAmU1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclRyYW5zYWN0aW9uRXJyb3JDYWxsYmFj
azsKLSAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJTY2hlZHVsaW5nIGNsZWFudXBBZnRlclRyYW5z
YWN0aW9uRXJyb3JDYWxsYmFjayBmb3IgdHJhbnNhY3Rpb24gJXBcbiIsIHRoaXMpOwotICAgICAg
ICBtX2RhdGFiYXNlLT5zY2hlZHVsZVRyYW5zYWN0aW9uU3RlcCh0aGlzKTsKKyAgICAgICAgaWYg
KG1fZGF0YWJhc2UtPnN0b3BwZWQoKSkgeworICAgICAgICAgICAgTE9HKFN0b3JhZ2VBUEksICJE
YXRhYmFzZSBzdG9wcGVkLCBleGVjdXRpbmcgY2xlYW51cEFmdGVyVHJhbnNhY3Rpb25FcnJvckNh
bGxiYWNrIGZvciB0cmFuc2FjdGlvbiAlcFxuIiwgdGhpcyk7CisgICAgICAgICAgICBjbGVhbnVw
QWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIG1fbmV4dFN0ZXAgPSAmU1FMVHJhbnNhY3Rpb246OmNsZWFudXBBZnRlclRyYW5zYWN0
aW9uRXJyb3JDYWxsYmFjazsKKyAgICAgICAgICAgIExPRyhTdG9yYWdlQVBJLCAiU2NoZWR1bGlu
ZyBjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2sgZm9yIHRyYW5zYWN0aW9uICVw
XG4iLCB0aGlzKTsKKyAgICAgICAgICAgIG1fZGF0YWJhc2UtPnNjaGVkdWxlVHJhbnNhY3Rpb25T
dGVwKHRoaXMpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgY2xlYW51cEFmdGVy
VHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKCk7CiAgICAgfQpAQCAtNTA5LDkgKzUyNSwxNSBAQCB2
b2lkIFNRTFRyYW5zYWN0aW9uOjpkZWxpdmVyVHJhbnNhY3Rpb25FCiAgICAgaWYgKG1fZXJyb3JD
YWxsYmFjaykKICAgICAgICAgbV9lcnJvckNhbGxiYWNrLT5oYW5kbGVFdmVudChtX3RyYW5zYWN0
aW9uRXJyb3IuZ2V0KCkpOwogCi0gICAgbV9uZXh0U3RlcCA9ICZTUUxUcmFuc2FjdGlvbjo6Y2xl
YW51cEFmdGVyVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrOwotICAgIExPRyhTdG9yYWdlQVBJLCAi
U2NoZWR1bGluZyBjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2sgZm9yIHRyYW5z
YWN0aW9uICVwXG4iLCB0aGlzKTsKLSAgICBtX2RhdGFiYXNlLT5zY2hlZHVsZVRyYW5zYWN0aW9u
U3RlcCh0aGlzKTsKKyAgICBpZiAobV9kYXRhYmFzZS0+c3RvcHBlZCgpKSB7CisgICAgICAgIC8v
IEVuc3VyZSB0aGF0IHdlIGNsZWFuIHVwIGV2ZW4gaWYgdGhlIGRhdGFiYXNlIGhhcyBiZWVuIHN0
b3BwZWQuCisgICAgICAgIExPRyhTdG9yYWdlQVBJLCAiRGF0YWJhc2UgaGFzIGJlZW4gc3RvcHBl
ZCwgZXhlY3V0aW5nIGNsZWFudXBBZnRlclRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjayBmb3IgdHJh
bnNhY3Rpb24gJXBcbiIsIHRoaXMpOworICAgICAgICBjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVy
cm9yQ2FsbGJhY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX25leHRTdGVwID0gJlNRTFRy
YW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s7CisgICAgICAg
IExPRyhTdG9yYWdlQVBJLCAiU2NoZWR1bGluZyBjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9y
Q2FsbGJhY2sgZm9yIHRyYW5zYWN0aW9uICVwXG4iLCB0aGlzKTsKKyAgICAgICAgbV9kYXRhYmFz
ZS0+c2NoZWR1bGVUcmFuc2FjdGlvblN0ZXAodGhpcyk7CisgICAgfQogfQogCiB2b2lkIFNRTFRy
YW5zYWN0aW9uOjpjbGVhbnVwQWZ0ZXJUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2soKQpJbmRleDog
TGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxv
ZwkocmV2aXNpb24gNDQ1NjUpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wNi0xMCAgQmVuIE11cmRvY2ggIDxiZW5tQGdvb2ds
ZS5jb20+CisKKyAgICAgICAgSWYgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBpcyBpbnRlcnJ1cHRl
ZCBieSBhIG5hdmlnYXRpb24gYWN0aW9uLCB0aGUgbG9jayBvbiB0aGF0IGRhdGFiYXNlIGlzIG5l
dmVyIHJlbGlucXVpc2hlZCBhbmQgc3Vic2VxdWVudCBhY2Nlc3NlcyB0byB0aGF0IGRhdGFiYXNl
IGZhaWwuCisgICAgICAgICAKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTI1NzExCisKKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXIt
cmVsb2FkLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9kYXRhYmFzZS1s
b2NrLWFmdGVyLXJlbG9hZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3Jlc291cmNl
cy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWw6IEFkZGVkLgorCiAyMDA5LTA2LTA5
ICBCcmVudCBGdWxnaGFtICA8YmZ1bGdoYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBObyByZXZp
ZXcsIGJ1aWxkIGZpeCBvbmx5LgpJbmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1s
b2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
c3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzIEBACitJbnNlcnRpbmcgc29tZSBk
YXRhCitUZXN0IHBhcnQgMiBDb21wbGV0ZQorCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRU
ZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dApfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogTGF5b3V0VGVz
dHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2
aXNpb24gMCkKKysrIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxv
YWQuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3MSBAQAorPGh0bWw+Cis8aGVhZD4KKzxz
Y3JpcHQ+Cit2YXIgZGF0YWJhc2U7Cit2YXIgdGltZW91dDsKKworZnVuY3Rpb24gbG9nKG1lc3Nh
Z2UpCit7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwg
Kz0gbWVzc2FnZSArICI8YnI+IjsKK30KKworZnVuY3Rpb24gZmluaXNoVGVzdCgpCit7CisgICAg
bG9nKCJUZXN0IHBhcnQgMSBDb21wbGV0ZSIpOworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENv
bnRyb2xsZXIpCisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30K
KworZnVuY3Rpb24gZXJyb3JGdW5jdGlvbih0eCwgZXJyb3IpCit7CisgICAgY2xlYXJUaW1lb3V0
KHRpbWVvdXQpOworICAgIGxvZygiVGVzdCBmYWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7Cisg
ICAgZmluaXNoVGVzdCgpOworfQorCitmdW5jdGlvbiBhZGREYXRhKGRiKQoreworICAgIGRiLnRy
YW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7IAorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRh
dGEiKTsKKyAgICAgICAgLy8gSW5zZXJ0IGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgdGhhdCB3aWxs
IHRha2UgYSBsaXR0bGUgd2hpbGUgdG8gcnVuLiBTY2hlZHVsZSBhIHRpbW91dCB0byBydW4gdGhh
dCB3aWxsIGxvYWQgYSBuZXcgcGFnZQorICAgICAgICAvLyB3aGlsc3QgdGhlIHRyYW5zYWN0aW9u
IGlzIHN0aWxsIGluIHByb2dyZXNzLCBpbnRlcnJ1cHRpbmcgdGhlIHRyYW5zYWN0aW9uLiBUaGlz
IHNob3VsZCBub3QgbGVhdmUgdGhlIGRhdGFiYXNlIGxvY2tlZCBhbmQgb24KKyAgICAgICAgLy8g
dGhlIG5leHQgcGFnZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQgc29tZSBtb3JlIGRhdGEu
CisgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5ocmVm
ID0gIi4vcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbCI7IH0sMTAp
OworICAgICAgICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEp
IFZBTFVFUyAocmFuZG9tQmxvYig1MjQyODcwKSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkg
eyB9LCBlcnJvckZ1bmN0aW9uKTsKKyAgICB9LCBlcnJvckZ1bmN0aW9uLCBmdW5jdGlvbigpIHsg
CisgICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gcnVuVGVzdCgp
Cit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlv
dXRUZXN0Q29udHJvbGxlci5jbGVhckFsbERhdGFiYXNlcygpOworICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndh
aXRVbnRpbERvbmUoKTsKKyAgICB9CisgICAgCisgICAgdHJ5IHsKKyAgICAgICAgZGF0YWJhc2Ug
PSBvcGVuRGF0YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3QiLCAiMS4wIiwgIlRlc3QgZm9yIGRhdGFi
YXNlIGxvY2tpbmciLCA1MjQyODgwKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGxvZygi
RXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBkYXRhYmFzZSIpOworICAgICAgICBmaW5pc2hUZXN0KCk7
CisgICAgfQorICAgIAorICAgIGRhdGFiYXNlLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7Cisg
ICAgICAgIGxvZygiQWRkaW5nIGEgdGFibGUiKTsKKyAgICAgICAgdHguZXhlY3V0ZVNxbCgiQ1JF
QVRFIFRBQkxFIERhdGFUZXN0ICh0ZXN0RGF0YSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkg
eyB9LCBlcnJvckZ1bmN0aW9uKTsgCisgICAgfSwgZXJyb3JGdW5jdGlvbiwgZnVuY3Rpb24oKSB7
IAorICAgICAgICBhZGREYXRhKGRhdGFiYXNlKTsgCisgICAgfSk7Cit9CisKKzwvc2NyaXB0Pgor
PC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+Cis8cHJlIGlkPSJjb25zb2xlIj4K
KzwvcHJlPgorPC9ib2R5PgorCis8L2h0bWw+CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRU
ZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwKX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpB
ZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoKSW5kZXg6IExheW91dFRlc3RzL3N0b3Jh
Z2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJl
bG9hZC0yLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNl
cy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNTkgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0PgordmFyIGRhdGFiYXNlOworCitmdW5j
dGlvbiBsb2cobWVzc2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29uc29s
ZSIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4iOworfQorCitmdW5jdGlvbiBmaW5pc2hU
ZXN0KCkKK3sKKyAgICBsb2coIlRlc3QgcGFydCAyIENvbXBsZXRlIik7CisgICAgaWYgKHdpbmRv
dy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIubm90
aWZ5RG9uZSgpOworfQorCitmdW5jdGlvbiBlcnJvckZ1bmN0aW9uKHR4LCBlcnJvcikKK3sKKyAg
ICBsb2coIlRlc3QgZmFpbGVkIC0gIiArIGVycm9yLm1lc3NhZ2UpOworICAgIGZpbmlzaFRlc3Qo
KTsKK30KKworZnVuY3Rpb24gYWRkRGF0YShkYikKK3sKKyAgICBkYi50cmFuc2FjdGlvbihmdW5j
dGlvbih0eCkgeyAKKyAgICAgICAgbG9nKCJJbnNlcnRpbmcgc29tZSBkYXRhIik7CisKKyAgICAg
ICAgdHguZXhlY3V0ZVNxbCgiSU5TRVJUIElOVE8gRGF0YVRlc3QgKHRlc3REYXRhKSBWQUxVRVMg
KD8pIiwgWyJBIl0sIGZ1bmN0aW9uKHR4LCByZXN1bHQpIHsgfSwgZXJyb3JGdW5jdGlvbik7Cisg
ICAgfSwgZnVuY3Rpb24oKXt9LCBmdW5jdGlvbigpIHsgCisgICAgICAgIGZpbmlzaFRlc3QoKTsK
KyAgICB9KTsKK30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlv
dXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNU
ZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAg
ICB9CisgICAgCisgICAgdHJ5IHsKKyAgICAgICAgZGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UoIkRh
dGFiYXNlTG9ja1Rlc3QiLCAiMS4wIiwgIlRlc3QgZm9yIGRhdGFiYXNlIGxvY2tpbmciLCA1MjQy
ODgwKTsKKyAgICAgICAgYWRkRGF0YShkYXRhYmFzZSk7CisgICAgfSBjYXRjaChlKSB7CisgICAg
ICAgIGxvZygiRXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBkYXRhYmFzZSIpOworICAgICAgICBmaW5p
c2hUZXN0KCk7CisgICAgfQorfQorCis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkgb25sb2Fk
PSJydW5UZXN0KCkiPgorPHByZSBpZD0iY29uc29sZSI+Cis8L3ByZT4KKzwvYm9keT4KKworPC9o
dG1sPgoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMv
ZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCl9fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpl
b2wtc3R5bGUKICAgKyBuYXRpdmUKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31364</attachid>
            <date>2009-06-16 12:40:52 -0700</date>
            <delta_ts>2009-06-17 04:32:17 -0700</delta_ts>
            <desc>New patch.</desc>
            <filename>25711-new.txt</filename>
            <type>text/plain</type>
            <size>10461</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDczMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzQgQEAKKzIwMDktMDYtMTYgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmc/c2hvd19idWcuY2dp
P2lkPTI1NzExOiBJZiB0aGUgcGFnZSBpcyByZWZyZXNoZWQgd2hpbHN0IGEgZGF0YWJhc2UgdHJh
bnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBkYXRhYmFzZSByZW1haW5zIGxvY2tlZCB1bnRp
bCB0aGUgYnJvd3NlciBpcyBzaHV0IGRvd24uCisKKyAgICAgICAgVGVzdDogc3RvcmFnZS9kYXRh
YmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNl
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpwZXJmb3JtT3BlbkFuZFZlcmlmeSk6
IEluc3RhbGwgYSBidXN5IHRpbWVvdXQgc28gdGhhdCB0cmFuc2FjdGlvbnMgb24gdGhlIG5ldyBw
YWdlIGNhbiB3YWl0IGZvciBhbnkgb2xkIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSBpbnN0ZWFk
IG9mIGZhaWxpbmcgaW1tZWRpYXRlbHkuCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZS5oOgor
ICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
RGF0YWJhc2VUaHJlYWQ6OmRhdGFiYXNlVGhyZWFkKTogQmVmb3JlIHRoZSBkYXRhYmFzZSB0aHJl
YWQgdGVybWluYXRlcywgY2xvc2UgYW55IGRhdGFiYXNlcyB0aGF0IHJhbiB0cmFuc2FjdGlvbnMg
aW4gdGhpcyB0aHJlYWQuCisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRocmVhZDo6cmVjb3Jk
T3BlbkRhdGFiYXNlKTogUmVjb3JkcyBhIGRhdGFiYXNlIHRoYXQgZXhlY3V0ZWQgYSB0cmFuc2Fj
dGlvbiBpbiB0aGlzIHRocmVhZC4KKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpz
Y2hlZHVsZVRhc2spOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpz
Y2hlZHVsZUltbWVkaWF0ZVRhc2spOiBkaXR0by4KKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNl
VGhyZWFkLmg6CisKKzIwMDktMDYtMTYgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29tPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRlc3Q6IHN0
b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAorCisgICAgICAgICogc3RvcmFn
ZS9EYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6cGVyZm9ybU9wZW5B
bmRWZXJpZnkpOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2UuaDoKKyAgICAgICAgKiBzdG9y
YWdlL0RhdGFiYXNlVGhyZWFkLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFk
OjpkYXRhYmFzZVRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRocmVhZDo6c2No
ZWR1bGVUYXNrKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpzY2hlZHVsZUlt
bWVkaWF0ZVRhc2spOgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuaDoKKwogMjAw
OS0wNi0xNiAgUGllcnJlIGQnSGVyYmVtb250ICA8cGRoZXJiZW1vbnRAYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IEpvaG4gU3VsbGl2YW4KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9E
YXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAko
cmV2aXNpb24gNDQ3MjApCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00MjgsNiArNDI4LDcgQEAgYm9vbCBEYXRhYmFzZTo6cGVyZm9ybU9wZW5BbmRW
ZXJpZnkoRXhjZQogCiAgICAgQVNTRVJUKG1fZGF0YWJhc2VBdXRob3JpemVyKTsKICAgICBtX3Nx
bGl0ZURhdGFiYXNlLnNldEF1dGhvcml6ZXIobV9kYXRhYmFzZUF1dGhvcml6ZXIpOworICAgIG1f
c3FsaXRlRGF0YWJhc2Uuc2V0QnVzeVRpbWVvdXQoTUFYX1NRTElURV9CVVNZX1dBSVRfVElNRSk7
CiAKICAgICBpZiAoIW1fc3FsaXRlRGF0YWJhc2UudGFibGVFeGlzdHMoZGF0YWJhc2VJbmZvVGFi
bGVOYW1lKCkpKSB7CiAgICAgICAgIGlmICghbV9zcWxpdGVEYXRhYmFzZS5leGVjdXRlQ29tbWFu
ZCgiQ1JFQVRFIFRBQkxFICIgKyBkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSArICIgKGtleSBURVhU
IE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsdmFs
dWUgVEVYVCBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKTsiKSkgewpJbmRleDogV2ViQ29yZS9z
dG9yYWdlL0RhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
LmgJKHJldmlzaW9uIDQ0NzIwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTE0NCw2ICsxNDQsOSBAQCBwcml2YXRlOgogICAgIFNRTGl0ZURhdGFiYXNl
IG1fc3FsaXRlRGF0YWJhc2U7CiAgICAgUmVmUHRyPERhdGFiYXNlQXV0aG9yaXplcj4gbV9kYXRh
YmFzZUF1dGhvcml6ZXI7CiAKKyAgICAvLyBJZiB3ZSBzbGVlcCBmb3IgbW9yZSB0aGUgMzAgc2Vj
b25kcyB3aGlsZSBibG9ja2VkIG9uIFNRTElURV9CVVNZLCBnaXZlIHVwLgorICAgIHN0YXRpYyBj
b25zdCBpbnQgTUFYX1NRTElURV9CVVNZX1dBSVRfVElNRSA9IDMwMDAwOworCiAjaWZuZGVmIE5E
RUJVRwogICAgIFN0cmluZyBkYXRhYmFzZURlYnVnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2Vj
dXJpdHlPcmlnaW4tPnRvU3RyaW5nKCkgKyAiOjoiICsgbV9uYW1lOyB9CiAjZW5kaWYKSW5kZXg6
IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcAkocmV2aXNpb24gNDQ3MjApCisrKyBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDIsMTkgKzEw
MiwzOCBAQCB2b2lkKiBEYXRhYmFzZVRocmVhZDo6ZGF0YWJhc2VUaHJlYWQoKQogICAgIC8vIERl
dGFjaCB0aGUgdGhyZWFkIHNvIGl0cyByZXNvdXJjZXMgYXJlIG5vIGxvbmdlciBvZiBhbnkgY29u
Y2VybiB0byBhbnlvbmUgZWxzZQogICAgIGRldGFjaFRocmVhZChtX3RocmVhZElEKTsKIAorICAg
IC8vIENsb3NlIHRoZSBkYXRhYmFzZXMgdGhhdCB3ZSByYW4gdHJhbnNhY3Rpb25zIG9uLiBUaGlz
IGVuc3VyZXMgdGhhdCBpZiBhbnkgdHJhbnNhY3Rpb25zIGFyZSBzdGlsbCBvcGVuLCB0aGV5IGFy
ZSByb2xsZWQgYmFjayBhbmQgd2UgZG9uJ3QgbGVhdmUgdGhlIGRhdGFiYXNlIGluIGFuCisgICAg
Ly8gaW5jb25zaXN0ZW50IG9yIGxvY2tlZCBzdGF0ZS4KKyAgICBEYXRhYmFzZVNldDo6aXRlcmF0
b3IgZW5kID0gbV9kYXRhYmFzZXMuZW5kKCk7CisgICAgZm9yIChEYXRhYmFzZVNldDo6aXRlcmF0
b3IgaXQgPSBtX2RhdGFiYXNlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAg
RGF0YWJhc2UqIGRhdGFiYXNlID0gKml0OworICAgICAgICBkYXRhYmFzZS0+Y2xvc2UoKTsKKyAg
ICAgICAgZGF0YWJhc2UtPmRlcmVmKCk7CisgICAgfQorCiAgICAgLy8gQ2xlYXIgdGhlIHNlbGYg
cmVmcHRyLCBwb3NzaWJseSByZXN1bHRpbmcgaW4gZGVsZXRpb24KICAgICBtX3NlbGZSZWYgPSAw
OwogCiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZE9wZW5E
YXRhYmFzZShEYXRhYmFzZSogZGF0YWJhc2UpIHsKKyAgICBBU1NFUlQoZGF0YWJhc2UpOworICAg
IGlmICghbV9kYXRhYmFzZXMuY29udGFpbnMoZGF0YWJhc2UpKSB7CisgICAgICAgIGRhdGFiYXNl
LT5yZWYoKTsKKyAgICAgICAgbV9kYXRhYmFzZXMuYWRkKGRhdGFiYXNlKTsKKyAgICB9Cit9CisK
IHZvaWQgRGF0YWJhc2VUaHJlYWQ6OnNjaGVkdWxlVGFzayhQYXNzUmVmUHRyPERhdGFiYXNlVGFz
az4gdGFzaykKIHsKKyAgICByZWNvcmRPcGVuRGF0YWJhc2UodGFzay0+ZGF0YWJhc2UoKSk7CiAg
ICAgbV9xdWV1ZS5hcHBlbmQodGFzayk7CiB9CiAKIHZvaWQgRGF0YWJhc2VUaHJlYWQ6OnNjaGVk
dWxlSW1tZWRpYXRlVGFzayhQYXNzUmVmUHRyPERhdGFiYXNlVGFzaz4gdGFzaykKIHsKKyAgICBy
ZWNvcmRPcGVuRGF0YWJhc2UodGFzay0+ZGF0YWJhc2UoKSk7CiAgICAgbV9xdWV1ZS5wcmVwZW5k
KHRhc2spOwogfQogCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuaAkocmV2aXNpb24gNDQ3
MjApCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuaAkod29ya2luZyBjb3B5KQpA
QCAtNjIsMTEgKzYyLDE1IEBAIHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQqIGRhdGFiYXNlVGhy
ZWFkU3RhcnQodm9pZCopOwogICAgIHZvaWQqIGRhdGFiYXNlVGhyZWFkKCk7CiAKKyAgICB2b2lk
IHJlY29yZE9wZW5EYXRhYmFzZShEYXRhYmFzZSopOworCiAgICAgTXV0ZXggbV90aHJlYWRDcmVh
dGlvbk11dGV4OwogICAgIFRocmVhZElkZW50aWZpZXIgbV90aHJlYWRJRDsKICAgICBSZWZQdHI8
RGF0YWJhc2VUaHJlYWQ+IG1fc2VsZlJlZjsKIAogICAgIE1lc3NhZ2VRdWV1ZTxSZWZQdHI8RGF0
YWJhc2VUYXNrPiA+IG1fcXVldWU7CisgICAgdHlwZWRlZiBIYXNoU2V0PERhdGFiYXNlKj4gRGF0
YWJhc2VTZXQ7CisgICAgRGF0YWJhc2VTZXQgbV9kYXRhYmFzZXM7CiB9OwogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
TGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA0NDczMSkKKysrIExheW91dFRlc3RzL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDExIEBACisyMDA5LTA2LTE2ICBCZW4g
TXVyZG9jaCAgPGJlbm1AZ29vZ2xlLmNvbT4KKworICAgICAgICBUZXN0IGZvciBidWcgMjU3MTE6
IElmIHRoZSBwYWdlIGlzIHJlZnJlc2hlZCB3aGlsc3QgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBp
cyBpbiBwcm9ncmVzcywgdGhlIGRhdGFiYXNlIHJlbWFpbnMgbG9ja2VkIHVudGlsIHRoZSBicm93
c2VyIGlzIGNsb3NlZC4KKworICAgICAgICAqIHN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1y
ZWxvYWQtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxv
Y2stYWZ0ZXItcmVsb2FkLmh0bWw6IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvcmVzb3VyY2Vz
L2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbDogQWRkZWQuCisKIDIwMDktMDYtMTYg
IFhhbiBMb3BleiAgPHhsb3BlekBpZ2FsaWEuY29tPgogCiAgICAgICAgIERpc2FibGUgYW5vdGhl
ciBuZXcgdGVzdC4KSW5kZXg6IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRl
ci1yZWxvYWQtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2Uv
ZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50
eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMyBAQAorSW5zZXJ0aW5nIHNvbWUgZGF0YQorVGVz
dCBwYXJ0IDIgQ29tcGxldGUKKwoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0VGVzdHMvc3Rv
cmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQKX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpB
ZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoKSW5kZXg6IExheW91dFRlc3RzL3N0b3Jh
Z2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzEgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0Pgor
dmFyIGRhdGFiYXNlOwordmFyIHRpbWVvdXQ7CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQorewor
ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3Nh
Z2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiVGVz
dCBwYXJ0IDEgQ29tcGxldGUiKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVy
KQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0
aW9uIGVycm9yRnVuY3Rpb24odHgsIGVycm9yKQoreworICAgIGNsZWFyVGltZW91dCh0aW1lb3V0
KTsKKyAgICBsb2coIlRlc3QgZmFpbGVkIC0gIiArIGVycm9yLm1lc3NhZ2UpOworICAgIGZpbmlz
aFRlc3QoKTsKK30KKworZnVuY3Rpb24gYWRkRGF0YShkYikKK3sKKyAgICBkYi50cmFuc2FjdGlv
bihmdW5jdGlvbih0eCkgeyAKKyAgICAgICAgbG9nKCJJbnNlcnRpbmcgc29tZSBkYXRhIik7Cisg
ICAgICAgIC8vIEluc2VydCBhIGxhcmdlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2lsbCB0YWtlIGEg
bGl0dGxlIHdoaWxlIHRvIHJ1bi4gU2NoZWR1bGUgYSB0aW1vdXQgdG8gcnVuIHRoYXQgd2lsbCBs
b2FkIGEgbmV3IHBhZ2UKKyAgICAgICAgLy8gd2hpbHN0IHRoZSB0cmFuc2FjdGlvbiBpcyBzdGls
bCBpbiBwcm9ncmVzcywgaW50ZXJydXB0aW5nIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBzaG91bGQg
bm90IGxlYXZlIHRoZSBkYXRhYmFzZSBsb2NrZWQgYW5kIG9uCisgICAgICAgIC8vIHRoZSBuZXh0
IHBhZ2Ugd2Ugc2hvdWxkIGJlIGFibGUgdG8gaW5zZXJ0IHNvbWUgbW9yZSBkYXRhLgorICAgICAg
ICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAo
cmFuZG9tQmxvYig1MjQyMDAgKSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJv
ckZ1bmN0aW9uKTsKKyAgICAgICAgbG9jYXRpb24uaHJlZiA9ICIuL3Jlc291cmNlcy9kYXRhYmFz
ZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwiOworICAgIH0sIGVycm9yRnVuY3Rpb24sIGZ1bmN0
aW9uKCkgeyAKKyAgICAgICAgZmluaXNoVGVzdCgpOworICAgIH0pOworfQorCitmdW5jdGlvbiBy
dW5UZXN0KCkKK3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLmNsZWFyQWxsRGF0YWJhc2VzKCk7CisgICAgICAgIGxh
eW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKyAgICAKKyAgICB0cnkgeworICAgICAgICBk
YXRhYmFzZSA9IG9wZW5EYXRhYmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVzdCBm
b3IgZGF0YWJhc2UgbG9ja2luZyIsIDUyNDI4ODApOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAg
ICAgbG9nKCJFcnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7CisgICAgICAgIGZpbmlz
aFRlc3QoKTsKKyAgICB9CisgICAgCisgICAgZGF0YWJhc2UudHJhbnNhY3Rpb24oZnVuY3Rpb24o
dHgpIHsKKyAgICAgICAgbG9nKCJBZGRpbmcgYSB0YWJsZSIpOworICAgICAgICB0eC5leGVjdXRl
U3FsKCJDUkVBVEUgVEFCTEUgRGF0YVRlc3QgKHRlc3REYXRhKSIsIFtdLCBmdW5jdGlvbih0eCwg
cmVzdWx0KSB7IH0sIGVycm9yRnVuY3Rpb24pOyAKKyAgICB9LCBlcnJvckZ1bmN0aW9uLCBmdW5j
dGlvbigpIHsgCisgICAgICAgIGFkZERhdGEoZGF0YWJhc2UpOyAKKyAgICB9KTsKK30KKworPC9z
Y3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KKzxwcmUgaWQ9ImNv
bnNvbGUiPgorPC9wcmU+Cis8L2JvZHk+CisKKzwvaHRtbD4KClByb3BlcnR5IGNoYW5nZXMgb246
IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbApfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogTGF5b3V0VGVz
dHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2st
YWZ0ZXItcmVsb2FkLTIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL3N0b3JhZ2Uv
cmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw1OSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQ+Cit2YXIgZGF0YWJhc2U7
CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9u
IGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiVGVzdCBwYXJ0IDIgQ29tcGxldGUiKTsKKyAgICBp
ZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJv
bGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIGVycm9yRnVuY3Rpb24odHgsIGVycm9y
KQoreworICAgIGxvZygiVGVzdCBmYWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7CisgICAgZmlu
aXNoVGVzdCgpOworfQorCitmdW5jdGlvbiBhZGREYXRhKGRiKQoreworICAgIGRiLnRyYW5zYWN0
aW9uKGZ1bmN0aW9uKHR4KSB7IAorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRhdGEiKTsK
KworICAgICAgICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEp
IFZBTFVFUyAoPykiLCBbIkEiXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0
aW9uKTsKKyAgICB9LCBmdW5jdGlvbigpe30sIGZ1bmN0aW9uKCkgeyAKKyAgICAgICAgZmluaXNo
VGVzdCgpOworICAgIH0pOworfQorCitmdW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBpZiAod2lu
ZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVy
LmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9u
ZSgpOworICAgIH0KKyAgICAKKyAgICB0cnkgeworICAgICAgICBkYXRhYmFzZSA9IG9wZW5EYXRh
YmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVzdCBmb3IgZGF0YWJhc2UgbG9ja2lu
ZyIsIDUyNDI4ODApOworICAgICAgICBhZGREYXRhKGRhdGFiYXNlKTsKKyAgICB9IGNhdGNoKGUp
IHsKKyAgICAgICAgbG9nKCJFcnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7CisgICAg
ICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9k
eSBvbmxvYWQ9InJ1blRlc3QoKSI+Cis8cHJlIGlkPSJjb25zb2xlIj4KKzwvcHJlPgorPC9ib2R5
PgorCis8L2h0bWw+CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jl
c291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwKX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRl
ZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31408</attachid>
            <date>2009-06-17 04:32:17 -0700</date>
            <delta_ts>2009-06-26 08:40:35 -0700</delta_ts>
            <desc>New patch.</desc>
            <filename>25711-new.txt</filename>
            <type>text/plain</type>
            <size>11041</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDc1NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjMgQEAKKzIwMDktMDYtMTcgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmc/c2hvd19idWcuY2dp
P2lkPTI1NzExOiBJZiB0aGUgcGFnZSBpcyByZWZyZXNoZWQgd2hpbHN0IGEgZGF0YWJhc2UgdHJh
bnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBkYXRhYmFzZSByZW1haW5zIGxvY2tlZCB1bnRp
bCB0aGUgYnJvd3NlciBpcyBzaHV0IGRvd24uCisKKyAgICAgICAgVGVzdDogc3RvcmFnZS9kYXRh
YmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNl
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpEYXRhYmFzZSk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZTo6Y2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OnBl
cmZvcm1PcGVuQW5kVmVyaWZ5KToKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlLmg6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6b3BlbmVkKTogcmV0dXJuIHRydWUgaWZmIHRoZSBkYXRh
YmFzZSBoYXMgbm90IGJlZW4gY2xvc2VkLgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUaHJl
YWQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUaHJlYWQ6OmRhdGFiYXNlVGhyZWFk
KTogQmVmb3JlIHRoZSBkYXRhYmFzZSB0aHJlYWQgdGVybWluYXRlcywgY2xvc2UgYW55IGRhdGFi
YXNlcyB0aGF0IHJhbiB0cmFuc2FjdGlvbnMgaW4gdGhpcyB0aHJlYWQuCisgICAgICAgIChXZWJD
b3JlOjpEYXRhYmFzZVRocmVhZDo6cmVjb3JkRGF0YWJhc2VPcGVuKTogUmVjb3JkcyBhIGRhdGFi
YXNlIHRoYXQgZXhlY3V0ZWQgYSB0cmFuc2FjdGlvbiBpbiB0aGlzIHRocmVhZC4KKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpzY2hlZHVsZVRhc2spOiBkaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpzY2hlZHVsZUltbWVkaWF0ZVRhc2spOiBkaXR0by4K
KyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpyZWNvcmREYXRhYmFzZUNsb3NlZCk6
IFJlbW92ZXMgYSBkYXRhYmFzZSBmcm9tIHRoZSBzZXQgb2Ygb3BlbiBkYXRhYmFzZXMuCisgICAg
ICAgICogc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5oOgorCiAyMDA5LTA2LTE3ICBHYXZpbiBCYXJy
YWNsb3VnaCAgPGJhcnJhY2xvdWdoQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBP
bGl2ZXIgSHVudC4KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAkocmV2aXNpb24gNDQ3MjApCisrKyBX
ZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsNiArMTMy
LDcgQEAgRGF0YWJhc2U6OkRhdGFiYXNlKERvY3VtZW50KiBkb2N1bWVudCwgYwogICAgICwgbV9l
eHBlY3RlZFZlcnNpb24oZXhwZWN0ZWRWZXJzaW9uKQogICAgICwgbV9kZWxldGVkKGZhbHNlKQog
ICAgICwgbV9zdG9wcGVkKGZhbHNlKQorICAgICwgbV9vcGVuKHRydWUpCiB7CiAgICAgQVNTRVJU
KGRvY3VtZW50KTsKICAgICBtX3NlY3VyaXR5T3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5T3Jp
Z2luKCk7CkBAIC0zMTcsNiArMzE4LDcgQEAgdm9pZCBEYXRhYmFzZTo6bWFya0FzRGVsZXRlZEFu
ZENsb3NlKCkKIHZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKIHsKICAgICBtX3NxbGl0ZURhdGFiYXNl
LmNsb3NlKCk7CisgICAgbV9vcGVuID0gZmFsc2U7CiB9CiAKIHZvaWQgRGF0YWJhc2U6OnN0b3Ao
KQpAQCAtNDI4LDYgKzQzMCw3IEBAIGJvb2wgRGF0YWJhc2U6OnBlcmZvcm1PcGVuQW5kVmVyaWZ5
KEV4Y2UKIAogICAgIEFTU0VSVChtX2RhdGFiYXNlQXV0aG9yaXplcik7CiAgICAgbV9zcWxpdGVE
YXRhYmFzZS5zZXRBdXRob3JpemVyKG1fZGF0YWJhc2VBdXRob3JpemVyKTsKKyAgICBtX3NxbGl0
ZURhdGFiYXNlLnNldEJ1c3lUaW1lb3V0KE1BWF9TUUxJVEVfQlVTWV9XQUlUX1RJTUUpOwogCiAg
ICAgaWYgKCFtX3NxbGl0ZURhdGFiYXNlLnRhYmxlRXhpc3RzKGRhdGFiYXNlSW5mb1RhYmxlTmFt
ZSgpKSkgewogICAgICAgICBpZiAoIW1fc3FsaXRlRGF0YWJhc2UuZXhlY3V0ZUNvbW1hbmQoIkNS
RUFURSBUQUJMRSAiICsgZGF0YWJhc2VJbmZvVGFibGVOYW1lKCkgKyAiIChrZXkgVEVYVCBOT1Qg
TlVMTCBPTiBDT05GTElDVCBGQUlMIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLHZhbHVlIFRF
WFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7IikpIHsKSW5kZXg6IFdlYkNvcmUvc3RvcmFn
ZS9EYXRhYmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCShy
ZXZpc2lvbiA0NDcyMCkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xMDAsNiArMTAwLDcgQEAgcHVibGljOgogICAgIGJvb2wgZGVsZXRlZCgpIGNvbnN0
IHsgcmV0dXJuIG1fZGVsZXRlZDsgfQogCiAgICAgdm9pZCBjbG9zZSgpOworICAgIGJvb2wgb3Bl
bmVkKCkgY29uc3QgeyByZXR1cm4gbV9vcGVuOyB9CiAgICAgCiAgICAgdm9pZCBzdG9wKCk7CiAg
ICAgYm9vbCBzdG9wcGVkKCkgY29uc3QgeyByZXR1cm4gbV9zdG9wcGVkOyB9CkBAIC0xNDEsOSAr
MTQyLDE0IEBAIHByaXZhdGU6CiAgICAgCiAgICAgYm9vbCBtX3N0b3BwZWQ7CiAKKyAgICBib29s
IG1fb3BlbjsKKwogICAgIFNRTGl0ZURhdGFiYXNlIG1fc3FsaXRlRGF0YWJhc2U7CiAgICAgUmVm
UHRyPERhdGFiYXNlQXV0aG9yaXplcj4gbV9kYXRhYmFzZUF1dGhvcml6ZXI7CiAKKyAgICAvLyBJ
ZiB3ZSBzbGVlcCBmb3IgbW9yZSB0aGUgMzAgc2Vjb25kcyB3aGlsZSBibG9ja2VkIG9uIFNRTElU
RV9CVVNZLCBnaXZlIHVwLgorICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX1NRTElURV9CVVNZX1dB
SVRfVElNRSA9IDMwMDAwOworCiAjaWZuZGVmIE5ERUJVRwogICAgIFN0cmluZyBkYXRhYmFzZURl
YnVnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2VjdXJpdHlPcmlnaW4tPnRvU3RyaW5nKCkgKyAi
OjoiICsgbV9uYW1lOyB9CiAjZW5kaWYKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRo
cmVhZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNw
cAkocmV2aXNpb24gNDQ3MjApCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC05NCw2ICs5NCwxMiBAQCB2b2lkKiBEYXRhYmFzZVRocmVhZDo6
ZGF0YWJhc2VUaHJlYWQoKQogCiAgICAgICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7CiAKKyAgICAg
ICAgRGF0YWJhc2UqIGRhdGFiYXNlID0gdGFzay0+ZGF0YWJhc2UoKTsKKyAgICAgICAgaWYgKGRh
dGFiYXNlLT5vcGVuZWQoKSkgCisgICAgICAgICAgICByZWNvcmREYXRhYmFzZU9wZW4oZGF0YWJh
c2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWNvcmREYXRhYmFzZUNsb3NlZChkYXRh
YmFzZSk7CisKICAgICAgICAgcG9vbC5jeWNsZSgpOwogICAgIH0KIApAQCAtMTAyLDEyICsxMDgs
MzIgQEAgdm9pZCogRGF0YWJhc2VUaHJlYWQ6OmRhdGFiYXNlVGhyZWFkKCkKICAgICAvLyBEZXRh
Y2ggdGhlIHRocmVhZCBzbyBpdHMgcmVzb3VyY2VzIGFyZSBubyBsb25nZXIgb2YgYW55IGNvbmNl
cm4gdG8gYW55b25lIGVsc2UKICAgICBkZXRhY2hUaHJlYWQobV90aHJlYWRJRCk7CiAKKyAgICAv
LyBDbG9zZSB0aGUgZGF0YWJhc2VzIHRoYXQgd2UgcmFuIHRyYW5zYWN0aW9ucyBvbi4gVGhpcyBl
bnN1cmVzIHRoYXQgaWYgYW55IHRyYW5zYWN0aW9ucyBhcmUgc3RpbGwgb3BlbiwgdGhleSBhcmUg
cm9sbGVkIGJhY2sgYW5kIHdlIGRvbid0IGxlYXZlIHRoZSBkYXRhYmFzZSBpbiBhbgorICAgIC8v
IGluY29uc2lzdGVudCBvciBsb2NrZWQgc3RhdGUuCisgICAgRGF0YWJhc2VTZXQ6Oml0ZXJhdG9y
IGVuZCA9IG1fZGF0YWJhc2VzLmVuZCgpOworICAgIGZvciAoRGF0YWJhc2VTZXQ6Oml0ZXJhdG9y
IGl0ID0gbV9kYXRhYmFzZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAoKml0
KS0+Y2xvc2UoKTsKKworICAgIG1fZGF0YWJhc2VzLmNsZWFyKCk7CisKICAgICAvLyBDbGVhciB0
aGUgc2VsZiByZWZwdHIsIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBkZWxldGlvbgogICAgIG1fc2Vs
ZlJlZiA9IDA7CiAKICAgICByZXR1cm4gMDsKIH0KIAordm9pZCBEYXRhYmFzZVRocmVhZDo6cmVj
b3JkRGF0YWJhc2VPcGVuKERhdGFiYXNlKiBkYXRhYmFzZSkgeworICAgIEFTU0VSVChkYXRhYmFz
ZSk7CisgICAgaWYgKCFtX2RhdGFiYXNlcy5jb250YWlucyhkYXRhYmFzZSkpCisgICAgICAgIG1f
ZGF0YWJhc2VzLmFkZChkYXRhYmFzZSk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29y
ZERhdGFiYXNlQ2xvc2VkKERhdGFiYXNlKiBkYXRhYmFzZSkgeworICAgIEFTU0VSVChkYXRhYmFz
ZSk7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VzLmNvbnRhaW5zKGRhdGFiYXNlKSk7CisgICAgbV9k
YXRhYmFzZXMucmVtb3ZlKGRhdGFiYXNlKTsKK30KKwogdm9pZCBEYXRhYmFzZVRocmVhZDo6c2No
ZWR1bGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNrKQogewogICAgIG1fcXVldWUu
YXBwZW5kKHRhc2spOwpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmgJKHJldmlzaW9uIDQ0
NzIwKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmgJKHdvcmtpbmcgY29weSkK
QEAgLTYyLDExICs2MiwxNiBAQCBwcml2YXRlOgogICAgIHN0YXRpYyB2b2lkKiBkYXRhYmFzZVRo
cmVhZFN0YXJ0KHZvaWQqKTsKICAgICB2b2lkKiBkYXRhYmFzZVRocmVhZCgpOwogCisgICAgdm9p
ZCByZWNvcmREYXRhYmFzZU9wZW4oRGF0YWJhc2UqKTsKKyAgICB2b2lkIHJlY29yZERhdGFiYXNl
Q2xvc2VkKERhdGFiYXNlKik7CisKICAgICBNdXRleCBtX3RocmVhZENyZWF0aW9uTXV0ZXg7CiAg
ICAgVGhyZWFkSWRlbnRpZmllciBtX3RocmVhZElEOwogICAgIFJlZlB0cjxEYXRhYmFzZVRocmVh
ZD4gbV9zZWxmUmVmOwogCiAgICAgTWVzc2FnZVF1ZXVlPFJlZlB0cjxEYXRhYmFzZVRhc2s+ID4g
bV9xdWV1ZTsKKyAgICB0eXBlZGVmIEhhc2hTZXQ8UmVmUHRyPERhdGFiYXNlPiA+IERhdGFiYXNl
U2V0OworICAgIERhdGFiYXNlU2V0IG1fZGF0YWJhc2VzOwogfTsKIAogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNDQ3NTcpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMSBAQAorMjAwOS0wNi0xNyAgQmVuIE11cmRv
Y2ggIDxiZW5tQGdvb2dsZS5jb20+CisKKyAgICAgICAgVGVzdCBmb3IgYnVnIDI1NzExOiBJZiB0
aGUgcGFnZSBpcyByZWZyZXNoZWQgd2hpbHN0IGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gaXMgaW4g
cHJvZ3Jlc3MsIHRoZSBkYXRhYmFzZSByZW1haW5zIGxvY2tlZCB1bnRpbCB0aGUgYnJvd3NlciBp
cyBjbG9zZWQuCisKKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2Fk
LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFm
dGVyLXJlbG9hZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3Jlc291cmNlcy9kYXRh
YmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWw6IEFkZGVkLgorCiAyMDA5LTA2LTE3ICBEYXZp
ZCBMZXZpbiAgPGxldmluQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFksIGxheW91dCB0ZXN0cyBmaXguCkluZGV4OiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNl
LWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gMCkKKysrIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQt
ZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMgQEAKK0luc2VydGluZyBzb21l
IGRhdGEKK1Rlc3QgcGFydCAyIENvbXBsZXRlCisKClByb3BlcnR5IGNoYW5nZXMgb246IExheW91
dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0Cl9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCkluZGV4OiBMYXlvdXRU
ZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCShy
ZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJl
bG9hZC5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDcxIEBACis8aHRtbD4KKzxoZWFkPgor
PHNjcmlwdD4KK3ZhciBkYXRhYmFzZTsKK3ZhciB0aW1lb3V0OworCitmdW5jdGlvbiBsb2cobWVz
c2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29uc29sZSIpLmlubmVySFRN
TCArPSBtZXNzYWdlICsgIjxicj4iOworfQorCitmdW5jdGlvbiBmaW5pc2hUZXN0KCkKK3sKKyAg
ICBsb2coIlRlc3QgcGFydCAxIENvbXBsZXRlIik7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0
Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOwor
fQorCitmdW5jdGlvbiBlcnJvckZ1bmN0aW9uKHR4LCBlcnJvcikKK3sKKyAgICBjbGVhclRpbWVv
dXQodGltZW91dCk7CisgICAgbG9nKCJUZXN0IGZhaWxlZCAtICIgKyBlcnJvci5tZXNzYWdlKTsK
KyAgICBmaW5pc2hUZXN0KCk7Cit9CisKK2Z1bmN0aW9uIGFkZERhdGEoZGIpCit7CisgICAgZGIu
dHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsgCisgICAgICAgIGxvZygiSW5zZXJ0aW5nIHNvbWUg
ZGF0YSIpOworICAgICAgICAvLyBJbnNlcnQgYSBsYXJnZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdp
bGwgdGFrZSBhIGxpdHRsZSB3aGlsZSB0byBydW4uIFNjaGVkdWxlIGEgdGltb3V0IHRvIHJ1biB0
aGF0IHdpbGwgbG9hZCBhIG5ldyBwYWdlCisgICAgICAgIC8vIHdoaWxzdCB0aGUgdHJhbnNhY3Rp
b24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsIGludGVycnVwdGluZyB0aGUgdHJhbnNhY3Rpb24uIFRo
aXMgc2hvdWxkIG5vdCBsZWF2ZSB0aGUgZGF0YWJhc2UgbG9ja2VkIGFuZCBvbgorICAgICAgICAv
LyB0aGUgbmV4dCBwYWdlIHdlIHNob3VsZCBiZSBhYmxlIHRvIGluc2VydCBzb21lIG1vcmUgZGF0
YS4KKyAgICAgICAgdHguZXhlY3V0ZVNxbCgiSU5TRVJUIElOVE8gRGF0YVRlc3QgKHRlc3REYXRh
KSBWQUxVRVMgKHJhbmRvbUJsb2IoNTI0MjAwICkpIiwgW10sIGZ1bmN0aW9uKHR4LCByZXN1bHQp
IHsgfSwgZXJyb3JGdW5jdGlvbik7CisgICAgICAgIGxvY2F0aW9uLmhyZWYgPSAiLi9yZXNvdXJj
ZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sIjsKKyAgICB9LCBlcnJvckZ1bmN0
aW9uLCBmdW5jdGlvbigpIHsgCisgICAgICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9KTsKK30KKwor
ZnVuY3Rpb24gcnVuVGVzdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxl
cikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5jbGVhckFsbERhdGFiYXNlcygpOwor
ICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91
dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisgICAgCisgICAgdHJ5IHsK
KyAgICAgICAgZGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3QiLCAiMS4w
IiwgIlRlc3QgZm9yIGRhdGFiYXNlIGxvY2tpbmciLCA1MjQyODgwKTsKKyAgICB9IGNhdGNoIChl
KSB7CisgICAgICAgIGxvZygiRXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBkYXRhYmFzZSIpOworICAg
ICAgICBmaW5pc2hUZXN0KCk7CisgICAgfQorICAgIAorICAgIGRhdGFiYXNlLnRyYW5zYWN0aW9u
KGZ1bmN0aW9uKHR4KSB7CisgICAgICAgIGxvZygiQWRkaW5nIGEgdGFibGUiKTsKKyAgICAgICAg
dHguZXhlY3V0ZVNxbCgiQ1JFQVRFIFRBQkxFIERhdGFUZXN0ICh0ZXN0RGF0YSkiLCBbXSwgZnVu
Y3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0aW9uKTsgCisgICAgfSwgZXJyb3JGdW5j
dGlvbiwgZnVuY3Rpb24oKSB7IAorICAgICAgICBhZGREYXRhKGRhdGFiYXNlKTsgCisgICAgfSk7
Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InJ1blRlc3QoKSI+Cis8
cHJlIGlkPSJjb25zb2xlIj4KKzwvcHJlPgorPC9ib2R5PgorCis8L2h0bWw+CgpQcm9wZXJ0eSBj
aGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2Fk
Lmh0bWwKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoKSW5kZXg6
IExheW91dFRlc3RzL3N0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2Fk
LTIuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRh
YmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNTkgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0PgordmFy
IGRhdGFiYXNlOworCitmdW5jdGlvbiBsb2cobWVzc2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgiY29uc29sZSIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4iOworfQor
CitmdW5jdGlvbiBmaW5pc2hUZXN0KCkKK3sKKyAgICBsb2coIlRlc3QgcGFydCAyIENvbXBsZXRl
Iik7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKKyAgICAgICAgbGF5b3V0
VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOworfQorCitmdW5jdGlvbiBlcnJvckZ1bmN0aW9u
KHR4LCBlcnJvcikKK3sKKyAgICBsb2coIlRlc3QgZmFpbGVkIC0gIiArIGVycm9yLm1lc3NhZ2Up
OworICAgIGZpbmlzaFRlc3QoKTsKK30KKworZnVuY3Rpb24gYWRkRGF0YShkYikKK3sKKyAgICBk
Yi50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeyAKKyAgICAgICAgbG9nKCJJbnNlcnRpbmcgc29t
ZSBkYXRhIik7CisKKyAgICAgICAgdHguZXhlY3V0ZVNxbCgiSU5TRVJUIElOVE8gRGF0YVRlc3Qg
KHRlc3REYXRhKSBWQUxVRVMgKD8pIiwgWyJBIl0sIGZ1bmN0aW9uKHR4LCByZXN1bHQpIHsgfSwg
ZXJyb3JGdW5jdGlvbik7CisgICAgfSwgZnVuY3Rpb24oKXt9LCBmdW5jdGlvbigpIHsgCisgICAg
ICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gcnVuVGVzdCgpCit7Cisg
ICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndh
aXRVbnRpbERvbmUoKTsKKyAgICB9CisgICAgCisgICAgdHJ5IHsKKyAgICAgICAgZGF0YWJhc2Ug
PSBvcGVuRGF0YWJhc2UoIkRhdGFiYXNlTG9ja1Rlc3QiLCAiMS4wIiwgIlRlc3QgZm9yIGRhdGFi
YXNlIGxvY2tpbmciLCA1MjQyODgwKTsKKyAgICAgICAgYWRkRGF0YShkYXRhYmFzZSk7CisgICAg
fSBjYXRjaChlKSB7CisgICAgICAgIGxvZygiRXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBkYXRhYmFz
ZSIpOworICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgfQorfQorCis8L3NjcmlwdD4KKzwvaGVh
ZD4KKworPGJvZHkgb25sb2FkPSJydW5UZXN0KCkiPgorPHByZSBpZD0iY29uc29sZSI+Cis8L3By
ZT4KKzwvYm9keT4KKworPC9odG1sPgoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0VGVzdHMv
c3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCg==
</data>
<flag name="review"
          id="16073"
          type_id="1"
          status="-"
          setter="koivisto"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31933</attachid>
            <date>2009-06-26 08:08:52 -0700</date>
            <delta_ts>2009-06-26 08:40:16 -0700</delta_ts>
            <desc>New patch based on Antii&apos;s comments.</desc>
            <filename>25711-2506-nex.txt</filename>
            <type>text/plain</type>
            <size>11940</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NTE3OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMDktMDYtMjUgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmc/c2hvd19idWcuY2dp
P2lkPTI1NzExOiBJZiB0aGUgcGFnZSBpcyByZWZyZXNoZWQgd2hpbHN0IGEgZGF0YWJhc2UgdHJh
bnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBkYXRhYmFzZSByZW1haW5zIGxvY2tlZCB1bnRp
bCB0aGUgYnJvd3NlciBpcyBzaHV0IGRvd24uCisKKyAgICAgICAgVGVzdDogc3RvcmFnZS9kYXRh
YmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNl
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpEYXRhYmFzZSk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZTo6Y2xvc2UpOiBhZGQgY29kZSB0byBpbmZvcm0gdGhlIGRhdGFiYXNl
IHRocmVhZCB3ZSd2ZSBjbG9zZWQgdGhlIGRhdGFiYXNlLgorICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZTo6cGVyZm9ybU9wZW5BbmRWZXJpZnkpOiBhZGQgY29kZSB0byBpbmZvcm0gdGhlIGRhdGFi
YXNlIHRocmVhZCB3ZSd2ZSBvcGVuZWQgYSBkYXRhYmFzZS4KKyAgICAgICAgKiBzdG9yYWdlL0Rh
dGFiYXNlLmg6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6b3BlbmVkKTogcmV0dXJuIHRy
dWUgaWZmIHRoZSB1bmRlcmx5aW5nIHNxbGl0ZSBkYXRhYmFzZSBoYXMgYmVlbiBvcGVuZWQgYnV0
IG5vdCBjbG9zZWQuCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpEYXRhYmFzZVRocmVhZDo6ZGF0YWJhc2VUaHJlYWQpOiBCZWZvcmUgdGhl
IGRhdGFiYXNlIHRocmVhZCB0ZXJtaW5hdGVzLCBjbG9zZSBhbnkgZGF0YWJhc2VzIHRoYXQgcmFu
IHRyYW5zYWN0aW9ucyBpbiB0aGlzIHRocmVhZC4KKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNl
VGhyZWFkOjpyZWNvcmREYXRhYmFzZU9wZW4pOiBSZWNvcmRzIGEgZGF0YWJhc2UgdGhhdCBleGVj
dXRlZCBhIHRyYW5zYWN0aW9uIGluIHRoaXMgdGhyZWFkLgorICAgICAgICAoV2ViQ29yZTo6RGF0
YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlQ2xvc2VkKTogUmVtb3ZlcyBhIGRhdGFiYXNlIGZy
b20gdGhlIHNldCBvZiBvcGVuIGRhdGFiYXNlcy4KKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNl
VGhyZWFkLmg6CisKIDIwMDktMDYtMjUgIERpbWl0cmkgR2xhemtvdiAgPGRnbGF6a292QGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBVbnJldmlld2VkLCBidWlsZCBmaXguCkluZGV4OiBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9EYXRh
YmFzZS5jcHAJKHJldmlzaW9uIDQ1MDg3KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNjAsNiArNjAsOSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKKy8vIElmIHdlIHNsZWVwIGZvciBtb3JlIHRoZSAzMCBzZWNvbmRzIHdoaWxlIGJsb2NrZWQg
b24gU1FMSVRFX0JVU1ksIGdpdmUgdXAuCitzdGF0aWMgY29uc3QgaW50IG1heFNxbGl0ZUJ1c3lX
YWl0VGltZSA9IDMwMDAwOworCiBjb25zdCBTdHJpbmcmIERhdGFiYXNlOjpkYXRhYmFzZUluZm9U
YWJsZU5hbWUoKQogewogICAgIERFRklORV9TVEFUSUNfTE9DQUwoU3RyaW5nLCBuYW1lLCAoIl9f
V2ViS2l0RGF0YWJhc2VJbmZvVGFibGVfXyIpKTsKQEAgLTEzMiw2ICsxMzUsNyBAQCBEYXRhYmFz
ZTo6RGF0YWJhc2UoRG9jdW1lbnQqIGRvY3VtZW50LCBjCiAgICAgLCBtX2V4cGVjdGVkVmVyc2lv
bihleHBlY3RlZFZlcnNpb24pCiAgICAgLCBtX2RlbGV0ZWQoZmFsc2UpCiAgICAgLCBtX3N0b3Bw
ZWQoZmFsc2UpCisgICAgLCBtX29wZW5lZChmYWxzZSkKIHsKICAgICBBU1NFUlQoZG9jdW1lbnQp
OwogICAgIG1fc2VjdXJpdHlPcmlnaW4gPSBkb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKTsKQEAg
LTMxNiw3ICszMjAsMTIgQEAgdm9pZCBEYXRhYmFzZTo6bWFya0FzRGVsZXRlZEFuZENsb3NlKCkK
IAogdm9pZCBEYXRhYmFzZTo6Y2xvc2UoKQogewotICAgIG1fc3FsaXRlRGF0YWJhc2UuY2xvc2Uo
KTsKKyAgICBpZiAobV9vcGVuZWQpIHsKKyAgICAgICAgbV9zcWxpdGVEYXRhYmFzZS5jbG9zZSgp
OworICAgICAgICBpZiAobV9kb2N1bWVudC0+ZGF0YWJhc2VUaHJlYWQoKSkKKyAgICAgICAgICAg
IG1fZG9jdW1lbnQtPmRhdGFiYXNlVGhyZWFkKCktPnJlY29yZERhdGFiYXNlQ2xvc2VkKHRoaXMp
OworICAgICAgICBtX29wZW5lZCA9IGZhbHNlOworICAgIH0KIH0KIAogdm9pZCBEYXRhYmFzZTo6
c3RvcCgpCkBAIC00MjYsOCArNDM1LDEzIEBAIGJvb2wgRGF0YWJhc2U6OnBlcmZvcm1PcGVuQW5k
VmVyaWZ5KEV4Y2UKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIG1fb3BlbmVk
ID0gdHJ1ZTsKKyAgICBpZiAobV9kb2N1bWVudC0+ZGF0YWJhc2VUaHJlYWQoKSkKKyAgICAgICAg
bV9kb2N1bWVudC0+ZGF0YWJhc2VUaHJlYWQoKS0+cmVjb3JkRGF0YWJhc2VPcGVuKHRoaXMpOwor
CiAgICAgQVNTRVJUKG1fZGF0YWJhc2VBdXRob3JpemVyKTsKICAgICBtX3NxbGl0ZURhdGFiYXNl
LnNldEF1dGhvcml6ZXIobV9kYXRhYmFzZUF1dGhvcml6ZXIpOworICAgIG1fc3FsaXRlRGF0YWJh
c2Uuc2V0QnVzeVRpbWVvdXQobWF4U3FsaXRlQnVzeVdhaXRUaW1lKTsKIAogICAgIGlmICghbV9z
cWxpdGVEYXRhYmFzZS50YWJsZUV4aXN0cyhkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSkpIHsKICAg
ICAgICAgaWYgKCFtX3NxbGl0ZURhdGFiYXNlLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUg
IiArIGRhdGFiYXNlSW5mb1RhYmxlTmFtZSgpICsgIiAoa2V5IFRFWFQgTk9UIE5VTEwgT04gQ09O
RkxJQ1QgRkFJTCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSx2YWx1ZSBURVhUIE5PVCBOVUxM
IE9OIENPTkZMSUNUIEZBSUwpOyIpKSB7CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2Uu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuaAkocmV2aXNpb24gNDUw
ODcpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTAw
LDYgKzEwMCw3IEBAIHB1YmxpYzoKICAgICBib29sIGRlbGV0ZWQoKSBjb25zdCB7IHJldHVybiBt
X2RlbGV0ZWQ7IH0KIAogICAgIHZvaWQgY2xvc2UoKTsKKyAgICBib29sIG9wZW5lZCgpIGNvbnN0
IHsgcmV0dXJuIG1fb3BlbmVkOyB9CiAgICAgCiAgICAgdm9pZCBzdG9wKCk7CiAgICAgYm9vbCBz
dG9wcGVkKCkgY29uc3QgeyByZXR1cm4gbV9zdG9wcGVkOyB9CkBAIC0xNDEsNiArMTQyLDggQEAg
cHJpdmF0ZToKICAgICAKICAgICBib29sIG1fc3RvcHBlZDsKIAorICAgIGJvb2wgbV9vcGVuZWQ7
CisKICAgICBTUUxpdGVEYXRhYmFzZSBtX3NxbGl0ZURhdGFiYXNlOwogICAgIFJlZlB0cjxEYXRh
YmFzZUF1dGhvcml6ZXI+IG1fZGF0YWJhc2VBdXRob3JpemVyOwogCkluZGV4OiBXZWJDb3JlL3N0
b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9E
YXRhYmFzZVRocmVhZC5jcHAJKHJldmlzaW9uIDQ1MDg3KQorKysgV2ViQ29yZS9zdG9yYWdlL0Rh
dGFiYXNlVGhyZWFkLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTAyLDEyICsxMDIsNDMgQEAgdm9p
ZCogRGF0YWJhc2VUaHJlYWQ6OmRhdGFiYXNlVGhyZWFkKCkKICAgICAvLyBEZXRhY2ggdGhlIHRo
cmVhZCBzbyBpdHMgcmVzb3VyY2VzIGFyZSBubyBsb25nZXIgb2YgYW55IGNvbmNlcm4gdG8gYW55
b25lIGVsc2UKICAgICBkZXRhY2hUaHJlYWQobV90aHJlYWRJRCk7CiAKKyAgICAvLyBDbG9zZSB0
aGUgZGF0YWJhc2VzIHRoYXQgd2UgcmFuIHRyYW5zYWN0aW9ucyBvbi4gVGhpcyBlbnN1cmVzIHRo
YXQgaWYgYW55IHRyYW5zYWN0aW9ucyBhcmUgc3RpbGwgb3BlbiwgdGhleSBhcmUgcm9sbGVkIGJh
Y2sgYW5kIHdlIGRvbid0IGxlYXZlIHRoZSBkYXRhYmFzZSBpbiBhbgorICAgIC8vIGluY29uc2lz
dGVudCBvciBsb2NrZWQgc3RhdGUuCisgICAgeworICAgICAgICBNdXRleExvY2tlciBsb2NrKG1f
b3BlbkRhdGFiYXNlU2V0TXV0ZXgpOworCisgICAgICAgIGlmIChtX29wZW5EYXRhYmFzZVNldC5z
aXplKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBBcyB0aGUgY2FsbCB0byBjbG9zZSB3aWxsIG1v
ZGlmeSB0aGUgb3JpZ2luYWwgc2V0LCB3ZSBtdXN0IHRha2UgYSBjb3B5IHRvIGl0ZXJhdGUgb3Zl
ci4KKyAgICAgICAgICAgIERhdGFiYXNlU2V0IG9wZW5TZXRDb3B5ID0gbV9vcGVuRGF0YWJhc2VT
ZXQ7CisgICAgICAgICAgICBEYXRhYmFzZVNldDo6aXRlcmF0b3IgZW5kID0gb3BlblNldENvcHku
ZW5kKCk7CisgICAgICAgICAgICBmb3IgKERhdGFiYXNlU2V0OjppdGVyYXRvciBpdCA9IG9wZW5T
ZXRDb3B5LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICAgICgqaXQpLT5j
bG9zZSgpOworCisgICAgICAgICAgICBtX29wZW5EYXRhYmFzZVNldC5jbGVhcigpOworICAgICAg
ICB9CisgICAgfQorCiAgICAgLy8gQ2xlYXIgdGhlIHNlbGYgcmVmcHRyLCBwb3NzaWJseSByZXN1
bHRpbmcgaW4gZGVsZXRpb24KICAgICBtX3NlbGZSZWYgPSAwOwogCiAgICAgcmV0dXJuIDA7CiB9
CiAKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlT3BlbihEYXRhYmFzZSogZGF0
YWJhc2UpIHsKKyAgICBBU1NFUlQoZGF0YWJhc2UpOworICAgIE11dGV4TG9ja2VyIGxvY2sobV9v
cGVuRGF0YWJhc2VTZXRNdXRleCk7CisgICAgaWYgKCFtX29wZW5EYXRhYmFzZVNldC5jb250YWlu
cyhkYXRhYmFzZSkpCisgICAgICAgIG1fb3BlbkRhdGFiYXNlU2V0LmFkZChkYXRhYmFzZSk7Cit9
CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlQ2xvc2VkKERhdGFiYXNlKiBk
YXRhYmFzZSkgeworICAgIEFTU0VSVChkYXRhYmFzZSk7CisKKyAgICBNdXRleExvY2tlciBsb2Nr
KG1fb3BlbkRhdGFiYXNlU2V0TXV0ZXgpOworICAgIEFTU0VSVChtX29wZW5EYXRhYmFzZVNldC5j
b250YWlucyhkYXRhYmFzZSkpOworICAgIG1fb3BlbkRhdGFiYXNlU2V0LnJlbW92ZShkYXRhYmFz
ZSk7Cit9CisKIHZvaWQgRGF0YWJhc2VUaHJlYWQ6OnNjaGVkdWxlVGFzayhQYXNzUmVmUHRyPERh
dGFiYXNlVGFzaz4gdGFzaykKIHsKICAgICBtX3F1ZXVlLmFwcGVuZCh0YXNrKTsKSW5kZXg6IFdl
YkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3Rv
cmFnZS9EYXRhYmFzZVRocmVhZC5oCShyZXZpc2lvbiA0NTA4NykKKysrIFdlYkNvcmUvc3RvcmFn
ZS9EYXRhYmFzZVRocmVhZC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1Niw5IEBAIHB1Ymxp
YzoKICAgICB2b2lkIHNjaGVkdWxlSW1tZWRpYXRlVGFzayhQYXNzUmVmUHRyPERhdGFiYXNlVGFz
az4pOyAvLyBUaGlzIGp1c3QgYWRkcyB0aGUgdGFzayB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVl
IC0gdGhlIGNhbGxlciBuZWVkcyB0byBiZSBleHRyZW1lbHkgY2FyZWZ1bCBub3QgdG8gY3JlYXRl
IGRlYWRsb2NrcyB3aGVuIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24uCiAgICAgdm9pZCB1bnNjaGVk
dWxlRGF0YWJhc2VUYXNrcyhEYXRhYmFzZSopOwogCisgICAgdm9pZCByZWNvcmREYXRhYmFzZU9w
ZW4oRGF0YWJhc2UqKTsKKyAgICB2b2lkIHJlY29yZERhdGFiYXNlQ2xvc2VkKERhdGFiYXNlKik7
CisKIHByaXZhdGU6CiAgICAgRGF0YWJhc2VUaHJlYWQoKTsKIApAQCAtNjcsNiArNzAsMTEgQEAg
cHJpdmF0ZToKICAgICBSZWZQdHI8RGF0YWJhc2VUaHJlYWQ+IG1fc2VsZlJlZjsKIAogICAgIE1l
c3NhZ2VRdWV1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+IG1fcXVldWU7CisKKyAgICAvLyBUaGlz
IHNldCBrZWVwcyB0cmFjayBvZiB0aGUgb3BlbiBkYXRhYmFzZXMgdGhhdCBoYXZlIGJlZW4gdXNl
ZCBvbiB0aGlzIHRocmVhZC4KKyAgICBNdXRleCBtX29wZW5EYXRhYmFzZVNldE11dGV4OworICAg
IHR5cGVkZWYgSGFzaFNldDxSZWZQdHI8RGF0YWJhc2U+ID4gRGF0YWJhc2VTZXQ7CisgICAgRGF0
YWJhc2VTZXQgbV9vcGVuRGF0YWJhc2VTZXQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCShyZXZpc2lvbiA0NTE3OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29y
a2luZyBjb3B5KQpAQCAtMSwzICsxLDEyIEBACisyMDA5LTA2LTI1ICBCZW4gTXVyZG9jaCAgPGJl
bm1AZ29vZ2xlLmNvbT4KKworICAgICAgICBUZXN0IGZvciBidWcgMjU3MTE6IElmIHRoZSBwYWdl
IGlzIHJlZnJlc2hlZCB3aGlsc3QgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVz
cywgdGhlIGRhdGFiYXNlIHJlbWFpbnMgbG9ja2VkIHVudGlsIHRoZSBicm93c2VyIGlzIGNsb3Nl
ZC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1NzEx
CisKKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVk
LnR4dDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9h
ZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC0yLmh0bWw6IEFkZGVkLgorCiAyMDA5LTA2LTI1ICBFcmljIFNlaWRlbCAg
PGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBObyByZXZpZXcsIGp1c3Qgc2tpcHBpbmcgYSBu
ZXcgdGVzdC4KSW5kZXg6IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1y
ZWxvYWQtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0
YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5
b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMyBAQAorSW5zZXJ0aW5nIHNvbWUgZGF0YQorVGVzdCBw
YXJ0IDIgQ29tcGxldGUKKwoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0VGVzdHMvc3RvcmFn
ZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQKX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRl
ZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoKSW5kZXg6IExheW91dFRlc3RzL3N0b3JhZ2Uv
ZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwJKHJldmlzaW9uIDApCisr
KyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNzEgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0PgordmFy
IGRhdGFiYXNlOwordmFyIHRpbWVvdXQ7CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAg
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2Ug
KyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiVGVzdCBw
YXJ0IDEgQ29tcGxldGUiKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQor
ICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9u
IGVycm9yRnVuY3Rpb24odHgsIGVycm9yKQoreworICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTsK
KyAgICBsb2coIlRlc3QgZmFpbGVkIC0gIiArIGVycm9yLm1lc3NhZ2UpOworICAgIGZpbmlzaFRl
c3QoKTsKK30KKworZnVuY3Rpb24gYWRkRGF0YShkYikKK3sKKyAgICBkYi50cmFuc2FjdGlvbihm
dW5jdGlvbih0eCkgeyAKKyAgICAgICAgbG9nKCJJbnNlcnRpbmcgc29tZSBkYXRhIik7CisgICAg
ICAgIC8vIEluc2VydCBhIGxhcmdlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2lsbCB0YWtlIGEgbGl0
dGxlIHdoaWxlIHRvIHJ1bi4gU2NoZWR1bGUgYSB0aW1vdXQgdG8gcnVuIHRoYXQgd2lsbCBsb2Fk
IGEgbmV3IHBhZ2UKKyAgICAgICAgLy8gd2hpbHN0IHRoZSB0cmFuc2FjdGlvbiBpcyBzdGlsbCBp
biBwcm9ncmVzcywgaW50ZXJydXB0aW5nIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBzaG91bGQgbm90
IGxlYXZlIHRoZSBkYXRhYmFzZSBsb2NrZWQgYW5kIG9uCisgICAgICAgIC8vIHRoZSBuZXh0IHBh
Z2Ugd2Ugc2hvdWxkIGJlIGFibGUgdG8gaW5zZXJ0IHNvbWUgbW9yZSBkYXRhLgorICAgICAgICB0
eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAocmFu
ZG9tQmxvYig1MjQyMDAgKSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1
bmN0aW9uKTsKKyAgICAgICAgbG9jYXRpb24uaHJlZiA9ICIuL3Jlc291cmNlcy9kYXRhYmFzZS1s
b2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwiOworICAgIH0sIGVycm9yRnVuY3Rpb24sIGZ1bmN0aW9u
KCkgeyAKKyAgICAgICAgZmluaXNoVGVzdCgpOworICAgIH0pOworfQorCitmdW5jdGlvbiBydW5U
ZXN0KCkKK3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAg
IGxheW91dFRlc3RDb250cm9sbGVyLmNsZWFyQWxsRGF0YWJhc2VzKCk7CisgICAgICAgIGxheW91
dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKyAgICAKKyAgICB0cnkgeworICAgICAgICBkYXRh
YmFzZSA9IG9wZW5EYXRhYmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVzdCBmb3Ig
ZGF0YWJhc2UgbG9ja2luZyIsIDUyNDI4ODApOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAg
bG9nKCJFcnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7CisgICAgICAgIGZpbmlzaFRl
c3QoKTsKKyAgICB9CisgICAgCisgICAgZGF0YWJhc2UudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgp
IHsKKyAgICAgICAgbG9nKCJBZGRpbmcgYSB0YWJsZSIpOworICAgICAgICB0eC5leGVjdXRlU3Fs
KCJDUkVBVEUgVEFCTEUgRGF0YVRlc3QgKHRlc3REYXRhKSIsIFtdLCBmdW5jdGlvbih0eCwgcmVz
dWx0KSB7IH0sIGVycm9yRnVuY3Rpb24pOyAKKyAgICB9LCBlcnJvckZ1bmN0aW9uLCBmdW5jdGlv
bigpIHsgCisgICAgICAgIGFkZERhdGEoZGF0YWJhc2UpOyAKKyAgICB9KTsKK30KKworPC9zY3Jp
cHQ+Cis8L2hlYWQ+CisKKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KKzxwcmUgaWQ9ImNvbnNv
bGUiPgorPC9wcmU+Cis8L2JvZHk+CisKKzwvaHRtbD4KClByb3BlcnR5IGNoYW5nZXMgb246IExh
eW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbApfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogTGF5b3V0VGVzdHMv
c3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0
ZXItcmVsb2FkLTIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL3N0b3JhZ2UvcmVz
b3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw1OSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQ+Cit2YXIgZGF0YWJhc2U7CisK
K2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJj
b25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZp
bmlzaFRlc3QoKQoreworICAgIGxvZygiVGVzdCBwYXJ0IDIgQ29tcGxldGUiKTsKKyAgICBpZiAo
d2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxl
ci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIGVycm9yRnVuY3Rpb24odHgsIGVycm9yKQor
eworICAgIGxvZygiVGVzdCBmYWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7CisgICAgZmluaXNo
VGVzdCgpOworfQorCitmdW5jdGlvbiBhZGREYXRhKGRiKQoreworICAgIGRiLnRyYW5zYWN0aW9u
KGZ1bmN0aW9uKHR4KSB7IAorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRhdGEiKTsKKwor
ICAgICAgICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZB
TFVFUyAoPykiLCBbIkEiXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0aW9u
KTsKKyAgICB9LCBmdW5jdGlvbigpe30sIGZ1bmN0aW9uKCkgeyAKKyAgICAgICAgZmluaXNoVGVz
dCgpOworICAgIH0pOworfQorCitmdW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBpZiAod2luZG93
LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1
bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgp
OworICAgIH0KKyAgICAKKyAgICB0cnkgeworICAgICAgICBkYXRhYmFzZSA9IG9wZW5EYXRhYmFz
ZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVzdCBmb3IgZGF0YWJhc2UgbG9ja2luZyIs
IDUyNDI4ODApOworICAgICAgICBhZGREYXRhKGRhdGFiYXNlKTsKKyAgICB9IGNhdGNoKGUpIHsK
KyAgICAgICAgbG9nKCJFcnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7CisgICAgICAg
IGZpbmlzaFRlc3QoKTsKKyAgICB9Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keSBv
bmxvYWQ9InJ1blRlc3QoKSI+Cis8cHJlIGlkPSJjb25zb2xlIj4KKzwvcHJlPgorPC9ib2R5Pgor
Cis8L2h0bWw+CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291
cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwKX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDog
c3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31934</attachid>
            <date>2009-06-26 08:40:16 -0700</date>
            <delta_ts>2009-07-01 08:57:44 -0700</delta_ts>
            <desc>New patch based on Antti&apos;s comments.</desc>
            <filename>25711-2506-nex.txt</filename>
            <type>text/plain</type>
            <size>11943</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NTE3OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMDktMDYtMjUgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmc/c2hvd19idWcuY2dp
P2lkPTI1NzExOiBJZiB0aGUgcGFnZSBpcyByZWZyZXNoZWQgd2hpbHN0IGEgZGF0YWJhc2UgdHJh
bnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBkYXRhYmFzZSByZW1haW5zIGxvY2tlZCB1bnRp
bCB0aGUgYnJvd3NlciBpcyBzaHV0IGRvd24uCisKKyAgICAgICAgVGVzdDogc3RvcmFnZS9kYXRh
YmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCisKKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNl
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpEYXRhYmFzZSk6CisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZTo6Y2xvc2UpOiBhZGQgY29kZSB0byBpbmZvcm0gdGhlIGRhdGFiYXNl
IHRocmVhZCB3ZSd2ZSBjbG9zZWQgdGhlIGRhdGFiYXNlLgorICAgICAgICAoV2ViQ29yZTo6RGF0
YWJhc2U6OnBlcmZvcm1PcGVuQW5kVmVyaWZ5KTogYWRkIGNvZGUgdG8gaW5mb3JtIHRoZSBkYXRh
YmFzZSB0aHJlYWQgd2UndmUgb3BlbmVkIGEgZGF0YWJhc2UuCisgICAgICAgICogc3RvcmFnZS9E
YXRhYmFzZS5oOgorICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6Om9wZW5lZCk6IHJldHVybiB0
cnVlIGlmZiB0aGUgdW5kZXJseWluZyBzcWxpdGUgZGF0YWJhc2UgaGFzIGJlZW4gb3BlbmVkIGJ1
dCBub3QgY2xvc2VkLgorICAgICAgICAqIHN0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6RGF0YWJhc2VUaHJlYWQ6OmRhdGFiYXNlVGhyZWFkKTogQmVmb3JlIHRo
ZSBkYXRhYmFzZSB0aHJlYWQgdGVybWluYXRlcywgY2xvc2UgYW55IGRhdGFiYXNlcyB0aGF0IHJh
biB0cmFuc2FjdGlvbnMgaW4gdGhpcyB0aHJlYWQuCisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFz
ZVRocmVhZDo6cmVjb3JkRGF0YWJhc2VPcGVuKTogUmVjb3JkcyBhIGRhdGFiYXNlIHRoYXQgZXhl
Y3V0ZWQgYSB0cmFuc2FjdGlvbiBpbiB0aGlzIHRocmVhZC4KKyAgICAgICAgKFdlYkNvcmU6OkRh
dGFiYXNlVGhyZWFkOjpyZWNvcmREYXRhYmFzZUNsb3NlZCk6IFJlbW92ZXMgYSBkYXRhYmFzZSBm
cm9tIHRoZSBzZXQgb2Ygb3BlbiBkYXRhYmFzZXMuCisgICAgICAgICogc3RvcmFnZS9EYXRhYmFz
ZVRocmVhZC5oOgorCiAyMDA5LTA2LTI1ICBEaW1pdHJpIEdsYXprb3YgIDxkZ2xhemtvdkBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgYnVpbGQgZml4LgpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0
YWJhc2UuY3BwCShyZXZpc2lvbiA0NTA4NykKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDYgKzYwLDkgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCisvLyBJZiB3ZSBzbGVlcCBmb3IgbW9yZSB0aGUgMzAgc2Vjb25kcyB3aGlsZSBibG9ja2Vk
IG9uIFNRTElURV9CVVNZLCBnaXZlIHVwLgorc3RhdGljIGNvbnN0IGludCBtYXhTcWxpdGVCdXN5
V2FpdFRpbWUgPSAzMDAwMDsKKwogY29uc3QgU3RyaW5nJiBEYXRhYmFzZTo6ZGF0YWJhc2VJbmZv
VGFibGVOYW1lKCkKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgbmFtZSwgKCJf
X1dlYktpdERhdGFiYXNlSW5mb1RhYmxlX18iKSk7CkBAIC0xMzIsNiArMTM1LDcgQEAgRGF0YWJh
c2U6OkRhdGFiYXNlKERvY3VtZW50KiBkb2N1bWVudCwgYwogICAgICwgbV9leHBlY3RlZFZlcnNp
b24oZXhwZWN0ZWRWZXJzaW9uKQogICAgICwgbV9kZWxldGVkKGZhbHNlKQogICAgICwgbV9zdG9w
cGVkKGZhbHNlKQorICAgICwgbV9vcGVuZWQoZmFsc2UpCiB7CiAgICAgQVNTRVJUKGRvY3VtZW50
KTsKICAgICBtX3NlY3VyaXR5T3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7CkBA
IC0zMTYsNyArMzIwLDEyIEBAIHZvaWQgRGF0YWJhc2U6Om1hcmtBc0RlbGV0ZWRBbmRDbG9zZSgp
CiAKIHZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKIHsKLSAgICBtX3NxbGl0ZURhdGFiYXNlLmNsb3Nl
KCk7CisgICAgaWYgKG1fb3BlbmVkKSB7CisgICAgICAgIG1fc3FsaXRlRGF0YWJhc2UuY2xvc2Uo
KTsKKyAgICAgICAgaWYgKG1fZG9jdW1lbnQtPmRhdGFiYXNlVGhyZWFkKCkpCisgICAgICAgICAg
ICBtX2RvY3VtZW50LT5kYXRhYmFzZVRocmVhZCgpLT5yZWNvcmREYXRhYmFzZUNsb3NlZCh0aGlz
KTsKKyAgICAgICAgbV9vcGVuZWQgPSBmYWxzZTsKKyAgICB9CiB9CiAKIHZvaWQgRGF0YWJhc2U6
OnN0b3AoKQpAQCAtNDI2LDggKzQzNSwxMyBAQCBib29sIERhdGFiYXNlOjpwZXJmb3JtT3BlbkFu
ZFZlcmlmeShFeGNlCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBtX29wZW5l
ZCA9IHRydWU7CisgICAgaWYgKG1fZG9jdW1lbnQtPmRhdGFiYXNlVGhyZWFkKCkpCisgICAgICAg
IG1fZG9jdW1lbnQtPmRhdGFiYXNlVGhyZWFkKCktPnJlY29yZERhdGFiYXNlT3Blbih0aGlzKTsK
KwogICAgIEFTU0VSVChtX2RhdGFiYXNlQXV0aG9yaXplcik7CiAgICAgbV9zcWxpdGVEYXRhYmFz
ZS5zZXRBdXRob3JpemVyKG1fZGF0YWJhc2VBdXRob3JpemVyKTsKKyAgICBtX3NxbGl0ZURhdGFi
YXNlLnNldEJ1c3lUaW1lb3V0KG1heFNxbGl0ZUJ1c3lXYWl0VGltZSk7CiAKICAgICBpZiAoIW1f
c3FsaXRlRGF0YWJhc2UudGFibGVFeGlzdHMoZGF0YWJhc2VJbmZvVGFibGVOYW1lKCkpKSB7CiAg
ICAgICAgIGlmICghbV9zcWxpdGVEYXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxF
ICIgKyBkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSArICIgKGtleSBURVhUIE5PVCBOVUxMIE9OIENP
TkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsdmFsdWUgVEVYVCBOT1QgTlVM
TCBPTiBDT05GTElDVCBGQUlMKTsiKSkgewpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHJldmlzaW9uIDQ1
MDg3KQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEw
MCw2ICsxMDAsNyBAQCBwdWJsaWM6CiAgICAgYm9vbCBkZWxldGVkKCkgY29uc3QgeyByZXR1cm4g
bV9kZWxldGVkOyB9CiAKICAgICB2b2lkIGNsb3NlKCk7CisgICAgYm9vbCBvcGVuZWQoKSBjb25z
dCB7IHJldHVybiBtX29wZW5lZDsgfQogICAgIAogICAgIHZvaWQgc3RvcCgpOwogICAgIGJvb2wg
c3RvcHBlZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcHBlZDsgfQpAQCAtMTQxLDYgKzE0Miw4IEBA
IHByaXZhdGU6CiAgICAgCiAgICAgYm9vbCBtX3N0b3BwZWQ7CiAKKyAgICBib29sIG1fb3BlbmVk
OworCiAgICAgU1FMaXRlRGF0YWJhc2UgbV9zcWxpdGVEYXRhYmFzZTsKICAgICBSZWZQdHI8RGF0
YWJhc2VBdXRob3JpemVyPiBtX2RhdGFiYXNlQXV0aG9yaXplcjsKIApJbmRleDogV2ViQ29yZS9z
dG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2VUaHJlYWQuY3BwCShyZXZpc2lvbiA0NTA4NykKKysrIFdlYkNvcmUvc3RvcmFnZS9E
YXRhYmFzZVRocmVhZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwMiwxMiArMTAyLDQ0IEBAIHZv
aWQqIERhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCgpCiAgICAgLy8gRGV0YWNoIHRoZSB0
aHJlYWQgc28gaXRzIHJlc291cmNlcyBhcmUgbm8gbG9uZ2VyIG9mIGFueSBjb25jZXJuIHRvIGFu
eW9uZSBlbHNlCiAgICAgZGV0YWNoVGhyZWFkKG1fdGhyZWFkSUQpOwogCisgICAgLy8gQ2xvc2Ug
dGhlIGRhdGFiYXNlcyB0aGF0IHdlIHJhbiB0cmFuc2FjdGlvbnMgb24uIFRoaXMgZW5zdXJlcyB0
aGF0IGlmIGFueSB0cmFuc2FjdGlvbnMgYXJlIHN0aWxsIG9wZW4sIHRoZXkgYXJlIHJvbGxlZCBi
YWNrIGFuZCB3ZSBkb24ndCBsZWF2ZSB0aGUgZGF0YWJhc2UgaW4gYW4KKyAgICAvLyBpbmNvbnNp
c3RlbnQgb3IgbG9ja2VkIHN0YXRlLgorICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9jayht
X29wZW5EYXRhYmFzZVNldE11dGV4KTsKKworICAgICAgICBpZiAobV9vcGVuRGF0YWJhc2VTZXQu
c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgLy8gQXMgdGhlIGNhbGwgdG8gY2xvc2Ugd2lsbCBt
b2RpZnkgdGhlIG9yaWdpbmFsIHNldCwgd2UgbXVzdCB0YWtlIGEgY29weSB0byBpdGVyYXRlIG92
ZXIuCisgICAgICAgICAgICBEYXRhYmFzZVNldCBvcGVuU2V0Q29weSA9IG1fb3BlbkRhdGFiYXNl
U2V0OworICAgICAgICAgICAgRGF0YWJhc2VTZXQ6Oml0ZXJhdG9yIGVuZCA9IG9wZW5TZXRDb3B5
LmVuZCgpOworICAgICAgICAgICAgZm9yIChEYXRhYmFzZVNldDo6aXRlcmF0b3IgaXQgPSBvcGVu
U2V0Q29weS5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICAgICAgICAoKml0KS0+
Y2xvc2UoKTsKKworICAgICAgICAgICAgbV9vcGVuRGF0YWJhc2VTZXQuY2xlYXIoKTsKKyAgICAg
ICAgfQorICAgIH0KKwogICAgIC8vIENsZWFyIHRoZSBzZWxmIHJlZnB0ciwgcG9zc2libHkgcmVz
dWx0aW5nIGluIGRlbGV0aW9uCiAgICAgbV9zZWxmUmVmID0gMDsKIAogICAgIHJldHVybiAwOwog
fQogCit2b2lkIERhdGFiYXNlVGhyZWFkOjpyZWNvcmREYXRhYmFzZU9wZW4oRGF0YWJhc2UqIGRh
dGFiYXNlKSB7CisgICAgQVNTRVJUKGRhdGFiYXNlKTsKKworICAgIE11dGV4TG9ja2VyIGxvY2so
bV9vcGVuRGF0YWJhc2VTZXRNdXRleCk7CisgICAgQVNTRVJUKCFtX29wZW5EYXRhYmFzZVNldC5j
b250YWlucyhkYXRhYmFzZSkpOworICAgIG1fb3BlbkRhdGFiYXNlU2V0LmFkZChkYXRhYmFzZSk7
Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlQ2xvc2VkKERhdGFiYXNl
KiBkYXRhYmFzZSkgeworICAgIEFTU0VSVChkYXRhYmFzZSk7CisKKyAgICBNdXRleExvY2tlciBs
b2NrKG1fb3BlbkRhdGFiYXNlU2V0TXV0ZXgpOworICAgIEFTU0VSVChtX29wZW5EYXRhYmFzZVNl
dC5jb250YWlucyhkYXRhYmFzZSkpOworICAgIG1fb3BlbkRhdGFiYXNlU2V0LnJlbW92ZShkYXRh
YmFzZSk7Cit9CisKIHZvaWQgRGF0YWJhc2VUaHJlYWQ6OnNjaGVkdWxlVGFzayhQYXNzUmVmUHRy
PERhdGFiYXNlVGFzaz4gdGFzaykKIHsKICAgICBtX3F1ZXVlLmFwcGVuZCh0YXNrKTsKSW5kZXg6
IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
c3RvcmFnZS9EYXRhYmFzZVRocmVhZC5oCShyZXZpc2lvbiA0NTA4NykKKysrIFdlYkNvcmUvc3Rv
cmFnZS9EYXRhYmFzZVRocmVhZC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1Niw5IEBAIHB1
YmxpYzoKICAgICB2b2lkIHNjaGVkdWxlSW1tZWRpYXRlVGFzayhQYXNzUmVmUHRyPERhdGFiYXNl
VGFzaz4pOyAvLyBUaGlzIGp1c3QgYWRkcyB0aGUgdGFzayB0byB0aGUgZnJvbnQgb2YgdGhlIHF1
ZXVlIC0gdGhlIGNhbGxlciBuZWVkcyB0byBiZSBleHRyZW1lbHkgY2FyZWZ1bCBub3QgdG8gY3Jl
YXRlIGRlYWRsb2NrcyB3aGVuIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24uCiAgICAgdm9pZCB1bnNj
aGVkdWxlRGF0YWJhc2VUYXNrcyhEYXRhYmFzZSopOwogCisgICAgdm9pZCByZWNvcmREYXRhYmFz
ZU9wZW4oRGF0YWJhc2UqKTsKKyAgICB2b2lkIHJlY29yZERhdGFiYXNlQ2xvc2VkKERhdGFiYXNl
Kik7CisKIHByaXZhdGU6CiAgICAgRGF0YWJhc2VUaHJlYWQoKTsKIApAQCAtNjcsNiArNzAsMTEg
QEAgcHJpdmF0ZToKICAgICBSZWZQdHI8RGF0YWJhc2VUaHJlYWQ+IG1fc2VsZlJlZjsKIAogICAg
IE1lc3NhZ2VRdWV1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+IG1fcXVldWU7CisKKyAgICAvLyBU
aGlzIHNldCBrZWVwcyB0cmFjayBvZiB0aGUgb3BlbiBkYXRhYmFzZXMgdGhhdCBoYXZlIGJlZW4g
dXNlZCBvbiB0aGlzIHRocmVhZC4KKyAgICBNdXRleCBtX29wZW5EYXRhYmFzZVNldE11dGV4Owor
ICAgIHR5cGVkZWYgSGFzaFNldDxSZWZQdHI8RGF0YWJhc2U+ID4gRGF0YWJhc2VTZXQ7CisgICAg
RGF0YWJhc2VTZXQgbV9vcGVuRGF0YWJhc2VTZXQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA0NTE3OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwko
d29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyIEBACisyMDA5LTA2LTI1ICBCZW4gTXVyZG9jaCAg
PGJlbm1AZ29vZ2xlLmNvbT4KKworICAgICAgICBUZXN0IGZvciBidWcgMjU3MTE6IElmIHRoZSBw
YWdlIGlzIHJlZnJlc2hlZCB3aGlsc3QgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9n
cmVzcywgdGhlIGRhdGFiYXNlIHJlbWFpbnMgbG9ja2VkIHVudGlsIHRoZSBicm93c2VyIGlzIGNs
b3NlZC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1
NzExCisKKyAgICAgICAgKiBzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJl
bG9hZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1s
b2NrLWFmdGVyLXJlbG9hZC0yLmh0bWw6IEFkZGVkLgorCiAyMDA5LTA2LTI1ICBFcmljIFNlaWRl
bCAgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBObyByZXZpZXcsIGp1c3Qgc2tpcHBpbmcg
YSBuZXcgdGVzdC4KSW5kZXg6IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRl
ci1yZWxvYWQtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2Uv
ZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50
eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMyBAQAorSW5zZXJ0aW5nIHNvbWUgZGF0YQorVGVz
dCBwYXJ0IDIgQ29tcGxldGUKKwoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0VGVzdHMvc3Rv
cmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQKX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpB
ZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoKSW5kZXg6IExheW91dFRlc3RzL3N0b3Jh
Z2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzEgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0Pgor
dmFyIGRhdGFiYXNlOwordmFyIHRpbWVvdXQ7CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQorewor
ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3Nh
Z2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiVGVz
dCBwYXJ0IDEgQ29tcGxldGUiKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVy
KQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0
aW9uIGVycm9yRnVuY3Rpb24odHgsIGVycm9yKQoreworICAgIGNsZWFyVGltZW91dCh0aW1lb3V0
KTsKKyAgICBsb2coIlRlc3QgZmFpbGVkIC0gIiArIGVycm9yLm1lc3NhZ2UpOworICAgIGZpbmlz
aFRlc3QoKTsKK30KKworZnVuY3Rpb24gYWRkRGF0YShkYikKK3sKKyAgICBkYi50cmFuc2FjdGlv
bihmdW5jdGlvbih0eCkgeyAKKyAgICAgICAgbG9nKCJJbnNlcnRpbmcgc29tZSBkYXRhIik7Cisg
ICAgICAgIC8vIEluc2VydCBhIGxhcmdlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2lsbCB0YWtlIGEg
bGl0dGxlIHdoaWxlIHRvIHJ1bi4gU2NoZWR1bGUgYSB0aW1vdXQgdG8gcnVuIHRoYXQgd2lsbCBs
b2FkIGEgbmV3IHBhZ2UKKyAgICAgICAgLy8gd2hpbHN0IHRoZSB0cmFuc2FjdGlvbiBpcyBzdGls
bCBpbiBwcm9ncmVzcywgaW50ZXJydXB0aW5nIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBzaG91bGQg
bm90IGxlYXZlIHRoZSBkYXRhYmFzZSBsb2NrZWQgYW5kIG9uCisgICAgICAgIC8vIHRoZSBuZXh0
IHBhZ2Ugd2Ugc2hvdWxkIGJlIGFibGUgdG8gaW5zZXJ0IHNvbWUgbW9yZSBkYXRhLgorICAgICAg
ICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEpIFZBTFVFUyAo
cmFuZG9tQmxvYig1MjQyMDAgKSkiLCBbXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJv
ckZ1bmN0aW9uKTsKKyAgICAgICAgbG9jYXRpb24uaHJlZiA9ICIuL3Jlc291cmNlcy9kYXRhYmFz
ZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwiOworICAgIH0sIGVycm9yRnVuY3Rpb24sIGZ1bmN0
aW9uKCkgeyAKKyAgICAgICAgZmluaXNoVGVzdCgpOworICAgIH0pOworfQorCitmdW5jdGlvbiBy
dW5UZXN0KCkKK3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLmNsZWFyQWxsRGF0YWJhc2VzKCk7CisgICAgICAgIGxh
eW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKyAgICAKKyAgICB0cnkgeworICAgICAgICBk
YXRhYmFzZSA9IG9wZW5EYXRhYmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVzdCBm
b3IgZGF0YWJhc2UgbG9ja2luZyIsIDUyNDI4ODApOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAg
ICAgbG9nKCJFcnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7CisgICAgICAgIGZpbmlz
aFRlc3QoKTsKKyAgICB9CisgICAgCisgICAgZGF0YWJhc2UudHJhbnNhY3Rpb24oZnVuY3Rpb24o
dHgpIHsKKyAgICAgICAgbG9nKCJBZGRpbmcgYSB0YWJsZSIpOworICAgICAgICB0eC5leGVjdXRl
U3FsKCJDUkVBVEUgVEFCTEUgRGF0YVRlc3QgKHRlc3REYXRhKSIsIFtdLCBmdW5jdGlvbih0eCwg
cmVzdWx0KSB7IH0sIGVycm9yRnVuY3Rpb24pOyAKKyAgICB9LCBlcnJvckZ1bmN0aW9uLCBmdW5j
dGlvbigpIHsgCisgICAgICAgIGFkZERhdGEoZGF0YWJhc2UpOyAKKyAgICB9KTsKK30KKworPC9z
Y3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KKzxwcmUgaWQ9ImNv
bnNvbGUiPgorPC9wcmU+Cis8L2JvZHk+CisKKzwvaHRtbD4KClByb3BlcnR5IGNoYW5nZXMgb246
IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbApfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogTGF5b3V0VGVz
dHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2st
YWZ0ZXItcmVsb2FkLTIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL3N0b3JhZ2Uv
cmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw1OSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQ+Cit2YXIgZGF0YWJhc2U7
CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0aW9u
IGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiVGVzdCBwYXJ0IDIgQ29tcGxldGUiKTsKKyAgICBp
ZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJv
bGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIGVycm9yRnVuY3Rpb24odHgsIGVycm9y
KQoreworICAgIGxvZygiVGVzdCBmYWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7CisgICAgZmlu
aXNoVGVzdCgpOworfQorCitmdW5jdGlvbiBhZGREYXRhKGRiKQoreworICAgIGRiLnRyYW5zYWN0
aW9uKGZ1bmN0aW9uKHR4KSB7IAorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRhdGEiKTsK
KworICAgICAgICB0eC5leGVjdXRlU3FsKCJJTlNFUlQgSU5UTyBEYXRhVGVzdCAodGVzdERhdGEp
IFZBTFVFUyAoPykiLCBbIkEiXSwgZnVuY3Rpb24odHgsIHJlc3VsdCkgeyB9LCBlcnJvckZ1bmN0
aW9uKTsKKyAgICB9LCBmdW5jdGlvbigpe30sIGZ1bmN0aW9uKCkgeyAKKyAgICAgICAgZmluaXNo
VGVzdCgpOworICAgIH0pOworfQorCitmdW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBpZiAod2lu
ZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVy
LmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9u
ZSgpOworICAgIH0KKyAgICAKKyAgICB0cnkgeworICAgICAgICBkYXRhYmFzZSA9IG9wZW5EYXRh
YmFzZSgiRGF0YWJhc2VMb2NrVGVzdCIsICIxLjAiLCAiVGVzdCBmb3IgZGF0YWJhc2UgbG9ja2lu
ZyIsIDUyNDI4ODApOworICAgICAgICBhZGREYXRhKGRhdGFiYXNlKTsKKyAgICB9IGNhdGNoKGUp
IHsKKyAgICAgICAgbG9nKCJFcnJvciAtIGNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlIik7CisgICAg
ICAgIGZpbmlzaFRlc3QoKTsKKyAgICB9Cit9CisKKzwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9k
eSBvbmxvYWQ9InJ1blRlc3QoKSI+Cis8cHJlIGlkPSJjb25zb2xlIj4KKzwvcHJlPgorPC9ib2R5
PgorCis8L2h0bWw+CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jl
c291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWwKX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRl
ZDogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>32125</attachid>
            <date>2009-07-01 08:46:21 -0700</date>
            <delta_ts>2009-07-03 04:17:32 -0700</delta_ts>
            <desc>New patch. (please do not land this version)</desc>
            <filename>25711-01071622.txt</filename>
            <type>text/plain</type>
            <size>12137</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NTQzMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjIgQEAKKzIwMDktMDctMDEgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTI1NzExLCB3aGVyZSB3ZWIgc3RvcmFnZSBkYXRhYmFzZXMgY291bGQgYmVjb21lIGxvY2tl
ZCB1bnRpbCB0aGUgYnJvd3NlciBpcyBzaHV0IGRvd24gaWYgdGhlIHBhZ2UgaXMgcmVmcmVzaGVk
IHdoaWxzdCBhIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLgorCisgICAgICAgIFRlc3Q6IHN0
b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAorCisgICAgICAgICogc3RvcmFn
ZS9EYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6RGF0YWJhc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OmNsb3NlKTogYWRkIGNvZGUgdG8gaW5mb3JtIHRo
ZSBkYXRhYmFzZSB0aHJlYWQgd2UndmUgY2xvc2VkIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgKFdl
YkNvcmU6OkRhdGFiYXNlOjpwZXJmb3JtT3BlbkFuZFZlcmlmeSk6IGFkZCBjb2RlIHRvIGluZm9y
bSB0aGUgZGF0YWJhc2UgdGhyZWFkIHdlJ3ZlIG9wZW5lZCBhIGRhdGFiYXNlLgorICAgICAgICAq
IHN0b3JhZ2UvRGF0YWJhc2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpvcGVuZWQp
OiByZXR1cm4gdHJ1ZSBpZmYgdGhlIHVuZGVybHlpbmcgc3FsaXRlIGRhdGFiYXNlIGhhcyBiZWVu
IG9wZW5lZCBidXQgbm90IGNsb3NlZC4KKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVGhyZWFk
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCk6
IEJlZm9yZSB0aGUgZGF0YWJhc2UgdGhyZWFkIHRlcm1pbmF0ZXMsIGNsb3NlIGFueSBkYXRhYmFz
ZXMgdGhhdCByYW4gdHJhbnNhY3Rpb25zIGluIHRoaXMgdGhyZWFkLgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlT3Blbik6IFJlY29yZHMgYSBkYXRhYmFz
ZSB0aGF0IGV4ZWN1dGVkIGEgdHJhbnNhY3Rpb24gaW4gdGhpcyB0aHJlYWQuCisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRocmVhZDo6cmVjb3JkRGF0YWJhc2VDbG9zZWQpOiBSZW1vdmVzIGEg
ZGF0YWJhc2UgZnJvbSB0aGUgc2V0IG9mIG9wZW4gZGF0YWJhc2VzLgorICAgICAgICAqIHN0b3Jh
Z2UvRGF0YWJhc2VUaHJlYWQuaDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpn
ZXRUaHJlYWRJRCk6IHJldHVybiB0aGUgdGhyZWFkIGlkIGZvciB0aGUgZGF0YWJhc2UgdGhyZWFk
LgorCiAyMDA5LTA3LTAxICBTaW1vbiBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNv
bT4KIAogICAgICAgICBSdWJiZXItc3RhbXBlZCBieSBBcml5YSBIaWRheWF0LgpJbmRleDogV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uv
RGF0YWJhc2UuY3BwCShyZXZpc2lvbiA0NTQzMSkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFz
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDYgKzYwLDkgQEAKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCisvLyBJZiB3ZSBzbGVlcCBmb3IgbW9yZSB0aGUgMzAgc2Vjb25kcyB3aGlsZSBibG9j
a2VkIG9uIFNRTElURV9CVVNZLCBnaXZlIHVwLgorc3RhdGljIGNvbnN0IGludCBtYXhTcWxpdGVC
dXN5V2FpdFRpbWUgPSAzMDAwMDsKKwogY29uc3QgU3RyaW5nJiBEYXRhYmFzZTo6ZGF0YWJhc2VJ
bmZvVGFibGVOYW1lKCkKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgbmFtZSwg
KCJfX1dlYktpdERhdGFiYXNlSW5mb1RhYmxlX18iKSk7CkBAIC0xMzIsNiArMTM1LDcgQEAgRGF0
YWJhc2U6OkRhdGFiYXNlKERvY3VtZW50KiBkb2N1bWVudCwgYwogICAgICwgbV9leHBlY3RlZFZl
cnNpb24oZXhwZWN0ZWRWZXJzaW9uKQogICAgICwgbV9kZWxldGVkKGZhbHNlKQogICAgICwgbV9z
dG9wcGVkKGZhbHNlKQorICAgICwgbV9vcGVuZWQoZmFsc2UpCiB7CiAgICAgQVNTRVJUKGRvY3Vt
ZW50KTsKICAgICBtX3NlY3VyaXR5T3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7
CkBAIC0zMTYsNyArMzIwLDEzIEBAIHZvaWQgRGF0YWJhc2U6Om1hcmtBc0RlbGV0ZWRBbmRDbG9z
ZSgpCiAKIHZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKIHsKLSAgICBtX3NxbGl0ZURhdGFiYXNlLmNs
b3NlKCk7CisgICAgaWYgKG1fb3BlbmVkKSB7CisgICAgICAgIEFTU0VSVChtX2RvY3VtZW50LT5k
YXRhYmFzZVRocmVhZCgpKTsKKyAgICAgICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBkb2N1
bWVudCgpLT5kYXRhYmFzZVRocmVhZCgpLT5nZXRUaHJlYWRJRCgpKTsKKyAgICAgICAgbV9zcWxp
dGVEYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtX2RvY3VtZW50LT5kYXRhYmFzZVRocmVhZCgp
LT5yZWNvcmREYXRhYmFzZUNsb3NlZCh0aGlzKTsKKyAgICAgICAgbV9vcGVuZWQgPSBmYWxzZTsK
KyAgICB9CiB9CiAKIHZvaWQgRGF0YWJhc2U6OnN0b3AoKQpAQCAtNDI2LDggKzQzNiwxMyBAQCBi
b29sIERhdGFiYXNlOjpwZXJmb3JtT3BlbkFuZFZlcmlmeShFeGNlCiAgICAgICAgIHJldHVybiBm
YWxzZTsKICAgICB9CiAKKyAgICBtX29wZW5lZCA9IHRydWU7CisgICAgaWYgKG1fZG9jdW1lbnQt
PmRhdGFiYXNlVGhyZWFkKCkpCisgICAgICAgIG1fZG9jdW1lbnQtPmRhdGFiYXNlVGhyZWFkKCkt
PnJlY29yZERhdGFiYXNlT3Blbih0aGlzKTsKKwogICAgIEFTU0VSVChtX2RhdGFiYXNlQXV0aG9y
aXplcik7CiAgICAgbV9zcWxpdGVEYXRhYmFzZS5zZXRBdXRob3JpemVyKG1fZGF0YWJhc2VBdXRo
b3JpemVyKTsKKyAgICBtX3NxbGl0ZURhdGFiYXNlLnNldEJ1c3lUaW1lb3V0KG1heFNxbGl0ZUJ1
c3lXYWl0VGltZSk7CiAKICAgICBpZiAoIW1fc3FsaXRlRGF0YWJhc2UudGFibGVFeGlzdHMoZGF0
YWJhc2VJbmZvVGFibGVOYW1lKCkpKSB7CiAgICAgICAgIGlmICghbV9zcWxpdGVEYXRhYmFzZS5l
eGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFICIgKyBkYXRhYmFzZUluZm9UYWJsZU5hbWUoKSAr
ICIgKGtleSBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNU
IFJFUExBQ0UsdmFsdWUgVEVYVCBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKTsiKSkgewpJbmRl
eDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9y
YWdlL0RhdGFiYXNlLmgJKHJldmlzaW9uIDQ1NDMxKQorKysgV2ViQ29yZS9zdG9yYWdlL0RhdGFi
YXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMCw2ICsxMDAsNyBAQCBwdWJsaWM6CiAgICAgYm9v
bCBkZWxldGVkKCkgY29uc3QgeyByZXR1cm4gbV9kZWxldGVkOyB9CiAKICAgICB2b2lkIGNsb3Nl
KCk7CisgICAgYm9vbCBvcGVuZWQoKSBjb25zdCB7IHJldHVybiBtX29wZW5lZDsgfQogICAgIAog
ICAgIHZvaWQgc3RvcCgpOwogICAgIGJvb2wgc3RvcHBlZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3Rv
cHBlZDsgfQpAQCAtMTQxLDYgKzE0Miw4IEBAIHByaXZhdGU6CiAgICAgCiAgICAgYm9vbCBtX3N0
b3BwZWQ7CiAKKyAgICBib29sIG1fb3BlbmVkOworCiAgICAgU1FMaXRlRGF0YWJhc2UgbV9zcWxp
dGVEYXRhYmFzZTsKICAgICBSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVyPiBtX2RhdGFiYXNlQXV0
aG9yaXplcjsKIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwCShyZXZpc2lvbiA0
NTQzMSkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTk5LDYgKzk5LDE4IEBAIHZvaWQqIERhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVh
ZCgpCiAKICAgICBMT0coU3RvcmFnZUFQSSwgIkFib3V0IHRvIGRldGFjaCB0aHJlYWQgJWkgYW5k
IGNsZWFyIHRoZSByZWYgdG8gRGF0YWJhc2VUaHJlYWQgJXAsIHdoaWNoIGN1cnJlbnRseSBoYXMg
JWkgcmVmKHMpIiwgbV90aHJlYWRJRCwgdGhpcywgcmVmQ291bnQoKSk7CiAKKyAgICAvLyBDbG9z
ZSB0aGUgZGF0YWJhc2VzIHRoYXQgd2UgcmFuIHRyYW5zYWN0aW9ucyBvbi4gVGhpcyBlbnN1cmVz
IHRoYXQgaWYgYW55IHRyYW5zYWN0aW9ucyBhcmUgc3RpbGwgb3BlbiwgdGhleSBhcmUgcm9sbGVk
IGJhY2sgYW5kIHdlIGRvbid0IGxlYXZlIHRoZSBkYXRhYmFzZSBpbiBhbgorICAgIC8vIGluY29u
c2lzdGVudCBvciBsb2NrZWQgc3RhdGUuCisgICAgaWYgKG1fb3BlbkRhdGFiYXNlU2V0LnNpemUo
KSA+IDApIHsKKyAgICAgICAgLy8gQXMgdGhlIGNhbGwgdG8gY2xvc2Ugd2lsbCBtb2RpZnkgdGhl
IG9yaWdpbmFsIHNldCwgd2UgbXVzdCB0YWtlIGEgY29weSB0byBpdGVyYXRlIG92ZXIuCisgICAg
ICAgIERhdGFiYXNlU2V0IG9wZW5TZXRDb3B5ID0gbV9vcGVuRGF0YWJhc2VTZXQ7CisgICAgICAg
IERhdGFiYXNlU2V0OjppdGVyYXRvciBlbmQgPSBvcGVuU2V0Q29weS5lbmQoKTsKKyAgICAgICAg
Zm9yIChEYXRhYmFzZVNldDo6aXRlcmF0b3IgaXQgPSBvcGVuU2V0Q29weS5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpCisgICAgICAgICAgICgqaXQpLT5jbG9zZSgpOworCisgICAgICAgIG1fb3Bl
bkRhdGFiYXNlU2V0LmNsZWFyKCk7CisgICAgfQorCiAgICAgLy8gRGV0YWNoIHRoZSB0aHJlYWQg
c28gaXRzIHJlc291cmNlcyBhcmUgbm8gbG9uZ2VyIG9mIGFueSBjb25jZXJuIHRvIGFueW9uZSBl
bHNlCiAgICAgZGV0YWNoVGhyZWFkKG1fdGhyZWFkSUQpOwogCkBAIC0xMDgsNiArMTIwLDIwIEBA
IHZvaWQqIERhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCgpCiAgICAgcmV0dXJuIDA7CiB9
CiAKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlT3BlbihEYXRhYmFzZSogZGF0
YWJhc2UpIHsKKyAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkSUQpOworICAg
IEFTU0VSVChkYXRhYmFzZSk7CisgICAgQVNTRVJUKCFtX29wZW5EYXRhYmFzZVNldC5jb250YWlu
cyhkYXRhYmFzZSkpOworICAgIG1fb3BlbkRhdGFiYXNlU2V0LmFkZChkYXRhYmFzZSk7Cit9CisK
K3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlQ2xvc2VkKERhdGFiYXNlKiBkYXRh
YmFzZSkgeworICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWRJRCk7CisgICAg
QVNTRVJUKGRhdGFiYXNlKTsKKyAgICBBU1NFUlQobV9vcGVuRGF0YWJhc2VTZXQuY29udGFpbnMo
ZGF0YWJhc2UpKTsKKyAgICBtX29wZW5EYXRhYmFzZVNldC5yZW1vdmUoZGF0YWJhc2UpOworfQor
CiB2b2lkIERhdGFiYXNlVGhyZWFkOjpzY2hlZHVsZVRhc2soUGFzc1JlZlB0cjxEYXRhYmFzZVRh
c2s+IHRhc2spCiB7CiAgICAgbV9xdWV1ZS5hcHBlbmQodGFzayk7CkluZGV4OiBXZWJDb3JlL3N0
b3JhZ2UvRGF0YWJhc2VUaHJlYWQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0
YWJhc2VUaHJlYWQuaAkocmV2aXNpb24gNDU0MzEpCisrKyBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJh
c2VUaHJlYWQuaAkod29ya2luZyBjb3B5KQpAQCAtNTYsNiArNTYsMTAgQEAgcHVibGljOgogICAg
IHZvaWQgc2NoZWR1bGVJbW1lZGlhdGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7IC8v
IFRoaXMganVzdCBhZGRzIHRoZSB0YXNrIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgLSB0aGUg
Y2FsbGVyIG5lZWRzIHRvIGJlIGV4dHJlbWVseSBjYXJlZnVsIG5vdCB0byBjcmVhdGUgZGVhZGxv
Y2tzIHdoZW4gd2FpdGluZyBmb3IgY29tcGxldGlvbi4KICAgICB2b2lkIHVuc2NoZWR1bGVEYXRh
YmFzZVRhc2tzKERhdGFiYXNlKik7CiAKKyAgICB2b2lkIHJlY29yZERhdGFiYXNlT3BlbihEYXRh
YmFzZSopOworICAgIHZvaWQgcmVjb3JkRGF0YWJhc2VDbG9zZWQoRGF0YWJhc2UqKTsKKyAgICBU
aHJlYWRJZGVudGlmaWVyIGdldFRocmVhZElEKCkgeyByZXR1cm4gbV90aHJlYWRJRDsgfQorCiBw
cml2YXRlOgogICAgIERhdGFiYXNlVGhyZWFkKCk7CiAKQEAgLTY3LDYgKzcxLDEwIEBAIHByaXZh
dGU6CiAgICAgUmVmUHRyPERhdGFiYXNlVGhyZWFkPiBtX3NlbGZSZWY7CiAKICAgICBNZXNzYWdl
UXVldWU8UmVmUHRyPERhdGFiYXNlVGFzaz4gPiBtX3F1ZXVlOworCisgICAgLy8gVGhpcyBzZXQg
a2VlcHMgdHJhY2sgb2YgdGhlIG9wZW4gZGF0YWJhc2VzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgb24g
dGhpcyB0aHJlYWQuCisgICAgdHlwZWRlZiBIYXNoU2V0PFJlZlB0cjxEYXRhYmFzZT4gPiBEYXRh
YmFzZVNldDsKKyAgICBEYXRhYmFzZVNldCBtX29wZW5EYXRhYmFzZVNldDsKIH07CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ1NDMyKQorKysgTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTEgQEAKKzIwMDktMDctMDEg
IEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29tPgorCisgICAgICAgIFRlc3RzIGZpeCBmb3Ig
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1NzExLCB3aGVyZSB3ZWIg
c3RvcmFnZSBkYXRhYmFzZXMgY291bGQgYmVjb21lIGxvY2tlZCB1bnRpbCB0aGUgYnJvd3NlciBp
cyBzaHV0IGRvd24gaWYgdGhlIHBhZ2UgaXMgcmVmcmVzaGVkIHdoaWxzdCBhIHRyYW5zYWN0aW9u
IGlzIGluIHByb2dyZXNzLgorCisgICAgICAgICogc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVy
LXJlbG9hZC1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvZGF0YWJhc2Ut
bG9jay1hZnRlci1yZWxvYWQuaHRtbDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9yZXNvdXJj
ZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sOiBBZGRlZC4KKwogMjAwOS0wNi0z
MCAgWGFuIExvcGV6ICA8eGxvcGV6QGlnYWxpYS5jb20+CiAKICAgICAgICAgRGlzYWJsZSB0ZXN0
IHVzaW5nIGV2ZW50U2VuZGVyLgpJbmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1s
b2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
c3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzIEBACitJbnNlcnRpbmcgc29tZSBk
YXRhCitUZXN0IHBhcnQgMiBDb21wbGV0ZQorCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRU
ZXN0cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dApfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogTGF5b3V0VGVz
dHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2
aXNpb24gMCkKKysrIExheW91dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxv
YWQuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2OSBAQAorPGh0bWw+Cis8aGVhZD4KKzxz
Y3JpcHQ+Cit2YXIgZGF0YWJhc2U7CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAi
PGJyPiI7Cit9CisKK2Z1bmN0aW9uIGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiVGVzdCBwYXJ0
IDEgQ29tcGxldGUiKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAg
ICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIGVy
cm9yRnVuY3Rpb24odHgsIGVycm9yKQoreworICAgIGxvZygiVGVzdCBmYWlsZWQgLSAiICsgZXJy
b3IubWVzc2FnZSk7CisgICAgZmluaXNoVGVzdCgpOworfQorCitmdW5jdGlvbiBhZGREYXRhKGRi
KQoreworICAgIGRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uKHR4KSB7IAorICAgICAgICBsb2coIklu
c2VydGluZyBzb21lIGRhdGEiKTsKKyAgICAgICAgLy8gSW5zZXJ0IGEgbGFyZ2UgYW1vdW50IG9m
IGRhdGEgdGhhdCB3aWxsIHRha2UgYSBsaXR0bGUgd2hpbGUgdG8gcnVuLiBTY2hlZHVsZSBhIHRp
bW91dCB0byBydW4gdGhhdCB3aWxsIGxvYWQgYSBuZXcgcGFnZQorICAgICAgICAvLyB3aGlsc3Qg
dGhlIHRyYW5zYWN0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzLCBpbnRlcnJ1cHRpbmcgdGhlIHRy
YW5zYWN0aW9uLiBUaGlzIHNob3VsZCBub3QgbGVhdmUgdGhlIGRhdGFiYXNlIGxvY2tlZCBhbmQg
b24KKyAgICAgICAgLy8gdGhlIG5leHQgcGFnZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQg
c29tZSBtb3JlIGRhdGEuCisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIERhdGFU
ZXN0ICh0ZXN0RGF0YSkgVkFMVUVTIChyYW5kb21CbG9iKDUyNDIwMCApKSIsIFtdLCBmdW5jdGlv
bih0eCwgcmVzdWx0KSB7IH0sIGVycm9yRnVuY3Rpb24pOworICAgICAgICBsb2NhdGlvbi5ocmVm
ID0gIi4vcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbCI7CisgICAg
fSwgZXJyb3JGdW5jdGlvbiwgZnVuY3Rpb24oKSB7IAorICAgICAgICBmaW5pc2hUZXN0KCk7Cisg
ICAgfSk7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0
VGVzdENvbnRyb2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuY2xlYXJBbGxE
YXRhYmFzZXMoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOwor
ICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorICAg
IAorICAgIHRyeSB7CisgICAgICAgIGRhdGFiYXNlID0gb3BlbkRhdGFiYXNlKCJEYXRhYmFzZUxv
Y2tUZXN0IiwgIjEuMCIsICJUZXN0IGZvciBkYXRhYmFzZSBsb2NraW5nIiwgNTI0Mjg4MCk7Cisg
ICAgfSBjYXRjaCAoZSkgeworICAgICAgICBsb2coIkVycm9yIC0gY291bGQgbm90IG9wZW4gZGF0
YWJhc2UiKTsKKyAgICAgICAgZmluaXNoVGVzdCgpOworICAgIH0KKyAgICAKKyAgICBkYXRhYmFz
ZS50cmFuc2FjdGlvbihmdW5jdGlvbih0eCkgeworICAgICAgICBsb2coIkFkZGluZyBhIHRhYmxl
Iik7CisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBEYXRhVGVzdCAodGVzdERh
dGEpIiwgW10sIGZ1bmN0aW9uKHR4LCByZXN1bHQpIHsgfSwgZXJyb3JGdW5jdGlvbik7IAorICAg
IH0sIGVycm9yRnVuY3Rpb24sIGZ1bmN0aW9uKCkgeyAKKyAgICAgICAgYWRkRGF0YShkYXRhYmFz
ZSk7IAorICAgIH0pOworfQorCis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkgb25sb2FkPSJy
dW5UZXN0KCkiPgorPHByZSBpZD0iY29uc29sZSI+Cis8L3ByZT4KKzwvYm9keT4KKworPC9odG1s
PgoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC5odG1sCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBu
YXRpdmUKCkluZGV4OiBMYXlvdXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2Nr
LWFmdGVyLXJlbG9hZC0yLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9y
ZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCShyZXZpc2lvbiAwKQor
KysgTGF5b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxv
YWQtMi5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU5IEBACis8aHRtbD4KKzxoZWFkPgor
PHNjcmlwdD4KK3ZhciBkYXRhYmFzZTsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAg
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSAr
ICI8YnI+IjsKK30KKworZnVuY3Rpb24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJUZXN0IHBh
cnQgMiBDb21wbGV0ZSIpOworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisg
ICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24g
ZXJyb3JGdW5jdGlvbih0eCwgZXJyb3IpCit7CisgICAgbG9nKCJUZXN0IGZhaWxlZCAtICIgKyBl
cnJvci5tZXNzYWdlKTsKKyAgICBmaW5pc2hUZXN0KCk7Cit9CisKK2Z1bmN0aW9uIGFkZERhdGEo
ZGIpCit7CisgICAgZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24odHgpIHsgCisgICAgICAgIGxvZygi
SW5zZXJ0aW5nIHNvbWUgZGF0YSIpOworCisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJ
TlRPIERhdGFUZXN0ICh0ZXN0RGF0YSkgVkFMVUVTICg/KSIsIFsiQSJdLCBmdW5jdGlvbih0eCwg
cmVzdWx0KSB7IH0sIGVycm9yRnVuY3Rpb24pOworICAgIH0sIGZ1bmN0aW9uKCl7fSwgZnVuY3Rp
b24oKSB7IAorICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgfSk7Cit9CisKK2Z1bmN0aW9uIHJ1
blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAg
ICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorICAgIAorICAgIHRyeSB7CisgICAg
ICAgIGRhdGFiYXNlID0gb3BlbkRhdGFiYXNlKCJEYXRhYmFzZUxvY2tUZXN0IiwgIjEuMCIsICJU
ZXN0IGZvciBkYXRhYmFzZSBsb2NraW5nIiwgNTI0Mjg4MCk7CisgICAgICAgIGFkZERhdGEoZGF0
YWJhc2UpOworICAgIH0gY2F0Y2goZSkgeworICAgICAgICBsb2coIkVycm9yIC0gY291bGQgbm90
IG9wZW4gZGF0YWJhc2UiKTsKKyAgICAgICAgZmluaXNoVGVzdCgpOworICAgIH0KK30KKworPC9z
Y3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KKzxwcmUgaWQ9ImNv
bnNvbGUiPgorPC9wcmU+Cis8L2JvZHk+CisKKzwvaHRtbD4KClByb3BlcnR5IGNoYW5nZXMgb246
IExheW91dFRlc3RzL3N0b3JhZ2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2Fk
LTIuaHRtbApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgo=
</data>
<flag name="review"
          id="16631"
          type_id="1"
          status="+"
          setter="koivisto"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>32235</attachid>
            <date>2009-07-03 04:16:45 -0700</date>
            <delta_ts>2009-07-03 04:16:45 -0700</delta_ts>
            <desc>Patch addressing Antti&apos;s final comments. (please submit this version of the patch)</desc>
            <filename>25711-03071052.txt</filename>
            <type>text/plain</type>
            <size>12176</size>
            <attacher name="Ben Murdoch">benm</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NTQ0NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjIgQEAKKzIwMDktMDctMDEgIEJlbiBNdXJkb2NoICA8YmVubUBnb29nbGUuY29t
PgorCisgICAgICAgIEZpeCBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTI1NzExLCB3aGVyZSB3ZWIgc3RvcmFnZSBkYXRhYmFzZXMgY291bGQgYmVjb21lIGxvY2tl
ZCB1bnRpbCB0aGUgYnJvd3NlciBpcyBzaHV0IGRvd24gaWYgdGhlIHBhZ2UgaXMgcmVmcmVzaGVk
IHdoaWxzdCBhIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLgorCisgICAgICAgIFRlc3Q6IHN0
b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAorCisgICAgICAgICogc3RvcmFn
ZS9EYXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZTo6RGF0YWJhc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6RGF0YWJhc2U6OmNsb3NlKTogYWRkIGNvZGUgdG8gaW5mb3JtIHRo
ZSBkYXRhYmFzZSB0aHJlYWQgd2UndmUgY2xvc2VkIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgKFdl
YkNvcmU6OkRhdGFiYXNlOjpwZXJmb3JtT3BlbkFuZFZlcmlmeSk6IGFkZCBjb2RlIHRvIGluZm9y
bSB0aGUgZGF0YWJhc2UgdGhyZWFkIHdlJ3ZlIG9wZW5lZCBhIGRhdGFiYXNlLgorICAgICAgICAq
IHN0b3JhZ2UvRGF0YWJhc2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlOjpvcGVuZWQp
OiByZXR1cm4gdHJ1ZSBpZmYgdGhlIHVuZGVybHlpbmcgc3FsaXRlIGRhdGFiYXNlIGhhcyBiZWVu
IG9wZW5lZCBidXQgbm90IGNsb3NlZC4KKyAgICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVGhyZWFk
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCk6
IEJlZm9yZSB0aGUgZGF0YWJhc2UgdGhyZWFkIHRlcm1pbmF0ZXMsIGNsb3NlIGFueSBkYXRhYmFz
ZXMgdGhhdCByYW4gdHJhbnNhY3Rpb25zIGluIHRoaXMgdGhyZWFkLgorICAgICAgICAoV2ViQ29y
ZTo6RGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlT3Blbik6IFJlY29yZHMgYSBkYXRhYmFz
ZSB0aGF0IGV4ZWN1dGVkIGEgdHJhbnNhY3Rpb24gaW4gdGhpcyB0aHJlYWQuCisgICAgICAgIChX
ZWJDb3JlOjpEYXRhYmFzZVRocmVhZDo6cmVjb3JkRGF0YWJhc2VDbG9zZWQpOiBSZW1vdmVzIGEg
ZGF0YWJhc2UgZnJvbSB0aGUgc2V0IG9mIG9wZW4gZGF0YWJhc2VzLgorICAgICAgICAqIHN0b3Jh
Z2UvRGF0YWJhc2VUaHJlYWQuaDoKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVGhyZWFkOjpn
ZXRUaHJlYWRJRCk6IHJldHVybiB0aGUgdGhyZWFkIGlkIGZvciB0aGUgZGF0YWJhc2UgdGhyZWFk
LgorCiAyMDA5LTA3LTAxICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1hbm5A
dG9yY2htb2JpbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEdlb3JnZSBTdGFpa29zLgpJ
bmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3N0b3JhZ2UvRGF0YWJhc2UuY3BwCShyZXZpc2lvbiA0NTQ2OSkKKysrIFdlYkNvcmUvc3RvcmFn
ZS9EYXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDYgKzYwLDkgQEAKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCisvLyBJZiB3ZSBzbGVlcCBmb3IgbW9yZSB0aGUgMzAgc2Vjb25kcyB3
aGlsZSBibG9ja2VkIG9uIFNRTElURV9CVVNZLCBnaXZlIHVwLgorc3RhdGljIGNvbnN0IGludCBt
YXhTcWxpdGVCdXN5V2FpdFRpbWUgPSAzMDAwMDsKKwogY29uc3QgU3RyaW5nJiBEYXRhYmFzZTo6
ZGF0YWJhc2VJbmZvVGFibGVOYW1lKCkKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmlu
ZywgbmFtZSwgKCJfX1dlYktpdERhdGFiYXNlSW5mb1RhYmxlX18iKSk7CkBAIC0xMzIsNiArMTM1
LDcgQEAgRGF0YWJhc2U6OkRhdGFiYXNlKERvY3VtZW50KiBkb2N1bWVudCwgYwogICAgICwgbV9l
eHBlY3RlZFZlcnNpb24oZXhwZWN0ZWRWZXJzaW9uKQogICAgICwgbV9kZWxldGVkKGZhbHNlKQog
ICAgICwgbV9zdG9wcGVkKGZhbHNlKQorICAgICwgbV9vcGVuZWQoZmFsc2UpCiB7CiAgICAgQVNT
RVJUKGRvY3VtZW50KTsKICAgICBtX3NlY3VyaXR5T3JpZ2luID0gZG9jdW1lbnQtPnNlY3VyaXR5
T3JpZ2luKCk7CkBAIC0zMTYsNyArMzIwLDEzIEBAIHZvaWQgRGF0YWJhc2U6Om1hcmtBc0RlbGV0
ZWRBbmRDbG9zZSgpCiAKIHZvaWQgRGF0YWJhc2U6OmNsb3NlKCkKIHsKLSAgICBtX3NxbGl0ZURh
dGFiYXNlLmNsb3NlKCk7CisgICAgaWYgKG1fb3BlbmVkKSB7CisgICAgICAgIEFTU0VSVChtX2Rv
Y3VtZW50LT5kYXRhYmFzZVRocmVhZCgpKTsKKyAgICAgICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQo
KSA9PSBkb2N1bWVudCgpLT5kYXRhYmFzZVRocmVhZCgpLT5nZXRUaHJlYWRJRCgpKTsKKyAgICAg
ICAgbV9zcWxpdGVEYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtX2RvY3VtZW50LT5kYXRhYmFz
ZVRocmVhZCgpLT5yZWNvcmREYXRhYmFzZUNsb3NlZCh0aGlzKTsKKyAgICAgICAgbV9vcGVuZWQg
PSBmYWxzZTsKKyAgICB9CiB9CiAKIHZvaWQgRGF0YWJhc2U6OnN0b3AoKQpAQCAtNDI2LDggKzQz
NiwxMyBAQCBib29sIERhdGFiYXNlOjpwZXJmb3JtT3BlbkFuZFZlcmlmeShFeGNlCiAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBtX29wZW5lZCA9IHRydWU7CisgICAgaWYgKG1f
ZG9jdW1lbnQtPmRhdGFiYXNlVGhyZWFkKCkpCisgICAgICAgIG1fZG9jdW1lbnQtPmRhdGFiYXNl
VGhyZWFkKCktPnJlY29yZERhdGFiYXNlT3Blbih0aGlzKTsKKwogICAgIEFTU0VSVChtX2RhdGFi
YXNlQXV0aG9yaXplcik7CiAgICAgbV9zcWxpdGVEYXRhYmFzZS5zZXRBdXRob3JpemVyKG1fZGF0
YWJhc2VBdXRob3JpemVyKTsKKyAgICBtX3NxbGl0ZURhdGFiYXNlLnNldEJ1c3lUaW1lb3V0KG1h
eFNxbGl0ZUJ1c3lXYWl0VGltZSk7CiAKICAgICBpZiAoIW1fc3FsaXRlRGF0YWJhc2UudGFibGVF
eGlzdHMoZGF0YWJhc2VJbmZvVGFibGVOYW1lKCkpKSB7CiAgICAgICAgIGlmICghbV9zcWxpdGVE
YXRhYmFzZS5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFICIgKyBkYXRhYmFzZUluZm9UYWJs
ZU5hbWUoKSArICIgKGtleSBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwgVU5JUVVFIE9O
IENPTkZMSUNUIFJFUExBQ0UsdmFsdWUgVEVYVCBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMKTsi
KSkgewpJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9zdG9yYWdlL0RhdGFiYXNlLmgJKHJldmlzaW9uIDQ1NDY5KQorKysgV2ViQ29yZS9zdG9y
YWdlL0RhdGFiYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMCw2ICsxMDAsNyBAQCBwdWJsaWM6
CiAgICAgYm9vbCBkZWxldGVkKCkgY29uc3QgeyByZXR1cm4gbV9kZWxldGVkOyB9CiAKICAgICB2
b2lkIGNsb3NlKCk7CisgICAgYm9vbCBvcGVuZWQoKSBjb25zdCB7IHJldHVybiBtX29wZW5lZDsg
fQogICAgIAogICAgIHZvaWQgc3RvcCgpOwogICAgIGJvb2wgc3RvcHBlZCgpIGNvbnN0IHsgcmV0
dXJuIG1fc3RvcHBlZDsgfQpAQCAtMTQxLDYgKzE0Miw4IEBAIHByaXZhdGU6CiAgICAgCiAgICAg
Ym9vbCBtX3N0b3BwZWQ7CiAKKyAgICBib29sIG1fb3BlbmVkOworCiAgICAgU1FMaXRlRGF0YWJh
c2UgbV9zcWxpdGVEYXRhYmFzZTsKICAgICBSZWZQdHI8RGF0YWJhc2VBdXRob3JpemVyPiBtX2Rh
dGFiYXNlQXV0aG9yaXplcjsKIApJbmRleDogV2ViQ29yZS9zdG9yYWdlL0RhdGFiYXNlVGhyZWFk
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvRGF0YWJhc2VUaHJlYWQuY3BwCShy
ZXZpc2lvbiA0NTQ2OSkKKysrIFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTk5LDYgKzk5LDE3IEBAIHZvaWQqIERhdGFiYXNlVGhyZWFkOjpkYXRh
YmFzZVRocmVhZCgpCiAKICAgICBMT0coU3RvcmFnZUFQSSwgIkFib3V0IHRvIGRldGFjaCB0aHJl
YWQgJWkgYW5kIGNsZWFyIHRoZSByZWYgdG8gRGF0YWJhc2VUaHJlYWQgJXAsIHdoaWNoIGN1cnJl
bnRseSBoYXMgJWkgcmVmKHMpIiwgbV90aHJlYWRJRCwgdGhpcywgcmVmQ291bnQoKSk7CiAKKyAg
ICAvLyBDbG9zZSB0aGUgZGF0YWJhc2VzIHRoYXQgd2UgcmFuIHRyYW5zYWN0aW9ucyBvbi4gVGhp
cyBlbnN1cmVzIHRoYXQgaWYgYW55IHRyYW5zYWN0aW9ucyBhcmUgc3RpbGwgb3BlbiwgdGhleSBh
cmUgcm9sbGVkIGJhY2sgYW5kIHdlIGRvbid0IGxlYXZlIHRoZSBkYXRhYmFzZSBpbiBhbgorICAg
IC8vIGluY29uc2lzdGVudCBvciBsb2NrZWQgc3RhdGUuCisgICAgaWYgKG1fb3BlbkRhdGFiYXNl
U2V0LnNpemUoKSA+IDApIHsKKyAgICAgICAgLy8gQXMgdGhlIGNhbGwgdG8gY2xvc2Ugd2lsbCBt
b2RpZnkgdGhlIG9yaWdpbmFsIHNldCwgd2UgbXVzdCB0YWtlIGEgY29weSB0byBpdGVyYXRlIG92
ZXIuCisgICAgICAgIERhdGFiYXNlU2V0IG9wZW5TZXRDb3B5OworICAgICAgICBvcGVuU2V0Q29w
eS5zd2FwKG1fb3BlbkRhdGFiYXNlU2V0KTsKKyAgICAgICAgRGF0YWJhc2VTZXQ6Oml0ZXJhdG9y
IGVuZCA9IG9wZW5TZXRDb3B5LmVuZCgpOworICAgICAgICBmb3IgKERhdGFiYXNlU2V0OjppdGVy
YXRvciBpdCA9IG9wZW5TZXRDb3B5LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAg
ICAgKCppdCktPmNsb3NlKCk7CisgICAgfQorCiAgICAgLy8gRGV0YWNoIHRoZSB0aHJlYWQgc28g
aXRzIHJlc291cmNlcyBhcmUgbm8gbG9uZ2VyIG9mIGFueSBjb25jZXJuIHRvIGFueW9uZSBlbHNl
CiAgICAgZGV0YWNoVGhyZWFkKG1fdGhyZWFkSUQpOwogCkBAIC0xMDgsNiArMTE5LDIwIEBAIHZv
aWQqIERhdGFiYXNlVGhyZWFkOjpkYXRhYmFzZVRocmVhZCgpCiAgICAgcmV0dXJuIDA7CiB9CiAK
K3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlT3BlbihEYXRhYmFzZSogZGF0YWJh
c2UpIHsKKyAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IG1fdGhyZWFkSUQpOworICAgIEFT
U0VSVChkYXRhYmFzZSk7CisgICAgQVNTRVJUKCFtX29wZW5EYXRhYmFzZVNldC5jb250YWlucyhk
YXRhYmFzZSkpOworICAgIG1fb3BlbkRhdGFiYXNlU2V0LmFkZChkYXRhYmFzZSk7Cit9CisKK3Zv
aWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlQ2xvc2VkKERhdGFiYXNlKiBkYXRhYmFz
ZSkgeworICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gbV90aHJlYWRJRCk7CisgICAgQVNT
RVJUKGRhdGFiYXNlKTsKKyAgICBBU1NFUlQobV9xdWV1ZS5raWxsZWQoKSB8fCBtX29wZW5EYXRh
YmFzZVNldC5jb250YWlucyhkYXRhYmFzZSkpOworICAgIG1fb3BlbkRhdGFiYXNlU2V0LnJlbW92
ZShkYXRhYmFzZSk7Cit9CisKIHZvaWQgRGF0YWJhc2VUaHJlYWQ6OnNjaGVkdWxlVGFzayhQYXNz
UmVmUHRyPERhdGFiYXNlVGFzaz4gdGFzaykKIHsKICAgICBtX3F1ZXVlLmFwcGVuZCh0YXNrKTsK
SW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5oCShyZXZpc2lvbiA0NTQ2OSkKKysrIFdlYkNv
cmUvc3RvcmFnZS9EYXRhYmFzZVRocmVhZC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1Niwx
MCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzY2hlZHVsZUltbWVkaWF0ZVRhc2soUGFzc1JlZlB0cjxE
YXRhYmFzZVRhc2s+KTsgLy8gVGhpcyBqdXN0IGFkZHMgdGhlIHRhc2sgdG8gdGhlIGZyb250IG9m
IHRoZSBxdWV1ZSAtIHRoZSBjYWxsZXIgbmVlZHMgdG8gYmUgZXh0cmVtZWx5IGNhcmVmdWwgbm90
IHRvIGNyZWF0ZSBkZWFkbG9ja3Mgd2hlbiB3YWl0aW5nIGZvciBjb21wbGV0aW9uLgogICAgIHZv
aWQgdW5zY2hlZHVsZURhdGFiYXNlVGFza3MoRGF0YWJhc2UqKTsKIAorICAgIHZvaWQgcmVjb3Jk
RGF0YWJhc2VPcGVuKERhdGFiYXNlKik7CisgICAgdm9pZCByZWNvcmREYXRhYmFzZUNsb3NlZChE
YXRhYmFzZSopOworICAgIFRocmVhZElkZW50aWZpZXIgZ2V0VGhyZWFkSUQoKSB7IHJldHVybiBt
X3RocmVhZElEOyB9CisKIHByaXZhdGU6CiAgICAgRGF0YWJhc2VUaHJlYWQoKTsKIApAQCAtNjcs
NiArNzEsMTAgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8RGF0YWJhc2VUaHJlYWQ+IG1fc2VsZlJl
ZjsKIAogICAgIE1lc3NhZ2VRdWV1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+IG1fcXVldWU7CisK
KyAgICAvLyBUaGlzIHNldCBrZWVwcyB0cmFjayBvZiB0aGUgb3BlbiBkYXRhYmFzZXMgdGhhdCBo
YXZlIGJlZW4gdXNlZCBvbiB0aGlzIHRocmVhZC4KKyAgICB0eXBlZGVmIEhhc2hTZXQ8UmVmUHRy
PERhdGFiYXNlPiA+IERhdGFiYXNlU2V0OworICAgIERhdGFiYXNlU2V0IG1fb3BlbkRhdGFiYXNl
U2V0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNDU0
NDQpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwx
MSBAQAorMjAwOS0wNy0wMSAgQmVuIE11cmRvY2ggIDxiZW5tQGdvb2dsZS5jb20+CisKKyAgICAg
ICAgVGVzdHMgZml4IGZvciBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjU3MTEsIHdoZXJlIHdlYiBzdG9yYWdlIGRhdGFiYXNlcyBjb3VsZCBiZWNvbWUgbG9ja2VkIHVu
dGlsIHRoZSBicm93c2VyIGlzIHNodXQgZG93biBpZiB0aGUgcGFnZSBpcyByZWZyZXNoZWQgd2hp
bHN0IGEgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuCisKKyAgICAgICAgKiBzdG9yYWdlL2Rh
dGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICog
c3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sOiBBZGRlZC4KKyAgICAgICAg
KiBzdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0bWw6IEFk
ZGVkLgorCiAyMDA5LTA3LTAxICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1h
bm5AdG9yY2htb2JpbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEdlb3JnZSBTdGFpa29z
LgpJbmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC1l
eHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1s
b2NrLWFmdGVyLXJlbG9hZC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9zdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwzIEBACitJbnNlcnRpbmcgc29tZSBkYXRhCitUZXN0IHBhcnQgMiBD
b21wbGV0ZQorCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9zdG9yYWdlL2RhdGFi
YXNlLWxvY2stYWZ0ZXItcmVsb2FkLWV4cGVjdGVkLnR4dApfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46
ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFz
ZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3N0b3Jh
Z2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91
dFRlc3RzL3N0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw2OSBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQ+Cit2YXIgZGF0YWJh
c2U7CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKQoreworICAgIGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCJjb25zb2xlIikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9CisKK2Z1bmN0
aW9uIGZpbmlzaFRlc3QoKQoreworICAgIGxvZygiVGVzdCBwYXJ0IDEgQ29tcGxldGUiKTsKKyAg
ICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29u
dHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIGVycm9yRnVuY3Rpb24odHgsIGVy
cm9yKQoreworICAgIGxvZygiVGVzdCBmYWlsZWQgLSAiICsgZXJyb3IubWVzc2FnZSk7CisgICAg
ZmluaXNoVGVzdCgpOworfQorCitmdW5jdGlvbiBhZGREYXRhKGRiKQoreworICAgIGRiLnRyYW5z
YWN0aW9uKGZ1bmN0aW9uKHR4KSB7IAorICAgICAgICBsb2coIkluc2VydGluZyBzb21lIGRhdGEi
KTsKKyAgICAgICAgLy8gSW5zZXJ0IGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgdGhhdCB3aWxsIHRh
a2UgYSBsaXR0bGUgd2hpbGUgdG8gcnVuLiBTY2hlZHVsZSBhIHRpbW91dCB0byBydW4gdGhhdCB3
aWxsIGxvYWQgYSBuZXcgcGFnZQorICAgICAgICAvLyB3aGlsc3QgdGhlIHRyYW5zYWN0aW9uIGlz
IHN0aWxsIGluIHByb2dyZXNzLCBpbnRlcnJ1cHRpbmcgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHNo
b3VsZCBub3QgbGVhdmUgdGhlIGRhdGFiYXNlIGxvY2tlZCBhbmQgb24KKyAgICAgICAgLy8gdGhl
IG5leHQgcGFnZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQgc29tZSBtb3JlIGRhdGEuCisg
ICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIERhdGFUZXN0ICh0ZXN0RGF0YSkgVkFM
VUVTIChyYW5kb21CbG9iKDUyNDIwMCApKSIsIFtdLCBmdW5jdGlvbih0eCwgcmVzdWx0KSB7IH0s
IGVycm9yRnVuY3Rpb24pOworICAgICAgICBsb2NhdGlvbi5ocmVmID0gIi4vcmVzb3VyY2VzL2Rh
dGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbCI7CisgICAgfSwgZXJyb3JGdW5jdGlvbiwg
ZnVuY3Rpb24oKSB7IAorICAgICAgICBmaW5pc2hUZXN0KCk7CisgICAgfSk7Cit9CisKK2Z1bmN0
aW9uIHJ1blRlc3QoKQoreworICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsK
KyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuY2xlYXJBbGxEYXRhYmFzZXMoKTsKKyAgICAg
ICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgfQorICAgIAorICAgIHRyeSB7CisgICAg
ICAgIGRhdGFiYXNlID0gb3BlbkRhdGFiYXNlKCJEYXRhYmFzZUxvY2tUZXN0IiwgIjEuMCIsICJU
ZXN0IGZvciBkYXRhYmFzZSBsb2NraW5nIiwgNTI0Mjg4MCk7CisgICAgfSBjYXRjaCAoZSkgewor
ICAgICAgICBsb2coIkVycm9yIC0gY291bGQgbm90IG9wZW4gZGF0YWJhc2UiKTsKKyAgICAgICAg
ZmluaXNoVGVzdCgpOworICAgIH0KKyAgICAKKyAgICBkYXRhYmFzZS50cmFuc2FjdGlvbihmdW5j
dGlvbih0eCkgeworICAgICAgICBsb2coIkFkZGluZyBhIHRhYmxlIik7CisgICAgICAgIHR4LmV4
ZWN1dGVTcWwoIkNSRUFURSBUQUJMRSBEYXRhVGVzdCAodGVzdERhdGEpIiwgW10sIGZ1bmN0aW9u
KHR4LCByZXN1bHQpIHsgfSwgZXJyb3JGdW5jdGlvbik7IAorICAgIH0sIGVycm9yRnVuY3Rpb24s
IGZ1bmN0aW9uKCkgeyAKKyAgICAgICAgYWRkRGF0YShkYXRhYmFzZSk7IAorICAgIH0pOworfQor
Cis8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHkgb25sb2FkPSJydW5UZXN0KCkiPgorPHByZSBp
ZD0iY29uc29sZSI+Cis8L3ByZT4KKzwvYm9keT4KKworPC9odG1sPgoKUHJvcGVydHkgY2hhbmdl
cyBvbjogTGF5b3V0VGVzdHMvc3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1s
Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCkluZGV4OiBMYXlv
dXRUZXN0cy9zdG9yYWdlL3Jlc291cmNlcy9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC0yLmh0
bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvc3RvcmFnZS9yZXNvdXJjZXMvZGF0YWJhc2Ut
bG9jay1hZnRlci1yZWxvYWQtMi5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvc3Rv
cmFnZS9yZXNvdXJjZXMvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQtMi5odG1sCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDU5IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdD4KK3ZhciBkYXRh
YmFzZTsKKworZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoImNvbnNvbGUiKS5pbm5lckhUTUwgKz0gbWVzc2FnZSArICI8YnI+IjsKK30KKworZnVu
Y3Rpb24gZmluaXNoVGVzdCgpCit7CisgICAgbG9nKCJUZXN0IHBhcnQgMiBDb21wbGV0ZSIpOwor
ICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxheW91dFRlc3RD
b250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24gZXJyb3JGdW5jdGlvbih0eCwg
ZXJyb3IpCit7CisgICAgbG9nKCJUZXN0IGZhaWxlZCAtICIgKyBlcnJvci5tZXNzYWdlKTsKKyAg
ICBmaW5pc2hUZXN0KCk7Cit9CisKK2Z1bmN0aW9uIGFkZERhdGEoZGIpCit7CisgICAgZGIudHJh
bnNhY3Rpb24oZnVuY3Rpb24odHgpIHsgCisgICAgICAgIGxvZygiSW5zZXJ0aW5nIHNvbWUgZGF0
YSIpOworCisgICAgICAgIHR4LmV4ZWN1dGVTcWwoIklOU0VSVCBJTlRPIERhdGFUZXN0ICh0ZXN0
RGF0YSkgVkFMVUVTICg/KSIsIFsiQSJdLCBmdW5jdGlvbih0eCwgcmVzdWx0KSB7IH0sIGVycm9y
RnVuY3Rpb24pOworICAgIH0sIGZ1bmN0aW9uKCl7fSwgZnVuY3Rpb24oKSB7IAorICAgICAgICBm
aW5pc2hUZXN0KCk7CisgICAgfSk7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3QoKQoreworICAgIGlm
ICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50
aWxEb25lKCk7CisgICAgfQorICAgIAorICAgIHRyeSB7CisgICAgICAgIGRhdGFiYXNlID0gb3Bl
bkRhdGFiYXNlKCJEYXRhYmFzZUxvY2tUZXN0IiwgIjEuMCIsICJUZXN0IGZvciBkYXRhYmFzZSBs
b2NraW5nIiwgNTI0Mjg4MCk7CisgICAgICAgIGFkZERhdGEoZGF0YWJhc2UpOworICAgIH0gY2F0
Y2goZSkgeworICAgICAgICBsb2coIkVycm9yIC0gY291bGQgbm90IG9wZW4gZGF0YWJhc2UiKTsK
KyAgICAgICAgZmluaXNoVGVzdCgpOworICAgIH0KK30KKworPC9zY3JpcHQ+Cis8L2hlYWQ+CisK
Kzxib2R5IG9ubG9hZD0icnVuVGVzdCgpIj4KKzxwcmUgaWQ9ImNvbnNvbGUiPgorPC9wcmU+Cis8
L2JvZHk+CisKKzwvaHRtbD4KClByb3BlcnR5IGNoYW5nZXMgb246IExheW91dFRlc3RzL3N0b3Jh
Z2UvcmVzb3VyY2VzL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLTIuaHRtbApfX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
CkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>