<?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>54070</bug_id>
          
          <creation_ts>2011-02-08 23:24:41 -0800</creation_ts>
          <short_desc>nrwt multiprocessing: implement basic support for threads and processes</short_desc>
          <delta_ts>2011-02-13 02:19:54 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>54068</dependson>
          <blocked>49566</blocked>
    
    <blocked>54071</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Pranke">dpranke</reporter>
          <assigned_to name="Dirk Pranke">dpranke</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>mihaip</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>348005</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-08 23:24:41 -0800</bug_when>
    <thetext>nrwt multiprocessing: implement basic support for threads and processes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>348007</commentid>
    <comment_count>1</comment_count>
      <attachid>81758</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-08 23:30:49 -0800</bug_when>
    <thetext>Created attachment 81758
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349882</commentid>
    <comment_count>2</comment_count>
      <attachid>81758</attachid>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-02-11 11:39:57 -0800</bug_when>
    <thetext>Comment on attachment 81758
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=81758&amp;action=review

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:195
&gt; +        return _ThreadedWorker(self._broker, self._port)

There seems to be naming mismatch here (worker connection vs. worker). I realize that may be because connections are supposed to be facades, but perhaps we should reconsider the &quot;connection&quot; name? In the Chromium multi-process scheme, facades for an object in another process are known as *Host (e.g. RenderView and RenderViewHost). Perhaps we should use the same naming here?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker_unittest.py:122
&gt; +    # Methods to implement the Manager side of the ClientInterface

ClientInterface is now BrokerClient. Also, can you make _TestsMixin actually subclass BrokerClient, so that the relationship is more obvious?

Also, these header-style comments take up a bit too much room (not sure if we have a convention for them in webkitpy)

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker_unittest.py:201
&gt; +    def queue(self):

Is this (or the other queue() implementation below) necessary anymore? The queue class is now determined in based on the passed in worker model in manager_worker_broker.get.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349888</commentid>
    <comment_count>3</comment_count>
      <attachid>81758</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2011-02-11 11:49:11 -0800</bug_when>
    <thetext>Comment on attachment 81758
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=81758&amp;action=review

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:223
&gt; +    def start(self):
&gt; +        raise NotImplementedError

start() seems like a confusing name when there&apos;s also BrokerConneciton.run_message_loop().  What&apos;s the difference?  Also, how is it different from run()?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:252
&gt; +class _ThreadedWorker(threading.Thread, _WorkerConnection):
&gt; +    def __init__(self, broker, port):

This looks like multiple inheritance, no?  For example, both threading.Thread and _WorkerConnection seem to have a run() method.  This doesn&apos;t feel like a mixin to me . . .

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker_unittest.py:123
&gt; +    #
&gt; +    # Methods to implement the Manager side of the ClientInterface
&gt; +    #

These 3 line comments are weird.  They should be single line docstrings.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349943</commentid>
    <comment_count>4</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 12:56:35 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 81758 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81758&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:195
&gt; &gt; +        return _ThreadedWorker(self._broker, self._port)
&gt; 
&gt; There seems to be naming mismatch here (worker connection vs. worker). I realize that may be because connections are supposed to be facades, but perhaps we should reconsider the &quot;connection&quot; name? In the Chromium multi-process scheme, facades for an object in another process are known as *Host (e.g. RenderView and RenderViewHost). Perhaps we should use the same naming here?
&gt; 

It might be less confusing if _{Inline,Threaded,MultiProcess}Worker were named *WorkerConnection instead. I intentionally didn&apos;t use *Host because the connection objects live in the same process/thread as the objects they are connecting to the broker. I&apos;ll rename them to *Connection for now.
 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker_unittest.py:122
&gt; &gt; +    # Methods to implement the Manager side of the ClientInterface
&gt; 
&gt; ClientInterface is now BrokerClient. Also, can you make _TestsMixin actually subclass BrokerClient, so that the relationship is more obvious?
&gt;

Sure.
 
&gt; Also, these header-style comments take up a bit too much room (not sure if we have a convention for them in webkitpy)
&gt;

I can delete them.
 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker_unittest.py:201
&gt; &gt; +    def queue(self):
&gt; 
&gt; Is this (or the other queue() implementation below) necessary anymore? The queue class is now determined in based on the passed in worker model in manager_worker_broker.get.

The queues aren&apos;t needed in this patch, but they will be needed in the patch for bug 54072, where we use them to control the TestWorker separately from the messaging. This also points out that I did actually need the **kwargs to start_worker and the Worker constructor, but I think I can get around that with lexical scoping. I&apos;ll update the patches and resubmit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349959</commentid>
    <comment_count>5</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 13:12:22 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 81758 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81758&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:223
&gt; &gt; +    def start(self):
&gt; &gt; +        raise NotImplementedError
&gt; 
&gt; start() seems like a confusing name when there&apos;s also BrokerConneciton.run_message_loop().  What&apos;s the difference?  Also, how is it different from run()?
&gt; 

Any class that implements a WorkerConnection needs to implement start() and run(). In the threaded and multiprocessing cases, these are implemented by Thread.start()/run() and Process.start()/run(). In the inline case, they&apos;re stubs. 

The start() method causes the other thread/process to actually get created., and the run() method is invoked inside the other method. The WorkerConnection&apos;s run() method is usually a thin shim around the Worker&apos;s run() method, which itself usually a thin shim around run_message_loop().

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:252
&gt; &gt; +class _ThreadedWorker(threading.Thread, _WorkerConnection):
&gt; &gt; +    def __init__(self, broker, port):
&gt; 
&gt; This looks like multiple inheritance, no?  For example, both threading.Thread and _WorkerConnection seem to have a run() method.  This doesn&apos;t feel like a mixin to me . . .

Yes, it is multiple inheritance. _WorkerConnection is an abstract base class, not a mixin. See above.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker_unittest.py:123
&gt; &gt; +    #
&gt; &gt; +    # Methods to implement the Manager side of the ClientInterface
&gt; &gt; +    #
&gt; 
&gt; These 3 line comments are weird.  They should be single line docstrings.

They refer to groups of methods, so I don&apos;t think docstrings make much sense. That said, I&apos;ll probably just delete them outright.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349976</commentid>
    <comment_count>6</comment_count>
      <attachid>82167</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 13:35:09 -0800</bug_when>
    <thetext>Created attachment 82167
update w/ review feedback from tony, mihai, merge in changes from 54068</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349979</commentid>
    <comment_count>7</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2011-02-11 13:37:42 -0800</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=81758&amp;action=review

&gt;&gt;&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:252
&gt;&gt;&gt; +    def __init__(self, broker, port):
&gt;&gt; 
&gt;&gt; This looks like multiple inheritance, no?  For example, both threading.Thread and _WorkerConnection seem to have a run() method.  This doesn&apos;t feel like a mixin to me . . .
&gt; 
&gt; Yes, it is multiple inheritance. _WorkerConnection is an abstract base class, not a mixin. See above.

I thought we decided that multiple inheritance is bad unless it&apos;s a mixin or for interfaces?  For example, ThreadedWorker.start depends on the order in which we inherit from the base classes.

Can the worker connection hold a subclass of threading.Thread and delegate calls to run() and start() to it?  You could even declare this class within _ThreadedWorkerConnection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350009</commentid>
    <comment_count>8</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 14:05:31 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81758&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:252
&gt; &gt;&gt;&gt; +    def __init__(self, broker, port):
&gt; &gt;&gt; 
&gt; &gt;&gt; This looks like multiple inheritance, no?  For example, both threading.Thread and _WorkerConnection seem to have a run() method.  This doesn&apos;t feel like a mixin to me . . .
&gt; &gt; 
&gt; &gt; Yes, it is multiple inheritance. _WorkerConnection is an abstract base class, not a mixin. See above.
&gt; 
&gt; I thought we decided that multiple inheritance is bad unless it&apos;s a mixin or for interfaces?  For example, ThreadedWorker.start depends on the order in which we inherit from the base classes.
&gt;

Well, unfortunately, there isn&apos;t really such a thing as interfaces in Python. WorkerConnection is barely more than an interface, but if this layout is troubling, we have a few options:

(1) I can delete start() and run() from _WorkerConnection, eliminating the overlap. Technically, they don&apos;t need to be there, as they are only called by routines that don&apos;t require the polymorphism.

(2) I can explictly override start() and run() in ThreadedWorkerConnection and MultipleProcessWorkerConnection(), to make it clear which methods will be called.
  
Or I can do (3):

&gt; Can the worker connection hold a subclass of threading.Thread and delegate calls to run() and start() to it?  You could even declare this class within _ThreadedWorkerConnection.

But, I&apos;ve done this before and I think it&apos;s probably less clear than either (1) or (2). Thoughts?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350041</commentid>
    <comment_count>9</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2011-02-11 14:33:59 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; Well, unfortunately, there isn&apos;t really such a thing as interfaces in Python. WorkerConnection is barely more than an interface, but if this layout is troubling, we have a few options:
&gt; 
&gt; (1) I can delete start() and run() from _WorkerConnection, eliminating the overlap. Technically, they don&apos;t need to be there, as they are only called by routines that don&apos;t require the polymorphism.

Hmm, but isn&apos;t this still multiple inheritance?  We would still have the two constructors and the methods from BrokerConnection mixed with the methods from threading.Thread.  All this does is eliminate the overlapping methods.  It&apos;s also possible that the member variables (like self._client and self.name) could collide with member variables in threading.Thread.

&gt; (2) I can explictly override start() and run() in ThreadedWorkerConnection and MultipleProcessWorkerConnection(), to make it clear which methods will be called.

Wouldn&apos;t this be multiple inheritance too?  Another way to think about it is, this isn&apos;t something you could do in Java because WorkerConnection isn&apos;t an interface.  You could do it in C++, but it would violate the style guide.

&gt; Or I can do (3):
&gt; 
&gt; &gt; Can the worker connection hold a subclass of threading.Thread and delegate calls to run() and start() to it?  You could even declare this class within _ThreadedWorkerConnection.
&gt; 
&gt; But, I&apos;ve done this before and I think it&apos;s probably less clear than either (1) or (2). Thoughts?

I agree that this solution requires more classes and more delegating (which I dislike), but of the three options, it&apos;s the only one that avoid multiple inheritance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350121</commentid>
    <comment_count>10</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 15:47:57 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #8)
&gt; &gt; Well, unfortunately, there isn&apos;t really such a thing as interfaces in Python. WorkerConnection is barely more than an interface, but if this layout is troubling, we have a few options:
&gt; &gt; 
&gt; &gt; (1) I can delete start() and run() from _WorkerConnection, eliminating the overlap. Technically, they don&apos;t need to be there, as they are only called by routines that don&apos;t require the polymorphism.
&gt; 
&gt; Hmm, but isn&apos;t this still multiple inheritance?

Yes, but the methods don&apos;t overlap (apart from the constructor), which makes it a mixin under my definition. If you&apos;re worried about name conflicts, I can change to double underscores for the private fields).

(mixins have state and can depend on the linearization order, see, e.g.: http://stackoverflow.com/questions/925609/mixins-vs-traits ).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350140</commentid>
    <comment_count>11</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 16:11:10 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; (In reply to comment #8)
&gt; &gt; &gt; Well, unfortunately, there isn&apos;t really such a thing as interfaces in Python. WorkerConnection is barely more than an interface, but if this layout is troubling, we have a few options:
&gt; &gt; &gt; 
&gt; &gt; &gt; (1) I can delete start() and run() from _WorkerConnection, eliminating the overlap. Technically, they don&apos;t need to be there, as they are only called by routines that don&apos;t require the polymorphism.
&gt; &gt; 
&gt; &gt; Hmm, but isn&apos;t this still multiple inheritance?
&gt; 
&gt; Yes, but the methods don&apos;t overlap (apart from the constructor), which makes it a mixin under my definition. If you&apos;re worried about name conflicts, I can change to double underscores for the private fields).
&gt; 
&gt; (mixins have state and can depend on the linearization order, see, e.g.: http://stackoverflow.com/questions/925609/mixins-vs-traits ).

Frankly, a better way to think about this is that Threading.Thread and multiprocessing.Process are really the things being mixed in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350160</commentid>
    <comment_count>12</comment_count>
      <attachid>82208</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 16:51:56 -0800</bug_when>
    <thetext>Created attachment 82208
delegate to objects for concurrency in *WorkerConnection rather than mixing them in</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350162</commentid>
    <comment_count>13</comment_count>
      <attachid>82210</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 16:54:21 -0800</bug_when>
    <thetext>Created attachment 82210
incremental diff of the prior two attachments, to show only the changes necessary to use delegates instead of mixins

Okay, I&apos;ve posted another rev that shows basically how things would work w/ delegates instead of mixins. Note that the patch in 54074 would need to change as well, but the changes there are not very interesting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350165</commentid>
    <comment_count>14</comment_count>
      <attachid>82208</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2011-02-11 17:10:32 -0800</bug_when>
    <thetext>Comment on attachment 82208
delegate to objects for concurrency in *WorkerConnection rather than mixing them in

View in context: https://bugs.webkit.org/attachment.cgi?id=82208&amp;action=review

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:243
&gt; +    class _Thread(threading.Thread):
&gt; +        def __init__(self, worker_connection):
&gt; +            threading.Thread.__init__(self)
&gt; +            self._worker_connection = worker_connection

Should we pass in client and port so run() doesn&apos;t have to access _client and _port?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:260
&gt; +class _MultiProcessWorkerConnection(_WorkerConnection):

If multiprocessing doesn&apos;t exist, will this basically be the same as ThreadedWorkerConnection?

&gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:264
&gt; +    class _Process(_Multiprocessing_Process):
&gt; +        def __init__(self, worker_connection):
&gt; +            _Multiprocessing_Process.__init__(self)
&gt; +            self._worker_connection = worker_connection

Same thing, can we pass in what is needed by run()?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350166</commentid>
    <comment_count>15</comment_count>
      <attachid>82211</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 17:14:16 -0800</bug_when>
    <thetext>Created attachment 82211
can&apos;t pickle nested classes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350170</commentid>
    <comment_count>16</comment_count>
      <attachid>82213</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 17:21:14 -0800</bug_when>
    <thetext>Created attachment 82213
update w/ additional feedback from tony</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350171</commentid>
    <comment_count>17</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 17:28:11 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 82208 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=82208&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:243
&gt; &gt; +    class _Thread(threading.Thread):
&gt; &gt; +        def __init__(self, worker_connection):
&gt; &gt; +            threading.Thread.__init__(self)
&gt; &gt; +            self._worker_connection = worker_connection
&gt; 
&gt; Should we pass in client and port so run() doesn&apos;t have to access _client and _port?
&gt; 

Done.

&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:260
&gt; &gt; +class _MultiProcessWorkerConnection(_WorkerConnection):
&gt; 
&gt; If multiprocessing doesn&apos;t exist, will this basically be the same as ThreadedWorkerConnection?
&gt;

Yes.
 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/layout_package/manager_worker_broker.py:264
&gt; &gt; +    class _Process(_Multiprocessing_Process):
&gt; &gt; +        def __init__(self, worker_connection):
&gt; &gt; +            _Multiprocessing_Process.__init__(self)
&gt; &gt; +            self._worker_connection = worker_connection
&gt; 
&gt; Same thing, can we pass in what is needed by run()?

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350179</commentid>
    <comment_count>18</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-02-11 17:42:09 -0800</bug_when>
    <thetext>Committed r78398: &lt;http://trac.webkit.org/changeset/78398&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350370</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-13 02:19:54 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/78398 might have broken SnowLeopard Intel Release (WebKit2 Tests)
The following tests are not passing:
fast/loader/empty-embed-src-attribute.html</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81758</attachid>
            <date>2011-02-08 23:30:49 -0800</date>
            <delta_ts>2011-02-11 13:35:06 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-54070-20110208233047.patch</filename>
            <type>text/plain</type>
            <size>15753</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogNzgwMTAKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCAyNzUxZTA5YmIxYWNhNDI0NmNhZDZkOTQ0YzhiODkyZjBh
OGQ3ZmZhLi40YTViOTE5MzdiYTI0ZGFkY2Q3ZTY2YzdhNWE2M2M1ZDFhNTcyYjk1IDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0yLDYgKzIsMjQg
QEAKIAogICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KIAorICAgICAgICBUaGlz
IHBhdGNoIGFkZHMgdG8gTlJXVCBtb3N0IG9mIHRoZSBzdXBwb3J0IG5lZWRlZCB0byBydW4gdGhl
IG5ldworICAgICAgICBtZXNzYWdlLWJhc2VkIHdvcmtlcnMgaW4gc2VwYXJhdGUgdGhyZWFkcyBv
ciBwcm9jZXNzZXMuIFRoZSBjb2RlCisgICAgICAgIGlzbid0IGZ1bGx5IGNvbXBsZXRlIHlldCBi
ZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgY2FuY2VsKCkgb3IKKyAgICAgICAgaXNfYWxpdmUoKS4K
KworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQwNzAK
KworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L21hbmFnZXJfd29ya2VyX2Jyb2tlci5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXJfdW5pdHRlc3Qu
cHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2th
Z2UvdGVzdF9ydW5uZXIyLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvYmFzZS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L21vY2tfZHJ0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3J1bl93ZWJraXRfdGVzdHNfdW5pdHRlc3QucHk6CisKKzIwMTEtMDItMDggIERpcmsgUHJh
bmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKICAgICAgICAgVGhpcyBwYXRjaCBhZGRzIHRoZSBidWxrIG9mIHRoZSByZW1h
aW5pbmcgZnVuY3Rpb25hbGl0eSBmb3IKICAgICAgICAgdGhlIE5SV1QgbWVzc2FnZS1wYXNzaW5n
IGltcGxlbWVudGF0aW9uLiBUaGUgcGF0Y2ggYWRkcyBhIG5ldwogICAgICAgICBXb3JrZXIgY2xh
c3MgdGhhdCB3aWxsIGV2ZW50dWFsbHkgcmVwbGFjZSB0aGUgVGVzdFNoZWxsVGhyZWFkCmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2Fn
ZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkKaW5kZXggYWVl
MzQ3NDZkMDQ1M2U1YmUxYWViODA4ZGI3Nzk1ODVhZjUyZjU1ZS4uYWI3MDNiM2I2NmEwNWU1ZmI2
NGY5YzA3MDhmMGI3OTYxNDM5MTc2NiAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyLnB5Cisr
KyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21h
bmFnZXJfd29ya2VyX2Jyb2tlci5weQpAQCAtMzgsMTUgKzM4LDI0IEBAIHJlcXVlc3RlZCBjb25m
aWd1cmF0aW9uLgogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcHRwYXJzZQogaW1wb3J0IFF1ZXVl
CitpbXBvcnQgdGhyZWFkCiBpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdGltZQorCiAKICMgSGFu
ZGxlIFB5dGhvbiA8IDIuNiB3aGVyZSBtdWx0aXByb2Nlc3NpbmcgaXNuJ3QgYXZhaWxhYmxlLgor
IworIyBfTXVsdGlwcm9jZXNzaW5nX1Byb2Nlc3MgaXMgbmVlZGVkIHNvIHRoYXQgX011bHRpUHJv
Y2Vzc1dvcmtlcgorIyBjYW4gYmUgZGVmaW5lZCB3aXRoIG9yIHdpdGhvdXQgbXVsdGlwcm9jZXNz
aW5nLgogdHJ5OgogICAgIGltcG9ydCBtdWx0aXByb2Nlc3NpbmcKKyAgICBfTXVsdGlwcm9jZXNz
aW5nX1Byb2Nlc3MgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzcwogZXhjZXB0IEltcG9ydEVycm9y
OgogICAgIG11bHRpcHJvY2Vzc2luZyA9IE5vbmUKKyAgICBfTXVsdGlwcm9jZXNzaW5nX1Byb2Nl
c3MgPSB0aHJlYWRpbmcuVGhyZWFkCiAKIAorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMgaW1w
b3J0IHBvcnQKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLmxheW91dF9wYWNrYWdlIGltcG9y
dCBtZXNzYWdlX2Jyb2tlcjIKIAogCkBAIC0xNTYsNiArMTY1LDcgQEAgY2xhc3MgX01hbmFnZXJD
b25uZWN0aW9uKG1lc3NhZ2VfYnJva2VyMi5Ccm9rZXJDb25uZWN0aW9uKToKICAgICAgICAgd29y
a2VyX2Nvbm5lY3Rpb24gPSBzZWxmLl9tYWtlX3dvcmtlcl9jb25uZWN0aW9uKCkKICAgICAgICAg
d29ya2VyID0gc2VsZi5fbWFrZV93b3JrZXIod29ya2VyX2Nvbm5lY3Rpb24sIHdvcmtlcl9udW1i
ZXIsICoqa3dhcmdzKQogICAgICAgICB3b3JrZXJfY29ubmVjdGlvbi5zZXRfY2xpZW50KHdvcmtl
cikKKyAgICAgICAgd29ya2VyX2Nvbm5lY3Rpb24uc3RhcnQoKQogICAgICAgICByZXR1cm4gd29y
a2VyX2Nvbm5lY3Rpb24KIAogCkBAIC0xNzYsNiArMTg2LDI4IEBAIGNsYXNzIF9JbmxpbmVNYW5h
Z2VyKF9NYW5hZ2VyQ29ubmVjdGlvbik6CiAgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fYWxsX3Bl
bmRpbmcoTUFOQUdFUl9UT1BJQywgc2VsZi5fY2xpZW50KQogCiAKK2NsYXNzIF9UaHJlYWRlZE1h
bmFnZXIoX01hbmFnZXJDb25uZWN0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnJva2Vy
LCBwb3J0LCBvcHRpb25zLCBjbGllbnQsIHdvcmtlcl9jbGFzcyk6CisgICAgICAgIF9NYW5hZ2Vy
Q29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBicm9rZXIsIG9wdGlvbnMsIGNsaWVudCwgd29ya2Vy
X2NsYXNzKQorICAgICAgICBzZWxmLl9wb3J0ID0gcG9ydAorCisgICAgZGVmIF9tYWtlX3dvcmtl
cl9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gX1RocmVhZGVkV29ya2VyKHNlbGYu
X2Jyb2tlciwgc2VsZi5fcG9ydCkKKworCitjbGFzcyBfTXVsdGlQcm9jZXNzTWFuYWdlcihfTWFu
YWdlckNvbm5lY3Rpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHBvcnQsIG9w
dGlvbnMsIGNsaWVudCwgd29ya2VyX2NsYXNzKToKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBj
bGFzcyBkb2VzIG5vdCBrZWVwIGEgaGFuZGxlIHRvIHRoZSBhY3R1YWwgcG9ydAorICAgICAgICAj
IG9iamVjdCwgYmVjYXVzZSBpdCBpc24ndCBQaWNrbGFibGUuIEluc3RlYWQgaXQga2VlcHMgdGhl
IHBvcnQKKyAgICAgICAgIyBuYW1lIGFuZCByZWNyZWF0ZXMgdGhlIHBvcnQgaW4gdGhlIGNoaWxk
IHByb2Nlc3MgZnJvbSB0aGUgbmFtZQorICAgICAgICAjIGFuZCBvcHRpb25zLgorICAgICAgICBf
TWFuYWdlckNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgYnJva2VyLCBvcHRpb25zLCBjbGllbnQs
IHdvcmtlcl9jbGFzcykKKyAgICAgICAgc2VsZi5fcGxhdGZvcm1fbmFtZSA9IHBvcnQucmVhbF9u
YW1lKCkKKworICAgIGRlZiBfbWFrZV93b3JrZXJfY29ubmVjdGlvbihzZWxmKToKKyAgICAgICAg
cmV0dXJuIF9NdWx0aVByb2Nlc3NXb3JrZXIoc2VsZi5fYnJva2VyLCBzZWxmLl9wbGF0Zm9ybV9u
YW1lLCBzZWxmLl9vcHRpb25zKQorCisKIGNsYXNzIF9Xb3JrZXJDb25uZWN0aW9uKG1lc3NhZ2Vf
YnJva2VyMi5Ccm9rZXJDb25uZWN0aW9uKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgYnJva2Vy
KToKICAgICAgICAgIyBUaGUgY2xpZW50IGdldHMgZmlsbGVkIGluIGFmdGVyIHRoaXMgb2JqZWN0
IGlzIGNvbnN0cnVjdGVkLCB1c2luZyBzZXRfY2xpZW50KCkuCkBAIC0xODcsNiArMjE5LDkgQEAg
Y2xhc3MgX1dvcmtlckNvbm5lY3Rpb24obWVzc2FnZV9icm9rZXIyLkJyb2tlckNvbm5lY3Rpb24p
OgogICAgICAgICBzZWxmLl9jbGllbnQgPSBjbGllbnQKICAgICAgICAgc2VsZi5uYW1lID0gY2xp
ZW50Lm5hbWUoKQogCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBs
ZW1lbnRlZEVycm9yCisKICAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBs
ZW1lbnRlZEVycm9yCiAKQEAgLTE5OSwxNyArMjM0LDQzIEBAIGNsYXNzIF9JbmxpbmVXb3JrZXIo
X1dvcmtlckNvbm5lY3Rpb24pOgogICAgICAgICBfV29ya2VyQ29ubmVjdGlvbi5fX2luaXRfXyhz
ZWxmLCBicm9rZXIpCiAgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CiAgICAgICAgIHNlbGYuX21h
bmFnZXJfY2xpZW50ID0gbWFuYWdlcl9jbGllbnQKKyAgICAgICAgc2VsZi5fYWxpdmUgPSBGYWxz
ZQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBwYXNzCiAKICAgICBkZWYgcnVuKHNl
bGYpOgorICAgICAgICBzZWxmLl9hbGl2ZSA9IFRydWUKICAgICAgICAgc2VsZi5fY2xpZW50LnJ1
bihzZWxmLl9wb3J0KQorICAgICAgICBzZWxmLl9hbGl2ZSA9IEZhbHNlCiAKICAgICBkZWYgeWll
bGRfdG9fYnJva2VyKHNlbGYpOgogICAgICAgICBzZWxmLl9icm9rZXIucnVuX2FsbF9wZW5kaW5n
KE1BTkFHRVJfVE9QSUMsIHNlbGYuX21hbmFnZXJfY2xpZW50KQogCiAKLWNsYXNzIF9UaHJlYWRl
ZE1hbmFnZXIoX01hbmFnZXJDb25uZWN0aW9uKToKLSAgICBwYXNzCitjbGFzcyBfVGhyZWFkZWRX
b3JrZXIodGhyZWFkaW5nLlRocmVhZCwgX1dvcmtlckNvbm5lY3Rpb24pOgorICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCBicm9rZXIsIHBvcnQpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5p
dF9fKHNlbGYpCisgICAgICAgIF9Xb3JrZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tl
cikKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKIAorICAgIGRlZiBydW4oc2VsZik6CisgICAg
ICAgICMgRklYTUU6IFdlIGNhbiByZW1vdmUgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIG9uIDIuNi4K
KyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ2lkZW50Jyk6CisgICAgICAgICAgICBzZWxm
LmlkZW50ID0gdGhyZWFkLmdldF9pZGVudCgpCisgICAgICAgIHNlbGYuX2NsaWVudC5ydW4oc2Vs
Zi5fcG9ydCkKIAotY2xhc3MgX011bHRpUHJvY2Vzc01hbmFnZXIoX01hbmFnZXJDb25uZWN0aW9u
KToKLSAgICBwYXNzCisKK2NsYXNzIF9NdWx0aVByb2Nlc3NXb3JrZXIoX011bHRpcHJvY2Vzc2lu
Z19Qcm9jZXNzLCBfV29ya2VyQ29ubmVjdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJy
b2tlciwgcGxhdGZvcm1fbmFtZSwgb3B0aW9ucyk6CisgICAgICAgIF9NdWx0aXByb2Nlc3Npbmdf
UHJvY2Vzcy5fX2luaXRfXyhzZWxmKQorICAgICAgICBfV29ya2VyQ29ubmVjdGlvbi5fX2luaXRf
XyhzZWxmLCBicm9rZXIpCisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAg
IHNlbGYuX3BsYXRmb3JtX25hbWUgPSBwbGF0Zm9ybV9uYW1lCisKKyAgICBkZWYgcnVuKHNlbGYp
OgorICAgICAgICAjIFJlLWNvbmZpZ3VyZSB0aGUgbG9nZ2VyLgorICAgICAgICAjIEZJWE1FOiBm
aWd1cmUgb3V0IGhvdyB0byBnZXQgYSBoYW5kbGUgdG8gdGhlIHJpZ2h0IHN0cmVhbS4KKyAgICAg
ICAgbG9nZ2luZy5iYXNpY0NvbmZpZygpCisgICAgICAgIHBvcnRfb2JqID0gcG9ydC5nZXQoc2Vs
Zi5fcGxhdGZvcm1fbmFtZSwgc2VsZi5fb3B0aW9ucykKKyAgICAgICAgc2VsZi5fY2xpZW50LnJ1
bihwb3J0X29iaikKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlcl91bml0dGVzdC5weSBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJf
d29ya2VyX2Jyb2tlcl91bml0dGVzdC5weQppbmRleCA5MjE2MTU3MDhmZmI3MzljNjE3NzA2MmI3
YjA2NjQ3NGNkN2VkODMwLi42ZDQ4NjNiMzQ4NDYzNWRlNTYwM2QyMzhmMDMyMTAxNGY2MDIyNDg1
IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRf
cGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXJfdW5pdHRlc3QucHkKKysrIGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJf
YnJva2VyX3VuaXR0ZXN0LnB5CkBAIC0yNyw2ICsyNyw3IEBACiAjIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKIGlt
cG9ydCBvcHRwYXJzZQoraW1wb3J0IFF1ZXVlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QK
IApAQCAtNDMsOCArNDQsNDQgQEAgZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3Bh
Y2thZ2UgaW1wb3J0IG1hbmFnZXJfd29ya2VyX2Jyb2tlcgogZnJvbSB3ZWJraXRweS5sYXlvdXRf
dGVzdHMubGF5b3V0X3BhY2thZ2UgaW1wb3J0IG1lc3NhZ2VfYnJva2VyMgogCiAKLWNsYXNzIFRl
c3RXb3JrZXIob2JqZWN0KToKLSAgICBwYXNzCitjbGFzcyBUZXN0V29ya2VyKG1hbmFnZXJfd29y
a2VyX2Jyb2tlci5BYnN0cmFjdFdvcmtlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tl
ciwgd29ya2VyX251bWJlciwgb3B0aW9ucywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLl9icm9r
ZXIgPSBicm9rZXIKKyAgICAgICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc2Vs
Zi5fd29ya2VyX251bWJlciA9IHdvcmtlcl9udW1iZXIKKyAgICAgICAgc2VsZi5fbmFtZSA9ICdU
ZXN0V29ya2VyLyVkJyAlIHdvcmtlcl9udW1iZXIKKyAgICAgICAgc2VsZi5fc3RvcHBlZCA9IEZh
bHNlCisgICAgICAgIHNlbGYuX3N0YXJ0aW5nX3F1ZXVlID0ga3dhcmdzLmdldCgnc3RhcnRpbmdf
cXVldWUnKQorICAgICAgICBzZWxmLl9zdG9wcGluZ19xdWV1ZSA9IGt3YXJncy5nZXQoJ3N0b3Bw
aW5nX3F1ZXVlJykKKworICAgIGRlZiBoYW5kbGVfc3RvcChzZWxmLCBzcmMpOgorICAgICAgICBz
ZWxmLl9zdG9wcGVkID0gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5f
aW50LCBhX3N0cik6CisgICAgICAgIGFzc2VydCBhbl9pbnQgPT0gMQorICAgICAgICBhc3NlcnQg
YV9zdHIgPT0gImhlbGxvLCB3b3JsZCIKKyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2Fn
ZSgndGVzdCcsIDIsICdoaSwgZXZlcnlib2R5JykKKworICAgIGRlZiBpc19kb25lKHNlbGYpOgor
ICAgICAgICByZXR1cm4gc2VsZi5fc3RvcHBlZAorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAg
ICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIHBh
c3MKKworICAgIGRlZiBydW4oc2VsZiwgcG9ydCk6CisgICAgICAgIGlmIHNlbGYuX3N0YXJ0aW5n
X3F1ZXVlOgorICAgICAgICAgICAgc2VsZi5fc3RhcnRpbmdfcXVldWUucHV0KCcnKQorICAgICAg
ICBpZiBzZWxmLl9zdG9wcGluZ19xdWV1ZToKKyAgICAgICAgICAgIHNlbGYuX3N0b3BwaW5nX3F1
ZXVlLmdldCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVz
c2FnZV9sb29wKCkKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlci55aWVsZF90b19icm9rZXIoKQor
ICAgICAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZSgnZG9uZScpCisgICAgICAgIGV4
Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdl
KCdleGNlcHRpb24nLCAodHlwZShlKSwgc3RyKGUpLCBOb25lKSkKIAogCiBkZWYgZ2V0X29wdGlv
bnMod29ya2VyX21vZGVsKToKQEAgLTc2LDEzICsxMTMsMTMxIEBAIGNsYXNzIEZ1bmN0aW9uVGVz
dHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2dldF9fdW5rbm93bihzZWxmKToK
ICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFrZV9icm9rZXIsIHNlbGYs
ICd1bmtub3duJykKIAorCitjbGFzcyBfVGVzdHNNaXhpbihvYmplY3QpOgorICAgICIiIk1peGlu
IGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHNlcmllcyBvZiB0ZXN0cyB0byBlbmZvcmNlIHRoZQor
ICAgIGNvbnRyYWN0IGFsbCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBmb2xsb3cuIiIiCisKKyAgICAj
CisgICAgIyBNZXRob2RzIHRvIGltcGxlbWVudCB0aGUgTWFuYWdlciBzaWRlIG9mIHRoZSBDbGll
bnRJbnRlcmZhY2UKKyAgICAjCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAn
VGVzdGVyJworCisgICAgZGVmIGlzX2RvbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9k
b25lCisKKyAgICAjCisgICAgIyBIYW5kbGVycyBmb3IgdGhlIG1lc3NhZ2VzIHRoZSBUZXN0V29y
a2VyIG1heSBzZW5kLgorICAgICMKKyAgICBkZWYgaGFuZGxlX2RvbmUoc2VsZiwgc3JjKToKKyAg
ICAgICAgc2VsZi5fZG9uZSA9IFRydWUKKworICAgIGRlZiBoYW5kbGVfdGVzdChzZWxmLCBzcmMs
IGFuX2ludCwgYV9zdHIpOgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBhbl9pbnQKKyAgICAgICAg
c2VsZi5fYV9zdHIgPSBhX3N0cgorCisgICAgZGVmIGhhbmRsZV9leGNlcHRpb24oc2VsZiwgc3Jj
LCBleGNfaW5mbyk6CisgICAgICAgIHNlbGYuX2V4Y2VwdGlvbiA9IGV4Y19pbmZvCisgICAgICAg
IHNlbGYuX2RvbmUgPSBUcnVlCisKKyAgICAjCisgICAgIyBUZXN0aW5nIGhlbHBlciBtZXRob2Rz
CisgICAgIworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fYW5faW50ID0gTm9u
ZQorICAgICAgICBzZWxmLl9hX3N0ciA9IE5vbmUKKyAgICAgICAgc2VsZi5fYnJva2VyID0gTm9u
ZQorICAgICAgICBzZWxmLl9kb25lID0gRmFsc2UKKyAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0g
Tm9uZQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSBOb25lCisKKyAgICBkZWYgbWFrZV9i
cm9rZXIoc2VsZik6CisgICAgICAgIHNlbGYuX2Jyb2tlciA9IG1ha2VfYnJva2VyKHNlbGYsIHNl
bGYuX3dvcmtlcl9tb2RlbCkKKworICAgICMKKyAgICAjIEFjdHVhbCB1bml0IHRlc3RzCisgICAg
IworICAgIGRlZiB0ZXN0X2RvbmUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl93b3JrZXJf
bW9kZWw6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisg
ICAgICAgIHdvcmtlciA9IHNlbGYuX2Jyb2tlci5zdGFydF93b3JrZXIoMCkKKyAgICAgICAgc2Vs
Zi5fYnJva2VyLnBvc3RfbWVzc2FnZSgndGVzdCcsIDEsICdoZWxsbywgd29ybGQnKQorICAgICAg
ICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCdzdG9wJykKKyAgICAgICAgc2VsZi5fYnJva2Vy
LnJ1bl9tZXNzYWdlX2xvb3AoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19kb25l
KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYW5faW50LCAyKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFsKHNlbGYuX2Ffc3RyLCAnaGksIGV2ZXJ5Ym9keScpCisKKyAgICBkZWYg
dGVzdF91bmtub3duX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl93b3JrZXJf
bW9kZWw6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisg
ICAgICAgIHdvcmtlciA9IHNlbGYuX2Jyb2tlci5zdGFydF93b3JrZXIoMCkKKyAgICAgICAgc2Vs
Zi5fYnJva2VyLnBvc3RfbWVzc2FnZSgndW5rbm93bicpCisgICAgICAgIHNlbGYuX2Jyb2tlci5y
dW5fbWVzc2FnZV9sb29wKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19kb25l
KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuX2V4Y2VwdGlvblswXSwgVmFsdWVF
cnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhjZXB0aW9uWzFdLAorICAg
ICAgICAgICAgIlRlc3RXb3JrZXIvMDogcmVjZWl2ZWQgbWVzc2FnZSAndW5rbm93bicgaXQgY291
bGRuJ3QgaGFuZGxlIikKKworCitjbGFzcyBJbmxpbmVCcm9rZXJUZXN0cyhfVGVzdHNNaXhpbiwg
dW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgX1Rlc3Rz
TWl4aW4uc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5fd29ya2VyX21vZGVsID0gJ2lubGluZScK
KworCitjbGFzcyBNdWx0aVByb2Nlc3NCcm9rZXJUZXN0cyhfVGVzdHNNaXhpbiwgdW5pdHRlc3Qu
VGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgX1Rlc3RzTWl4aW4uc2V0
VXAoc2VsZikKKyAgICAgICAgaWYgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgc2VsZi5f
d29ya2VyX21vZGVsID0gJ3Byb2Nlc3NlcycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNl
bGYuX3dvcmtlcl9tb2RlbCA9IE5vbmUKKworICAgIGRlZiBxdWV1ZShzZWxmKToKKyAgICAgICAg
cmV0dXJuIG11bHRpcHJvY2Vzc2luZy5RdWV1ZSgpCisKKworY2xhc3MgVGhyZWFkZWRCcm9rZXJU
ZXN0cyhfVGVzdHNNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBxdWV1ZShzZWxm
KToKKyAgICAgICAgcmV0dXJuIFF1ZXVlLlF1ZXVlKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToK
KyAgICAgICAgX1Rlc3RzTWl4aW4uc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5fd29ya2VyX21v
ZGVsID0gJ3RocmVhZHMnCisKKworY2xhc3MgRnVuY3Rpb25zVGVzdCh1bml0dGVzdC5UZXN0Q2Fz
ZSk6CiAgICAgZGVmIHRlc3RfcnVudGltZV9vcHRpb25zKHNlbGYpOgogICAgICAgICBvcHRpb25f
bGlzdCA9IG1hbmFnZXJfd29ya2VyX2Jyb2tlci5ydW50aW1lX29wdGlvbnMoKQogICAgICAgICBw
YXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpCiAg
ICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhbXSkKICAgICAgICAgc2Vs
Zi5hc3NlcnRUcnVlKG9wdGlvbnMpCiAKLSMgRklYTUU6IEFkZCBpbiB1bml0IHRlc3RzIGZvciB0
aGUgbWFuYWdlcnMsIGNvdmVyYWdlIHRlc3RzIGZvciB0aGUgaW50ZXJmYWNlcy4KKworY2xhc3Mg
SW50ZXJmYWNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGVzZSB0ZXN0cyBtb3N0
bHkgZXhpc3QgdG8gcGFjaWZ5IGNvdmVyYWdlLgorCisgICAgIyBGSVhNRTogVGhlcmUgbXVzdCBi
ZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyBhbmQgYWxzbyB2ZXJpZnkKKyAgICAjIHRoYXQgY2xh
c3NlcyBkbyBpbXBsZW1lbnQgZXZlcnkgYWJzdHJhY3QgbWV0aG9kIGluIGFuIGludGVyZmFjZS4K
KyAgICBkZWYgdGVzdF9tYW5hZ2VyY29ubmVjdGlvbl9pc19hYnN0cmFjdChzZWxmKToKKyAgICAg
ICAgIyBUZXN0IHRoYXQgYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZHMgYXJlIGFic3RyYWN0IGFu
ZCBoYXZlIHRoZQorICAgICAgICAjIHNpZ25hdHVyZSB3ZSBleHBlY3QuCisgICAgICAgIGJyb2tl
ciA9IG1ha2VfYnJva2VyKHNlbGYsICdpbmxpbmUnKQorICAgICAgICBvYmogPSBtYW5hZ2VyX3dv
cmtlcl9icm9rZXIuX01hbmFnZXJDb25uZWN0aW9uKGJyb2tlci5fYnJva2VyLCBOb25lLCBzZWxm
LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBv
YmouX21ha2Vfd29ya2VyX2Nvbm5lY3Rpb24pCisKKyAgICBkZWYgdGVzdF93b3JrZXJjb25uZWN0
aW9uX2lzX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhbGwgdGhlIGJhc2Ug
Y2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJhY3QgYW5kIGhhdmUgdGhlCisgICAgICAgICMgc2lnbmF0
dXJlIHdlIGV4cGVjdC4KKyAgICAgICAgYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwgJ2lubGlu
ZScpCisgICAgICAgIG9iaiA9IG1hbmFnZXJfd29ya2VyX2Jyb2tlci5fV29ya2VyQ29ubmVjdGlv
bihicm9rZXIuX2Jyb2tlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50
ZWRFcnJvciwgb2JqLnN0YXJ0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1l
bnRlZEVycm9yLCBvYmoucnVuKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2Fn
ZS90ZXN0X3J1bm5lcjIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9s
YXlvdXRfcGFja2FnZS90ZXN0X3J1bm5lcjIucHkKaW5kZXggYzg1M2Y3MjliZjU5MTcyNGRkY2Ux
ODhhYzFiN2E0YzdhY2NiOTA0OS4uNTM0ZGViNTRkODExNGEwZmFmNTRmOTA0YjM4ZDZhMzczODVi
ZTQwNiAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvdGVzdF9ydW5uZXIyLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcnVubmVyMi5weQpAQCAtNDUsOSArNDUs
NiBAQCBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKIGNsYXNzIFRlc3RSdW5u
ZXIyKHRlc3RfcnVubmVyLlRlc3RSdW5uZXIpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0
LCBvcHRpb25zLCBwcmludGVyKToKLSAgICAgICAgaWYgb3B0aW9ucy53b3JrZXJfbW9kZWwgaW4g
KCd0aHJlYWRzJywgJ3Byb2Nlc3NlcycpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcign
LS13b3JrZXItbW9kZWw9JXMgbm90IHN1cHBvcnRlZCB5ZXQnICUgb3B0aW9ucy53b3JrZXJfbW9k
ZWwpCi0KICAgICAgICAgdGVzdF9ydW5uZXIuVGVzdFJ1bm5lci5fX2luaXRfXyhzZWxmLCBwb3J0
LCBvcHRpb25zLCBwcmludGVyKQogICAgICAgICBzZWxmLl9hbGxfcmVzdWx0cyA9IFtdCiAgICAg
ICAgIHNlbGYuX2dyb3VwX3N0YXRzID0ge30KZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQppbmRleCBlM2Q1ZjhlOWE0NThmMTlkMTkzMDY2ODEx
MzcxMDljOGRjZTc0ZmZlLi45Nzc5OTFjZGNlYTc1OTA0ODYxNzhiYThkMDYwODVmOTU5MTM1YWY1
IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jh
c2UucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNl
LnB5CkBAIC00NzMsNiArNDczLDEwIEBAIGNsYXNzIFBvcnQob2JqZWN0KToKICAgICAgICAgKCdj
cHUnKS4iIiIKICAgICAgICAgcmV0dXJuICdjcHUnCiAKKyAgICBkZWYgcmVhbF9uYW1lKHNlbGYp
OgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgcG9ydCwgbm90IHRo
ZSBkZWxlZ2F0ZSdzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lKCkKKwogICAgIGRlZiBn
ZXRfb3B0aW9uKHNlbGYsIG5hbWUsIGRlZmF1bHRfdmFsdWU9Tm9uZSk6CiAgICAgICAgICMgRklY
TUU6IEV2ZW50dWFsbHkgd2Ugc2hvdWxkIG5vdCBoYXZlIHRvIGRvIGEgdGVzdCBmb3IKICAgICAg
ICAgIyBoYXNhdHRyKCksIGFuZCB3ZSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IGRvCmRpZmYgLS1n
aXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21vY2tfZHJ0LnB5
IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9tb2NrX2RydC5weQpp
bmRleCAzNzAzMjdmYjAxYjU4M2MwZGQwMjU4N2U2NDNkOTc4YjE4NGViMDFlLi4xMTQ3ODQ2ZDYw
OTUwODQ0YjU1M2MwZWYwMzcwMTJjZGFjNjFmNDhkIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21vY2tfZHJ0LnB5CisrKyBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbW9ja19kcnQucHkKQEAgLTUzLDYgKzUzLDEw
IEBAIGNsYXNzIE1vY2tEUlRQb3J0KG9iamVjdCk6CiAgICAgICAgIGlmICdwb3J0X25hbWUnIGlu
IGt3YXJnczoKICAgICAgICAgICAgIGt3YXJnc1sncG9ydF9uYW1lJ10gPSBrd2FyZ3NbJ3BvcnRf
bmFtZSddW2xlbihwcmVmaXgpOl0KICAgICAgICAgc2VsZi5fX2RlbGVnYXRlID0gZmFjdG9yeS5n
ZXQoKiprd2FyZ3MpCisgICAgICAgIHNlbGYuX19yZWFsX25hbWUgPSBwcmVmaXggKyBzZWxmLl9f
ZGVsZWdhdGUubmFtZSgpCisKKyAgICBkZWYgcmVhbF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1
cm4gc2VsZi5fX3JlYWxfbmFtZQogCiAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgog
ICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fZGVsZWdhdGUsIG5hbWUpCkBAIC0yNzEsNyAr
Mjc1LDYgQEAgY2xhc3MgTW9ja0Nocm9taXVtRFJUKE1vY2tEUlQpOgogICAgICAgICBzZWxmLl9z
dGRvdXQuZmx1c2goKQogCiAKLQogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcyA9
IGZpbGVzeXN0ZW0uRmlsZVN5c3RlbSgpCiAgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0s
IGZzLCBzeXMuc3RkaW4sIHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIpKQpkaWZmIC0tZ2l0IGEvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0c191bml0dGVz
dC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVz
dHNfdW5pdHRlc3QucHkKaW5kZXggODkxNzk3ZDUwNWM0OGUxOGVjOWI0OTcxNjU5MDcyMTZjZmNl
OTFjZC4uODRmNTcxODI1NjBkZDEyYmE5OTI5OGRhZWFiYmE3ODEwOTQ5NWRlOCAxMDA2NDQKLS0t
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0c191
bml0dGVzdC5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5f
d2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5CkBAIC00NjcsMTAgKzQ2NywxMSBAQCBjbGFzcyBNYWlu
VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXNzaW5n
X3J1bihbJy0td29ya2VyLW1vZGVsJywgJ29sZC10aHJlYWRzJ10pKQogCiAgICAgZGVmIHRlc3Rf
d29ya2VyX21vZGVsX19wcm9jZXNzZXMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2Vz
KFZhbHVlRXJyb3IsIGxvZ2dpbmdfcnVuLCBbJy0td29ya2VyLW1vZGVsJywgJ3Byb2Nlc3Nlcydd
KQorICAgICAgICBpZiBjb21wYXJlX3ZlcnNpb24oc3lzLCAnMi42JylbMF0gPj0gMDoKKyAgICAg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXNzaW5nX3J1bihbJy0td29ya2VyLW1vZGVsJywgJ3By
b2Nlc3NlcyddKSkKIAogICAgIGRlZiB0ZXN0X3dvcmtlcl9tb2RlbF9fdGhyZWFkcyhzZWxmKToK
LSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9nZ2luZ19ydW4sIFsnLS13
b3JrZXItbW9kZWwnLCAndGhyZWFkcyddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGFzc2lu
Z19ydW4oWyctLXdvcmtlci1tb2RlbCcsICd0aHJlYWRzJ10pKQogCiAgICAgZGVmIHRlc3Rfd29y
a2VyX21vZGVsX191bmtub3duKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1
ZUVycm9yLCBsb2dnaW5nX3J1biwK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82167</attachid>
            <date>2011-02-11 13:35:09 -0800</date>
            <delta_ts>2011-02-11 16:51:53 -0800</delta_ts>
            <desc>update w/ review feedback from tony, mihai, merge in changes from 54068</desc>
            <filename>bug-54070-20110211133508.patch</filename>
            <type>text/plain</type>
            <size>16512</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogNzgzMDIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCBiNWJhNDMzN2ZlY2RlMTZmZGVlNWQ1NTU4ZDJhYTlkY2Qy
NjZmZmFkLi44ZTdhOWMwOTc5ZjY3M2ZlNWFmODQwM2EwYjUyYjYwMTM2MmQwNjgzIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEg
QEAKKzIwMTEtMDItMTEgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBh
ZGRzIHRvIE5SV1QgbW9zdCBvZiB0aGUgc3VwcG9ydCBuZWVkZWQgdG8gcnVuIHRoZSBuZXcKKyAg
ICAgICAgbWVzc2FnZS1iYXNlZCB3b3JrZXJzIGluIHNlcGFyYXRlIHRocmVhZHMgb3IgcHJvY2Vz
c2VzLiBUaGUgY29kZQorICAgICAgICBpc24ndCBmdWxseSBjb21wbGV0ZSB5ZXQgYmVjYXVzZSB3
ZSBkb24ndCBzdXBwb3J0IGNhbmNlbCgpIG9yCisgICAgICAgIGlzX2FsaXZlKCkuCisKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MDcwCisKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2Vy
X3dvcmtlcl9icm9rZXIucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3Rf
cnVubmVyMi5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L2Jhc2UucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9t
b2NrX2RydC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5f
d2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5OgorCiAyMDExLTAyLTEwICBEaXJrIFByYW5rZSAgPGRw
cmFua2VAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvbnkgQ2hhbmcuCmRp
ZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkKaW5kZXgg
YzQ3ZTlkN2RjNmViM2QzYTU1NmI1ODhiYzA1MzhlZWQ2ZmE3MTY5ZC4uMWJmNmY2NzNmNDAyY2M3
Y2JmNzk1N2Y0ZTJlNjdhMjlmYmUyNjQwNCAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyLnB5
CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L21hbmFnZXJfd29ya2VyX2Jyb2tlci5weQpAQCAtNDYsMTUgKzQ2LDI0IEBAIFRlc3RSdW5uZXIy
ICAtLT4gX0lubGluZU1hbmFnZXIgLS0tPiBfSW5saW5lV29ya2VyIDwtPiBXb3JrZXIKIGltcG9y
dCBsb2dnaW5nCiBpbXBvcnQgb3B0cGFyc2UKIGltcG9ydCBRdWV1ZQoraW1wb3J0IHRocmVhZAog
aW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKKwogCiAjIEhhbmRsZSBQeXRob24gPCAyLjYg
d2hlcmUgbXVsdGlwcm9jZXNzaW5nIGlzbid0IGF2YWlsYWJsZS4KKyMKKyMgX011bHRpcHJvY2Vz
c2luZ19Qcm9jZXNzIGlzIG5lZWRlZCBzbyB0aGF0IF9NdWx0aVByb2Nlc3NXb3JrZXIKKyMgY2Fu
IGJlIGRlZmluZWQgd2l0aCBvciB3aXRob3V0IG11bHRpcHJvY2Vzc2luZy4KIHRyeToKICAgICBp
bXBvcnQgbXVsdGlwcm9jZXNzaW5nCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gbXVs
dGlwcm9jZXNzaW5nLlByb2Nlc3MKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBtdWx0aXByb2Nl
c3NpbmcgPSBOb25lCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gdGhyZWFkaW5nLlRo
cmVhZAogCiAKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzIGltcG9ydCBwb3J0CiBmcm9tIHdl
YmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZSBpbXBvcnQgbWVzc2FnZV9icm9rZXIy
CiAKIApAQCAtMTY0LDggKzE3Myw4IEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29u
bmVjdGlvbik6CiAgICAgICAgIHNlbGYuX2lubGluZV93b3JrZXIgPSBOb25lCiAKICAgICBkZWYg
c3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgotICAgICAgICBzZWxmLl9pbmxpbmVf
d29ya2VyID0gX0lubGluZVdvcmtlcihzZWxmLl9icm9rZXIsIHNlbGYuX3BvcnQsIHNlbGYuX2Ns
aWVudCwKLSAgICAgICAgICAgIHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlcikKKyAg
ICAgICAgc2VsZi5faW5saW5lX3dvcmtlciA9IF9JbmxpbmVXb3JrZXJDb25uZWN0aW9uKHNlbGYu
X2Jyb2tlciwgc2VsZi5fcG9ydCwKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudCwgc2VsZi5fd29y
a2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQogICAgICAgICByZXR1cm4gc2VsZi5faW5saW5lX3dv
cmtlcgogCiAgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2VsZiwgZGVsYXlfc2Vjcz1Ob25lKToK
QEAgLTE3NywxMiArMTg2LDMwIEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVj
dGlvbik6CiAKIGNsYXNzIF9UaHJlYWRlZE1hbmFnZXIoX01hbmFnZXJDb25uZWN0aW9uKToKICAg
ICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwb3J0LCBvcHRpb25zLCBjbGllbnQsIHdvcmtl
cl9jbGFzcyk6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgX01h
bmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0aW9ucywgY2xpZW50LCB3
b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CisKKyAgICBkZWYgc3RhcnRf
d29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9
IF9UaHJlYWRlZFdvcmtlckNvbm5lY3Rpb24oc2VsZi5fYnJva2VyLCBzZWxmLl9wb3J0LAorICAg
ICAgICAgICAgc2VsZi5fd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQorICAgICAgICB3b3Jr
ZXJfY29ubmVjdGlvbi5zdGFydCgpCisgICAgICAgIHJldHVybiB3b3JrZXJfY29ubmVjdGlvbgog
CiAKIGNsYXNzIF9NdWx0aVByb2Nlc3NNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVjdGlvbik6CiAgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgcG9ydCwgb3B0aW9ucywgY2xpZW50LCB3b3JrZXJf
Y2xhc3MpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICAgICMgTm90
ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3Qga2VlcCBhIGhhbmRsZSB0byB0aGUgYWN0dWFsIHBv
cnQKKyAgICAgICAgIyBvYmplY3QsIGJlY2F1c2UgaXQgaXNuJ3QgUGlja2xhYmxlLiBJbnN0ZWFk
IGl0IGtlZXBzIHRoZSBwb3J0CisgICAgICAgICMgbmFtZSBhbmQgcmVjcmVhdGVzIHRoZSBwb3J0
IGluIHRoZSBjaGlsZCBwcm9jZXNzIGZyb20gdGhlIG5hbWUKKyAgICAgICAgIyBhbmQgb3B0aW9u
cy4KKyAgICAgICAgX01hbmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0
aW9ucywgY2xpZW50LCB3b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BsYXRmb3JtX25hbWUg
PSBwb3J0LnJlYWxfbmFtZSgpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9IF9NdWx0aVByb2Nlc3NXb3JrZXJD
b25uZWN0aW9uKHNlbGYuX2Jyb2tlciwgc2VsZi5fcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAg
IHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgc2VsZi5fb3B0aW9ucykKKyAgICAg
ICAgd29ya2VyX2Nvbm5lY3Rpb24uc3RhcnQoKQorICAgICAgICByZXR1cm4gd29ya2VyX2Nvbm5l
Y3Rpb24KIAogCiBjbGFzcyBfV29ya2VyQ29ubmVjdGlvbihtZXNzYWdlX2Jyb2tlcjIuQnJva2Vy
Q29ubmVjdGlvbik6CkBAIC0xOTIsNiArMjE5LDkgQEAgY2xhc3MgX1dvcmtlckNvbm5lY3Rpb24o
bWVzc2FnZV9icm9rZXIyLkJyb2tlckNvbm5lY3Rpb24pOgogICAgICAgICBtZXNzYWdlX2Jyb2tl
cjIuQnJva2VyQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBicm9rZXIsIHNlbGYuX2NsaWVudCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZX1dP
UktFUl9UT1BJQywgTUFOQUdFUl9UT1BJQykKIAorICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCiAgICAgZGVmIHJ1bihzZWxmKToKICAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogCkBAIC0xOTksNyArMjI5LDcgQEAgY2xhc3Mg
X1dvcmtlckNvbm5lY3Rpb24obWVzc2FnZV9icm9rZXIyLkJyb2tlckNvbm5lY3Rpb24pOgogICAg
ICAgICBwYXNzCiAKIAotY2xhc3MgX0lubGluZVdvcmtlcihfV29ya2VyQ29ubmVjdGlvbik6Citj
bGFzcyBfSW5saW5lV29ya2VyQ29ubmVjdGlvbihfV29ya2VyQ29ubmVjdGlvbik6CiAgICAgZGVm
IF9faW5pdF9fKHNlbGYsIGJyb2tlciwgcG9ydCwgbWFuYWdlcl9jbGllbnQsIHdvcmtlcl9jbGFz
cywgd29ya2VyX251bWJlcik6CiAgICAgICAgIF9Xb3JrZXJDb25uZWN0aW9uLl9faW5pdF9fKHNl
bGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyLCBwb3J0Ll9vcHRpb25zKQog
ICAgICAgICBzZWxmLl9wb3J0ID0gcG9ydApAQCAtMjEwLDMgKzI0MCwzMSBAQCBjbGFzcyBfSW5s
aW5lV29ya2VyKF9Xb3JrZXJDb25uZWN0aW9uKToKIAogICAgIGRlZiB5aWVsZF90b19icm9rZXIo
c2VsZik6CiAgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fYWxsX3BlbmRpbmcoTUFOQUdFUl9UT1BJ
Qywgc2VsZi5fbWFuYWdlcl9jbGllbnQpCisKKworY2xhc3MgX1RocmVhZGVkV29ya2VyQ29ubmVj
dGlvbih0aHJlYWRpbmcuVGhyZWFkLCBfV29ya2VyQ29ubmVjdGlvbik6CisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIGJyb2tlciwgcG9ydCwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAg
ICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBfV29ya2VyQ29u
bmVjdGlvbi5fX2luaXRfXyhzZWxmLCBicm9rZXIsIHdvcmtlcl9jbGFzcywgd29ya2VyX251bWJl
ciwgcG9ydC5fb3B0aW9ucykKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKKworICAgIGRlZiBy
dW4oc2VsZik6CisgICAgICAgICMgRklYTUU6IFdlIGNhbiByZW1vdmUgdGhpcyBvbmNlIGV2ZXJ5
b25lIGlzIG9uIDIuNi4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ2lkZW50Jyk6Cisg
ICAgICAgICAgICBzZWxmLmlkZW50ID0gdGhyZWFkLmdldF9pZGVudCgpCisgICAgICAgIHNlbGYu
X2NsaWVudC5ydW4oc2VsZi5fcG9ydCkKKworCitjbGFzcyBfTXVsdGlQcm9jZXNzV29ya2VyQ29u
bmVjdGlvbihfTXVsdGlwcm9jZXNzaW5nX1Byb2Nlc3MsIF9Xb3JrZXJDb25uZWN0aW9uKToKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwbGF0Zm9ybV9uYW1lLCB3b3JrZXJfY2xhc3Ms
IHdvcmtlcl9udW1iZXIsIG9wdGlvbnMpOgorICAgICAgICBfTXVsdGlwcm9jZXNzaW5nX1Byb2Nl
c3MuX19pbml0X18oc2VsZikKKyAgICAgICAgX1dvcmtlckNvbm5lY3Rpb24uX19pbml0X18oc2Vs
ZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIsIG9wdGlvbnMpCisgICAgICAg
IHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYuX3BsYXRmb3JtX25hbWUgPSBw
bGF0Zm9ybV9uYW1lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjIFJlLWNvbmZpZ3Vy
ZSB0aGUgbG9nZ2VyLgorICAgICAgICAjIEZJWE1FOiBmaWd1cmUgb3V0IGhvdyB0byBnZXQgYSBo
YW5kbGUgdG8gdGhlIHJpZ2h0IHN0cmVhbS4KKyAgICAgICAgbG9nZ2luZy5iYXNpY0NvbmZpZygp
CisgICAgICAgIHBvcnRfb2JqID0gcG9ydC5nZXQoc2VsZi5fcGxhdGZvcm1fbmFtZSwgc2VsZi5f
b3B0aW9ucykKKyAgICAgICAgc2VsZi5fY2xpZW50LnJ1bihwb3J0X29iaikKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFn
ZXJfd29ya2VyX2Jyb2tlcl91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlcl91bml0dGVzdC5w
eQppbmRleCAxYTQzMmQ2Yzk0MTU2NmZhMWU4YmUwMDYzMzVkNDE4MjRiOTUzYmFjLi4xMTA0MDJi
MzI1NzIwNjQwYWZjY2FhZWU4ODgxMDU0ZjI0ZWY4ODBjIDEwMDY0NAotLS0gYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9i
cm9rZXJfdW5pdHRlc3QucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5CkBAIC0y
Nyw2ICsyNyw3IEBACiAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKIGltcG9ydCBvcHRwYXJzZQoraW1wb3J0IFF1
ZXVlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIApAQCAtNDMsOCArNDQsMzggQEAgZnJv
bSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UgaW1wb3J0IG1hbmFnZXJfd29y
a2VyX2Jyb2tlcgogZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UgaW1w
b3J0IG1lc3NhZ2VfYnJva2VyMgogCiAKLWNsYXNzIFRlc3RXb3JrZXIob2JqZWN0KToKLSAgICBw
YXNzCitjbGFzcyBUZXN0V29ya2VyKG1hbmFnZXJfd29ya2VyX2Jyb2tlci5BYnN0cmFjdFdvcmtl
cik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlcl9jb25uZWN0aW9uLCB3b3JrZXJfbnVt
YmVyLCBvcHRpb25zKToKKyAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24gPSBicm9rZXJf
Y29ubmVjdGlvbgorICAgICAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxm
Ll93b3JrZXJfbnVtYmVyID0gd29ya2VyX251bWJlcgorICAgICAgICBzZWxmLl9uYW1lID0gJ1Rl
c3RXb3JrZXIvJWQnICUgd29ya2VyX251bWJlcgorICAgICAgICBzZWxmLl9zdG9wcGVkID0gRmFs
c2UKKworICAgIGRlZiBoYW5kbGVfc3RvcChzZWxmLCBzcmMpOgorICAgICAgICBzZWxmLl9zdG9w
cGVkID0gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5faW50LCBhX3N0
cik6CisgICAgICAgIGFzc2VydCBhbl9pbnQgPT0gMQorICAgICAgICBhc3NlcnQgYV9zdHIgPT0g
ImhlbGxvLCB3b3JsZCIKKyAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24ucG9zdF9tZXNz
YWdlKCd0ZXN0JywgMiwgJ2hpLCBldmVyeWJvZHknKQorCisgICAgZGVmIGlzX2RvbmUoc2VsZik6
CisgICAgICAgIHJldHVybiBzZWxmLl9zdG9wcGVkCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAg
cGFzcworCisgICAgZGVmIHJ1bihzZWxmLCBwb3J0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAg
ICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24ucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgICAg
ICBzZWxmLl9icm9rZXJfY29ubmVjdGlvbi55aWVsZF90b19icm9rZXIoKQorICAgICAgICAgICAg
c2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24ucG9zdF9tZXNzYWdlKCdkb25lJykKKyAgICAgICAgZXhj
ZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlcl9jb25uZWN0aW9uLnBv
c3RfbWVzc2FnZSgnZXhjZXB0aW9uJywgKHR5cGUoZSksIHN0cihlKSwgTm9uZSkpCiAKIAogZGVm
IGdldF9vcHRpb25zKHdvcmtlcl9tb2RlbCk6CkBAIC02NSwyNCArOTYsMTM5IEBAIGNsYXNzIEZ1
bmN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUo
bWFrZV9icm9rZXIoc2VsZiwgJ2lubGluZScpIGlzIG5vdCBOb25lKQogCiAgICAgZGVmIHRlc3Rf
Z2V0X190aHJlYWRzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1l
bnRlZEVycm9yLCBtYWtlX2Jyb2tlciwgc2VsZiwgJ3RocmVhZHMnKQorICAgICAgICBzZWxmLmFz
c2VydFRydWUobWFrZV9icm9rZXIoc2VsZiwgJ3RocmVhZHMnKSBpcyBub3QgTm9uZSkKIAogICAg
IGRlZiB0ZXN0X2dldF9fcHJvY2Vzc2VzKHNlbGYpOgogICAgICAgICBpZiBtdWx0aXByb2Nlc3Np
bmc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBt
YWtlX2Jyb2tlciwgc2VsZiwgJ3Byb2Nlc3NlcycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRy
dWUobWFrZV9icm9rZXIoc2VsZiwgJ3Byb2Nlc3NlcycpIGlzIG5vdCBOb25lKQogICAgICAgICBl
bHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFrZV9icm9r
ZXIsIHNlbGYsICdwcm9jZXNzZXMnKQogCiAgICAgZGVmIHRlc3RfZ2V0X191bmtub3duKHNlbGYp
OgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYWtlX2Jyb2tlciwgc2Vs
ZiwgJ3Vua25vd24nKQogCisKK2NsYXNzIF9UZXN0c01peGluKG9iamVjdCk6CisgICAgIiIiTWl4
aW4gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc2VyaWVzIG9mIHRlc3RzIHRvIGVuZm9yY2UgdGhl
CisgICAgY29udHJhY3QgYWxsIGltcGxlbWVudGF0aW9ucyBtdXN0IGZvbGxvdy4iIiIKKworICAg
ICMKKyAgICAjIE1ldGhvZHMgdG8gaW1wbGVtZW50IHRoZSBNYW5hZ2VyIHNpZGUgb2YgdGhlIENs
aWVudEludGVyZmFjZQorICAgICMKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJu
ICdUZXN0ZXInCisKKyAgICBkZWYgaXNfZG9uZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
X2RvbmUKKworICAgICMKKyAgICAjIEhhbmRsZXJzIGZvciB0aGUgbWVzc2FnZXMgdGhlIFRlc3RX
b3JrZXIgbWF5IHNlbmQuCisgICAgIworICAgIGRlZiBoYW5kbGVfZG9uZShzZWxmLCBzcmMpOgor
ICAgICAgICBzZWxmLl9kb25lID0gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNy
YywgYW5faW50LCBhX3N0cik6CisgICAgICAgIHNlbGYuX2FuX2ludCA9IGFuX2ludAorICAgICAg
ICBzZWxmLl9hX3N0ciA9IGFfc3RyCisKKyAgICBkZWYgaGFuZGxlX2V4Y2VwdGlvbihzZWxmLCBz
cmMsIGV4Y19pbmZvKToKKyAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gZXhjX2luZm8KKyAgICAg
ICAgc2VsZi5fZG9uZSA9IFRydWUKKworICAgICMKKyAgICAjIFRlc3RpbmcgaGVscGVyIG1ldGhv
ZHMKKyAgICAjCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBO
b25lCisgICAgICAgIHNlbGYuX2Ffc3RyID0gTm9uZQorICAgICAgICBzZWxmLl9icm9rZXIgPSBO
b25lCisgICAgICAgIHNlbGYuX2RvbmUgPSBGYWxzZQorICAgICAgICBzZWxmLl9leGNlcHRpb24g
PSBOb25lCisgICAgICAgIHNlbGYuX3dvcmtlcl9tb2RlbCA9IE5vbmUKKworICAgIGRlZiBtYWtl
X2Jyb2tlcihzZWxmKToKKyAgICAgICAgc2VsZi5fYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwg
c2VsZi5fd29ya2VyX21vZGVsKQorCisgICAgIworICAgICMgQWN0dWFsIHVuaXQgdGVzdHMKKyAg
ICAjCisgICAgZGVmIHRlc3RfZG9uZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3dvcmtl
cl9tb2RlbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkK
KyAgICAgICAgd29ya2VyID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBz
ZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd0ZXN0JywgMSwgJ2hlbGxvLCB3b3JsZCcpCisgICAg
ICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ3N0b3AnKQorICAgICAgICBzZWxmLl9icm9r
ZXIucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2Rv
bmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hbl9pbnQsIDIpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYV9zdHIsICdoaSwgZXZlcnlib2R5JykKKworICAgIGRl
ZiB0ZXN0X3Vua25vd25fbWVzc2FnZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3dvcmtl
cl9tb2RlbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkK
KyAgICAgICAgd29ya2VyID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBz
ZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd1bmtub3duJykKKyAgICAgICAgc2VsZi5fYnJva2Vy
LnJ1bl9tZXNzYWdlX2xvb3AoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2Rv
bmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhjZXB0aW9uWzBdLCBWYWx1
ZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLl9leGNlcHRpb25bMV0sCisg
ICAgICAgICAgICAiVGVzdFdvcmtlci8wOiByZWNlaXZlZCBtZXNzYWdlICd1bmtub3duJyBpdCBj
b3VsZG4ndCBoYW5kbGUiKQorCisKK2NsYXNzIElubGluZUJyb2tlclRlc3RzKF9UZXN0c01peGlu
LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfVGVz
dHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSAnaW5saW5l
JworCisKK2NsYXNzIE11bHRpUHJvY2Vzc0Jyb2tlclRlc3RzKF9UZXN0c01peGluLCB1bml0dGVz
dC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5z
ZXRVcChzZWxmKQorICAgICAgICBpZiBtdWx0aXByb2Nlc3Npbmc6CisgICAgICAgICAgICBzZWxm
Ll93b3JrZXJfbW9kZWwgPSAncHJvY2Vzc2VzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAg
c2VsZi5fd29ya2VyX21vZGVsID0gTm9uZQorCisgICAgZGVmIHF1ZXVlKHNlbGYpOgorICAgICAg
ICByZXR1cm4gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKKworCitjbGFzcyBUaHJlYWRlZEJyb2tl
clRlc3RzKF9UZXN0c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNl
bGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLl93b3Jr
ZXJfbW9kZWwgPSAndGhyZWFkcycKKworCitjbGFzcyBGdW5jdGlvbnNUZXN0KHVuaXR0ZXN0LlRl
c3RDYXNlKToKICAgICBkZWYgdGVzdF9ydW50aW1lX29wdGlvbnMoc2VsZik6CiAgICAgICAgIG9w
dGlvbl9saXN0ID0gbWFuYWdlcl93b3JrZXJfYnJva2VyLnJ1bnRpbWVfb3B0aW9ucygpCiAgICAg
ICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25fbGlz
dCkKICAgICAgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFtdKQogICAgICAg
ICBzZWxmLmFzc2VydFRydWUob3B0aW9ucykKIAotIyBGSVhNRTogQWRkIGluIHVuaXQgdGVzdHMg
Zm9yIHRoZSBtYW5hZ2VycywgY292ZXJhZ2UgdGVzdHMgZm9yIHRoZSBpbnRlcmZhY2VzLgorCitj
bGFzcyBJbnRlcmZhY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZXNlIHRlc3Rz
IG1vc3RseSBleGlzdCB0byBwYWNpZnkgY292ZXJhZ2UuCisKKyAgICAjIEZJWE1FOiBUaGVyZSBt
dXN0IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGFuZCBhbHNvIHZlcmlmeQorICAgICMgdGhh
dCBjbGFzc2VzIGRvIGltcGxlbWVudCBldmVyeSBhYnN0cmFjdCBtZXRob2QgaW4gYW4gaW50ZXJm
YWNlLgorICAgIGRlZiB0ZXN0X21hbmFnZXJjb25uZWN0aW9uX2lzX2Fic3RyYWN0KHNlbGYpOgor
ICAgICAgICAjIFRlc3QgdGhhdCBhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJh
Y3QgYW5kIGhhdmUgdGhlCisgICAgICAgICMgc2lnbmF0dXJlIHdlIGV4cGVjdC4KKyAgICAgICAg
YnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwgJ2lubGluZScpCisgICAgICAgIG9iaiA9IG1hbmFn
ZXJfd29ya2VyX2Jyb2tlci5fTWFuYWdlckNvbm5lY3Rpb24oYnJva2VyLl9icm9rZXIsIE5vbmUs
IHNlbGYsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJy
b3IsIG9iai5zdGFydF93b3JrZXIsIDApCisKKyAgICBkZWYgdGVzdF93b3JrZXJjb25uZWN0aW9u
X2lzX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhbGwgdGhlIGJhc2UgY2xh
c3MgbWV0aG9kcyBhcmUgYWJzdHJhY3QgYW5kIGhhdmUgdGhlCisgICAgICAgICMgc2lnbmF0dXJl
IHdlIGV4cGVjdC4KKyAgICAgICAgYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwgJ2lubGluZScp
CisgICAgICAgIG9iaiA9IG1hbmFnZXJfd29ya2VyX2Jyb2tlci5fV29ya2VyQ29ubmVjdGlvbihi
cm9rZXIuX2Jyb2tlciwgVGVzdFdvcmtlciwgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRS
YWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLnN0YXJ0KQorICAgICAgICBzZWxmLmFzc2Vy
dFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoucnVuKQogCiAKIGlmIF9fbmFtZV9fID09
ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X3J1bm5lcjIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X3J1bm5lcjIucHkKaW5kZXggNzVi
OWRkYTc1MGU3ZWE3ZWEwMTgxNDAxMjUzY2IyMDRiMmVhMWM4MS4uZjA5N2I4M2ZhY2E2YzI1OGEz
YzljMzZlNDBhZWE5NjYyNDNjZDMzNyAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9ydW5uZXIyLnB5CisrKyBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcnVubmVy
Mi5weQpAQCAtNDUsOSArNDUsNiBAQCBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18p
CiAKIGNsYXNzIFRlc3RSdW5uZXIyKHRlc3RfcnVubmVyLlRlc3RSdW5uZXIpOgogICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBwb3J0LCBvcHRpb25zLCBwcmludGVyKToKLSAgICAgICAgaWYgb3B0aW9u
cy53b3JrZXJfbW9kZWwgaW4gKCd0aHJlYWRzJywgJ3Byb2Nlc3NlcycpOgotICAgICAgICAgICAg
cmFpc2UgVmFsdWVFcnJvcignLS13b3JrZXItbW9kZWw9JXMgbm90IHN1cHBvcnRlZCB5ZXQnICUg
b3B0aW9ucy53b3JrZXJfbW9kZWwpCi0KICAgICAgICAgdGVzdF9ydW5uZXIuVGVzdFJ1bm5lci5f
X2luaXRfXyhzZWxmLCBwb3J0LCBvcHRpb25zLCBwcmludGVyKQogICAgICAgICBzZWxmLl9hbGxf
cmVzdWx0cyA9IFtdCiAgICAgICAgIHNlbGYuX2dyb3VwX3N0YXRzID0ge30KZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQppbmRleCA4ZjNjODQw
MWVlN2I1OGE3NjY3YjJmNmFiMTMyMmViN2UzOTZhMWM2Li41ZmY0YmZmNDA0ZjBmOTVjMjUyY2Q1
MzEzZmUyZWExNDNlYzY3YjFkIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvcG9ydC9iYXNlLnB5CkBAIC00NjcsNiArNDY3LDEwIEBAIGNsYXNzIFBvcnQob2Jq
ZWN0KToKICAgICAgICAgKCdjcHUnKS4iIiIKICAgICAgICAgcmV0dXJuICdjcHUnCiAKKyAgICBk
ZWYgcmVhbF9uYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBhY3R1YWwgbmFtZSBv
ZiB0aGUgcG9ydCwgbm90IHRoZSBkZWxlZ2F0ZSdzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5u
YW1lKCkKKwogICAgIGRlZiBnZXRfb3B0aW9uKHNlbGYsIG5hbWUsIGRlZmF1bHRfdmFsdWU9Tm9u
ZSk6CiAgICAgICAgICMgRklYTUU6IEV2ZW50dWFsbHkgd2Ugc2hvdWxkIG5vdCBoYXZlIHRvIGRv
IGEgdGVzdCBmb3IKICAgICAgICAgIyBoYXNhdHRyKCksIGFuZCB3ZSBzaG91bGQgYmUgYWJsZSB0
byBqdXN0IGRvCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L21vY2tfZHJ0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC9tb2NrX2RydC5weQppbmRleCAzNzAzMjdmYjAxYjU4M2MwZGQwMjU4N2U2NDNkOTc4YjE4
NGViMDFlLi4xMTQ3ODQ2ZDYwOTUwODQ0YjU1M2MwZWYwMzcwMTJjZGFjNjFmNDhkIDEwMDY0NAot
LS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21vY2tfZHJ0LnB5
CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbW9ja19kcnQu
cHkKQEAgLTUzLDYgKzUzLDEwIEBAIGNsYXNzIE1vY2tEUlRQb3J0KG9iamVjdCk6CiAgICAgICAg
IGlmICdwb3J0X25hbWUnIGluIGt3YXJnczoKICAgICAgICAgICAgIGt3YXJnc1sncG9ydF9uYW1l
J10gPSBrd2FyZ3NbJ3BvcnRfbmFtZSddW2xlbihwcmVmaXgpOl0KICAgICAgICAgc2VsZi5fX2Rl
bGVnYXRlID0gZmFjdG9yeS5nZXQoKiprd2FyZ3MpCisgICAgICAgIHNlbGYuX19yZWFsX25hbWUg
PSBwcmVmaXggKyBzZWxmLl9fZGVsZWdhdGUubmFtZSgpCisKKyAgICBkZWYgcmVhbF9uYW1lKHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWxfbmFtZQogCiAgICAgZGVmIF9fZ2V0YXR0
cl9fKHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fZGVsZWdhdGUs
IG5hbWUpCkBAIC0yNzEsNyArMjc1LDYgQEAgY2xhc3MgTW9ja0Nocm9taXVtRFJUKE1vY2tEUlQp
OgogICAgICAgICBzZWxmLl9zdGRvdXQuZmx1c2goKQogCiAKLQogaWYgX19uYW1lX18gPT0gJ19f
bWFpbl9fJzoKICAgICBmcyA9IGZpbGVzeXN0ZW0uRmlsZVN5c3RlbSgpCiAgICAgc3lzLmV4aXQo
bWFpbihzeXMuYXJndlsxOl0sIGZzLCBzeXMuc3RkaW4sIHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIp
KQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dl
YmtpdF90ZXN0c191bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3J1bl93ZWJraXRfdGVzdHNfdW5pdHRlc3QucHkKaW5kZXggODkxNzk3ZDUwNWM0OGUxOGVj
OWI0OTcxNjU5MDcyMTZjZmNlOTFjZC4uODRmNTcxODI1NjBkZDEyYmE5OTI5OGRhZWFiYmE3ODEw
OTQ5NWRlOCAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cnVuX3dlYmtpdF90ZXN0c191bml0dGVzdC5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5CkBAIC00NjcsMTAgKzQ2
NywxMSBAQCBjbGFzcyBNYWluVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIHNlbGYu
YXNzZXJ0VHJ1ZShwYXNzaW5nX3J1bihbJy0td29ya2VyLW1vZGVsJywgJ29sZC10aHJlYWRzJ10p
KQogCiAgICAgZGVmIHRlc3Rfd29ya2VyX21vZGVsX19wcm9jZXNzZXMoc2VsZik6Ci0gICAgICAg
IHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvZ2dpbmdfcnVuLCBbJy0td29ya2VyLW1v
ZGVsJywgJ3Byb2Nlc3NlcyddKQorICAgICAgICBpZiBjb21wYXJlX3ZlcnNpb24oc3lzLCAnMi42
JylbMF0gPj0gMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXNzaW5nX3J1bihbJy0t
d29ya2VyLW1vZGVsJywgJ3Byb2Nlc3NlcyddKSkKIAogICAgIGRlZiB0ZXN0X3dvcmtlcl9tb2Rl
bF9fdGhyZWFkcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwg
bG9nZ2luZ19ydW4sIFsnLS13b3JrZXItbW9kZWwnLCAndGhyZWFkcyddKQorICAgICAgICBzZWxm
LmFzc2VydFRydWUocGFzc2luZ19ydW4oWyctLXdvcmtlci1tb2RlbCcsICd0aHJlYWRzJ10pKQog
CiAgICAgZGVmIHRlc3Rfd29ya2VyX21vZGVsX191bmtub3duKHNlbGYpOgogICAgICAgICBzZWxm
LmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb2dnaW5nX3J1biwK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82208</attachid>
            <date>2011-02-11 16:51:56 -0800</date>
            <delta_ts>2011-02-11 17:14:11 -0800</delta_ts>
            <desc>delegate to objects for concurrency in *WorkerConnection rather than mixing them in</desc>
            <filename>bug-54070-20110211165155.patch</filename>
            <type>text/plain</type>
            <size>16508</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogNzgzMDIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCBiNWJhNDMzN2ZlY2RlMTZmZGVlNWQ1NTU4ZDJhYTlkY2Qy
NjZmZmFkLi44ZTdhOWMwOTc5ZjY3M2ZlNWFmODQwM2EwYjUyYjYwMTM2MmQwNjgzIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEg
QEAKKzIwMTEtMDItMTEgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBh
ZGRzIHRvIE5SV1QgbW9zdCBvZiB0aGUgc3VwcG9ydCBuZWVkZWQgdG8gcnVuIHRoZSBuZXcKKyAg
ICAgICAgbWVzc2FnZS1iYXNlZCB3b3JrZXJzIGluIHNlcGFyYXRlIHRocmVhZHMgb3IgcHJvY2Vz
c2VzLiBUaGUgY29kZQorICAgICAgICBpc24ndCBmdWxseSBjb21wbGV0ZSB5ZXQgYmVjYXVzZSB3
ZSBkb24ndCBzdXBwb3J0IGNhbmNlbCgpIG9yCisgICAgICAgIGlzX2FsaXZlKCkuCisKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MDcwCisKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2Vy
X3dvcmtlcl9icm9rZXIucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3Rf
cnVubmVyMi5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L2Jhc2UucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9t
b2NrX2RydC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5f
d2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5OgorCiAyMDExLTAyLTEwICBEaXJrIFByYW5rZSAgPGRw
cmFua2VAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvbnkgQ2hhbmcuCmRp
ZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkKaW5kZXgg
YzQ3ZTlkN2RjNmViM2QzYTU1NmI1ODhiYzA1MzhlZWQ2ZmE3MTY5ZC4uNjBmNDAyNWNlMGU5OTJl
NmEwODAxNDFjNDMwYjA0NzIyNGViYjAxMiAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyLnB5
CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L21hbmFnZXJfd29ya2VyX2Jyb2tlci5weQpAQCAtNDYsMTUgKzQ2LDI0IEBAIFRlc3RSdW5uZXIy
ICAtLT4gX0lubGluZU1hbmFnZXIgLS0tPiBfSW5saW5lV29ya2VyIDwtPiBXb3JrZXIKIGltcG9y
dCBsb2dnaW5nCiBpbXBvcnQgb3B0cGFyc2UKIGltcG9ydCBRdWV1ZQoraW1wb3J0IHRocmVhZAog
aW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKKwogCiAjIEhhbmRsZSBQeXRob24gPCAyLjYg
d2hlcmUgbXVsdGlwcm9jZXNzaW5nIGlzbid0IGF2YWlsYWJsZS4KKyMKKyMgX011bHRpcHJvY2Vz
c2luZ19Qcm9jZXNzIGlzIG5lZWRlZCBzbyB0aGF0IF9NdWx0aVByb2Nlc3NXb3JrZXIKKyMgY2Fu
IGJlIGRlZmluZWQgd2l0aCBvciB3aXRob3V0IG11bHRpcHJvY2Vzc2luZy4KIHRyeToKICAgICBp
bXBvcnQgbXVsdGlwcm9jZXNzaW5nCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gbXVs
dGlwcm9jZXNzaW5nLlByb2Nlc3MKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBtdWx0aXByb2Nl
c3NpbmcgPSBOb25lCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gdGhyZWFkaW5nLlRo
cmVhZAogCiAKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzIGltcG9ydCBwb3J0CiBmcm9tIHdl
YmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZSBpbXBvcnQgbWVzc2FnZV9icm9rZXIy
CiAKIApAQCAtMTY0LDggKzE3Myw4IEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29u
bmVjdGlvbik6CiAgICAgICAgIHNlbGYuX2lubGluZV93b3JrZXIgPSBOb25lCiAKICAgICBkZWYg
c3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgotICAgICAgICBzZWxmLl9pbmxpbmVf
d29ya2VyID0gX0lubGluZVdvcmtlcihzZWxmLl9icm9rZXIsIHNlbGYuX3BvcnQsIHNlbGYuX2Ns
aWVudCwKLSAgICAgICAgICAgIHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlcikKKyAg
ICAgICAgc2VsZi5faW5saW5lX3dvcmtlciA9IF9JbmxpbmVXb3JrZXJDb25uZWN0aW9uKHNlbGYu
X2Jyb2tlciwgc2VsZi5fcG9ydCwKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudCwgc2VsZi5fd29y
a2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQogICAgICAgICByZXR1cm4gc2VsZi5faW5saW5lX3dv
cmtlcgogCiAgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2VsZiwgZGVsYXlfc2Vjcz1Ob25lKToK
QEAgLTE3NywxMiArMTg2LDMwIEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVj
dGlvbik6CiAKIGNsYXNzIF9UaHJlYWRlZE1hbmFnZXIoX01hbmFnZXJDb25uZWN0aW9uKToKICAg
ICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwb3J0LCBvcHRpb25zLCBjbGllbnQsIHdvcmtl
cl9jbGFzcyk6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgX01h
bmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0aW9ucywgY2xpZW50LCB3
b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CisKKyAgICBkZWYgc3RhcnRf
d29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9
IF9UaHJlYWRlZFdvcmtlckNvbm5lY3Rpb24oc2VsZi5fYnJva2VyLCBzZWxmLl9wb3J0LAorICAg
ICAgICAgICAgc2VsZi5fd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQorICAgICAgICB3b3Jr
ZXJfY29ubmVjdGlvbi5zdGFydCgpCisgICAgICAgIHJldHVybiB3b3JrZXJfY29ubmVjdGlvbgog
CiAKIGNsYXNzIF9NdWx0aVByb2Nlc3NNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVjdGlvbik6CiAgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgcG9ydCwgb3B0aW9ucywgY2xpZW50LCB3b3JrZXJf
Y2xhc3MpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICAgICMgTm90
ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3Qga2VlcCBhIGhhbmRsZSB0byB0aGUgYWN0dWFsIHBv
cnQKKyAgICAgICAgIyBvYmplY3QsIGJlY2F1c2UgaXQgaXNuJ3QgUGlja2xhYmxlLiBJbnN0ZWFk
IGl0IGtlZXBzIHRoZSBwb3J0CisgICAgICAgICMgbmFtZSBhbmQgcmVjcmVhdGVzIHRoZSBwb3J0
IGluIHRoZSBjaGlsZCBwcm9jZXNzIGZyb20gdGhlIG5hbWUKKyAgICAgICAgIyBhbmQgb3B0aW9u
cy4KKyAgICAgICAgX01hbmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0
aW9ucywgY2xpZW50LCB3b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BsYXRmb3JtX25hbWUg
PSBwb3J0LnJlYWxfbmFtZSgpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9IF9NdWx0aVByb2Nlc3NXb3JrZXJD
b25uZWN0aW9uKHNlbGYuX2Jyb2tlciwgc2VsZi5fcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAg
IHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgc2VsZi5fb3B0aW9ucykKKyAgICAg
ICAgd29ya2VyX2Nvbm5lY3Rpb24uc3RhcnQoKQorICAgICAgICByZXR1cm4gd29ya2VyX2Nvbm5l
Y3Rpb24KIAogCiBjbGFzcyBfV29ya2VyQ29ubmVjdGlvbihtZXNzYWdlX2Jyb2tlcjIuQnJva2Vy
Q29ubmVjdGlvbik6CkBAIC0xOTIsMTQgKzIxOSwxMSBAQCBjbGFzcyBfV29ya2VyQ29ubmVjdGlv
bihtZXNzYWdlX2Jyb2tlcjIuQnJva2VyQ29ubmVjdGlvbik6CiAgICAgICAgIG1lc3NhZ2VfYnJv
a2VyMi5Ccm9rZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgc2VsZi5fY2xpZW50
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllf
V09SS0VSX1RPUElDLCBNQU5BR0VSX1RPUElDKQogCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCiAgICAgZGVmIHlpZWxkX3RvX2Jyb2tlcihz
ZWxmKToKICAgICAgICAgcGFzcwogCiAKLWNsYXNzIF9JbmxpbmVXb3JrZXIoX1dvcmtlckNvbm5l
Y3Rpb24pOgorY2xhc3MgX0lubGluZVdvcmtlckNvbm5lY3Rpb24oX1dvcmtlckNvbm5lY3Rpb24p
OgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHBvcnQsIG1hbmFnZXJfY2xpZW50LCB3
b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIpOgogICAgICAgICBfV29ya2VyQ29ubmVjdGlvbi5f
X2luaXRfXyhzZWxmLCBicm9rZXIsIHdvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgcG9ydC5f
b3B0aW9ucykKICAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKQEAgLTIxMCwzICsyMzQsNDYgQEAg
Y2xhc3MgX0lubGluZVdvcmtlcihfV29ya2VyQ29ubmVjdGlvbik6CiAKICAgICBkZWYgeWllbGRf
dG9fYnJva2VyKHNlbGYpOgogICAgICAgICBzZWxmLl9icm9rZXIucnVuX2FsbF9wZW5kaW5nKE1B
TkFHRVJfVE9QSUMsIHNlbGYuX21hbmFnZXJfY2xpZW50KQorCisKK2NsYXNzIF9UaHJlYWRlZFdv
cmtlckNvbm5lY3Rpb24oX1dvcmtlckNvbm5lY3Rpb24pOgorICAgIGNsYXNzIF9UaHJlYWQodGhy
ZWFkaW5nLlRocmVhZCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JrZXJfY29ubmVj
dGlvbik6CisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAg
ICAgICAgICBzZWxmLl93b3JrZXJfY29ubmVjdGlvbiA9IHdvcmtlcl9jb25uZWN0aW9uCisKKyAg
ICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgICMgRklYTUU6IFdlIGNhbiByZW1vdmUg
dGhpcyBvbmNlIGV2ZXJ5b25lIGlzIG9uIDIuNi4KKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRy
KHNlbGYsICdpZGVudCcpOgorICAgICAgICAgICAgICAgIHNlbGYuaWRlbnQgPSB0aHJlYWQuZ2V0
X2lkZW50KCkKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlcl9jb25uZWN0aW9uLl9jbGllbnQucnVu
KHNlbGYuX3dvcmtlcl9jb25uZWN0aW9uLl9wb3J0KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGJyb2tlciwgcG9ydCwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgX1dv
cmtlckNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtl
cl9udW1iZXIsIHBvcnQuX29wdGlvbnMpCisgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CisgICAg
ICAgIHNlbGYuX3RocmVhZCA9IHNlbGYuX1RocmVhZChzZWxmKQorCisgICAgZGVmIHN0YXJ0KHNl
bGYpOgorICAgICAgICBzZWxmLl90aHJlYWQuc3RhcnQoKQorCisKK2NsYXNzIF9NdWx0aVByb2Nl
c3NXb3JrZXJDb25uZWN0aW9uKF9Xb3JrZXJDb25uZWN0aW9uKToKKyAgICBjbGFzcyBfUHJvY2Vz
cyhfTXVsdGlwcm9jZXNzaW5nX1Byb2Nlc3MpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwg
d29ya2VyX2Nvbm5lY3Rpb24pOgorICAgICAgICAgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNz
Ll9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICBzZWxmLl93b3JrZXJfY29ubmVjdGlvbiA9IHdv
cmtlcl9jb25uZWN0aW9uCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIGxv
Z2dpbmcuYmFzaWNDb25maWcoKQorICAgICAgICAgICAgcG9ydF9vYmogPSBwb3J0LmdldChzZWxm
Ll93b3JrZXJfY29ubmVjdGlvbi5fcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2VsZi5fd29ya2VyX2Nvbm5lY3Rpb24uX29wdGlvbnMpCisgICAgICAgICAg
ICBzZWxmLl93b3JrZXJfY29ubmVjdGlvbi5fY2xpZW50LnJ1bihwb3J0X29iaikKKworICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHBsYXRmb3JtX25hbWUsIHdvcmtlcl9jbGFzcywgd29y
a2VyX251bWJlciwgb3B0aW9ucyk6CisgICAgICAgIF9Xb3JrZXJDb25uZWN0aW9uLl9faW5pdF9f
KHNlbGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyLCBvcHRpb25zKQorICAg
ICAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLl9wbGF0Zm9ybV9uYW1l
ID0gcGxhdGZvcm1fbmFtZQorICAgICAgICBzZWxmLl9wcm9jID0gc2VsZi5fUHJvY2VzcyhzZWxm
KQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLl9wcm9jLnN0YXJ0KCkKZGlm
ZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNr
YWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlcl91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlcl91
bml0dGVzdC5weQppbmRleCAxYTQzMmQ2Yzk0MTU2NmZhMWU4YmUwMDYzMzVkNDE4MjRiOTUzYmFj
Li5mZmJlMDgxMDU2N2FjZGJlMDUwOTk4NzgyZmJmNzk5MGJjNGYwMTNmIDEwMDY0NAotLS0gYS9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2Vy
X3dvcmtlcl9icm9rZXJfdW5pdHRlc3QucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0
LnB5CkBAIC0yNyw2ICsyNyw3IEBACiAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKIGltcG9ydCBvcHRwYXJzZQor
aW1wb3J0IFF1ZXVlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIApAQCAtNDMsOCArNDQs
MzggQEAgZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UgaW1wb3J0IG1h
bmFnZXJfd29ya2VyX2Jyb2tlcgogZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3Bh
Y2thZ2UgaW1wb3J0IG1lc3NhZ2VfYnJva2VyMgogCiAKLWNsYXNzIFRlc3RXb3JrZXIob2JqZWN0
KToKLSAgICBwYXNzCitjbGFzcyBUZXN0V29ya2VyKG1hbmFnZXJfd29ya2VyX2Jyb2tlci5BYnN0
cmFjdFdvcmtlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlcl9jb25uZWN0aW9uLCB3
b3JrZXJfbnVtYmVyLCBvcHRpb25zKToKKyAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24g
PSBicm9rZXJfY29ubmVjdGlvbgorICAgICAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAg
ICAgICBzZWxmLl93b3JrZXJfbnVtYmVyID0gd29ya2VyX251bWJlcgorICAgICAgICBzZWxmLl9u
YW1lID0gJ1Rlc3RXb3JrZXIvJWQnICUgd29ya2VyX251bWJlcgorICAgICAgICBzZWxmLl9zdG9w
cGVkID0gRmFsc2UKKworICAgIGRlZiBoYW5kbGVfc3RvcChzZWxmLCBzcmMpOgorICAgICAgICBz
ZWxmLl9zdG9wcGVkID0gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5f
aW50LCBhX3N0cik6CisgICAgICAgIGFzc2VydCBhbl9pbnQgPT0gMQorICAgICAgICBhc3NlcnQg
YV9zdHIgPT0gImhlbGxvLCB3b3JsZCIKKyAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24u
cG9zdF9tZXNzYWdlKCd0ZXN0JywgMiwgJ2hpLCBldmVyeWJvZHknKQorCisgICAgZGVmIGlzX2Rv
bmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zdG9wcGVkCisKKyAgICBkZWYgbmFtZShz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBzdGFydChzZWxmKToK
KyAgICAgICAgcGFzcworCisgICAgZGVmIHJ1bihzZWxmLCBwb3J0KToKKyAgICAgICAgdHJ5Ogor
ICAgICAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24ucnVuX21lc3NhZ2VfbG9vcCgpCisg
ICAgICAgICAgICBzZWxmLl9icm9rZXJfY29ubmVjdGlvbi55aWVsZF90b19icm9rZXIoKQorICAg
ICAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24ucG9zdF9tZXNzYWdlKCdkb25lJykKKyAg
ICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlcl9jb25u
ZWN0aW9uLnBvc3RfbWVzc2FnZSgnZXhjZXB0aW9uJywgKHR5cGUoZSksIHN0cihlKSwgTm9uZSkp
CiAKIAogZGVmIGdldF9vcHRpb25zKHdvcmtlcl9tb2RlbCk6CkBAIC02NSwyNCArOTYsMTMxIEBA
IGNsYXNzIEZ1bmN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICBzZWxmLmFz
c2VydFRydWUobWFrZV9icm9rZXIoc2VsZiwgJ2lubGluZScpIGlzIG5vdCBOb25lKQogCiAgICAg
ZGVmIHRlc3RfZ2V0X190aHJlYWRzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhO
b3RJbXBsZW1lbnRlZEVycm9yLCBtYWtlX2Jyb2tlciwgc2VsZiwgJ3RocmVhZHMnKQorICAgICAg
ICBzZWxmLmFzc2VydFRydWUobWFrZV9icm9rZXIoc2VsZiwgJ3RocmVhZHMnKSBpcyBub3QgTm9u
ZSkKIAogICAgIGRlZiB0ZXN0X2dldF9fcHJvY2Vzc2VzKHNlbGYpOgogICAgICAgICBpZiBtdWx0
aXByb2Nlc3Npbmc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRl
ZEVycm9yLCBtYWtlX2Jyb2tlciwgc2VsZiwgJ3Byb2Nlc3NlcycpCisgICAgICAgICAgICBzZWxm
LmFzc2VydFRydWUobWFrZV9icm9rZXIoc2VsZiwgJ3Byb2Nlc3NlcycpIGlzIG5vdCBOb25lKQog
ICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwg
bWFrZV9icm9rZXIsIHNlbGYsICdwcm9jZXNzZXMnKQogCiAgICAgZGVmIHRlc3RfZ2V0X191bmtu
b3duKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYWtlX2Jy
b2tlciwgc2VsZiwgJ3Vua25vd24nKQogCisKK2NsYXNzIF9UZXN0c01peGluKG9iamVjdCk6Cisg
ICAgIiIiTWl4aW4gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc2VyaWVzIG9mIHRlc3RzIHRvIGVu
Zm9yY2UgdGhlCisgICAgY29udHJhY3QgYWxsIGltcGxlbWVudGF0aW9ucyBtdXN0IGZvbGxvdy4i
IiIKKworICAgICMKKyAgICAjIE1ldGhvZHMgdG8gaW1wbGVtZW50IHRoZSBNYW5hZ2VyIHNpZGUg
b2YgdGhlIENsaWVudEludGVyZmFjZQorICAgICMKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAg
ICAgcmV0dXJuICdUZXN0ZXInCisKKyAgICBkZWYgaXNfZG9uZShzZWxmKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuX2RvbmUKKworICAgICMKKyAgICAjIEhhbmRsZXJzIGZvciB0aGUgbWVzc2FnZXMg
dGhlIFRlc3RXb3JrZXIgbWF5IHNlbmQuCisgICAgIworICAgIGRlZiBoYW5kbGVfZG9uZShzZWxm
LCBzcmMpOgorICAgICAgICBzZWxmLl9kb25lID0gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0
KHNlbGYsIHNyYywgYW5faW50LCBhX3N0cik6CisgICAgICAgIHNlbGYuX2FuX2ludCA9IGFuX2lu
dAorICAgICAgICBzZWxmLl9hX3N0ciA9IGFfc3RyCisKKyAgICBkZWYgaGFuZGxlX2V4Y2VwdGlv
bihzZWxmLCBzcmMsIGV4Y19pbmZvKToKKyAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gZXhjX2lu
Zm8KKyAgICAgICAgc2VsZi5fZG9uZSA9IFRydWUKKworICAgICMKKyAgICAjIFRlc3RpbmcgaGVs
cGVyIG1ldGhvZHMKKyAgICAjCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9h
bl9pbnQgPSBOb25lCisgICAgICAgIHNlbGYuX2Ffc3RyID0gTm9uZQorICAgICAgICBzZWxmLl9i
cm9rZXIgPSBOb25lCisgICAgICAgIHNlbGYuX2RvbmUgPSBGYWxzZQorICAgICAgICBzZWxmLl9l
eGNlcHRpb24gPSBOb25lCisgICAgICAgIHNlbGYuX3dvcmtlcl9tb2RlbCA9IE5vbmUKKworICAg
IGRlZiBtYWtlX2Jyb2tlcihzZWxmKToKKyAgICAgICAgc2VsZi5fYnJva2VyID0gbWFrZV9icm9r
ZXIoc2VsZiwgc2VsZi5fd29ya2VyX21vZGVsKQorCisgICAgIworICAgICMgQWN0dWFsIHVuaXQg
dGVzdHMKKyAgICAjCisgICAgZGVmIHRlc3RfZG9uZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNl
bGYuX3dvcmtlcl9tb2RlbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm1ha2Vf
YnJva2VyKCkKKyAgICAgICAgd29ya2VyID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQor
ICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd0ZXN0JywgMSwgJ2hlbGxvLCB3b3Js
ZCcpCisgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ3N0b3AnKQorICAgICAgICBz
ZWxmLl9icm9rZXIucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShz
ZWxmLmlzX2RvbmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hbl9pbnQsIDIp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYV9zdHIsICdoaSwgZXZlcnlib2R5JykK
KworICAgIGRlZiB0ZXN0X3Vua25vd25fbWVzc2FnZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNl
bGYuX3dvcmtlcl9tb2RlbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm1ha2Vf
YnJva2VyKCkKKyAgICAgICAgd29ya2VyID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQor
ICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd1bmtub3duJykKKyAgICAgICAgc2Vs
Zi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShz
ZWxmLmlzX2RvbmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhjZXB0aW9u
WzBdLCBWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLl9leGNlcHRp
b25bMV0sCisgICAgICAgICAgICAiVGVzdFdvcmtlci8wOiByZWNlaXZlZCBtZXNzYWdlICd1bmtu
b3duJyBpdCBjb3VsZG4ndCBoYW5kbGUiKQorCisKK2NsYXNzIElubGluZUJyb2tlclRlc3RzKF9U
ZXN0c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAg
ICAgICBfVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwg
PSAnaW5saW5lJworCisKK2NsYXNzIE11bHRpUHJvY2Vzc0Jyb2tlclRlc3RzKF9UZXN0c01peGlu
LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfVGVz
dHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBpZiBtdWx0aXByb2Nlc3Npbmc6CisgICAgICAg
ICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSAncHJvY2Vzc2VzJworICAgICAgICBlbHNlOgorICAg
ICAgICAgICAgc2VsZi5fd29ya2VyX21vZGVsID0gTm9uZQorCisgICAgZGVmIHF1ZXVlKHNlbGYp
OgorICAgICAgICByZXR1cm4gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKKworCitjbGFzcyBUaHJl
YWRlZEJyb2tlclRlc3RzKF9UZXN0c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVm
IHNldFVwKHNlbGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBz
ZWxmLl93b3JrZXJfbW9kZWwgPSAndGhyZWFkcycKKworCitjbGFzcyBGdW5jdGlvbnNUZXN0KHVu
aXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9ydW50aW1lX29wdGlvbnMoc2VsZik6CiAg
ICAgICAgIG9wdGlvbl9saXN0ID0gbWFuYWdlcl93b3JrZXJfYnJva2VyLnJ1bnRpbWVfb3B0aW9u
cygpCiAgICAgICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1v
cHRpb25fbGlzdCkKICAgICAgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFtd
KQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0aW9ucykKIAotIyBGSVhNRTogQWRkIGluIHVu
aXQgdGVzdHMgZm9yIHRoZSBtYW5hZ2VycywgY292ZXJhZ2UgdGVzdHMgZm9yIHRoZSBpbnRlcmZh
Y2VzLgorCitjbGFzcyBJbnRlcmZhY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRo
ZXNlIHRlc3RzIG1vc3RseSBleGlzdCB0byBwYWNpZnkgY292ZXJhZ2UuCisKKyAgICAjIEZJWE1F
OiBUaGVyZSBtdXN0IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGFuZCBhbHNvIHZlcmlmeQor
ICAgICMgdGhhdCBjbGFzc2VzIGRvIGltcGxlbWVudCBldmVyeSBhYnN0cmFjdCBtZXRob2QgaW4g
YW4gaW50ZXJmYWNlLgorICAgIGRlZiB0ZXN0X21hbmFnZXJjb25uZWN0aW9uX2lzX2Fic3RyYWN0
KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kcyBh
cmUgYWJzdHJhY3QgYW5kIGhhdmUgdGhlCisgICAgICAgICMgc2lnbmF0dXJlIHdlIGV4cGVjdC4K
KyAgICAgICAgYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwgJ2lubGluZScpCisgICAgICAgIG9i
aiA9IG1hbmFnZXJfd29ya2VyX2Jyb2tlci5fTWFuYWdlckNvbm5lY3Rpb24oYnJva2VyLl9icm9r
ZXIsIE5vbmUsIHNlbGYsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxl
bWVudGVkRXJyb3IsIG9iai5zdGFydF93b3JrZXIsIDApCiAKIAogaWYgX19uYW1lX18gPT0gJ19f
bWFpbl9fJzoKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L2xheW91dF9wYWNrYWdlL3Rlc3RfcnVubmVyMi5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcnVubmVyMi5weQppbmRleCA3NWI5ZGRh
NzUwZTdlYTdlYTAxODE0MDEyNTNjYjIwNGIyZWExYzgxLi5mMDk3YjgzZmFjYTZjMjU4YTNjOWMz
NmU0MGFlYTk2NjI0M2NkMzM3IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X3J1bm5lcjIucHkKKysrIGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9ydW5uZXIyLnB5
CkBAIC00NSw5ICs0NSw2IEBAIF9sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAog
Y2xhc3MgVGVzdFJ1bm5lcjIodGVzdF9ydW5uZXIuVGVzdFJ1bm5lcik6CiAgICAgZGVmIF9faW5p
dF9fKHNlbGYsIHBvcnQsIG9wdGlvbnMsIHByaW50ZXIpOgotICAgICAgICBpZiBvcHRpb25zLndv
cmtlcl9tb2RlbCBpbiAoJ3RocmVhZHMnLCAncHJvY2Vzc2VzJyk6Ci0gICAgICAgICAgICByYWlz
ZSBWYWx1ZUVycm9yKCctLXdvcmtlci1tb2RlbD0lcyBub3Qgc3VwcG9ydGVkIHlldCcgJSBvcHRp
b25zLndvcmtlcl9tb2RlbCkKLQogICAgICAgICB0ZXN0X3J1bm5lci5UZXN0UnVubmVyLl9faW5p
dF9fKHNlbGYsIHBvcnQsIG9wdGlvbnMsIHByaW50ZXIpCiAgICAgICAgIHNlbGYuX2FsbF9yZXN1
bHRzID0gW10KICAgICAgICAgc2VsZi5fZ3JvdXBfc3RhdHMgPSB7fQpkaWZmIC0tZ2l0IGEvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5IGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CmluZGV4IDhmM2M4NDAxZWU3
YjU4YTc2NjdiMmY2YWIxMzIyZWI3ZTM5NmExYzYuLjVmZjRiZmY0MDRmMGY5NWMyNTJjZDUzMTNm
ZTJlYTE0M2VjNjdiMWQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3BvcnQvYmFzZS5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9wb3J0L2Jhc2UucHkKQEAgLTQ2Nyw2ICs0NjcsMTAgQEAgY2xhc3MgUG9ydChvYmplY3Qp
OgogICAgICAgICAoJ2NwdScpLiIiIgogICAgICAgICByZXR1cm4gJ2NwdScKIAorICAgIGRlZiBy
ZWFsX25hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIGFjdHVhbCBuYW1lIG9mIHRo
ZSBwb3J0LCBub3QgdGhlIGRlbGVnYXRlJ3MuIiIiCisgICAgICAgIHJldHVybiBzZWxmLm5hbWUo
KQorCiAgICAgZGVmIGdldF9vcHRpb24oc2VsZiwgbmFtZSwgZGVmYXVsdF92YWx1ZT1Ob25lKToK
ICAgICAgICAgIyBGSVhNRTogRXZlbnR1YWxseSB3ZSBzaG91bGQgbm90IGhhdmUgdG8gZG8gYSB0
ZXN0IGZvcgogICAgICAgICAjIGhhc2F0dHIoKSwgYW5kIHdlIHNob3VsZCBiZSBhYmxlIHRvIGp1
c3QgZG8KZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvbW9ja19kcnQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L21vY2tfZHJ0LnB5CmluZGV4IDM3MDMyN2ZiMDFiNTgzYzBkZDAyNTg3ZTY0M2Q5NzhiMTg0ZWIw
MWUuLjExNDc4NDZkNjA5NTA4NDRiNTUzYzBlZjAzNzAxMmNkYWM2MWY0OGQgMTAwNjQ0Ci0tLSBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbW9ja19kcnQucHkKKysr
IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9tb2NrX2RydC5weQpA
QCAtNTMsNiArNTMsMTAgQEAgY2xhc3MgTW9ja0RSVFBvcnQob2JqZWN0KToKICAgICAgICAgaWYg
J3BvcnRfbmFtZScgaW4ga3dhcmdzOgogICAgICAgICAgICAga3dhcmdzWydwb3J0X25hbWUnXSA9
IGt3YXJnc1sncG9ydF9uYW1lJ11bbGVuKHByZWZpeCk6XQogICAgICAgICBzZWxmLl9fZGVsZWdh
dGUgPSBmYWN0b3J5LmdldCgqKmt3YXJncykKKyAgICAgICAgc2VsZi5fX3JlYWxfbmFtZSA9IHBy
ZWZpeCArIHNlbGYuX19kZWxlZ2F0ZS5uYW1lKCkKKworICAgIGRlZiByZWFsX25hbWUoc2VsZik6
CisgICAgICAgIHJldHVybiBzZWxmLl9fcmVhbF9uYW1lCiAKICAgICBkZWYgX19nZXRhdHRyX18o
c2VsZiwgbmFtZSk6CiAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX19kZWxlZ2F0ZSwgbmFt
ZSkKQEAgLTI3MSw3ICsyNzUsNiBAQCBjbGFzcyBNb2NrQ2hyb21pdW1EUlQoTW9ja0RSVCk6CiAg
ICAgICAgIHNlbGYuX3N0ZG91dC5mbHVzaCgpCiAKIAotCiBpZiBfX25hbWVfXyA9PSAnX19tYWlu
X18nOgogICAgIGZzID0gZmlsZXN5c3RlbS5GaWxlU3lzdGVtKCkKICAgICBzeXMuZXhpdChtYWlu
KHN5cy5hcmd2WzE6XSwgZnMsIHN5cy5zdGRpbiwgc3lzLnN0ZG91dCwgc3lzLnN0ZGVycikpCmRp
ZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0
X3Rlc3RzX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cnVuX3dlYmtpdF90ZXN0c191bml0dGVzdC5weQppbmRleCA4OTE3OTdkNTA1YzQ4ZTE4ZWM5YjQ5
NzE2NTkwNzIxNmNmY2U5MWNkLi44NGY1NzE4MjU2MGRkMTJiYTk5Mjk4ZGFlYWJiYTc4MTA5NDk1
ZGU4IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5f
d2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHNfdW5pdHRlc3QucHkKQEAgLTQ2NywxMCArNDY3LDEx
IEBAIGNsYXNzIE1haW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgc2VsZi5hc3Nl
cnRUcnVlKHBhc3NpbmdfcnVuKFsnLS13b3JrZXItbW9kZWwnLCAnb2xkLXRocmVhZHMnXSkpCiAK
ICAgICBkZWYgdGVzdF93b3JrZXJfbW9kZWxfX3Byb2Nlc3NlcyhzZWxmKToKLSAgICAgICAgc2Vs
Zi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9nZ2luZ19ydW4sIFsnLS13b3JrZXItbW9kZWwn
LCAncHJvY2Vzc2VzJ10pCisgICAgICAgIGlmIGNvbXBhcmVfdmVyc2lvbihzeXMsICcyLjYnKVsw
XSA+PSAwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhc3NpbmdfcnVuKFsnLS13b3Jr
ZXItbW9kZWwnLCAncHJvY2Vzc2VzJ10pKQogCiAgICAgZGVmIHRlc3Rfd29ya2VyX21vZGVsX190
aHJlYWRzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb2dn
aW5nX3J1biwgWyctLXdvcmtlci1tb2RlbCcsICd0aHJlYWRzJ10pCisgICAgICAgIHNlbGYuYXNz
ZXJ0VHJ1ZShwYXNzaW5nX3J1bihbJy0td29ya2VyLW1vZGVsJywgJ3RocmVhZHMnXSkpCiAKICAg
ICBkZWYgdGVzdF93b3JrZXJfbW9kZWxfX3Vua25vd24oc2VsZik6CiAgICAgICAgIHNlbGYuYXNz
ZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvZ2dpbmdfcnVuLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82210</attachid>
            <date>2011-02-11 16:54:21 -0800</date>
            <delta_ts>2011-02-11 17:14:14 -0800</delta_ts>
            <desc>incremental diff of the prior two attachments, to show only the changes necessary to use delegates instead of mixins</desc>
            <filename>delegates_vs_mixins.diff</filename>
            <type>text/plain</type>
            <size>4378</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9w
YWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlci5weQppbmRl
eCAxYmY2ZjY3Li42MGY0MDI1IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdl
cl93b3JrZXJfYnJva2VyLnB5CkBAIC0yMTksMTIgKzIxOSw2IEBAIGNsYXNzIF9Xb3JrZXJDb25u
ZWN0aW9uKG1lc3NhZ2VfYnJva2VyMi5Ccm9rZXJDb25uZWN0aW9uKToKICAgICAgICAgbWVzc2Fn
ZV9icm9rZXIyLkJyb2tlckNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgYnJva2VyLCBzZWxmLl9j
bGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEFOWV9XT1JLRVJfVE9QSUMsIE1BTkFHRVJfVE9QSUMpCiAKLSAgICBkZWYgc3RhcnQoc2VsZik6
Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICAgIGRlZiBydW4oc2VsZik6
Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQogICAgIGRlZiB5aWVsZF90b19i
cm9rZXIoc2VsZik6CiAgICAgICAgIHBhc3MKIApAQCAtMjQyLDI5ICsyMzYsNDQgQEAgY2xhc3Mg
X0lubGluZVdvcmtlckNvbm5lY3Rpb24oX1dvcmtlckNvbm5lY3Rpb24pOgogICAgICAgICBzZWxm
Ll9icm9rZXIucnVuX2FsbF9wZW5kaW5nKE1BTkFHRVJfVE9QSUMsIHNlbGYuX21hbmFnZXJfY2xp
ZW50KQogCiAKLWNsYXNzIF9UaHJlYWRlZFdvcmtlckNvbm5lY3Rpb24odGhyZWFkaW5nLlRocmVh
ZCwgX1dvcmtlckNvbm5lY3Rpb24pOgorY2xhc3MgX1RocmVhZGVkV29ya2VyQ29ubmVjdGlvbihf
V29ya2VyQ29ubmVjdGlvbik6CisgICAgY2xhc3MgX1RocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToK
KyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmtlcl9jb25uZWN0aW9uKToKKyAgICAgICAg
ICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYuX3dv
cmtlcl9jb25uZWN0aW9uID0gd29ya2VyX2Nvbm5lY3Rpb24KKworICAgICAgICBkZWYgcnVuKHNl
bGYpOgorICAgICAgICAgICAgIyBGSVhNRTogV2UgY2FuIHJlbW92ZSB0aGlzIG9uY2UgZXZlcnlv
bmUgaXMgb24gMi42LgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ2lkZW50Jyk6
CisgICAgICAgICAgICAgICAgc2VsZi5pZGVudCA9IHRocmVhZC5nZXRfaWRlbnQoKQorICAgICAg
ICAgICAgc2VsZi5fd29ya2VyX2Nvbm5lY3Rpb24uX2NsaWVudC5ydW4oc2VsZi5fd29ya2VyX2Nv
bm5lY3Rpb24uX3BvcnQpCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwb3J0LCB3
b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIpOgotICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9f
aW5pdF9fKHNlbGYpCiAgICAgICAgIF9Xb3JrZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJy
b2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyLCBwb3J0Ll9vcHRpb25zKQogICAgICAg
ICBzZWxmLl9wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLl90aHJlYWQgPSBzZWxmLl9UaHJlYWQo
c2VsZikKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5fdGhyZWFkLnN0YXJ0
KCkKIAotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgICMgRklYTUU6IFdlIGNhbiByZW1vdmUg
dGhpcyBvbmNlIGV2ZXJ5b25lIGlzIG9uIDIuNi4KLSAgICAgICAgaWYgbm90IGhhc2F0dHIoc2Vs
ZiwgJ2lkZW50Jyk6Ci0gICAgICAgICAgICBzZWxmLmlkZW50ID0gdGhyZWFkLmdldF9pZGVudCgp
Ci0gICAgICAgIHNlbGYuX2NsaWVudC5ydW4oc2VsZi5fcG9ydCkKIAorY2xhc3MgX011bHRpUHJv
Y2Vzc1dvcmtlckNvbm5lY3Rpb24oX1dvcmtlckNvbm5lY3Rpb24pOgorICAgIGNsYXNzIF9Qcm9j
ZXNzKF9NdWx0aXByb2Nlc3NpbmdfUHJvY2Vzcyk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxm
LCB3b3JrZXJfY29ubmVjdGlvbik6CisgICAgICAgICAgICBfTXVsdGlwcm9jZXNzaW5nX1Byb2Nl
c3MuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlcl9jb25uZWN0aW9uID0g
d29ya2VyX2Nvbm5lY3Rpb24KKworICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAg
bG9nZ2luZy5iYXNpY0NvbmZpZygpCisgICAgICAgICAgICBwb3J0X29iaiA9IHBvcnQuZ2V0KHNl
bGYuX3dvcmtlcl9jb25uZWN0aW9uLl9wbGF0Zm9ybV9uYW1lLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzZWxmLl93b3JrZXJfY29ubmVjdGlvbi5fb3B0aW9ucykKKyAgICAgICAg
ICAgIHNlbGYuX3dvcmtlcl9jb25uZWN0aW9uLl9jbGllbnQucnVuKHBvcnRfb2JqKQogCi1jbGFz
cyBfTXVsdGlQcm9jZXNzV29ya2VyQ29ubmVjdGlvbihfTXVsdGlwcm9jZXNzaW5nX1Byb2Nlc3Ms
IF9Xb3JrZXJDb25uZWN0aW9uKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwbGF0
Zm9ybV9uYW1lLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIsIG9wdGlvbnMpOgotICAgICAg
ICBfTXVsdGlwcm9jZXNzaW5nX1Byb2Nlc3MuX19pbml0X18oc2VsZikKICAgICAgICAgX1dvcmtl
ckNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl9u
dW1iZXIsIG9wdGlvbnMpCiAgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCiAgICAgICAg
IHNlbGYuX3BsYXRmb3JtX25hbWUgPSBwbGF0Zm9ybV9uYW1lCisgICAgICAgIHNlbGYuX3Byb2Mg
PSBzZWxmLl9Qcm9jZXNzKHNlbGYpCiAKLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICAjIFJl
LWNvbmZpZ3VyZSB0aGUgbG9nZ2VyLgotICAgICAgICAjIEZJWE1FOiBmaWd1cmUgb3V0IGhvdyB0
byBnZXQgYSBoYW5kbGUgdG8gdGhlIHJpZ2h0IHN0cmVhbS4KLSAgICAgICAgbG9nZ2luZy5iYXNp
Y0NvbmZpZygpCi0gICAgICAgIHBvcnRfb2JqID0gcG9ydC5nZXQoc2VsZi5fcGxhdGZvcm1fbmFt
ZSwgc2VsZi5fb3B0aW9ucykKLSAgICAgICAgc2VsZi5fY2xpZW50LnJ1bihwb3J0X29iaikKKyAg
ICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3Byb2Muc3RhcnQoKQpkaWZmIC0tZ2l0
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFu
YWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0
LnB5CmluZGV4IDExMDQwMmIuLmZmYmUwODEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlcl91
bml0dGVzdC5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlv
dXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXJfdW5pdHRlc3QucHkKQEAgLTIyMiwxNCAr
MjIyLDYgQEAgY2xhc3MgSW50ZXJmYWNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAg
IG9iaiA9IG1hbmFnZXJfd29ya2VyX2Jyb2tlci5fTWFuYWdlckNvbm5lY3Rpb24oYnJva2VyLl9i
cm9rZXIsIE5vbmUsIHNlbGYsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdElt
cGxlbWVudGVkRXJyb3IsIG9iai5zdGFydF93b3JrZXIsIDApCiAKLSAgICBkZWYgdGVzdF93b3Jr
ZXJjb25uZWN0aW9uX2lzX2Fic3RyYWN0KHNlbGYpOgotICAgICAgICAjIFRlc3QgdGhhdCBhbGwg
dGhlIGJhc2UgY2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJhY3QgYW5kIGhhdmUgdGhlCi0gICAgICAg
ICMgc2lnbmF0dXJlIHdlIGV4cGVjdC4KLSAgICAgICAgYnJva2VyID0gbWFrZV9icm9rZXIoc2Vs
ZiwgJ2lubGluZScpCi0gICAgICAgIG9iaiA9IG1hbmFnZXJfd29ya2VyX2Jyb2tlci5fV29ya2Vy
Q29ubmVjdGlvbihicm9rZXIuX2Jyb2tlciwgVGVzdFdvcmtlciwgMCwgTm9uZSkKLSAgICAgICAg
c2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLnN0YXJ0KQotICAgICAg
ICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoucnVuKQotCiAKIGlm
IF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82211</attachid>
            <date>2011-02-11 17:14:16 -0800</date>
            <delta_ts>2011-02-11 17:21:11 -0800</delta_ts>
            <desc>can&apos;t pickle nested classes</desc>
            <filename>bug-54070-20110211171415.patch</filename>
            <type>text/plain</type>
            <size>16430</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogNzgzMDIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCBiNWJhNDMzN2ZlY2RlMTZmZGVlNWQ1NTU4ZDJhYTlkY2Qy
NjZmZmFkLi44ZTdhOWMwOTc5ZjY3M2ZlNWFmODQwM2EwYjUyYjYwMTM2MmQwNjgzIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEg
QEAKKzIwMTEtMDItMTEgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBh
ZGRzIHRvIE5SV1QgbW9zdCBvZiB0aGUgc3VwcG9ydCBuZWVkZWQgdG8gcnVuIHRoZSBuZXcKKyAg
ICAgICAgbWVzc2FnZS1iYXNlZCB3b3JrZXJzIGluIHNlcGFyYXRlIHRocmVhZHMgb3IgcHJvY2Vz
c2VzLiBUaGUgY29kZQorICAgICAgICBpc24ndCBmdWxseSBjb21wbGV0ZSB5ZXQgYmVjYXVzZSB3
ZSBkb24ndCBzdXBwb3J0IGNhbmNlbCgpIG9yCisgICAgICAgIGlzX2FsaXZlKCkuCisKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MDcwCisKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2Vy
X3dvcmtlcl9icm9rZXIucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3Rf
cnVubmVyMi5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L2Jhc2UucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9t
b2NrX2RydC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5f
d2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5OgorCiAyMDExLTAyLTEwICBEaXJrIFByYW5rZSAgPGRw
cmFua2VAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvbnkgQ2hhbmcuCmRp
ZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkKaW5kZXgg
YzQ3ZTlkN2RjNmViM2QzYTU1NmI1ODhiYzA1MzhlZWQ2ZmE3MTY5ZC4uNjFlZDg5M2E3YjViNDU3
ZDJiODk1M2U3MTUwOTRkYWRiMGM4NjNjMSAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyLnB5
CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L21hbmFnZXJfd29ya2VyX2Jyb2tlci5weQpAQCAtNDYsMTUgKzQ2LDI0IEBAIFRlc3RSdW5uZXIy
ICAtLT4gX0lubGluZU1hbmFnZXIgLS0tPiBfSW5saW5lV29ya2VyIDwtPiBXb3JrZXIKIGltcG9y
dCBsb2dnaW5nCiBpbXBvcnQgb3B0cGFyc2UKIGltcG9ydCBRdWV1ZQoraW1wb3J0IHRocmVhZAog
aW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKKwogCiAjIEhhbmRsZSBQeXRob24gPCAyLjYg
d2hlcmUgbXVsdGlwcm9jZXNzaW5nIGlzbid0IGF2YWlsYWJsZS4KKyMKKyMgX011bHRpcHJvY2Vz
c2luZ19Qcm9jZXNzIGlzIG5lZWRlZCBzbyB0aGF0IF9NdWx0aVByb2Nlc3NXb3JrZXIKKyMgY2Fu
IGJlIGRlZmluZWQgd2l0aCBvciB3aXRob3V0IG11bHRpcHJvY2Vzc2luZy4KIHRyeToKICAgICBp
bXBvcnQgbXVsdGlwcm9jZXNzaW5nCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gbXVs
dGlwcm9jZXNzaW5nLlByb2Nlc3MKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBtdWx0aXByb2Nl
c3NpbmcgPSBOb25lCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gdGhyZWFkaW5nLlRo
cmVhZAogCiAKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzIGltcG9ydCBwb3J0CiBmcm9tIHdl
YmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZSBpbXBvcnQgbWVzc2FnZV9icm9rZXIy
CiAKIApAQCAtMTY0LDggKzE3Myw4IEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29u
bmVjdGlvbik6CiAgICAgICAgIHNlbGYuX2lubGluZV93b3JrZXIgPSBOb25lCiAKICAgICBkZWYg
c3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgotICAgICAgICBzZWxmLl9pbmxpbmVf
d29ya2VyID0gX0lubGluZVdvcmtlcihzZWxmLl9icm9rZXIsIHNlbGYuX3BvcnQsIHNlbGYuX2Ns
aWVudCwKLSAgICAgICAgICAgIHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlcikKKyAg
ICAgICAgc2VsZi5faW5saW5lX3dvcmtlciA9IF9JbmxpbmVXb3JrZXJDb25uZWN0aW9uKHNlbGYu
X2Jyb2tlciwgc2VsZi5fcG9ydCwKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudCwgc2VsZi5fd29y
a2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQogICAgICAgICByZXR1cm4gc2VsZi5faW5saW5lX3dv
cmtlcgogCiAgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2VsZiwgZGVsYXlfc2Vjcz1Ob25lKToK
QEAgLTE3NywxMiArMTg2LDMwIEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVj
dGlvbik6CiAKIGNsYXNzIF9UaHJlYWRlZE1hbmFnZXIoX01hbmFnZXJDb25uZWN0aW9uKToKICAg
ICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwb3J0LCBvcHRpb25zLCBjbGllbnQsIHdvcmtl
cl9jbGFzcyk6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgX01h
bmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0aW9ucywgY2xpZW50LCB3
b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CisKKyAgICBkZWYgc3RhcnRf
d29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9
IF9UaHJlYWRlZFdvcmtlckNvbm5lY3Rpb24oc2VsZi5fYnJva2VyLCBzZWxmLl9wb3J0LAorICAg
ICAgICAgICAgc2VsZi5fd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQorICAgICAgICB3b3Jr
ZXJfY29ubmVjdGlvbi5zdGFydCgpCisgICAgICAgIHJldHVybiB3b3JrZXJfY29ubmVjdGlvbgog
CiAKIGNsYXNzIF9NdWx0aVByb2Nlc3NNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVjdGlvbik6CiAgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgcG9ydCwgb3B0aW9ucywgY2xpZW50LCB3b3JrZXJf
Y2xhc3MpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICAgICMgTm90
ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3Qga2VlcCBhIGhhbmRsZSB0byB0aGUgYWN0dWFsIHBv
cnQKKyAgICAgICAgIyBvYmplY3QsIGJlY2F1c2UgaXQgaXNuJ3QgUGlja2xhYmxlLiBJbnN0ZWFk
IGl0IGtlZXBzIHRoZSBwb3J0CisgICAgICAgICMgbmFtZSBhbmQgcmVjcmVhdGVzIHRoZSBwb3J0
IGluIHRoZSBjaGlsZCBwcm9jZXNzIGZyb20gdGhlIG5hbWUKKyAgICAgICAgIyBhbmQgb3B0aW9u
cy4KKyAgICAgICAgX01hbmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0
aW9ucywgY2xpZW50LCB3b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BsYXRmb3JtX25hbWUg
PSBwb3J0LnJlYWxfbmFtZSgpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9IF9NdWx0aVByb2Nlc3NXb3JrZXJD
b25uZWN0aW9uKHNlbGYuX2Jyb2tlciwgc2VsZi5fcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAg
IHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgc2VsZi5fb3B0aW9ucykKKyAgICAg
ICAgd29ya2VyX2Nvbm5lY3Rpb24uc3RhcnQoKQorICAgICAgICByZXR1cm4gd29ya2VyX2Nvbm5l
Y3Rpb24KIAogCiBjbGFzcyBfV29ya2VyQ29ubmVjdGlvbihtZXNzYWdlX2Jyb2tlcjIuQnJva2Vy
Q29ubmVjdGlvbik6CkBAIC0xOTIsMTQgKzIxOSwxMSBAQCBjbGFzcyBfV29ya2VyQ29ubmVjdGlv
bihtZXNzYWdlX2Jyb2tlcjIuQnJva2VyQ29ubmVjdGlvbik6CiAgICAgICAgIG1lc3NhZ2VfYnJv
a2VyMi5Ccm9rZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgc2VsZi5fY2xpZW50
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllf
V09SS0VSX1RPUElDLCBNQU5BR0VSX1RPUElDKQogCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCiAgICAgZGVmIHlpZWxkX3RvX2Jyb2tlcihz
ZWxmKToKICAgICAgICAgcGFzcwogCiAKLWNsYXNzIF9JbmxpbmVXb3JrZXIoX1dvcmtlckNvbm5l
Y3Rpb24pOgorY2xhc3MgX0lubGluZVdvcmtlckNvbm5lY3Rpb24oX1dvcmtlckNvbm5lY3Rpb24p
OgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHBvcnQsIG1hbmFnZXJfY2xpZW50LCB3
b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIpOgogICAgICAgICBfV29ya2VyQ29ubmVjdGlvbi5f
X2luaXRfXyhzZWxmLCBicm9rZXIsIHdvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgcG9ydC5f
b3B0aW9ucykKICAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKQEAgLTIxMCwzICsyMzQsNDggQEAg
Y2xhc3MgX0lubGluZVdvcmtlcihfV29ya2VyQ29ubmVjdGlvbik6CiAKICAgICBkZWYgeWllbGRf
dG9fYnJva2VyKHNlbGYpOgogICAgICAgICBzZWxmLl9icm9rZXIucnVuX2FsbF9wZW5kaW5nKE1B
TkFHRVJfVE9QSUMsIHNlbGYuX21hbmFnZXJfY2xpZW50KQorCisKK2NsYXNzIF9UaHJlYWQodGhy
ZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmtlcl9jb25uZWN0aW9u
KToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxm
Ll93b3JrZXJfY29ubmVjdGlvbiA9IHdvcmtlcl9jb25uZWN0aW9uCisKKyAgICBkZWYgcnVuKHNl
bGYpOgorICAgICAgICAjIEZJWE1FOiBXZSBjYW4gcmVtb3ZlIHRoaXMgb25jZSBldmVyeW9uZSBp
cyBvbiAyLjYuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdpZGVudCcpOgorICAgICAg
ICAgICAgc2VsZi5pZGVudCA9IHRocmVhZC5nZXRfaWRlbnQoKQorICAgICAgICBzZWxmLl93b3Jr
ZXJfY29ubmVjdGlvbi5fY2xpZW50LnJ1bihzZWxmLl93b3JrZXJfY29ubmVjdGlvbi5fcG9ydCkK
KworCitjbGFzcyBfVGhyZWFkZWRXb3JrZXJDb25uZWN0aW9uKF9Xb3JrZXJDb25uZWN0aW9uKToK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwb3J0LCB3b3JrZXJfY2xhc3MsIHdvcmtl
cl9udW1iZXIpOgorICAgICAgICBfV29ya2VyQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBicm9r
ZXIsIHdvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgcG9ydC5fb3B0aW9ucykKKyAgICAgICAg
c2VsZi5fcG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5fdGhyZWFkID0gX1RocmVhZChzZWxmKQor
CisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLl90aHJlYWQuc3RhcnQoKQorCisK
K2NsYXNzIF9Qcm9jZXNzKF9NdWx0aXByb2Nlc3NpbmdfUHJvY2Vzcyk6CisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIHdvcmtlcl9jb25uZWN0aW9uKToKKyAgICAgICAgX011bHRpcHJvY2Vzc2luZ19Q
cm9jZXNzLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3dvcmtlcl9jb25uZWN0aW9uID0g
d29ya2VyX2Nvbm5lY3Rpb24KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGxvZ2dpbmcu
YmFzaWNDb25maWcoKQorICAgICAgICBwb3J0X29iaiA9IHBvcnQuZ2V0KHNlbGYuX3dvcmtlcl9j
b25uZWN0aW9uLl9wbGF0Zm9ybV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNl
bGYuX3dvcmtlcl9jb25uZWN0aW9uLl9vcHRpb25zKQorICAgICAgICBzZWxmLl93b3JrZXJfY29u
bmVjdGlvbi5fY2xpZW50LnJ1bihwb3J0X29iaikKKworCitjbGFzcyBfTXVsdGlQcm9jZXNzV29y
a2VyQ29ubmVjdGlvbihfV29ya2VyQ29ubmVjdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGJyb2tlciwgcGxhdGZvcm1fbmFtZSwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyLCBvcHRp
b25zKToKKyAgICAgICAgX1dvcmtlckNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgYnJva2VyLCB3
b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIsIG9wdGlvbnMpCisgICAgICAgIHNlbGYuX29wdGlv
bnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYuX3BsYXRmb3JtX25hbWUgPSBwbGF0Zm9ybV9uYW1l
CisgICAgICAgIHNlbGYuX3Byb2MgPSBfUHJvY2VzcyhzZWxmKQorCisgICAgZGVmIHN0YXJ0KHNl
bGYpOgorICAgICAgICBzZWxmLl9wcm9jLnN0YXJ0KCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jy
b2tlcl91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xh
eW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlcl91bml0dGVzdC5weQppbmRleCAxYTQz
MmQ2Yzk0MTU2NmZhMWU4YmUwMDYzMzVkNDE4MjRiOTUzYmFjLi5mZmJlMDgxMDU2N2FjZGJlMDUw
OTk4NzgyZmJmNzk5MGJjNGYwMTNmIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXJfdW5pdHRl
c3QucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3Bh
Y2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5CkBAIC0yNyw2ICsyNyw3IEBA
CiAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCiAKIGltcG9ydCBvcHRwYXJzZQoraW1wb3J0IFF1ZXVlCiBpbXBvcnQg
c3lzCiBpbXBvcnQgdW5pdHRlc3QKIApAQCAtNDMsOCArNDQsMzggQEAgZnJvbSB3ZWJraXRweS5s
YXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UgaW1wb3J0IG1hbmFnZXJfd29ya2VyX2Jyb2tlcgog
ZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UgaW1wb3J0IG1lc3NhZ2Vf
YnJva2VyMgogCiAKLWNsYXNzIFRlc3RXb3JrZXIob2JqZWN0KToKLSAgICBwYXNzCitjbGFzcyBU
ZXN0V29ya2VyKG1hbmFnZXJfd29ya2VyX2Jyb2tlci5BYnN0cmFjdFdvcmtlcik6CisgICAgZGVm
IF9faW5pdF9fKHNlbGYsIGJyb2tlcl9jb25uZWN0aW9uLCB3b3JrZXJfbnVtYmVyLCBvcHRpb25z
KToKKyAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24gPSBicm9rZXJfY29ubmVjdGlvbgor
ICAgICAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLl93b3JrZXJfbnVt
YmVyID0gd29ya2VyX251bWJlcgorICAgICAgICBzZWxmLl9uYW1lID0gJ1Rlc3RXb3JrZXIvJWQn
ICUgd29ya2VyX251bWJlcgorICAgICAgICBzZWxmLl9zdG9wcGVkID0gRmFsc2UKKworICAgIGRl
ZiBoYW5kbGVfc3RvcChzZWxmLCBzcmMpOgorICAgICAgICBzZWxmLl9zdG9wcGVkID0gVHJ1ZQor
CisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5faW50LCBhX3N0cik6CisgICAgICAg
IGFzc2VydCBhbl9pbnQgPT0gMQorICAgICAgICBhc3NlcnQgYV9zdHIgPT0gImhlbGxvLCB3b3Js
ZCIKKyAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24ucG9zdF9tZXNzYWdlKCd0ZXN0Jywg
MiwgJ2hpLCBldmVyeWJvZHknKQorCisgICAgZGVmIGlzX2RvbmUoc2VsZik6CisgICAgICAgIHJl
dHVybiBzZWxmLl9zdG9wcGVkCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX25hbWUKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAg
ZGVmIHJ1bihzZWxmLCBwb3J0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fYnJv
a2VyX2Nvbm5lY3Rpb24ucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgICAgICBzZWxmLl9icm9r
ZXJfY29ubmVjdGlvbi55aWVsZF90b19icm9rZXIoKQorICAgICAgICAgICAgc2VsZi5fYnJva2Vy
X2Nvbm5lY3Rpb24ucG9zdF9tZXNzYWdlKCdkb25lJykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlv
biwgZToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlcl9jb25uZWN0aW9uLnBvc3RfbWVzc2FnZSgn
ZXhjZXB0aW9uJywgKHR5cGUoZSksIHN0cihlKSwgTm9uZSkpCiAKIAogZGVmIGdldF9vcHRpb25z
KHdvcmtlcl9tb2RlbCk6CkBAIC02NSwyNCArOTYsMTMxIEBAIGNsYXNzIEZ1bmN0aW9uVGVzdHMo
dW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUobWFrZV9icm9rZXIo
c2VsZiwgJ2lubGluZScpIGlzIG5vdCBOb25lKQogCiAgICAgZGVmIHRlc3RfZ2V0X190aHJlYWRz
KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBt
YWtlX2Jyb2tlciwgc2VsZiwgJ3RocmVhZHMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFr
ZV9icm9rZXIoc2VsZiwgJ3RocmVhZHMnKSBpcyBub3QgTm9uZSkKIAogICAgIGRlZiB0ZXN0X2dl
dF9fcHJvY2Vzc2VzKHNlbGYpOgogICAgICAgICBpZiBtdWx0aXByb2Nlc3Npbmc6Ci0gICAgICAg
ICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBtYWtlX2Jyb2tlciwg
c2VsZiwgJ3Byb2Nlc3NlcycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFrZV9icm9r
ZXIoc2VsZiwgJ3Byb2Nlc3NlcycpIGlzIG5vdCBOb25lKQogICAgICAgICBlbHNlOgogICAgICAg
ICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFrZV9icm9rZXIsIHNlbGYsICdw
cm9jZXNzZXMnKQogCiAgICAgZGVmIHRlc3RfZ2V0X191bmtub3duKHNlbGYpOgogICAgICAgICBz
ZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYWtlX2Jyb2tlciwgc2VsZiwgJ3Vua25vd24n
KQogCisKK2NsYXNzIF9UZXN0c01peGluKG9iamVjdCk6CisgICAgIiIiTWl4aW4gY2xhc3MgdGhh
dCBpbXBsZW1lbnRzIGEgc2VyaWVzIG9mIHRlc3RzIHRvIGVuZm9yY2UgdGhlCisgICAgY29udHJh
Y3QgYWxsIGltcGxlbWVudGF0aW9ucyBtdXN0IGZvbGxvdy4iIiIKKworICAgICMKKyAgICAjIE1l
dGhvZHMgdG8gaW1wbGVtZW50IHRoZSBNYW5hZ2VyIHNpZGUgb2YgdGhlIENsaWVudEludGVyZmFj
ZQorICAgICMKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICdUZXN0ZXInCisK
KyAgICBkZWYgaXNfZG9uZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvbmUKKworICAg
ICMKKyAgICAjIEhhbmRsZXJzIGZvciB0aGUgbWVzc2FnZXMgdGhlIFRlc3RXb3JrZXIgbWF5IHNl
bmQuCisgICAgIworICAgIGRlZiBoYW5kbGVfZG9uZShzZWxmLCBzcmMpOgorICAgICAgICBzZWxm
Ll9kb25lID0gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5faW50LCBh
X3N0cik6CisgICAgICAgIHNlbGYuX2FuX2ludCA9IGFuX2ludAorICAgICAgICBzZWxmLl9hX3N0
ciA9IGFfc3RyCisKKyAgICBkZWYgaGFuZGxlX2V4Y2VwdGlvbihzZWxmLCBzcmMsIGV4Y19pbmZv
KToKKyAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gZXhjX2luZm8KKyAgICAgICAgc2VsZi5fZG9u
ZSA9IFRydWUKKworICAgICMKKyAgICAjIFRlc3RpbmcgaGVscGVyIG1ldGhvZHMKKyAgICAjCisg
ICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBOb25lCisgICAgICAg
IHNlbGYuX2Ffc3RyID0gTm9uZQorICAgICAgICBzZWxmLl9icm9rZXIgPSBOb25lCisgICAgICAg
IHNlbGYuX2RvbmUgPSBGYWxzZQorICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCisgICAg
ICAgIHNlbGYuX3dvcmtlcl9tb2RlbCA9IE5vbmUKKworICAgIGRlZiBtYWtlX2Jyb2tlcihzZWxm
KToKKyAgICAgICAgc2VsZi5fYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwgc2VsZi5fd29ya2Vy
X21vZGVsKQorCisgICAgIworICAgICMgQWN0dWFsIHVuaXQgdGVzdHMKKyAgICAjCisgICAgZGVm
IHRlc3RfZG9uZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3dvcmtlcl9tb2RlbDoKKyAg
ICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgd29y
a2VyID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzZWxmLl9icm9rZXIu
cG9zdF9tZXNzYWdlKCd0ZXN0JywgMSwgJ2hlbGxvLCB3b3JsZCcpCisgICAgICAgIHNlbGYuX2Jy
b2tlci5wb3N0X21lc3NhZ2UoJ3N0b3AnKQorICAgICAgICBzZWxmLl9icm9rZXIucnVuX21lc3Nh
Z2VfbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hbl9pbnQsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoc2VsZi5fYV9zdHIsICdoaSwgZXZlcnlib2R5JykKKworICAgIGRlZiB0ZXN0X3Vua25v
d25fbWVzc2FnZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3dvcmtlcl9tb2RlbDoKKyAg
ICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgd29y
a2VyID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzZWxmLl9icm9rZXIu
cG9zdF9tZXNzYWdlKCd1bmtub3duJykKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdl
X2xvb3AoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhjZXB0aW9uWzBdLCBWYWx1ZUVycm9yKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLl9leGNlcHRpb25bMV0sCisgICAgICAgICAgICAi
VGVzdFdvcmtlci8wOiByZWNlaXZlZCBtZXNzYWdlICd1bmtub3duJyBpdCBjb3VsZG4ndCBoYW5k
bGUiKQorCisKK2NsYXNzIElubGluZUJyb2tlclRlc3RzKF9UZXN0c01peGluLCB1bml0dGVzdC5U
ZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5zZXRV
cChzZWxmKQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSAnaW5saW5lJworCisKK2NsYXNz
IE11bHRpUHJvY2Vzc0Jyb2tlclRlc3RzKF9UZXN0c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6
CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5zZXRVcChzZWxmKQor
ICAgICAgICBpZiBtdWx0aXByb2Nlc3Npbmc6CisgICAgICAgICAgICBzZWxmLl93b3JrZXJfbW9k
ZWwgPSAncHJvY2Vzc2VzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fd29ya2Vy
X21vZGVsID0gTm9uZQorCisgICAgZGVmIHF1ZXVlKHNlbGYpOgorICAgICAgICByZXR1cm4gbXVs
dGlwcm9jZXNzaW5nLlF1ZXVlKCkKKworCitjbGFzcyBUaHJlYWRlZEJyb2tlclRlc3RzKF9UZXN0
c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAg
ICBfVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSAn
dGhyZWFkcycKKworCitjbGFzcyBGdW5jdGlvbnNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAg
ICBkZWYgdGVzdF9ydW50aW1lX29wdGlvbnMoc2VsZik6CiAgICAgICAgIG9wdGlvbl9saXN0ID0g
bWFuYWdlcl93b3JrZXJfYnJva2VyLnJ1bnRpbWVfb3B0aW9ucygpCiAgICAgICAgIHBhcnNlciA9
IG9wdHBhcnNlLk9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25fbGlzdCkKICAgICAgICAg
b3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFtdKQogICAgICAgICBzZWxmLmFzc2Vy
dFRydWUob3B0aW9ucykKIAotIyBGSVhNRTogQWRkIGluIHVuaXQgdGVzdHMgZm9yIHRoZSBtYW5h
Z2VycywgY292ZXJhZ2UgdGVzdHMgZm9yIHRoZSBpbnRlcmZhY2VzLgorCitjbGFzcyBJbnRlcmZh
Y2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZXNlIHRlc3RzIG1vc3RseSBleGlz
dCB0byBwYWNpZnkgY292ZXJhZ2UuCisKKyAgICAjIEZJWE1FOiBUaGVyZSBtdXN0IGJlIGEgYmV0
dGVyIHdheSB0byBkbyB0aGlzIGFuZCBhbHNvIHZlcmlmeQorICAgICMgdGhhdCBjbGFzc2VzIGRv
IGltcGxlbWVudCBldmVyeSBhYnN0cmFjdCBtZXRob2QgaW4gYW4gaW50ZXJmYWNlLgorICAgIGRl
ZiB0ZXN0X21hbmFnZXJjb25uZWN0aW9uX2lzX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICAjIFRl
c3QgdGhhdCBhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJhY3QgYW5kIGhhdmUg
dGhlCisgICAgICAgICMgc2lnbmF0dXJlIHdlIGV4cGVjdC4KKyAgICAgICAgYnJva2VyID0gbWFr
ZV9icm9rZXIoc2VsZiwgJ2lubGluZScpCisgICAgICAgIG9iaiA9IG1hbmFnZXJfd29ya2VyX2Jy
b2tlci5fTWFuYWdlckNvbm5lY3Rpb24oYnJva2VyLl9icm9rZXIsIE5vbmUsIHNlbGYsIE5vbmUp
CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5zdGFy
dF93b3JrZXIsIDApCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3Rf
cnVubmVyMi5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9w
YWNrYWdlL3Rlc3RfcnVubmVyMi5weQppbmRleCA3NWI5ZGRhNzUwZTdlYTdlYTAxODE0MDEyNTNj
YjIwNGIyZWExYzgxLi5mMDk3YjgzZmFjYTZjMjU4YTNjOWMzNmU0MGFlYTk2NjI0M2NkMzM3IDEw
MDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS90ZXN0X3J1bm5lcjIucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9ydW5uZXIyLnB5CkBAIC00NSw5ICs0NSw2IEBAIF9s
b2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAogY2xhc3MgVGVzdFJ1bm5lcjIodGVz
dF9ydW5uZXIuVGVzdFJ1bm5lcik6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIG9wdGlv
bnMsIHByaW50ZXIpOgotICAgICAgICBpZiBvcHRpb25zLndvcmtlcl9tb2RlbCBpbiAoJ3RocmVh
ZHMnLCAncHJvY2Vzc2VzJyk6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCctLXdvcmtl
ci1tb2RlbD0lcyBub3Qgc3VwcG9ydGVkIHlldCcgJSBvcHRpb25zLndvcmtlcl9tb2RlbCkKLQog
ICAgICAgICB0ZXN0X3J1bm5lci5UZXN0UnVubmVyLl9faW5pdF9fKHNlbGYsIHBvcnQsIG9wdGlv
bnMsIHByaW50ZXIpCiAgICAgICAgIHNlbGYuX2FsbF9yZXN1bHRzID0gW10KICAgICAgICAgc2Vs
Zi5fZ3JvdXBfc3RhdHMgPSB7fQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC9iYXNlLnB5CmluZGV4IDhmM2M4NDAxZWU3YjU4YTc2NjdiMmY2YWIxMzIyZWI3
ZTM5NmExYzYuLjVmZjRiZmY0MDRmMGY5NWMyNTJjZDUzMTNmZTJlYTE0M2VjNjdiMWQgMTAwNjQ0
Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQor
KysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKQEAg
LTQ2Nyw2ICs0NjcsMTAgQEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICAoJ2NwdScpLiIi
IgogICAgICAgICByZXR1cm4gJ2NwdScKIAorICAgIGRlZiByZWFsX25hbWUoc2VsZik6CisgICAg
ICAgICIiIlJldHVybnMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBwb3J0LCBub3QgdGhlIGRlbGVn
YXRlJ3MuIiIiCisgICAgICAgIHJldHVybiBzZWxmLm5hbWUoKQorCiAgICAgZGVmIGdldF9vcHRp
b24oc2VsZiwgbmFtZSwgZGVmYXVsdF92YWx1ZT1Ob25lKToKICAgICAgICAgIyBGSVhNRTogRXZl
bnR1YWxseSB3ZSBzaG91bGQgbm90IGhhdmUgdG8gZG8gYSB0ZXN0IGZvcgogICAgICAgICAjIGhh
c2F0dHIoKSwgYW5kIHdlIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgZG8KZGlmZiAtLWdpdCBhL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbW9ja19kcnQucHkgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21vY2tfZHJ0LnB5CmluZGV4IDM3
MDMyN2ZiMDFiNTgzYzBkZDAyNTg3ZTY0M2Q5NzhiMTg0ZWIwMWUuLjExNDc4NDZkNjA5NTA4NDRi
NTUzYzBlZjAzNzAxMmNkYWM2MWY0OGQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbW9ja19kcnQucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvcG9ydC9tb2NrX2RydC5weQpAQCAtNTMsNiArNTMsMTAgQEAgY2xh
c3MgTW9ja0RSVFBvcnQob2JqZWN0KToKICAgICAgICAgaWYgJ3BvcnRfbmFtZScgaW4ga3dhcmdz
OgogICAgICAgICAgICAga3dhcmdzWydwb3J0X25hbWUnXSA9IGt3YXJnc1sncG9ydF9uYW1lJ11b
bGVuKHByZWZpeCk6XQogICAgICAgICBzZWxmLl9fZGVsZWdhdGUgPSBmYWN0b3J5LmdldCgqKmt3
YXJncykKKyAgICAgICAgc2VsZi5fX3JlYWxfbmFtZSA9IHByZWZpeCArIHNlbGYuX19kZWxlZ2F0
ZS5uYW1lKCkKKworICAgIGRlZiByZWFsX25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll9fcmVhbF9uYW1lCiAKICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAg
IHJldHVybiBnZXRhdHRyKHNlbGYuX19kZWxlZ2F0ZSwgbmFtZSkKQEAgLTI3MSw3ICsyNzUsNiBA
QCBjbGFzcyBNb2NrQ2hyb21pdW1EUlQoTW9ja0RSVCk6CiAgICAgICAgIHNlbGYuX3N0ZG91dC5m
bHVzaCgpCiAKIAotCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGZzID0gZmlsZXN5
c3RlbS5GaWxlU3lzdGVtKCkKICAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSwgZnMsIHN5
cy5zdGRpbiwgc3lzLnN0ZG91dCwgc3lzLnN0ZGVycikpCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5IGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0c191bml0
dGVzdC5weQppbmRleCA4OTE3OTdkNTA1YzQ4ZTE4ZWM5YjQ5NzE2NTkwNzIxNmNmY2U5MWNkLi44
NGY1NzE4MjU2MGRkMTJiYTk5Mjk4ZGFlYWJiYTc4MTA5NDk1ZGU4IDEwMDY0NAotLS0gYS9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX3VuaXR0ZXN0
LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRf
dGVzdHNfdW5pdHRlc3QucHkKQEAgLTQ2NywxMCArNDY3LDExIEBAIGNsYXNzIE1haW5UZXN0KHVu
aXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhc3NpbmdfcnVuKFsn
LS13b3JrZXItbW9kZWwnLCAnb2xkLXRocmVhZHMnXSkpCiAKICAgICBkZWYgdGVzdF93b3JrZXJf
bW9kZWxfX3Byb2Nlc3NlcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVF
cnJvciwgbG9nZ2luZ19ydW4sIFsnLS13b3JrZXItbW9kZWwnLCAncHJvY2Vzc2VzJ10pCisgICAg
ICAgIGlmIGNvbXBhcmVfdmVyc2lvbihzeXMsICcyLjYnKVswXSA+PSAwOgorICAgICAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKHBhc3NpbmdfcnVuKFsnLS13b3JrZXItbW9kZWwnLCAncHJvY2Vzc2Vz
J10pKQogCiAgICAgZGVmIHRlc3Rfd29ya2VyX21vZGVsX190aHJlYWRzKHNlbGYpOgotICAgICAg
ICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb2dnaW5nX3J1biwgWyctLXdvcmtlci1t
b2RlbCcsICd0aHJlYWRzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXNzaW5nX3J1bihb
Jy0td29ya2VyLW1vZGVsJywgJ3RocmVhZHMnXSkpCiAKICAgICBkZWYgdGVzdF93b3JrZXJfbW9k
ZWxfX3Vua25vd24oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3Is
IGxvZ2dpbmdfcnVuLAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82213</attachid>
            <date>2011-02-11 17:21:14 -0800</date>
            <delta_ts>2011-02-11 17:24:04 -0800</delta_ts>
            <desc>update w/ additional feedback from tony</desc>
            <filename>bug-54070-20110211172113.patch</filename>
            <type>text/plain</type>
            <size>16472</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogNzgzMDIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCBiNWJhNDMzN2ZlY2RlMTZmZGVlNWQ1NTU4ZDJhYTlkY2Qy
NjZmZmFkLi44ZTdhOWMwOTc5ZjY3M2ZlNWFmODQwM2EwYjUyYjYwMTM2MmQwNjgzIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEg
QEAKKzIwMTEtMDItMTEgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBh
ZGRzIHRvIE5SV1QgbW9zdCBvZiB0aGUgc3VwcG9ydCBuZWVkZWQgdG8gcnVuIHRoZSBuZXcKKyAg
ICAgICAgbWVzc2FnZS1iYXNlZCB3b3JrZXJzIGluIHNlcGFyYXRlIHRocmVhZHMgb3IgcHJvY2Vz
c2VzLiBUaGUgY29kZQorICAgICAgICBpc24ndCBmdWxseSBjb21wbGV0ZSB5ZXQgYmVjYXVzZSB3
ZSBkb24ndCBzdXBwb3J0IGNhbmNlbCgpIG9yCisgICAgICAgIGlzX2FsaXZlKCkuCisKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MDcwCisKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2Vy
X3dvcmtlcl9icm9rZXIucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3Rf
cnVubmVyMi5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L2Jhc2UucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9t
b2NrX2RydC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5f
d2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5OgorCiAyMDExLTAyLTEwICBEaXJrIFByYW5rZSAgPGRw
cmFua2VAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFRvbnkgQ2hhbmcuCmRp
ZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXIucHkKaW5kZXgg
YzQ3ZTlkN2RjNmViM2QzYTU1NmI1ODhiYzA1MzhlZWQ2ZmE3MTY5ZC4uYTBmMjUyY2ZjZDBhNDc3
NDQ5ZjJiNjYxNWMxNzJiMDdiODZhNDVlYiAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93b3JrZXJfYnJva2VyLnB5
CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L21hbmFnZXJfd29ya2VyX2Jyb2tlci5weQpAQCAtNDYsMTUgKzQ2LDI0IEBAIFRlc3RSdW5uZXIy
ICAtLT4gX0lubGluZU1hbmFnZXIgLS0tPiBfSW5saW5lV29ya2VyIDwtPiBXb3JrZXIKIGltcG9y
dCBsb2dnaW5nCiBpbXBvcnQgb3B0cGFyc2UKIGltcG9ydCBRdWV1ZQoraW1wb3J0IHRocmVhZAog
aW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKKwogCiAjIEhhbmRsZSBQeXRob24gPCAyLjYg
d2hlcmUgbXVsdGlwcm9jZXNzaW5nIGlzbid0IGF2YWlsYWJsZS4KKyMKKyMgX011bHRpcHJvY2Vz
c2luZ19Qcm9jZXNzIGlzIG5lZWRlZCBzbyB0aGF0IF9NdWx0aVByb2Nlc3NXb3JrZXIKKyMgY2Fu
IGJlIGRlZmluZWQgd2l0aCBvciB3aXRob3V0IG11bHRpcHJvY2Vzc2luZy4KIHRyeToKICAgICBp
bXBvcnQgbXVsdGlwcm9jZXNzaW5nCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gbXVs
dGlwcm9jZXNzaW5nLlByb2Nlc3MKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBtdWx0aXByb2Nl
c3NpbmcgPSBOb25lCisgICAgX011bHRpcHJvY2Vzc2luZ19Qcm9jZXNzID0gdGhyZWFkaW5nLlRo
cmVhZAogCiAKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzIGltcG9ydCBwb3J0CiBmcm9tIHdl
YmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZSBpbXBvcnQgbWVzc2FnZV9icm9rZXIy
CiAKIApAQCAtMTY0LDggKzE3Myw4IEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29u
bmVjdGlvbik6CiAgICAgICAgIHNlbGYuX2lubGluZV93b3JrZXIgPSBOb25lCiAKICAgICBkZWYg
c3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgotICAgICAgICBzZWxmLl9pbmxpbmVf
d29ya2VyID0gX0lubGluZVdvcmtlcihzZWxmLl9icm9rZXIsIHNlbGYuX3BvcnQsIHNlbGYuX2Ns
aWVudCwKLSAgICAgICAgICAgIHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlcikKKyAg
ICAgICAgc2VsZi5faW5saW5lX3dvcmtlciA9IF9JbmxpbmVXb3JrZXJDb25uZWN0aW9uKHNlbGYu
X2Jyb2tlciwgc2VsZi5fcG9ydCwKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudCwgc2VsZi5fd29y
a2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQogICAgICAgICByZXR1cm4gc2VsZi5faW5saW5lX3dv
cmtlcgogCiAgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2VsZiwgZGVsYXlfc2Vjcz1Ob25lKToK
QEAgLTE3NywxMiArMTg2LDMwIEBAIGNsYXNzIF9JbmxpbmVNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVj
dGlvbik6CiAKIGNsYXNzIF9UaHJlYWRlZE1hbmFnZXIoX01hbmFnZXJDb25uZWN0aW9uKToKICAg
ICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCBwb3J0LCBvcHRpb25zLCBjbGllbnQsIHdvcmtl
cl9jbGFzcyk6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgX01h
bmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0aW9ucywgY2xpZW50LCB3
b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CisKKyAgICBkZWYgc3RhcnRf
d29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9
IF9UaHJlYWRlZFdvcmtlckNvbm5lY3Rpb24oc2VsZi5fYnJva2VyLCBzZWxmLl9wb3J0LAorICAg
ICAgICAgICAgc2VsZi5fd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKQorICAgICAgICB3b3Jr
ZXJfY29ubmVjdGlvbi5zdGFydCgpCisgICAgICAgIHJldHVybiB3b3JrZXJfY29ubmVjdGlvbgog
CiAKIGNsYXNzIF9NdWx0aVByb2Nlc3NNYW5hZ2VyKF9NYW5hZ2VyQ29ubmVjdGlvbik6CiAgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgcG9ydCwgb3B0aW9ucywgY2xpZW50LCB3b3JrZXJf
Y2xhc3MpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICAgICMgTm90
ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3Qga2VlcCBhIGhhbmRsZSB0byB0aGUgYWN0dWFsIHBv
cnQKKyAgICAgICAgIyBvYmplY3QsIGJlY2F1c2UgaXQgaXNuJ3QgUGlja2xhYmxlLiBJbnN0ZWFk
IGl0IGtlZXBzIHRoZSBwb3J0CisgICAgICAgICMgbmFtZSBhbmQgcmVjcmVhdGVzIHRoZSBwb3J0
IGluIHRoZSBjaGlsZCBwcm9jZXNzIGZyb20gdGhlIG5hbWUKKyAgICAgICAgIyBhbmQgb3B0aW9u
cy4KKyAgICAgICAgX01hbmFnZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgb3B0
aW9ucywgY2xpZW50LCB3b3JrZXJfY2xhc3MpCisgICAgICAgIHNlbGYuX3BsYXRmb3JtX25hbWUg
PSBwb3J0LnJlYWxfbmFtZSgpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICB3b3JrZXJfY29ubmVjdGlvbiA9IF9NdWx0aVByb2Nlc3NXb3JrZXJD
b25uZWN0aW9uKHNlbGYuX2Jyb2tlciwgc2VsZi5fcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAg
IHNlbGYuX3dvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgc2VsZi5fb3B0aW9ucykKKyAgICAg
ICAgd29ya2VyX2Nvbm5lY3Rpb24uc3RhcnQoKQorICAgICAgICByZXR1cm4gd29ya2VyX2Nvbm5l
Y3Rpb24KIAogCiBjbGFzcyBfV29ya2VyQ29ubmVjdGlvbihtZXNzYWdlX2Jyb2tlcjIuQnJva2Vy
Q29ubmVjdGlvbik6CkBAIC0xOTIsMTQgKzIxOSwxMSBAQCBjbGFzcyBfV29ya2VyQ29ubmVjdGlv
bihtZXNzYWdlX2Jyb2tlcjIuQnJva2VyQ29ubmVjdGlvbik6CiAgICAgICAgIG1lc3NhZ2VfYnJv
a2VyMi5Ccm9rZXJDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGJyb2tlciwgc2VsZi5fY2xpZW50
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllf
V09SS0VSX1RPUElDLCBNQU5BR0VSX1RPUElDKQogCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCiAgICAgZGVmIHlpZWxkX3RvX2Jyb2tlcihz
ZWxmKToKICAgICAgICAgcGFzcwogCiAKLWNsYXNzIF9JbmxpbmVXb3JrZXIoX1dvcmtlckNvbm5l
Y3Rpb24pOgorY2xhc3MgX0lubGluZVdvcmtlckNvbm5lY3Rpb24oX1dvcmtlckNvbm5lY3Rpb24p
OgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHBvcnQsIG1hbmFnZXJfY2xpZW50LCB3
b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIpOgogICAgICAgICBfV29ya2VyQ29ubmVjdGlvbi5f
X2luaXRfXyhzZWxmLCBicm9rZXIsIHdvcmtlcl9jbGFzcywgd29ya2VyX251bWJlciwgcG9ydC5f
b3B0aW9ucykKICAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKQEAgLTIxMCwzICsyMzQsNDkgQEAg
Y2xhc3MgX0lubGluZVdvcmtlcihfV29ya2VyQ29ubmVjdGlvbik6CiAKICAgICBkZWYgeWllbGRf
dG9fYnJva2VyKHNlbGYpOgogICAgICAgICBzZWxmLl9icm9rZXIucnVuX2FsbF9wZW5kaW5nKE1B
TkFHRVJfVE9QSUMsIHNlbGYuX21hbmFnZXJfY2xpZW50KQorCisKK2NsYXNzIF9UaHJlYWQodGhy
ZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmtlcl9jb25uZWN0aW9u
LCBwb3J0LCBjbGllbnQpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYp
CisgICAgICAgIHNlbGYuX3dvcmtlcl9jb25uZWN0aW9uID0gd29ya2VyX2Nvbm5lY3Rpb24KKyAg
ICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5fY2xpZW50ID0gY2xpZW50CisK
KyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjIEZJWE1FOiBXZSBjYW4gcmVtb3ZlIHRoaXMg
b25jZSBldmVyeW9uZSBpcyBvbiAyLjYuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdp
ZGVudCcpOgorICAgICAgICAgICAgc2VsZi5pZGVudCA9IHRocmVhZC5nZXRfaWRlbnQoKQorICAg
ICAgICBzZWxmLl9jbGllbnQucnVuKHNlbGYuX3BvcnQpCisKKworY2xhc3MgX1RocmVhZGVkV29y
a2VyQ29ubmVjdGlvbihfV29ya2VyQ29ubmVjdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGJyb2tlciwgcG9ydCwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgX1dv
cmtlckNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtl
cl9udW1iZXIsIHBvcnQuX29wdGlvbnMpCisgICAgICAgIHNlbGYuX3RocmVhZCA9IF9UaHJlYWQo
c2VsZiwgcG9ydCwgc2VsZi5fY2xpZW50KQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAg
ICBzZWxmLl90aHJlYWQuc3RhcnQoKQorCisKK2NsYXNzIF9Qcm9jZXNzKF9NdWx0aXByb2Nlc3Np
bmdfUHJvY2Vzcyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmtlcl9jb25uZWN0aW9uLCBw
bGF0Zm9ybV9uYW1lLCBvcHRpb25zLCBjbGllbnQpOgorICAgICAgICBfTXVsdGlwcm9jZXNzaW5n
X1Byb2Nlc3MuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fd29ya2VyX2Nvbm5lY3Rpb24g
PSB3b3JrZXJfY29ubmVjdGlvbgorICAgICAgICBzZWxmLl9wbGF0Zm9ybV9uYW1lID0gcGxhdGZv
cm1fbmFtZQorICAgICAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLl9j
bGllbnQgPSBjbGllbnQKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGxvZ2dpbmcuYmFz
aWNDb25maWcoKQorICAgICAgICBwb3J0X29iaiA9IHBvcnQuZ2V0KHNlbGYuX3BsYXRmb3JtX25h
bWUsIHNlbGYuX29wdGlvbnMpCisgICAgICAgIHNlbGYuX2NsaWVudC5ydW4ocG9ydF9vYmopCisK
KworY2xhc3MgX011bHRpUHJvY2Vzc1dvcmtlckNvbm5lY3Rpb24oX1dvcmtlckNvbm5lY3Rpb24p
OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHBsYXRmb3JtX25hbWUsIHdvcmtlcl9j
bGFzcywgd29ya2VyX251bWJlciwgb3B0aW9ucyk6CisgICAgICAgIF9Xb3JrZXJDb25uZWN0aW9u
Ll9faW5pdF9fKHNlbGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyLCBvcHRp
b25zKQorICAgICAgICBzZWxmLl9wcm9jID0gX1Byb2Nlc3Moc2VsZiwgcGxhdGZvcm1fbmFtZSwg
b3B0aW9ucywgc2VsZi5fY2xpZW50KQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBz
ZWxmLl9wcm9jLnN0YXJ0KCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21hbmFnZXJfd29ya2VyX2Jyb2tlcl91bml0dGVzdC5w
eSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21h
bmFnZXJfd29ya2VyX2Jyb2tlcl91bml0dGVzdC5weQppbmRleCAxYTQzMmQ2Yzk0MTU2NmZhMWU4
YmUwMDYzMzVkNDE4MjRiOTUzYmFjLi5mZmJlMDgxMDU2N2FjZGJlMDUwOTk4NzgyZmJmNzk5MGJj
NGYwMTNmIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9s
YXlvdXRfcGFja2FnZS9tYW5hZ2VyX3dvcmtlcl9icm9rZXJfdW5pdHRlc3QucHkKKysrIGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWFuYWdlcl93
b3JrZXJfYnJva2VyX3VuaXR0ZXN0LnB5CkBAIC0yNyw2ICsyNyw3IEBACiAjIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CiAKIGltcG9ydCBvcHRwYXJzZQoraW1wb3J0IFF1ZXVlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5p
dHRlc3QKIApAQCAtNDMsOCArNDQsMzggQEAgZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5
b3V0X3BhY2thZ2UgaW1wb3J0IG1hbmFnZXJfd29ya2VyX2Jyb2tlcgogZnJvbSB3ZWJraXRweS5s
YXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UgaW1wb3J0IG1lc3NhZ2VfYnJva2VyMgogCiAKLWNs
YXNzIFRlc3RXb3JrZXIob2JqZWN0KToKLSAgICBwYXNzCitjbGFzcyBUZXN0V29ya2VyKG1hbmFn
ZXJfd29ya2VyX2Jyb2tlci5BYnN0cmFjdFdvcmtlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGJyb2tlcl9jb25uZWN0aW9uLCB3b3JrZXJfbnVtYmVyLCBvcHRpb25zKToKKyAgICAgICAgc2Vs
Zi5fYnJva2VyX2Nvbm5lY3Rpb24gPSBicm9rZXJfY29ubmVjdGlvbgorICAgICAgICBzZWxmLl9v
cHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLl93b3JrZXJfbnVtYmVyID0gd29ya2VyX251
bWJlcgorICAgICAgICBzZWxmLl9uYW1lID0gJ1Rlc3RXb3JrZXIvJWQnICUgd29ya2VyX251bWJl
cgorICAgICAgICBzZWxmLl9zdG9wcGVkID0gRmFsc2UKKworICAgIGRlZiBoYW5kbGVfc3RvcChz
ZWxmLCBzcmMpOgorICAgICAgICBzZWxmLl9zdG9wcGVkID0gVHJ1ZQorCisgICAgZGVmIGhhbmRs
ZV90ZXN0KHNlbGYsIHNyYywgYW5faW50LCBhX3N0cik6CisgICAgICAgIGFzc2VydCBhbl9pbnQg
PT0gMQorICAgICAgICBhc3NlcnQgYV9zdHIgPT0gImhlbGxvLCB3b3JsZCIKKyAgICAgICAgc2Vs
Zi5fYnJva2VyX2Nvbm5lY3Rpb24ucG9zdF9tZXNzYWdlKCd0ZXN0JywgMiwgJ2hpLCBldmVyeWJv
ZHknKQorCisgICAgZGVmIGlzX2RvbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zdG9w
cGVkCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKwor
ICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJ1bihzZWxmLCBw
b3J0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24u
cnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgICAgICBzZWxmLl9icm9rZXJfY29ubmVjdGlvbi55
aWVsZF90b19icm9rZXIoKQorICAgICAgICAgICAgc2VsZi5fYnJva2VyX2Nvbm5lY3Rpb24ucG9z
dF9tZXNzYWdlKCdkb25lJykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAg
ICAgIHNlbGYuX2Jyb2tlcl9jb25uZWN0aW9uLnBvc3RfbWVzc2FnZSgnZXhjZXB0aW9uJywgKHR5
cGUoZSksIHN0cihlKSwgTm9uZSkpCiAKIAogZGVmIGdldF9vcHRpb25zKHdvcmtlcl9tb2RlbCk6
CkBAIC02NSwyNCArOTYsMTMxIEBAIGNsYXNzIEZ1bmN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENh
c2UpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUobWFrZV9icm9rZXIoc2VsZiwgJ2lubGluZScp
IGlzIG5vdCBOb25lKQogCiAgICAgZGVmIHRlc3RfZ2V0X190aHJlYWRzKHNlbGYpOgotICAgICAg
ICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBtYWtlX2Jyb2tlciwgc2Vs
ZiwgJ3RocmVhZHMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFrZV9icm9rZXIoc2VsZiwg
J3RocmVhZHMnKSBpcyBub3QgTm9uZSkKIAogICAgIGRlZiB0ZXN0X2dldF9fcHJvY2Vzc2VzKHNl
bGYpOgogICAgICAgICBpZiBtdWx0aXByb2Nlc3Npbmc6Ci0gICAgICAgICAgICBzZWxmLmFzc2Vy
dFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBtYWtlX2Jyb2tlciwgc2VsZiwgJ3Byb2Nlc3Nl
cycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFrZV9icm9rZXIoc2VsZiwgJ3Byb2Nl
c3NlcycpIGlzIG5vdCBOb25lKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3Nl
cnRSYWlzZXMoVmFsdWVFcnJvciwgbWFrZV9icm9rZXIsIHNlbGYsICdwcm9jZXNzZXMnKQogCiAg
ICAgZGVmIHRlc3RfZ2V0X191bmtub3duKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNl
cyhWYWx1ZUVycm9yLCBtYWtlX2Jyb2tlciwgc2VsZiwgJ3Vua25vd24nKQogCisKK2NsYXNzIF9U
ZXN0c01peGluKG9iamVjdCk6CisgICAgIiIiTWl4aW4gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEg
c2VyaWVzIG9mIHRlc3RzIHRvIGVuZm9yY2UgdGhlCisgICAgY29udHJhY3QgYWxsIGltcGxlbWVu
dGF0aW9ucyBtdXN0IGZvbGxvdy4iIiIKKworICAgICMKKyAgICAjIE1ldGhvZHMgdG8gaW1wbGVt
ZW50IHRoZSBNYW5hZ2VyIHNpZGUgb2YgdGhlIENsaWVudEludGVyZmFjZQorICAgICMKKyAgICBk
ZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICdUZXN0ZXInCisKKyAgICBkZWYgaXNfZG9u
ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvbmUKKworICAgICMKKyAgICAjIEhhbmRs
ZXJzIGZvciB0aGUgbWVzc2FnZXMgdGhlIFRlc3RXb3JrZXIgbWF5IHNlbmQuCisgICAgIworICAg
IGRlZiBoYW5kbGVfZG9uZShzZWxmLCBzcmMpOgorICAgICAgICBzZWxmLl9kb25lID0gVHJ1ZQor
CisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5faW50LCBhX3N0cik6CisgICAgICAg
IHNlbGYuX2FuX2ludCA9IGFuX2ludAorICAgICAgICBzZWxmLl9hX3N0ciA9IGFfc3RyCisKKyAg
ICBkZWYgaGFuZGxlX2V4Y2VwdGlvbihzZWxmLCBzcmMsIGV4Y19pbmZvKToKKyAgICAgICAgc2Vs
Zi5fZXhjZXB0aW9uID0gZXhjX2luZm8KKyAgICAgICAgc2VsZi5fZG9uZSA9IFRydWUKKworICAg
ICMKKyAgICAjIFRlc3RpbmcgaGVscGVyIG1ldGhvZHMKKyAgICAjCisgICAgZGVmIHNldFVwKHNl
bGYpOgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBOb25lCisgICAgICAgIHNlbGYuX2Ffc3RyID0g
Tm9uZQorICAgICAgICBzZWxmLl9icm9rZXIgPSBOb25lCisgICAgICAgIHNlbGYuX2RvbmUgPSBG
YWxzZQorICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCisgICAgICAgIHNlbGYuX3dvcmtl
cl9tb2RlbCA9IE5vbmUKKworICAgIGRlZiBtYWtlX2Jyb2tlcihzZWxmKToKKyAgICAgICAgc2Vs
Zi5fYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwgc2VsZi5fd29ya2VyX21vZGVsKQorCisgICAg
IworICAgICMgQWN0dWFsIHVuaXQgdGVzdHMKKyAgICAjCisgICAgZGVmIHRlc3RfZG9uZShzZWxm
KToKKyAgICAgICAgaWYgbm90IHNlbGYuX3dvcmtlcl9tb2RlbDoKKyAgICAgICAgICAgIHJldHVy
bgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgd29ya2VyID0gc2VsZi5fYnJv
a2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd0
ZXN0JywgMSwgJ2hlbGxvLCB3b3JsZCcpCisgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3Nh
Z2UoJ3N0b3AnKQorICAgICAgICBzZWxmLl9icm9rZXIucnVuX21lc3NhZ2VfbG9vcCgpCisgICAg
ICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChzZWxmLl9hbl9pbnQsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYV9z
dHIsICdoaSwgZXZlcnlib2R5JykKKworICAgIGRlZiB0ZXN0X3Vua25vd25fbWVzc2FnZShzZWxm
KToKKyAgICAgICAgaWYgbm90IHNlbGYuX3dvcmtlcl9tb2RlbDoKKyAgICAgICAgICAgIHJldHVy
bgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgd29ya2VyID0gc2VsZi5fYnJv
a2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd1
bmtub3duJykKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQorCisgICAg
ICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbHMoc2VsZi5fZXhjZXB0aW9uWzBdLCBWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscyhzZWxmLl9leGNlcHRpb25bMV0sCisgICAgICAgICAgICAiVGVzdFdvcmtlci8wOiBy
ZWNlaXZlZCBtZXNzYWdlICd1bmtub3duJyBpdCBjb3VsZG4ndCBoYW5kbGUiKQorCisKK2NsYXNz
IElubGluZUJyb2tlclRlc3RzKF9UZXN0c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAg
ZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAg
ICBzZWxmLl93b3JrZXJfbW9kZWwgPSAnaW5saW5lJworCisKK2NsYXNzIE11bHRpUHJvY2Vzc0Jy
b2tlclRlc3RzKF9UZXN0c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVw
KHNlbGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBpZiBtdWx0
aXByb2Nlc3Npbmc6CisgICAgICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSAncHJvY2Vzc2Vz
JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fd29ya2VyX21vZGVsID0gTm9uZQor
CisgICAgZGVmIHF1ZXVlKHNlbGYpOgorICAgICAgICByZXR1cm4gbXVsdGlwcm9jZXNzaW5nLlF1
ZXVlKCkKKworCitjbGFzcyBUaHJlYWRlZEJyb2tlclRlc3RzKF9UZXN0c01peGluLCB1bml0dGVz
dC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfVGVzdHNNaXhpbi5z
ZXRVcChzZWxmKQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSAndGhyZWFkcycKKworCitj
bGFzcyBGdW5jdGlvbnNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9ydW50
aW1lX29wdGlvbnMoc2VsZik6CiAgICAgICAgIG9wdGlvbl9saXN0ID0gbWFuYWdlcl93b3JrZXJf
YnJva2VyLnJ1bnRpbWVfb3B0aW9ucygpCiAgICAgICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlv
blBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25fbGlzdCkKICAgICAgICAgb3B0aW9ucywgYXJncyA9
IHBhcnNlci5wYXJzZV9hcmdzKFtdKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0aW9ucykK
IAotIyBGSVhNRTogQWRkIGluIHVuaXQgdGVzdHMgZm9yIHRoZSBtYW5hZ2VycywgY292ZXJhZ2Ug
dGVzdHMgZm9yIHRoZSBpbnRlcmZhY2VzLgorCitjbGFzcyBJbnRlcmZhY2VUZXN0KHVuaXR0ZXN0
LlRlc3RDYXNlKToKKyAgICAjIFRoZXNlIHRlc3RzIG1vc3RseSBleGlzdCB0byBwYWNpZnkgY292
ZXJhZ2UuCisKKyAgICAjIEZJWE1FOiBUaGVyZSBtdXN0IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0
aGlzIGFuZCBhbHNvIHZlcmlmeQorICAgICMgdGhhdCBjbGFzc2VzIGRvIGltcGxlbWVudCBldmVy
eSBhYnN0cmFjdCBtZXRob2QgaW4gYW4gaW50ZXJmYWNlLgorICAgIGRlZiB0ZXN0X21hbmFnZXJj
b25uZWN0aW9uX2lzX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhbGwgdGhl
IGJhc2UgY2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJhY3QgYW5kIGhhdmUgdGhlCisgICAgICAgICMg
c2lnbmF0dXJlIHdlIGV4cGVjdC4KKyAgICAgICAgYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwg
J2lubGluZScpCisgICAgICAgIG9iaiA9IG1hbmFnZXJfd29ya2VyX2Jyb2tlci5fTWFuYWdlckNv
bm5lY3Rpb24oYnJva2VyLl9icm9rZXIsIE5vbmUsIHNlbGYsIE5vbmUpCisgICAgICAgIHNlbGYu
YXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5zdGFydF93b3JrZXIsIDApCiAK
IAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcnVubmVyMi5weSBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfcnVu
bmVyMi5weQppbmRleCA3NWI5ZGRhNzUwZTdlYTdlYTAxODE0MDEyNTNjYjIwNGIyZWExYzgxLi5m
MDk3YjgzZmFjYTZjMjU4YTNjOWMzNmU0MGFlYTk2NjI0M2NkMzM3IDEwMDY0NAotLS0gYS9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X3J1bm5l
cjIucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3Bh
Y2thZ2UvdGVzdF9ydW5uZXIyLnB5CkBAIC00NSw5ICs0NSw2IEBAIF9sb2cgPSBsb2dnaW5nLmdl
dExvZ2dlcihfX25hbWVfXykKIAogY2xhc3MgVGVzdFJ1bm5lcjIodGVzdF9ydW5uZXIuVGVzdFJ1
bm5lcik6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIG9wdGlvbnMsIHByaW50ZXIpOgot
ICAgICAgICBpZiBvcHRpb25zLndvcmtlcl9tb2RlbCBpbiAoJ3RocmVhZHMnLCAncHJvY2Vzc2Vz
Jyk6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCctLXdvcmtlci1tb2RlbD0lcyBub3Qg
c3VwcG9ydGVkIHlldCcgJSBvcHRpb25zLndvcmtlcl9tb2RlbCkKLQogICAgICAgICB0ZXN0X3J1
bm5lci5UZXN0UnVubmVyLl9faW5pdF9fKHNlbGYsIHBvcnQsIG9wdGlvbnMsIHByaW50ZXIpCiAg
ICAgICAgIHNlbGYuX2FsbF9yZXN1bHRzID0gW10KICAgICAgICAgc2VsZi5fZ3JvdXBfc3RhdHMg
PSB7fQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9y
dC9iYXNlLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNl
LnB5CmluZGV4IDhmM2M4NDAxZWU3YjU4YTc2NjdiMmY2YWIxMzIyZWI3ZTM5NmExYzYuLjVmZjRi
ZmY0MDRmMGY5NWMyNTJjZDUzMTNmZTJlYTE0M2VjNjdiMWQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQorKysgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKQEAgLTQ2Nyw2ICs0NjcsMTAg
QEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICAoJ2NwdScpLiIiIgogICAgICAgICByZXR1
cm4gJ2NwdScKIAorICAgIGRlZiByZWFsX25hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMg
dGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBwb3J0LCBub3QgdGhlIGRlbGVnYXRlJ3MuIiIiCisgICAg
ICAgIHJldHVybiBzZWxmLm5hbWUoKQorCiAgICAgZGVmIGdldF9vcHRpb24oc2VsZiwgbmFtZSwg
ZGVmYXVsdF92YWx1ZT1Ob25lKToKICAgICAgICAgIyBGSVhNRTogRXZlbnR1YWxseSB3ZSBzaG91
bGQgbm90IGhhdmUgdG8gZG8gYSB0ZXN0IGZvcgogICAgICAgICAjIGhhc2F0dHIoKSwgYW5kIHdl
IHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgZG8KZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbW9ja19kcnQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L21vY2tfZHJ0LnB5CmluZGV4IDM3MDMyN2ZiMDFiNTgzYzBk
ZDAyNTg3ZTY0M2Q5NzhiMTg0ZWIwMWUuLjExNDc4NDZkNjA5NTA4NDRiNTUzYzBlZjAzNzAxMmNk
YWM2MWY0OGQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvbW9ja19kcnQucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC9tb2NrX2RydC5weQpAQCAtNTMsNiArNTMsMTAgQEAgY2xhc3MgTW9ja0RSVFBvcnQo
b2JqZWN0KToKICAgICAgICAgaWYgJ3BvcnRfbmFtZScgaW4ga3dhcmdzOgogICAgICAgICAgICAg
a3dhcmdzWydwb3J0X25hbWUnXSA9IGt3YXJnc1sncG9ydF9uYW1lJ11bbGVuKHByZWZpeCk6XQog
ICAgICAgICBzZWxmLl9fZGVsZWdhdGUgPSBmYWN0b3J5LmdldCgqKmt3YXJncykKKyAgICAgICAg
c2VsZi5fX3JlYWxfbmFtZSA9IHByZWZpeCArIHNlbGYuX19kZWxlZ2F0ZS5uYW1lKCkKKworICAg
IGRlZiByZWFsX25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcmVhbF9uYW1lCiAK
ICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgIHJldHVybiBnZXRhdHRy
KHNlbGYuX19kZWxlZ2F0ZSwgbmFtZSkKQEAgLTI3MSw3ICsyNzUsNiBAQCBjbGFzcyBNb2NrQ2hy
b21pdW1EUlQoTW9ja0RSVCk6CiAgICAgICAgIHNlbGYuX3N0ZG91dC5mbHVzaCgpCiAKIAotCiBp
ZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGZzID0gZmlsZXN5c3RlbS5GaWxlU3lzdGVt
KCkKICAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSwgZnMsIHN5cy5zdGRpbiwgc3lzLnN0
ZG91dCwgc3lzLnN0ZGVycikpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0c191bml0dGVzdC5weQppbmRleCA4
OTE3OTdkNTA1YzQ4ZTE4ZWM5YjQ5NzE2NTkwNzIxNmNmY2U5MWNkLi44NGY1NzE4MjU2MGRkMTJi
YTk5Mjk4ZGFlYWJiYTc4MTA5NDk1ZGU4IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX3VuaXR0ZXN0LnB5CisrKyBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHNfdW5pdHRlc3Qu
cHkKQEAgLTQ2NywxMCArNDY3LDExIEBAIGNsYXNzIE1haW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNl
KToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhc3NpbmdfcnVuKFsnLS13b3JrZXItbW9kZWwn
LCAnb2xkLXRocmVhZHMnXSkpCiAKICAgICBkZWYgdGVzdF93b3JrZXJfbW9kZWxfX3Byb2Nlc3Nl
cyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9nZ2luZ19y
dW4sIFsnLS13b3JrZXItbW9kZWwnLCAncHJvY2Vzc2VzJ10pCisgICAgICAgIGlmIGNvbXBhcmVf
dmVyc2lvbihzeXMsICcyLjYnKVswXSA+PSAwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVl
KHBhc3NpbmdfcnVuKFsnLS13b3JrZXItbW9kZWwnLCAncHJvY2Vzc2VzJ10pKQogCiAgICAgZGVm
IHRlc3Rfd29ya2VyX21vZGVsX190aHJlYWRzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJh
aXNlcyhWYWx1ZUVycm9yLCBsb2dnaW5nX3J1biwgWyctLXdvcmtlci1tb2RlbCcsICd0aHJlYWRz
J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXNzaW5nX3J1bihbJy0td29ya2VyLW1vZGVs
JywgJ3RocmVhZHMnXSkpCiAKICAgICBkZWYgdGVzdF93b3JrZXJfbW9kZWxfX3Vua25vd24oc2Vs
Zik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvZ2dpbmdfcnVuLAo=
</data>
<flag name="review"
          id="73856"
          type_id="1"
          status="+"
          setter="tony"
    />
          </attachment>
      

    </bug>

</bugzilla>