<?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>29193</bug_id>
          
          <creation_ts>2009-09-11 10:42:24 -0700</creation_ts>
          <short_desc>[chromium] Prevent JavaScript busy-loops in unload handlers</short_desc>
          <delta_ts>2009-09-21 20:32:08 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="John Abd-El-Malek">jam</reporter>
          <assigned_to name="John Abd-El-Malek">jam</assigned_to>
          <cc>abarth</cc>
    
    <cc>ager</cc>
    
    <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>pkasting</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>146635</commentid>
    <comment_count>0</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-11 10:42:24 -0700</bug_when>
    <thetext>This is causing poor user experience.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>146675</commentid>
    <comment_count>1</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-11 11:39:35 -0700</bug_when>
    <thetext>BTW more background about this is available at http://code.google.com/p/chromium/issues/detail?id=7823</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147257</commentid>
    <comment_count>2</comment_count>
      <attachid>39587</attachid>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-14 22:12:09 -0700</bug_when>
    <thetext>Created attachment 39587
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147262</commentid>
    <comment_count>3</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-09-15 00:17:53 -0700</bug_when>
    <thetext>It seems like the new test will fail with JSC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147263</commentid>
    <comment_count>4</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-15 00:33:27 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; It seems like the new test will fail with JSC.

yes of course, thanks for noting.  I had modified the skipped files of all the other ports but failed to recreate those changes after moving this change to another machine.  Will upload a newer patch now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147264</commentid>
    <comment_count>5</comment_count>
      <attachid>39590</attachid>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-15 00:43:11 -0700</bug_when>
    <thetext>Created attachment 39590
Update Skipped files for other platforms</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147282</commentid>
    <comment_count>6</comment_count>
      <attachid>39590</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 07:26:36 -0700</bug_when>
    <thetext>Comment on attachment 39590
Update Skipped files for other platforms

This patch has a number of strange side effects.  Most notably, the result of Date.prototype.getTime.toString() will change from its normal value to something wonky at odd times.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147287</commentid>
    <comment_count>7</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-09-15 08:29:43 -0700</bug_when>
    <thetext>Is it really a good idea for us to diverge here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147288</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 08:32:25 -0700</bug_when>
    <thetext>Another wonky thing is that you leak this powerful function that calls v8::V8::TerminateExecution() to the page.  I&apos;m not entirely sure what evil things the page might do with that function, but it seems like a bad idea.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147290</commentid>
    <comment_count>9</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-15 08:48:14 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; Another wonky thing is that you leak this powerful function that calls
&gt; v8::V8::TerminateExecution() to the page.  I&apos;m not entirely sure what evil
&gt; things the page might do with that function, but it seems like a bad idea.

Do you mean indirectly leak by calling getTime 1K times in an unload handler?  The page can&apos;t do anything that will call this function otherwise, since the only pointer to it is in the closure.

Re getTime.toString showing different results.  I think this is pretty minor, especially compared to the problems that this solves (check out the chromium bug link for comments on how big the problem is, and other drastic changes that people wanted to do to prevent it).  It won&apos;t be possible to do this with no side effects unless we have V8 changes, which the V8 team doesn&apos;t think is necessary.  They are happy with this approach (Mads reviewed it).

This is a stop-gap measure until we implement &lt;a ping&gt; and evangelize it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147291</commentid>
    <comment_count>10</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-15 08:51:08 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Is it really a good idea for us to diverge here?

I had emailed you and Maciej a few weeks ago about this, to see if you&apos;re interested in doing something that works for both Safari and Chrome, but I never heard back so I did something just for Chrome.  If you&apos;d like something like this for JSC based browsers, I&apos;d be happy to look into it.  Otherwise I think this doesn&apos;t preclude Chrome from solving this problem for now.  This is a big issue, i.e. some pages have upwards of 2 seconds of sleep in their unload handlers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147296</commentid>
    <comment_count>11</comment_count>
      <attachid>39590</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 08:57:02 -0700</bug_when>
    <thetext>Comment on attachment 39590
Update Skipped files for other platforms

I really don&apos;t think this is the right approach.  This doesn&apos;t actually solve the problem.  Sites that want to sleep in their unload handlers will just resort to a Yet More Ridiculous Hack and save the original getTime function.

The proper way to solve this problem is to give V8 a time bound for running the unload handler and have V8 terminate the script internally.  Hacking around with the global JS environment is prone to disaster.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147309</commentid>
    <comment_count>12</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-09-15 09:42:52 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; The proper way to solve this problem is to give V8 a time bound for running the
&gt; unload handler and have V8 terminate the script internally.  Hacking around
&gt; with the global JS environment is prone to disaster.

Time based is not good enough given the resolution we are talking about here.  We want to be able to terminate after ~100ms worth of execution, but at that time scale, we&apos;ll get a lot of false positives due to the thread being interrupted by other processing on the system.  So, we need to count something.  Maybe counting getTime calls is not the best solution, but we need to count something other than elapsed wall clock time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147316</commentid>
    <comment_count>13</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 10:19:47 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; So, we need to count something.

Does V8 have a notion of number of operations?  Maybe you should just bound the total number of operations.  I think you should assume that the site is going to try to work around this limitation because sites are already using ridiculous hacks as is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147318</commentid>
    <comment_count>14</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-09-15 10:30:00 -0700</bug_when>
    <thetext>My sincere hope here was to avoid retaliatory cycle of workarounds from Web developers, because the change doesn&apos;t break their behavior: the network requests they are waiting for to complete should have ample time to do so. So maybe they won&apos;t even notice we&apos;re doing this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147319</commentid>
    <comment_count>15</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 10:37:03 -0700</bug_when>
    <thetext>Wow, that crbug thread is a monster.  I presume you&apos;ve investigated other options like just hiding the tab while the unload handler runs (or after the unload handler has been running for too long).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147326</commentid>
    <comment_count>16</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-15 10:47:18 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; Wow, that crbug thread is a monster.  I presume you&apos;ve investigated other
&gt; options like just hiding the tab while the unload handler runs (or after the
&gt; unload handler has been running for too long).

Yeah, a lot of the context is in that bug, and also in hallway/email/rietveld discussions with Darin/Mike/Mads/Dimitri and others.

Hiding the tab has its own issues (i.e. what if an alert/prompt/showModalDialog is shown?), and also doesn&apos;t fix the navigation use case.

As I mentioned in the crbug thread, this isn&apos;t meant as a fool-proof workaround, since that&apos;s a losing battle (i.e. sites can just compute primes, or register a thousand handlers to defeat any limit on an individual running time/cycles of a handler).  This bug is a testament to what web developers will do to workaround any browser limitations.  The result is a much worse user experience.

This is only a stop gap until we have &lt;a ping&gt;, which I&apos;ll be looking at soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147334</commentid>
    <comment_count>17</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 10:55:35 -0700</bug_when>
    <thetext>John is going to send me all the info, and I&apos;ll post a summary here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147444</commentid>
    <comment_count>18</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 18:23:59 -0700</bug_when>
    <thetext>Ok.  I&apos;ve read all the relevant info.  As in most things, agree with Darin.  Some background:

1) A number of web pages are super slow to close because they are lame and chew up a lot of time in their unload handlers in order to get some network pings to the server for analytics.

2) These scripts are optimized to evade common browser defenses for slow script.  For example, one ad network adds a bunch of 200ms unload event handlers to avoid the slow script dialog.

3) John is excited about tricking these scripts by manipulating the clock, but no one else seems excited by that plan because of the following concerns:
  a) Not all the unload scripts use Date to sleep.
  b) These checks can be worked around, creating an arms race that we cannot win.

4) To my mind, a better approach is that proposed by Peter in http://code.google.com/p/chromium/issues/detail?id=7823#c20 (and supported by Linus in http://code.google.com/p/chromium/issues/detail?id=7823#c49) is to hide tabs once the user clicks the close button.  John points out this has a number of strange corner cases involving zombie tabs reappearing from their hidden state.

5) The design proposed by Darin in http://code.google.com/p/chromium/issues/detail?id=7823#c58 seems workable.  To summarize here:
  a) Run beforeunload as normal.
  b) Before invoking unload, hide the tab.
  c) If the page attempts to alert / confirm / rise from the dead, ignore it.

I think the patch attached to this bug is a giant hack that doesn&apos;t solve the problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147445</commentid>
    <comment_count>19</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-09-15 18:28:11 -0700</bug_when>
    <thetext>Adam, the hide the tab solution doesn&apos;t help for frame navigations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147447</commentid>
    <comment_count>20</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-09-15 18:35:49 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; 4) To my mind, a better approach is that proposed by Peter in
&gt; http://code.google.com/p/chromium/issues/detail?id=7823#c20 (and supported by
&gt; Linus in http://code.google.com/p/chromium/issues/detail?id=7823#c49) is to
&gt; hide tabs once the user clicks the close button.  John points out this has a
&gt; number of strange corner cases involving zombie tabs reappearing from their
&gt; hidden state.

Note that this does not solve the problem of navigating within the same tab (which Darin has just noted).  For that, my proposal is basically that we look to see if the old page was the only entity that would have been able to script the new page (the common case), and if it was, we launch the new link in a different process, which we let use this tab to render.  Meanwhile we run the unload handler for the old tab.  The same sorts of issues as in the tab-closing case apply: resurrecting hidden tabs and similar.

I also proposed we first give the renderer 100 ms to bring up UI (during which we don&apos;t hide/swap out the tab) and then don&apos;t let it do so afterward (which prevents the &quot;zombie UI&quot; issues), but Darin/John pointed out that if part of the renderer was swapped out, it would be impossible to determine that the renderer had had a fair opportunity to swap back in and work long enough to avoid dataloss.  I&apos;m not sure I have a way around that.

I hate the sleep()-killing idea but it might work (?).  However, doing it assumes that we get &lt;a ping&gt; implemented in WebKit and Gecko, released to the public, and evangelized to developers as the alternative here.  That needs to happen anyway, of course, but I am leery of doing this change before then.

I am also more worried than both Darin and John about repercussions from doing this (sites blacklisting Chrome/WebKit, underreporting of UAs so that sites don&apos;t bother to make themselves work with Chrome/WebKit).

Perhaps another idea, if we think that waiting for resource loads to complete is what all sleep()-ing scripts will do, is to transparently convert loads in unload handlers into &lt;a ping&gt;-type actions, and then go ahead and kill the handlers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147449</commentid>
    <comment_count>21</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-15 18:59:02 -0700</bug_when>
    <thetext>Regardless of whether you think this is the right approach (which I don&apos;t), WebCore is the wrong layer to make this change: WebCore ought not even know that the ECMAScript Date API exists.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147451</commentid>
    <comment_count>22</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-15 19:26:19 -0700</bug_when>
    <thetext>I think it&apos;s unfortunate that, as a result of Chrome&apos;s code residing in two different repositories, we need to have the same discussion twice in two different bug systems, and once it&apos;s approved in one code review, it has to go through all this again.  The bug was open for half a year in Chrome&apos;s bug tracker, and the code review was sent in the open there.  The bugs and code reviews also don&apos;t capture all the hallway conversations that occurred.

The same questions and points are made over and over.  At this point, I&apos;m really tired of explaining things multiple times.  If people want to discuss this, they can find me in-person, or they can invest the effort in reading all the previous discussions fully.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147474</commentid>
    <comment_count>23</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-09-15 22:29:32 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; I think it&apos;s unfortunate that, as a result of Chrome&apos;s code residing in two
&gt; different repositories, we need to have the same discussion twice in two
&gt; different bug systems, and once it&apos;s approved in one code review, it has to go
&gt; through all this again.

I&apos;ve seen no code review on that Chromium bug, and I&apos;ve never agreed that it&apos;s the right approach there.  And at least most of the people involved here (you, me, Darin) have been involved in that discussion since the beginning.  So I&apos;m not sure what grounds you have to effectively accuse us of being ignorant of what&apos;s happening.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147575</commentid>
    <comment_count>24</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-09-16 12:15:52 -0700</bug_when>
    <thetext>Darin (Fisher), John and I had a long chat this morning in which we discussed the ramifications of this and possible alternatives, as well as future plans.  In short, I now support this change, although I admit it is a hack.  Gory detail below if you care.

First, regarding the question of whether this change will solve the problem.  According to John, comment 18 point 3a is inaccurate: basically all unload handlers use this same technique to busy-loop.  Therefore, initially, this change will make unload handlers run much faster.  As Adam notes, just doing this alone could potentially lead to an arms race.  There are two reasons to believe this is unlikely:

1) We propose to guarantee that by the time we ship this in a Stable channel release, we will also have &lt;a ping&gt; available in the same release.  This gives authors who care about our behavior an easier and more-guaranteed-than-the-old-way mechanism.  Anyone who cares enough about Chromium&apos;s behavior to rewrite their code will have significant motivation to use this.

2) In the meantime, Chromium&apos;s market share (and, to be honest, WebKit&apos;s in general) is too low for most authors to care.

Second, regarding future plans.  If we land this, we propose to also land some logging/histograms of unload handler wall clock time and/or the number of times this mechanism fires, so that we can measure its efficacy and the uptake of &lt;a ping&gt;.  This can help us decide whether an arms race is actually occurring (and if so what to do), or whether the hack has become sufficiently unnecessary that we can just rip it out.

Third, regarding divergence.  As John mentioned, it&apos;s perfectly reasonable to make this change for JSC too, and in fact I would prefer it, as it would be to users&apos; benefit and make the behavior of &quot;WebKit&quot; more consistent from an author perspective.  However, note that the recent change to make pages with unload handlers eligible for the bfcache means that unload handlers will rarely fire where that is supported, meaning that authors may copy this code into the pagehide handler, meaning that the hack might need to be expanded to also cover pagehide for platforms with a bfcache.

Fourth, regarding alternate solutions.  I have been convinced by Darin that all alternative solutions currently conceived are inferior in some way or other.  Here are a scattering of examples:

* Hiding the page/tab while the handler is running suffers from numerous problems, such as what to do if the handler fires an alert(), how to do this if navigation is within the same domain or multiple windows can script this one, and the jankiness caused by the renderer spinning the CPU and/or doing resource loads in the background while the user is trying to load a new page.

* Trying to halt script using a different, less-workaroundable method such as wall clock time, or instruction or function call count, suffer from implementation problems, such as wall clock time being a poor bound if the renderer ever has to swap from disk or gets suspended by the OS, or raw instruction count access imposing significant constraints on the JS engine design and API.  The V8 folks have indicated that this level of granularity will cause them problems now and in the future, and I imagine similar things might be true for JSC.

* In general, approaches which transparently allow authors to continue using a mechanism like the current one provide authors no motivation to switch to &lt;a ping&gt; (which would benefit users even if such approaches were implemented), and effectively force all browser vendors to either copy this kind of hack or continue to let their users suffer.  Providing both a carrot _and_ some kind of stick should increase the likelihood of ending up in a better world, since authors must hate the current code as it is fiddly and still doesn&apos;t actually guarantee them that their tracking pings will complete.

* Not that this would be strong evidence by itself, but a number of different Chromium team members familiar with different aspects of this (web authoring, WebCore, V8, UI, etc.) have discussed this solution and its alternatives and generally agreed that this is the best route.

Regarding the low-level details of how this patch is implemented, I am not knowledgeable enough to comment, so I will leave that to Darin or John.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147612</commentid>
    <comment_count>25</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-16 13:57:53 -0700</bug_when>
    <thetext>I&apos;ve also discussed this with Darin and John (although not Peter directly).

1) I think we should give web developers a bigger carrot to avoid an arms race here.  In particular, we should consider completing network requests started from unload handlers, removing the incentive to use a busy-loop.

2) I continue to think that WebCore is the wrong layer at which to make a change that manipulates the Date API.  The reasons to prefer making the change here appear more political than technical.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147614</commentid>
    <comment_count>26</comment_count>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-16 14:04:07 -0700</bug_when>
    <thetext>(In reply to comment #25)
&gt; I&apos;ve also discussed this with Darin and John (although not Peter directly).
&gt; 
&gt; 1) I think we should give web developers a bigger carrot to avoid an arms race
&gt; here.  In particular, we should consider completing network requests started
&gt; from unload handlers, removing the incentive to use a busy-loop.

There are a variety of serious problems with this.  Peter just touched on some of them.  This been discussed to death already.

&gt; 
&gt; 2) I continue to think that WebCore is the wrong layer at which to make a
&gt; change that manipulates the Date API.  The reasons to prefer making the change
&gt; here appear more political than technical.

The (technical) reasons why this is the case have been made a number of times.  V8 team does not want to add hooks as it&apos;s too one-off, and it limits their flexibility.  We will need hooks anyways in the bindings layer to know when we&apos;re entering/exiting an unload handler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147616</commentid>
    <comment_count>27</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-16 14:13:01 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; &gt; 1) I think we should give web developers a bigger carrot to avoid an arms race
&gt; &gt; here.  In particular, we should consider completing network requests started
&gt; &gt; from unload handlers, removing the incentive to use a busy-loop.
&gt; 
&gt; There are a variety of serious problems with this.  Peter just touched on some
&gt; of them.  This been discussed to death already.

Are you referring to the passage where Peter says doing this provides authors no incentive to switch to &lt;a ping&gt;?  Darin also noted on IRC that this might slow down loading a new page from the same server.

I think the main disagreement here is over how we think authors will respond to various incentives.  I don&apos;t think any of us know for sure.  As you&apos;ve pointed out, they might even just ignore us given our market share.

&gt; &gt; 2) I continue to think that WebCore is the wrong layer at which to make a
&gt; &gt; change that manipulates the Date API.  The reasons to prefer making the change
&gt; &gt; here appear more political than technical.
&gt; 
&gt; The (technical) reasons why this is the case have been made a number of times. 
&gt; V8 team does not want to add hooks as it&apos;s too one-off, and it limits their
&gt; flexibility.  We will need hooks anyways in the bindings layer to know when
&gt; we&apos;re entering/exiting an unload handler.

I could say the same thing here.  Why not implement this in the browser process by sending an evalJavaScript IPC message?  The only reason this patch is technically possible is because the Date API happens to be stored in a global variable.  Do you really think this patch isn&apos;t breaking the abstraction barrier?  (That&apos;s even ignoring all the web-visible side-effect of monkeying around with the global namespace.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147626</commentid>
    <comment_count>28</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-09-16 14:33:16 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; (In reply to comment #26)
&gt; &gt; &gt; 1) I think we should give web developers a bigger carrot to avoid an arms race
&gt; &gt; &gt; here.  In particular, we should consider completing network requests started
&gt; &gt; &gt; from unload handlers, removing the incentive to use a busy-loop.
&gt; &gt; 
&gt; &gt; There are a variety of serious problems with this.  Peter just touched on some
&gt; &gt; of them.  This been discussed to death already.
&gt; 
&gt; Are you referring to the passage where Peter says doing this provides authors
&gt; no incentive to switch to &lt;a ping&gt;?  Darin also noted on IRC that this might
&gt; slow down loading a new page from the same server.

Yes, I tried to mention both those issues in my comment, as well as the issues that this can also slow down _other_ pages being loaded as well as all other actions in the browser, and is also deleterious for other browser vendors and does not result in the fastest possible tab closure.

Explicitly note that in IE, this is already the case (for image loads), and yet authors busy loop in their unload handlers without regard to what browser is in use.  Making the busy loop unnecessary is not nearly as good as providing a far better solution at the same time that you make the busy loop not function.

In summary, this isn&apos;t a workable solution.  I have fought for it and thought around it for quite some time and I can&apos;t support it.

&gt; I think the main disagreement here is over how we think authors will respond to
&gt; various incentives.  I don&apos;t think any of us know for sure.  As you&apos;ve pointed
&gt; out, they might even just ignore us given our market share.

There are three possible outcomes:
* Authors completely ignore this, in which case we have made users&apos; lives better.
* Authors move from the current code to &lt;a ping&gt;, in which case we have made users of _all_ browsers&apos; lives better, and made authors&apos; lives better as well (better guarantees on load completion).
* Authors ignore &lt;a ping&gt; and respond to this by finding some other way to busy loop, in which case things are generally unchanged.

None of these things actively makes things terribly _worse_, and in the worst case (case 3), we can choose how to respond, for example by counting more types of instructions.

As I tried to note above, the current code doesn&apos;t work well for authors, so their incentive to move to &lt;a ping&gt; once it&apos;s supported is greater than just &quot;we&apos;re going to make your current code not work&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147636</commentid>
    <comment_count>29</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-16 14:49:11 -0700</bug_when>
    <thetext>&gt; In summary, this [completing network requests] isn&apos;t a workable solution.
&gt; I have fought for it and thought around it for quite some time and I can&apos;t
&gt; support it.

In any case, it doesn&apos;t block this patch because its something we can decide to do (or not do) in another patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147638</commentid>
    <comment_count>30</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-09-16 14:52:28 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; &gt; In summary, this [completing network requests] isn&apos;t a workable solution.
&gt; &gt; I have fought for it and thought around it for quite some time and I can&apos;t
&gt; &gt; support it.
&gt; 
&gt; In any case, it doesn&apos;t block this patch because its something we can decide to
&gt; do (or not do) in another patch.

Yes, implementing this as a first pass would not stop us from modifying (or removing) this later if something else is found to be more effective.  More interesting to me is the question of whether there is any possible harm to authors due to your comment 6 or comment 8 (although it sounds like perhaps comment 8 is a nonissue since authors can&apos;t actually get at this?).  Ideally the patch would be one which doesn&apos;t have any harmful side effects.  That is my greatest concern.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147661</commentid>
    <comment_count>31</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-16 16:12:50 -0700</bug_when>
    <thetext>(In reply to comment #30)
&gt; More interesting to me is the question of whether there is any possible harm to
&gt; authors due to your comment 6 or comment 8 (although it sounds like perhaps
&gt; comment 8 is a nonissue since authors can&apos;t actually get at this?).

It depends what you mean by harm to authors.  I don&apos;t think anyone is going to suffer any monetary loss because the toString of a function magically changes at some odd time.  On the outer hand, the web platform would be even more insane if we did that all the time.

W.r.t. other technical issues with the patch, the use of the |this| keyword is quite dangerous to secure JavaScript subsets like ADsafe or Caja because |this| can point to the global object.  They take great care to dance around the uses of |this| in the JS implementation in Firefox.  Adding |this| to this super-obscure corner case is like hiding a land mine in your corn field: eventually it will blow your legs off.

As for leaking the terminateScript capability, I don&apos;t have a good sense of what evil things a page could do with that.  I&apos;d rather not have to worry about those issue.

&gt; Ideally
&gt; the patch would be one which doesn&apos;t have any harmful side effects.  That is my
&gt; greatest concern.

The reason we have to worry about this stuff is because the patch is written at the wrong layer of abstraction.  It&apos;s the same reason we could steal all the user&apos;s passwords from 6 of 6 password managers built out of (essentially) the evalJavaScript IPC message:  http://www.adambarth.com/papers/2009/adida-barth-jackson.pdf

To do this right, you need to be inside the engine, not splicing loaded guns into a potentially malicious environment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>147668</commentid>
    <comment_count>32</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-16 16:26:54 -0700</bug_when>
    <thetext>Sorry, I should provide more context.  The issues in Comment #30 are all small details.  They&apos;d be much bigger problems if we tried to build our whole system this way.

We&apos;re likely to get away with this case because the exposure is so obscure.  For example, it&apos;s unlikely someone would run code from an page module during unload.  (They could, of course, but they probably wont.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148767</commentid>
    <comment_count>33</comment_count>
      <attachid>39590</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-09-21 13:05:31 -0700</bug_when>
    <thetext>Comment on attachment 39590
Update Skipped files for other platforms

I support proceeding with this change.  I think we reached consensus on
webkit-dev to also implement detached Image loads as the big carrot to
accompany this big stick.  I&apos;m fine with making these changes in separate
patches, so long as we get to the carrot soon :-)

Here&apos;s some style nits:


&gt; Index: WebCore/bindings/v8/DateExtension.cpp
...
&gt; +DateExtension* DateExtension::s_extension;
&gt; +
&gt; +static const char* s_dateExtensionName = &quot;v8/DateExtension&quot;;
&gt; +static const char* s_dateExtensionScript =

nit: WebKit style is to just name static variables the same way you name
local variables, so drop the &quot;s_&quot;


&gt; +v8::Handle&lt;v8::FunctionTemplate&gt; DateExtension::GetNativeFunction(v8::Handle&lt;v8::String&gt; name)
&gt; +{
&gt; +    if (name-&gt;Equals(v8::String::New(&quot;GiveEnableSleepDetectionFunction&quot;))) {
&gt; +        return v8::FunctionTemplate::New(GiveEnableSleepDetectionFunction);
&gt; +    } else if (name-&gt;Equals(v8::String::New(&quot;OnSleepDetected&quot;))) {
&gt; +        return v8::FunctionTemplate::New(OnSleepDetected);
&gt; +    }

nit: WebKit style is to not use {}&apos;s around single line statements


&gt; +void DateExtension::weakCallback(v8::Persistent&lt;v8::Value&gt; object, void* param)
&gt; +{
&gt; +    DateExtension* extension = get();
&gt; +    for (FunctionPointerList::iterator i = extension-&gt;callEnableSleepDetectionFunctionPointers.begin();
&gt; +         i != extension-&gt;callEnableSleepDetectionFunctionPointers.end(); ++i) {
&gt; +        if (*i == object) {
&gt; +            i-&gt;Dispose();
&gt; +            extension-&gt;callEnableSleepDetectionFunctionPointers.erase(i);
&gt; +            return;
&gt; +        }
&gt; +    }
&gt; +    ASSERT(false);

nit: ASSERT_NOT_REACHED()


&gt; Index: WebCore/bindings/v8/DateExtension.h
...
&gt; +#ifndef DateExtension_h
&gt; +#define DateExtension_h
&gt; +
&gt; +#include &lt;v8.h&gt;
&gt; +
&gt; +#include &lt;list&gt;

nit: Please avoid using STL containers or anything from STL that
allocates memory.  This will matter to Android, which does not have
a complete STL implementation.

maybe you could use WTF&apos;s Vector or Deque containers instead?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148775</commentid>
    <comment_count>34</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-09-21 13:12:41 -0700</bug_when>
    <thetext>(In reply to comment #33)
&gt; &gt; +v8::Handle&lt;v8::FunctionTemplate&gt; DateExtension::GetNativeFunction(v8::Handle&lt;v8::String&gt; name)
&gt; &gt; +{
&gt; &gt; +    if (name-&gt;Equals(v8::String::New(&quot;GiveEnableSleepDetectionFunction&quot;))) {
&gt; &gt; +        return v8::FunctionTemplate::New(GiveEnableSleepDetectionFunction);
&gt; &gt; +    } else if (name-&gt;Equals(v8::String::New(&quot;OnSleepDetected&quot;))) {
&gt; &gt; +        return v8::FunctionTemplate::New(OnSleepDetected);
&gt; &gt; +    }
&gt; 
&gt; nit: WebKit style is to not use {}&apos;s around single line statements

Further nit: Not mentioned in WebKit&apos;s style guide, but sometimes advocated by them, and also advocated by Google (I think), is to avoid &quot;else&quot; after &quot;return&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148811</commentid>
    <comment_count>35</comment_count>
      <attachid>39873</attachid>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-21 14:01:56 -0700</bug_when>
    <thetext>Created attachment 39873
Updated patch

Addressed all comments.  I had used std::list because I saw it in V8Proxy, but it&apos;s not even needed there at all since there&apos;s no removal.  I can fix it in another change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148825</commentid>
    <comment_count>36</comment_count>
      <attachid>39876</attachid>
    <who name="John Abd-El-Malek">jam</who>
    <bug_when>2009-09-21 14:26:40 -0700</bug_when>
    <thetext>Created attachment 39876
Might as well update V8Proxy to not use STL now since I&apos;m touching that code</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148947</commentid>
    <comment_count>37</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-09-21 20:32:08 -0700</bug_when>
    <thetext>Landed as http://trac.webkit.org/changeset/48612</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>39587</attachid>
            <date>2009-09-14 22:12:09 -0700</date>
            <delta_ts>2009-09-15 00:43:11 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>nosleep.txt</filename>
            <type>text/plain</type>
            <size>17593</size>
            <attacher name="John Abd-El-Malek">jam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0ODM4OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMDktMDktMTQgIEpvaG4gQWJkLUVsLU1hbGVrICA8amFtQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBQcmV2ZW50IHNsZWVwcyBpbiB1bmxvYWQgaGFuZGxlcnMuCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTE5MworCisgICAgICAgIFRlc3Q6IGZhc3Qv
ZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5zaW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGVFeHRlbnNpb246OmdldCk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0
ZW5zaW9uOjpzZXRBbGxvd1NsZWVwKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246
OkdldE5hdGl2ZUZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246Ondl
YWtDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpHaXZlRW5hYmxl
U2xlZXBEZXRlY3Rpb25GdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9u
OjpPblNsZWVwRGV0ZWN0ZWQpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2
ZW50SGFuZGxlcik6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpWOFByb3h5OjpjcmVhdGVOZXdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uV2l0aFY4KToKKyAgICAgICAgKFdlYkNvcmU6OlY4
UHJveHk6OnJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1Y4UHJveHkuaDoKKwogMjAwOS0wOS0xNCAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL1dl
YkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24g
NDgzODgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNjkwLDYg
KzY5MCw4IEBACiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXpl
ckNvbnN0cnVjdG9yLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WFBh
dGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92
OC9EYXRlRXh0ZW5zaW9uLmNwcCcsCisgICAgICAgICAgICAnYmluZGluZ3MvdjgvRGF0ZUV4dGVu
c2lvbi5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9ET01EYXRhLmNwcCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3MvdjgvRE9NRGF0YS5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9E
T01EYXRhU3RvcmUuY3BwJywKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lvbi5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRhdGVFeHRlbnNpb24uaCIKKworI2luY2x1ZGUgIlY4UHJveHkuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitEYXRlRXh0ZW5zaW9uKiBEYXRlRXh0ZW5zaW9uOjpzX2V4dGVuc2lv
bjsKKworc3RhdGljIGNvbnN0IGNoYXIqIHNfZGF0ZUV4dGVuc2lvbk5hbWUgPSAidjgvRGF0ZUV4
dGVuc2lvbiI7CitzdGF0aWMgY29uc3QgY2hhciogc19kYXRlRXh0ZW5zaW9uU2NyaXB0ID0KKyAg
ICAiKGZ1bmN0aW9uICgpIHsiCisgICAgIiAgdmFyIGNvdW50ZXI7IgorICAgICIgIHZhciBvcmln
X2dldFRpbWU7IgorICAgICIgIGZ1bmN0aW9uIGdldFRpbWVPdmVycmlkZSgpIHsiCisgICAgIiAg
ICBpZiAoKytjb3VudGVyID4gMTAwMCkiCisgICAgIiAgICAgIE9uU2xlZXBEZXRlY3RlZCgpOyIK
KyAgICAiICAgIHJldHVybiBvcmlnX2dldFRpbWUuY2FsbCh0aGlzKTsiCisgICAgIiAgfTsiCisg
ICAgIiAgZnVuY3Rpb24gZW5hYmxlU2xlZXBEZXRlY3Rpb24oZW5hYmxlKSB7IgorICAgICIgICAg
aWYgKGVuYWJsZSkgeyIKKyAgICAiICAgICAgY291bnRlciA9IDA7IgorICAgICIgICAgICBvcmln
X2dldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lOyIKKyAgICAiICAgICAgRGF0ZS5wcm90
b3R5cGUuZ2V0VGltZSA9IGdldFRpbWVPdmVycmlkZTsiCisgICAgIiAgICB9IGVsc2UgeyIKKyAg
ICAiICAgICAgRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSA9IG9yaWdfZ2V0VGltZTsiCisgICAgIiAg
ICB9IgorICAgICIgIH07IgorICAgICIgIG5hdGl2ZSBmdW5jdGlvbiBPblNsZWVwRGV0ZWN0ZWQo
KTsiCisgICAgIiAgbmF0aXZlIGZ1bmN0aW9uIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0
aW9uKCk7IgorICAgICIgIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKGVuYWJsZVNs
ZWVwRGV0ZWN0aW9uKTsiCisgICAgIn0pKCkiOworCitEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5z
aW9uKCkgOiB2ODo6RXh0ZW5zaW9uKHNfZGF0ZUV4dGVuc2lvbk5hbWUsIHNfZGF0ZUV4dGVuc2lv
blNjcmlwdCkKK3sKK30KKworRGF0ZUV4dGVuc2lvbiogRGF0ZUV4dGVuc2lvbjo6Z2V0KCkKK3sK
KyAgICBpZiAoIXNfZXh0ZW5zaW9uKQorICAgICAgICBzX2V4dGVuc2lvbiA9IG5ldyBEYXRlRXh0
ZW5zaW9uKCk7CisgICAgcmV0dXJuIHNfZXh0ZW5zaW9uOworfQorCit2b2lkIERhdGVFeHRlbnNp
b246OnNldEFsbG93U2xlZXAoYm9vbCBhbGxvdykKK3sKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gYXJndlsxXTsKKyAgICBhcmd2WzBdID0gdjg6OlN0cmluZzo6TmV3KGFsbG93ID8gImZhbHNl
IiA6ICJ0cnVlIik7CisgICAgZm9yIChGdW5jdGlvblBvaW50ZXJMaXN0OjppdGVyYXRvciBpID0g
Y2FsbEVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5iZWdpbigpOworICAgICAg
ICAgaSAhPSBjYWxsRW5hYmxlU2xlZXBEZXRlY3Rpb25GdW5jdGlvblBvaW50ZXJzLmVuZCgpOyAr
K2kpIHsKKyAgICAgICAgKCppKS0+Q2FsbCh2ODo6T2JqZWN0OjpOZXcoKSwgMSwgYXJndik7Cisg
ICAgfQorfQorCit2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBEYXRlRXh0ZW5zaW9u
OjpHZXROYXRpdmVGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IG5hbWUpCit7CisgICAg
aWYgKG5hbWUtPkVxdWFscyh2ODo6U3RyaW5nOjpOZXcoIkdpdmVFbmFibGVTbGVlcERldGVjdGlv
bkZ1bmN0aW9uIikpKSB7CisgICAgICAgIHJldHVybiB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3
KEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKTsKKyAgICB9IGVsc2UgaWYgKG5hbWUt
PkVxdWFscyh2ODo6U3RyaW5nOjpOZXcoIk9uU2xlZXBEZXRlY3RlZCIpKSkgeworICAgICAgICBy
ZXR1cm4gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhPblNsZWVwRGV0ZWN0ZWQpOworICAgIH0K
KworICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPigpOworfQorCit2
b2lkIERhdGVFeHRlbnNpb246OndlYWtDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+
IG9iamVjdCwgdm9pZCogcGFyYW0pCit7CisgICAgRGF0ZUV4dGVuc2lvbiogZXh0ZW5zaW9uID0g
Z2V0KCk7CisgICAgZm9yIChGdW5jdGlvblBvaW50ZXJMaXN0OjppdGVyYXRvciBpID0gZXh0ZW5z
aW9uLT5jYWxsRW5hYmxlU2xlZXBEZXRlY3Rpb25GdW5jdGlvblBvaW50ZXJzLmJlZ2luKCk7Cisg
ICAgICAgICBpICE9IGV4dGVuc2lvbi0+Y2FsbEVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Q
b2ludGVycy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmICgqaSA9PSBvYmplY3QpIHsKKyAgICAg
ICAgICAgIGktPkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+Y2FsbEVuYWJsZVNs
ZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5lcmFzZShpKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlQoZmFsc2UpOworfQorCit2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gRGF0ZUV4dGVuc2lvbjo6R2l2ZUVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rp
b24oY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgoKSAh
PSAxIHx8ICFhcmdzWzBdLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZp
bmVkKCk7CisKKyAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBnZXQgdGhlIEZyYW1lKiBoZXJlIGFu
ZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZnVuY3Rpb24gcG9pbnRlciwgc28gdGhhdAorICAgIC8v
IGVhY2ggdGltZSB3ZSBnbyBpbnRvIGFuIHVubG9hZCBoYW5kbGVyIHdlIGp1c3QgY2FsbCB0aGF0
IGZyYW1lJ3MgZnVuY3Rpb24uICBIb3dldmVyIHRoZXJlJ3MKKyAgICAvLyBubyB3YXkgdG8gZ2V0
IHRoZSBGcmFtZSogYXQgdGhpcyBwb2ludCwgc28gd2UganVzdCBzdG9yZSBhbGwgdGhlIGZ1bmN0
aW9uIHBvaW50ZXJzIGFuZCBjYWxsCisgICAgLy8gdGhlbSBhbGwgZWFjaCB0aW1lLgorICAgIERh
dGVFeHRlbnNpb24qIGV4dGVuc2lvbiA9IGdldCgpOworICAgIGV4dGVuc2lvbi0+Y2FsbEVuYWJs
ZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5wdXNoX2JhY2soCisgICAgICAgIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj46Ok5ldyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNh
c3QoYXJnc1swXSkpKTsKKyAgICBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1
bmN0aW9uUG9pbnRlcnMuYmFjaygpLk1ha2VXZWFrKE5VTEwsIHdlYWtDYWxsYmFjayk7CisgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IERhdGVF
eHRlbnNpb246Ok9uU2xlZXBEZXRlY3RlZChjb25zdCB2ODo6QXJndW1lbnRzJikKK3sKKyAgICAv
LyBBZnRlciB3ZSBjYWxsIFRlcm1pbmF0ZUV4ZWN1dGlvbigpLCB3ZSBjYW4ndCBjYWxsIGJhY2sg
aW50byBKYXZhU2NyaXB0IGFnYWluLCBzbworICAgIC8vIHJlc2V0IGFsbCB0aGUgb3RoZXIgZnJh
bWVzIGZpcnN0LgorICAgIGdldCgpLT5zZXRBbGxvd1NsZWVwKHRydWUpOworCisgICAgdjg6OlY4
OjpUZXJtaW5hdGVFeGVjdXRpb24oKTsKKyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRl
RXh0ZW5zaW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5z
aW9uLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRGF0ZUV4dGVuc2lvbl9o
CisjZGVmaW5lIERhdGVFeHRlbnNpb25faAorCisjaW5jbHVkZSA8djguaD4KKworI2luY2x1ZGUg
PGxpc3Q+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUHJldmVudCAic2xlZXAiIGNhbGxz
IGluIHVubG9hZCBoYW5kbGVycy4KK2NsYXNzIERhdGVFeHRlbnNpb24gOiBwdWJsaWMgdjg6OkV4
dGVuc2lvbiB7CitwdWJsaWM6CisgICAgc3RhdGljIERhdGVFeHRlbnNpb24qIGdldCgpOworICAg
IHZvaWQgc2V0QWxsb3dTbGVlcChib29sIGFsbG93KTsKKworcHJpdmF0ZToKKyAgICBEYXRlRXh0
ZW5zaW9uKCk7CisgICAgdmlydHVhbCB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBH
ZXROYXRpdmVGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+KTsKKyAgICBzdGF0aWMgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKGNvbnN0
IHY4OjpBcmd1bWVudHMmKTsKKyAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IE9uU2xl
ZXBEZXRlY3RlZChjb25zdCB2ODo6QXJndW1lbnRzJik7CisgICAgc3RhdGljIHZvaWQgd2Vha0Nh
bGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gb2JqZWN0LCB2b2lkKiBwYXJhbSk7CisK
KyAgICB0eXBlZGVmIHN0ZDo6bGlzdDx2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+ID4gRnVu
Y3Rpb25Qb2ludGVyTGlzdDsKKyAgICBGdW5jdGlvblBvaW50ZXJMaXN0IGNhbGxFbmFibGVTbGVl
cERldGVjdGlvbkZ1bmN0aW9uUG9pbnRlcnM7CisKKyAgICBzdGF0aWMgRGF0ZUV4dGVuc2lvbiog
c19leHRlbnNpb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8g
RGF0ZUV4dGVuc2lvbl9oCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4QWJzdHJhY3RFdmVu
dExpc3RlbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4QWJzdHJh
Y3RFdmVudExpc3RlbmVyLmNwcAkocmV2aXNpb24gNDgzODgpCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsNiAr
MzEsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlY4QWJzdHJhY3RFdmVudExp
c3RlbmVyLmgiCiAKKyNpbmNsdWRlICJEYXRlRXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiRG9jdW1l
bnQuaCIKICNpbmNsdWRlICJFdmVudC5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCkBAIC02Nyw2ICs2
OCwxMCBAQCB2b2lkIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjppbnZva2VFdmVuCiAgICAgdjg6
OkxvY2FsPHY4OjpTdHJpbmc+IGV2ZW50U3ltYm9sID0gdjg6OlN0cmluZzo6TmV3U3ltYm9sKCJl
dmVudCIpOwogICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJldHVyblZhbHVlOwogCisgICAgLy8g
SW4gYmVmb3JldW5sb2FkL3VubG9hZCBoYW5kbGVycywgd2Ugd2FudCB0byBhdm9pZCBzbGVlcHMg
d2hpY2ggZG8gdGlnaHQgbG9vcHMgb2YgY2FsbGluZyBEYXRlLmdldFRpbWUoKS4KKyAgICBpZiAo
ZXZlbnQtPnR5cGUoKSA9PSAiYmVmb3JldW5sb2FkIiB8fCBldmVudC0+dHlwZSgpID09ICJ1bmxv
YWQiKQorICAgICAgICBEYXRlRXh0ZW5zaW9uOjpnZXQoKS0+c2V0QWxsb3dTbGVlcChmYWxzZSk7
CisKICAgICB7CiAgICAgICAgIC8vIENhdGNoIGV4Y2VwdGlvbnMgdGhyb3duIGluIHRoZSBldmVu
dCBoYW5kbGVyIHNvIHRoZXkgZG8gbm90IHByb3BhZ2F0ZSB0byBqYXZhc2NyaXB0IGNvZGUgdGhh
dCBjYXVzZWQgdGhlIGV2ZW50IHRvIGZpcmUuCiAgICAgICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRj
aDsKQEAgLTgyLDYgKzg3LDkgQEAgdm9pZCBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6aW52b2tl
RXZlbgogCiAgICAgICAgIC8vIENhbGwgdGhlIGV2ZW50IGhhbmRsZXIuCiAgICAgICAgIHJldHVy
blZhbHVlID0gY2FsbExpc3RlbmVyRnVuY3Rpb24oanNFdmVudCwgZXZlbnQsIGlzV2luZG93RXZl
bnQpOworICAgICAgICBpZiAoIXRyeUNhdGNoLkNhbkNvbnRpbnVlKCkpCisgICAgICAgICAgICBy
ZXR1cm47CisKICAgICAgICAgdHJ5Q2F0Y2guUmVzZXQoKTsKIAogICAgICAgICAvLyBSZXN0b3Jl
IHRoZSBvbGQgZXZlbnQuIFRoaXMgbXVzdCBiZSBkb25lIGZvciBhbGwgZXhpdCBwYXRocyB0aHJv
dWdoIHRoaXMgbWV0aG9kLgpAQCAtOTIsNiArMTAwLDkgQEAgdm9pZCBWOEFic3RyYWN0RXZlbnRM
aXN0ZW5lcjo6aW52b2tlRXZlbgogICAgICAgICB0cnlDYXRjaC5SZXNldCgpOwogICAgIH0KIAor
ICAgIGlmIChldmVudC0+dHlwZSgpID09ICJiZWZvcmV1bmxvYWQiIHx8IGV2ZW50LT50eXBlKCkg
PT0gInVubG9hZCIpCisgICAgICAgIERhdGVFeHRlbnNpb246OmdldCgpLT5zZXRBbGxvd1NsZWVw
KHRydWUpOworCiAgICAgQVNTRVJUKCFWOFByb3h5OjpoYW5kbGVPdXRPZk1lbW9yeSgpIHx8IHJl
dHVyblZhbHVlLklzRW1wdHkoKSk7CiAKICAgICBpZiAocmV0dXJuVmFsdWUuSXNFbXB0eSgpKQpJ
bmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuY3BwCShyZXZpc2lvbiA0ODM4OCkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvVjhQcm94eS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDcgQEAK
IAogI2luY2x1ZGUgIkNocm9taXVtQnJpZGdlLmgiCiAjaW5jbHVkZSAiQ1NTTXV0YWJsZVN0eWxl
RGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJEYXRlRXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiRE9N
T2JqZWN0c0luY2x1ZGUuaCIKICNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgogI2luY2x1ZGUg
IkZyYW1lTG9hZGVyQ2xpZW50LmgiCkBAIC05MDQsNiArOTA1LDEwIEBAIHY4OjpQZXJzaXN0ZW50
PHY4OjpDb250ZXh0PiBWOFByb3h5OjpjcmUKICAgICAvLyBJbnN0YWxsIGEgc2VjdXJpdHkgaGFu
ZGxlciB3aXRoIFY4LgogICAgIGdsb2JhbFRlbXBsYXRlLT5TZXRBY2Nlc3NDaGVja0NhbGxiYWNr
cyhWOEN1c3RvbTo6djhET01XaW5kb3dOYW1lZFNlY3VyaXR5Q2hlY2ssIFY4Q3VzdG9tOjp2OERP
TVdpbmRvd0luZGV4ZWRTZWN1cml0eUNoZWNrLCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XKSk7CiAKKyAgICAvLyBVc2VkIHRvIGF2b2lkIHNsZWVwIGNhbGxzIGluIHVu
bG9hZCBoYW5kbGVycy4KKyAgICBpZiAoIXJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgoRGF0ZUV4
dGVuc2lvbjo6Z2V0KCkpKQorICAgICAgICByZWdpc3RlckV4dGVuc2lvbihEYXRlRXh0ZW5zaW9u
OjpnZXQoKSwgU3RyaW5nKCkpOworCiAgICAgLy8gRHluYW1pY2FsbHkgdGVsbCB2OCBhYm91dCBv
dXIgZXh0ZW5zaW9ucyBub3cuCiAgICAgT3duQXJyYXlQdHI8Y29uc3QgY2hhcio+IGV4dGVuc2lv
bk5hbWVzKG5ldyBjb25zdCBjaGFyKlttX2V4dGVuc2lvbnMuc2l6ZSgpXSk7CiAgICAgaW50IGlu
ZGV4ID0gMDsKQEAgLTEyNTMsMTQgKzEyNTgsMjEgQEAgU3RyaW5nIFY4UHJveHk6OnNvdXJjZU5h
bWUoKQogICAgIHJldHVybiB0b1dlYkNvcmVTdHJpbmcodjg6OkRlYnVnOjpDYWxsKGZyYW1lU291
cmNlTmFtZSkpOwogfQogCi12b2lkIFY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uV2l0aFY4KHY4
OjpFeHRlbnNpb24qIGV4dGVuc2lvbikgewordm9pZCBWOFByb3h5OjpyZWdpc3RlckV4dGVuc2lv
bldpdGhWOCh2ODo6RXh0ZW5zaW9uKiBleHRlbnNpb24pCit7CiAgICAgLy8gSWYgdGhlIGV4dGVu
c2lvbiBleGlzdHMgaW4gb3VyIGxpc3QsIGl0IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBW
OC4KKyAgICBpZiAoIXJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgoZXh0ZW5zaW9uKSkKKyAgICAg
ICAgdjg6OlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbik7Cit9CisKK2Jvb2wgVjhQcm94eTo6
cmVnaXN0ZXJlZEV4dGVuc2lvbldpdGhWOCh2ODo6RXh0ZW5zaW9uKiBleHRlbnNpb24pCit7CiAg
ICAgZm9yIChWOEV4dGVuc2lvbkxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9leHRlbnNpb25zLmJlZ2lu
KCk7IGl0ICE9IG1fZXh0ZW5zaW9ucy5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoaXQtPmV4
dGVuc2lvbiA9PSBleHRlbnNpb24pCi0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICB2ODo6UmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9u
KTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgVjhQcm94eTo6cmVnaXN0ZXJFeHRlbnNp
b24odjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uLCBjb25zdCBTdHJpbmcmIHNjaGVtZVJlc3RyaWN0
aW9uKQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJKHJldmlzaW9uIDQ4Mzg4KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJKHdvcmtpbmcgY29weSkKQEAgLTM4MSw2ICszODEsNyBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBjcmVh
dGVXcmFwcGVyRnJvbUNhY2hlU2xvd0Nhc2UoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlKTsK
IAogICAgICAgICBzdGF0aWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbldpdGhWOCh2ODo6RXh0ZW5z
aW9uKik7CisgICAgICAgIHN0YXRpYyBib29sIHJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgodjg6
OkV4dGVuc2lvbiopOwogCiAgICAgICAgIEZyYW1lKiBtX2ZyYW1lOwogCkluZGV4OiBMYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZp
c2lvbiA0ODM4OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAt
MSwzICsxLDE0IEBACisyMDA5LTA5LTE0ICBKb2huIEFiZC1FbC1NYWxlayAgPGphbUBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
UHJldmVudCBzbGVlcHMgaW4gdW5sb2FkIGhhbmRsZXJzLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkxOTMKKworICAgICAgICAqIGZhc3QvZG9tL1dp
bmRvdy9yZXNvdXJjZXMvc2xvd191bmxvYWRfaGFuZGxlcjEuaHRtbDogQWRkZWQuCisgICAgICAg
ICogZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXItZXhwZWN0ZWQudHh0OiBBZGRl
ZC4KKyAgICAgICAgKiBmYXN0L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci5odG1sOiBB
ZGRlZC4KKwogMjAwOS0wOS0xNCAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0
L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci1leHBlY3RlZC50eHQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXItZXhwZWN0
ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Nsb3df
dW5sb2FkX2hhbmRsZXItZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYgQEAK
K2ZyYW1lICJ0aGVpZnJhbWUiIC0gaGFzIDEgb251bmxvYWQgaGFuZGxlcihzKQorVGhpcyBpcyBh
IHRlc3QgZm9yIGJ1ZyAyOTE5MzogTmVlZCB0byBwcmV2ZW50IEphdmFzY3JpcHQgc2xlZXBzIGlu
IHVubG9hZCBoYW5kbGVycy4gSWYgc3VjY2Vzc2Z1bCwgUEFTUyBzaG91bGQgYmUgcHJpbnRlZCBi
ZWxvdy4KKworUEFTUworCisKSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvZG9tL1dpbmRvdy9zbG93
X3VubG9hZF9oYW5kbGVyLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9kb20v
V2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRl
c3RzL2Zhc3QvZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMzQgQEAKKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQi
IGhyZWY9Ii4uLy4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXN0eWxlLmNzcyI+Cis8c2NyaXB0Pgor
CitpZiAobGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICBsYXlvdXRUZXN0Q29udHJvbGxlci53
YWl0VW50aWxEb25lKCk7CisgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOwor
fQorCitmdW5jdGlvbiBkb25lKCkKK3sKKyAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
InJlc3VsdHMiKS5pbm5lckhUTUwgPT0gIiIpCisgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCJyZXN1bHRzIikuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlBBU1Mi
KSk7CisgICAgaWYgKGxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29u
dHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIGxvYWRlZCgpIHsKKyAgICBzZXRU
aW1lb3V0KCJkb25lKCkiLCAwKTsKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGhlaWZy
YW1lIikub3V0ZXJIVE1MPScnOworfQorCis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5IG9ubG9h
ZD0ic2V0VGltZW91dCgnbG9hZGVkKCk7JywgMCkiPgorPHA+CisgICAgVGhpcyBpcyBhIHRlc3Qg
Zm9yIDxhIGhyZWY9Imh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTE5
MyI+YnVnIDI5MTkzPC9hPjoKKyAgICA8aT5OZWVkIHRvIHByZXZlbnQgSmF2YXNjcmlwdCBzbGVl
cHMgaW4gdW5sb2FkIGhhbmRsZXJzLjwvaT4gSWYgc3VjY2Vzc2Z1bCwgUEFTUyBzaG91bGQgYmUg
cHJpbnRlZCBiZWxvdy4KKzwvcD4KKzxwIGlkPSJyZXN1bHRzIiBjbGFzcz0icGFzcyI+PC9wPgor
PGlmcmFtZSBpZD0idGhlaWZyYW1lIiBzdHlsZT0iYm9yZGVyOiAwIiBzcmM9InJlc291cmNlcy9z
bG93X3VubG9hZF9oYW5kbGVyMS5odG1sIj4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5l
IGF0IGVuZCBvZiBmaWxlCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cvcmVzb3Vy
Y2VzL3Nsb3dfdW5sb2FkX2hhbmRsZXIxLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC9kb20vV2luZG93L3Jlc291cmNlcy9zbG93X3VubG9hZF9oYW5kbGVyMS5odG1sCShyZXZp
c2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Jlc291cmNlcy9zbG93X3Vu
bG9hZF9oYW5kbGVyMS5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE4IEBACis8aHRtbD4K
KzxzY3JpcHQ+CitmdW5jdGlvbiBwYXVzZShtaWxsaXNlY29uZHMpIHsKKyAgICB2YXIgbm93ID0g
bmV3IERhdGUoKTsKKyAgICB2YXIgZXhpdFRpbWUgPSBub3cuZ2V0VGltZSgpICsgbWlsbGlzZWNv
bmRzOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIG5vdyA9IG5ldyBEYXRlKCk7CisgICAg
ICAgIGlmIChub3cuZ2V0VGltZSgpID4gZXhpdFRpbWUpCisgICAgICAgICAgICBicmVhazsKKyAg
ICB9CisgICAgcGFyZW50LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXN1bHRzIikuYXBwZW5k
Q2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIkZBSUwiKSk7CisgICAgaWYgKGxheW91dFRl
c3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7
Cit9Cis8L3NjcmlwdD4KKzxib2R5IG9udW5sb2FkPSJwYXVzZSgxMDAwMCk7Ij4KKzwvYm9keT4K
KzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>39590</attachid>
            <date>2009-09-15 00:43:11 -0700</date>
            <delta_ts>2009-09-21 14:01:56 -0700</delta_ts>
            <desc>Update Skipped files for other platforms</desc>
            <filename>nosleep2.txt</filename>
            <type>text/plain</type>
            <size>19798</size>
            <attacher name="John Abd-El-Malek">jam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0ODM4OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMDktMDktMTUgIEpvaG4gQWJkLUVsLU1hbGVrICA8amFtQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBQcmV2ZW50IHNsZWVwcyBpbiB1bmxvYWQgaGFuZGxlcnMuCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTE5MworCisgICAgICAgIFRlc3Q6IGZhc3Qv
ZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5zaW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGVFeHRlbnNpb246OmdldCk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0
ZW5zaW9uOjpzZXRBbGxvd1NsZWVwKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246
OkdldE5hdGl2ZUZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246Ondl
YWtDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpHaXZlRW5hYmxl
U2xlZXBEZXRlY3Rpb25GdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9u
OjpPblNsZWVwRGV0ZWN0ZWQpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2
ZW50SGFuZGxlcik6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpWOFByb3h5OjpjcmVhdGVOZXdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uV2l0aFY4KToKKyAgICAgICAgKFdlYkNvcmU6OlY4
UHJveHk6OnJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1Y4UHJveHkuaDoKKwogMjAwOS0wOS0xNCAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL1dl
YkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24g
NDgzODgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNjkwLDYg
KzY5MCw4IEBACiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXpl
ckNvbnN0cnVjdG9yLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WFBh
dGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92
OC9EYXRlRXh0ZW5zaW9uLmNwcCcsCisgICAgICAgICAgICAnYmluZGluZ3MvdjgvRGF0ZUV4dGVu
c2lvbi5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9ET01EYXRhLmNwcCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3MvdjgvRE9NRGF0YS5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9E
T01EYXRhU3RvcmUuY3BwJywKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lvbi5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRhdGVFeHRlbnNpb24uaCIKKworI2luY2x1ZGUgIlY4UHJveHkuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitEYXRlRXh0ZW5zaW9uKiBEYXRlRXh0ZW5zaW9uOjpzX2V4dGVuc2lv
bjsKKworc3RhdGljIGNvbnN0IGNoYXIqIHNfZGF0ZUV4dGVuc2lvbk5hbWUgPSAidjgvRGF0ZUV4
dGVuc2lvbiI7CitzdGF0aWMgY29uc3QgY2hhciogc19kYXRlRXh0ZW5zaW9uU2NyaXB0ID0KKyAg
ICAiKGZ1bmN0aW9uICgpIHsiCisgICAgIiAgdmFyIGNvdW50ZXI7IgorICAgICIgIHZhciBvcmln
X2dldFRpbWU7IgorICAgICIgIGZ1bmN0aW9uIGdldFRpbWVPdmVycmlkZSgpIHsiCisgICAgIiAg
ICBpZiAoKytjb3VudGVyID4gMTAwMCkiCisgICAgIiAgICAgIE9uU2xlZXBEZXRlY3RlZCgpOyIK
KyAgICAiICAgIHJldHVybiBvcmlnX2dldFRpbWUuY2FsbCh0aGlzKTsiCisgICAgIiAgfTsiCisg
ICAgIiAgZnVuY3Rpb24gZW5hYmxlU2xlZXBEZXRlY3Rpb24oZW5hYmxlKSB7IgorICAgICIgICAg
aWYgKGVuYWJsZSkgeyIKKyAgICAiICAgICAgY291bnRlciA9IDA7IgorICAgICIgICAgICBvcmln
X2dldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lOyIKKyAgICAiICAgICAgRGF0ZS5wcm90
b3R5cGUuZ2V0VGltZSA9IGdldFRpbWVPdmVycmlkZTsiCisgICAgIiAgICB9IGVsc2UgeyIKKyAg
ICAiICAgICAgRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSA9IG9yaWdfZ2V0VGltZTsiCisgICAgIiAg
ICB9IgorICAgICIgIH07IgorICAgICIgIG5hdGl2ZSBmdW5jdGlvbiBPblNsZWVwRGV0ZWN0ZWQo
KTsiCisgICAgIiAgbmF0aXZlIGZ1bmN0aW9uIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0
aW9uKCk7IgorICAgICIgIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKGVuYWJsZVNs
ZWVwRGV0ZWN0aW9uKTsiCisgICAgIn0pKCkiOworCitEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5z
aW9uKCkgOiB2ODo6RXh0ZW5zaW9uKHNfZGF0ZUV4dGVuc2lvbk5hbWUsIHNfZGF0ZUV4dGVuc2lv
blNjcmlwdCkKK3sKK30KKworRGF0ZUV4dGVuc2lvbiogRGF0ZUV4dGVuc2lvbjo6Z2V0KCkKK3sK
KyAgICBpZiAoIXNfZXh0ZW5zaW9uKQorICAgICAgICBzX2V4dGVuc2lvbiA9IG5ldyBEYXRlRXh0
ZW5zaW9uKCk7CisgICAgcmV0dXJuIHNfZXh0ZW5zaW9uOworfQorCit2b2lkIERhdGVFeHRlbnNp
b246OnNldEFsbG93U2xlZXAoYm9vbCBhbGxvdykKK3sKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gYXJndlsxXTsKKyAgICBhcmd2WzBdID0gdjg6OlN0cmluZzo6TmV3KGFsbG93ID8gImZhbHNl
IiA6ICJ0cnVlIik7CisgICAgZm9yIChGdW5jdGlvblBvaW50ZXJMaXN0OjppdGVyYXRvciBpID0g
Y2FsbEVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5iZWdpbigpOworICAgICAg
ICAgaSAhPSBjYWxsRW5hYmxlU2xlZXBEZXRlY3Rpb25GdW5jdGlvblBvaW50ZXJzLmVuZCgpOyAr
K2kpIHsKKyAgICAgICAgKCppKS0+Q2FsbCh2ODo6T2JqZWN0OjpOZXcoKSwgMSwgYXJndik7Cisg
ICAgfQorfQorCit2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBEYXRlRXh0ZW5zaW9u
OjpHZXROYXRpdmVGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IG5hbWUpCit7CisgICAg
aWYgKG5hbWUtPkVxdWFscyh2ODo6U3RyaW5nOjpOZXcoIkdpdmVFbmFibGVTbGVlcERldGVjdGlv
bkZ1bmN0aW9uIikpKSB7CisgICAgICAgIHJldHVybiB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3
KEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKTsKKyAgICB9IGVsc2UgaWYgKG5hbWUt
PkVxdWFscyh2ODo6U3RyaW5nOjpOZXcoIk9uU2xlZXBEZXRlY3RlZCIpKSkgeworICAgICAgICBy
ZXR1cm4gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhPblNsZWVwRGV0ZWN0ZWQpOworICAgIH0K
KworICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPigpOworfQorCit2
b2lkIERhdGVFeHRlbnNpb246OndlYWtDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+
IG9iamVjdCwgdm9pZCogcGFyYW0pCit7CisgICAgRGF0ZUV4dGVuc2lvbiogZXh0ZW5zaW9uID0g
Z2V0KCk7CisgICAgZm9yIChGdW5jdGlvblBvaW50ZXJMaXN0OjppdGVyYXRvciBpID0gZXh0ZW5z
aW9uLT5jYWxsRW5hYmxlU2xlZXBEZXRlY3Rpb25GdW5jdGlvblBvaW50ZXJzLmJlZ2luKCk7Cisg
ICAgICAgICBpICE9IGV4dGVuc2lvbi0+Y2FsbEVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Q
b2ludGVycy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmICgqaSA9PSBvYmplY3QpIHsKKyAgICAg
ICAgICAgIGktPkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+Y2FsbEVuYWJsZVNs
ZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5lcmFzZShpKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlQoZmFsc2UpOworfQorCit2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gRGF0ZUV4dGVuc2lvbjo6R2l2ZUVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rp
b24oY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgoKSAh
PSAxIHx8ICFhcmdzWzBdLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZp
bmVkKCk7CisKKyAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBnZXQgdGhlIEZyYW1lKiBoZXJlIGFu
ZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZnVuY3Rpb24gcG9pbnRlciwgc28gdGhhdAorICAgIC8v
IGVhY2ggdGltZSB3ZSBnbyBpbnRvIGFuIHVubG9hZCBoYW5kbGVyIHdlIGp1c3QgY2FsbCB0aGF0
IGZyYW1lJ3MgZnVuY3Rpb24uICBIb3dldmVyIHRoZXJlJ3MKKyAgICAvLyBubyB3YXkgdG8gZ2V0
IHRoZSBGcmFtZSogYXQgdGhpcyBwb2ludCwgc28gd2UganVzdCBzdG9yZSBhbGwgdGhlIGZ1bmN0
aW9uIHBvaW50ZXJzIGFuZCBjYWxsCisgICAgLy8gdGhlbSBhbGwgZWFjaCB0aW1lLgorICAgIERh
dGVFeHRlbnNpb24qIGV4dGVuc2lvbiA9IGdldCgpOworICAgIGV4dGVuc2lvbi0+Y2FsbEVuYWJs
ZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5wdXNoX2JhY2soCisgICAgICAgIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj46Ok5ldyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNh
c3QoYXJnc1swXSkpKTsKKyAgICBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1
bmN0aW9uUG9pbnRlcnMuYmFjaygpLk1ha2VXZWFrKE5VTEwsIHdlYWtDYWxsYmFjayk7CisgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IERhdGVF
eHRlbnNpb246Ok9uU2xlZXBEZXRlY3RlZChjb25zdCB2ODo6QXJndW1lbnRzJikKK3sKKyAgICAv
LyBBZnRlciB3ZSBjYWxsIFRlcm1pbmF0ZUV4ZWN1dGlvbigpLCB3ZSBjYW4ndCBjYWxsIGJhY2sg
aW50byBKYXZhU2NyaXB0IGFnYWluLCBzbworICAgIC8vIHJlc2V0IGFsbCB0aGUgb3RoZXIgZnJh
bWVzIGZpcnN0LgorICAgIGdldCgpLT5zZXRBbGxvd1NsZWVwKHRydWUpOworCisgICAgdjg6OlY4
OjpUZXJtaW5hdGVFeGVjdXRpb24oKTsKKyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRl
RXh0ZW5zaW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5z
aW9uLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRGF0ZUV4dGVuc2lvbl9o
CisjZGVmaW5lIERhdGVFeHRlbnNpb25faAorCisjaW5jbHVkZSA8djguaD4KKworI2luY2x1ZGUg
PGxpc3Q+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUHJldmVudCAic2xlZXAiIGNhbGxz
IGluIHVubG9hZCBoYW5kbGVycy4KK2NsYXNzIERhdGVFeHRlbnNpb24gOiBwdWJsaWMgdjg6OkV4
dGVuc2lvbiB7CitwdWJsaWM6CisgICAgc3RhdGljIERhdGVFeHRlbnNpb24qIGdldCgpOworICAg
IHZvaWQgc2V0QWxsb3dTbGVlcChib29sIGFsbG93KTsKKworcHJpdmF0ZToKKyAgICBEYXRlRXh0
ZW5zaW9uKCk7CisgICAgdmlydHVhbCB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBH
ZXROYXRpdmVGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+KTsKKyAgICBzdGF0aWMgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKGNvbnN0
IHY4OjpBcmd1bWVudHMmKTsKKyAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IE9uU2xl
ZXBEZXRlY3RlZChjb25zdCB2ODo6QXJndW1lbnRzJik7CisgICAgc3RhdGljIHZvaWQgd2Vha0Nh
bGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gb2JqZWN0LCB2b2lkKiBwYXJhbSk7CisK
KyAgICB0eXBlZGVmIHN0ZDo6bGlzdDx2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+ID4gRnVu
Y3Rpb25Qb2ludGVyTGlzdDsKKyAgICBGdW5jdGlvblBvaW50ZXJMaXN0IGNhbGxFbmFibGVTbGVl
cERldGVjdGlvbkZ1bmN0aW9uUG9pbnRlcnM7CisKKyAgICBzdGF0aWMgRGF0ZUV4dGVuc2lvbiog
c19leHRlbnNpb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8g
RGF0ZUV4dGVuc2lvbl9oCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4QWJzdHJhY3RFdmVu
dExpc3RlbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4QWJzdHJh
Y3RFdmVudExpc3RlbmVyLmNwcAkocmV2aXNpb24gNDgzODgpCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsNiAr
MzEsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlY4QWJzdHJhY3RFdmVudExp
c3RlbmVyLmgiCiAKKyNpbmNsdWRlICJEYXRlRXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiRG9jdW1l
bnQuaCIKICNpbmNsdWRlICJFdmVudC5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCkBAIC02Nyw2ICs2
OCwxMCBAQCB2b2lkIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjppbnZva2VFdmVuCiAgICAgdjg6
OkxvY2FsPHY4OjpTdHJpbmc+IGV2ZW50U3ltYm9sID0gdjg6OlN0cmluZzo6TmV3U3ltYm9sKCJl
dmVudCIpOwogICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJldHVyblZhbHVlOwogCisgICAgLy8g
SW4gYmVmb3JldW5sb2FkL3VubG9hZCBoYW5kbGVycywgd2Ugd2FudCB0byBhdm9pZCBzbGVlcHMg
d2hpY2ggZG8gdGlnaHQgbG9vcHMgb2YgY2FsbGluZyBEYXRlLmdldFRpbWUoKS4KKyAgICBpZiAo
ZXZlbnQtPnR5cGUoKSA9PSAiYmVmb3JldW5sb2FkIiB8fCBldmVudC0+dHlwZSgpID09ICJ1bmxv
YWQiKQorICAgICAgICBEYXRlRXh0ZW5zaW9uOjpnZXQoKS0+c2V0QWxsb3dTbGVlcChmYWxzZSk7
CisKICAgICB7CiAgICAgICAgIC8vIENhdGNoIGV4Y2VwdGlvbnMgdGhyb3duIGluIHRoZSBldmVu
dCBoYW5kbGVyIHNvIHRoZXkgZG8gbm90IHByb3BhZ2F0ZSB0byBqYXZhc2NyaXB0IGNvZGUgdGhh
dCBjYXVzZWQgdGhlIGV2ZW50IHRvIGZpcmUuCiAgICAgICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRj
aDsKQEAgLTgyLDYgKzg3LDkgQEAgdm9pZCBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6aW52b2tl
RXZlbgogCiAgICAgICAgIC8vIENhbGwgdGhlIGV2ZW50IGhhbmRsZXIuCiAgICAgICAgIHJldHVy
blZhbHVlID0gY2FsbExpc3RlbmVyRnVuY3Rpb24oanNFdmVudCwgZXZlbnQsIGlzV2luZG93RXZl
bnQpOworICAgICAgICBpZiAoIXRyeUNhdGNoLkNhbkNvbnRpbnVlKCkpCisgICAgICAgICAgICBy
ZXR1cm47CisKICAgICAgICAgdHJ5Q2F0Y2guUmVzZXQoKTsKIAogICAgICAgICAvLyBSZXN0b3Jl
IHRoZSBvbGQgZXZlbnQuIFRoaXMgbXVzdCBiZSBkb25lIGZvciBhbGwgZXhpdCBwYXRocyB0aHJv
dWdoIHRoaXMgbWV0aG9kLgpAQCAtOTIsNiArMTAwLDkgQEAgdm9pZCBWOEFic3RyYWN0RXZlbnRM
aXN0ZW5lcjo6aW52b2tlRXZlbgogICAgICAgICB0cnlDYXRjaC5SZXNldCgpOwogICAgIH0KIAor
ICAgIGlmIChldmVudC0+dHlwZSgpID09ICJiZWZvcmV1bmxvYWQiIHx8IGV2ZW50LT50eXBlKCkg
PT0gInVubG9hZCIpCisgICAgICAgIERhdGVFeHRlbnNpb246OmdldCgpLT5zZXRBbGxvd1NsZWVw
KHRydWUpOworCiAgICAgQVNTRVJUKCFWOFByb3h5OjpoYW5kbGVPdXRPZk1lbW9yeSgpIHx8IHJl
dHVyblZhbHVlLklzRW1wdHkoKSk7CiAKICAgICBpZiAocmV0dXJuVmFsdWUuSXNFbXB0eSgpKQpJ
bmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuY3BwCShyZXZpc2lvbiA0ODM4OCkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvVjhQcm94eS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDcgQEAK
IAogI2luY2x1ZGUgIkNocm9taXVtQnJpZGdlLmgiCiAjaW5jbHVkZSAiQ1NTTXV0YWJsZVN0eWxl
RGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJEYXRlRXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiRE9N
T2JqZWN0c0luY2x1ZGUuaCIKICNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgogI2luY2x1ZGUg
IkZyYW1lTG9hZGVyQ2xpZW50LmgiCkBAIC05MDQsNiArOTA1LDEwIEBAIHY4OjpQZXJzaXN0ZW50
PHY4OjpDb250ZXh0PiBWOFByb3h5OjpjcmUKICAgICAvLyBJbnN0YWxsIGEgc2VjdXJpdHkgaGFu
ZGxlciB3aXRoIFY4LgogICAgIGdsb2JhbFRlbXBsYXRlLT5TZXRBY2Nlc3NDaGVja0NhbGxiYWNr
cyhWOEN1c3RvbTo6djhET01XaW5kb3dOYW1lZFNlY3VyaXR5Q2hlY2ssIFY4Q3VzdG9tOjp2OERP
TVdpbmRvd0luZGV4ZWRTZWN1cml0eUNoZWNrLCB2ODo6SW50ZWdlcjo6TmV3KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XKSk7CiAKKyAgICAvLyBVc2VkIHRvIGF2b2lkIHNsZWVwIGNhbGxzIGluIHVu
bG9hZCBoYW5kbGVycy4KKyAgICBpZiAoIXJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgoRGF0ZUV4
dGVuc2lvbjo6Z2V0KCkpKQorICAgICAgICByZWdpc3RlckV4dGVuc2lvbihEYXRlRXh0ZW5zaW9u
OjpnZXQoKSwgU3RyaW5nKCkpOworCiAgICAgLy8gRHluYW1pY2FsbHkgdGVsbCB2OCBhYm91dCBv
dXIgZXh0ZW5zaW9ucyBub3cuCiAgICAgT3duQXJyYXlQdHI8Y29uc3QgY2hhcio+IGV4dGVuc2lv
bk5hbWVzKG5ldyBjb25zdCBjaGFyKlttX2V4dGVuc2lvbnMuc2l6ZSgpXSk7CiAgICAgaW50IGlu
ZGV4ID0gMDsKQEAgLTEyNTMsMTQgKzEyNTgsMjEgQEAgU3RyaW5nIFY4UHJveHk6OnNvdXJjZU5h
bWUoKQogICAgIHJldHVybiB0b1dlYkNvcmVTdHJpbmcodjg6OkRlYnVnOjpDYWxsKGZyYW1lU291
cmNlTmFtZSkpOwogfQogCi12b2lkIFY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uV2l0aFY4KHY4
OjpFeHRlbnNpb24qIGV4dGVuc2lvbikgewordm9pZCBWOFByb3h5OjpyZWdpc3RlckV4dGVuc2lv
bldpdGhWOCh2ODo6RXh0ZW5zaW9uKiBleHRlbnNpb24pCit7CiAgICAgLy8gSWYgdGhlIGV4dGVu
c2lvbiBleGlzdHMgaW4gb3VyIGxpc3QsIGl0IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBW
OC4KKyAgICBpZiAoIXJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgoZXh0ZW5zaW9uKSkKKyAgICAg
ICAgdjg6OlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbik7Cit9CisKK2Jvb2wgVjhQcm94eTo6
cmVnaXN0ZXJlZEV4dGVuc2lvbldpdGhWOCh2ODo6RXh0ZW5zaW9uKiBleHRlbnNpb24pCit7CiAg
ICAgZm9yIChWOEV4dGVuc2lvbkxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9leHRlbnNpb25zLmJlZ2lu
KCk7IGl0ICE9IG1fZXh0ZW5zaW9ucy5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoaXQtPmV4
dGVuc2lvbiA9PSBleHRlbnNpb24pCi0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICB2ODo6UmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9u
KTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgVjhQcm94eTo6cmVnaXN0ZXJFeHRlbnNp
b24odjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uLCBjb25zdCBTdHJpbmcmIHNjaGVtZVJlc3RyaWN0
aW9uKQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJKHJldmlzaW9uIDQ4Mzg4KQorKysgV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOFByb3h5LmgJKHdvcmtpbmcgY29weSkKQEAgLTM4MSw2ICszODEsNyBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBjcmVh
dGVXcmFwcGVyRnJvbUNhY2hlU2xvd0Nhc2UoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlKTsK
IAogICAgICAgICBzdGF0aWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbldpdGhWOCh2ODo6RXh0ZW5z
aW9uKik7CisgICAgICAgIHN0YXRpYyBib29sIHJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgodjg6
OkV4dGVuc2lvbiopOwogCiAgICAgICAgIEZyYW1lKiBtX2ZyYW1lOwogCkluZGV4OiBMYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZp
c2lvbiA0ODM4OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAt
MSwzICsxLDE4IEBACisyMDA5LTA5LTE1ICBKb2huIEFiZC1FbC1NYWxlayAgPGphbUBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
UHJldmVudCBzbGVlcHMgaW4gdW5sb2FkIGhhbmRsZXJzLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkxOTMKKworICAgICAgICAqIGZhc3QvZG9tL1dp
bmRvdy9yZXNvdXJjZXMvc2xvd191bmxvYWRfaGFuZGxlcjEuaHRtbDogQWRkZWQuCisgICAgICAg
ICogZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXItZXhwZWN0ZWQudHh0OiBBZGRl
ZC4KKyAgICAgICAgKiBmYXN0L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci5odG1sOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2tpcHBlZDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9tYWMvU2tpcHBlZDoKKyAgICAgICAgKiBwbGF0Zm9ybS9xdC9Ta2lwcGVkOgorICAgICAgICAq
IHBsYXRmb3JtL3dpbi9Ta2lwcGVkOgorCiAyMDA5LTA5LTE0ICBCcmFkeSBFaWRzb24gIDxiZWlk
c29uQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6
IExheW91dFRlc3RzL2Zhc3QvZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLWV4cGVjdGVk
LnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cvc2xvd191bmxv
YWRfaGFuZGxlci1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0
L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci1leHBlY3RlZC50eHQJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsNiBAQAorZnJhbWUgInRoZWlmcmFtZSIgLSBoYXMgMSBvbnVubG9hZCBoYW5k
bGVyKHMpCitUaGlzIGlzIGEgdGVzdCBmb3IgYnVnIDI5MTkzOiBOZWVkIHRvIHByZXZlbnQgSmF2
YXNjcmlwdCBzbGVlcHMgaW4gdW5sb2FkIGhhbmRsZXJzLiBJZiBzdWNjZXNzZnVsLCBQQVNTIHNo
b3VsZCBiZSBwcmludGVkIGJlbG93LgorCitQQVNTCisKKwpJbmRleDogTGF5b3V0VGVzdHMvZmFz
dC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXIuaHRtbAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlv
dXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci5odG1sCShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXIu
aHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzNCBAQAorPGh0bWw+Cis8aGVhZD4KKzxsaW5r
IHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUu
Y3NzIj4KKzxzY3JpcHQ+CisKK2lmIChsYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgIGxheW91
dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICBsYXlvdXRUZXN0Q29udHJvbGxl
ci5kdW1wQXNUZXh0KCk7Cit9CisKK2Z1bmN0aW9uIGRvbmUoKQoreworICAgIGlmIChkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgicmVzdWx0cyIpLmlubmVySFRNTCA9PSAiIikKKyAgICAgICAgZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdHMiKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVh
dGVUZXh0Tm9kZSgiUEFTUyIpKTsKKyAgICBpZiAobGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVuY3Rpb24gbG9h
ZGVkKCkgeworICAgIHNldFRpbWVvdXQoImRvbmUoKSIsIDApOworICAgIGRvY3VtZW50LmdldEVs
ZW1lbnRCeUlkKCJ0aGVpZnJhbWUiKS5vdXRlckhUTUw9Jyc7Cit9CisKKzwvc2NyaXB0PgorPC9o
ZWFkPgorPGJvZHkgb25sb2FkPSJzZXRUaW1lb3V0KCdsb2FkZWQoKTsnLCAwKSI+Cis8cD4KKyAg
ICBUaGlzIGlzIGEgdGVzdCBmb3IgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI5MTkzIj5idWcgMjkxOTM8L2E+OgorICAgIDxpPk5lZWQgdG8gcHJldmVu
dCBKYXZhc2NyaXB0IHNsZWVwcyBpbiB1bmxvYWQgaGFuZGxlcnMuPC9pPiBJZiBzdWNjZXNzZnVs
LCBQQVNTIHNob3VsZCBiZSBwcmludGVkIGJlbG93LgorPC9wPgorPHAgaWQ9InJlc3VsdHMiIGNs
YXNzPSJwYXNzIj48L3A+Cis8aWZyYW1lIGlkPSJ0aGVpZnJhbWUiIHN0eWxlPSJib3JkZXI6IDAi
IHNyYz0icmVzb3VyY2VzL3Nsb3dfdW5sb2FkX2hhbmRsZXIxLmh0bWwiPgorPC9ib2R5PgorPC9o
dG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qv
ZG9tL1dpbmRvdy9yZXNvdXJjZXMvc2xvd191bmxvYWRfaGFuZGxlcjEuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cvcmVzb3VyY2VzL3Nsb3dfdW5sb2FkX2hh
bmRsZXIxLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cv
cmVzb3VyY2VzL3Nsb3dfdW5sb2FkX2hhbmRsZXIxLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMTggQEAKKzxodG1sPgorPHNjcmlwdD4KK2Z1bmN0aW9uIHBhdXNlKG1pbGxpc2Vjb25kcykg
eworICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpOworICAgIHZhciBleGl0VGltZSA9IG5vdy5nZXRU
aW1lKCkgKyBtaWxsaXNlY29uZHM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgbm93ID0g
bmV3IERhdGUoKTsKKyAgICAgICAgaWYgKG5vdy5nZXRUaW1lKCkgPiBleGl0VGltZSkKKyAgICAg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
InJlc3VsdHMiKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiRkFJTCIpKTsK
KyAgICBpZiAobGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxheW91dFRlc3RDb250cm9s
bGVyLm5vdGlmeURvbmUoKTsKK30KKzwvc2NyaXB0PgorPGJvZHkgb251bmxvYWQ9InBhdXNlKDEw
MDAwKTsiPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5k
ZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCShyZXZpc2lvbiA0ODM4OCkKKysrIExheW91dFRl
c3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCSh3b3JraW5nIGNvcHkpCkBAIC01NzI3LDMgKzU3Mjcs
NiBAQCBodHRwL3Rlc3RzL3htbGh0dHByZXF1ZXN0L3dvcmtlcnMvc2hhcmVkCiAKICMgTm8gYXV0
aGVudGljYXRpb24gY2hhbGxlbmdlIGhhbmRsaW5nCiBodHRwL3Rlc3RzL2xvYWRpbmcvYmFzaWMt
Y3JlZGVudGlhbHMtc2VudC1hdXRvbWF0aWNhbGx5Lmh0bWwKKworIyBUaGlzIHBvcnQgZG9lc24n
dCBzdXBwb3J0IGRldGVjdGluZyBzbG93IHVubG9hZCBoYW5kbGVycy4KK2Zhc3QvZG9tL1dpbmRv
dy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL21h
Yy9Ta2lwcGVkCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVk
CShyZXZpc2lvbiA0ODM4OCkKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVkCSh3
b3JraW5nIGNvcHkpCkBAIC0xMDYsMyArMTA2LDUgQEAgbWVkaWEvdmlkZW8tY29udHJvbHMtem9v
bWVkLmh0bWwKICMgPHJkYXI6Ly9wcm9ibGVtLzcxOTY0ODU+IGFuZCBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwMjEKIGZhc3QvbG9hZGVyL2ZyYW1lcy13aXRoLXVu
bG9hZC1oYW5kbGVycy1pbi1wYWdlLWNhY2hlLmh0bWwKIAorIyBUaGlzIHBvcnQgZG9lc24ndCBz
dXBwb3J0IGRldGVjdGluZyBzbG93IHVubG9hZCBoYW5kbGVycy4KK2Zhc3QvZG9tL1dpbmRvdy9z
bG93X3VubG9hZF9oYW5kbGVyLmh0bWwKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL3F0L1Nr
aXBwZWQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQvU2tpcHBlZAkocmV2
aXNpb24gNDgzODgpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVkCSh3b3JraW5n
IGNvcHkpCkBAIC00ODQxLDMgKzQ4NDEsNiBAQCB1c2Vyc2NyaXB0cwogCiAjIE5vIGF1dGhlbnRp
Y2F0aW9uIGNoYWxsZW5nZSBoYW5kbGluZwogaHR0cC90ZXN0cy9sb2FkaW5nL2Jhc2ljLWNyZWRl
bnRpYWxzLXNlbnQtYXV0b21hdGljYWxseS5odG1sCisKKyMgVGhpcyBwb3J0IGRvZXNuJ3Qgc3Vw
cG9ydCBkZXRlY3Rpbmcgc2xvdyB1bmxvYWQgaGFuZGxlcnMuCitmYXN0L2RvbS9XaW5kb3cvc2xv
d191bmxvYWRfaGFuZGxlci5odG1sCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tp
cHBlZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBlZAkocmV2
aXNpb24gNDgzODgpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBlZAkod29ya2lu
ZyBjb3B5KQpAQCAtNjY1LDMgKzY2NSw2IEBAIGh0dHAvdGVzdHMvc2VjdXJpdHkvbWl4ZWRDb250
ZW50CiAjIEFzIGxvbmcgYXMgcGFnZXMgd2l0aCB1bmxvYWQgaGFuZGxlcnMgYXJlIHB1dCBpbiB0
aGUgUGFnZSBDYWNoZSwgdGhpcyB0ZXN0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgZm9yIFdpbmRv
d3MuCiAjIDxyZGFyOi8vcHJvYmxlbS83MTk2NDg1PiBhbmQgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTI5MDIxCiBmYXN0L2xvYWRlci9mcmFtZXMtd2l0aC11bmxvYWQt
aGFuZGxlcnMtaW4tcGFnZS1jYWNoZS5odG1sCisKKyMgVGhpcyBwb3J0IGRvZXNuJ3Qgc3VwcG9y
dCBkZXRlY3Rpbmcgc2xvdyB1bmxvYWQgaGFuZGxlcnMuCitmYXN0L2RvbS9XaW5kb3cvc2xvd191
bmxvYWRfaGFuZGxlci5odG1sCg==
</data>
<flag name="review"
          id="20699"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>39873</attachid>
            <date>2009-09-21 14:01:56 -0700</date>
            <delta_ts>2009-09-21 14:26:40 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>nosleep3.txt</filename>
            <type>text/plain</type>
            <size>19682</size>
            <attacher name="John Abd-El-Malek">jam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0ODM4OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMDktMDktMTUgIEpvaG4gQWJkLUVsLU1hbGVrICA8amFtQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBQcmV2ZW50IHNsZWVwcyBpbiB1bmxvYWQgaGFuZGxlcnMuCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTE5MworCisgICAgICAgIFRlc3Q6IGZhc3Qv
ZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5zaW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGVFeHRlbnNpb246OmdldCk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0
ZW5zaW9uOjpzZXRBbGxvd1NsZWVwKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246
OkdldE5hdGl2ZUZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246Ondl
YWtDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpHaXZlRW5hYmxl
U2xlZXBEZXRlY3Rpb25GdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9u
OjpPblNsZWVwRGV0ZWN0ZWQpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2
ZW50SGFuZGxlcik6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpWOFByb3h5OjpjcmVhdGVOZXdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uV2l0aFY4KToKKyAgICAgICAgKFdlYkNvcmU6OlY4
UHJveHk6OnJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1Y4UHJveHkuaDoKKwogMjAwOS0wOS0xNCAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL1dl
YkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24g
NDgzODgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNjkwLDYg
KzY5MCw4IEBACiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXpl
ckNvbnN0cnVjdG9yLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WFBh
dGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92
OC9EYXRlRXh0ZW5zaW9uLmNwcCcsCisgICAgICAgICAgICAnYmluZGluZ3MvdjgvRGF0ZUV4dGVu
c2lvbi5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9ET01EYXRhLmNwcCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3MvdjgvRE9NRGF0YS5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9E
T01EYXRhU3RvcmUuY3BwJywKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lvbi5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRhdGVFeHRlbnNpb24uaCIKKworI2luY2x1ZGUgIlY4UHJveHkuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitEYXRlRXh0ZW5zaW9uKiBEYXRlRXh0ZW5zaW9uOjpleHRlbnNpb247
CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkYXRlRXh0ZW5zaW9uTmFtZSA9ICJ2OC9EYXRlRXh0ZW5z
aW9uIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBkYXRlRXh0ZW5zaW9uU2NyaXB0ID0KKyAgICAiKGZ1
bmN0aW9uICgpIHsiCisgICAgIiAgdmFyIGNvdW50ZXI7IgorICAgICIgIHZhciBvcmlnX2dldFRp
bWU7IgorICAgICIgIGZ1bmN0aW9uIGdldFRpbWVPdmVycmlkZSgpIHsiCisgICAgIiAgICBpZiAo
Kytjb3VudGVyID4gMTAwMCkiCisgICAgIiAgICAgIE9uU2xlZXBEZXRlY3RlZCgpOyIKKyAgICAi
ICAgIHJldHVybiBvcmlnX2dldFRpbWUuY2FsbCh0aGlzKTsiCisgICAgIiAgfTsiCisgICAgIiAg
ZnVuY3Rpb24gZW5hYmxlU2xlZXBEZXRlY3Rpb24oZW5hYmxlKSB7IgorICAgICIgICAgaWYgKGVu
YWJsZSkgeyIKKyAgICAiICAgICAgY291bnRlciA9IDA7IgorICAgICIgICAgICBvcmlnX2dldFRp
bWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lOyIKKyAgICAiICAgICAgRGF0ZS5wcm90b3R5cGUu
Z2V0VGltZSA9IGdldFRpbWVPdmVycmlkZTsiCisgICAgIiAgICB9IGVsc2UgeyIKKyAgICAiICAg
ICAgRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSA9IG9yaWdfZ2V0VGltZTsiCisgICAgIiAgICB9Igor
ICAgICIgIH07IgorICAgICIgIG5hdGl2ZSBmdW5jdGlvbiBPblNsZWVwRGV0ZWN0ZWQoKTsiCisg
ICAgIiAgbmF0aXZlIGZ1bmN0aW9uIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKCk7
IgorICAgICIgIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKGVuYWJsZVNsZWVwRGV0
ZWN0aW9uKTsiCisgICAgIn0pKCkiOworCitEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5zaW9uKCkg
OiB2ODo6RXh0ZW5zaW9uKGRhdGVFeHRlbnNpb25OYW1lLCBkYXRlRXh0ZW5zaW9uU2NyaXB0KQor
eworfQorCitEYXRlRXh0ZW5zaW9uKiBEYXRlRXh0ZW5zaW9uOjpnZXQoKQoreworICAgIGlmICgh
ZXh0ZW5zaW9uKQorICAgICAgICBleHRlbnNpb24gPSBuZXcgRGF0ZUV4dGVuc2lvbigpOworICAg
IHJldHVybiBleHRlbnNpb247Cit9CisKK3ZvaWQgRGF0ZUV4dGVuc2lvbjo6c2V0QWxsb3dTbGVl
cChib29sIGFsbG93KQoreworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2WzFdOworICAg
IGFyZ3ZbMF0gPSB2ODo6U3RyaW5nOjpOZXcoYWxsb3cgPyAiZmFsc2UiIDogInRydWUiKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9u
UG9pbnRlcnMuc2l6ZSgpOyArK2kpCisgICAgICAgIGNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1
bmN0aW9uUG9pbnRlcnNbaV0tPkNhbGwodjg6Ok9iamVjdDo6TmV3KCksIDEsIGFyZ3YpOworfQor
Cit2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBEYXRlRXh0ZW5zaW9uOjpHZXROYXRp
dmVGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IG5hbWUpCit7CisgICAgaWYgKG5hbWUt
PkVxdWFscyh2ODo6U3RyaW5nOjpOZXcoIkdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9u
IikpKQorICAgICAgICByZXR1cm4gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhHaXZlRW5hYmxl
U2xlZXBEZXRlY3Rpb25GdW5jdGlvbik7CisgICAgaWYgKG5hbWUtPkVxdWFscyh2ODo6U3RyaW5n
OjpOZXcoIk9uU2xlZXBEZXRlY3RlZCIpKSkKKyAgICAgICAgcmV0dXJuIHY4OjpGdW5jdGlvblRl
bXBsYXRlOjpOZXcoT25TbGVlcERldGVjdGVkKTsKKworICAgIHJldHVybiB2ODo6SGFuZGxlPHY4
OjpGdW5jdGlvblRlbXBsYXRlPigpOworfQorCit2b2lkIERhdGVFeHRlbnNpb246OndlYWtDYWxs
YmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IG9iamVjdCwgdm9pZCogcGFyYW0pCit7Cisg
ICAgRGF0ZUV4dGVuc2lvbiogZXh0ZW5zaW9uID0gZ2V0KCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uUG9pbnRl
cnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGV4dGVuc2lvbi0+Y2FsbEVuYWJsZVNsZWVw
RGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVyc1tpXSA9PSBvYmplY3QpIHsKKyAgICAgICAgICAgIG9i
amVjdC5EaXNwb3NlKCk7CisgICAgICAgICAgICBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERl
dGVjdGlvbkZ1bmN0aW9uUG9pbnRlcnMucmVtb3ZlKGkpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gRGF0ZUV4dGVuc2lvbjo6R2l2ZUVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVu
Y3Rpb24oY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgo
KSAhPSAxIHx8ICFhcmdzWzBdLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiB2ODo6VW5k
ZWZpbmVkKCk7CisKKyAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBnZXQgdGhlIEZyYW1lKiBoZXJl
IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZnVuY3Rpb24gcG9pbnRlciwgc28gdGhhdAorICAg
IC8vIGVhY2ggdGltZSB3ZSBnbyBpbnRvIGFuIHVubG9hZCBoYW5kbGVyIHdlIGp1c3QgY2FsbCB0
aGF0IGZyYW1lJ3MgZnVuY3Rpb24uICBIb3dldmVyIHRoZXJlJ3MKKyAgICAvLyBubyB3YXkgdG8g
Z2V0IHRoZSBGcmFtZSogYXQgdGhpcyBwb2ludCwgc28gd2UganVzdCBzdG9yZSBhbGwgdGhlIGZ1
bmN0aW9uIHBvaW50ZXJzIGFuZCBjYWxsCisgICAgLy8gdGhlbSBhbGwgZWFjaCB0aW1lLgorICAg
IERhdGVFeHRlbnNpb24qIGV4dGVuc2lvbiA9IGdldCgpOworICAgIGV4dGVuc2lvbi0+Y2FsbEVu
YWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5hcHBlbmQoCisgICAgICAgIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj46Ok5ldyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNh
c3QoYXJnc1swXSkpKTsKKyAgICBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1
bmN0aW9uUG9pbnRlcnMubGFzdCgpLk1ha2VXZWFrKE5VTEwsIHdlYWtDYWxsYmFjayk7CisgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IERhdGVF
eHRlbnNpb246Ok9uU2xlZXBEZXRlY3RlZChjb25zdCB2ODo6QXJndW1lbnRzJikKK3sKKyAgICAv
LyBBZnRlciB3ZSBjYWxsIFRlcm1pbmF0ZUV4ZWN1dGlvbigpLCB3ZSBjYW4ndCBjYWxsIGJhY2sg
aW50byBKYXZhU2NyaXB0IGFnYWluLCBzbworICAgIC8vIHJlc2V0IGFsbCB0aGUgb3RoZXIgZnJh
bWVzIGZpcnN0LgorICAgIGdldCgpLT5zZXRBbGxvd1NsZWVwKHRydWUpOworCisgICAgdjg6OlY4
OjpUZXJtaW5hdGVFeGVjdXRpb24oKTsKKyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRl
RXh0ZW5zaW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5z
aW9uLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRGF0ZUV4dGVuc2lvbl9o
CisjZGVmaW5lIERhdGVFeHRlbnNpb25faAorCisjaW5jbHVkZSA8djguaD4KKworI2luY2x1ZGUg
IlZlY3Rvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFByZXZlbnQgInNsZWVwIiBj
YWxscyBpbiB1bmxvYWQgaGFuZGxlcnMuCitjbGFzcyBEYXRlRXh0ZW5zaW9uIDogcHVibGljIHY4
OjpFeHRlbnNpb24geworcHVibGljOgorICAgIHN0YXRpYyBEYXRlRXh0ZW5zaW9uKiBnZXQoKTsK
KyAgICB2b2lkIHNldEFsbG93U2xlZXAoYm9vbCBhbGxvdyk7CisKK3ByaXZhdGU6CisgICAgRGF0
ZUV4dGVuc2lvbigpOworICAgIHZpcnR1YWwgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0
ZT4gR2V0TmF0aXZlRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6U3RyaW5nPik7CisgICAgc3RhdGlj
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBHaXZlRW5hYmxlU2xlZXBEZXRlY3Rpb25GdW5jdGlvbihj
b25zdCB2ODo6QXJndW1lbnRzJik7CisgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBP
blNsZWVwRGV0ZWN0ZWQoY29uc3Qgdjg6OkFyZ3VtZW50cyYpOworICAgIHN0YXRpYyB2b2lkIHdl
YWtDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IG9iamVjdCwgdm9pZCogcGFyYW0p
OworCisgICAgdHlwZWRlZiBXVEY6OlZlY3Rvcjx2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+
ID4gRnVuY3Rpb25Qb2ludGVyczsKKyAgICBGdW5jdGlvblBvaW50ZXJzIGNhbGxFbmFibGVTbGVl
cERldGVjdGlvbkZ1bmN0aW9uUG9pbnRlcnM7CisKKyAgICBzdGF0aWMgRGF0ZUV4dGVuc2lvbiog
ZXh0ZW5zaW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIERh
dGVFeHRlbnNpb25faApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRM
aXN0ZW5lci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0
RXZlbnRMaXN0ZW5lci5jcHAJKHJldmlzaW9uIDQ4Mzg4KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMx
LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJWOEFic3RyYWN0RXZlbnRMaXN0
ZW5lci5oIgogCisjaW5jbHVkZSAiRGF0ZUV4dGVuc2lvbi5oIgogI2luY2x1ZGUgIkRvY3VtZW50
LmgiCiAjaW5jbHVkZSAiRXZlbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgpAQCAtNjcsNiArNjgs
MTAgQEAgdm9pZCBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6aW52b2tlRXZlbgogICAgIHY4OjpM
b2NhbDx2ODo6U3RyaW5nPiBldmVudFN5bWJvbCA9IHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiZXZl
bnQiKTsKICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXR1cm5WYWx1ZTsKIAorICAgIC8vIElu
IGJlZm9yZXVubG9hZC91bmxvYWQgaGFuZGxlcnMsIHdlIHdhbnQgdG8gYXZvaWQgc2xlZXBzIHdo
aWNoIGRvIHRpZ2h0IGxvb3BzIG9mIGNhbGxpbmcgRGF0ZS5nZXRUaW1lKCkuCisgICAgaWYgKGV2
ZW50LT50eXBlKCkgPT0gImJlZm9yZXVubG9hZCIgfHwgZXZlbnQtPnR5cGUoKSA9PSAidW5sb2Fk
IikKKyAgICAgICAgRGF0ZUV4dGVuc2lvbjo6Z2V0KCktPnNldEFsbG93U2xlZXAoZmFsc2UpOwor
CiAgICAgewogICAgICAgICAvLyBDYXRjaCBleGNlcHRpb25zIHRocm93biBpbiB0aGUgZXZlbnQg
aGFuZGxlciBzbyB0aGV5IGRvIG5vdCBwcm9wYWdhdGUgdG8gamF2YXNjcmlwdCBjb2RlIHRoYXQg
Y2F1c2VkIHRoZSBldmVudCB0byBmaXJlLgogICAgICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7
CkBAIC04Miw2ICs4Nyw5IEBAIHZvaWQgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2
ZW4KIAogICAgICAgICAvLyBDYWxsIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICByZXR1cm5W
YWx1ZSA9IGNhbGxMaXN0ZW5lckZ1bmN0aW9uKGpzRXZlbnQsIGV2ZW50LCBpc1dpbmRvd0V2ZW50
KTsKKyAgICAgICAgaWYgKCF0cnlDYXRjaC5DYW5Db250aW51ZSgpKQorICAgICAgICAgICAgcmV0
dXJuOworCiAgICAgICAgIHRyeUNhdGNoLlJlc2V0KCk7CiAKICAgICAgICAgLy8gUmVzdG9yZSB0
aGUgb2xkIGV2ZW50LiBUaGlzIG11c3QgYmUgZG9uZSBmb3IgYWxsIGV4aXQgcGF0aHMgdGhyb3Vn
aCB0aGlzIG1ldGhvZC4KQEAgLTkyLDYgKzEwMCw5IEBAIHZvaWQgVjhBYnN0cmFjdEV2ZW50TGlz
dGVuZXI6Omludm9rZUV2ZW4KICAgICAgICAgdHJ5Q2F0Y2guUmVzZXQoKTsKICAgICB9CiAKKyAg
ICBpZiAoZXZlbnQtPnR5cGUoKSA9PSAiYmVmb3JldW5sb2FkIiB8fCBldmVudC0+dHlwZSgpID09
ICJ1bmxvYWQiKQorICAgICAgICBEYXRlRXh0ZW5zaW9uOjpnZXQoKS0+c2V0QWxsb3dTbGVlcCh0
cnVlKTsKKwogICAgIEFTU0VSVCghVjhQcm94eTo6aGFuZGxlT3V0T2ZNZW1vcnkoKSB8fCByZXR1
cm5WYWx1ZS5Jc0VtcHR5KCkpOwogCiAgICAgaWYgKHJldHVyblZhbHVlLklzRW1wdHkoKSkKSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOFByb3h5LmNwcAkocmV2aXNpb24gNDgzODgpCisrKyBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1Y4UHJveHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAK
ICNpbmNsdWRlICJDaHJvbWl1bUJyaWRnZS5oIgogI2luY2x1ZGUgIkNTU011dGFibGVTdHlsZURl
Y2xhcmF0aW9uLmgiCisjaW5jbHVkZSAiRGF0ZUV4dGVuc2lvbi5oIgogI2luY2x1ZGUgIkRPTU9i
amVjdHNJbmNsdWRlLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKICNpbmNsdWRlICJG
cmFtZUxvYWRlckNsaWVudC5oIgpAQCAtOTA0LDYgKzkwNSwxMCBAQCB2ODo6UGVyc2lzdGVudDx2
ODo6Q29udGV4dD4gVjhQcm94eTo6Y3JlCiAgICAgLy8gSW5zdGFsbCBhIHNlY3VyaXR5IGhhbmRs
ZXIgd2l0aCBWOC4KICAgICBnbG9iYWxUZW1wbGF0ZS0+U2V0QWNjZXNzQ2hlY2tDYWxsYmFja3Mo
VjhDdXN0b206OnY4RE9NV2luZG93TmFtZWRTZWN1cml0eUNoZWNrLCBWOEN1c3RvbTo6djhET01X
aW5kb3dJbmRleGVkU2VjdXJpdHlDaGVjaywgdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6
OkRPTVdJTkRPVykpOwogCisgICAgLy8gVXNlZCB0byBhdm9pZCBzbGVlcCBjYWxscyBpbiB1bmxv
YWQgaGFuZGxlcnMuCisgICAgaWYgKCFyZWdpc3RlcmVkRXh0ZW5zaW9uV2l0aFY4KERhdGVFeHRl
bnNpb246OmdldCgpKSkKKyAgICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oRGF0ZUV4dGVuc2lvbjo6
Z2V0KCksIFN0cmluZygpKTsKKwogICAgIC8vIER5bmFtaWNhbGx5IHRlbGwgdjggYWJvdXQgb3Vy
IGV4dGVuc2lvbnMgbm93LgogICAgIE93bkFycmF5UHRyPGNvbnN0IGNoYXIqPiBleHRlbnNpb25O
YW1lcyhuZXcgY29uc3QgY2hhcipbbV9leHRlbnNpb25zLnNpemUoKV0pOwogICAgIGludCBpbmRl
eCA9IDA7CkBAIC0xMjUzLDE0ICsxMjU4LDIxIEBAIFN0cmluZyBWOFByb3h5Ojpzb3VyY2VOYW1l
KCkKICAgICByZXR1cm4gdG9XZWJDb3JlU3RyaW5nKHY4OjpEZWJ1Zzo6Q2FsbChmcmFtZVNvdXJj
ZU5hbWUpKTsKIH0KIAotdm9pZCBWOFByb3h5OjpyZWdpc3RlckV4dGVuc2lvbldpdGhWOCh2ODo6
RXh0ZW5zaW9uKiBleHRlbnNpb24pIHsKK3ZvaWQgVjhQcm94eTo6cmVnaXN0ZXJFeHRlbnNpb25X
aXRoVjgodjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uKQorewogICAgIC8vIElmIHRoZSBleHRlbnNp
b24gZXhpc3RzIGluIG91ciBsaXN0LCBpdCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggVjgu
CisgICAgaWYgKCFyZWdpc3RlcmVkRXh0ZW5zaW9uV2l0aFY4KGV4dGVuc2lvbikpCisgICAgICAg
IHY4OjpSZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb24pOworfQorCitib29sIFY4UHJveHk6OnJl
Z2lzdGVyZWRFeHRlbnNpb25XaXRoVjgodjg6OkV4dGVuc2lvbiogZXh0ZW5zaW9uKQorewogICAg
IGZvciAoVjhFeHRlbnNpb25MaXN0OjppdGVyYXRvciBpdCA9IG1fZXh0ZW5zaW9ucy5iZWdpbigp
OyBpdCAhPSBtX2V4dGVuc2lvbnMuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKGl0LT5leHRl
bnNpb24gPT0gZXh0ZW5zaW9uKQotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CiAgICAgfQogCi0gICAgdjg6OlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbik7
CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIFY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9u
KHY4OjpFeHRlbnNpb24qIGV4dGVuc2lvbiwgY29uc3QgU3RyaW5nJiBzY2hlbWVSZXN0cmljdGlv
bikKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5oCShyZXZpc2lvbiA0ODM4OCkKKysrIFdlYkNvcmUv
YmluZGluZ3MvdjgvVjhQcm94eS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zODEsNiArMzgxLDcgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gY3JlYXRl
V3JhcHBlckZyb21DYWNoZVNsb3dDYXNlKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSk7CiAK
ICAgICAgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJFeHRlbnNpb25XaXRoVjgodjg6OkV4dGVuc2lv
biopOworICAgICAgICBzdGF0aWMgYm9vbCByZWdpc3RlcmVkRXh0ZW5zaW9uV2l0aFY4KHY4OjpF
eHRlbnNpb24qKTsKIAogICAgICAgICBGcmFtZSogbV9mcmFtZTsKIApJbmRleDogTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNp
b24gNDgzODgpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxOCBAQAorMjAwOS0wOS0xNSAgSm9obiBBYmQtRWwtTWFsZWsgIDxqYW1AY2hyb21pdW0u
b3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBy
ZXZlbnQgc2xlZXBzIGluIHVubG9hZCBoYW5kbGVycy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MTkzCisKKyAgICAgICAgKiBmYXN0L2RvbS9XaW5k
b3cvcmVzb3VyY2VzL3Nsb3dfdW5sb2FkX2hhbmRsZXIxLmh0bWw6IEFkZGVkLgorICAgICAgICAq
IGZhc3QvZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLWV4cGVjdGVkLnR4dDogQWRkZWQu
CisgICAgICAgICogZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXIuaHRtbDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3RrL1NraXBwZWQ6CisgICAgICAgICogcGxhdGZvcm0v
bWFjL1NraXBwZWQ6CisgICAgICAgICogcGxhdGZvcm0vcXQvU2tpcHBlZDoKKyAgICAgICAgKiBw
bGF0Zm9ybS93aW4vU2tpcHBlZDoKKwogMjAwOS0wOS0xNCAgQnJhZHkgRWlkc29uICA8YmVpZHNv
bkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci1leHBlY3RlZC50
eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2Fk
X2hhbmRsZXItZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9k
b20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXItZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDYgQEAKK2ZyYW1lICJ0aGVpZnJhbWUiIC0gaGFzIDEgb251bmxvYWQgaGFuZGxl
cihzKQorVGhpcyBpcyBhIHRlc3QgZm9yIGJ1ZyAyOTE5MzogTmVlZCB0byBwcmV2ZW50IEphdmFz
Y3JpcHQgc2xlZXBzIGluIHVubG9hZCBoYW5kbGVycy4gSWYgc3VjY2Vzc2Z1bCwgUEFTUyBzaG91
bGQgYmUgcHJpbnRlZCBiZWxvdy4KKworUEFTUworCisKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qv
ZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXIuaHRtbAkocmV2aXNpb24g
MCkKKysrIExheW91dFRlc3RzL2Zhc3QvZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0
bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzQgQEAKKzxodG1sPgorPGhlYWQ+Cis8bGluayBy
ZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXN0eWxlLmNz
cyI+Cis8c2NyaXB0PgorCitpZiAobGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICBsYXlvdXRU
ZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7CisgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIu
ZHVtcEFzVGV4dCgpOworfQorCitmdW5jdGlvbiBkb25lKCkKK3sKKyAgICBpZiAoZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoInJlc3VsdHMiKS5pbm5lckhUTUwgPT0gIiIpCisgICAgICAgIGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJyZXN1bHRzIikuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRl
VGV4dE5vZGUoIlBBU1MiKSk7CisgICAgaWYgKGxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAg
ICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9CisKK2Z1bmN0aW9uIGxvYWRl
ZCgpIHsKKyAgICBzZXRUaW1lb3V0KCJkb25lKCkiLCAwKTsKKyAgICBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgidGhlaWZyYW1lIikub3V0ZXJIVE1MPScnOworfQorCis8L3NjcmlwdD4KKzwvaGVh
ZD4KKzxib2R5IG9ubG9hZD0ic2V0VGltZW91dCgnbG9hZGVkKCk7JywgMCkiPgorPHA+CisgICAg
VGhpcyBpcyBhIHRlc3QgZm9yIDxhIGhyZWY9Imh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yOTE5MyI+YnVnIDI5MTkzPC9hPjoKKyAgICA8aT5OZWVkIHRvIHByZXZlbnQg
SmF2YXNjcmlwdCBzbGVlcHMgaW4gdW5sb2FkIGhhbmRsZXJzLjwvaT4gSWYgc3VjY2Vzc2Z1bCwg
UEFTUyBzaG91bGQgYmUgcHJpbnRlZCBiZWxvdy4KKzwvcD4KKzxwIGlkPSJyZXN1bHRzIiBjbGFz
cz0icGFzcyI+PC9wPgorPGlmcmFtZSBpZD0idGhlaWZyYW1lIiBzdHlsZT0iYm9yZGVyOiAwIiBz
cmM9InJlc291cmNlcy9zbG93X3VubG9hZF9oYW5kbGVyMS5odG1sIj4KKzwvYm9keT4KKzwvaHRt
bD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2Rv
bS9XaW5kb3cvcmVzb3VyY2VzL3Nsb3dfdW5sb2FkX2hhbmRsZXIxLmh0bWwKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Jlc291cmNlcy9zbG93X3VubG9hZF9oYW5k
bGVyMS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Jl
c291cmNlcy9zbG93X3VubG9hZF9oYW5kbGVyMS5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDE4IEBACis8aHRtbD4KKzxzY3JpcHQ+CitmdW5jdGlvbiBwYXVzZShtaWxsaXNlY29uZHMpIHsK
KyAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsKKyAgICB2YXIgZXhpdFRpbWUgPSBub3cuZ2V0VGlt
ZSgpICsgbWlsbGlzZWNvbmRzOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIG5vdyA9IG5l
dyBEYXRlKCk7CisgICAgICAgIGlmIChub3cuZ2V0VGltZSgpID4gZXhpdFRpbWUpCisgICAgICAg
ICAgICBicmVhazsKKyAgICB9CisgICAgcGFyZW50LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJy
ZXN1bHRzIikuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIkZBSUwiKSk7Cisg
ICAgaWYgKGxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxl
ci5ub3RpZnlEb25lKCk7Cit9Cis8L3NjcmlwdD4KKzxib2R5IG9udW5sb2FkPSJwYXVzZSgxMDAw
MCk7Ij4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCkluZGV4
OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZAkocmV2aXNpb24gNDgzODgpCisrKyBMYXlvdXRUZXN0
cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZAkod29ya2luZyBjb3B5KQpAQCAtNTcyNywzICs1NzI3LDYg
QEAgaHR0cC90ZXN0cy94bWxodHRwcmVxdWVzdC93b3JrZXJzL3NoYXJlZAogCiAjIE5vIGF1dGhl
bnRpY2F0aW9uIGNoYWxsZW5nZSBoYW5kbGluZwogaHR0cC90ZXN0cy9sb2FkaW5nL2Jhc2ljLWNy
ZWRlbnRpYWxzLXNlbnQtYXV0b21hdGljYWxseS5odG1sCisKKyMgVGhpcyBwb3J0IGRvZXNuJ3Qg
c3VwcG9ydCBkZXRlY3Rpbmcgc2xvdyB1bmxvYWQgaGFuZGxlcnMuCitmYXN0L2RvbS9XaW5kb3cv
c2xvd191bmxvYWRfaGFuZGxlci5odG1sCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMv
U2tpcHBlZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvU2tpcHBlZAko
cmV2aXNpb24gNDgzODgpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvU2tpcHBlZAkod29y
a2luZyBjb3B5KQpAQCAtMTA2LDMgKzEwNiw1IEBAIG1lZGlhL3ZpZGVvLWNvbnRyb2xzLXpvb21l
ZC5odG1sCiAjIDxyZGFyOi8vcHJvYmxlbS83MTk2NDg1PiBhbmQgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDIxCiBmYXN0L2xvYWRlci9mcmFtZXMtd2l0aC11bmxv
YWQtaGFuZGxlcnMtaW4tcGFnZS1jYWNoZS5odG1sCiAKKyMgVGhpcyBwb3J0IGRvZXNuJ3Qgc3Vw
cG9ydCBkZXRlY3Rpbmcgc2xvdyB1bmxvYWQgaGFuZGxlcnMuCitmYXN0L2RvbS9XaW5kb3cvc2xv
d191bmxvYWRfaGFuZGxlci5odG1sCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lw
cGVkCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL3F0L1NraXBwZWQJKHJldmlz
aW9uIDQ4Mzg4KQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQvU2tpcHBlZAkod29ya2luZyBj
b3B5KQpAQCAtNDg0MSwzICs0ODQxLDYgQEAgdXNlcnNjcmlwdHMKIAogIyBObyBhdXRoZW50aWNh
dGlvbiBjaGFsbGVuZ2UgaGFuZGxpbmcKIGh0dHAvdGVzdHMvbG9hZGluZy9iYXNpYy1jcmVkZW50
aWFscy1zZW50LWF1dG9tYXRpY2FsbHkuaHRtbAorCisjIFRoaXMgcG9ydCBkb2Vzbid0IHN1cHBv
cnQgZGV0ZWN0aW5nIHNsb3cgdW5sb2FkIGhhbmRsZXJzLgorZmFzdC9kb20vV2luZG93L3Nsb3df
dW5sb2FkX2hhbmRsZXIuaHRtbApJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL1NraXBw
ZWQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL1NraXBwZWQJKHJldmlz
aW9uIDQ4Mzg4KQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL1NraXBwZWQJKHdvcmtpbmcg
Y29weSkKQEAgLTY2NSwzICs2NjUsNiBAQCBodHRwL3Rlc3RzL3NlY3VyaXR5L21peGVkQ29udGVu
dAogIyBBcyBsb25nIGFzIHBhZ2VzIHdpdGggdW5sb2FkIGhhbmRsZXJzIGFyZSBwdXQgaW4gdGhl
IFBhZ2UgQ2FjaGUsIHRoaXMgdGVzdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlIGZvciBXaW5kb3dz
LgogIyA8cmRhcjovL3Byb2JsZW0vNzE5NjQ4NT4gYW5kIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0yOTAyMQogZmFzdC9sb2FkZXIvZnJhbWVzLXdpdGgtdW5sb2FkLWhh
bmRsZXJzLWluLXBhZ2UtY2FjaGUuaHRtbAorCisjIFRoaXMgcG9ydCBkb2Vzbid0IHN1cHBvcnQg
ZGV0ZWN0aW5nIHNsb3cgdW5sb2FkIGhhbmRsZXJzLgorZmFzdC9kb20vV2luZG93L3Nsb3dfdW5s
b2FkX2hhbmRsZXIuaHRtbAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>39876</attachid>
            <date>2009-09-21 14:26:40 -0700</date>
            <delta_ts>2009-09-21 16:33:16 -0700</delta_ts>
            <desc>Might as well update V8Proxy to not use STL now since I&apos;m touching that code</desc>
            <filename>nosleep4.txt</filename>
            <type>text/plain</type>
            <size>22771</size>
            <attacher name="John Abd-El-Malek">jam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0ODM4OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMDktMDktMTUgIEpvaG4gQWJkLUVsLU1hbGVrICA8amFtQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBQcmV2ZW50IHNsZWVwcyBpbiB1bmxvYWQgaGFuZGxlcnMuCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTE5MworCisgICAgICAgIFRlc3Q6IGZhc3Qv
ZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5zaW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OkRhdGVFeHRlbnNpb246OmdldCk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0
ZW5zaW9uOjpzZXRBbGxvd1NsZWVwKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246
OkdldE5hdGl2ZUZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGVFeHRlbnNpb246Ondl
YWtDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9uOjpHaXZlRW5hYmxl
U2xlZXBEZXRlY3Rpb25GdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpEYXRlRXh0ZW5zaW9u
OjpPblNsZWVwRGV0ZWN0ZWQpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2
ZW50SGFuZGxlcik6CisgICAgICAgICogYmluZGluZ3MvdjgvVjhQcm94eS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpWOFByb3h5OjpjcmVhdGVOZXdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uV2l0aFY4KToKKyAgICAgICAgKFdlYkNvcmU6OlY4
UHJveHk6OnJlZ2lzdGVyZWRFeHRlbnNpb25XaXRoVjgpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L1Y4UHJveHkuaDoKKwogMjAwOS0wOS0xNCAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL1dl
YkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24g
NDgzODgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNjkwLDYg
KzY5MCw4IEBACiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WE1MU2VyaWFsaXpl
ckNvbnN0cnVjdG9yLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4WFBh
dGhFdmFsdWF0b3JDb25zdHJ1Y3Rvci5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOFhTTFRQcm9jZXNzb3JDdXN0b20uY3BwJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92
OC9EYXRlRXh0ZW5zaW9uLmNwcCcsCisgICAgICAgICAgICAnYmluZGluZ3MvdjgvRGF0ZUV4dGVu
c2lvbi5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9ET01EYXRhLmNwcCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3MvdjgvRE9NRGF0YS5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9E
T01EYXRhU3RvcmUuY3BwJywKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5zaW9uLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRGF0ZUV4dGVuc2lvbi5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRhdGVFeHRlbnNpb24uaCIKKworI2luY2x1ZGUgIlY4UHJveHkuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitEYXRlRXh0ZW5zaW9uKiBEYXRlRXh0ZW5zaW9uOjpleHRlbnNpb247
CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkYXRlRXh0ZW5zaW9uTmFtZSA9ICJ2OC9EYXRlRXh0ZW5z
aW9uIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBkYXRlRXh0ZW5zaW9uU2NyaXB0ID0KKyAgICAiKGZ1
bmN0aW9uICgpIHsiCisgICAgIiAgdmFyIGNvdW50ZXI7IgorICAgICIgIHZhciBvcmlnX2dldFRp
bWU7IgorICAgICIgIGZ1bmN0aW9uIGdldFRpbWVPdmVycmlkZSgpIHsiCisgICAgIiAgICBpZiAo
Kytjb3VudGVyID4gMTAwMCkiCisgICAgIiAgICAgIE9uU2xlZXBEZXRlY3RlZCgpOyIKKyAgICAi
ICAgIHJldHVybiBvcmlnX2dldFRpbWUuY2FsbCh0aGlzKTsiCisgICAgIiAgfTsiCisgICAgIiAg
ZnVuY3Rpb24gZW5hYmxlU2xlZXBEZXRlY3Rpb24oZW5hYmxlKSB7IgorICAgICIgICAgaWYgKGVu
YWJsZSkgeyIKKyAgICAiICAgICAgY291bnRlciA9IDA7IgorICAgICIgICAgICBvcmlnX2dldFRp
bWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lOyIKKyAgICAiICAgICAgRGF0ZS5wcm90b3R5cGUu
Z2V0VGltZSA9IGdldFRpbWVPdmVycmlkZTsiCisgICAgIiAgICB9IGVsc2UgeyIKKyAgICAiICAg
ICAgRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSA9IG9yaWdfZ2V0VGltZTsiCisgICAgIiAgICB9Igor
ICAgICIgIH07IgorICAgICIgIG5hdGl2ZSBmdW5jdGlvbiBPblNsZWVwRGV0ZWN0ZWQoKTsiCisg
ICAgIiAgbmF0aXZlIGZ1bmN0aW9uIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKCk7
IgorICAgICIgIEdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uKGVuYWJsZVNsZWVwRGV0
ZWN0aW9uKTsiCisgICAgIn0pKCkiOworCitEYXRlRXh0ZW5zaW9uOjpEYXRlRXh0ZW5zaW9uKCkg
OiB2ODo6RXh0ZW5zaW9uKGRhdGVFeHRlbnNpb25OYW1lLCBkYXRlRXh0ZW5zaW9uU2NyaXB0KQor
eworfQorCitEYXRlRXh0ZW5zaW9uKiBEYXRlRXh0ZW5zaW9uOjpnZXQoKQoreworICAgIGlmICgh
ZXh0ZW5zaW9uKQorICAgICAgICBleHRlbnNpb24gPSBuZXcgRGF0ZUV4dGVuc2lvbigpOworICAg
IHJldHVybiBleHRlbnNpb247Cit9CisKK3ZvaWQgRGF0ZUV4dGVuc2lvbjo6c2V0QWxsb3dTbGVl
cChib29sIGFsbG93KQoreworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2WzFdOworICAg
IGFyZ3ZbMF0gPSB2ODo6U3RyaW5nOjpOZXcoYWxsb3cgPyAiZmFsc2UiIDogInRydWUiKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9u
UG9pbnRlcnMuc2l6ZSgpOyArK2kpCisgICAgICAgIGNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1
bmN0aW9uUG9pbnRlcnNbaV0tPkNhbGwodjg6Ok9iamVjdDo6TmV3KCksIDEsIGFyZ3YpOworfQor
Cit2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBEYXRlRXh0ZW5zaW9uOjpHZXROYXRp
dmVGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IG5hbWUpCit7CisgICAgaWYgKG5hbWUt
PkVxdWFscyh2ODo6U3RyaW5nOjpOZXcoIkdpdmVFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9u
IikpKQorICAgICAgICByZXR1cm4gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhHaXZlRW5hYmxl
U2xlZXBEZXRlY3Rpb25GdW5jdGlvbik7CisgICAgaWYgKG5hbWUtPkVxdWFscyh2ODo6U3RyaW5n
OjpOZXcoIk9uU2xlZXBEZXRlY3RlZCIpKSkKKyAgICAgICAgcmV0dXJuIHY4OjpGdW5jdGlvblRl
bXBsYXRlOjpOZXcoT25TbGVlcERldGVjdGVkKTsKKworICAgIHJldHVybiB2ODo6SGFuZGxlPHY4
OjpGdW5jdGlvblRlbXBsYXRlPigpOworfQorCit2b2lkIERhdGVFeHRlbnNpb246OndlYWtDYWxs
YmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IG9iamVjdCwgdm9pZCogcGFyYW0pCit7Cisg
ICAgRGF0ZUV4dGVuc2lvbiogZXh0ZW5zaW9uID0gZ2V0KCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1bmN0aW9uUG9pbnRl
cnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGV4dGVuc2lvbi0+Y2FsbEVuYWJsZVNsZWVw
RGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVyc1tpXSA9PSBvYmplY3QpIHsKKyAgICAgICAgICAgIG9i
amVjdC5EaXNwb3NlKCk7CisgICAgICAgICAgICBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERl
dGVjdGlvbkZ1bmN0aW9uUG9pbnRlcnMucmVtb3ZlKGkpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gRGF0ZUV4dGVuc2lvbjo6R2l2ZUVuYWJsZVNsZWVwRGV0ZWN0aW9uRnVu
Y3Rpb24oY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgo
KSAhPSAxIHx8ICFhcmdzWzBdLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiB2ODo6VW5k
ZWZpbmVkKCk7CisKKyAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBnZXQgdGhlIEZyYW1lKiBoZXJl
IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZnVuY3Rpb24gcG9pbnRlciwgc28gdGhhdAorICAg
IC8vIGVhY2ggdGltZSB3ZSBnbyBpbnRvIGFuIHVubG9hZCBoYW5kbGVyIHdlIGp1c3QgY2FsbCB0
aGF0IGZyYW1lJ3MgZnVuY3Rpb24uICBIb3dldmVyIHRoZXJlJ3MKKyAgICAvLyBubyB3YXkgdG8g
Z2V0IHRoZSBGcmFtZSogYXQgdGhpcyBwb2ludCwgc28gd2UganVzdCBzdG9yZSBhbGwgdGhlIGZ1
bmN0aW9uIHBvaW50ZXJzIGFuZCBjYWxsCisgICAgLy8gdGhlbSBhbGwgZWFjaCB0aW1lLgorICAg
IERhdGVFeHRlbnNpb24qIGV4dGVuc2lvbiA9IGdldCgpOworICAgIGV4dGVuc2lvbi0+Y2FsbEVu
YWJsZVNsZWVwRGV0ZWN0aW9uRnVuY3Rpb25Qb2ludGVycy5hcHBlbmQoCisgICAgICAgIHY4OjpQ
ZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj46Ok5ldyh2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNh
c3QoYXJnc1swXSkpKTsKKyAgICBleHRlbnNpb24tPmNhbGxFbmFibGVTbGVlcERldGVjdGlvbkZ1
bmN0aW9uUG9pbnRlcnMubGFzdCgpLk1ha2VXZWFrKE5VTEwsIHdlYWtDYWxsYmFjayk7CisgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IERhdGVF
eHRlbnNpb246Ok9uU2xlZXBEZXRlY3RlZChjb25zdCB2ODo6QXJndW1lbnRzJikKK3sKKyAgICAv
LyBBZnRlciB3ZSBjYWxsIFRlcm1pbmF0ZUV4ZWN1dGlvbigpLCB3ZSBjYW4ndCBjYWxsIGJhY2sg
aW50byBKYXZhU2NyaXB0IGFnYWluLCBzbworICAgIC8vIHJlc2V0IGFsbCB0aGUgb3RoZXIgZnJh
bWVzIGZpcnN0LgorICAgIGdldCgpLT5zZXRBbGxvd1NsZWVwKHRydWUpOworCisgICAgdjg6OlY4
OjpUZXJtaW5hdGVFeGVjdXRpb24oKTsKKyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQor
Cit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRl
RXh0ZW5zaW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9EYXRlRXh0ZW5z
aW9uLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RhdGVFeHRlbnNpb24u
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRGF0ZUV4dGVuc2lvbl9o
CisjZGVmaW5lIERhdGVFeHRlbnNpb25faAorCisjaW5jbHVkZSA8djguaD4KKworI2luY2x1ZGUg
IlZlY3Rvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFByZXZlbnQgInNsZWVwIiBj
YWxscyBpbiB1bmxvYWQgaGFuZGxlcnMuCitjbGFzcyBEYXRlRXh0ZW5zaW9uIDogcHVibGljIHY4
OjpFeHRlbnNpb24geworcHVibGljOgorICAgIHN0YXRpYyBEYXRlRXh0ZW5zaW9uKiBnZXQoKTsK
KyAgICB2b2lkIHNldEFsbG93U2xlZXAoYm9vbCBhbGxvdyk7CisKK3ByaXZhdGU6CisgICAgRGF0
ZUV4dGVuc2lvbigpOworICAgIHZpcnR1YWwgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0
ZT4gR2V0TmF0aXZlRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6U3RyaW5nPik7CisgICAgc3RhdGlj
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBHaXZlRW5hYmxlU2xlZXBEZXRlY3Rpb25GdW5jdGlvbihj
b25zdCB2ODo6QXJndW1lbnRzJik7CisgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBP
blNsZWVwRGV0ZWN0ZWQoY29uc3Qgdjg6OkFyZ3VtZW50cyYpOworICAgIHN0YXRpYyB2b2lkIHdl
YWtDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IG9iamVjdCwgdm9pZCogcGFyYW0p
OworCisgICAgdHlwZWRlZiBXVEY6OlZlY3Rvcjx2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+
ID4gRnVuY3Rpb25Qb2ludGVyczsKKyAgICBGdW5jdGlvblBvaW50ZXJzIGNhbGxFbmFibGVTbGVl
cERldGVjdGlvbkZ1bmN0aW9uUG9pbnRlcnM7CisKKyAgICBzdGF0aWMgRGF0ZUV4dGVuc2lvbiog
ZXh0ZW5zaW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIERh
dGVFeHRlbnNpb25faApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRM
aXN0ZW5lci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9WOEFic3RyYWN0
RXZlbnRMaXN0ZW5lci5jcHAJKHJldmlzaW9uIDQ4Mzg4KQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMx
LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJWOEFic3RyYWN0RXZlbnRMaXN0
ZW5lci5oIgogCisjaW5jbHVkZSAiRGF0ZUV4dGVuc2lvbi5oIgogI2luY2x1ZGUgIkRvY3VtZW50
LmgiCiAjaW5jbHVkZSAiRXZlbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgpAQCAtNjcsNiArNjgs
MTAgQEAgdm9pZCBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6aW52b2tlRXZlbgogICAgIHY4OjpM
b2NhbDx2ODo6U3RyaW5nPiBldmVudFN5bWJvbCA9IHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiZXZl
bnQiKTsKICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXR1cm5WYWx1ZTsKIAorICAgIC8vIElu
IGJlZm9yZXVubG9hZC91bmxvYWQgaGFuZGxlcnMsIHdlIHdhbnQgdG8gYXZvaWQgc2xlZXBzIHdo
aWNoIGRvIHRpZ2h0IGxvb3BzIG9mIGNhbGxpbmcgRGF0ZS5nZXRUaW1lKCkuCisgICAgaWYgKGV2
ZW50LT50eXBlKCkgPT0gImJlZm9yZXVubG9hZCIgfHwgZXZlbnQtPnR5cGUoKSA9PSAidW5sb2Fk
IikKKyAgICAgICAgRGF0ZUV4dGVuc2lvbjo6Z2V0KCktPnNldEFsbG93U2xlZXAoZmFsc2UpOwor
CiAgICAgewogICAgICAgICAvLyBDYXRjaCBleGNlcHRpb25zIHRocm93biBpbiB0aGUgZXZlbnQg
aGFuZGxlciBzbyB0aGV5IGRvIG5vdCBwcm9wYWdhdGUgdG8gamF2YXNjcmlwdCBjb2RlIHRoYXQg
Y2F1c2VkIHRoZSBldmVudCB0byBmaXJlLgogICAgICAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7
CkBAIC04Miw2ICs4Nyw5IEBAIHZvaWQgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omludm9rZUV2
ZW4KIAogICAgICAgICAvLyBDYWxsIHRoZSBldmVudCBoYW5kbGVyLgogICAgICAgICByZXR1cm5W
YWx1ZSA9IGNhbGxMaXN0ZW5lckZ1bmN0aW9uKGpzRXZlbnQsIGV2ZW50LCBpc1dpbmRvd0V2ZW50
KTsKKyAgICAgICAgaWYgKCF0cnlDYXRjaC5DYW5Db250aW51ZSgpKQorICAgICAgICAgICAgcmV0
dXJuOworCiAgICAgICAgIHRyeUNhdGNoLlJlc2V0KCk7CiAKICAgICAgICAgLy8gUmVzdG9yZSB0
aGUgb2xkIGV2ZW50LiBUaGlzIG11c3QgYmUgZG9uZSBmb3IgYWxsIGV4aXQgcGF0aHMgdGhyb3Vn
aCB0aGlzIG1ldGhvZC4KQEAgLTkyLDYgKzEwMCw5IEBAIHZvaWQgVjhBYnN0cmFjdEV2ZW50TGlz
dGVuZXI6Omludm9rZUV2ZW4KICAgICAgICAgdHJ5Q2F0Y2guUmVzZXQoKTsKICAgICB9CiAKKyAg
ICBpZiAoZXZlbnQtPnR5cGUoKSA9PSAiYmVmb3JldW5sb2FkIiB8fCBldmVudC0+dHlwZSgpID09
ICJ1bmxvYWQiKQorICAgICAgICBEYXRlRXh0ZW5zaW9uOjpnZXQoKS0+c2V0QWxsb3dTbGVlcCh0
cnVlKTsKKwogICAgIEFTU0VSVCghVjhQcm94eTo6aGFuZGxlT3V0T2ZNZW1vcnkoKSB8fCByZXR1
cm5WYWx1ZS5Jc0VtcHR5KCkpOwogCiAgICAgaWYgKHJldHVyblZhbHVlLklzRW1wdHkoKSkKSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOFByb3h5LmNwcAkocmV2aXNpb24gNDgzODgpCisrKyBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1Y4UHJveHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAK
ICNpbmNsdWRlICJDaHJvbWl1bUJyaWRnZS5oIgogI2luY2x1ZGUgIkNTU011dGFibGVTdHlsZURl
Y2xhcmF0aW9uLmgiCisjaW5jbHVkZSAiRGF0ZUV4dGVuc2lvbi5oIgogI2luY2x1ZGUgIkRPTU9i
amVjdHNJbmNsdWRlLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKICNpbmNsdWRlICJG
cmFtZUxvYWRlckNsaWVudC5oIgpAQCAtNjQsNyArNjUsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gVjhQcm94eTo6bV91dGlsaXR5Q29udGV4dDsK
IAogLy8gU3RhdGljIGxpc3Qgb2YgcmVnaXN0ZXJlZCBleHRlbnNpb25zCi1WOEV4dGVuc2lvbkxp
c3QgVjhQcm94eTo6bV9leHRlbnNpb25zOworVjhFeHRlbnNpb25zIFY4UHJveHk6Om1fZXh0ZW5z
aW9uczsKIAogY29uc3QgY2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFUeXBlID0gInR5
cGUiOwogY29uc3QgY2hhciogVjhQcm94eTo6a0NvbnRleHREZWJ1Z0RhdGFWYWx1ZSA9ICJ2YWx1
ZSI7CkBAIC05MDQsMjAgKzkwNSwyNCBAQCB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gVjhQ
cm94eTo6Y3JlCiAgICAgLy8gSW5zdGFsbCBhIHNlY3VyaXR5IGhhbmRsZXIgd2l0aCBWOC4KICAg
ICBnbG9iYWxUZW1wbGF0ZS0+U2V0QWNjZXNzQ2hlY2tDYWxsYmFja3MoVjhDdXN0b206OnY4RE9N
V2luZG93TmFtZWRTZWN1cml0eUNoZWNrLCBWOEN1c3RvbTo6djhET01XaW5kb3dJbmRleGVkU2Vj
dXJpdHlDaGVjaywgdjg6OkludGVnZXI6Ok5ldyhWOENsYXNzSW5kZXg6OkRPTVdJTkRPVykpOwog
CisgICAgLy8gVXNlZCB0byBhdm9pZCBzbGVlcCBjYWxscyBpbiB1bmxvYWQgaGFuZGxlcnMuCisg
ICAgaWYgKCFyZWdpc3RlcmVkRXh0ZW5zaW9uV2l0aFY4KERhdGVFeHRlbnNpb246OmdldCgpKSkK
KyAgICAgICAgcmVnaXN0ZXJFeHRlbnNpb24oRGF0ZUV4dGVuc2lvbjo6Z2V0KCksIFN0cmluZygp
KTsKKwogICAgIC8vIER5bmFtaWNhbGx5IHRlbGwgdjggYWJvdXQgb3VyIGV4dGVuc2lvbnMgbm93
LgogICAgIE93bkFycmF5UHRyPGNvbnN0IGNoYXIqPiBleHRlbnNpb25OYW1lcyhuZXcgY29uc3Qg
Y2hhcipbbV9leHRlbnNpb25zLnNpemUoKV0pOwogICAgIGludCBpbmRleCA9IDA7Ci0gICAgZm9y
IChWOEV4dGVuc2lvbkxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9leHRlbnNpb25zLmJlZ2luKCk7IGl0
ICE9IG1fZXh0ZW5zaW9ucy5lbmQoKTsgKytpdCkgewotICAgICAgICBpZiAoaXQtPmdyb3VwICYm
IGl0LT5ncm91cCAhPSBleHRlbnNpb25Hcm91cCkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG1fZXh0ZW5zaW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobV9leHRlbnNpb25zW2ld
Lmdyb3VwICYmIG1fZXh0ZW5zaW9uc1tpXS5ncm91cCAhPSBleHRlbnNpb25Hcm91cCkKICAgICAg
ICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIC8vIE5vdGU6IHdlIGNoZWNrIHRoZSBsb2FkZXIg
VVJMIGhlcmUgaW5zdGVhZCBvZiB0aGUgZG9jdW1lbnQgVVJMCiAgICAgICAgIC8vIGJlY2F1c2Ug
d2UgbWlnaHQgYmUgY3VycmVudGx5IGxvYWRpbmcgYW4gVVJMIGludG8gYSBibGFuayBwYWdlLgog
ICAgICAgICAvLyBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9k
ZXRhaWw/aWQ9MTA5MjQKLSAgICAgICAgaWYgKGl0LT5zY2hlbWUubGVuZ3RoKCkgPiAwICYmIChp
dC0+c2NoZW1lICE9IG1fZnJhbWUtPmxvYWRlcigpLT5hY3RpdmVEb2N1bWVudExvYWRlcigpLT51
cmwoKS5wcm90b2NvbCgpIHx8IGl0LT5zY2hlbWUgIT0gbV9mcmFtZS0+cGFnZSgpLT5tYWluRnJh
bWUoKS0+bG9hZGVyKCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCktPnVybCgpLnByb3RvY29sKCkp
KQorICAgICAgICBpZiAobV9leHRlbnNpb25zW2ldLnNjaGVtZS5sZW5ndGgoKSA+IDAgJiYgKG1f
ZXh0ZW5zaW9uc1tpXS5zY2hlbWUgIT0gbV9mcmFtZS0+bG9hZGVyKCktPmFjdGl2ZURvY3VtZW50
TG9hZGVyKCktPnVybCgpLnByb3RvY29sKCkgfHwgbV9leHRlbnNpb25zW2ldLnNjaGVtZSAhPSBt
X2ZyYW1lLT5wYWdlKCktPm1haW5GcmFtZSgpLT5sb2FkZXIoKS0+YWN0aXZlRG9jdW1lbnRMb2Fk
ZXIoKS0+dXJsKCkucHJvdG9jb2woKSkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAg
ICBleHRlbnNpb25OYW1lc1tpbmRleCsrXSA9IGl0LT5leHRlbnNpb24tPm5hbWUoKTsKKyAgICAg
ICAgZXh0ZW5zaW9uTmFtZXNbaW5kZXgrK10gPSBtX2V4dGVuc2lvbnNbaV0uZXh0ZW5zaW9uLT5u
YW1lKCk7CiAgICAgfQogICAgIHY4OjpFeHRlbnNpb25Db25maWd1cmF0aW9uIGV4dGVuc2lvbnMo
aW5kZXgsIGV4dGVuc2lvbk5hbWVzLmdldCgpKTsKICAgICByZXN1bHQgPSB2ODo6Q29udGV4dDo6
TmV3KCZleHRlbnNpb25zLCBnbG9iYWxUZW1wbGF0ZSwgZ2xvYmFsKTsKQEAgLTEyNTMsMjggKzEy
NTgsMzUgQEAgU3RyaW5nIFY4UHJveHk6OnNvdXJjZU5hbWUoKQogICAgIHJldHVybiB0b1dlYkNv
cmVTdHJpbmcodjg6OkRlYnVnOjpDYWxsKGZyYW1lU291cmNlTmFtZSkpOwogfQogCi12b2lkIFY4
UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uV2l0aFY4KHY4OjpFeHRlbnNpb24qIGV4dGVuc2lvbikg
ewordm9pZCBWOFByb3h5OjpyZWdpc3RlckV4dGVuc2lvbldpdGhWOCh2ODo6RXh0ZW5zaW9uKiBl
eHRlbnNpb24pCit7CiAgICAgLy8gSWYgdGhlIGV4dGVuc2lvbiBleGlzdHMgaW4gb3VyIGxpc3Qs
IGl0IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBWOC4KLSAgICBmb3IgKFY4RXh0ZW5zaW9u
TGlzdDo6aXRlcmF0b3IgaXQgPSBtX2V4dGVuc2lvbnMuYmVnaW4oKTsgaXQgIT0gbV9leHRlbnNp
b25zLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmIChpdC0+ZXh0ZW5zaW9uID09IGV4dGVuc2lv
bikKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBpZiAoIXJlZ2lzdGVyZWRFeHRlbnNpb25XaXRo
VjgoZXh0ZW5zaW9uKSkKKyAgICAgICAgdjg6OlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbik7
Cit9CisKK2Jvb2wgVjhQcm94eTo6cmVnaXN0ZXJlZEV4dGVuc2lvbldpdGhWOCh2ODo6RXh0ZW5z
aW9uKiBleHRlbnNpb24pCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2V4dGVuc2lv
bnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1fZXh0ZW5zaW9uc1tpXS5leHRlbnNpb24g
PT0gZXh0ZW5zaW9uKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdjg6
OlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbik7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2
b2lkIFY4UHJveHk6OnJlZ2lzdGVyRXh0ZW5zaW9uKHY4OjpFeHRlbnNpb24qIGV4dGVuc2lvbiwg
Y29uc3QgU3RyaW5nJiBzY2hlbWVSZXN0cmljdGlvbikKIHsKICAgICByZWdpc3RlckV4dGVuc2lv
bldpdGhWOChleHRlbnNpb24pOwogICAgIFY4RXh0ZW5zaW9uSW5mbyBpbmZvID0ge3NjaGVtZVJl
c3RyaWN0aW9uLCAwLCBleHRlbnNpb259OwotICAgIG1fZXh0ZW5zaW9ucy5wdXNoX2JhY2soaW5m
byk7CisgICAgbV9leHRlbnNpb25zLmFwcGVuZChpbmZvKTsKIH0KIAogdm9pZCBWOFByb3h5Ojpy
ZWdpc3RlckV4dGVuc2lvbih2ODo6RXh0ZW5zaW9uKiBleHRlbnNpb24sIGludCBleHRlbnNpb25H
cm91cCkKIHsKICAgICByZWdpc3RlckV4dGVuc2lvbldpdGhWOChleHRlbnNpb24pOwogICAgIFY4
RXh0ZW5zaW9uSW5mbyBpbmZvID0ge1N0cmluZygpLCBleHRlbnNpb25Hcm91cCwgZXh0ZW5zaW9u
fTsKLSAgICBtX2V4dGVuc2lvbnMucHVzaF9iYWNrKGluZm8pOworICAgIG1fZXh0ZW5zaW9ucy5h
cHBlbmQoaW5mbyk7CiB9CiAKIGJvb2wgVjhQcm94eTo6c2V0Q29udGV4dERlYnVnSWQoaW50IGRl
YnVnSWQpCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuaAkocmV2aXNpb24gNDgzODgpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1Y4UHJveHkuaAkod29ya2luZyBjb3B5KQpAQCAtMzksNyArMzksNiBA
QAogI2luY2x1ZGUgIlY4RXZlbnRMaXN0ZW5lckxpc3QuaCIKICNpbmNsdWRlICJWOEdDQ29udHJv
bGxlci5oIgogI2luY2x1ZGUgIlY4SW5kZXguaCIKLSNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUg
PHY4Lmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4gLy8gc28gZ2VuZXJhdGVkIGJpbmRp
bmdzIGRvbid0IGhhdmUgdG8KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CkBAIC0xMDUsNyArMTA0
LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBpbnQgZ3JvdXA7CiAgICAgICAgIHY4
OjpFeHRlbnNpb24qIGV4dGVuc2lvbjsKICAgICB9OwotICAgIHR5cGVkZWYgc3RkOjpsaXN0PFY4
RXh0ZW5zaW9uSW5mbz4gVjhFeHRlbnNpb25MaXN0OworICAgIHR5cGVkZWYgV1RGOjpWZWN0b3I8
VjhFeHRlbnNpb25JbmZvPiBWOEV4dGVuc2lvbnM7CiAKICAgICBjbGFzcyBWOFByb3h5IHsKICAg
ICBwdWJsaWM6CkBAIC0zODEsNiArMzgwLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAg
ICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gY3JlYXRlV3JhcHBlckZyb21DYWNoZVNsb3dDYXNlKFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSk7CiAKICAgICAgICAgc3RhdGljIHZvaWQgcmVnaXN0
ZXJFeHRlbnNpb25XaXRoVjgodjg6OkV4dGVuc2lvbiopOworICAgICAgICBzdGF0aWMgYm9vbCBy
ZWdpc3RlcmVkRXh0ZW5zaW9uV2l0aFY4KHY4OjpFeHRlbnNpb24qKTsKIAogICAgICAgICBGcmFt
ZSogbV9mcmFtZTsKIApAQCAtNDIxLDggKzQyMSw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgLy8gZXhjZXNzaXZlIHJlY3Vyc2lvbiBpbiB0aGUgYmluZGluZyBsYXllci4KICAgICAg
ICAgaW50IG1fcmVjdXJzaW9uOwogCi0gICAgICAgIC8vIExpc3Qgb2YgZXh0ZW5zaW9ucyByZWdp
c3RlcmVkIHdpdGggdGhlIGNvbnRleHQuCi0gICAgICAgIHN0YXRpYyBWOEV4dGVuc2lvbkxpc3Qg
bV9leHRlbnNpb25zOworICAgICAgICAvLyBBbGwgb2YgdGhlIGV4dGVuc2lvbnMgcmVnaXN0ZXJl
ZCB3aXRoIHRoZSBjb250ZXh0LgorICAgICAgICBzdGF0aWMgVjhFeHRlbnNpb25zIG1fZXh0ZW5z
aW9uczsKICAgICB9OwogCiAgICAgdGVtcGxhdGUgPGludCB0YWcsIHR5cGVuYW1lIFQ+CkluZGV4
OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCShyZXZpc2lvbiA0ODM4OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBj
b3B5KQpAQCAtMSwzICsxLDE4IEBACisyMDA5LTA5LTE1ICBKb2huIEFiZC1FbC1NYWxlayAgPGph
bUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgUHJldmVudCBzbGVlcHMgaW4gdW5sb2FkIGhhbmRsZXJzLgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkxOTMKKworICAgICAgICAqIGZh
c3QvZG9tL1dpbmRvdy9yZXNvdXJjZXMvc2xvd191bmxvYWRfaGFuZGxlcjEuaHRtbDogQWRkZWQu
CisgICAgICAgICogZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXItZXhwZWN0ZWQu
dHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxl
ci5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2tpcHBlZDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9tYWMvU2tpcHBlZDoKKyAgICAgICAgKiBwbGF0Zm9ybS9xdC9Ta2lwcGVkOgor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9Ta2lwcGVkOgorCiAyMDA5LTA5LTE0ICBCcmFkeSBFaWRz
b24gIDxiZWlkc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxl
ci4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVy
LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cv
c2xvd191bmxvYWRfaGFuZGxlci1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRU
ZXN0cy9mYXN0L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci1leHBlY3RlZC50eHQJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNiBAQAorZnJhbWUgInRoZWlmcmFtZSIgLSBoYXMgMSBvbnVu
bG9hZCBoYW5kbGVyKHMpCitUaGlzIGlzIGEgdGVzdCBmb3IgYnVnIDI5MTkzOiBOZWVkIHRvIHBy
ZXZlbnQgSmF2YXNjcmlwdCBzbGVlcHMgaW4gdW5sb2FkIGhhbmRsZXJzLiBJZiBzdWNjZXNzZnVs
LCBQQVNTIHNob3VsZCBiZSBwcmludGVkIGJlbG93LgorCitQQVNTCisKKwpJbmRleDogTGF5b3V0
VGVzdHMvZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2FkX2hhbmRsZXIuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci5odG1s
CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vV2luZG93L3Nsb3dfdW5sb2Fk
X2hhbmRsZXIuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzNCBAQAorPGh0bWw+Cis8aGVh
ZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRl
c3Qtc3R5bGUuY3NzIj4KKzxzY3JpcHQ+CisKK2lmIChsYXlvdXRUZXN0Q29udHJvbGxlcikgewor
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7Cit9CisKK2Z1bmN0aW9uIGRvbmUoKQoreworICAgIGlm
IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzdWx0cyIpLmlubmVySFRNTCA9PSAiIikKKyAg
ICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdHMiKS5hcHBlbmRDaGlsZChkb2N1
bWVudC5jcmVhdGVUZXh0Tm9kZSgiUEFTUyIpKTsKKyAgICBpZiAobGF5b3V0VGVzdENvbnRyb2xs
ZXIpCisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKworZnVu
Y3Rpb24gbG9hZGVkKCkgeworICAgIHNldFRpbWVvdXQoImRvbmUoKSIsIDApOworICAgIGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJ0aGVpZnJhbWUiKS5vdXRlckhUTUw9Jyc7Cit9CisKKzwvc2Ny
aXB0PgorPC9oZWFkPgorPGJvZHkgb25sb2FkPSJzZXRUaW1lb3V0KCdsb2FkZWQoKTsnLCAwKSI+
Cis8cD4KKyAgICBUaGlzIGlzIGEgdGVzdCBmb3IgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MTkzIj5idWcgMjkxOTM8L2E+OgorICAgIDxpPk5lZWQg
dG8gcHJldmVudCBKYXZhc2NyaXB0IHNsZWVwcyBpbiB1bmxvYWQgaGFuZGxlcnMuPC9pPiBJZiBz
dWNjZXNzZnVsLCBQQVNTIHNob3VsZCBiZSBwcmludGVkIGJlbG93LgorPC9wPgorPHAgaWQ9InJl
c3VsdHMiIGNsYXNzPSJwYXNzIj48L3A+Cis8aWZyYW1lIGlkPSJ0aGVpZnJhbWUiIHN0eWxlPSJi
b3JkZXI6IDAiIHNyYz0icmVzb3VyY2VzL3Nsb3dfdW5sb2FkX2hhbmRsZXIxLmh0bWwiPgorPC9i
b2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IExheW91dFRl
c3RzL2Zhc3QvZG9tL1dpbmRvdy9yZXNvdXJjZXMvc2xvd191bmxvYWRfaGFuZGxlcjEuaHRtbAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2RvbS9XaW5kb3cvcmVzb3VyY2VzL3Nsb3df
dW5sb2FkX2hhbmRsZXIxLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2Rv
bS9XaW5kb3cvcmVzb3VyY2VzL3Nsb3dfdW5sb2FkX2hhbmRsZXIxLmh0bWwJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTggQEAKKzxodG1sPgorPHNjcmlwdD4KK2Z1bmN0aW9uIHBhdXNlKG1pbGxp
c2Vjb25kcykgeworICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpOworICAgIHZhciBleGl0VGltZSA9
IG5vdy5nZXRUaW1lKCkgKyBtaWxsaXNlY29uZHM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAg
ICAgbm93ID0gbmV3IERhdGUoKTsKKyAgICAgICAgaWYgKG5vdy5nZXRUaW1lKCkgPiBleGl0VGlt
ZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwYXJlbnQuZG9jdW1lbnQuZ2V0RWxl
bWVudEJ5SWQoInJlc3VsdHMiKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgi
RkFJTCIpKTsKKyAgICBpZiAobGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAgIGxheW91dFRl
c3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKK30KKzwvc2NyaXB0PgorPGJvZHkgb251bmxvYWQ9
InBhdXNlKDEwMDAwKTsiPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m
IGZpbGUKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIExheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCShyZXZpc2lvbiA0ODM4OCkKKysr
IExheW91dFRlc3RzL3BsYXRmb3JtL2d0ay9Ta2lwcGVkCSh3b3JraW5nIGNvcHkpCkBAIC01NzI3
LDMgKzU3MjcsNiBAQCBodHRwL3Rlc3RzL3htbGh0dHByZXF1ZXN0L3dvcmtlcnMvc2hhcmVkCiAK
ICMgTm8gYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIGhhbmRsaW5nCiBodHRwL3Rlc3RzL2xvYWRp
bmcvYmFzaWMtY3JlZGVudGlhbHMtc2VudC1hdXRvbWF0aWNhbGx5Lmh0bWwKKworIyBUaGlzIHBv
cnQgZG9lc24ndCBzdXBwb3J0IGRldGVjdGluZyBzbG93IHVubG9hZCBoYW5kbGVycy4KK2Zhc3Qv
ZG9tL1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKSW5kZXg6IExheW91dFRlc3RzL3Bs
YXRmb3JtL21hYy9Ta2lwcGVkCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL21h
Yy9Ta2lwcGVkCShyZXZpc2lvbiA0ODM4OCkKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9T
a2lwcGVkCSh3b3JraW5nIGNvcHkpCkBAIC0xMDYsMyArMTA2LDUgQEAgbWVkaWEvdmlkZW8tY29u
dHJvbHMtem9vbWVkLmh0bWwKICMgPHJkYXI6Ly9wcm9ibGVtLzcxOTY0ODU+IGFuZCBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwMjEKIGZhc3QvbG9hZGVyL2ZyYW1l
cy13aXRoLXVubG9hZC1oYW5kbGVycy1pbi1wYWdlLWNhY2hlLmh0bWwKIAorIyBUaGlzIHBvcnQg
ZG9lc24ndCBzdXBwb3J0IGRldGVjdGluZyBzbG93IHVubG9hZCBoYW5kbGVycy4KK2Zhc3QvZG9t
L1dpbmRvdy9zbG93X3VubG9hZF9oYW5kbGVyLmh0bWwKSW5kZXg6IExheW91dFRlc3RzL3BsYXRm
b3JtL3F0L1NraXBwZWQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vcXQvU2tp
cHBlZAkocmV2aXNpb24gNDgzODgpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVk
CSh3b3JraW5nIGNvcHkpCkBAIC00ODQxLDMgKzQ4NDEsNiBAQCB1c2Vyc2NyaXB0cwogCiAjIE5v
IGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSBoYW5kbGluZwogaHR0cC90ZXN0cy9sb2FkaW5nL2Jh
c2ljLWNyZWRlbnRpYWxzLXNlbnQtYXV0b21hdGljYWxseS5odG1sCisKKyMgVGhpcyBwb3J0IGRv
ZXNuJ3Qgc3VwcG9ydCBkZXRlY3Rpbmcgc2xvdyB1bmxvYWQgaGFuZGxlcnMuCitmYXN0L2RvbS9X
aW5kb3cvc2xvd191bmxvYWRfaGFuZGxlci5odG1sCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9y
bS93aW4vU2tpcHBlZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tp
cHBlZAkocmV2aXNpb24gNDgzODgpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vU2tpcHBl
ZAkod29ya2luZyBjb3B5KQpAQCAtNjY1LDMgKzY2NSw2IEBAIGh0dHAvdGVzdHMvc2VjdXJpdHkv
bWl4ZWRDb250ZW50CiAjIEFzIGxvbmcgYXMgcGFnZXMgd2l0aCB1bmxvYWQgaGFuZGxlcnMgYXJl
IHB1dCBpbiB0aGUgUGFnZSBDYWNoZSwgdGhpcyB0ZXN0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2Ug
Zm9yIFdpbmRvd3MuCiAjIDxyZGFyOi8vcHJvYmxlbS83MTk2NDg1PiBhbmQgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDIxCiBmYXN0L2xvYWRlci9mcmFtZXMtd2l0
aC11bmxvYWQtaGFuZGxlcnMtaW4tcGFnZS1jYWNoZS5odG1sCisKKyMgVGhpcyBwb3J0IGRvZXNu
J3Qgc3VwcG9ydCBkZXRlY3Rpbmcgc2xvdyB1bmxvYWQgaGFuZGxlcnMuCitmYXN0L2RvbS9XaW5k
b3cvc2xvd191bmxvYWRfaGFuZGxlci5odG1sCg==
</data>
<flag name="review"
          id="21019"
          type_id="1"
          status="+"
          setter="fishd"
    />
          </attachment>
      

    </bug>

</bugzilla>