<?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>83347</bug_id>
          
          <creation_ts>2012-04-05 20:38:14 -0700</creation_ts>
          <short_desc>webkit-patch: add a print-expectations command</short_desc>
          <delta_ts>2012-04-10 18:37:58 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Pranke">dpranke</reporter>
          <assigned_to name="Dirk Pranke">dpranke</assigned_to>
          <cc>abarth</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>597175</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-05 20:38:14 -0700</bug_when>
    <thetext>webkit-patch: add a print-expectations command</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597177</commentid>
    <comment_count>1</comment_count>
      <attachid>135976</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-05 20:43:48 -0700</bug_when>
    <thetext>Created attachment 135976
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597180</commentid>
    <comment_count>2</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-05 20:46:58 -0700</bug_when>
    <thetext>if this looks like reasonable functionality, let me know and I&apos;ll write some unit tests to go along with it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597181</commentid>
    <comment_count>3</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-05 20:47:30 -0700</bug_when>
    <thetext>it&apos;s basically a view onto the various TestExpectationModels.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597182</commentid>
    <comment_count>4</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-05 20:48:15 -0700</bug_when>
    <thetext>Note that this will replace the skipped-files command which will let me finally fix bug 47528</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597493</commentid>
    <comment_count>5</comment_count>
      <attachid>135976</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-04-06 11:07:59 -0700</bug_when>
    <thetext>Comment on attachment 135976
Patch

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

&gt; Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py:751
&gt; +        return (keyword.upper() in self.get_expectations_string(test) or
&gt; +                keyword.lower() in self.get_modifiers(test))

Why is one upper and the other lower?

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:410
&gt; +    TYPES = set(x.upper() for x in (TestExpectations.EXPECTATIONS.keys() + TestExpectations.MODIFIERS.keys())).difference(set([&apos;NONE&apos;]))

Can we use a more descriptive variable name than &quot;x&quot; ?  Perhaps &quot;key&quot; or &quot;type&quot; ?

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:420
&gt; +             make_option(&apos;-i&apos;, &apos;--include-keyword&apos;, action=&apos;append&apos;, default=[],

bad indent

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:434
&gt; +    def get_expectations(self, tool, options, port_name, tests):

&quot;get&quot; is a pretty weak verb.  Also, I don&apos;t think you need to pass &quot;tool&quot; as a parameter.  It should be on self.  (I know we pass the tool around in a bunch of places---that&apos;s from code that predates tool being on self.)

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:452
&gt; +        default_port = tool.port_factory.get(options=options)

The port_factory understands our options?  Does that means some of these make_option calls are duplicated elsewhere?  Should move centralize them somewhere?

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:490
&gt; +    def print_expectation(self, options, test_name, expectations, port_name, port_names):
&gt; +        modifiers_str = &apos; &apos;.join(expectations.get_modifiers(test_name)).upper()
&gt; +        expectations_str = expectations.get_expectations_string(test_name)
&gt; +        if options.csv:
&gt; +            print &quot;%s,%s,%s,%s&quot; % (port_name, test_name, modifiers_str, expectations_str)
&gt; +        elif options.full:
&gt; +            print &quot;%s : %s = %s&quot; % (modifiers_str, test_name, expectations_str)
&gt; +        else:
&gt; +            res = test_name
&gt; +            if self.should_print_expectation(options):
&gt; +                res += &apos; = &apos; + expectations.get_expectations_string(test_name)
&gt; +            print res

This code seems too detail oriented for a command.  Maybe TestExpectations should know how to serialize itself back to a string and we could just print the string?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597495</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-04-06 11:08:38 -0700</bug_when>
    <thetext>I&apos;m not 100% sure what I&apos;d use this command for, but it seems like a reasonable thing to do if you&apos;ve got some use in mind.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597510</commentid>
    <comment_count>7</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-06 11:29:52 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 135976 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=135976&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py:751
&gt; &gt; +        return (keyword.upper() in self.get_expectations_string(test) or
&gt; &gt; +                keyword.lower() in self.get_modifiers(test))
&gt; 
&gt; Why is one upper and the other lower?
&gt; 

Unfortunately, get_modifiers() returns things in lower case and get_expectations_string() returns things in upper case. My intent is that has_keyword() should be case insensitive. Initially I had implemented this outside of TestExpectations, but I decided I didn&apos;t want callers to have to care or be aware of the case of these things at all.

&gt; &gt; Tools/Scripts/webkitpy/tool/commands/queries.py:410
&gt; &gt; +    TYPES = set(x.upper() for x in (TestExpectations.EXPECTATIONS.keys() + TestExpectations.MODIFIERS.keys())).difference(set([&apos;NONE&apos;]))
&gt; 
&gt; Can we use a more descriptive variable name than &quot;x&quot; ?  Perhaps &quot;key&quot; or &quot;type&quot; ?
&gt;

Sure.
 
&gt; &gt; Tools/Scripts/webkitpy/tool/commands/queries.py:420
&gt; &gt; +             make_option(&apos;-i&apos;, &apos;--include-keyword&apos;, action=&apos;append&apos;, default=[],
&gt; 
&gt; bad indent
&gt; 

Will fix (not sure how I missed this).

&gt; &gt; Tools/Scripts/webkitpy/tool/commands/queries.py:434
&gt; &gt; +    def get_expectations(self, tool, options, port_name, tests):
&gt; 
&gt; &quot;get&quot; is a pretty weak verb.  Also, I don&apos;t think you need to pass &quot;tool&quot; as a parameter.  It should be on self.  (I know we pass the tool around in a bunch of places---that&apos;s from code that predates tool being on self.)
&gt;

would expectations() be better? lookup_expectations()? I&apos;m open to other suggestions.

There is a self._tool, but I wasn&apos;t sure if that was intended to be accessed in subclasses. Good to know.
 
&gt; &gt; Tools/Scripts/webkitpy/tool/commands/queries.py:452
&gt; &gt; +        default_port = tool.port_factory.get(options=options)
&gt; 
&gt; The port_factory understands our options?  Does that means some of these make_option calls are duplicated elsewhere?  Should move centralize them somewhere?
&gt;

Yes, and probably. I am intentionally supporting a bunch of common options like --platform and --debug. We should probably centralize them on PortFactory (e.g., PortFactory.options()). I&apos;ll do that in a separate change.
 
&gt; &gt; Tools/Scripts/webkitpy/tool/commands/queries.py:490
&gt; &gt; +    def print_expectation(self, options, test_name, expectations, port_name, port_names):
&gt; &gt; +        modifiers_str = &apos; &apos;.join(expectations.get_modifiers(test_name)).upper()
&gt; &gt; +        expectations_str = expectations.get_expectations_string(test_name)
&gt; &gt; +        if options.csv:
&gt; &gt; +            print &quot;%s,%s,%s,%s&quot; % (port_name, test_name, modifiers_str, expectations_str)
&gt; &gt; +        elif options.full:
&gt; &gt; +            print &quot;%s : %s = %s&quot; % (modifiers_str, test_name, expectations_str)
&gt; &gt; +        else:
&gt; &gt; +            res = test_name
&gt; &gt; +            if self.should_print_expectation(options):
&gt; &gt; +                res += &apos; = &apos; + expectations.get_expectations_string(test_name)
&gt; &gt; +            print res
&gt; 
&gt; This code seems too detail oriented for a command.  Maybe TestExpectations should know how to serialize itself back to a string and we could just print the string?

That would make sense for the --full option, but I&apos;m not sure that it makes sense for the others; TestExpectations is more of a model than a view. 

Given that I want the script to be able to provide the different formats, if a Command isn&apos;t the right place and I don&apos;t think TestExpectations (being a model) is either, what would be recommended?

(In reply to comment #6)
&gt; I&apos;m not 100% sure what I&apos;d use this command for, but it seems like a reasonable thing to do if you&apos;ve got some use in mind.

The first main use is to replace skipped-files. The more common generalization is to answer questions like &quot;which tests do we expect to crash&quot; without having to hand-search and parse the expectations and skipped files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597511</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-04-06 11:32:00 -0700</bug_when>
    <thetext>&gt; Given that I want the script to be able to provide the different formats, if a Command isn&apos;t the right place and I don&apos;t think TestExpectations (being a model) is either, what would be recommended?

Maybe a TestExpectationsPrettyPrinter class?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597524</commentid>
    <comment_count>9</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-06 11:38:54 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; Given that I want the script to be able to provide the different formats, if a Command isn&apos;t the right place and I don&apos;t think TestExpectations (being a model) is either, what would be recommended?
&gt; 
&gt; Maybe a TestExpectationsPrettyPrinter class?

It seems like the formats we&apos;d print (again, apart from --full) would be pretty specific to this command-line script (i.e., there&apos;s not much potential for reuse); does it make sense to put such a class in queries.py, or somewhere else? 

Mostly since I haven&apos;t really written much webkit-patch functionality I&apos;m trying to understand what would be consistent with your past work here ...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597570</commentid>
    <comment_count>10</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-04-06 12:45:16 -0700</bug_when>
    <thetext>&gt; It seems like the formats we&apos;d print (again, apart from --full) would be pretty specific to this command-line script (i.e., there&apos;s not much potential for reuse); does it make sense to put such a class in queries.py, or somewhere else? 

Serializing a set of test expectations to a string seems like a common thing that many folks might want to do.

&gt; Mostly since I haven&apos;t really written much webkit-patch functionality I&apos;m trying to understand what would be consistent with your past work here ...

Commands are intended to just be thin controllers around functionality in the rest of webkitpy.  They shouldn&apos;t have a detailed understanding of the objects they&apos;re manipulating.  They&apos;re just a high-level binding to command-line syntax.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597573</commentid>
    <comment_count>11</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-06 12:51:57 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; &gt; It seems like the formats we&apos;d print (again, apart from --full) would be pretty specific to this command-line script (i.e., there&apos;s not much potential for reuse); does it make sense to put such a class in queries.py, or somewhere else? 
&gt; 
&gt; Serializing a set of test expectations to a string seems like a common thing that many folks might want to do.
&gt; 

Yeah, except that I&apos;m not sure how many would want the *same* format. Like I said, the --full format might make sense as a default, but the others, not so much.

&gt; &gt; Mostly since I haven&apos;t really written much webkit-patch functionality I&apos;m trying to understand what would be consistent with your past work here ...
&gt; 
&gt; Commands are intended to just be thin controllers around functionality in the rest of webkitpy.  They shouldn&apos;t have a detailed understanding of the objects they&apos;re manipulating.  They&apos;re just a high-level binding to command-line syntax.

Okay, I&apos;ll see what I can come up with.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597576</commentid>
    <comment_count>12</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-04-06 12:55:45 -0700</bug_when>
    <thetext>The way I would think about this command is having three stages:

1) Retrieve the expectations for a given port/platform/configuration/whatever.
2) Filter the set of expectations based on some criteria.
3) Display the filtered set of expectations.

Those three high-level tasks should be done by objects outside the Command.  The command should be in charge of translating command-line arguments into Python function calls on these objects and then shuttling data from stage 1 to 2 to 3 to stdout.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597877</commentid>
    <comment_count>13</comment_count>
      <attachid>136114</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-06 18:13:48 -0700</bug_when>
    <thetext>Created attachment 136114
updated per review feedback</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597878</commentid>
    <comment_count>14</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-06 18:14:49 -0700</bug_when>
    <thetext>I think this is a lot closer to what you have in mind ... WDYT?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597879</commentid>
    <comment_count>15</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-06 18:15:22 -0700</bug_when>
    <thetext>if this looks on-track, I&apos;ll write some tests for it and upload another patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598319</commentid>
    <comment_count>16</comment_count>
      <attachid>136114</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-04-09 09:15:07 -0700</bug_when>
    <thetext>Comment on attachment 136114
updated per review feedback

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

This looks a lot better, thanks.

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:410
&gt; +    TYPES = set(x.upper() for x in (TestExpectations.EXPECTATIONS.keys() + TestExpectations.MODIFIERS.keys())).difference(set([&apos;NONE&apos;]))

Can we evaluate this expression at a different time?  This will run every time webkit-patch starts up.  For example, we could make this a @memoized class function.  Actually, is this even used anywhere?

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:420
&gt; +             make_option(&apos;-i&apos;, &apos;--include-keyword&apos;, action=&apos;append&apos;, default=[],

bad indent</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598711</commentid>
    <comment_count>17</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-09 16:03:34 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; &gt; Tools/Scripts/webkitpy/tool/commands/queries.py:410
&gt; &gt; +    TYPES = set(x.upper() for x in (TestExpectations.EXPECTATIONS.keys() + TestExpectations.MODIFIERS.keys())).difference(set([&apos;NONE&apos;]))
&gt; 
&gt; Can we evaluate this expression at a different time?  This will run every time webkit-patch starts up.  For example, we could make this a @memoized class function.  Actually, is this even used anywhere?
&gt; 

This wasn&apos;t even needed any more.

&gt; &gt; Tools/Scripts/webkitpy/tool/commands/queries.py:420
&gt; &gt; +             make_option(&apos;-i&apos;, &apos;--include-keyword&apos;, action=&apos;append&apos;, default=[],
&gt; 
&gt; bad indent

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598775</commentid>
    <comment_count>18</comment_count>
      <attachid>136349</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-09 17:01:21 -0700</bug_when>
    <thetext>Created attachment 136349
add test, more review feedback, merge to head</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>599858</commentid>
    <comment_count>19</comment_count>
      <attachid>136349</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-04-10 17:49:34 -0700</bug_when>
    <thetext>Comment on attachment 136349
add test, more review feedback, merge to head

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

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:410
&gt; +        options = [

I thought a bunch of these were shared now.

&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:498
&gt; +
&gt; +
&gt; +
&gt; +
&gt; +

So many blank lines batman</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>599881</commentid>
    <comment_count>20</comment_count>
      <attachid>136349</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-10 18:12:20 -0700</bug_when>
    <thetext>Comment on attachment 136349
add test, more review feedback, merge to head

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

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:410
&gt;&gt; +        options = [
&gt; 
&gt; I thought a bunch of these were shared now.

That&apos;s bug 83525, which hasn&apos;t landed yet. I&apos;ll merge them together properly.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/queries.py:498
&gt;&gt; +
&gt; 
&gt; So many blank lines batman

Will fix :). Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>599907</commentid>
    <comment_count>21</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-04-10 18:37:58 -0700</bug_when>
    <thetext>Committed r113802: &lt;http://trac.webkit.org/changeset/113802&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135976</attachid>
            <date>2012-04-05 20:43:48 -0700</date>
            <delta_ts>2012-04-06 18:13:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-83347-20120405204347.patch</filename>
            <type>text/plain</type>
            <size>9849</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzMzk5CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggMmNkZTIzM2UyNTEzMmM0ZmM1MDQ0Y2RjMWEzZTBlZTMx
MTc5MDA3MC4uNjQyMDg4NTY1OTYwMzFhYzBkYWIxMDliY2ZlYmU3YTU1NzMzMTkxZSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDQ2
IEBACiAyMDEyLTA0LTA1ICBEaXJrIFByYW5rZSAgPGRwcmFua2VAY2hyb21pdW0ub3JnPgogCisg
ICAgICAgIHdlYmtpdC1wYXRjaDogYWRkIGEgcHJpbnQtZXhwZWN0YXRpb25zIGNvbW1hbmQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgzMzQ3CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBjb21tYW5k
IHdpbGwgcHJpbnQgdGhlIGV4cGVjdGVkIHJlc3VsdHMgZm9yIGEgZ2l2ZW4gc2V0IG9mCisgICAg
ICAgIHRlc3RzIG9uIGEgZ2l2ZW4gc2V0IG9mIHBvcnRzIG1hdGNoaW5nIGEgZ2l2ZW4gc2V0IG9m
IGtleXdvcmRzLgorCisgICAgICAgIEV4YW1wbGUgb3V0cHV0IChwcmludGluZyBhbGwgdGhlIHRl
c3RzIG5vdCBleHBlY3RlZCB0byBwYXNzLCBhbmQgdGhlaXIKKyAgICAgICAgZXhwZWN0ZWQgcmVz
dWx0cywgb24gYSBNYWMpOgorCisgICAgICAgICQgd2Via2l0LXBhdGNoIHByaW50LWV4cGVjdGF0
aW9ucyAteCBwYXNzIGZhc3QvaHRtbAorICAgICAgICAvLyBGb3IgbWFjLXNub3dsZW9wYXJkCisg
ICAgICAgIGZhc3QvaHRtbC9kZXRhaWxzLW9wZW40Lmh0bWwgPSBURVhUCisgICAgICAgIGZhc3Qv
aHRtbC9kZXRhaWxzLW9wZW4yLmh0bWwgPSBURVhUCisgICAgICAgIGZhc3QvaHRtbC9kZXRhaWxz
LW5vLXN1bW1hcnk0Lmh0bWwgPSBURVhUCisgICAgICAgIGZhc3QvaHRtbC9kZXRhaWxzLW9wZW4t
amF2YXNjcmlwdC5odG1sID0gVEVYVAorICAgICAgICAkCisKKyAgICAgICAgWW91IGNhbiBhbHNv
IHByaW50IGZ1bGwgdGVzdC1leHBlY3RhdG9ucy50eHQgbGluZXMgdXNpbmcgLS1mdWxsIGFuZCBh
CisgICAgICAgIENTVi1zdHlsZSByZXBvcnQgKHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIHBvc3Qt
cHJvY2Vzc2luZykgdXNpbmcgLS1jc3YuCisKKyAgICAgICAgSXQgd2lsbCByZXBsYWNlIHRoZSAn
c2tpcHBlZC1maWxlcycgY29tbWFuZCAod2hpY2ggd2lsbCBiZQorICAgICAgICByZW1vdmVkIGlu
IGEgc3Vic2VxdWVudCBwYXRjaCkgYW5kIGlzIGEgbW9yZSBnZW5lcmFsIChhbmQKKyAgICAgICAg
Y2xlYW5lciBhbmQgcHJvcGVybHkgbGF5ZXJlZCkgc29sdXRpb24uCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9tb2RlbHMvdGVzdF9leHBlY3RhdGlvbnMucHk6Cisg
ICAgICAgIChUZXN0RXhwZWN0YXRpb25zLmhhc19rZXl3b3JkKToKKyAgICAgICAgKFRlc3RFeHBl
Y3RhdGlvbnMpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9xdWVy
aWVzLnB5OgorICAgICAgICAoZXhlY3V0ZSk6CisgICAgICAgIChQcmludEV4cGVjdGF0aW9ucyk6
CisgICAgICAgIChQcmludEV4cGVjdGF0aW9ucy5fX2luaXRfXyk6CisgICAgICAgIChQcmludEV4
cGVjdGF0aW9ucy5nZXRfZXhwZWN0YXRpb25zKToKKyAgICAgICAgKFByaW50RXhwZWN0YXRpb25z
LmV4ZWN1dGUpOgorICAgICAgICAoUHJpbnRFeHBlY3RhdGlvbnMuc2hvdWxkX3ByaW50KToKKyAg
ICAgICAgKFByaW50RXhwZWN0YXRpb25zLnNob3VsZF9wcmludF9leHBlY3RhdGlvbik6CisgICAg
ICAgIChQcmludEV4cGVjdGF0aW9ucy5wcmludF9leHBlY3RhdGlvbik6CisKKzIwMTItMDQtMDUg
IERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKICAgICAgICAgbnJ3dCBpcyBm
YWlsaW5nIHRvIHVwbG9hZCB0ZXN0IHJlc3VsdHMgb24gdGhlIGNocm9taXVtLW1hYy1sZW9wYXJk
IGJvdHMKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgz
MjMwCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL21v
ZGVscy90ZXN0X2V4cGVjdGF0aW9ucy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL21vZGVscy90ZXN0X2V4cGVjdGF0aW9ucy5weQppbmRleCA3MDUxYTVmMjQzYTU3OTY5
OTViNzkzZWJiNzU5NTg1YTExOGE3YTNmLi4wOTdiOGJmYzY2Zjg5NTAxYzc1NGZlNWM5Mjg4NGVl
MTc4MzgyZDMyIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9tb2RlbHMvdGVzdF9leHBlY3RhdGlvbnMucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvbW9kZWxzL3Rlc3RfZXhwZWN0YXRpb25zLnB5CkBAIC03NDYsNiArNzQ2
LDExIEBAIGNsYXNzIFRlc3RFeHBlY3RhdGlvbnMob2JqZWN0KToKICAgICAgICAgcmV0dXJuIHNl
bGYuX21vZGVsLmhhc19tb2RpZmllcih0ZXN0LCBtb2RpZmllcikKIAogICAgICMgRklYTUU6IENo
YW5nZSB0aGUgY2FsbHNpdGVzIHRvIHVzZSBUZXN0RXhwZWN0YXRpb25zTW9kZWwgYW5kIHJlbW92
ZS4KKyAgICBkZWYgaGFzX2tleXdvcmQoc2VsZiwgdGVzdCwga2V5d29yZCk6CisgICAgICAgIHJl
dHVybiAoa2V5d29yZC51cHBlcigpIGluIHNlbGYuZ2V0X2V4cGVjdGF0aW9uc19zdHJpbmcodGVz
dCkgb3IKKyAgICAgICAgICAgICAgICBrZXl3b3JkLmxvd2VyKCkgaW4gc2VsZi5nZXRfbW9kaWZp
ZXJzKHRlc3QpKQorCisgICAgIyBGSVhNRTogQ2hhbmdlIHRoZSBjYWxsc2l0ZXMgdG8gdXNlIFRl
c3RFeHBlY3RhdGlvbnNNb2RlbCBhbmQgcmVtb3ZlLgogICAgIGRlZiBnZXRfdGVzdHNfd2l0aF9y
ZXN1bHRfdHlwZShzZWxmLCByZXN1bHRfdHlwZSk6CiAgICAgICAgIHJldHVybiBzZWxmLl9tb2Rl
bC5nZXRfdGVzdHNfd2l0aF9yZXN1bHRfdHlwZShyZXN1bHRfdHlwZSkKIApkaWZmIC0tZ2l0IGEv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXJpZXMucHkgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVlcmllcy5weQppbmRleCA5MTQ2NmNkZjY0
NTNmMzhkMzk2ODcwOWFmNjhlMjRhYzAxNDM1MWQ3Li4zYzEzNzVlNGMzYjdlYTJhOGFmOWVhMDhh
MjQ2OWU5YWUzOTRjYWYzIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
Y29tbWFuZHMvcXVlcmllcy5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29t
bWFuZHMvcXVlcmllcy5weQpAQCAtNCw3ICs0LDcgQEAKICMgUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAjIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKICMgbWV0OgotIyAKKyMKICMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICMgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogIyAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCkBAIC0x
NCw3ICsxNCw3IEBACiAjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKICMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMgCisjCiAjIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
ICMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKICMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCkBAIC0yOCw2ICsyOCw4IEBACiAjIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCiAKIAoraW1wb3J0IGZubWF0Y2gKKwogZnJvbSBvcHRwYXJzZSBpbXBvcnQgbWFrZV9vcHRp
b24KIAogZnJvbSB3ZWJraXRweS50b29sIGltcG9ydCBzdGVwcwpAQCAtNDMsNiArNDUsNyBAQCBm
cm9tIHdlYmtpdHB5LnRvb2wuZ3JhbW1hciBpbXBvcnQgcGx1cmFsaXplCiBmcm9tIHdlYmtpdHB5
LnRvb2wubXVsdGljb21tYW5kdG9vbCBpbXBvcnQgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQK
IGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5kZXByZWNhdGVkX2xvZ2dpbmcgaW1wb3J0IGxv
ZwogZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMgaW1wb3J0IHBvcnQKK2Zyb20gd2Via2l0cHku
bGF5b3V0X3Rlc3RzLm1vZGVscy50ZXN0X2V4cGVjdGF0aW9ucyBpbXBvcnQgVGVzdEV4cGVjdGF0
aW9ucwogCiAKIGNsYXNzIFN1Z2dlc3RSZXZpZXdlcnMoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1h
bmQpOgpAQCAtMzk3LDMgKzQwMCw5MSBAQCBvdXQgd2hhdCBwb3J0cyBhcmUgc2tpcHBpbmcgdGhl
IHRlc3QocykuIENhdGVnb3JpZXMgYXJlIHRha2VuIGluIGFjY291bnQgdG9vLiIiIgogICAgICAg
ICAgICAgICAgIHByaW50ICJQb3J0cyBza2lwcGluZyB0ZXN0ICVyOiAlcyIgJSAodGVzdF9uYW1l
LCAnLCAnLmpvaW4ocG9ydHMpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBw
cmludCAiVGVzdCAlciBpcyBub3Qgc2tpcHBlZCBieSBhbnkgcG9ydC4iICUgdGVzdF9uYW1lCisK
KworY2xhc3MgUHJpbnRFeHBlY3RhdGlvbnMoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQpOgor
ICAgIG5hbWUgPSAncHJpbnQtZXhwZWN0YXRpb25zJworICAgIGhlbHBfdGV4dCA9ICdQcmludCB0
aGUgZXhwZWN0ZWQgcmVzdWx0IGZvciB0aGUgZ2l2ZW4gdGVzdChzKSBvbiB0aGUgZ2l2ZW4gcG9y
dChzKScKKyAgICBhcmd1bWVudF9uYW1lcyA9ICJURVNUX05BTUUiCisKKyAgICBUWVBFUyA9IHNl
dCh4LnVwcGVyKCkgZm9yIHggaW4gKFRlc3RFeHBlY3RhdGlvbnMuRVhQRUNUQVRJT05TLmtleXMo
KSArIFRlc3RFeHBlY3RhdGlvbnMuTU9ESUZJRVJTLmtleXMoKSkpLmRpZmZlcmVuY2Uoc2V0KFsn
Tk9ORSddKSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFsK
KyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCctcCcsICctLXBsYXRmb3JtJywgYWN0aW9uPSdzdG9y
ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwbGF0Zm9ybS9wb3J0KHMpIHRvIGRp
c3BsYXkgZXhwZWN0YXRpb25zIGZvci4gVXNlIGdsb2Itc3R5bGUgd2lsZGNhcmRzIGZvciBtdWx0
aXBsZSBwb3J0cycpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oJy0tYWxsJywgYWN0aW9uPSdz
dG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9
J2Rpc3BsYXkgdGhlIGV4cGVjdGF0aW9ucyBmb3IgKmFsbCogdGVzdHMnKSwKKyAgICAgICAgICAg
IG1ha2Vfb3B0aW9uKCcteCcsICctLWV4Y2x1ZGUta2V5d29yZCcsIGFjdGlvbj0nYXBwZW5kJywg
ZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpbWl0IHRvIHRlc3Rz
IG5vdCBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5d29yZCAoZm9yIGV4YW1wbGUsICJza2lwIiwgInNs
b3ciLCBvciAiY3Jhc2giLiBNYXkgc3BlY2lmeSBtdWx0aXBsZSB0aW1lcycpLAorICAgICAgICAg
ICAgIG1ha2Vfb3B0aW9uKCctaScsICctLWluY2x1ZGUta2V5d29yZCcsIGFjdGlvbj0nYXBwZW5k
JywgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpbWl0IHRvIHRl
c3RzIHdpdGggdGhlIGdpdmVuIGtleXdvcmQgKGZvciBleGFtcGxlLCAic2tpcCIsICJzbG93Iiwg
b3IgImNyYXNoIi4gTWF5IHNwZWNpZnkgbXVsdGlwbGUgdGltZXMnKSwKKyAgICAgICAgICAgIG1h
a2Vfb3B0aW9uKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PSdEZWJ1Zycs
IGRlc3Q9J2NvbmZpZ3VyYXRpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU2V0
IHRoZSBjb25maWd1cmF0aW9uIHRvIERlYnVnJyksCisgICAgICAgICAgICBtYWtlX29wdGlvbign
LS1yZWxlYXNlJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PSdSZWxlYXNlJywgZGVzdD0n
Y29uZmlndXJhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZXQgdGhlIGNv
bmZpZ3VyYXRpb24gdG8gUmVsZWFzZScpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oJy0tY3N2
JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGhlbHA9J1ByaW50IGEgQ1NWLXN0eWxlIHJlcG9ydCB0aGF0IGluY2x1ZGVzIHRoZSBw
b3J0IG5hbWUsIG1vZGlmaWVycywgdGVzdHMsIGFuZCBleHBlY3RhdGlvbnMnKSwKKyAgICAgICAg
ICAgIG1ha2Vfb3B0aW9uKCctZicsICctLWZ1bGwnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZh
dWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUHJpbnQgYSBmdWxsIHRl
c3RfZXhwZWN0YXRpb25zLnR4dC1zdHlsZSBsaW5lIGZvciBldmVyeSBtYXRjaCcpLAorICAgICAg
ICBdCisgICAgICAgIEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kLl9faW5pdF9fKHNlbGYsIG9w
dGlvbnM9b3B0aW9ucykKKyAgICAgICAgc2VsZi5fcGFyc2VkX2V4cGVjdGF0aW9ucyA9IHt9CisK
KyAgICBkZWYgZ2V0X2V4cGVjdGF0aW9ucyhzZWxmLCB0b29sLCBvcHRpb25zLCBwb3J0X25hbWUs
IHRlc3RzKToKKyAgICAgICAgcG9ydCA9IHRvb2wucG9ydF9mYWN0b3J5LmdldChwb3J0X25hbWUs
IG9wdGlvbnMpCisgICAgICAgIGV4cGVjdGF0aW9uc19wYXRoID0gcG9ydC5wYXRoX3RvX3Rlc3Rf
ZXhwZWN0YXRpb25zX2ZpbGUoKQorICAgICAgICBpZiBub3QgZXhwZWN0YXRpb25zX3BhdGggaW4g
c2VsZi5fcGFyc2VkX2V4cGVjdGF0aW9uczoKKyAgICAgICAgICAgIGxpbnRfbW9kZSA9IEZhbHNl
CisgICAgICAgICAgICBzZWxmLl9wYXJzZWRfZXhwZWN0YXRpb25zW2V4cGVjdGF0aW9uc19wYXRo
XSA9IFRlc3RFeHBlY3RhdGlvbnMocG9ydCwgdGVzdHMsCisgICAgICAgICAgICAgICAgcG9ydC50
ZXN0X2V4cGVjdGF0aW9ucygpLAorICAgICAgICAgICAgICAgIHBvcnQudGVzdF9jb25maWd1cmF0
aW9uKCksCisgICAgICAgICAgICAgICAgbGludF9tb2RlLAorICAgICAgICAgICAgICAgIHBvcnQu
dGVzdF9leHBlY3RhdGlvbnNfb3ZlcnJpZGVzKCksCisgICAgICAgICAgICAgICAgcG9ydC5za2lw
cGVkX3Rlc3RzKHRlc3RzKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlZF9leHBlY3RhdGlv
bnNbZXhwZWN0YXRpb25zX3BhdGhdCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBh
cmdzLCB0b29sKToKKyAgICAgICAgaWYgbm90IGFyZ3MgYW5kIG5vdCBvcHRpb25zLmFsbDoKKyAg
ICAgICAgICAgIHByaW50ICJZb3UgbXVzdCBlaXRoZXIgc3BlY2lmeSBvbmUgb3IgbW9yZSB0ZXN0
IHBhdGhzIG9yIC0tYWxsLiIKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZmF1bHRf
cG9ydCA9IHRvb2wucG9ydF9mYWN0b3J5LmdldChvcHRpb25zPW9wdGlvbnMpCisgICAgICAgIGlm
IG9wdGlvbnMucGxhdGZvcm06CisgICAgICAgICAgICBwb3J0X25hbWVzID0gZm5tYXRjaC5maWx0
ZXIodG9vbC5wb3J0X2ZhY3RvcnkuYWxsX3BvcnRfbmFtZXMoKSwgb3B0aW9ucy5wbGF0Zm9ybSkK
KyAgICAgICAgICAgIGlmIG5vdCBwb3J0X25hbWVzOgorICAgICAgICAgICAgICAgIHByaW50ICJO
byBwb3J0IG5hbWVzIG1hdGNoICclcyciICUgb3B0aW9ucy5wbGF0Zm9ybQorICAgICAgICBlbHNl
OgorICAgICAgICAgICAgcG9ydF9uYW1lcyA9IFtkZWZhdWx0X3BvcnQubmFtZSgpXQorCisgICAg
ICAgIHRlc3RzID0gZGVmYXVsdF9wb3J0LnRlc3RzKGFyZ3MpCisKKyAgICAgICAgZm9yIHBvcnRf
bmFtZSBpbiBwb3J0X25hbWVzOgorICAgICAgICAgICAgcG9ydF9wcmludGVkID0gRmFsc2UKKyAg
ICAgICAgICAgIGV4cGVjdGF0aW9ucyA9IHNlbGYuZ2V0X2V4cGVjdGF0aW9ucyh0b29sLCBvcHRp
b25zLCBwb3J0X25hbWUsIHRlc3RzKQorICAgICAgICAgICAgZm9yIHRlc3RfbmFtZSBpbiB0ZXN0
czoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNob3VsZF9wcmludCh0ZXN0X25hbWUsIGV4cGVj
dGF0aW9ucywgb3B0aW9ucyk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwb3J0X3ByaW50
ZWQgYW5kIG5vdCBvcHRpb25zLmNzdjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIv
LyBGb3IgJXMiICUgcG9ydF9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X3ByaW50
ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfZXhwZWN0YXRpb24ob3B0
aW9ucywgdGVzdF9uYW1lLCBleHBlY3RhdGlvbnMsIHBvcnRfbmFtZSwgcG9ydF9uYW1lcykKKwor
ICAgIGRlZiBzaG91bGRfcHJpbnQoc2VsZiwgdGVzdF9uYW1lLCBleHBlY3RhdGlvbnMsIG9wdGlv
bnMpOgorICAgICAgICByZXR1cm4gKG5vdCBhbnkoZXhwZWN0YXRpb25zLmhhc19rZXl3b3JkKHRl
c3RfbmFtZSwga2V5d29yZCkgZm9yIGtleXdvcmQgaW4gb3B0aW9ucy5leGNsdWRlX2tleXdvcmQp
IGFuZAorICAgICAgICAgICAgICAgIChub3Qgb3B0aW9ucy5pbmNsdWRlX2tleXdvcmQgb3IgYW55
KGV4cGVjdGF0aW9ucy5oYXNfa2V5d29yZCh0ZXN0X25hbWUsIGtleXdvcmQpIGZvciBrZXl3b3Jk
IGluIG9wdGlvbnMuaW5jbHVkZV9rZXl3b3JkKSkpCisKKyAgICBkZWYgc2hvdWxkX3ByaW50X2V4
cGVjdGF0aW9uKHNlbGYsIG9wdGlvbnMpOgorICAgICAgICByZXR1cm4gbGVuKG9wdGlvbnMuaW5j
bHVkZV9rZXl3b3JkKSAhPSAxIG9yIGxlbihvcHRpb25zLmV4Y2x1ZGVfa2V5d29yZCkKKworICAg
IGRlZiBwcmludF9leHBlY3RhdGlvbihzZWxmLCBvcHRpb25zLCB0ZXN0X25hbWUsIGV4cGVjdGF0
aW9ucywgcG9ydF9uYW1lLCBwb3J0X25hbWVzKToKKyAgICAgICAgbW9kaWZpZXJzX3N0ciA9ICcg
Jy5qb2luKGV4cGVjdGF0aW9ucy5nZXRfbW9kaWZpZXJzKHRlc3RfbmFtZSkpLnVwcGVyKCkKKyAg
ICAgICAgZXhwZWN0YXRpb25zX3N0ciA9IGV4cGVjdGF0aW9ucy5nZXRfZXhwZWN0YXRpb25zX3N0
cmluZyh0ZXN0X25hbWUpCisgICAgICAgIGlmIG9wdGlvbnMuY3N2OgorICAgICAgICAgICAgcHJp
bnQgIiVzLCVzLCVzLCVzIiAlIChwb3J0X25hbWUsIHRlc3RfbmFtZSwgbW9kaWZpZXJzX3N0ciwg
ZXhwZWN0YXRpb25zX3N0cikKKyAgICAgICAgZWxpZiBvcHRpb25zLmZ1bGw6CisgICAgICAgICAg
ICBwcmludCAiJXMgOiAlcyA9ICVzIiAlIChtb2RpZmllcnNfc3RyLCB0ZXN0X25hbWUsIGV4cGVj
dGF0aW9uc19zdHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXMgPSB0ZXN0X25hbWUK
KyAgICAgICAgICAgIGlmIHNlbGYuc2hvdWxkX3ByaW50X2V4cGVjdGF0aW9uKG9wdGlvbnMpOgor
ICAgICAgICAgICAgICAgIHJlcyArPSAnID0gJyArIGV4cGVjdGF0aW9ucy5nZXRfZXhwZWN0YXRp
b25zX3N0cmluZyh0ZXN0X25hbWUpCisgICAgICAgICAgICBwcmludCByZXMK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>136114</attachid>
            <date>2012-04-06 18:13:48 -0700</date>
            <delta_ts>2012-04-09 17:01:17 -0700</delta_ts>
            <desc>updated per review feedback</desc>
            <filename>bug-83347-20120406181347.patch</filename>
            <type>text/plain</type>
            <size>14086</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzNTA3CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNjE1MjkyMGMzNzQyYWI0OTMzMGJjMzBmZTJjNDM4MDlk
YjVjODg5Ni4uYzM2ZmVjMDBiNWNjZmY0Mzc0Y2QyNTM0OTljNDBhZmY4YjkxNDBjMiAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDUx
IEBACiAyMDEyLTA0LTA2ICBEaXJrIFByYW5rZSAgPGRwcmFua2VAY2hyb21pdW0ub3JnPgogCisg
ICAgICAgIHdlYmtpdC1wYXRjaDogYWRkIGEgcHJpbnQtZXhwZWN0YXRpb25zIGNvbW1hbmQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgzMzQ3CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBjb21tYW5k
IHdpbGwgcHJpbnQgdGhlIGV4cGVjdGVkIHJlc3VsdHMgZm9yIGEgZ2l2ZW4gc2V0IG9mCisgICAg
ICAgIHRlc3RzIG9uIGEgZ2l2ZW4gc2V0IG9mIHBvcnRzIG1hdGNoaW5nIGEgZ2l2ZW4gc2V0IG9m
IGtleXdvcmRzLgorCisgICAgICAgIEV4YW1wbGUgb3V0cHV0IChwcmludGluZyBhbGwgdGhlIHRl
c3RzIG5vdCBleHBlY3RlZCB0byBwYXNzLCBhbmQgdGhlaXIKKyAgICAgICAgZXhwZWN0ZWQgcmVz
dWx0cywgb24gYSBNYWMpOgorCisgICAgICAgICQgd2Via2l0LXBhdGNoIHByaW50LWV4cGVjdGF0
aW9ucyAteCBwYXNzIGZhc3QvaHRtbAorICAgICAgICAvLyBGb3IgbWFjLXNub3dsZW9wYXJkCisg
ICAgICAgIGZhc3QvaHRtbC9kZXRhaWxzLW9wZW40Lmh0bWwgPSBURVhUCisgICAgICAgIGZhc3Qv
aHRtbC9kZXRhaWxzLW9wZW4yLmh0bWwgPSBURVhUCisgICAgICAgIGZhc3QvaHRtbC9kZXRhaWxz
LW5vLXN1bW1hcnk0Lmh0bWwgPSBURVhUCisgICAgICAgIGZhc3QvaHRtbC9kZXRhaWxzLW9wZW4t
amF2YXNjcmlwdC5odG1sID0gVEVYVAorICAgICAgICAkCisKKyAgICAgICAgWW91IGNhbiBhbHNv
IHByaW50IGZ1bGwgdGVzdC1leHBlY3RhdG9ucy50eHQgbGluZXMgdXNpbmcgLS1mdWxsIGFuZCBh
CisgICAgICAgIENTVi1zdHlsZSByZXBvcnQgKHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIHBvc3Qt
cHJvY2Vzc2luZykgdXNpbmcgLS1jc3YuCisKKyAgICAgICAgSXQgd2lsbCByZXBsYWNlIHRoZSAn
c2tpcHBlZC1maWxlcycgY29tbWFuZCAod2hpY2ggd2lsbCBiZQorICAgICAgICByZW1vdmVkIGlu
IGEgc3Vic2VxdWVudCBwYXRjaCkgYW5kIGlzIGEgbW9yZSBnZW5lcmFsIChhbmQKKyAgICAgICAg
Y2xlYW5lciBhbmQgcHJvcGVybHkgbGF5ZXJlZCkgc29sdXRpb24uCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9tb2RlbHMvdGVzdF9leHBlY3RhdGlvbnMucHk6Cisg
ICAgICAgIChUZXN0RXhwZWN0YXRpb25TZXJpYWxpemVyLnRvX3N0cmluZyk6CisgICAgICAgIChU
ZXN0RXhwZWN0YXRpb25TZXJpYWxpemVyKToKKyAgICAgICAgKFRlc3RFeHBlY3RhdGlvblNlcmlh
bGl6ZXIudG9fY3N2KToKKyAgICAgICAgKFRlc3RFeHBlY3RhdGlvblNlcmlhbGl6ZXIuX2Zvcm1h
dF9yZXN1bHQpOgorICAgICAgICAoVGVzdEV4cGVjdGF0aW9uTGluZS5jcmVhdGVfcGFzc2luZ19l
eHBlY3RhdGlvbik6CisgICAgICAgIChUZXN0RXhwZWN0YXRpb25zTW9kZWwuZ2V0X3Rlc3Rfc2V0
X2Zvcl9rZXl3b3JkKToKKyAgICAgICAgKFRlc3RFeHBlY3RhdGlvbnNNb2RlbC5oYXNfa2V5d29y
ZCk6CisgICAgICAgIChUZXN0RXhwZWN0YXRpb25zLm1vZGVsKToKKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVlcmllcy5weToKKyAgICAgICAgKGV4ZWN1dGUpOgor
ICAgICAgICAoUHJpbnRFeHBlY3RhdGlvbnMpOgorICAgICAgICAoUHJpbnRFeHBlY3RhdGlvbnMu
X19pbml0X18pOgorICAgICAgICAoUHJpbnRFeHBlY3RhdGlvbnMuZXhlY3V0ZSk6CisgICAgICAg
IChQcmludEV4cGVjdGF0aW9ucy5fZmlsdGVyX3Rlc3RzKToKKyAgICAgICAgKFByaW50RXhwZWN0
YXRpb25zLl9mb3JtYXRfbGluZXMpOgorICAgICAgICAoUHJpbnRFeHBlY3RhdGlvbnMuX21vZGVs
KToKKworMjAxMi0wNC0wNiAgRGlyayBQcmFua2UgIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KKwog
ICAgICAgICBuZXctcnVuLXdlYmtpdC10ZXN0czogZml4IGJ1Z3MgaW4gJ21vY2snIGRydCBpbXBs
ZW1lbnRhdGlvbgogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODMzNDEKIApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbW9kZWxzL3Rlc3RfZXhwZWN0YXRpb25zLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvbW9kZWxzL3Rlc3RfZXhwZWN0YXRpb25zLnB5CmluZGV4IDcwNTFhNWYyNDNh
NTc5Njk5NWI3OTNlYmI3NTk1ODVhMTE4YTdhM2YuLjI0MjBiOWZkZjQ5MWQ5YjJjNTdhMWJlZmJh
Njg5NTRiOGVkNDAwMzkgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL21vZGVscy90ZXN0X2V4cGVjdGF0aW9ucy5weQorKysgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9tb2RlbHMvdGVzdF9leHBlY3RhdGlvbnMucHkKQEAgLTExOSw3
ICsxMTksNyBAQCBjbGFzcyBUZXN0RXhwZWN0YXRpb25TZXJpYWxpemVyKG9iamVjdCk6CiAgICAg
ICAgIHNlbGYuX3Rlc3RfY29uZmlndXJhdGlvbl9jb252ZXJ0ZXIgPSB0ZXN0X2NvbmZpZ3VyYXRp
b25fY29udmVydGVyCiAgICAgICAgIHNlbGYuX3BhcnNlZF9leHBlY3RhdGlvbl90b19zdHJpbmcg
PSBkaWN0KFtbcGFyc2VkX2V4cGVjdGF0aW9uLCBleHBlY3RhdGlvbl9zdHJpbmddIGZvciBleHBl
Y3RhdGlvbl9zdHJpbmcsIHBhcnNlZF9leHBlY3RhdGlvbiBpbiBUZXN0RXhwZWN0YXRpb25zLkVY
UEVDVEFUSU9OUy5pdGVtcygpXSkKIAotICAgIGRlZiB0b19zdHJpbmcoc2VsZiwgZXhwZWN0YXRp
b25fbGluZSk6CisgICAgZGVmIHRvX3N0cmluZyhzZWxmLCBleHBlY3RhdGlvbl9saW5lLCBpbmNs
dWRlX21vZGlmaWVycz1UcnVlLCBpbmNsdWRlX2V4cGVjdGF0aW9ucz1UcnVlLCBpbmNsdWRlX2Nv
bW1lbnQ9VHJ1ZSk6CiAgICAgICAgIGlmIGV4cGVjdGF0aW9uX2xpbmUuaXNfaW52YWxpZCgpOgog
ICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uX2xpbmUub3JpZ2luYWxfc3RyaW5nIG9yICcn
CiAKQEAgLTEzNSw3ICsxMzUsMTUgQEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9uU2VyaWFsaXplcihv
YmplY3QpOgogICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5fZm9ybWF0X3Jlc3Vs
dChtb2RpZmllcnMsIGV4cGVjdGF0aW9uX2xpbmUubmFtZSwgZXhwZWN0YXRpb25zLCBleHBlY3Rh
dGlvbl9saW5lLmNvbW1lbnQpKQogICAgICAgICAgICAgcmV0dXJuICJcbiIuam9pbihyZXN1bHQp
IGlmIHJlc3VsdCBlbHNlIE5vbmUKIAotICAgICAgICByZXR1cm4gc2VsZi5fZm9ybWF0X3Jlc3Vs
dCgiICIuam9pbihleHBlY3RhdGlvbl9saW5lLm1vZGlmaWVycyksIGV4cGVjdGF0aW9uX2xpbmUu
bmFtZSwgIiAiLmpvaW4oZXhwZWN0YXRpb25fbGluZS5leHBlY3RhdGlvbnMpLCBleHBlY3RhdGlv
bl9saW5lLmNvbW1lbnQpCisgICAgICAgIHJldHVybiBzZWxmLl9mb3JtYXRfcmVzdWx0KCIgIi5q
b2luKGV4cGVjdGF0aW9uX2xpbmUubW9kaWZpZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZXhwZWN0YXRpb25fbGluZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiICIuam9pbihleHBlY3RhdGlvbl9saW5lLmV4cGVjdGF0aW9ucyksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9uX2xpbmUuY29tbWVu
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9tb2RpZmllcnMs
IGluY2x1ZGVfZXhwZWN0YXRpb25zLCBpbmNsdWRlX2NvbW1lbnQpCisKKyAgICBkZWYgdG9fY3N2
KHNlbGYsIGV4cGVjdGF0aW9uX2xpbmUpOgorICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGRvZXNu
J3QgaW5jbHVkZSB0aGUgY29tbWVudHMuCisgICAgICAgIHJldHVybiAnJXMsJXMsJXMnICUgKGV4
cGVjdGF0aW9uX2xpbmUubmFtZSwgJyAnLmpvaW4oZXhwZWN0YXRpb25fbGluZS5tb2RpZmllcnMp
LCAnICcuam9pbihleHBlY3RhdGlvbl9saW5lLmV4cGVjdGF0aW9ucykpCiAKICAgICBkZWYgX3Bh
cnNlZF9leHBlY3RhdGlvbnNfc3RyaW5nKHNlbGYsIGV4cGVjdGF0aW9uX2xpbmUpOgogICAgICAg
ICByZXN1bHQgPSBbXQpAQCAtMTU0LDkgKzE2MiwxNCBAQCBjbGFzcyBUZXN0RXhwZWN0YXRpb25T
ZXJpYWxpemVyKG9iamVjdCk6CiAgICAgICAgIHJldHVybiAnICcuam9pbihyZXN1bHQpCiAKICAg
ICBAY2xhc3NtZXRob2QKLSAgICBkZWYgX2Zvcm1hdF9yZXN1bHQoY2xzLCBtb2RpZmllcnMsIG5h
bWUsIGV4cGVjdGF0aW9ucywgY29tbWVudCk6Ci0gICAgICAgIHJlc3VsdCA9ICIlcyA6ICVzID0g
JXMiICUgKG1vZGlmaWVycy51cHBlcigpLCBuYW1lLCBleHBlY3RhdGlvbnMudXBwZXIoKSkKLSAg
ICAgICAgaWYgY29tbWVudCBpcyBub3QgTm9uZToKKyAgICBkZWYgX2Zvcm1hdF9yZXN1bHQoY2xz
LCBtb2RpZmllcnMsIG5hbWUsIGV4cGVjdGF0aW9ucywgY29tbWVudCwgaW5jbHVkZV9tb2RpZmll
cnM9VHJ1ZSwgaW5jbHVkZV9leHBlY3RhdGlvbnM9VHJ1ZSwgaW5jbHVkZV9jb21tZW50PVRydWUp
OgorICAgICAgICByZXN1bHQgPSAnJworICAgICAgICBpZiBpbmNsdWRlX21vZGlmaWVyczoKKyAg
ICAgICAgICAgIHJlc3VsdCArPSAnJXMgOiAnICUgbW9kaWZpZXJzLnVwcGVyKCkKKyAgICAgICAg
cmVzdWx0ICs9IG5hbWUKKyAgICAgICAgaWYgaW5jbHVkZV9leHBlY3RhdGlvbnM6CisgICAgICAg
ICAgICByZXN1bHQgKz0gJyA9ICVzJyAlIGV4cGVjdGF0aW9ucy51cHBlcigpCisgICAgICAgIGlm
IGluY2x1ZGVfY29tbWVudCBhbmQgY29tbWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHJl
c3VsdCArPSAiIC8vJXMiICUgY29tbWVudAogICAgICAgICByZXR1cm4gcmVzdWx0CiAKQEAgLTM5
NSw2ICs0MDgsNyBAQCBjbGFzcyBUZXN0RXhwZWN0YXRpb25MaW5lOgogICAgICAgICBleHBlY3Rh
dGlvbl9saW5lLm5hbWUgPSB0ZXN0CiAgICAgICAgIGV4cGVjdGF0aW9uX2xpbmUucGF0aCA9IHRl
c3QKICAgICAgICAgZXhwZWN0YXRpb25fbGluZS5wYXJzZWRfZXhwZWN0YXRpb25zID0gc2V0KFtQ
QVNTXSkKKyAgICAgICAgZXhwZWN0YXRpb25fbGluZS5leHBlY3RhdGlvbnMgPSBzZXQoWydQQVNT
J10pCiAgICAgICAgIGV4cGVjdGF0aW9uX2xpbmUubWF0Y2hpbmdfdGVzdHMgPSBbdGVzdF0KICAg
ICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uX2xpbmUKIApAQCAtNDQ1LDYgKzQ1OSwyNCBAQCBjbGFz
cyBUZXN0RXhwZWN0YXRpb25zTW9kZWwob2JqZWN0KToKIAogICAgICAgICByZXR1cm4gdGVzdHMK
IAorICAgIGRlZiBnZXRfdGVzdF9zZXRfZm9yX2tleXdvcmQoc2VsZiwga2V5d29yZCk6CisgICAg
ICAgICMgRklYTUU6IGdldF90ZXN0X3NldCgpIGlzIGFuIGF3a3dhcmQgcHVibGljIGludGVyZmFj
ZSBiZWNhdXNlIGl0IHJlcXVpcmVzCisgICAgICAgICMgY2FsbGVycyB0byBrbm93IHRoZSBkaWZm
ZXJlbmNlIGJldHdlZW4gbW9kaWZpZXJzIGFuZCBleHBlY3RhdGlvbnMuIFdlCisgICAgICAgICMg
c2hvdWxkIHJlcGxhY2UgdGhhdCB3aXRoIHRoaXMgd2hlcmUgcG9zc2libGUuCisgICAgICAgIGV4
cGVjdGF0aW9uX2VudW0gPSBUZXN0RXhwZWN0YXRpb25zLkVYUEVDVEFUSU9OUy5nZXQoa2V5d29y
ZC5sb3dlcigpLCBOb25lKQorICAgICAgICBpZiBleHBlY3RhdGlvbl9lbnVtIGlzIG5vdCBOb25l
OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2V4cGVjdGF0aW9uX3RvX3Rlc3RzW2V4cGVjdGF0
aW9uX2VudW1dCisgICAgICAgIG1vZGlmaWVyX2VudW0gPSBUZXN0RXhwZWN0YXRpb25zLk1PRElG
SUVSUy5nZXQoa2V5d29yZC5sb3dlcigpLCBOb25lKQorICAgICAgICBpZiBtb2RpZmllcl9lbnVt
IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21vZGlmaWVyX3RvX3Rlc3Rz
W21vZGlmaWVyX2VudW1dCisKKyAgICAgICAgIyBXZSBtdXN0IG5vdCBoYXZlIGFuIGluZGV4IG9u
IHRoaXMgbW9kaWZpZXIuCisgICAgICAgIG1hdGNoaW5nX3Rlc3RzID0gc2V0KCkKKyAgICAgICAg
Zm9yIHRlc3QsIG1vZGlmaWVycyBpbiBzZWxmLl90ZXN0X3RvX21vZGlmaWVycy5pdGVyaXRlbXMo
KToKKyAgICAgICAgICAgIGlmIGtleXdvcmQubG93ZXIoKSBpbiBtb2RpZmllcnM6CisgICAgICAg
ICAgICAgICAgbWF0Y2hpbmdfdGVzdHMuYWRkKHRlc3QpCisgICAgICAgIHJldHVybiBtYXRjaGlu
Z190ZXN0cworCiAgICAgZGVmIGdldF90ZXN0c193aXRoX3Jlc3VsdF90eXBlKHNlbGYsIHJlc3Vs
dF90eXBlKToKICAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc3VsdF90eXBlX3RvX3Rlc3RzW3Jlc3Vs
dF90eXBlXQogCkBAIC00NTgsNiArNDkwLDEwIEBAIGNsYXNzIFRlc3RFeHBlY3RhdGlvbnNNb2Rl
bChvYmplY3QpOgogICAgIGRlZiBoYXNfbW9kaWZpZXIoc2VsZiwgdGVzdCwgbW9kaWZpZXIpOgog
ICAgICAgICByZXR1cm4gdGVzdCBpbiBzZWxmLl9tb2RpZmllcl90b190ZXN0c1ttb2RpZmllcl0K
IAorICAgIGRlZiBoYXNfa2V5d29yZChzZWxmLCB0ZXN0LCBrZXl3b3JkKToKKyAgICAgICAgcmV0
dXJuIChrZXl3b3JkLnVwcGVyKCkgaW4gc2VsZi5nZXRfZXhwZWN0YXRpb25zX3N0cmluZyh0ZXN0
KSBvcgorICAgICAgICAgICAgICAgIGtleXdvcmQubG93ZXIoKSBpbiBzZWxmLmdldF9tb2RpZmll
cnModGVzdCkpCisKICAgICBkZWYgaGFzX3Rlc3Qoc2VsZiwgdGVzdCk6CiAgICAgICAgIHJldHVy
biB0ZXN0IGluIHNlbGYuX3Rlc3RfdG9fZXhwZWN0YXRpb25fbGluZQogCkBAIC03MjksNiArNzY1
LDggQEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9ucyhvYmplY3QpOgogCiAgICAgIyBUT0RPKG9qYW4p
OiBBbGxvdyBmb3IgcmVtb3Zpbmcgc2tpcHBlZCB0ZXN0cyB3aGVuIGdldHRpbmcgdGhlIGxpc3Qg
b2YKICAgICAjIHRlc3RzIHRvIHJ1biwgYnV0IG5vdCB3aGVuIGdldHRpbmcgbWV0cmljcy4KKyAg
ICBkZWYgbW9kZWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9tb2RlbAogCiAgICAgZGVm
IGdldF9yZWJhc2VsaW5pbmdfZmFpbHVyZXMoc2VsZik6CiAgICAgICAgIHJldHVybiAoc2VsZi5f
bW9kZWwuZ2V0X3Rlc3Rfc2V0KFJFQkFTRUxJTkUsIEZBSUwpIHwKZGlmZiAtLWdpdCBhL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9xdWVyaWVzLnB5IGIvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXJpZXMucHkKaW5kZXggOTE0NjZjZGY2NDUzZjM4
ZDM5Njg3MDlhZjY4ZTI0YWMwMTQzNTFkNy4uNGMxOWIzOGE5ZDEyY2VlYzcyMzI1MGU0OWJkNGIz
MDU4NmM4OTNlNCAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1h
bmRzL3F1ZXJpZXMucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRz
L3F1ZXJpZXMucHkKQEAgLTQsNyArNCw3IEBACiAjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogIyBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CiAjIG1ldDoKLSMgCisjCiAjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICMgICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQpAQCAtMTQsNyAr
MTQsNyBAQAogIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCiAjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jIAorIwogIyBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAjICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCiAjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgpAQCAtMjgsNiArMjgsOCBAQAogIyBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog
CiAKK2ltcG9ydCBmbm1hdGNoCisKIGZyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uCiAK
IGZyb20gd2Via2l0cHkudG9vbCBpbXBvcnQgc3RlcHMKQEAgLTQzLDYgKzQ1LDcgQEAgZnJvbSB3
ZWJraXRweS50b29sLmdyYW1tYXIgaW1wb3J0IHBsdXJhbGl6ZQogZnJvbSB3ZWJraXRweS50b29s
Lm11bHRpY29tbWFuZHRvb2wgaW1wb3J0IEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kCiBmcm9t
IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGVwcmVjYXRlZF9sb2dnaW5nIGltcG9ydCBsb2cKIGZy
b20gd2Via2l0cHkubGF5b3V0X3Rlc3RzIGltcG9ydCBwb3J0Citmcm9tIHdlYmtpdHB5LmxheW91
dF90ZXN0cy5tb2RlbHMudGVzdF9leHBlY3RhdGlvbnMgaW1wb3J0IFRlc3RFeHBlY3RhdGlvbnMs
IFRlc3RFeHBlY3RhdGlvblNlcmlhbGl6ZXIKIAogCiBjbGFzcyBTdWdnZXN0UmV2aWV3ZXJzKEFi
c3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKQEAgLTM5NywzICs0MDAsOTMgQEAgb3V0IHdoYXQg
cG9ydHMgYXJlIHNraXBwaW5nIHRoZSB0ZXN0KHMpLiBDYXRlZ29yaWVzIGFyZSB0YWtlbiBpbiBh
Y2NvdW50IHRvby4iIiIKICAgICAgICAgICAgICAgICBwcmludCAiUG9ydHMgc2tpcHBpbmcgdGVz
dCAlcjogJXMiICUgKHRlc3RfbmFtZSwgJywgJy5qb2luKHBvcnRzKSkKICAgICAgICAgICAgIGVs
c2U6CiAgICAgICAgICAgICAgICAgcHJpbnQgIlRlc3QgJXIgaXMgbm90IHNraXBwZWQgYnkgYW55
IHBvcnQuIiAlIHRlc3RfbmFtZQorCisKK2NsYXNzIFByaW50RXhwZWN0YXRpb25zKEFic3RyYWN0
RGVjbGFyYXRpdmVDb21tYW5kKToKKyAgICBuYW1lID0gJ3ByaW50LWV4cGVjdGF0aW9ucycKKyAg
ICBoZWxwX3RleHQgPSAnUHJpbnQgdGhlIGV4cGVjdGVkIHJlc3VsdCBmb3IgdGhlIGdpdmVuIHRl
c3Qocykgb24gdGhlIGdpdmVuIHBvcnQocyknCisgICAgYXJndW1lbnRfbmFtZXMgPSAiVEVTVF9O
QU1FIgorCisgICAgVFlQRVMgPSBzZXQoeC51cHBlcigpIGZvciB4IGluIChUZXN0RXhwZWN0YXRp
b25zLkVYUEVDVEFUSU9OUy5rZXlzKCkgKyBUZXN0RXhwZWN0YXRpb25zLk1PRElGSUVSUy5rZXlz
KCkpKS5kaWZmZXJlbmNlKHNldChbJ05PTkUnXSkpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6
CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbignLXAnLCAnLS1w
bGF0Zm9ybScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0n
cGxhdGZvcm0vcG9ydChzKSB0byBkaXNwbGF5IGV4cGVjdGF0aW9ucyBmb3IuIFVzZSBnbG9iLXN0
eWxlIHdpbGRjYXJkcyBmb3IgbXVsdGlwbGUgcG9ydHMnKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0
aW9uKCctLWFsbCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAg
ICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRoZSBleHBlY3RhdGlvbnMgZm9yICphbGwq
IHRlc3RzJyksCisgICAgICAgICAgICBtYWtlX29wdGlvbignLXgnLCAnLS1leGNsdWRlLWtleXdv
cmQnLCBhY3Rpb249J2FwcGVuZCcsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAg
ICBoZWxwPSdsaW1pdCB0byB0ZXN0cyBub3QgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleXdvcmQgKGZv
ciBleGFtcGxlLCAic2tpcCIsICJzbG93Iiwgb3IgImNyYXNoIi4gTWF5IHNwZWNpZnkgbXVsdGlw
bGUgdGltZXMnKSwKKyAgICAgICAgICAgICBtYWtlX29wdGlvbignLWknLCAnLS1pbmNsdWRlLWtl
eXdvcmQnLCBhY3Rpb249J2FwcGVuZCcsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAg
ICAgICBoZWxwPSdsaW1pdCB0byB0ZXN0cyB3aXRoIHRoZSBnaXZlbiBrZXl3b3JkIChmb3IgZXhh
bXBsZSwgInNraXAiLCAic2xvdyIsIG9yICJjcmFzaCIuIE1heSBzcGVjaWZ5IG11bHRpcGxlIHRp
bWVzJyksCisgICAgICAgICAgICBtYWtlX29wdGlvbignLS1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVf
Y29uc3QnLCBjb25zdD0nRGVidWcnLCBkZXN0PSdjb25maWd1cmF0aW9uJywKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGhlbHA9J1NldCB0aGUgY29uZmlndXJhdGlvbiB0byBEZWJ1ZycpLAorICAg
ICAgICAgICAgbWFrZV9vcHRpb24oJy0tcmVsZWFzZScsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBj
b25zdD0nUmVsZWFzZScsIGRlc3Q9J2NvbmZpZ3VyYXRpb24nLAorICAgICAgICAgICAgICAgICAg
ICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIFJlbGVhc2UnKSwKKyAgICAgICAg
ICAgIG1ha2Vfb3B0aW9uKCctLWNzdicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFs
c2UsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQcmludCBhIENTVi1zdHlsZSByZXBv
cnQgdGhhdCBpbmNsdWRlcyB0aGUgcG9ydCBuYW1lLCBtb2RpZmllcnMsIHRlc3RzLCBhbmQgZXhw
ZWN0YXRpb25zJyksCisgICAgICAgICAgICBtYWtlX29wdGlvbignLWYnLCAnLS1mdWxsJywgYWN0
aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGhlbHA9J1ByaW50IGEgZnVsbCB0ZXN0X2V4cGVjdGF0aW9ucy50eHQtc3R5bGUgbGluZSBmb3Ig
ZXZlcnkgbWF0Y2gnKSwKKyAgICAgICAgXQorICAgICAgICBBYnN0cmFjdERlY2xhcmF0aXZlQ29t
bWFuZC5fX2luaXRfXyhzZWxmLCBvcHRpb25zPW9wdGlvbnMpCisgICAgICAgIHNlbGYuX2V4cGVj
dGF0aW9uX21vZGVscyA9IHt9CisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdz
LCB0b29sKToKKyAgICAgICAgaWYgbm90IGFyZ3MgYW5kIG5vdCBvcHRpb25zLmFsbDoKKyAgICAg
ICAgICAgIHByaW50ICJZb3UgbXVzdCBlaXRoZXIgc3BlY2lmeSBvbmUgb3IgbW9yZSB0ZXN0IHBh
dGhzIG9yIC0tYWxsLiIKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZmF1bHRfcG9y
dCA9IHRvb2wucG9ydF9mYWN0b3J5LmdldChvcHRpb25zPW9wdGlvbnMpCisgICAgICAgIGlmIG9w
dGlvbnMucGxhdGZvcm06CisgICAgICAgICAgICBwb3J0X25hbWVzID0gZm5tYXRjaC5maWx0ZXIo
dG9vbC5wb3J0X2ZhY3RvcnkuYWxsX3BvcnRfbmFtZXMoKSwgb3B0aW9ucy5wbGF0Zm9ybSkKKyAg
ICAgICAgICAgIGlmIG5vdCBwb3J0X25hbWVzOgorICAgICAgICAgICAgICAgIHByaW50ICJObyBw
b3J0IG5hbWVzIG1hdGNoICclcyciICUgb3B0aW9ucy5wbGF0Zm9ybQorICAgICAgICAgICAgICAg
IHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9ydF9uYW1lcyA9IFtkZWZhdWx0
X3BvcnQubmFtZSgpXQorCisgICAgICAgIHNlcmlhbGl6ZXIgPSBUZXN0RXhwZWN0YXRpb25TZXJp
YWxpemVyKCkKKyAgICAgICAgdGVzdHMgPSBkZWZhdWx0X3BvcnQudGVzdHMoYXJncykKKyAgICAg
ICAgZm9yIHBvcnRfbmFtZSBpbiBwb3J0X25hbWVzOgorICAgICAgICAgICAgbW9kZWwgPSBzZWxm
Ll9tb2RlbChvcHRpb25zLCBwb3J0X25hbWUsIHRlc3RzKQorICAgICAgICAgICAgdGVzdHNfdG9f
cHJpbnQgPSBzZWxmLl9maWx0ZXJfdGVzdHMob3B0aW9ucywgbW9kZWwsIHRlc3RzKQorICAgICAg
ICAgICAgbGluZXMgPSBbbW9kZWwuZ2V0X2V4cGVjdGF0aW9uX2xpbmUodGVzdCkgZm9yIHRlc3Qg
aW4gc29ydGVkKHRlc3RzX3RvX3ByaW50KV0KKyAgICAgICAgICAgIHByaW50ICdcbicuam9pbihz
ZWxmLl9mb3JtYXRfbGluZXMob3B0aW9ucywgcG9ydF9uYW1lLCBzZXJpYWxpemVyLCBsaW5lcykp
CisKKyAgICBkZWYgX2ZpbHRlcl90ZXN0cyhzZWxmLCBvcHRpb25zLCBtb2RlbCwgdGVzdHMpOgor
ICAgICAgICBmaWx0ZXJlZF90ZXN0cyA9IHNldCgpCisgICAgICAgIGlmIG9wdGlvbnMuaW5jbHVk
ZV9rZXl3b3JkOgorICAgICAgICAgICAgZm9yIGtleXdvcmQgaW4gb3B0aW9ucy5pbmNsdWRlX2tl
eXdvcmQ6CisgICAgICAgICAgICAgICAgZmlsdGVyZWRfdGVzdHMudXBkYXRlKG1vZGVsLmdldF90
ZXN0X3NldF9mb3Jfa2V5d29yZChrZXl3b3JkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAg
IGZpbHRlcmVkX3Rlc3RzID0gdGVzdHMKKworICAgICAgICBmb3Iga2V5d29yZCBpbiBvcHRpb25z
LmV4Y2x1ZGVfa2V5d29yZDoKKyAgICAgICAgICAgIGZpbHRlcmVkX3Rlc3RzLmRpZmZlcmVuY2Vf
dXBkYXRlKG1vZGVsLmdldF90ZXN0X3NldF9mb3Jfa2V5d29yZChrZXl3b3JkKSkKKyAgICAgICAg
cmV0dXJuIGZpbHRlcmVkX3Rlc3RzCisKKyAgICBkZWYgX2Zvcm1hdF9saW5lcyhzZWxmLCBvcHRp
b25zLCBwb3J0X25hbWUsIHNlcmlhbGl6ZXIsIGxpbmVzKToKKyAgICAgICAgb3V0cHV0ID0gW10K
KyAgICAgICAgaWYgb3B0aW9ucy5jc3Y6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoK
KyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlcywlcyIgJSAocG9ydF9uYW1lLCBzZXJp
YWxpemVyLnRvX2NzdihsaW5lKSkpCisgICAgICAgIGVsaWYgbGluZXM6CisgICAgICAgICAgICBp
bmNsdWRlX21vZGlmaWVycyA9IG9wdGlvbnMuZnVsbAorICAgICAgICAgICAgaW5jbHVkZV9leHBl
Y3RhdGlvbnMgPSBvcHRpb25zLmZ1bGwgb3IgbGVuKG9wdGlvbnMuaW5jbHVkZV9rZXl3b3JkKSAh
PSAxIG9yIGxlbihvcHRpb25zLmV4Y2x1ZGVfa2V5d29yZCkKKyAgICAgICAgICAgIG91dHB1dC5h
cHBlbmQoIi8vIEZvciAlcyIgJSBwb3J0X25hbWUpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBs
aW5lczoKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlcyIgJSBzZXJpYWxpemVyLnRv
X3N0cmluZyhsaW5lLCBpbmNsdWRlX21vZGlmaWVycywgaW5jbHVkZV9leHBlY3RhdGlvbnMsIGlu
Y2x1ZGVfY29tbWVudD1GYWxzZSkpCisgICAgICAgIHJldHVybiBvdXRwdXQKKworICAgIGRlZiBf
bW9kZWwoc2VsZiwgb3B0aW9ucywgcG9ydF9uYW1lLCB0ZXN0cyk6CisgICAgICAgIHBvcnQgPSBz
ZWxmLl90b29sLnBvcnRfZmFjdG9yeS5nZXQocG9ydF9uYW1lLCBvcHRpb25zKQorICAgICAgICBl
eHBlY3RhdGlvbnNfcGF0aCA9IHBvcnQucGF0aF90b190ZXN0X2V4cGVjdGF0aW9uc19maWxlKCkK
KyAgICAgICAgaWYgbm90IGV4cGVjdGF0aW9uc19wYXRoIGluIHNlbGYuX2V4cGVjdGF0aW9uX21v
ZGVsczoKKyAgICAgICAgICAgIGxpbnRfbW9kZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLl9l
eHBlY3RhdGlvbl9tb2RlbHNbZXhwZWN0YXRpb25zX3BhdGhdID0gVGVzdEV4cGVjdGF0aW9ucyhw
b3J0LCB0ZXN0cywKKyAgICAgICAgICAgICAgICBwb3J0LnRlc3RfZXhwZWN0YXRpb25zKCksCisg
ICAgICAgICAgICAgICAgcG9ydC50ZXN0X2NvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAg
ICBsaW50X21vZGUsCisgICAgICAgICAgICAgICAgcG9ydC50ZXN0X2V4cGVjdGF0aW9uc19vdmVy
cmlkZXMoKSwKKyAgICAgICAgICAgICAgICBwb3J0LnNraXBwZWRfdGVzdHModGVzdHMpKS5tb2Rl
bCgpCisgICAgICAgIHJldHVybiBzZWxmLl9leHBlY3RhdGlvbl9tb2RlbHNbZXhwZWN0YXRpb25z
X3BhdGhdCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>136349</attachid>
            <date>2012-04-09 17:01:21 -0700</date>
            <delta_ts>2012-04-10 18:12:20 -0700</delta_ts>
            <desc>add test, more review feedback, merge to head</desc>
            <filename>bug-83347-20120409170120.patch</filename>
            <type>text/plain</type>
            <size>17320</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzNjQyCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNDljMDM3MjUyZDUyYzdhM2U1ZWQxOGQzYzUwYjllZTkz
OGRkNzBiNC4uOTQxMzBmMjJjZTg2YmZjOGFlY2NmODE3YzUxZTE4ZmE1ODU4YzFlYSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDU5
IEBACiAyMDEyLTA0LTA5ICBEaXJrIFByYW5rZSAgPGRwcmFua2VAY2hyb21pdW0ub3JnPgogCisg
ICAgICAgIHdlYmtpdC1wYXRjaDogYWRkIGEgcHJpbnQtZXhwZWN0YXRpb25zIGNvbW1hbmQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgzMzQ3CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBjb21tYW5k
IHdpbGwgcHJpbnQgdGhlIGV4cGVjdGVkIHJlc3VsdHMgZm9yIGEgZ2l2ZW4gc2V0IG9mCisgICAg
ICAgIHRlc3RzIG9uIGEgZ2l2ZW4gc2V0IG9mIHBvcnRzIG1hdGNoaW5nIGEgZ2l2ZW4gc2V0IG9m
IGtleXdvcmRzLgorCisgICAgICAgIEV4YW1wbGUgb3V0cHV0IChwcmludGluZyBhbGwgdGhlIHRl
c3RzIG5vdCBleHBlY3RlZCB0byBwYXNzLCBhbmQgdGhlaXIKKyAgICAgICAgZXhwZWN0ZWQgcmVz
dWx0cywgb24gYSBNYWMpOgorCisgICAgICAgICQgd2Via2l0LXBhdGNoIHByaW50LWV4cGVjdGF0
aW9ucyAteCBwYXNzIGZhc3QvaHRtbAorICAgICAgICAvLyBGb3IgbWFjLXNub3dsZW9wYXJkCisg
ICAgICAgIGZhc3QvaHRtbC9kZXRhaWxzLW9wZW40Lmh0bWwgPSBURVhUCisgICAgICAgIGZhc3Qv
aHRtbC9kZXRhaWxzLW9wZW4yLmh0bWwgPSBURVhUCisgICAgICAgIGZhc3QvaHRtbC9kZXRhaWxz
LW5vLXN1bW1hcnk0Lmh0bWwgPSBURVhUCisgICAgICAgIGZhc3QvaHRtbC9kZXRhaWxzLW9wZW4t
amF2YXNjcmlwdC5odG1sID0gVEVYVAorICAgICAgICAkCisKKyAgICAgICAgWW91IGNhbiBhbHNv
IHByaW50IGZ1bGwgdGVzdC1leHBlY3RhdG9ucy50eHQgbGluZXMgdXNpbmcgLS1mdWxsIGFuZCBh
CisgICAgICAgIENTVi1zdHlsZSByZXBvcnQgKHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIHBvc3Qt
cHJvY2Vzc2luZykgdXNpbmcgLS1jc3YuCisKKyAgICAgICAgSXQgd2lsbCByZXBsYWNlIHRoZSAn
c2tpcHBlZC1maWxlcycgY29tbWFuZCAod2hpY2ggd2lsbCBiZQorICAgICAgICByZW1vdmVkIGlu
IGEgc3Vic2VxdWVudCBwYXRjaCkgYW5kIGlzIGEgbW9yZSBnZW5lcmFsIChhbmQKKyAgICAgICAg
Y2xlYW5lciBhbmQgcHJvcGVybHkgbGF5ZXJlZCkgc29sdXRpb24uCisKKyAgICAgICAgQWxzbyBh
ZGQgYW4gdXBkYXRlKCkgY29tbWFuZCB0byBNb2NrT3B0aW9ucygpIHRvIG1ha2Ugb3ZlcnJpZGlu
ZyBrZXl3b3JkcyBlYXNpZXIuCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9tb2RlbHMvdGVzdF9leHBlY3RhdGlvbnMucHk6CisgICAgICAgIChUZXN0RXhwZWN0YXRp
b25TZXJpYWxpemVyLnRvX3N0cmluZyk6CisgICAgICAgIChUZXN0RXhwZWN0YXRpb25TZXJpYWxp
emVyKToKKyAgICAgICAgKFRlc3RFeHBlY3RhdGlvblNlcmlhbGl6ZXIudG9fY3N2KToKKyAgICAg
ICAgKFRlc3RFeHBlY3RhdGlvblNlcmlhbGl6ZXIuX2Zvcm1hdF9yZXN1bHQpOgorICAgICAgICAo
VGVzdEV4cGVjdGF0aW9uTGluZS5jcmVhdGVfcGFzc2luZ19leHBlY3RhdGlvbik6CisgICAgICAg
IChUZXN0RXhwZWN0YXRpb25zTW9kZWwuZ2V0X3Rlc3Rfc2V0X2Zvcl9rZXl3b3JkKToKKyAgICAg
ICAgKFRlc3RFeHBlY3RhdGlvbnNNb2RlbC5oYXNfa2V5d29yZCk6CisgICAgICAgIChUZXN0RXhw
ZWN0YXRpb25zLm1vZGVsKToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvcXVlcmllcy5weToKKyAgICAgICAgKGV4ZWN1dGUpOgorICAgICAgICAoUHJpbnRFeHBlY3Rh
dGlvbnMpOgorICAgICAgICAoUHJpbnRFeHBlY3RhdGlvbnMuX19pbml0X18pOgorICAgICAgICAo
UHJpbnRFeHBlY3RhdGlvbnMuZXhlY3V0ZSk6CisgICAgICAgIChQcmludEV4cGVjdGF0aW9ucy5f
ZmlsdGVyX3Rlc3RzKToKKyAgICAgICAgKFByaW50RXhwZWN0YXRpb25zLl9mb3JtYXRfbGluZXMp
OgorICAgICAgICAoUHJpbnRFeHBlY3RhdGlvbnMuX21vZGVsKToKKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcXVlcmllc191bml0dGVzdC5weToKKyAgICAgICAgKFRl
c3RQcmludEV4cGVjdGF0aW9ucyk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkv
dG9vbC9tb2NrdG9vbC5weToKKyAgICAgICAgKE1vY2tPcHRpb25zKToKKyAgICAgICAgKE1vY2tP
cHRpb25zLl9faW5pdF9fKToKKyAgICAgICAgKE1vY2tPcHRpb25zLnVwZGF0ZSk6IEFkZGVkLgor
CisyMDEyLTA0LTA5ICBEaXJrIFByYW5rZSAgPGRwcmFua2VAY2hyb21pdW0ub3JnPgorCiAgICAg
ICAgIGFkZCBhIHdlYmtpdC1wYXRjaCBwcmludC1iYXNlbGluZXMgY29tbWFuZAogICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODMzNDgKIApkaWZmIC0tZ2l0
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbW9kZWxzL3Rlc3RfZXhwZWN0
YXRpb25zLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbW9kZWxzL3Rl
c3RfZXhwZWN0YXRpb25zLnB5CmluZGV4IDcwNTFhNWYyNDNhNTc5Njk5NWI3OTNlYmI3NTk1ODVh
MTE4YTdhM2YuLjI0MjBiOWZkZjQ5MWQ5YjJjNTdhMWJlZmJhNjg5NTRiOGVkNDAwMzkgMTAwNjQ0
Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL21vZGVscy90ZXN0X2V4
cGVjdGF0aW9ucy5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9t
b2RlbHMvdGVzdF9leHBlY3RhdGlvbnMucHkKQEAgLTExOSw3ICsxMTksNyBAQCBjbGFzcyBUZXN0
RXhwZWN0YXRpb25TZXJpYWxpemVyKG9iamVjdCk6CiAgICAgICAgIHNlbGYuX3Rlc3RfY29uZmln
dXJhdGlvbl9jb252ZXJ0ZXIgPSB0ZXN0X2NvbmZpZ3VyYXRpb25fY29udmVydGVyCiAgICAgICAg
IHNlbGYuX3BhcnNlZF9leHBlY3RhdGlvbl90b19zdHJpbmcgPSBkaWN0KFtbcGFyc2VkX2V4cGVj
dGF0aW9uLCBleHBlY3RhdGlvbl9zdHJpbmddIGZvciBleHBlY3RhdGlvbl9zdHJpbmcsIHBhcnNl
ZF9leHBlY3RhdGlvbiBpbiBUZXN0RXhwZWN0YXRpb25zLkVYUEVDVEFUSU9OUy5pdGVtcygpXSkK
IAotICAgIGRlZiB0b19zdHJpbmcoc2VsZiwgZXhwZWN0YXRpb25fbGluZSk6CisgICAgZGVmIHRv
X3N0cmluZyhzZWxmLCBleHBlY3RhdGlvbl9saW5lLCBpbmNsdWRlX21vZGlmaWVycz1UcnVlLCBp
bmNsdWRlX2V4cGVjdGF0aW9ucz1UcnVlLCBpbmNsdWRlX2NvbW1lbnQ9VHJ1ZSk6CiAgICAgICAg
IGlmIGV4cGVjdGF0aW9uX2xpbmUuaXNfaW52YWxpZCgpOgogICAgICAgICAgICAgcmV0dXJuIGV4
cGVjdGF0aW9uX2xpbmUub3JpZ2luYWxfc3RyaW5nIG9yICcnCiAKQEAgLTEzNSw3ICsxMzUsMTUg
QEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9uU2VyaWFsaXplcihvYmplY3QpOgogICAgICAgICAgICAg
ICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5fZm9ybWF0X3Jlc3VsdChtb2RpZmllcnMsIGV4cGVjdGF0
aW9uX2xpbmUubmFtZSwgZXhwZWN0YXRpb25zLCBleHBlY3RhdGlvbl9saW5lLmNvbW1lbnQpKQog
ICAgICAgICAgICAgcmV0dXJuICJcbiIuam9pbihyZXN1bHQpIGlmIHJlc3VsdCBlbHNlIE5vbmUK
IAotICAgICAgICByZXR1cm4gc2VsZi5fZm9ybWF0X3Jlc3VsdCgiICIuam9pbihleHBlY3RhdGlv
bl9saW5lLm1vZGlmaWVycyksIGV4cGVjdGF0aW9uX2xpbmUubmFtZSwgIiAiLmpvaW4oZXhwZWN0
YXRpb25fbGluZS5leHBlY3RhdGlvbnMpLCBleHBlY3RhdGlvbl9saW5lLmNvbW1lbnQpCisgICAg
ICAgIHJldHVybiBzZWxmLl9mb3JtYXRfcmVzdWx0KCIgIi5qb2luKGV4cGVjdGF0aW9uX2xpbmUu
bW9kaWZpZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0YXRp
b25fbGluZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIuam9p
bihleHBlY3RhdGlvbl9saW5lLmV4cGVjdGF0aW9ucyksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGV4cGVjdGF0aW9uX2xpbmUuY29tbWVudCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaW5jbHVkZV9tb2RpZmllcnMsIGluY2x1ZGVfZXhwZWN0YXRpb25z
LCBpbmNsdWRlX2NvbW1lbnQpCisKKyAgICBkZWYgdG9fY3N2KHNlbGYsIGV4cGVjdGF0aW9uX2xp
bmUpOgorICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgaW5jbHVkZSB0aGUgY29tbWVu
dHMuCisgICAgICAgIHJldHVybiAnJXMsJXMsJXMnICUgKGV4cGVjdGF0aW9uX2xpbmUubmFtZSwg
JyAnLmpvaW4oZXhwZWN0YXRpb25fbGluZS5tb2RpZmllcnMpLCAnICcuam9pbihleHBlY3RhdGlv
bl9saW5lLmV4cGVjdGF0aW9ucykpCiAKICAgICBkZWYgX3BhcnNlZF9leHBlY3RhdGlvbnNfc3Ry
aW5nKHNlbGYsIGV4cGVjdGF0aW9uX2xpbmUpOgogICAgICAgICByZXN1bHQgPSBbXQpAQCAtMTU0
LDkgKzE2MiwxNCBAQCBjbGFzcyBUZXN0RXhwZWN0YXRpb25TZXJpYWxpemVyKG9iamVjdCk6CiAg
ICAgICAgIHJldHVybiAnICcuam9pbihyZXN1bHQpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBk
ZWYgX2Zvcm1hdF9yZXN1bHQoY2xzLCBtb2RpZmllcnMsIG5hbWUsIGV4cGVjdGF0aW9ucywgY29t
bWVudCk6Ci0gICAgICAgIHJlc3VsdCA9ICIlcyA6ICVzID0gJXMiICUgKG1vZGlmaWVycy51cHBl
cigpLCBuYW1lLCBleHBlY3RhdGlvbnMudXBwZXIoKSkKLSAgICAgICAgaWYgY29tbWVudCBpcyBu
b3QgTm9uZToKKyAgICBkZWYgX2Zvcm1hdF9yZXN1bHQoY2xzLCBtb2RpZmllcnMsIG5hbWUsIGV4
cGVjdGF0aW9ucywgY29tbWVudCwgaW5jbHVkZV9tb2RpZmllcnM9VHJ1ZSwgaW5jbHVkZV9leHBl
Y3RhdGlvbnM9VHJ1ZSwgaW5jbHVkZV9jb21tZW50PVRydWUpOgorICAgICAgICByZXN1bHQgPSAn
JworICAgICAgICBpZiBpbmNsdWRlX21vZGlmaWVyczoKKyAgICAgICAgICAgIHJlc3VsdCArPSAn
JXMgOiAnICUgbW9kaWZpZXJzLnVwcGVyKCkKKyAgICAgICAgcmVzdWx0ICs9IG5hbWUKKyAgICAg
ICAgaWYgaW5jbHVkZV9leHBlY3RhdGlvbnM6CisgICAgICAgICAgICByZXN1bHQgKz0gJyA9ICVz
JyAlIGV4cGVjdGF0aW9ucy51cHBlcigpCisgICAgICAgIGlmIGluY2x1ZGVfY29tbWVudCBhbmQg
Y29tbWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHJlc3VsdCArPSAiIC8vJXMiICUgY29t
bWVudAogICAgICAgICByZXR1cm4gcmVzdWx0CiAKQEAgLTM5NSw2ICs0MDgsNyBAQCBjbGFzcyBU
ZXN0RXhwZWN0YXRpb25MaW5lOgogICAgICAgICBleHBlY3RhdGlvbl9saW5lLm5hbWUgPSB0ZXN0
CiAgICAgICAgIGV4cGVjdGF0aW9uX2xpbmUucGF0aCA9IHRlc3QKICAgICAgICAgZXhwZWN0YXRp
b25fbGluZS5wYXJzZWRfZXhwZWN0YXRpb25zID0gc2V0KFtQQVNTXSkKKyAgICAgICAgZXhwZWN0
YXRpb25fbGluZS5leHBlY3RhdGlvbnMgPSBzZXQoWydQQVNTJ10pCiAgICAgICAgIGV4cGVjdGF0
aW9uX2xpbmUubWF0Y2hpbmdfdGVzdHMgPSBbdGVzdF0KICAgICAgICAgcmV0dXJuIGV4cGVjdGF0
aW9uX2xpbmUKIApAQCAtNDQ1LDYgKzQ1OSwyNCBAQCBjbGFzcyBUZXN0RXhwZWN0YXRpb25zTW9k
ZWwob2JqZWN0KToKIAogICAgICAgICByZXR1cm4gdGVzdHMKIAorICAgIGRlZiBnZXRfdGVzdF9z
ZXRfZm9yX2tleXdvcmQoc2VsZiwga2V5d29yZCk6CisgICAgICAgICMgRklYTUU6IGdldF90ZXN0
X3NldCgpIGlzIGFuIGF3a3dhcmQgcHVibGljIGludGVyZmFjZSBiZWNhdXNlIGl0IHJlcXVpcmVz
CisgICAgICAgICMgY2FsbGVycyB0byBrbm93IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbW9kaWZp
ZXJzIGFuZCBleHBlY3RhdGlvbnMuIFdlCisgICAgICAgICMgc2hvdWxkIHJlcGxhY2UgdGhhdCB3
aXRoIHRoaXMgd2hlcmUgcG9zc2libGUuCisgICAgICAgIGV4cGVjdGF0aW9uX2VudW0gPSBUZXN0
RXhwZWN0YXRpb25zLkVYUEVDVEFUSU9OUy5nZXQoa2V5d29yZC5sb3dlcigpLCBOb25lKQorICAg
ICAgICBpZiBleHBlY3RhdGlvbl9lbnVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJu
IHNlbGYuX2V4cGVjdGF0aW9uX3RvX3Rlc3RzW2V4cGVjdGF0aW9uX2VudW1dCisgICAgICAgIG1v
ZGlmaWVyX2VudW0gPSBUZXN0RXhwZWN0YXRpb25zLk1PRElGSUVSUy5nZXQoa2V5d29yZC5sb3dl
cigpLCBOb25lKQorICAgICAgICBpZiBtb2RpZmllcl9lbnVtIGlzIG5vdCBOb25lOgorICAgICAg
ICAgICAgcmV0dXJuIHNlbGYuX21vZGlmaWVyX3RvX3Rlc3RzW21vZGlmaWVyX2VudW1dCisKKyAg
ICAgICAgIyBXZSBtdXN0IG5vdCBoYXZlIGFuIGluZGV4IG9uIHRoaXMgbW9kaWZpZXIuCisgICAg
ICAgIG1hdGNoaW5nX3Rlc3RzID0gc2V0KCkKKyAgICAgICAgZm9yIHRlc3QsIG1vZGlmaWVycyBp
biBzZWxmLl90ZXN0X3RvX21vZGlmaWVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtl
eXdvcmQubG93ZXIoKSBpbiBtb2RpZmllcnM6CisgICAgICAgICAgICAgICAgbWF0Y2hpbmdfdGVz
dHMuYWRkKHRlc3QpCisgICAgICAgIHJldHVybiBtYXRjaGluZ190ZXN0cworCiAgICAgZGVmIGdl
dF90ZXN0c193aXRoX3Jlc3VsdF90eXBlKHNlbGYsIHJlc3VsdF90eXBlKToKICAgICAgICAgcmV0
dXJuIHNlbGYuX3Jlc3VsdF90eXBlX3RvX3Rlc3RzW3Jlc3VsdF90eXBlXQogCkBAIC00NTgsNiAr
NDkwLDEwIEBAIGNsYXNzIFRlc3RFeHBlY3RhdGlvbnNNb2RlbChvYmplY3QpOgogICAgIGRlZiBo
YXNfbW9kaWZpZXIoc2VsZiwgdGVzdCwgbW9kaWZpZXIpOgogICAgICAgICByZXR1cm4gdGVzdCBp
biBzZWxmLl9tb2RpZmllcl90b190ZXN0c1ttb2RpZmllcl0KIAorICAgIGRlZiBoYXNfa2V5d29y
ZChzZWxmLCB0ZXN0LCBrZXl3b3JkKToKKyAgICAgICAgcmV0dXJuIChrZXl3b3JkLnVwcGVyKCkg
aW4gc2VsZi5nZXRfZXhwZWN0YXRpb25zX3N0cmluZyh0ZXN0KSBvcgorICAgICAgICAgICAgICAg
IGtleXdvcmQubG93ZXIoKSBpbiBzZWxmLmdldF9tb2RpZmllcnModGVzdCkpCisKICAgICBkZWYg
aGFzX3Rlc3Qoc2VsZiwgdGVzdCk6CiAgICAgICAgIHJldHVybiB0ZXN0IGluIHNlbGYuX3Rlc3Rf
dG9fZXhwZWN0YXRpb25fbGluZQogCkBAIC03MjksNiArNzY1LDggQEAgY2xhc3MgVGVzdEV4cGVj
dGF0aW9ucyhvYmplY3QpOgogCiAgICAgIyBUT0RPKG9qYW4pOiBBbGxvdyBmb3IgcmVtb3Zpbmcg
c2tpcHBlZCB0ZXN0cyB3aGVuIGdldHRpbmcgdGhlIGxpc3Qgb2YKICAgICAjIHRlc3RzIHRvIHJ1
biwgYnV0IG5vdCB3aGVuIGdldHRpbmcgbWV0cmljcy4KKyAgICBkZWYgbW9kZWwoc2VsZik6Cisg
ICAgICAgIHJldHVybiBzZWxmLl9tb2RlbAogCiAgICAgZGVmIGdldF9yZWJhc2VsaW5pbmdfZmFp
bHVyZXMoc2VsZik6CiAgICAgICAgIHJldHVybiAoc2VsZi5fbW9kZWwuZ2V0X3Rlc3Rfc2V0KFJF
QkFTRUxJTkUsIEZBSUwpIHwKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9jb21tYW5kcy9xdWVyaWVzLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1h
bmRzL3F1ZXJpZXMucHkKaW5kZXggMzVhMDEwMWY1OWY2OTE0ZWJiZmRhNGJiYTQxNzcwOWU3YTg5
ZDgxYS4uYmUyM2ZmMGY5ZTdhNzFjYzAzNzBmMzUxMzM3ZWIzNTY5NmVmMmYxNCAxMDA2NDQKLS0t
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXJpZXMucHkKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXJpZXMucHkKQEAgLTQ1LDYg
KzQ1LDcgQEAgZnJvbSB3ZWJraXRweS50b29sLmdyYW1tYXIgaW1wb3J0IHBsdXJhbGl6ZQogZnJv
bSB3ZWJraXRweS50b29sLm11bHRpY29tbWFuZHRvb2wgaW1wb3J0IEFic3RyYWN0RGVjbGFyYXRp
dmVDb21tYW5kCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGVwcmVjYXRlZF9sb2dnaW5n
IGltcG9ydCBsb2cKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzIGltcG9ydCBwb3J0Citmcm9t
IHdlYmtpdHB5LmxheW91dF90ZXN0cy5tb2RlbHMudGVzdF9leHBlY3RhdGlvbnMgaW1wb3J0IFRl
c3RFeHBlY3RhdGlvbnMsIFRlc3RFeHBlY3RhdGlvblNlcmlhbGl6ZXIKIAogCiBjbGFzcyBTdWdn
ZXN0UmV2aWV3ZXJzKEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKQEAgLTQwMSw2ICs0MDIs
MTAwIEBAIG91dCB3aGF0IHBvcnRzIGFyZSBza2lwcGluZyB0aGUgdGVzdChzKS4gQ2F0ZWdvcmll
cyBhcmUgdGFrZW4gaW4gYWNjb3VudCB0b28uIiIiCiAgICAgICAgICAgICAgICAgcHJpbnQgIlRl
c3QgJXIgaXMgbm90IHNraXBwZWQgYnkgYW55IHBvcnQuIiAlIHRlc3RfbmFtZQogCiAKK2NsYXNz
IFByaW50RXhwZWN0YXRpb25zKEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKKyAgICBuYW1l
ID0gJ3ByaW50LWV4cGVjdGF0aW9ucycKKyAgICBoZWxwX3RleHQgPSAnUHJpbnQgdGhlIGV4cGVj
dGVkIHJlc3VsdCBmb3IgdGhlIGdpdmVuIHRlc3Qocykgb24gdGhlIGdpdmVuIHBvcnQocyknCisK
KyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAg
ICBtYWtlX29wdGlvbignLXAnLCAnLS1wbGF0Zm9ybScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgaGVscD0ncGxhdGZvcm0vcG9ydChzKSB0byBkaXNwbGF5IGV4cGVj
dGF0aW9ucyBmb3IuIFVzZSBnbG9iLXN0eWxlIHdpbGRjYXJkcyBmb3IgbXVsdGlwbGUgcG9ydHMn
KSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCctLWFsbCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScs
IGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRo
ZSBleHBlY3RhdGlvbnMgZm9yICphbGwqIHRlc3RzJyksCisgICAgICAgICAgICBtYWtlX29wdGlv
bignLXgnLCAnLS1leGNsdWRlLWtleXdvcmQnLCBhY3Rpb249J2FwcGVuZCcsIGRlZmF1bHQ9W10s
CisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaW1pdCB0byB0ZXN0cyBub3QgbWF0Y2hp
bmcgdGhlIGdpdmVuIGtleXdvcmQgKGZvciBleGFtcGxlLCAic2tpcCIsICJzbG93Iiwgb3IgImNy
YXNoIi4gTWF5IHNwZWNpZnkgbXVsdGlwbGUgdGltZXMnKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0
aW9uKCctaScsICctLWluY2x1ZGUta2V5d29yZCcsIGFjdGlvbj0nYXBwZW5kJywgZGVmYXVsdD1b
XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpbWl0IHRvIHRlc3RzIHdpdGggdGhl
IGdpdmVuIGtleXdvcmQgKGZvciBleGFtcGxlLCAic2tpcCIsICJzbG93Iiwgb3IgImNyYXNoIi4g
TWF5IHNwZWNpZnkgbXVsdGlwbGUgdGltZXMnKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCct
LWRlYnVnJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PSdEZWJ1ZycsIGRlc3Q9J2NvbmZp
Z3VyYXRpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1
cmF0aW9uIHRvIERlYnVnJyksCisgICAgICAgICAgICBtYWtlX29wdGlvbignLS1yZWxlYXNlJywg
YWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PSdSZWxlYXNlJywgZGVzdD0nY29uZmlndXJhdGlv
bicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZXQgdGhlIGNvbmZpZ3VyYXRpb24g
dG8gUmVsZWFzZScpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oJy0tY3N2JywgYWN0aW9uPSdz
dG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9
J1ByaW50IGEgQ1NWLXN0eWxlIHJlcG9ydCB0aGF0IGluY2x1ZGVzIHRoZSBwb3J0IG5hbWUsIG1v
ZGlmaWVycywgdGVzdHMsIGFuZCBleHBlY3RhdGlvbnMnKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0
aW9uKCctZicsICctLWZ1bGwnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUHJpbnQgYSBmdWxsIHRlc3RfZXhwZWN0YXRp
b25zLnR4dC1zdHlsZSBsaW5lIGZvciBldmVyeSBtYXRjaCcpLAorICAgICAgICBdCisgICAgICAg
IEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kLl9faW5pdF9fKHNlbGYsIG9wdGlvbnM9b3B0aW9u
cykKKyAgICAgICAgc2VsZi5fZXhwZWN0YXRpb25fbW9kZWxzID0ge30KKworICAgIGRlZiBleGVj
dXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBpZiBub3QgYXJncyBhbmQg
bm90IG9wdGlvbnMuYWxsOgorICAgICAgICAgICAgcHJpbnQgIllvdSBtdXN0IGVpdGhlciBzcGVj
aWZ5IG9uZSBvciBtb3JlIHRlc3QgcGF0aHMgb3IgLS1hbGwuIgorICAgICAgICAgICAgcmV0dXJu
CisKKyAgICAgICAgZGVmYXVsdF9wb3J0ID0gdG9vbC5wb3J0X2ZhY3RvcnkuZ2V0KG9wdGlvbnM9
b3B0aW9ucykKKyAgICAgICAgaWYgb3B0aW9ucy5wbGF0Zm9ybToKKyAgICAgICAgICAgIHBvcnRf
bmFtZXMgPSBmbm1hdGNoLmZpbHRlcih0b29sLnBvcnRfZmFjdG9yeS5hbGxfcG9ydF9uYW1lcygp
LCBvcHRpb25zLnBsYXRmb3JtKQorICAgICAgICAgICAgaWYgbm90IHBvcnRfbmFtZXM6CisgICAg
ICAgICAgICAgICAgZGVmYXVsdF9wb3J0ID0gdG9vbC5wb3J0X2ZhY3RvcnkuZ2V0KG9wdGlvbnMu
cGxhdGZvcm0pCisgICAgICAgICAgICAgICAgaWYgZGVmYXVsdF9wb3J0OgorICAgICAgICAgICAg
ICAgICAgICBwb3J0X25hbWVzID0gW2RlZmF1bHRfcG9ydC5uYW1lKCldCisgICAgICAgICAgICAg
ICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIk5vIHBvcnQgbmFtZXMgbWF0Y2gg
JyVzJyIgJSBvcHRpb25zLnBsYXRmb3JtCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAg
ICAgICBlbHNlOgorICAgICAgICAgICAgcG9ydF9uYW1lcyA9IFtkZWZhdWx0X3BvcnQubmFtZSgp
XQorCisgICAgICAgIHNlcmlhbGl6ZXIgPSBUZXN0RXhwZWN0YXRpb25TZXJpYWxpemVyKCkKKyAg
ICAgICAgdGVzdHMgPSBkZWZhdWx0X3BvcnQudGVzdHMoYXJncykKKyAgICAgICAgZm9yIHBvcnRf
bmFtZSBpbiBwb3J0X25hbWVzOgorICAgICAgICAgICAgbW9kZWwgPSBzZWxmLl9tb2RlbChvcHRp
b25zLCBwb3J0X25hbWUsIHRlc3RzKQorICAgICAgICAgICAgdGVzdHNfdG9fcHJpbnQgPSBzZWxm
Ll9maWx0ZXJfdGVzdHMob3B0aW9ucywgbW9kZWwsIHRlc3RzKQorICAgICAgICAgICAgbGluZXMg
PSBbbW9kZWwuZ2V0X2V4cGVjdGF0aW9uX2xpbmUodGVzdCkgZm9yIHRlc3QgaW4gc29ydGVkKHRl
c3RzX3RvX3ByaW50KV0KKyAgICAgICAgICAgIHByaW50ICdcbicuam9pbihzZWxmLl9mb3JtYXRf
bGluZXMob3B0aW9ucywgcG9ydF9uYW1lLCBzZXJpYWxpemVyLCBsaW5lcykpCisKKyAgICBkZWYg
X2ZpbHRlcl90ZXN0cyhzZWxmLCBvcHRpb25zLCBtb2RlbCwgdGVzdHMpOgorICAgICAgICBmaWx0
ZXJlZF90ZXN0cyA9IHNldCgpCisgICAgICAgIGlmIG9wdGlvbnMuaW5jbHVkZV9rZXl3b3JkOgor
ICAgICAgICAgICAgZm9yIGtleXdvcmQgaW4gb3B0aW9ucy5pbmNsdWRlX2tleXdvcmQ6CisgICAg
ICAgICAgICAgICAgZmlsdGVyZWRfdGVzdHMudXBkYXRlKG1vZGVsLmdldF90ZXN0X3NldF9mb3Jf
a2V5d29yZChrZXl3b3JkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbHRlcmVkX3Rl
c3RzID0gdGVzdHMKKworICAgICAgICBmb3Iga2V5d29yZCBpbiBvcHRpb25zLmV4Y2x1ZGVfa2V5
d29yZDoKKyAgICAgICAgICAgIGZpbHRlcmVkX3Rlc3RzLmRpZmZlcmVuY2VfdXBkYXRlKG1vZGVs
LmdldF90ZXN0X3NldF9mb3Jfa2V5d29yZChrZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIGZpbHRl
cmVkX3Rlc3RzCisKKyAgICBkZWYgX2Zvcm1hdF9saW5lcyhzZWxmLCBvcHRpb25zLCBwb3J0X25h
bWUsIHNlcmlhbGl6ZXIsIGxpbmVzKToKKyAgICAgICAgb3V0cHV0ID0gW10KKyAgICAgICAgaWYg
b3B0aW9ucy5jc3Y6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAg
ICAgICBvdXRwdXQuYXBwZW5kKCIlcywlcyIgJSAocG9ydF9uYW1lLCBzZXJpYWxpemVyLnRvX2Nz
dihsaW5lKSkpCisgICAgICAgIGVsaWYgbGluZXM6CisgICAgICAgICAgICBpbmNsdWRlX21vZGlm
aWVycyA9IG9wdGlvbnMuZnVsbAorICAgICAgICAgICAgaW5jbHVkZV9leHBlY3RhdGlvbnMgPSBv
cHRpb25zLmZ1bGwgb3IgbGVuKG9wdGlvbnMuaW5jbHVkZV9rZXl3b3JkKSAhPSAxIG9yIGxlbihv
cHRpb25zLmV4Y2x1ZGVfa2V5d29yZCkKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIi8vIEZv
ciAlcyIgJSBwb3J0X25hbWUpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAg
ICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlcyIgJSBzZXJpYWxpemVyLnRvX3N0cmluZyhsaW5l
LCBpbmNsdWRlX21vZGlmaWVycywgaW5jbHVkZV9leHBlY3RhdGlvbnMsIGluY2x1ZGVfY29tbWVu
dD1GYWxzZSkpCisgICAgICAgIHJldHVybiBvdXRwdXQKKworICAgIGRlZiBfbW9kZWwoc2VsZiwg
b3B0aW9ucywgcG9ydF9uYW1lLCB0ZXN0cyk6CisgICAgICAgIHBvcnQgPSBzZWxmLl90b29sLnBv
cnRfZmFjdG9yeS5nZXQocG9ydF9uYW1lLCBvcHRpb25zKQorICAgICAgICBleHBlY3RhdGlvbnNf
cGF0aCA9IHBvcnQucGF0aF90b190ZXN0X2V4cGVjdGF0aW9uc19maWxlKCkKKyAgICAgICAgaWYg
bm90IGV4cGVjdGF0aW9uc19wYXRoIGluIHNlbGYuX2V4cGVjdGF0aW9uX21vZGVsczoKKyAgICAg
ICAgICAgIGxpbnRfbW9kZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLl9leHBlY3RhdGlvbl9t
b2RlbHNbZXhwZWN0YXRpb25zX3BhdGhdID0gVGVzdEV4cGVjdGF0aW9ucyhwb3J0LCB0ZXN0cywK
KyAgICAgICAgICAgICAgICBwb3J0LnRlc3RfZXhwZWN0YXRpb25zKCksCisgICAgICAgICAgICAg
ICAgcG9ydC50ZXN0X2NvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAgICBsaW50X21vZGUs
CisgICAgICAgICAgICAgICAgcG9ydC50ZXN0X2V4cGVjdGF0aW9uc19vdmVycmlkZXMoKSwKKyAg
ICAgICAgICAgICAgICBwb3J0LnNraXBwZWRfdGVzdHModGVzdHMpKS5tb2RlbCgpCisgICAgICAg
IHJldHVybiBzZWxmLl9leHBlY3RhdGlvbl9tb2RlbHNbZXhwZWN0YXRpb25zX3BhdGhdCisKKwor
CisKKwogY2xhc3MgUHJpbnRCYXNlbGluZXMoQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQpOgog
ICAgIG5hbWUgPSAncHJpbnQtYmFzZWxpbmVzJwogICAgIGhlbHBfdGV4dCA9ICdQcmludHMgdGhl
IGJhc2VsaW5lIGxvY2F0aW9ucyBmb3IgZ2l2ZW4gdGVzdChzKSBvbiB0aGUgZ2l2ZW4gcG9ydChz
KScKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9xdWVy
aWVzX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1
ZXJpZXNfdW5pdHRlc3QucHkKaW5kZXggZDA0ZTAzMDBhNDJlZmE3NDhiZWQ1NTkzN2Y3YTg0NDJi
NTg1MWVlMS4uYWM0YjhmYzc5NzhkOWZjMzlkYjdlY2QxYTYzNWEyN2ZkZmU4YjhlNSAxMDA2NDQK
LS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXJpZXNfdW5pdHRl
c3QucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL3F1ZXJpZXNf
dW5pdHRlc3QucHkKQEAgLTI4LDYgKzI4LDcgQEAKIAogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20g
d2Via2l0cHkuY29tbW9uLnN5c3RlbS5vdXRwdXRjYXB0dXJlIGltcG9ydCBPdXRwdXRDYXB0dXJl
CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuYnVnemlsbGEgaW1wb3J0IEJ1Z3ppbGxhCiBmcm9t
IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0cHV0Q2FwdHVy
ZQogZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5Lm1vY2sgaW1wb3J0IE1vY2sKQEAgLTExOCw2ICsx
MTksNTQgQEAgY2xhc3MgRmFpbHVyZVJlYXNvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhjb21tYW5kLl9ibGFtZV9saW5lX2Zvcl9yZXZpc2lvbihO
b25lKSwgIkZBSUxFRCB0byBmZXRjaCBDb21taXRJbmZvIGZvciByTm9uZSwgZXhjZXB0aW9uOiBN
RVNTQUdFIikKIAogCitjbGFzcyBQcmludEV4cGVjdGF0aW9uc1Rlc3QodW5pdHRlc3QuVGVzdENh
c2UpOgorICAgIGRlZiBydW5fdGVzdChzZWxmLCB0ZXN0cywgZXhwZWN0ZWRfc3Rkb3V0LCAqKmFy
Z3MpOgorICAgICAgICBvcHRpb25zID0gTW9ja09wdGlvbnMoYWxsPUZhbHNlLCBjc3Y9RmFsc2Us
IGZ1bGw9RmFsc2UsIHBsYXRmb3JtPSd0ZXN0LXdpbi14cCcsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbmNsdWRlX2tleXdvcmQ9W10sIGV4Y2x1ZGVfa2V5d29yZD1bXSkudXBkYXRl
KCoqYXJncykKKyAgICAgICAgdG9vbCA9IE1vY2tUb29sKCkKKyAgICAgICAgY29tbWFuZCA9IFBy
aW50RXhwZWN0YXRpb25zKCkKKyAgICAgICAgY29tbWFuZC5iaW5kX3RvX3Rvb2wodG9vbCkKKwor
ICAgICAgICBvYyA9IE91dHB1dENhcHR1cmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBv
Yy5jYXB0dXJlX291dHB1dCgpCisgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUob3B0aW9ucywg
dGVzdHMsIHRvb2wpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdGRvdXQsIF8sIF8g
PSBvYy5yZXN0b3JlX291dHB1dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0ZG91dCwg
ZXhwZWN0ZWRfc3Rkb3V0KQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNl
bGYucnVuX3Rlc3QoWydmYWlsdXJlcy9leHBlY3RlZC90ZXh0Lmh0bWwnLCAnZmFpbHVyZXMvZXhw
ZWN0ZWQvaW1hZ2UuaHRtbCddLAorICAgICAgICAgICAgICAgICAgICAgICgnLy8gRm9yIHRlc3Qt
d2luLXhwXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdmYWlsdXJlcy9leHBlY3RlZC9pbWFn
ZS5odG1sID0gSU1BR0VcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ2ZhaWx1cmVzL2V4cGVj
dGVkL3RleHQuaHRtbCA9IFRFWFRcbicpKQorCisgICAgZGVmIHRlc3RfZnVsbChzZWxmKToKKyAg
ICAgICAgc2VsZi5ydW5fdGVzdChbJ2ZhaWx1cmVzL2V4cGVjdGVkL3RleHQuaHRtbCcsICdmYWls
dXJlcy9leHBlY3RlZC9pbWFnZS5odG1sJ10sCisgICAgICAgICAgICAgICAgICAgICAgKCcvLyBG
b3IgdGVzdC13aW4teHBcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1dPTlRGSVggOiBmYWls
dXJlcy9leHBlY3RlZC9pbWFnZS5odG1sID0gSU1BR0VcbicKKyAgICAgICAgICAgICAgICAgICAg
ICAgJ1dPTlRGSVggOiBmYWlsdXJlcy9leHBlY3RlZC90ZXh0Lmh0bWwgPSBURVhUXG4nKSwKKyAg
ICAgICAgICAgICAgICAgICAgICBmdWxsPVRydWUpCisKKyAgICBkZWYgdGVzdF9leGNsdWRlKHNl
bGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KFsnZmFpbHVyZXMvZXhwZWN0ZWQvdGV4dC5odG1s
JywgJ2ZhaWx1cmVzL2V4cGVjdGVkL2ltYWdlLmh0bWwnXSwKKyAgICAgICAgICAgICAgICAgICAg
ICAoJy8vIEZvciB0ZXN0LXdpbi14cFxuJworICAgICAgICAgICAgICAgICAgICAgICAnZmFpbHVy
ZXMvZXhwZWN0ZWQvdGV4dC5odG1sID0gVEVYVFxuJyksCisgICAgICAgICAgICAgICAgICAgICAg
ZXhjbHVkZV9rZXl3b3JkPVsnaW1hZ2UnXSkKKworICAgIGRlZiB0ZXN0X2luY2x1ZGUoc2VsZik6
CisgICAgICAgIHNlbGYucnVuX3Rlc3QoWydmYWlsdXJlcy9leHBlY3RlZC90ZXh0Lmh0bWwnLCAn
ZmFpbHVyZXMvZXhwZWN0ZWQvaW1hZ2UuaHRtbCddLAorICAgICAgICAgICAgICAgICAgICAgICgn
Ly8gRm9yIHRlc3Qtd2luLXhwXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdmYWlsdXJlcy9l
eHBlY3RlZC9pbWFnZS5odG1sXG4nKSwKKyAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2tl
eXdvcmQ9WydpbWFnZSddKQorCisgICAgZGVmIHRlc3RfY3N2KHNlbGYpOgorICAgICAgICBzZWxm
LnJ1bl90ZXN0KFsnZmFpbHVyZXMvZXhwZWN0ZWQvdGV4dC5odG1sJywgJ2ZhaWx1cmVzL2V4cGVj
dGVkL2ltYWdlLmh0bWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3Qtd2luLXhwLGZh
aWx1cmVzL2V4cGVjdGVkL2ltYWdlLmh0bWwsd29udGZpeCxpbWFnZVxuJworICAgICAgICAgICAg
ICAgICAgICAgICAndGVzdC13aW4teHAsZmFpbHVyZXMvZXhwZWN0ZWQvdGV4dC5odG1sLHdvbnRm
aXgsdGV4dFxuJyksCisgICAgICAgICAgICAgICAgICAgICAgY3N2PVRydWUpCisKKwogY2xhc3Mg
UHJpbnRCYXNlbGluZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2Vs
Zik6CiAgICAgICAgIHNlbGYub2MgPSBOb25lCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L3Rvb2wvbW9ja3Rvb2wucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvbW9j
a3Rvb2wucHkKaW5kZXggMjVmODI2OThhMDIxYjc0YjEyNzgxZDFhMTczY2U4Nzg3MmVlN2ZhNS4u
NTVmZGU2NGFkZWM2NzhhNDM0NTBlNGU5NmIxYTBiNGVlNDRmZjI1ZCAxMDA2NDQKLS0tIGEvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b29sL21vY2t0b29sLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvdG9vbC9tb2NrdG9vbC5weQpAQCAtNDcsOCArNDcsMTEgQEAgY2xhc3MgTW9ja09w
dGlvbnMob2JqZWN0KToKICAgICAgICAgIyBvYmplY3Qgd2lsbCBiZSB1c2VkLiBHZW5lcmFsbHkg
c3BlYWtpbmcgdW5pdCB0ZXN0cyBzaG91bGQKICAgICAgICAgIyBzdWJjbGFzcyB0aGlzIG9yIHBy
b3ZpZGVyIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgc2V0IGEgY29tbW9uCiAgICAgICAgICMgc2V0
IG9mIG9wdGlvbnMuCi0gICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3YXJncy5pdGVtcygpOgot
ICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1trZXldID0gdmFsdWUKKyAgICAgICAgc2VsZi51cGRh
dGUoKiprd2FyZ3MpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAg
c2VsZi5fX2RpY3RfXy51cGRhdGUoKiprd2FyZ3MpCisgICAgICAgIHJldHVybiBzZWxmCiAKIAog
IyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVuYW1lZCBNb2NrV2ViS2l0UGF0Y2guCg==
</data>
<flag name="review"
          id="141099"
          type_id="1"
          status="+"
          setter="abarth"
    />
          </attachment>
      

    </bug>

</bugzilla>