<?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>50901</bug_id>
          
          <creation_ts>2010-12-12 20:51:06 -0800</creation_ts>
          <short_desc>Add remote zip file handling to webkitpy.</short_desc>
          <delta_ts>2011-01-18 22:04:40 -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>
          
          <blocked>50098</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="James Kozianski">koz</reporter>
          <assigned_to name="James Kozianski">koz</assigned_to>
          <cc>abarth</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dbates</cc>
    
    <cc>eric</cc>
    
    <cc>mihaip</cc>
    
    <cc>noel.gordon</cc>
    
    <cc>ojan</cc>
    
    <cc>ossy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>320929</commentid>
    <comment_count>0</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-12 20:51:06 -0800</bug_when>
    <thetext>Add remote zip file handling to webkitpy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320930</commentid>
    <comment_count>1</comment_count>
      <attachid>76349</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-12 20:51:53 -0800</bug_when>
    <thetext>Created attachment 76349
Patch

Add DirAsZip and RemoteZip for providing a unified interface for directories and remote zip files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320949</commentid>
    <comment_count>2</comment_count>
      <attachid>76349</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-12 23:57:01 -0800</bug_when>
    <thetext>Comment on attachment 76349
Patch

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

So I feel like you&apos;re trying to make a directory act like a zip, when you really want a zip to act like a directory.  I&apos;m confused as to the overarching design here.

You want some abstraction to treat both local results as well as remote results the same, right?  As well as zipped results vs. non-zipped, right?

Why not just always download and unzip and then they&apos;re all teh same?  I&apos;m confused.

&gt; WebKitTools/ChangeLog:7
&gt; +

The ChangeLog should talk more about the &quot;why&quot; of these changes.  Why are these two classes needed?

&gt; WebKitTools/ChangeLog:9
&gt; +        * Scripts/webkitpy/common/diraszip.py: Added.
&gt; +        * Scripts/webkitpy/common/net/remotezip.py: Added.

Every change should have a test.  In python it&apos;s super easy.  Just name a file with _unittest.py in the webkitpy directory and test-webkitpy will find it and run all the tests in it.

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:36
&gt; +    &quot;&quot;&quot;Provides a zipfile-like interface to a local directory&quot;&quot;&quot;

So I&apos;m confused why this is needed?

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:39
&gt; +        self._filesystem = filesystem if filesystem != None else FileSystem()

Using &quot;None&quot; to mean &quot;default value&quot; is often written as:
if not filesystem:
    filesystem = FileSystem()

and then later:
self._filesystem = filesystem

But your solution works too.  I wouldn&apos;t have bothered checking explicit != None.  I probably would have &quot;cheated&quot; with or and just written: self._filesystem = filesystem or FileSystem()

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:41
&gt; +        if not self._path.endswith(os.path.sep):
&gt; +            self._path += os.path.sep

Unclear why this is necessary?

&gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:58
&gt; +        return ospath.relpath(os.path.join(dir, filename), dir) is not None

bool(EXPRESSION) or &quot;not not EXPRESSION&quot; are common ways of converting from a value to a bool (which are slightly less verbose than &quot;is not None&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321487</commentid>
    <comment_count>3</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2010-12-13 15:24:09 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 76349 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=76349&amp;action=review
&gt; 
&gt; So I feel like you&apos;re trying to make a directory act like a zip, when you really want a zip to act like a directory.  I&apos;m confused as to the overarching design here.
&gt; 
&gt; You want some abstraction to treat both local results as well as remote results the same, right?  As well as zipped results vs. non-zipped, right?

Yes, you&apos;re right - and calling this abstraction &apos;zip&apos; is definitely confusing. The point of these classes it to provide a simple interface for talking about collections of files (they just happen to crib the Python zipfile.ZipFile interface). What do you think about renaming them to ZipFileBundle and DirectoryFileBundle? (Or some noun better than FileBundle :-) )

&gt; 
&gt; Why not just always download and unzip and then they&apos;re all teh same?  I&apos;m confused.

It&apos;s true that ZipFileBundle could be implemented by downloading and extracting a zip and then delegating to a DirectoryFileBundle, but I think that the current implementation is good because it is more efficient (it will only read files that it needs to, which can be significant on chromium builders which store passing and failing test results) and it is quite a short class anyway (&lt;30 lines).

&gt; 
&gt; &gt; WebKitTools/ChangeLog:7
&gt; &gt; +
&gt; 
&gt; The ChangeLog should talk more about the &quot;why&quot; of these changes.  Why are these two classes needed?
&gt; 
&gt; &gt; WebKitTools/ChangeLog:9
&gt; &gt; +        * Scripts/webkitpy/common/diraszip.py: Added.
&gt; &gt; +        * Scripts/webkitpy/common/net/remotezip.py: Added.
&gt; 
&gt; Every change should have a test.  In python it&apos;s super easy.  Just name a file with _unittest.py in the webkitpy directory and test-webkitpy will find it and run all the tests in it.
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:36
&gt; &gt; +    &quot;&quot;&quot;Provides a zipfile-like interface to a local directory&quot;&quot;&quot;
&gt; 
&gt; So I&apos;m confused why this is needed?

I&apos;ll try and add something more concise to the ChangeLog, but briefly the reason why I want these interfaces is because they are much easier to deal with than raw strings representing paths and filenames. It&apos;s not that there&apos;s any use specifically in having a directory behave like a zip file (as discussed above), this is more just a way to define a common interface for dealing with collections of files in a simple and easy to test way.

For instance, FakeZip is a trivial class to implement and leads to test code that looks like:

local_results = FakeZip()
local_results.insert(&apos;platform/mac/some-test-expected.txt&apos;, &apos;old baseline&apos;)

remote_results = FakeZip()
remote_results.insert(&apos;platform/mac/some-test-actual.txt&apos;, &apos;new baseline&apos;)

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:39
&gt; &gt; +        self._filesystem = filesystem if filesystem != None else FileSystem()
&gt; 
&gt; Using &quot;None&quot; to mean &quot;default value&quot; is often written as:
&gt; if not filesystem:
&gt;     filesystem = FileSystem()
&gt; 
&gt; and then later:
&gt; self._filesystem = filesystem
&gt; 
&gt; But your solution works too.  I wouldn&apos;t have bothered checking explicit != None.  I probably would have &quot;cheated&quot; with or and just written: self._filesystem = filesystem or FileSystem()
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:41
&gt; &gt; +        if not self._path.endswith(os.path.sep):
&gt; &gt; +            self._path += os.path.sep
&gt; 
&gt; Unclear why this is necessary?

If the user provides us with a path like &quot;a/b&quot;, the results we get from an os.walk() will all have prefixes of &quot;a/b/&quot;. We normalise our path at the beginning so we know how much to drop off the resulting os.walk() filenames. I&apos;ll add a comment to the code to make this more clear.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:58
&gt; &gt; +        return ospath.relpath(os.path.join(dir, filename), dir) is not None
&gt; 
&gt; bool(EXPRESSION) or &quot;not not EXPRESSION&quot; are common ways of converting from a value to a bool (which are slightly less verbose than &quot;is not None&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328880</commentid>
    <comment_count>4</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-03 19:01:35 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 76349 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=76349&amp;action=review
&gt; 
&gt; So I feel like you&apos;re trying to make a directory act like a zip, when you really want a zip to act like a directory.  I&apos;m confused as to the overarching design here.
&gt; 
&gt; You want some abstraction to treat both local results as well as remote results the same, right?  As well as zipped results vs. non-zipped, right?
&gt; 
&gt; Why not just always download and unzip and then they&apos;re all teh same?  I&apos;m confused.
&gt; 
&gt; &gt; WebKitTools/ChangeLog:7
&gt; &gt; +
&gt; 
&gt; The ChangeLog should talk more about the &quot;why&quot; of these changes.  Why are these two classes needed?

Done.

&gt; 
&gt; &gt; WebKitTools/ChangeLog:9
&gt; &gt; +        * Scripts/webkitpy/common/diraszip.py: Added.
&gt; &gt; +        * Scripts/webkitpy/common/net/remotezip.py: Added.
&gt; 
&gt; Every change should have a test.  In python it&apos;s super easy.  Just name a file with _unittest.py in the webkitpy directory and test-webkitpy will find it and run all the tests in it.

Done.

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:36
&gt; &gt; +    &quot;&quot;&quot;Provides a zipfile-like interface to a local directory&quot;&quot;&quot;
&gt; 
&gt; So I&apos;m confused why this is needed?
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:39
&gt; &gt; +        self._filesystem = filesystem if filesystem != None else FileSystem()
&gt; 
&gt; Using &quot;None&quot; to mean &quot;default value&quot; is often written as:
&gt; if not filesystem:
&gt;     filesystem = FileSystem()
&gt; 
&gt; and then later:
&gt; self._filesystem = filesystem
&gt; 
&gt; But your solution works too.  I wouldn&apos;t have bothered checking explicit != None.  I probably would have &quot;cheated&quot; with or and just written: self._filesystem = filesystem or FileSystem()

Actually, I like your way the best, so I&apos;ve changed it to that :-)

&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:41
&gt; &gt; +        if not self._path.endswith(os.path.sep):
&gt; &gt; +            self._path += os.path.sep
&gt; 
&gt; Unclear why this is necessary?
&gt; 
&gt; &gt; WebKitTools/Scripts/webkitpy/common/diraszip.py:58
&gt; &gt; +        return ospath.relpath(os.path.join(dir, filename), dir) is not None
&gt; 
&gt; bool(EXPRESSION) or &quot;not not EXPRESSION&quot; are common ways of converting from a value to a bool (which are slightly less verbose than &quot;is not None&quot;

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328881</commentid>
    <comment_count>5</comment_count>
      <attachid>77865</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-03 19:07:11 -0800</bug_when>
    <thetext>Created attachment 77865
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330369</commentid>
    <comment_count>6</comment_count>
      <attachid>77865</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-06 13:22:30 -0800</bug_when>
    <thetext>Comment on attachment 77865
Patch

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

&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:116
&gt; +    def files_under(self, path):
&gt; +        results = []
&gt; +        for file in self.files:
&gt; +            if file.startswith(path):
&gt; +                results.append(file)
&gt; +        return results

This is  just [file for file in self.files if file.startswith(path)]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330372</commentid>
    <comment_count>7</comment_count>
      <attachid>77865</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-06 13:24:53 -0800</bug_when>
    <thetext>Comment on attachment 77865
Patch

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

&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:51
&gt; +

two blank lines i believe.

&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:53
&gt; +if __name__ == &apos;__main__&apos;:
&gt; +    unittest.main()

I generally omit these since the way we do imports makes it impossible to run these by hand anywa.

&gt; Tools/Scripts/webkitpy/common/net/zipfileset.py:1
&gt; +#!/usr/bin/env python

Please omit.

&gt; Tools/Scripts/webkitpy/common/net/zipfileset.py:80
&gt; +        if filename is None:
&gt; +            self._fileset.extract(self._filename, path)

I would have early returned here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330374</commentid>
    <comment_count>8</comment_count>
      <attachid>77865</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-06 13:27:33 -0800</bug_when>
    <thetext>Comment on attachment 77865
Patch

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

You could just make this a new module common.fileset.  YOu could also just slap this all into one file common/fileset.py.  I&apos;m not sure which is cleaner.  Making it a module is better long-term if we plan to expand on this.

&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:33
&gt; +class DirectoryFileSetTest(unittest.TestCase):

Seems we should test the whole api here, no?

&gt; Tools/Scripts/webkitpy/common/net/zipfileset.py:63
&gt; +class FileSetFileHandle(object):

Since this is used by more than one file seems it should be in its own file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330375</commentid>
    <comment_count>9</comment_count>
      <attachid>77865</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-06 13:28:23 -0800</bug_when>
    <thetext>Comment on attachment 77865
Patch

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

&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:36
&gt; +    &quot;&quot;&quot;Provides a zipfile-like interface to a local directory&quot;&quot;&quot;

I&apos;m still confused why we&apos;re making directories look like zips instead of zips look like directories.  That seems backwards. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330379</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-06 13:31:26 -0800</bug_when>
    <thetext>We would use something like this in common.net.layouttestresults if it existed, I think.  It&apos;s still unclear to me why we treat directories like zips.  But I do think it makes sense to have a concept of some sort of file set, so I think we want this change.

I think my major source of confusion is just in the positioning of this class.  Its basically an abstraction around a filesystem tree, which could be backed by a remote file system or a local file system or a zip or a directory.  I&apos;m not sure what we call that.  FileSet is fine, I guess.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330381</commentid>
    <comment_count>11</comment_count>
      <attachid>77865</attachid>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-01-06 13:34:36 -0800</bug_when>
    <thetext>Comment on attachment 77865
Patch

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

&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:30
&gt; +from webkitpy.common.net.zipfileset import FileSetFileHandle

Having DirectoryFileSet depend on zipfileset seems wrong. Can there be a (Base)FileSet class/file for code that is used in both?

&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:39
&gt; +        self._filesystem = filesystem if filesystem != None else FileSystem()

This can just be self._filesystem = filesystem or Filesystem()

&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:72
&gt; +        # directory heirarchy exists at the output path.

Typo (&quot;heirarchy&quot;)

&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:35
&gt; +        self._files = {}

Seems like _files doesn&apos;t need to be a property of the class (and you don&apos;t need an addFile method), given that you&apos;re using a MockFileSystem. Instead you could just say:
def setUp(self):
  files = {
   &apos;/test/some-file&apos;: &apos;contents&apos;,
  ...
  }
  self._fileset = DirectoryFileSet(&apos;/test&apos;, MockFileSystem(files))

&gt;&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:116

&gt; 
&gt; This is  just [file for file in self.files if file.startswith(path)]

Though this should also handle directory names that are substrings of one another. I.e. if files is:
/foo/bar
/foo2/bar

Then files_under(&apos;/foo&apos;) should not include (&apos;foo2/bar). 

(see how listdir is implemented to avoid this)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330384</commentid>
    <comment_count>12</comment_count>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-01-06 13:36:46 -0800</bug_when>
    <thetext>Oops, mid-air review collision.

(In reply to comment #10)
&gt; We would use something like this in common.net.layouttestresults if it existed, I think.  It&apos;s still unclear to me why we treat directories like zips.  But I do think it makes sense to have a concept of some sort of file set, so I think we want this change.

Agreed, I think the goal shouldn&apos;t be &quot;zip file-like implementation for local directories&quot; but instead &quot;file set abstraction that could be backed by local directories or zip files.&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330418</commentid>
    <comment_count>13</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 14:17:51 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 77865 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=77865&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:116
&gt; &gt; +    def files_under(self, path):
&gt; &gt; +        results = []
&gt; &gt; +        for file in self.files:
&gt; &gt; +            if file.startswith(path):
&gt; &gt; +                results.append(file)
&gt; &gt; +        return results
&gt; 
&gt; This is  just [file for file in self.files if file.startswith(path)]

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330526</commentid>
    <comment_count>14</comment_count>
      <attachid>77865</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 16:21:31 -0800</bug_when>
    <thetext>Comment on attachment 77865
Patch

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

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:30

&gt; 
&gt; Having DirectoryFileSet depend on zipfileset seems wrong. Can there be a (Base)FileSet class/file for code that is used in both?

Yep - I&apos;ll add a fileset.py file to hold the FileSetHandle class. I guess such a file would be where a general FileSet (ie: one not backed by filesystem or zip file) class could be defined if one is ever needed.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:36

&gt; 
&gt; I&apos;m still confused why we&apos;re making directories look like zips instead of zips look like directories.  That seems backwards. :)

I think this comment is out of date. It should read &quot;The set of files under a local directory.&quot; That this interface is like a zip file is incidental :-)

The reason this interface looks like the one for zip files is because like a zip file it doesn&apos;t require the caller to remember the path to the directory that they are interested in, for example:

d = DirectoryFileSet(&apos;/some/path/prefix&apos;)
d.namelist()
d.read(&apos;some-file&apos;)
d.open(&apos;some-other-file&apos;)

would be

fs = FileSystem()
fs.all_files_under(&apos;/some/path/prefix&apos;)
fs.read(&apos;/some/path/prefix/some-file&apos;)
fs.open(&apos;/some/path/prefix/some-other-file&apos;)

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:39

&gt; 
&gt; This can just be self._filesystem = filesystem or Filesystem()

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:72

&gt; 
&gt; Typo (&quot;heirarchy&quot;)

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:33

&gt; 
&gt; Seems we should test the whole api here, no?

Yes, we should :-) In doing so I realised that FileSystemMock lacks a remove() function (though it exists in FileSystem). Thanks.

I also added a test for ZipFileSet (it uses temp directories / files if that&apos;s okay).

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:35

&gt; 
&gt; Seems like _files doesn&apos;t need to be a property of the class (and you don&apos;t need an addFile method), given that you&apos;re using a MockFileSystem. Instead you could just say:
&gt; def setUp(self):
&gt;   files = {
&gt;    &apos;/test/some-file&apos;: &apos;contents&apos;,
&gt;   ...
&gt;   }
&gt;   self._fileset = DirectoryFileSet(&apos;/test&apos;, MockFileSystem(files))

Ah yes, true :-)
Done.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:51

&gt; 
&gt; two blank lines i believe.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset_unittest.py:53

&gt; 
&gt; I generally omit these since the way we do imports makes it impossible to run these by hand anywa.

I&apos;ve got a command that adds the webkitpy directory to python&apos;s path for running tests like these, which is handy because running all the unit tests with test-webkitpy can take a while.

&gt;&gt; Tools/Scripts/webkitpy/common/net/zipfileset.py:1

&gt; 
&gt; Please omit.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/net/zipfileset.py:63

&gt; 
&gt; Since this is used by more than one file seems it should be in its own file.

I put it in fileset.py to mean &apos;common code for file sets&apos;. Would it be better to put it in filesetfilehandle.py?

&gt;&gt; Tools/Scripts/webkitpy/common/net/zipfileset.py:80

&gt; 
&gt; I would have early returned here.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330527</commentid>
    <comment_count>15</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 16:22:56 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; &gt;&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:116
&gt; 
&gt; &gt; 
&gt; &gt; This is  just [file for file in self.files if file.startswith(path)]
&gt; 
&gt; Though this should also handle directory names that are substrings of one another. I.e. if files is:
&gt; /foo/bar
&gt; /foo2/bar
&gt; 
&gt; Then files_under(&apos;/foo&apos;) should not include (&apos;foo2/bar). 
&gt; 
&gt; (see how listdir is implemented to avoid this)
Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330541</commentid>
    <comment_count>16</comment_count>
      <attachid>78188</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 16:32:29 -0800</bug_when>
    <thetext>Created attachment 78188
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330552</commentid>
    <comment_count>17</comment_count>
      <attachid>78188</attachid>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-01-06 16:52:59 -0800</bug_when>
    <thetext>Comment on attachment 78188
Patch

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

&gt; Tools/ChangeLog:12
&gt; +        * Scripts/webkitpy/common/directoryfileset.py: Added.

Should be updated to include fileset.py

&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:30
&gt; +from webkitpy.common.system.filesystem import FileSystem

Given that filesystem lives in webkitpy.common.system, perhaps the fileset classes should be in there too.

&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:44
&gt; +        return os.path.join(self._path, filename)

Should use filesystem.join instead of os.path.join.

&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:69
&gt; +        dest = os.path.join(path, filename)

Same here.

&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:117
&gt; +        del(self.files[path])

del is actually a statement, this should be del self.files[path]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330600</commentid>
    <comment_count>18</comment_count>
      <attachid>78201</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 18:35:13 -0800</bug_when>
    <thetext>Created attachment 78201
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330601</commentid>
    <comment_count>19</comment_count>
      <attachid>78188</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 18:35:33 -0800</bug_when>
    <thetext>Comment on attachment 78188
Patch

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

&gt;&gt; Tools/ChangeLog:12

&gt; 
&gt; Should be updated to include fileset.py

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:30

&gt; 
&gt; Given that filesystem lives in webkitpy.common.system, perhaps the fileset classes should be in there too.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:44

&gt; 
&gt; Should use filesystem.join instead of os.path.join.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/directoryfileset.py:69

&gt; 
&gt; Same here.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:117

&gt; 
&gt; del is actually a statement, this should be del self.files[path]

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330606</commentid>
    <comment_count>20</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-01-06 18:43:57 -0800</bug_when>
    <thetext>@ojan: Another example of a broken context from a comment reply in the review tool ^^^^^^^^^^</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330611</commentid>
    <comment_count>21</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-06 18:59:34 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; @ojan: Another example of a broken context from a comment reply in the review tool ^^^^^^^^^^

Whoops. I mis-split my original patch up. Fixed http://trac.webkit.org/changeset/75222.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330612</commentid>
    <comment_count>22</comment_count>
      <attachid>78201</attachid>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-01-06 19:07:45 -0800</bug_when>
    <thetext>Comment on attachment 78201
Patch

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

&gt; Tools/Scripts/webkitpy/common/system/filesystem.py:162
&gt; +    def extract(self, zip, filename, path):

As discussed in #webkit, extract doesn&apos;t really belong in FileSystem. For the sake of testability, passing in the ZipFile (or a lazy-loading wrapper) to the ZipFileSet constructor is cleaner.

&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:60
&gt; +        return os.path.join(*comps)

The mock filesystem hardcodes / as the separator, so it should keep using &apos;/&apos;.join(comps) as its join() implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330635</commentid>
    <comment_count>23</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 20:44:19 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 78201 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=78201&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/system/filesystem.py:162
&gt; &gt; +    def extract(self, zip, filename, path):
&gt; 
&gt; As discussed in #webkit, extract doesn&apos;t really belong in FileSystem. For the sake of testability, passing in the ZipFile (or a lazy-loading wrapper) to the ZipFileSet constructor is cleaner.

Yep. I used your suggestion of passing in the constructor.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:60
&gt; &gt; +        return os.path.join(*comps)
&gt; 
&gt; The mock filesystem hardcodes / as the separator, so it should keep using &apos;/&apos;.join(comps) as its join() implementation.

I&apos;ve changed it to use os.path.join() but then to substitute back to using &apos;/&apos; because os.path.join() collapses slashes, which &apos;/&apos;.join() doesn&apos;t.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330636</commentid>
    <comment_count>24</comment_count>
      <attachid>78206</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-06 20:46:07 -0800</bug_when>
    <thetext>Created attachment 78206
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330657</commentid>
    <comment_count>25</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-01-06 23:12:37 -0800</bug_when>
    <thetext>The commit-queue encountered the following flaky tests while processing attachment 78206:

http/tests/xmlhttprequest/logout.html bug 52047 (author: ap@webkit.org)
The commit-queue is continuing to process your patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330659</commentid>
    <comment_count>26</comment_count>
      <attachid>78206</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-01-06 23:14:09 -0800</bug_when>
    <thetext>Comment on attachment 78206
Patch

Clearing flags on attachment: 78206

Committed r75233: &lt;http://trac.webkit.org/changeset/75233&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330660</commentid>
    <comment_count>27</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-01-06 23:14:18 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330669</commentid>
    <comment_count>28</comment_count>
      <attachid>78206</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-06 23:42:51 -0800</bug_when>
    <thetext>Comment on attachment 78206
Patch

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

LayoutTestResults/FlakyTestReporter/CommitQueueTask may want something like this for saving off a copy of the LayoutTestsDirectory (either in zip form for upload, or just for later use after a second layout-test run.

&gt; Tools/Scripts/webkitpy/common/system/directoryfileset.py:64
&gt; +        return self._filesystem.read_text_file(self._full_path(filename))

This won&apos;t work for binary files, obviously.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330673</commentid>
    <comment_count>29</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2011-01-07 00:38:27 -0800</bug_when>
    <thetext>It broke Qt and GTK bots, reopen to fix. I think 
the problem caused by different python versions.

test-webkitpy: INFO     Suppressing most webkitpy logging while running unit tests.
test-webkitpy: WARNING  Skipping tests in ./Tools/QueueStatusServer due to failure (No module named dev_appserver).  This module is optional.  The failure is likely due to a missing Google AppEngine install.  (http://code.google.com/appengine/downloads.html)
webkitpy.test.main: INFO     Excluding: webkitpy.common.checkout.scm_unittest (use --all to include)
/home/webkitbuildbot/slaves/release32bit/buildslave/qt-linux-release/build/Tools/Scripts/webkitpy/common/system/fileset.py:49: Warning: &apos;with&apos; will become a reserved keyword in Python 2.6
Traceback (most recent call last):
  File &quot;./Tools/Scripts/test-webkitpy&quot;, line 266, in &lt;module&gt;
    Tester().run_tests(sys.argv, external_package_paths)
  File &quot;/home/webkitbuildbot/slaves/release32bit/buildslave/qt-linux-release/build/Tools/Scripts/webkitpy/test/main.py&quot;, line 140, in run_tests
    unittest.main(argv=sys_argv, module=None)
  File &quot;/usr/lib/python2.5/unittest.py&quot;, line 767, in __init__
    self.parseArgs(argv)
  File &quot;/usr/lib/python2.5/unittest.py&quot;, line 794, in parseArgs
    self.createTests()
  File &quot;/usr/lib/python2.5/unittest.py&quot;, line 800, in createTests
    self.module)
  File &quot;/usr/lib/python2.5/unittest.py&quot;, line 565, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File &quot;/usr/lib/python2.5/unittest.py&quot;, line 533, in loadTestsFromName
    module = __import__(&apos;.&apos;.join(parts_copy))
  File &quot;/home/webkitbuildbot/slaves/release32bit/buildslave/qt-linux-release/build/Tools/Scripts/webkitpy/common/system/directoryfileset_unittest.py&quot;, line 28, in &lt;module&gt;
    from webkitpy.common.system.directoryfileset import DirectoryFileSet
  File &quot;/home/webkitbuildbot/slaves/release32bit/buildslave/qt-linux-release/build/Tools/Scripts/webkitpy/common/system/directoryfileset.py&quot;, line 29, in &lt;module&gt;
    from webkitpy.common.system.fileset import FileSetFileHandle
  File &quot;/home/webkitbuildbot/slaves/release32bit/buildslave/qt-linux-release/build/Tools/Scripts/webkitpy/common/system/fileset.py&quot;, line 49
    with self._filesystem.mkdtemp() as temp_dir:
            ^
SyntaxError: invalid syntax
program finished with exit code 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330689</commentid>
    <comment_count>30</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-07 01:32:13 -0800</bug_when>
    <thetext>Oh, the file just needs a:

from __future__ import with_statement

at the top in order to work on python 2.5. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330706</commentid>
    <comment_count>31</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-07 02:29:06 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/75233 might have broken Leopard Intel Release (Tests) and Leopard Intel Debug (Tests)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330742</commentid>
    <comment_count>32</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2011-01-07 05:40:59 -0800</bug_when>
    <thetext>(In reply to comment #30)
&gt; Oh, the file just needs a:
&gt; 
&gt; from __future__ import with_statement
&gt; 
&gt; at the top in order to work on python 2.5. :)

Fixed in http://trac.webkit.org/changeset/75239 . Thx.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330778</commentid>
    <comment_count>33</comment_count>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-01-07 08:35:30 -0800</bug_when>
    <thetext>(In reply to comment #30)
&gt; Oh, the file just needs a:
&gt; 
&gt; from __future__ import with_statement
&gt; 
&gt; at the top in order to work on python 2.5. :)

This happens periodically. Any chance the cq machines can be downgraded to 2.5 to catch this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330805</commentid>
    <comment_count>34</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-07 09:25:13 -0800</bug_when>
    <thetext>I&apos;ll see about making the commit-queue use python 2.5 to run the python tests if available.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330808</commentid>
    <comment_count>35</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-07 09:27:39 -0800</bug_when>
    <thetext>filed bug 52066.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76349</attachid>
            <date>2010-12-12 20:51:53 -0800</date>
            <delta_ts>2011-01-03 19:07:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50901-20101213155150.patch</filename>
            <type>text/plain</type>
            <size>8365</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA5OWIzNTgxZDMwMGIyZTU5YjZjZTBmYmYwMjU0NDc3YTg2MWQ3OWU3Li5hNWM5NGU1
ZDUzYzk2NzQxYWY5YTRiZGFlNzFiM2ZjNDMyNzIyYmYwIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAK
KzIwMTAtMTItMTIgIEphbWVzIEtvemlhbnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIHJlbW90ZSB6aXAg
ZmlsZSBoYW5kbGluZyB0byB3ZWJraXRweS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTUwOTAxCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9kaXJhc3ppcC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L3JlbW90ZXppcC5weTogQWRkZWQuCisKIDIwMTAtMTItMTIgIEFsZWphbmRybyBHLiBD
YXN0cm8gIDxhbGV4QGlnYWxpYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlk
ZWwuCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJh
c3ppcC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2RpcmFzemlwLnB5
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmZhMTU1OGY0YWI5M2QxMDBiN2RkZTQxMDU2YzZhZDE2MWIzNmI5ODUKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJh
c3ppcC5weQpAQCAtMCwwICsxLDgwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisj
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0
ZW1lbnQKKworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCisKK2Zyb20gd2Via2l0cHkuY29tbW9u
Lm5ldC5yZW1vdGV6aXAgaW1wb3J0IFppcEZpbGVIYW5kbGUKK2Zyb20gd2Via2l0cHkuY29tbW9u
LnN5c3RlbS5maWxlc3lzdGVtIGltcG9ydCBGaWxlU3lzdGVtCitpbXBvcnQgd2Via2l0cHkuY29t
bW9uLnN5c3RlbS5vc3BhdGggYXMgb3NwYXRoCisKKworY2xhc3MgRGlyQXNaaXAob2JqZWN0KToK
KyAgICAiIiJQcm92aWRlcyBhIHppcGZpbGUtbGlrZSBpbnRlcmZhY2UgdG8gYSBsb2NhbCBkaXJl
Y3RvcnkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmlsZXN5c3RlbT1Ob25lKToK
KyAgICAgICAgc2VsZi5fcGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZp
bGVzeXN0ZW0gaWYgZmlsZXN5c3RlbSAhPSBOb25lIGVsc2UgRmlsZVN5c3RlbSgpCisgICAgICAg
IGlmIG5vdCBzZWxmLl9wYXRoLmVuZHN3aXRoKG9zLnBhdGguc2VwKToKKyAgICAgICAgICAgIHNl
bGYuX3BhdGggKz0gb3MucGF0aC5zZXAKKworICAgIGRlZiBfZnVsbF9wYXRoKHNlbGYsIGZpbGVu
YW1lKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2lzX3VuZGVyKHNlbGYuX3BhdGgsIGZpbGVuYW1l
KQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGZpbGVuYW1lKQorCisg
ICAgZGVmIF9kcm9wX2RpcmVjdG9yeV9wcmVmaXgoc2VsZiwgcGF0aCk6CisgICAgICAgIHJldHVy
biBwYXRoW2xlbihzZWxmLl9wYXRoKTpdCisKKyAgICBkZWYgX2ZpbGVzX2luX2RpcmVjdG9yeShz
ZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUg
ZGlyZWN0b3J5LCBpbmNsdWRpbmcgdGhlIHBhdGgKKyAgICAgICAgICAgdG8gdGhlIGRpcmVjdG9y
eSIiIgorICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihwYXRoLCBmaWxlbmFtZSkKKyAgICAg
ICAgICAgICAgICBmb3IgKHBhdGgsIF8sIGZpbGVuYW1lcykgaW4gb3Mud2FsayhzZWxmLl9wYXRo
KQorICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXNdCisKKyAgICBkZWYg
X2lzX3VuZGVyKHNlbGYsIGRpciwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gb3NwYXRoLnJl
bHBhdGgob3MucGF0aC5qb2luKGRpciwgZmlsZW5hbWUpLCBkaXIpIGlzIG5vdCBOb25lCisKKyAg
ICBkZWYgb3BlbihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBaaXBGaWxlSGFuZGxl
KHNlbGYsIGZpbGVuYW1lKQorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYpOgorICAgICAgICByZXR1
cm4gbWFwKHNlbGYuX2Ryb3BfZGlyZWN0b3J5X3ByZWZpeCwgc2VsZi5fZmlsZXNfaW5fZGlyZWN0
b3J5KCkpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBz
ZWxmLl9maWxlc3lzdGVtLnJlYWRfdGV4dF9maWxlKHNlbGYuX2Z1bGxfcGF0aChmaWxlbmFtZSkp
CisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgICIiIkV4
dHJhY3RzIGEgZmlsZSBmcm9tIHRoaXMgJ3ppcCBhcmNoaXZlJyB0byB0aGUgc3BlY2lmaWVkIGRp
cmVjdG9yeS4iIiIKKyAgICAgICAgc3JjID0gc2VsZi5fZnVsbF9wYXRoKGZpbGVuYW1lKQorICAg
ICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHBhdGgsIGZpbGVuYW1lKQorICAgICAgICAjIEFzIGZp
bGVuYW1lIG1heSBoYXZlIHNsYXNoZXMgaW4gaXQsIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhlIHNh
bWUKKyAgICAgICAgIyBkaXJlY3RvcnkgaGVpcmFyY2h5IGV4aXN0cyBhdCB0aGUgb3V0cHV0IHBh
dGguCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0ubWF5YmVfbWFrZV9kaXJlY3Rvcnkob3MucGF0
aC5zcGxpdChkZXN0KVswXSkKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5jb3B5ZmlsZShzcmMs
IGRlc3QpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZmlsZW5h
bWUgPSBzZWxmLl9mdWxsX3BhdGgoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0u
cmVtb3ZlKGZpbGVuYW1lKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3JlbW90ZXppcC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL25ldC9yZW1vdGV6aXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTBiYzYyNjEyYzU0YjgzNzEyYWVm
OWEwNjY1MmFmZGQ3NjQ0NDc1NAotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL25ldC9yZW1vdGV6aXAucHkKQEAgLTAsMCArMSw5NiBAQAorIyEv
dXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisj
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9t
IHdlYmtpdHB5LmNvbW1vbi5uZXQubmV0d29ya3RyYW5zYWN0aW9uIGltcG9ydCBOZXR3b3JrVHJh
bnNhY3Rpb24KK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtIGltcG9ydCBG
aWxlU3lzdGVtCitpbXBvcnQgb3MKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB6aXBmaWxlCisKKwor
Y2xhc3MgUmVtb3RlWmlwKG9iamVjdCk6CisgICAgIiIiQSB6aXAgZmlsZSB0aGF0IHJlc2lkZXMg
YXQgYSBVUkwgKGxvY2FsIG9yIHJlbW90ZSkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgemlw
X3VybCwgZmlsZXN5c3RlbT1Ob25lKToKKyAgICAgICAgc2VsZi5femlwX3VybCA9IHppcF91cmwK
KyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0g
PSBmaWxlc3lzdGVtIGlmIGZpbGVzeXN0ZW0gIT0gTm9uZSBlbHNlIEZpbGVTeXN0ZW0oKQorCisg
ICAgZGVmIF9sb2FkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl96aXBfZmlsZSBpcyBOb25lOgor
ICAgICAgICAgICAgdGVtcF9maWxlID0gTmV0d29ya1RyYW5zYWN0aW9uKCkucnVuKGxhbWJkYTog
dXJsbGliLnVybHJldHJpZXZlKHNlbGYuX3ppcF91cmwpWzBdKQorICAgICAgICAgICAgc2VsZi5f
emlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUodGVtcF9maWxlKQorCisgICAgZGVmIG9wZW4oc2Vs
ZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gWmlwRmlsZUhhbmRsZShzZWxmLCBmaWxlbmFt
ZSkKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5fbG9hZCgpCisgICAg
ICAgIHJldHVybiBzZWxmLl96aXBfZmlsZS5uYW1lbGlzdCgpCisKKyAgICBkZWYgcmVhZChzZWxm
LCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5f
emlwX2ZpbGUucmVhZChmaWxlbmFtZSkKKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1l
LCBwYXRoKToKKyAgICAgICAgc2VsZi5fbG9hZCgpCisgICAgICAgIHJldHVybiBzZWxmLl96aXBf
ZmlsZS5leHRyYWN0KGZpbGVuYW1lLCBwYXRoKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxl
bmFtZSk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2FuJ3QgZGVsZXRlIGZyb20gYSBSZW1v
dGVaaXAuIikKKworCitjbGFzcyBaaXBGaWxlSGFuZGxlOgorICAgICIiIlBvaW50cyB0byBhIGZp
bGUgdGhhdCByZXNpZGVzIGluIGEgUmVtb3RlWmlwIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IHppcF9maWxlLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUK
KyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSB6aXBfZmlsZQorICAgICAgICBzZWxmLl9jb250ZW50
cyA9IE5vbmUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzOiVz
IiAlIChzZWxmLl96aXBfZmlsZSwgc2VsZi5fZmlsZW5hbWUpCisKKyAgICBkZWYgY29udGVudHMo
c2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NvbnRlbnRzIGlzIE5vbmU6CisgICAgICAgICAgICBz
ZWxmLl9jb250ZW50cyA9IHNlbGYuX3ppcF9maWxlLnJlYWQoc2VsZi5fZmlsZW5hbWUpCisgICAg
ICAgIHJldHVybiBzZWxmLl9jb250ZW50cworCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCwg
ZmlsZW5hbWU9Tm9uZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAg
ICBzZWxmLl96aXBfZmlsZS5leHRyYWN0KHNlbGYuX2ZpbGVuYW1lLCBwYXRoKQorICAgICAgICBl
bHNlOgorICAgICAgICAgICAgd2l0aCBzZWxmLl9maWxlc3lzdGVtLm1rZHRlbXAoKSBhcyB0ZW1w
X2RpcjoKKyAgICAgICAgICAgICAgICBzZWxmLl96aXBfZmlsZS5leHRyYWN0KHNlbGYuX2ZpbGVu
YW1lLCB0ZW1wX2RpcikKKworICAgICAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbih0ZW1w
X2Rpciwgc2VsZi5fZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9p
bihwYXRoLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlc3lzdGVtLmNvcHlm
aWxlKHNyYywgZGVzdCkKKworICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgIHNlbGYuX3pp
cF9maWxlLmRlbGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAg
ICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBzcGxpdGV4dChzZWxmKToKKyAg
ICAgICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKCkpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>77865</attachid>
            <date>2011-01-03 19:07:11 -0800</date>
            <delta_ts>2011-01-06 16:32:22 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50901-20110104140708.patch</filename>
            <type>text/plain</type>
            <size>12709</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA0Yjg0
MWQ4YTAzMjMxOGFjNWM0NWNlM2E1MTEwZjhjZDA3MDNiNTJlLi5lZWM1NjlhMjZiYTlhZjZmZjY1
ODRkN2Q1YjIxZWVkNWU1MzBjNWQ5IDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTEtMDEtMDQgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgaW50
ZXJmYWNlIHRvIGEgc2V0IG9mIGZpbGVzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NTA5MDEKKworICAgICAgICBUaGVzZSBjbGFzc2VzIGFsbG93IHVz
IHRvIHdyaXRlIGNvZGUgdGhhdCBpcyBhZ25vc3RpYyB0byB3aGV0aGVyIGEKKyAgICAgICAgcGFy
dGljdWxhciBzZXQgb2YgZmlsZXMgcmVzaWRlcyBpbiBhIGxvY2FsIGRpcmVjdG9yeSBvciBpbiBh
IHppcCBmaWxlCisgICAgICAgIG9uIGEgcmVtb3RlIG1hY2hpbmUuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJlY3RvcnlmaWxlc2V0LnB5OiBBZGRlZC4KKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvemlwZmlsZXNldC5weTogQWRkZWQuCisKIDIw
MTEtMDEtMDMgIERhdmlkIExldmluICA8bGV2aW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vZGlyZWN0b3J5ZmlsZXNldC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL2RpcmVjdG9yeWZpbGVzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWQzYzQ0ODg0N2FiNGEyNDRkNTk4
YmQ4ZmIzNTNjZTQ1ZWJiMDU4YQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL2RpcmVjdG9yeWZpbGVzZXQucHkKQEAgLTAsMCArMSw3OCBAQAorIyEvdXNy
L2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6Cisj
CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIF9f
ZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2ltcG9ydCBvcworaW1wb3J0IHNodXRp
bAorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQuemlwZmlsZXNldCBpbXBvcnQgRmlsZVNldEZp
bGVIYW5kbGUKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtIGltcG9ydCBG
aWxlU3lzdGVtCitpbXBvcnQgd2Via2l0cHkuY29tbW9uLnN5c3RlbS5vc3BhdGggYXMgb3NwYXRo
CisKKworY2xhc3MgRGlyZWN0b3J5RmlsZVNldChvYmplY3QpOgorICAgICIiIlByb3ZpZGVzIGEg
emlwZmlsZS1saWtlIGludGVyZmFjZSB0byBhIGxvY2FsIGRpcmVjdG9yeSIiIgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBwYXRoLCBmaWxlc3lzdGVtPU5vbmUpOgorICAgICAgICBzZWxmLl9wYXRo
ID0gcGF0aAorICAgICAgICBzZWxmLl9maWxlc3lzdGVtID0gZmlsZXN5c3RlbSBpZiBmaWxlc3lz
dGVtICE9IE5vbmUgZWxzZSBGaWxlU3lzdGVtKCkKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhdGgu
ZW5kc3dpdGgob3MucGF0aC5zZXApOgorICAgICAgICAgICAgc2VsZi5fcGF0aCArPSBvcy5wYXRo
LnNlcAorCisgICAgZGVmIF9mdWxsX3BhdGgoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBhc3Nl
cnQgc2VsZi5faXNfdW5kZXIoc2VsZi5fcGF0aCwgZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBv
cy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUpCisKKyAgICBkZWYgX2Ryb3BfZGlyZWN0
b3J5X3ByZWZpeChzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJuIHBhdGhbbGVuKHNlbGYuX3Bh
dGgpOl0KKworICAgIGRlZiBfZmlsZXNfaW5fZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAiIiJS
ZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGluIHRoZSBkaXJlY3RvcnksIGluY2x1ZGlu
ZyB0aGUgcGF0aAorICAgICAgICAgICB0byB0aGUgZGlyZWN0b3J5IiIiCisgICAgICAgIHJldHVy
biBzZWxmLl9maWxlc3lzdGVtLmZpbGVzX3VuZGVyKHNlbGYuX3BhdGgpCisKKyAgICBkZWYgX2lz
X3VuZGVyKHNlbGYsIGRpciwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gYm9vbChvc3BhdGgu
cmVscGF0aChvcy5wYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSksIGRpcikpCisKKyAgICBkZWYgb3Bl
bihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBGaWxlU2V0RmlsZUhhbmRsZShzZWxm
LCBmaWxlbmFtZSkKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIG1h
cChzZWxmLl9kcm9wX2RpcmVjdG9yeV9wcmVmaXgsIHNlbGYuX2ZpbGVzX2luX2RpcmVjdG9yeSgp
KQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5f
ZmlsZXN5c3RlbS5yZWFkX3RleHRfZmlsZShzZWxmLl9mdWxsX3BhdGgoZmlsZW5hbWUpKQorCisg
ICAgZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICAiIiJFeHRyYWN0
cyBhIGZpbGUgZnJvbSB0aGlzIGZpbGUgc2V0IHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiIi
IgorICAgICAgICBzcmMgPSBzZWxmLl9mdWxsX3BhdGgoZmlsZW5hbWUpCisgICAgICAgIGRlc3Qg
PSBvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAgICMgQXMgZmlsZW5hbWUgbWF5
IGhhdmUgc2xhc2hlcyBpbiBpdCwgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgc2FtZQorICAgICAg
ICAjIGRpcmVjdG9yeSBoZWlyYXJjaHkgZXhpc3RzIGF0IHRoZSBvdXRwdXQgcGF0aC4KKyAgICAg
ICAgc2VsZi5fZmlsZXN5c3RlbS5tYXliZV9tYWtlX2RpcmVjdG9yeShvcy5wYXRoLnNwbGl0KGRl
c3QpWzBdKQorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLmNvcHlmaWxlKHNyYywgZGVzdCkKKwor
ICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYu
X2Z1bGxfcGF0aChmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5yZW1vdmUoZmls
ZW5hbWUpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJlY3Rv
cnlmaWxlc2V0X3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vZGly
ZWN0b3J5ZmlsZXNldF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zZTUwYzU3M2RjZWVkN2FjNDQ4
YzU0YzAxYmUxNThmOGIwOWQzNmYxCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vZGlyZWN0b3J5ZmlsZXNldF91bml0dGVzdC5weQpAQCAtMCwwICsxLDUz
IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMg
YXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKworaW1wb3J0IHVuaXR0
ZXN0CisKK2Zyb20gd2Via2l0cHkuY29tbW9uLmRpcmVjdG9yeWZpbGVzZXQgaW1wb3J0IERpcmVj
dG9yeUZpbGVTZXQKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtX21vY2sg
aW1wb3J0IE1vY2tGaWxlU3lzdGVtCisKKworY2xhc3MgRGlyZWN0b3J5RmlsZVNldFRlc3QodW5p
dHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fZmls
ZXMgPSB7fQorICAgICAgICBzZWxmLmFkZEZpbGUoJy90ZXN0L3NvbWUtZmlsZScsICdjb250ZW50
cycpCisgICAgICAgIHNlbGYuYWRkRmlsZSgnL3Rlc3Qvc29tZS1vdGhlci1maWxlJywgJ290aGVy
IGNvbnRlbnRzJykKKyAgICAgICAgc2VsZi5hZGRGaWxlKCcvdGVzdC9iL2MnLCAnYycpCisgICAg
ICAgIHNlbGYuX2ZpbGVzZXQgPSBEaXJlY3RvcnlGaWxlU2V0KCcvdGVzdCcsIE1vY2tGaWxlU3lz
dGVtKHNlbGYuX2ZpbGVzKSkKKworICAgIGRlZiBhZGRGaWxlKHNlbGYsIG5hbWUsIGNvbnRlbnRz
KToKKyAgICAgICAgc2VsZi5fZmlsZXNbbmFtZV0gPSBjb250ZW50cworCisgICAgZGVmIHRlc3Rf
ZmlsZXNfaW5fbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc29tZS1m
aWxlJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1
ZSgnc29tZS1vdGhlci1maWxlJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisgICAgICAg
IHNlbGYuYXNzZXJ0VHJ1ZSgnYi9jJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisKKyAg
ICBkZWYgdGVzdF9maWxlX2NvbnRlbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cygnY29udGVudHMnLCBzZWxmLl9maWxlc2V0Lm9wZW4oJ3NvbWUtZmlsZScpLmNvbnRlbnRzKCkp
CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvemlwZmlsZXNldC5weSBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC96aXBmaWxlc2V0LnB5Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjgyNzRkNGNkZmMyMmMxOWMwM2I4NTNjYjNhMTg1MzBkMTcyYTliYmEKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvemlwZmlsZXNldC5weQpA
QCAtMCwwICsxLDk2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAy
MDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLm5ldC5uZXR3b3JrdHJhbnNhY3Rp
b24gaW1wb3J0IE5ldHdvcmtUcmFuc2FjdGlvbgorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVt
LmZpbGVzeXN0ZW0gaW1wb3J0IEZpbGVTeXN0ZW0KK2ltcG9ydCBvcworaW1wb3J0IHVybGxpYgor
aW1wb3J0IHppcGZpbGUKKworCitjbGFzcyBaaXBGaWxlU2V0KG9iamVjdCk6CisgICAgIiIiVGhl
IHNldCBvZiBmaWxlcyBpbiBhIHppcCBmaWxlIHRoYXQgcmVzaWRlcyBhdCBhIFVSTCAobG9jYWwg
b3IgcmVtb3RlKSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB6aXBfdXJsLCBmaWxlc3lzdGVt
PU5vbmUpOgorICAgICAgICBzZWxmLl96aXBfdXJsID0gemlwX3VybAorICAgICAgICBzZWxmLl96
aXBfZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW0gaWYg
ZmlsZXN5c3RlbSAhPSBOb25lIGVsc2UgRmlsZVN5c3RlbSgpCisKKyAgICBkZWYgX2xvYWQoc2Vs
Zik6CisgICAgICAgIGlmIHNlbGYuX3ppcF9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICB0ZW1w
X2ZpbGUgPSBOZXR3b3JrVHJhbnNhY3Rpb24oKS5ydW4obGFtYmRhOiB1cmxsaWIudXJscmV0cmll
dmUoc2VsZi5femlwX3VybClbMF0pCisgICAgICAgICAgICBzZWxmLl96aXBfZmlsZSA9IHppcGZp
bGUuWmlwRmlsZSh0ZW1wX2ZpbGUpCisKKyAgICBkZWYgb3BlbihzZWxmLCBmaWxlbmFtZSk6Cisg
ICAgICAgIHJldHVybiBGaWxlU2V0RmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRl
ZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5fbG9hZCgpCisgICAgICAgIHJldHVybiBz
ZWxmLl96aXBfZmlsZS5uYW1lbGlzdCgpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6
CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUucmVh
ZChmaWxlbmFtZSkKKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1lLCBwYXRoKToKKyAg
ICAgICAgc2VsZi5fbG9hZCgpCisgICAgICAgIHJldHVybiBzZWxmLl96aXBfZmlsZS5leHRyYWN0
KGZpbGVuYW1lLCBwYXRoKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAg
ICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2FuJ3QgZGVsZXRlIGZyb20gYSBSZW1vdGVaaXAuIikKKwor
CitjbGFzcyBGaWxlU2V0RmlsZUhhbmRsZShvYmplY3QpOgorICAgICIiIlBvaW50cyB0byBhIGZp
bGUgdGhhdCByZXNpZGVzIGluIGEgZmlsZSBzZXQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwg
ZmlsZXNldCwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCisg
ICAgICAgIHNlbGYuX2ZpbGVzZXQgPSBmaWxlc2V0CisgICAgICAgIHNlbGYuX2NvbnRlbnRzID0g
Tm9uZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXM6JXMiICUg
KHNlbGYuX2ZpbGVzZXQsIHNlbGYuX2ZpbGVuYW1lKQorCisgICAgZGVmIGNvbnRlbnRzKHNlbGYp
OgorICAgICAgICBpZiBzZWxmLl9jb250ZW50cyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5f
Y29udGVudHMgPSBzZWxmLl9maWxlc2V0LnJlYWQoc2VsZi5fZmlsZW5hbWUpCisgICAgICAgIHJl
dHVybiBzZWxmLl9jb250ZW50cworCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCwgZmlsZW5h
bWU9Tm9uZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxm
Ll9maWxlc2V0LmV4dHJhY3Qoc2VsZi5fZmlsZW5hbWUsIHBhdGgpCisgICAgICAgIGVsc2U6Cisg
ICAgICAgICAgICB3aXRoIHNlbGYuX2ZpbGVzeXN0ZW0ubWtkdGVtcCgpIGFzIHRlbXBfZGlyOgor
ICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVzZXQuZXh0cmFjdChzZWxmLl9maWxlbmFtZSwgdGVt
cF9kaXIpCisKKyAgICAgICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsIHNl
bGYuX2ZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocGF0aCwg
ZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5jb3B5ZmlsZShzcmMs
IGRlc3QpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc2V0LmRl
bGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1
cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBzcGxpdGV4dChzZWxmKToKKyAgICAgICAgcmV0
dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKCkpCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weSBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CmluZGV4IGYwYjVlNDRmY2FjN2Y2
ZjA3M2ZlNjc3NGFlYzFlNjRiMTJiNmM4ZDQuLmE5MTE5MWFmMWFkMGQ1Nzc5MzllMWIzYzUxZjM5
ZThlNTFkOTI5OGQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5
c3RlbS9maWxlc3lzdGVtLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5
c3RlbS9maWxlc3lzdGVtLnB5CkBAIC0xNTIsMyArMTUyLDkgQEAgY2xhc3MgRmlsZVN5c3RlbShv
YmplY3QpOgogICAgICAgICAiIiJDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRo
ZSBnaXZlbiBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbgogICAgICAgICBwYXRoLiIiIgogICAgICAg
ICBzaHV0aWwuY29weWZpbGUoc291cmNlLCBkZXN0aW5hdGlvbikKKworICAgIGRlZiBmaWxlc191
bmRlcihzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBmaWxl
cyB1bmRlciB0aGUgZ2l2ZW4gcGF0aC4iIiIKKyAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4o
cGF0aF90b19maWxlLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGZvciAocGF0aF90b19maWxlLCBf
LCBmaWxlbmFtZXMpIGluIG9zLndhbGsocGF0aCkKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBp
biBmaWxlbmFtZXNdCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9z
eXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
c3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weQppbmRleCBlYTBmM2Y5NTdmZjQ5MmZkMmM3NmFkZDM3
NWMwZDJmNGExY2RlMTQxLi5mZWQ3YjcyNWRjODBmOWY2YjU3NmQxMDQwYmFjNDVkN2E1OTMwYzY5
IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5
c3RlbV9tb2NrLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9m
aWxlc3lzdGVtX21vY2sucHkKQEAgLTEwNywzICsxMDcsMTAgQEAgY2xhc3MgTW9ja0ZpbGVTeXN0
ZW0ob2JqZWN0KToKICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoZXJybm8uRUlTRElSLCBkZXN0
aW5hdGlvbiwgb3Muc3RyZXJyb3IoZXJybm8uSVNESVIpKQogCiAgICAgICAgIHNlbGYuZmlsZXNb
ZGVzdGluYXRpb25dID0gc2VsZi5maWxlc1tzb3VyY2VdCisKKyAgICBkZWYgZmlsZXNfdW5kZXIo
c2VsZiwgcGF0aCk6CisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgZmlsZSBpbiBz
ZWxmLmZpbGVzOgorICAgICAgICAgICAgaWYgZmlsZS5zdGFydHN3aXRoKHBhdGgpOgorICAgICAg
ICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKGZpbGUpCisgICAgICAgIHJldHVybiByZXN1bHRzCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78188</attachid>
            <date>2011-01-06 16:32:29 -0800</date>
            <delta_ts>2011-01-06 20:45:51 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50901-20110107113226.patch</filename>
            <type>text/plain</type>
            <size>18792</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA0Yjg0
MWQ4YTAzMjMxOGFjNWM0NWNlM2E1MTEwZjhjZDA3MDNiNTJlLi5kMzBhZjU4NWI4MmNhMjUxYmFi
YWNmNGU5YWQwZDZkMzc5ODc0MWFiIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTEtMDEtMDQgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgaW50
ZXJmYWNlIHRvIGEgc2V0IG9mIGZpbGVzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NTA5MDEKKworICAgICAgICBUaGVzZSBjbGFzc2VzIGFsbG93IHVz
IHRvIHdyaXRlIGNvZGUgdGhhdCBpcyBhZ25vc3RpYyB0byB3aGV0aGVyIGEKKyAgICAgICAgcGFy
dGljdWxhciBzZXQgb2YgZmlsZXMgcmVzaWRlcyBpbiBhIGxvY2FsIGRpcmVjdG9yeSBvciBpbiBh
IHppcCBmaWxlCisgICAgICAgIG9uIGEgcmVtb3RlIG1hY2hpbmUuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJlY3RvcnlmaWxlc2V0LnB5OiBBZGRlZC4KKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJlY3RvcnlmaWxlc2V0X3VuaXR0ZXN0LnB5OiBB
ZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvemlwZmlsZXNldC5w
eTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3ppcGZpbGVz
ZXRfdW5pdHRlc3QucHk6IEFkZGVkLgorCiAyMDExLTAxLTAzICBEYXZpZCBMZXZpbiAgPGxldmlu
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBFcmljIFNlaWRlbC4KZGlmZiAt
LWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2RpcmVjdG9yeWZpbGVzZXQucHkg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJlY3RvcnlmaWxlc2V0LnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmE1YmVlODY0YWU5Y2QxZGEyZTRkNzgwMjVmZWI4MTQ5YTMwOTZkOWIKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9kaXJlY3RvcnlmaWxlc2V0
LnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1l
dDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zy
b20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKworaW1wb3J0IG9zCitpbXBvcnQg
c2h1dGlsCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLmZpbGVzZXQgaW1wb3J0IEZpbGVTZXRGaWxl
SGFuZGxlCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQgRmls
ZVN5c3RlbQoraW1wb3J0IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ub3NwYXRoIGFzIG9zcGF0aAor
CisKK2NsYXNzIERpcmVjdG9yeUZpbGVTZXQob2JqZWN0KToKKyAgICAiIiJUaGUgc2V0IG9mIGZp
bGVzIHVuZGVyIGEgbG9jYWwgZGlyZWN0b3J5LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBw
YXRoLCBmaWxlc3lzdGVtPU5vbmUpOgorICAgICAgICBzZWxmLl9wYXRoID0gcGF0aAorICAgICAg
ICBzZWxmLl9maWxlc3lzdGVtID0gZmlsZXN5c3RlbSBvciBGaWxlU3lzdGVtKCkKKyAgICAgICAg
aWYgbm90IHNlbGYuX3BhdGguZW5kc3dpdGgob3MucGF0aC5zZXApOgorICAgICAgICAgICAgc2Vs
Zi5fcGF0aCArPSBvcy5wYXRoLnNlcAorCisgICAgZGVmIF9mdWxsX3BhdGgoc2VsZiwgZmlsZW5h
bWUpOgorICAgICAgICBhc3NlcnQgc2VsZi5faXNfdW5kZXIoc2VsZi5fcGF0aCwgZmlsZW5hbWUp
CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUpCisKKyAg
ICBkZWYgX2Ryb3BfZGlyZWN0b3J5X3ByZWZpeChzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJu
IHBhdGhbbGVuKHNlbGYuX3BhdGgpOl0KKworICAgIGRlZiBfZmlsZXNfaW5fZGlyZWN0b3J5KHNl
bGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIGluIHRoZSBk
aXJlY3RvcnksIGluY2x1ZGluZyB0aGUgcGF0aAorICAgICAgICAgICB0byB0aGUgZGlyZWN0b3J5
IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc3lzdGVtLmZpbGVzX3VuZGVyKHNlbGYuX3Bh
dGgpCisKKyAgICBkZWYgX2lzX3VuZGVyKHNlbGYsIGRpciwgZmlsZW5hbWUpOgorICAgICAgICBy
ZXR1cm4gYm9vbChvc3BhdGgucmVscGF0aChvcy5wYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSksIGRp
cikpCisKKyAgICBkZWYgb3BlbihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBGaWxl
U2V0RmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToK
KyAgICAgICAgcmV0dXJuIG1hcChzZWxmLl9kcm9wX2RpcmVjdG9yeV9wcmVmaXgsIHNlbGYuX2Zp
bGVzX2luX2RpcmVjdG9yeSgpKQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAg
ICAgICByZXR1cm4gc2VsZi5fZmlsZXN5c3RlbS5yZWFkX3RleHRfZmlsZShzZWxmLl9mdWxsX3Bh
dGgoZmlsZW5hbWUpKQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgor
ICAgICAgICAiIiJFeHRyYWN0cyBhIGZpbGUgZnJvbSB0aGlzIGZpbGUgc2V0IHRvIHRoZSBzcGVj
aWZpZWQgZGlyZWN0b3J5LiIiIgorICAgICAgICBzcmMgPSBzZWxmLl9mdWxsX3BhdGgoZmlsZW5h
bWUpCisgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAg
ICMgQXMgZmlsZW5hbWUgbWF5IGhhdmUgc2xhc2hlcyBpbiBpdCwgd2UgbXVzdCBlbnN1cmUgdGhh
dCB0aGUgc2FtZQorICAgICAgICAjIGRpcmVjdG9yeSBoaWVyYXJjaHkgZXhpc3RzIGF0IHRoZSBv
dXRwdXQgcGF0aC4KKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5tYXliZV9tYWtlX2RpcmVjdG9y
eShvcy5wYXRoLnNwbGl0KGRlc3QpWzBdKQorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLmNvcHlm
aWxlKHNyYywgZGVzdCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAg
ICBmaWxlbmFtZSA9IHNlbGYuX2Z1bGxfcGF0aChmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5fZmls
ZXN5c3RlbS5yZW1vdmUoZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9kaXJlY3RvcnlmaWxlc2V0X3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vZGlyZWN0b3J5ZmlsZXNldF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5j
MjAxZGQ5NTE1YWUyZGJmMzZkODIyYzU2Mjc0YmZkMmNjMjdkYmEwCi0tLSAvZGV2L251bGwKKysr
IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vZGlyZWN0b3J5ZmlsZXNldF91bml0dGVz
dC5weQpAQCAtMCwwICsxLDcwIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBt
ZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitm
cm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2ltcG9ydCB1bml0dGVzdAor
Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5kaXJlY3RvcnlmaWxlc2V0IGltcG9ydCBEaXJlY3RvcnlG
aWxlU2V0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGltcG9y
dCBNb2NrRmlsZVN5c3RlbQorCisKK2NsYXNzIERpcmVjdG9yeUZpbGVTZXRUZXN0KHVuaXR0ZXN0
LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZpbGVzID0ge30KKyAg
ICAgICAgZmlsZXNbJy90ZXN0L3NvbWUtZmlsZSddID0gJ2NvbnRlbnRzJworICAgICAgICBmaWxl
c1snL3Rlc3Qvc29tZS1vdGhlci1maWxlJ10gPSAnb3RoZXIgY29udGVudHMnCisgICAgICAgIGZp
bGVzWycvdGVzdC9iL2MnXSA9ICdjJworICAgICAgICBzZWxmLl9maWxlc3lzdGVtID0gTW9ja0Zp
bGVTeXN0ZW0oZmlsZXMpCisgICAgICAgIHNlbGYuX2ZpbGVzZXQgPSBEaXJlY3RvcnlGaWxlU2V0
KCcvdGVzdCcsIHNlbGYuX2ZpbGVzeXN0ZW0pCisKKyAgICBkZWYgdGVzdF9maWxlc19pbl9uYW1l
bGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdzb21lLWZpbGUnIGluIHNlbGYu
X2ZpbGVzZXQubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdzb21lLW90aGVy
LWZpbGUnIGluIHNlbGYuX2ZpbGVzZXQubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRU
cnVlKCdiL2MnIGluIHNlbGYuX2ZpbGVzZXQubmFtZWxpc3QoKSkKKworICAgIGRlZiB0ZXN0X3Jl
YWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdjb250ZW50cycsIHNlbGYuX2Zp
bGVzZXQucmVhZCgnc29tZS1maWxlJykpCisKKyAgICBkZWYgdGVzdF9vcGVuKHNlbGYpOgorICAg
ICAgICBmaWxlID0gc2VsZi5fZmlsZXNldC5vcGVuKCdzb21lLWZpbGUnKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygnc29tZS1maWxlJywgZmlsZS5uYW1lKCkpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKCdjb250ZW50cycsIGZpbGUuY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0X2V4
dHJhY3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGVzZXQuZXh0cmFjdCgnc29tZS1maWxlJywg
Jy90ZXN0LWRpcmVjdG9yeScpCisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5fZmlsZXN5c3RlbS5y
ZWFkX3RleHRfZmlsZSgnL3Rlc3QtZGlyZWN0b3J5L3NvbWUtZmlsZScpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKCdjb250ZW50cycsIGNvbnRlbnRzKQorCisgICAgZGVmIHRlc3RfZXh0cmFj
dF9kZWVwX2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGVzZXQuZXh0cmFjdCgnYi9jJywg
Jy90ZXN0LWRpcmVjdG9yeScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9maWxlc3lz
dGVtLmV4aXN0cygnL3Rlc3QtZGlyZWN0b3J5L2IvYycpKQorCisgICAgZGVmIHRlc3RfZGVsZXRl
KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZmlsZXN5c3RlbS5leGlzdHMo
Jy90ZXN0L3NvbWUtZmlsZScpKQorICAgICAgICBzZWxmLl9maWxlc2V0LmRlbGV0ZSgnc29tZS1m
aWxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9maWxlc3lzdGVtLmV4aXN0cygn
L3Rlc3Qvc29tZS1maWxlJykpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1
bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L2ZpbGVzZXQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9maWxlc2V0LnB5Cm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmQ2OGJkYzcxMTBkN2I4MDFmNjhiY2YwNmE1ZTczZjBmZGZlMDkwNDIKLS0tIC9k
ZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9maWxlc2V0LnB5CkBA
IC0wLDAgKzEsNjAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMK
KyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBv
cworCisKK2NsYXNzIEZpbGVTZXRGaWxlSGFuZGxlKG9iamVjdCk6CisgICAgIiIiUG9pbnRzIHRv
IGEgZmlsZSB0aGF0IHJlc2lkZXMgaW4gYSBmaWxlIHNldCIiIgorICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCBmaWxlc2V0LCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5h
bWUKKyAgICAgICAgc2VsZi5fZmlsZXNldCA9IGZpbGVzZXQKKyAgICAgICAgc2VsZi5fY29udGVu
dHMgPSBOb25lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlczol
cyIgJSAoc2VsZi5fZmlsZXNldCwgc2VsZi5fZmlsZW5hbWUpCisKKyAgICBkZWYgY29udGVudHMo
c2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NvbnRlbnRzIGlzIE5vbmU6CisgICAgICAgICAgICBz
ZWxmLl9jb250ZW50cyA9IHNlbGYuX2ZpbGVzZXQucmVhZChzZWxmLl9maWxlbmFtZSkKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKyAgICBkZWYgc2F2ZV90byhzZWxmLCBwYXRoLCBm
aWxlbmFtZT1Ob25lKToKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAg
IHNlbGYuX2ZpbGVzZXQuZXh0cmFjdChzZWxmLl9maWxlbmFtZSwgcGF0aCkKKyAgICAgICAgICAg
IHJldHVybgorICAgICAgICB3aXRoIHNlbGYuX2ZpbGVzeXN0ZW0ubWtkdGVtcCgpIGFzIHRlbXBf
ZGlyOgorICAgICAgICAgICAgc2VsZi5fZmlsZXNldC5leHRyYWN0KHNlbGYuX2ZpbGVuYW1lLCB0
ZW1wX2RpcikKKworICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBzZWxm
Ll9maWxlbmFtZSkKKyAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5h
bWUpCisgICAgICAgICAgICBzZWxmLl9maWxlc3lzdGVtLmNvcHlmaWxlKHNyYywgZGVzdCkKKwor
ICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGVzZXQuZGVsZXRlKHNlbGYu
X2ZpbGVuYW1lKQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9m
aWxlbmFtZQorCisgICAgZGVmIHNwbGl0ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gb3MucGF0
aC5zcGxpdGV4dChzZWxmLm5hbWUoKSkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL25ldC96aXBmaWxlc2V0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L3ppcGZpbGVzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTRmZmMxMmFmNjM4NTVkM2U2MWVjNGJj
MzMzMDg0OGU5MWMxNzY0NQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL25ldC96aXBmaWxlc2V0LnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB6aXBmaWxlCisKK2Zy
b20gd2Via2l0cHkuY29tbW9uLmZpbGVzZXQgaW1wb3J0IEZpbGVTZXRGaWxlSGFuZGxlCitmcm9t
IHdlYmtpdHB5LmNvbW1vbi5uZXQubmV0d29ya3RyYW5zYWN0aW9uIGltcG9ydCBOZXR3b3JrVHJh
bnNhY3Rpb24KK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtIGltcG9ydCBG
aWxlU3lzdGVtCisKKworY2xhc3MgWmlwRmlsZVNldChvYmplY3QpOgorICAgICIiIlRoZSBzZXQg
b2YgZmlsZXMgaW4gYSB6aXAgZmlsZSB0aGF0IHJlc2lkZXMgYXQgYSBVUkwgKGxvY2FsIG9yIHJl
bW90ZSkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgemlwX3VybCwgZmlsZXN5c3RlbT1Ob25l
KToKKyAgICAgICAgc2VsZi5femlwX3VybCA9IHppcF91cmwKKyAgICAgICAgc2VsZi5femlwX2Zp
bGUgPSBOb25lCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtIG9yIEZpbGVT
eXN0ZW0oKQorCisgICAgZGVmIF9sb2FkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl96aXBfZmls
ZSBpcyBOb25lOgorICAgICAgICAgICAgdGVtcF9maWxlID0gTmV0d29ya1RyYW5zYWN0aW9uKCku
cnVuKGxhbWJkYTogdXJsbGliLnVybHJldHJpZXZlKHNlbGYuX3ppcF91cmwpWzBdKQorICAgICAg
ICAgICAgc2VsZi5femlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUodGVtcF9maWxlKQorCisgICAg
ZGVmIG9wZW4oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gRmlsZVNldEZpbGVIYW5k
bGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHNl
bGYuX2xvYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3QoKQorCisg
ICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX3ppcF9maWxlLnJlYWQoZmlsZW5hbWUpCisKKyAgICBkZWYgZXh0cmFj
dChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNlbGYuX2xvYWQoKQorICAgICAgICBz
ZWxmLl9maWxlc3lzdGVtLmV4dHJhY3Qoc2VsZi5femlwX2ZpbGUsIGZpbGVuYW1lLCBwYXRoKQor
CisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlv
bigiQ2FuJ3QgZGVsZXRlIGZyb20gYSBaaXBGaWxlU2V0LiIpCmRpZmYgLS1naXQgYS9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvemlwZmlsZXNldF91bml0dGVzdC5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC96aXBmaWxlc2V0X3VuaXR0ZXN0LnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjcyZDk2N2JhMGFiYTI2YThjMzdkNjg4NGE0YjE2OTIwOGY3MTg4NjMKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvemlwZmlsZXNldF91
bml0dGVzdC5weQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisj
IGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisj
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisj
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVu
aXR0ZXN0CitpbXBvcnQgemlwZmlsZQorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmls
ZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmlsZVN5c3RlbQorZnJvbSB3ZWJraXRweS5jb21tb24u
bmV0LnppcGZpbGVzZXQgaW1wb3J0IFppcEZpbGVTZXQKKworCitjbGFzcyBaaXBGaWxlU2V0VGVz
dCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxm
Ll90ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB6aXBmaWxlbmFtZSA9IG9z
LnBhdGguam9pbihzZWxmLl90ZW1wX2RpciwgJ3RlbXAuemlwJykKKyAgICAgICAgeiA9IHppcGZp
bGUuWmlwRmlsZSh6aXBmaWxlbmFtZSwgJ3cnKQorICAgICAgICB6LndyaXRlc3RyKCdzb21lLWZp
bGUnLCAnY29udGVudHMnKQorICAgICAgICB6LndyaXRlc3RyKCdhL2Ivc29tZS1vdGhlci1maWxl
JywgJ290aGVyIGNvbnRlbnRzJykKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IE1vY2tGaWxl
U3lzdGVtKCkKKyAgICAgICAgc2VsZi5femlwID0gWmlwRmlsZVNldCh6aXBmaWxlbmFtZSwgc2Vs
Zi5fZmlsZXN5c3RlbSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2h1dGls
LnJtdHJlZShzZWxmLl90ZW1wX2RpcikKKworICAgIGRlZiB0ZXN0X29wZW4oc2VsZik6CisgICAg
ICAgIGZpbGUgPSBzZWxmLl96aXAub3BlbignYS9iL3NvbWUtb3RoZXItZmlsZScpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCdhL2Ivc29tZS1vdGhlci1maWxlJywgZmlsZS5uYW1lKCkpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdvdGhlciBjb250ZW50cycsIGZpbGUuY29udGVudHMo
KSkKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxz
KCdjb250ZW50cycsIHNlbGYuX3ppcC5yZWFkKCdzb21lLWZpbGUnKSkKKworICAgIGRlZiB0ZXN0
X2V4dHJhY3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0ubWF5YmVfbWFrZV9kaXJl
Y3RvcnkoJy9zb21lLWRpcicpCisgICAgICAgIHNlbGYuX3ppcC5leHRyYWN0KCdzb21lLWZpbGUn
LCAnL3NvbWUtZGlyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2ZpbGVzeXN0ZW0u
aXNmaWxlKCcvc29tZS1kaXIvc29tZS1maWxlJykpCisKKyAgICBkZWYgdGVzdF9kZWVwX2V4dHJh
Y3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0ubWF5YmVfbWFrZV9kaXJlY3Rvcnko
Jy9zb21lLWRpcicpCisgICAgICAgIHNlbGYuX3ppcC5leHRyYWN0KCdhL2Ivc29tZS1vdGhlci1m
aWxlJywgJy9zb21lLWRpcicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9maWxlc3lz
dGVtLmlzZmlsZSgnL3NvbWUtZGlyL2EvYi9zb21lLW90aGVyLWZpbGUnKSkKKworICAgIGRlZiB0
ZXN0X2NhbnRfZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRp
b24sIHNlbGYuX3ppcC5kZWxldGUsICdzb21lLWZpbGUnKQorCisgICAgZGVmIHRlc3RfbmFtZWxp
c3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc29tZS1maWxlJyBpbiBzZWxmLl96
aXAubmFtZWxpc3QoKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0
ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lz
dGVtL2ZpbGVzeXN0ZW0ucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
ZmlsZXN5c3RlbS5weQppbmRleCBmMGI1ZTQ0ZmNhYzdmNmYwNzNmZTY3NzRhZWMxZTY0YjEyYjZj
OGQ0Li5jNTBmNTUyMTE3ZjdkYzY5NjZmZjEzMzkyYTIzYjdlNTZmY2FmMTFlIDEwMDY0NAotLS0g
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQorKysg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weQpAQCAt
MTUyLDMgKzE1MiwxMyBAQCBjbGFzcyBGaWxlU3lzdGVtKG9iamVjdCk6CiAgICAgICAgICIiIkNv
cGllcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHBhdGggdG8gdGhlIGRl
c3RpbmF0aW9uCiAgICAgICAgIHBhdGguIiIiCiAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzb3Vy
Y2UsIGRlc3RpbmF0aW9uKQorCisgICAgZGVmIGZpbGVzX3VuZGVyKHNlbGYsIHBhdGgpOgorICAg
ICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGZpbGVzIHVuZGVyIHRoZSBnaXZlbiBwYXRo
LiIiIgorICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihwYXRoX3RvX2ZpbGUsIGZpbGVuYW1l
KQorICAgICAgICAgICAgZm9yIChwYXRoX3RvX2ZpbGUsIF8sIGZpbGVuYW1lcykgaW4gb3Mud2Fs
ayhwYXRoKQorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lc10KKworICAgIGRl
ZiBleHRyYWN0KHNlbGYsIHppcCwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICAiIiJFeHRyYWN0
IGEgZmlsZSBmcm9tIGEgemlwLiIiIgorICAgICAgICB6aXAuZXh0cmFjdChmaWxlbmFtZSwgcGF0
aCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxl
c3lzdGVtX21vY2sucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmls
ZXN5c3RlbV9tb2NrLnB5CmluZGV4IGVhMGYzZjk1N2ZmNDkyZmQyYzc2YWRkMzc1YzBkMmY0YTFj
ZGUxNDEuLmIzYjQ2MDA3NjUwYTExYzA5OTA5ODRlMGI3YTdjM2FiZjAzNzYxZDEgMTAwNjQ0Ci0t
LSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2su
cHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1f
bW9jay5weQpAQCAtMTA3LDMgKzEwNywxNCBAQCBjbGFzcyBNb2NrRmlsZVN5c3RlbShvYmplY3Qp
OgogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcihlcnJuby5FSVNESVIsIGRlc3RpbmF0aW9uLCBv
cy5zdHJlcnJvcihlcnJuby5JU0RJUikpCiAKICAgICAgICAgc2VsZi5maWxlc1tkZXN0aW5hdGlv
bl0gPSBzZWxmLmZpbGVzW3NvdXJjZV0KKworICAgIGRlZiBmaWxlc191bmRlcihzZWxmLCBwYXRo
KToKKyAgICAgICAgaWYgbm90IHBhdGguZW5kc3dpdGgoJy8nKToKKyAgICAgICAgICAgIHBhdGgg
Kz0gJy8nCisgICAgICAgIHJldHVybiBbZmlsZSBmb3IgZmlsZSBpbiBzZWxmLmZpbGVzIGlmIGZp
bGUuc3RhcnRzd2l0aChwYXRoKV0KKworICAgIGRlZiByZW1vdmUoc2VsZiwgcGF0aCk6CisgICAg
ICAgIGRlbChzZWxmLmZpbGVzW3BhdGhdKQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgemlwLCBm
aWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNlbGYud3JpdGVfdGV4dF9maWxlKG9zLnBhdGguam9p
bihwYXRoLCBmaWxlbmFtZSksIHppcC5yZWFkKGZpbGVuYW1lKSkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78201</attachid>
            <date>2011-01-06 18:35:13 -0800</date>
            <delta_ts>2011-01-06 20:45:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50901-20110107133510.patch</filename>
            <type>text/plain</type>
            <size>19944</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA0Yjg0
MWQ4YTAzMjMxOGFjNWM0NWNlM2E1MTEwZjhjZDA3MDNiNTJlLi45NjRkYzcyMDBiNjNkZTg4YzJh
ZGYwOWNiNjMzMWM4Y2YzMjk0ZTFlIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMDEtMDYgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgaW50
ZXJmYWNlIHRvIGEgc2V0IG9mIGZpbGVzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NTA5MDEKKworICAgICAgICBUaGVzZSBjbGFzc2VzIGFsbG93IHVz
IHRvIHdyaXRlIGNvZGUgdGhhdCBpcyBhZ25vc3RpYyB0byB3aGV0aGVyIGEKKyAgICAgICAgcGFy
dGljdWxhciBzZXQgb2YgZmlsZXMgcmVzaWRlcyBpbiBhIGxvY2FsIGRpcmVjdG9yeSBvciBpbiBh
IHppcCBmaWxlCisgICAgICAgIG9uIGEgcmVtb3RlIG1hY2hpbmUuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZGlyZWN0b3J5ZmlsZXNldC5weTogQWRkZWQuCisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2RpcmVjdG9yeWZpbGVzZXRf
dW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5
c3RlbS9maWxlc2V0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9zeXN0ZW0vZmlsZXN5c3RlbS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL3N5c3RlbS96aXBmaWxlc2V0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlwZmlsZXNldF91bml0dGVzdC5weTogQWRkZWQuCisKIDIw
MTEtMDEtMDMgIERhdmlkIExldmluICA8bGV2aW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vc3lzdGVtL2RpcmVjdG9yeWZpbGVzZXQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9zeXN0ZW0vZGlyZWN0b3J5ZmlsZXNldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMWFjYWY0
ZWIyZmQyNzE2NWY4YmRlMmZmOWM5YjJiOTI3YTAzNzlkCi0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2RpcmVjdG9yeWZpbGVzZXQucHkKQEAg
LTAsMCArMSw3NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIwor
IyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSBfX2Z1
dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwK
KworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzZXQgaW1wb3J0IEZpbGVTZXRGaWxl
SGFuZGxlCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQgRmls
ZVN5c3RlbQoraW1wb3J0IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ub3NwYXRoIGFzIG9zcGF0aAor
CisKK2NsYXNzIERpcmVjdG9yeUZpbGVTZXQob2JqZWN0KToKKyAgICAiIiJUaGUgc2V0IG9mIGZp
bGVzIHVuZGVyIGEgbG9jYWwgZGlyZWN0b3J5LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBw
YXRoLCBmaWxlc3lzdGVtPU5vbmUpOgorICAgICAgICBzZWxmLl9wYXRoID0gcGF0aAorICAgICAg
ICBzZWxmLl9maWxlc3lzdGVtID0gZmlsZXN5c3RlbSBvciBGaWxlU3lzdGVtKCkKKyAgICAgICAg
aWYgbm90IHNlbGYuX3BhdGguZW5kc3dpdGgob3MucGF0aC5zZXApOgorICAgICAgICAgICAgc2Vs
Zi5fcGF0aCArPSBvcy5wYXRoLnNlcAorCisgICAgZGVmIF9mdWxsX3BhdGgoc2VsZiwgZmlsZW5h
bWUpOgorICAgICAgICBhc3NlcnQgc2VsZi5faXNfdW5kZXIoc2VsZi5fcGF0aCwgZmlsZW5hbWUp
CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc3lzdGVtLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5h
bWUpCisKKyAgICBkZWYgX2Ryb3BfZGlyZWN0b3J5X3ByZWZpeChzZWxmLCBwYXRoKToKKyAgICAg
ICAgcmV0dXJuIHBhdGhbbGVuKHNlbGYuX3BhdGgpOl0KKworICAgIGRlZiBfZmlsZXNfaW5fZGly
ZWN0b3J5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVz
IGluIHRoZSBkaXJlY3RvcnksIGluY2x1ZGluZyB0aGUgcGF0aAorICAgICAgICAgICB0byB0aGUg
ZGlyZWN0b3J5IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc3lzdGVtLmZpbGVzX3VuZGVy
KHNlbGYuX3BhdGgpCisKKyAgICBkZWYgX2lzX3VuZGVyKHNlbGYsIGRpciwgZmlsZW5hbWUpOgor
ICAgICAgICByZXR1cm4gYm9vbChvc3BhdGgucmVscGF0aChzZWxmLl9maWxlc3lzdGVtLmpvaW4o
ZGlyLCBmaWxlbmFtZSksIGRpcikpCisKKyAgICBkZWYgb3BlbihzZWxmLCBmaWxlbmFtZSk6Cisg
ICAgICAgIHJldHVybiBGaWxlU2V0RmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSwgc2VsZi5fZmls
ZXN5c3RlbSkKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIG1hcChz
ZWxmLl9kcm9wX2RpcmVjdG9yeV9wcmVmaXgsIHNlbGYuX2ZpbGVzX2luX2RpcmVjdG9yeSgpKQor
CisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmls
ZXN5c3RlbS5yZWFkX3RleHRfZmlsZShzZWxmLl9mdWxsX3BhdGgoZmlsZW5hbWUpKQorCisgICAg
ZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICAiIiJFeHRyYWN0cyBh
IGZpbGUgZnJvbSB0aGlzIGZpbGUgc2V0IHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiIiIgor
ICAgICAgICBzcmMgPSBzZWxmLl9mdWxsX3BhdGgoZmlsZW5hbWUpCisgICAgICAgIGRlc3QgPSBz
ZWxmLl9maWxlc3lzdGVtLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAgICMgQXMgZmlsZW5h
bWUgbWF5IGhhdmUgc2xhc2hlcyBpbiBpdCwgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgc2FtZQor
ICAgICAgICAjIGRpcmVjdG9yeSBoaWVyYXJjaHkgZXhpc3RzIGF0IHRoZSBvdXRwdXQgcGF0aC4K
KyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5tYXliZV9tYWtlX2RpcmVjdG9yeShvcy5wYXRoLnNw
bGl0KGRlc3QpWzBdKQorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLmNvcHlmaWxlKHNyYywgZGVz
dCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9
IHNlbGYuX2Z1bGxfcGF0aChmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5yZW1v
dmUoZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9z
eXN0ZW0vZGlyZWN0b3J5ZmlsZXNldF91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL3N5c3RlbS9kaXJlY3RvcnlmaWxlc2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmEzODUwZWU2YTgwZTcyN2ExNzZiYTlmMDlkZTE4NTU5OTMzMTg2YmYKLS0tIC9kZXYvbnVsbAor
KysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZGlyZWN0b3J5ZmlsZXNl
dF91bml0dGVzdC5weQpAQCAtMCwwICsxLDcwIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2ltcG9ydCB1
bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGlyZWN0b3J5ZmlsZXNldCBp
bXBvcnQgRGlyZWN0b3J5RmlsZVNldAorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVz
eXN0ZW1fbW9jayBpbXBvcnQgTW9ja0ZpbGVTeXN0ZW0KKworCitjbGFzcyBEaXJlY3RvcnlGaWxl
U2V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAg
ICBmaWxlcyA9IHt9CisgICAgICAgIGZpbGVzWycvdGVzdC9zb21lLWZpbGUnXSA9ICdjb250ZW50
cycKKyAgICAgICAgZmlsZXNbJy90ZXN0L3NvbWUtb3RoZXItZmlsZSddID0gJ290aGVyIGNvbnRl
bnRzJworICAgICAgICBmaWxlc1snL3Rlc3QvYi9jJ10gPSAnYycKKyAgICAgICAgc2VsZi5fZmls
ZXN5c3RlbSA9IE1vY2tGaWxlU3lzdGVtKGZpbGVzKQorICAgICAgICBzZWxmLl9maWxlc2V0ID0g
RGlyZWN0b3J5RmlsZVNldCgnL3Rlc3QnLCBzZWxmLl9maWxlc3lzdGVtKQorCisgICAgZGVmIHRl
c3RfZmlsZXNfaW5fbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc29t
ZS1maWxlJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0
VHJ1ZSgnc29tZS1vdGhlci1maWxlJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisgICAg
ICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYi9jJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisK
KyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnY29u
dGVudHMnLCBzZWxmLl9maWxlc2V0LnJlYWQoJ3NvbWUtZmlsZScpKQorCisgICAgZGVmIHRlc3Rf
b3BlbihzZWxmKToKKyAgICAgICAgZmlsZSA9IHNlbGYuX2ZpbGVzZXQub3Blbignc29tZS1maWxl
JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3NvbWUtZmlsZScsIGZpbGUubmFtZSgpKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnY29udGVudHMnLCBmaWxlLmNvbnRlbnRzKCkpCisK
KyAgICBkZWYgdGVzdF9leHRyYWN0KHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc2V0LmV4dHJh
Y3QoJ3NvbWUtZmlsZScsICcvdGVzdC1kaXJlY3RvcnknKQorICAgICAgICBjb250ZW50cyA9IHNl
bGYuX2ZpbGVzeXN0ZW0ucmVhZF90ZXh0X2ZpbGUoJy90ZXN0LWRpcmVjdG9yeS9zb21lLWZpbGUn
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnY29udGVudHMnLCBjb250ZW50cykKKworICAg
IGRlZiB0ZXN0X2V4dHJhY3RfZGVlcF9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc2V0
LmV4dHJhY3QoJ2IvYycsICcvdGVzdC1kaXJlY3RvcnknKQorICAgICAgICBzZWxmLmFzc2VydFRy
dWUoc2VsZi5fZmlsZXN5c3RlbS5leGlzdHMoJy90ZXN0LWRpcmVjdG9yeS9iL2MnKSkKKworICAg
IGRlZiB0ZXN0X2RlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2Zp
bGVzeXN0ZW0uZXhpc3RzKCcvdGVzdC9zb21lLWZpbGUnKSkKKyAgICAgICAgc2VsZi5fZmlsZXNl
dC5kZWxldGUoJ3NvbWUtZmlsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fZmls
ZXN5c3RlbS5leGlzdHMoJy90ZXN0L3NvbWUtZmlsZScpKQorCisKK2lmIF9fbmFtZV9fID09ICdf
X21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXNldC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL3N5c3RlbS9maWxlc2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVkYzI4MjFjMmJhMjgzYzJl
M2E5NWQ0ZDNkY2NkMGFjYmY1MGM3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXNldC5weQpAQCAtMCwwICsxLDYzIEBACisjIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MKKworZnJvbSB3ZWJraXRweS5j
b21tb24uc3lzdGVtLmZpbGVzeXN0ZW0gaW1wb3J0IEZpbGVTeXN0ZW0KKworCitjbGFzcyBGaWxl
U2V0RmlsZUhhbmRsZShvYmplY3QpOgorICAgICIiIlBvaW50cyB0byBhIGZpbGUgdGhhdCByZXNp
ZGVzIGluIGEgZmlsZSBzZXQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZXNldCwgZmls
ZW5hbWUsIGZpbGVzeXN0ZW09Tm9uZSk6CisgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5h
bWUKKyAgICAgICAgc2VsZi5fZmlsZXNldCA9IGZpbGVzZXQKKyAgICAgICAgc2VsZi5fY29udGVu
dHMgPSBOb25lCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtIG9yIEZpbGVT
eXN0ZW0oKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXM6JXMi
ICUgKHNlbGYuX2ZpbGVzZXQsIHNlbGYuX2ZpbGVuYW1lKQorCisgICAgZGVmIGNvbnRlbnRzKHNl
bGYpOgorICAgICAgICBpZiBzZWxmLl9jb250ZW50cyBpcyBOb25lOgorICAgICAgICAgICAgc2Vs
Zi5fY29udGVudHMgPSBzZWxmLl9maWxlc2V0LnJlYWQoc2VsZi5fZmlsZW5hbWUpCisgICAgICAg
IHJldHVybiBzZWxmLl9jb250ZW50cworCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCwgZmls
ZW5hbWU9Tm9uZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBz
ZWxmLl9maWxlc2V0LmV4dHJhY3Qoc2VsZi5fZmlsZW5hbWUsIHBhdGgpCisgICAgICAgICAgICBy
ZXR1cm4KKyAgICAgICAgd2l0aCBzZWxmLl9maWxlc3lzdGVtLm1rZHRlbXAoKSBhcyB0ZW1wX2Rp
cjoKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVzZXQuZXh0cmFjdChzZWxmLl9maWxlbmFtZSwgdGVt
cF9kaXIpCisKKyAgICAgICAgICAgIHNyYyA9IHNlbGYuX2ZpbGVzeXN0ZW0uam9pbih0ZW1wX2Rp
ciwgc2VsZi5fZmlsZW5hbWUpCisgICAgICAgICAgICBkZXN0ID0gc2VsZi5fZmlsZXN5c3RlbS5q
b2luKHBhdGgsIGZpbGVuYW1lKQorICAgICAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5jb3B5Zmls
ZShzcmMsIGRlc3QpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxl
c2V0LmRlbGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAg
ICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBzcGxpdGV4dChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKCkpCmRpZmYgLS1naXQgYS9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weSBiL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CmluZGV4IGYwYjVlNDRm
Y2FjN2Y2ZjA3M2ZlNjc3NGFlYzFlNjRiMTJiNmM4ZDQuLjAyY2I3YTE2ZmZkYTQ2MzkyOTk4YWQw
N2NiN2ZmMWYxNTZmNmVmNjEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CkBAIC05Myw3ICs5Myw3IEBAIGNsYXNzIEZpbGVTeXN0
ZW0ob2JqZWN0KToKICAgICBkZWYgbWF5YmVfbWFrZV9kaXJlY3Rvcnkoc2VsZiwgKnBhdGgpOgog
ICAgICAgICAiIiJDcmVhdGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBh
bHJlYWR5IGV4aXN0LiIiIgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy5tYWtlZGlycyhv
cy5wYXRoLmpvaW4oKnBhdGgpKQorICAgICAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5qb2luKCpw
YXRoKSkKICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CiAgICAgICAgICAgICBpZiBlLmVycm5v
ICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgICByYWlzZQpAQCAtMTUyLDMgKzE1Miwx
MyBAQCBjbGFzcyBGaWxlU3lzdGVtKG9iamVjdCk6CiAgICAgICAgICIiIkNvcGllcyB0aGUgY29u
dGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uCiAg
ICAgICAgIHBhdGguIiIiCiAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzb3VyY2UsIGRlc3RpbmF0
aW9uKQorCisgICAgZGVmIGZpbGVzX3VuZGVyKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJSZXR1
cm4gdGhlIGxpc3Qgb2YgYWxsIGZpbGVzIHVuZGVyIHRoZSBnaXZlbiBwYXRoLiIiIgorICAgICAg
ICByZXR1cm4gW3NlbGYuam9pbihwYXRoX3RvX2ZpbGUsIGZpbGVuYW1lKQorICAgICAgICAgICAg
Zm9yIChwYXRoX3RvX2ZpbGUsIF8sIGZpbGVuYW1lcykgaW4gb3Mud2FsayhwYXRoKQorICAgICAg
ICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lc10KKworICAgIGRlZiBleHRyYWN0KHNlbGYs
IHppcCwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICAiIiJFeHRyYWN0IGEgZmlsZSBmcm9tIGEg
emlwLiIiIgorICAgICAgICB6aXAuZXh0cmFjdChmaWxlbmFtZSwgcGF0aCkKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHkg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5
CmluZGV4IGVhMGYzZjk1N2ZmNDkyZmQyYzc2YWRkMzc1YzBkMmY0YTFjZGUxNDEuLjhlYjg5YWM4
YmNiMDc1OGNlYzIxYTAxNjcxZDk5MjUwOTVlNjQ5ZDEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHkKKysrIGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weQpAQCAtNTcs
NyArNTcsNyBAQCBjbGFzcyBNb2NrRmlsZVN5c3RlbShvYmplY3QpOgogICAgICAgICByZXR1cm4g
YW55KGYuc3RhcnRzd2l0aChwYXRoKSBmb3IgZiBpbiBzZWxmLmZpbGVzKQogCiAgICAgZGVmIGpv
aW4oc2VsZiwgKmNvbXBzKToKLSAgICAgICAgcmV0dXJuICcvJy5qb2luKGNvbXBzKQorICAgICAg
ICByZXR1cm4gb3MucGF0aC5qb2luKCpjb21wcykKIAogICAgIGRlZiBsaXN0ZGlyKHNlbGYsIHBh
dGgpOgogICAgICAgICBpZiBub3Qgc2VsZi5pc2RpcihwYXRoKToKQEAgLTEwNywzICsxMDcsMTQg
QEAgY2xhc3MgTW9ja0ZpbGVTeXN0ZW0ob2JqZWN0KToKICAgICAgICAgICAgIHJhaXNlIElPRXJy
b3IoZXJybm8uRUlTRElSLCBkZXN0aW5hdGlvbiwgb3Muc3RyZXJyb3IoZXJybm8uSVNESVIpKQog
CiAgICAgICAgIHNlbGYuZmlsZXNbZGVzdGluYXRpb25dID0gc2VsZi5maWxlc1tzb3VyY2VdCisK
KyAgICBkZWYgZmlsZXNfdW5kZXIoc2VsZiwgcGF0aCk6CisgICAgICAgIGlmIG5vdCBwYXRoLmVu
ZHN3aXRoKCcvJyk6CisgICAgICAgICAgICBwYXRoICs9ICcvJworICAgICAgICByZXR1cm4gW2Zp
bGUgZm9yIGZpbGUgaW4gc2VsZi5maWxlcyBpZiBmaWxlLnN0YXJ0c3dpdGgocGF0aCldCisKKyAg
ICBkZWYgcmVtb3ZlKHNlbGYsIHBhdGgpOgorICAgICAgICBkZWwgc2VsZi5maWxlc1twYXRoXQor
CisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgemlwLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHNl
bGYud3JpdGVfdGV4dF9maWxlKHNlbGYuam9pbihwYXRoLCBmaWxlbmFtZSksIHppcC5yZWFkKGZp
bGVuYW1lKSkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3Rl
bS96aXBmaWxlc2V0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3pp
cGZpbGVzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uY2I5ODk4ZjBkYWE1YTg2MWU1MWUzNDY4M2M5YzQ3OGZm
NjE3NTVhYgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L3N5c3RlbS96aXBmaWxlc2V0LnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMgQ29weXJpZ2h0IChDKSAy
MDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB6aXBmaWxlCisKK2Zyb20gd2Vi
a2l0cHkuY29tbW9uLm5ldC5uZXR3b3JrdHJhbnNhY3Rpb24gaW1wb3J0IE5ldHdvcmtUcmFuc2Fj
dGlvbgorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzZXQgaW1wb3J0IEZpbGVTZXRG
aWxlSGFuZGxlCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQg
RmlsZVN5c3RlbQorCisKK2NsYXNzIFppcEZpbGVTZXQob2JqZWN0KToKKyAgICAiIiJUaGUgc2V0
IG9mIGZpbGVzIGluIGEgemlwIGZpbGUgdGhhdCByZXNpZGVzIGF0IGEgVVJMIChsb2NhbCBvciBy
ZW1vdGUpIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHppcF91cmwsIGZpbGVzeXN0ZW09Tm9u
ZSk6CisgICAgICAgIHNlbGYuX3ppcF91cmwgPSB6aXBfdXJsCisgICAgICAgIHNlbGYuX3ppcF9m
aWxlID0gTm9uZQorICAgICAgICBzZWxmLl9maWxlc3lzdGVtID0gZmlsZXN5c3RlbSBvciBGaWxl
U3lzdGVtKCkKKworICAgIGRlZiBfbG9hZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5femlwX2Zp
bGUgaXMgTm9uZToKKyAgICAgICAgICAgIHRlbXBfZmlsZSA9IE5ldHdvcmtUcmFuc2FjdGlvbigp
LnJ1bihsYW1iZGE6IHVybGxpYi51cmxyZXRyaWV2ZShzZWxmLl96aXBfdXJsKVswXSkKKyAgICAg
ICAgICAgIHNlbGYuX3ppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKHRlbXBfZmlsZSkKKworICAg
IGRlZiBvcGVuKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIEZpbGVTZXRGaWxlSGFu
ZGxlKHNlbGYsIGZpbGVuYW1lLCBzZWxmLl9maWxlc3lzdGVtKQorCisgICAgZGVmIG5hbWVsaXN0
KHNlbGYpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9m
aWxlLm5hbWVsaXN0KCkKKworICAgIGRlZiByZWFkKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAg
c2VsZi5fbG9hZCgpCisgICAgICAgIHJldHVybiBzZWxmLl96aXBfZmlsZS5yZWFkKGZpbGVuYW1l
KQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICBzZWxm
Ll9sb2FkKCkKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5leHRyYWN0KHNlbGYuX3ppcF9maWxl
LCBmaWxlbmFtZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAg
ICAgICByYWlzZSBFeGNlcHRpb24oIkNhbid0IGRlbGV0ZSBmcm9tIGEgWmlwRmlsZVNldC4iKQpk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3ppcGZpbGVz
ZXRfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlw
ZmlsZXNldF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yMmRmYzc2YTI1OGRkMTY0N2RlZjQ5YjE1
M2EwMjUyZDUwYTYyYjFhCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vc3lzdGVtL3ppcGZpbGVzZXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw3MyBAQAor
IyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGls
CitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHppcGZpbGUKKworZnJv
bSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzeXN0ZW1fbW9jayBpbXBvcnQgTW9ja0ZpbGVT
eXN0ZW0KK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS56aXBmaWxlc2V0IGltcG9ydCBaaXBG
aWxlU2V0CisKKworY2xhc3MgWmlwRmlsZVNldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAg
IGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IE1vY2tGaWxlU3lz
dGVtKCkKKyAgICAgICAgc2VsZi5fdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAg
ICAgemlwZmlsZW5hbWUgPSBzZWxmLl9maWxlc3lzdGVtLmpvaW4oc2VsZi5fdGVtcF9kaXIsICd0
ZW1wLnppcCcpCisgICAgICAgIHogPSB6aXBmaWxlLlppcEZpbGUoemlwZmlsZW5hbWUsICd3JykK
KyAgICAgICAgei53cml0ZXN0cignc29tZS1maWxlJywgJ2NvbnRlbnRzJykKKyAgICAgICAgei53
cml0ZXN0cignYS9iL3NvbWUtb3RoZXItZmlsZScsICdvdGhlciBjb250ZW50cycpCisgICAgICAg
IHNlbGYuX3ppcCA9IFppcEZpbGVTZXQoemlwZmlsZW5hbWUsIHNlbGYuX2ZpbGVzeXN0ZW0pCisK
KyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5fdGVt
cF9kaXIpCisKKyAgICBkZWYgdGVzdF9vcGVuKHNlbGYpOgorICAgICAgICBmaWxlID0gc2VsZi5f
emlwLm9wZW4oJ2EvYi9zb21lLW90aGVyLWZpbGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cygnYS9iL3NvbWUtb3RoZXItZmlsZScsIGZpbGUubmFtZSgpKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygnb3RoZXIgY29udGVudHMnLCBmaWxlLmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVz
dF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnY29udGVudHMnLCBzZWxm
Ll96aXAucmVhZCgnc29tZS1maWxlJykpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0KHNlbGYpOgor
ICAgICAgICBzZWxmLl9maWxlc3lzdGVtLm1heWJlX21ha2VfZGlyZWN0b3J5KCcvc29tZS1kaXIn
KQorICAgICAgICBzZWxmLl96aXAuZXh0cmFjdCgnc29tZS1maWxlJywgJy9zb21lLWRpcicpCisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9maWxlc3lzdGVtLmlzZmlsZSgnL3NvbWUtZGly
L3NvbWUtZmlsZScpKQorCisgICAgZGVmIHRlc3RfZGVlcF9leHRyYWN0KHNlbGYpOgorICAgICAg
ICBzZWxmLl9maWxlc3lzdGVtLm1heWJlX21ha2VfZGlyZWN0b3J5KCcvc29tZS1kaXInKQorICAg
ICAgICBzZWxmLl96aXAuZXh0cmFjdCgnYS9iL3NvbWUtb3RoZXItZmlsZScsICcvc29tZS1kaXIn
KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZmlsZXN5c3RlbS5pc2ZpbGUoJy9zb21l
LWRpci9hL2Ivc29tZS1vdGhlci1maWxlJykpCisKKyAgICBkZWYgdGVzdF9jYW50X2RlbGV0ZShz
ZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBzZWxmLl96aXAuZGVs
ZXRlLCAnc29tZS1maWxlJykKKworICAgIGRlZiB0ZXN0X25hbWVsaXN0KHNlbGYpOgorICAgICAg
ICBzZWxmLmFzc2VydFRydWUoJ3NvbWUtZmlsZScgaW4gc2VsZi5femlwLm5hbWVsaXN0KCkpCisK
KworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78206</attachid>
            <date>2011-01-06 20:46:07 -0800</date>
            <delta_ts>2011-01-06 23:42:51 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50901-20110107154604.patch</filename>
            <type>text/plain</type>
            <size>20601</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA0Yjg0
MWQ4YTAzMjMxOGFjNWM0NWNlM2E1MTEwZjhjZDA3MDNiNTJlLi45NjRkYzcyMDBiNjNkZTg4YzJh
ZGYwOWNiNjMzMWM4Y2YzMjk0ZTFlIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMDEtMDYgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgaW50
ZXJmYWNlIHRvIGEgc2V0IG9mIGZpbGVzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NTA5MDEKKworICAgICAgICBUaGVzZSBjbGFzc2VzIGFsbG93IHVz
IHRvIHdyaXRlIGNvZGUgdGhhdCBpcyBhZ25vc3RpYyB0byB3aGV0aGVyIGEKKyAgICAgICAgcGFy
dGljdWxhciBzZXQgb2YgZmlsZXMgcmVzaWRlcyBpbiBhIGxvY2FsIGRpcmVjdG9yeSBvciBpbiBh
IHppcCBmaWxlCisgICAgICAgIG9uIGEgcmVtb3RlIG1hY2hpbmUuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZGlyZWN0b3J5ZmlsZXNldC5weTogQWRkZWQuCisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2RpcmVjdG9yeWZpbGVzZXRf
dW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5
c3RlbS9maWxlc2V0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9zeXN0ZW0vZmlsZXN5c3RlbS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL3N5c3RlbS96aXBmaWxlc2V0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlwZmlsZXNldF91bml0dGVzdC5weTogQWRkZWQuCisKIDIw
MTEtMDEtMDMgIERhdmlkIExldmluICA8bGV2aW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vc3lzdGVtL2RpcmVjdG9yeWZpbGVzZXQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9zeXN0ZW0vZGlyZWN0b3J5ZmlsZXNldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMWFjYWY0
ZWIyZmQyNzE2NWY4YmRlMmZmOWM5YjJiOTI3YTAzNzlkCi0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2RpcmVjdG9yeWZpbGVzZXQucHkKQEAg
LTAsMCArMSw3NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIwor
IyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSBfX2Z1
dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwK
KworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzZXQgaW1wb3J0IEZpbGVTZXRGaWxl
SGFuZGxlCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQgRmls
ZVN5c3RlbQoraW1wb3J0IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ub3NwYXRoIGFzIG9zcGF0aAor
CisKK2NsYXNzIERpcmVjdG9yeUZpbGVTZXQob2JqZWN0KToKKyAgICAiIiJUaGUgc2V0IG9mIGZp
bGVzIHVuZGVyIGEgbG9jYWwgZGlyZWN0b3J5LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBw
YXRoLCBmaWxlc3lzdGVtPU5vbmUpOgorICAgICAgICBzZWxmLl9wYXRoID0gcGF0aAorICAgICAg
ICBzZWxmLl9maWxlc3lzdGVtID0gZmlsZXN5c3RlbSBvciBGaWxlU3lzdGVtKCkKKyAgICAgICAg
aWYgbm90IHNlbGYuX3BhdGguZW5kc3dpdGgob3MucGF0aC5zZXApOgorICAgICAgICAgICAgc2Vs
Zi5fcGF0aCArPSBvcy5wYXRoLnNlcAorCisgICAgZGVmIF9mdWxsX3BhdGgoc2VsZiwgZmlsZW5h
bWUpOgorICAgICAgICBhc3NlcnQgc2VsZi5faXNfdW5kZXIoc2VsZi5fcGF0aCwgZmlsZW5hbWUp
CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc3lzdGVtLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5h
bWUpCisKKyAgICBkZWYgX2Ryb3BfZGlyZWN0b3J5X3ByZWZpeChzZWxmLCBwYXRoKToKKyAgICAg
ICAgcmV0dXJuIHBhdGhbbGVuKHNlbGYuX3BhdGgpOl0KKworICAgIGRlZiBfZmlsZXNfaW5fZGly
ZWN0b3J5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVz
IGluIHRoZSBkaXJlY3RvcnksIGluY2x1ZGluZyB0aGUgcGF0aAorICAgICAgICAgICB0byB0aGUg
ZGlyZWN0b3J5IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc3lzdGVtLmZpbGVzX3VuZGVy
KHNlbGYuX3BhdGgpCisKKyAgICBkZWYgX2lzX3VuZGVyKHNlbGYsIGRpciwgZmlsZW5hbWUpOgor
ICAgICAgICByZXR1cm4gYm9vbChvc3BhdGgucmVscGF0aChzZWxmLl9maWxlc3lzdGVtLmpvaW4o
ZGlyLCBmaWxlbmFtZSksIGRpcikpCisKKyAgICBkZWYgb3BlbihzZWxmLCBmaWxlbmFtZSk6Cisg
ICAgICAgIHJldHVybiBGaWxlU2V0RmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSwgc2VsZi5fZmls
ZXN5c3RlbSkKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIG1hcChz
ZWxmLl9kcm9wX2RpcmVjdG9yeV9wcmVmaXgsIHNlbGYuX2ZpbGVzX2luX2RpcmVjdG9yeSgpKQor
CisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmls
ZXN5c3RlbS5yZWFkX3RleHRfZmlsZShzZWxmLl9mdWxsX3BhdGgoZmlsZW5hbWUpKQorCisgICAg
ZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICAiIiJFeHRyYWN0cyBh
IGZpbGUgZnJvbSB0aGlzIGZpbGUgc2V0IHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiIiIgor
ICAgICAgICBzcmMgPSBzZWxmLl9mdWxsX3BhdGgoZmlsZW5hbWUpCisgICAgICAgIGRlc3QgPSBz
ZWxmLl9maWxlc3lzdGVtLmpvaW4ocGF0aCwgZmlsZW5hbWUpCisgICAgICAgICMgQXMgZmlsZW5h
bWUgbWF5IGhhdmUgc2xhc2hlcyBpbiBpdCwgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgc2FtZQor
ICAgICAgICAjIGRpcmVjdG9yeSBoaWVyYXJjaHkgZXhpc3RzIGF0IHRoZSBvdXRwdXQgcGF0aC4K
KyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5tYXliZV9tYWtlX2RpcmVjdG9yeShvcy5wYXRoLnNw
bGl0KGRlc3QpWzBdKQorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLmNvcHlmaWxlKHNyYywgZGVz
dCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9
IHNlbGYuX2Z1bGxfcGF0aChmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5yZW1v
dmUoZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9z
eXN0ZW0vZGlyZWN0b3J5ZmlsZXNldF91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL3N5c3RlbS9kaXJlY3RvcnlmaWxlc2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmEzODUwZWU2YTgwZTcyN2ExNzZiYTlmMDlkZTE4NTU5OTMzMTg2YmYKLS0tIC9kZXYvbnVsbAor
KysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZGlyZWN0b3J5ZmlsZXNl
dF91bml0dGVzdC5weQpAQCAtMCwwICsxLDcwIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2ltcG9ydCB1
bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGlyZWN0b3J5ZmlsZXNldCBp
bXBvcnQgRGlyZWN0b3J5RmlsZVNldAorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVz
eXN0ZW1fbW9jayBpbXBvcnQgTW9ja0ZpbGVTeXN0ZW0KKworCitjbGFzcyBEaXJlY3RvcnlGaWxl
U2V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAg
ICBmaWxlcyA9IHt9CisgICAgICAgIGZpbGVzWycvdGVzdC9zb21lLWZpbGUnXSA9ICdjb250ZW50
cycKKyAgICAgICAgZmlsZXNbJy90ZXN0L3NvbWUtb3RoZXItZmlsZSddID0gJ290aGVyIGNvbnRl
bnRzJworICAgICAgICBmaWxlc1snL3Rlc3QvYi9jJ10gPSAnYycKKyAgICAgICAgc2VsZi5fZmls
ZXN5c3RlbSA9IE1vY2tGaWxlU3lzdGVtKGZpbGVzKQorICAgICAgICBzZWxmLl9maWxlc2V0ID0g
RGlyZWN0b3J5RmlsZVNldCgnL3Rlc3QnLCBzZWxmLl9maWxlc3lzdGVtKQorCisgICAgZGVmIHRl
c3RfZmlsZXNfaW5fbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc29t
ZS1maWxlJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0
VHJ1ZSgnc29tZS1vdGhlci1maWxlJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisgICAg
ICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYi9jJyBpbiBzZWxmLl9maWxlc2V0Lm5hbWVsaXN0KCkpCisK
KyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnY29u
dGVudHMnLCBzZWxmLl9maWxlc2V0LnJlYWQoJ3NvbWUtZmlsZScpKQorCisgICAgZGVmIHRlc3Rf
b3BlbihzZWxmKToKKyAgICAgICAgZmlsZSA9IHNlbGYuX2ZpbGVzZXQub3Blbignc29tZS1maWxl
JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3NvbWUtZmlsZScsIGZpbGUubmFtZSgpKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnY29udGVudHMnLCBmaWxlLmNvbnRlbnRzKCkpCisK
KyAgICBkZWYgdGVzdF9leHRyYWN0KHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc2V0LmV4dHJh
Y3QoJ3NvbWUtZmlsZScsICcvdGVzdC1kaXJlY3RvcnknKQorICAgICAgICBjb250ZW50cyA9IHNl
bGYuX2ZpbGVzeXN0ZW0ucmVhZF90ZXh0X2ZpbGUoJy90ZXN0LWRpcmVjdG9yeS9zb21lLWZpbGUn
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnY29udGVudHMnLCBjb250ZW50cykKKworICAg
IGRlZiB0ZXN0X2V4dHJhY3RfZGVlcF9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc2V0
LmV4dHJhY3QoJ2IvYycsICcvdGVzdC1kaXJlY3RvcnknKQorICAgICAgICBzZWxmLmFzc2VydFRy
dWUoc2VsZi5fZmlsZXN5c3RlbS5leGlzdHMoJy90ZXN0LWRpcmVjdG9yeS9iL2MnKSkKKworICAg
IGRlZiB0ZXN0X2RlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2Zp
bGVzeXN0ZW0uZXhpc3RzKCcvdGVzdC9zb21lLWZpbGUnKSkKKyAgICAgICAgc2VsZi5fZmlsZXNl
dC5kZWxldGUoJ3NvbWUtZmlsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fZmls
ZXN5c3RlbS5leGlzdHMoJy90ZXN0L3NvbWUtZmlsZScpKQorCisKK2lmIF9fbmFtZV9fID09ICdf
X21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXNldC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL3N5c3RlbS9maWxlc2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVkYzI4MjFjMmJhMjgzYzJl
M2E5NWQ0ZDNkY2NkMGFjYmY1MGM3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXNldC5weQpAQCAtMCwwICsxLDYzIEBACisjIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MKKworZnJvbSB3ZWJraXRweS5j
b21tb24uc3lzdGVtLmZpbGVzeXN0ZW0gaW1wb3J0IEZpbGVTeXN0ZW0KKworCitjbGFzcyBGaWxl
U2V0RmlsZUhhbmRsZShvYmplY3QpOgorICAgICIiIlBvaW50cyB0byBhIGZpbGUgdGhhdCByZXNp
ZGVzIGluIGEgZmlsZSBzZXQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZXNldCwgZmls
ZW5hbWUsIGZpbGVzeXN0ZW09Tm9uZSk6CisgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5h
bWUKKyAgICAgICAgc2VsZi5fZmlsZXNldCA9IGZpbGVzZXQKKyAgICAgICAgc2VsZi5fY29udGVu
dHMgPSBOb25lCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtIG9yIEZpbGVT
eXN0ZW0oKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXM6JXMi
ICUgKHNlbGYuX2ZpbGVzZXQsIHNlbGYuX2ZpbGVuYW1lKQorCisgICAgZGVmIGNvbnRlbnRzKHNl
bGYpOgorICAgICAgICBpZiBzZWxmLl9jb250ZW50cyBpcyBOb25lOgorICAgICAgICAgICAgc2Vs
Zi5fY29udGVudHMgPSBzZWxmLl9maWxlc2V0LnJlYWQoc2VsZi5fZmlsZW5hbWUpCisgICAgICAg
IHJldHVybiBzZWxmLl9jb250ZW50cworCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCwgZmls
ZW5hbWU9Tm9uZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBz
ZWxmLl9maWxlc2V0LmV4dHJhY3Qoc2VsZi5fZmlsZW5hbWUsIHBhdGgpCisgICAgICAgICAgICBy
ZXR1cm4KKyAgICAgICAgd2l0aCBzZWxmLl9maWxlc3lzdGVtLm1rZHRlbXAoKSBhcyB0ZW1wX2Rp
cjoKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVzZXQuZXh0cmFjdChzZWxmLl9maWxlbmFtZSwgdGVt
cF9kaXIpCisKKyAgICAgICAgICAgIHNyYyA9IHNlbGYuX2ZpbGVzeXN0ZW0uam9pbih0ZW1wX2Rp
ciwgc2VsZi5fZmlsZW5hbWUpCisgICAgICAgICAgICBkZXN0ID0gc2VsZi5fZmlsZXN5c3RlbS5q
b2luKHBhdGgsIGZpbGVuYW1lKQorICAgICAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS5jb3B5Zmls
ZShzcmMsIGRlc3QpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxl
c2V0LmRlbGV0ZShzZWxmLl9maWxlbmFtZSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAg
ICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBzcGxpdGV4dChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKCkpCmRpZmYgLS1naXQgYS9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbS5weSBiL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CmluZGV4IGYwYjVlNDRm
Y2FjN2Y2ZjA3M2ZlNjc3NGFlYzFlNjRiMTJiNmM4ZDQuLjg4MzBlYThkYzZjMDUxZGE0YjMyNGVl
ZmZjYTIwNjE3MDcxMjkwZDEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3N5c3RlbS9maWxlc3lzdGVtLnB5CkBAIC05Myw3ICs5Myw3IEBAIGNsYXNzIEZpbGVTeXN0
ZW0ob2JqZWN0KToKICAgICBkZWYgbWF5YmVfbWFrZV9kaXJlY3Rvcnkoc2VsZiwgKnBhdGgpOgog
ICAgICAgICAiIiJDcmVhdGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBh
bHJlYWR5IGV4aXN0LiIiIgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy5tYWtlZGlycyhv
cy5wYXRoLmpvaW4oKnBhdGgpKQorICAgICAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5qb2luKCpw
YXRoKSkKICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CiAgICAgICAgICAgICBpZiBlLmVycm5v
ICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgICByYWlzZQpAQCAtMTUyLDMgKzE1Miw5
IEBAIGNsYXNzIEZpbGVTeXN0ZW0ob2JqZWN0KToKICAgICAgICAgIiIiQ29waWVzIHRoZSBjb250
ZW50cyBvZiB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aCB0byB0aGUgZGVzdGluYXRpb24KICAg
ICAgICAgcGF0aC4iIiIKICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHNvdXJjZSwgZGVzdGluYXRp
b24pCisKKyAgICBkZWYgZmlsZXNfdW5kZXIoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIlJldHVy
biB0aGUgbGlzdCBvZiBhbGwgZmlsZXMgdW5kZXIgdGhlIGdpdmVuIHBhdGguIiIiCisgICAgICAg
IHJldHVybiBbc2VsZi5qb2luKHBhdGhfdG9fZmlsZSwgZmlsZW5hbWUpCisgICAgICAgICAgICBm
b3IgKHBhdGhfdG9fZmlsZSwgXywgZmlsZW5hbWVzKSBpbiBvcy53YWxrKHBhdGgpCisgICAgICAg
ICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzXQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weSBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHkKaW5kZXggZWEwZjNm
OTU3ZmY0OTJmZDJjNzZhZGQzNzVjMGQyZjRhMWNkZTE0MS4uYzYwNWNiMjE4ZDdiZTI2YmJmMzMw
MWU4OGM3ZDg2OTFhZWMyNDhmYyAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5CkBAIC0yOSw2ICsyOSw3IEBACiBp
bXBvcnQgZXJybm8KIGltcG9ydCBvcwogaW1wb3J0IHBhdGgKK2ltcG9ydCByZQogCiAKIGNsYXNz
IE1vY2tGaWxlU3lzdGVtKG9iamVjdCk6CkBAIC01Nyw3ICs1OCw3IEBAIGNsYXNzIE1vY2tGaWxl
U3lzdGVtKG9iamVjdCk6CiAgICAgICAgIHJldHVybiBhbnkoZi5zdGFydHN3aXRoKHBhdGgpIGZv
ciBmIGluIHNlbGYuZmlsZXMpCiAKICAgICBkZWYgam9pbihzZWxmLCAqY29tcHMpOgotICAgICAg
ICByZXR1cm4gJy8nLmpvaW4oY29tcHMpCisgICAgICAgIHJldHVybiByZS5zdWIocmUuZXNjYXBl
KG9zLnBhdGguc2VwKSwgJy8nLCBvcy5wYXRoLmpvaW4oKmNvbXBzKSkKIAogICAgIGRlZiBsaXN0
ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgICBpZiBub3Qgc2VsZi5pc2RpcihwYXRoKToKQEAgLTEw
NywzICsxMDgsMTEgQEAgY2xhc3MgTW9ja0ZpbGVTeXN0ZW0ob2JqZWN0KToKICAgICAgICAgICAg
IHJhaXNlIElPRXJyb3IoZXJybm8uRUlTRElSLCBkZXN0aW5hdGlvbiwgb3Muc3RyZXJyb3IoZXJy
bm8uSVNESVIpKQogCiAgICAgICAgIHNlbGYuZmlsZXNbZGVzdGluYXRpb25dID0gc2VsZi5maWxl
c1tzb3VyY2VdCisKKyAgICBkZWYgZmlsZXNfdW5kZXIoc2VsZiwgcGF0aCk6CisgICAgICAgIGlm
IG5vdCBwYXRoLmVuZHN3aXRoKCcvJyk6CisgICAgICAgICAgICBwYXRoICs9ICcvJworICAgICAg
ICByZXR1cm4gW2ZpbGUgZm9yIGZpbGUgaW4gc2VsZi5maWxlcyBpZiBmaWxlLnN0YXJ0c3dpdGgo
cGF0aCldCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIHBhdGgpOgorICAgICAgICBkZWwgc2VsZi5m
aWxlc1twYXRoXQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lz
dGVtL3ppcGZpbGVzZXQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0v
emlwZmlsZXNldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mYTJiNzYyNzVlNGYwNzY2ODQxZGIwMTM1ODBmNmVh
N2UxNDlkMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vc3lzdGVtL3ppcGZpbGVzZXQucHkKQEAgLTAsMCArMSw2NSBAQAorIyBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisj
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHVybGxpYgoraW1wb3J0IHppcGZpbGUKKworZnJvbSB3
ZWJraXRweS5jb21tb24ubmV0Lm5ldHdvcmt0cmFuc2FjdGlvbiBpbXBvcnQgTmV0d29ya1RyYW5z
YWN0aW9uCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXNldCBpbXBvcnQgRmlsZVNl
dEZpbGVIYW5kbGUKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtIGltcG9y
dCBGaWxlU3lzdGVtCisKKworY2xhc3MgWmlwRmlsZVNldChvYmplY3QpOgorICAgICIiIlRoZSBz
ZXQgb2YgZmlsZXMgaW4gYSB6aXAgZmlsZSB0aGF0IHJlc2lkZXMgYXQgYSBVUkwgKGxvY2FsIG9y
IHJlbW90ZSkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgemlwX3VybCwgZmlsZXN5c3RlbT1O
b25lLCB6aXBfZmFjdG9yeT1Ob25lKToKKyAgICAgICAgc2VsZi5femlwX3VybCA9IHppcF91cmwK
KyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0g
PSBmaWxlc3lzdGVtIG9yIEZpbGVTeXN0ZW0oKQorICAgICAgICBzZWxmLl96aXBfZmFjdG9yeSA9
IHppcF9mYWN0b3J5IG9yIHNlbGYuX3JldHJpZXZlX3ppcF9maWxlCisKKyAgICBkZWYgX3JldHJp
ZXZlX3ppcF9maWxlKHNlbGYsIHppcF91cmwpOgorICAgICAgICB0ZW1wX2ZpbGUgPSBOZXR3b3Jr
VHJhbnNhY3Rpb24oKS5ydW4obGFtYmRhOiB1cmxsaWIudXJscmV0cmlldmUoemlwX3VybClbMF0p
CisgICAgICAgIHJldHVybiB6aXBmaWxlLlppcEZpbGUodGVtcF9maWxlKQorCisgICAgZGVmIF9s
b2FkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl96aXBfZmlsZSBpcyBOb25lOgorICAgICAgICAg
ICAgc2VsZi5femlwX2ZpbGUgPSBzZWxmLl96aXBfZmFjdG9yeShzZWxmLl96aXBfdXJsKQorCisg
ICAgZGVmIG9wZW4oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAgICAg
ICAgcmV0dXJuIEZpbGVTZXRGaWxlSGFuZGxlKHNlbGYsIGZpbGVuYW1lLCBzZWxmLl9maWxlc3lz
dGVtKQorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX3ppcF9maWxlLm5hbWVsaXN0KCkKKworICAgIGRlZiByZWFkKHNl
bGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5fbG9hZCgpCisgICAgICAgIHJldHVybiBzZWxm
Ll96aXBfZmlsZS5yZWFkKGZpbGVuYW1lKQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5h
bWUsIHBhdGgpOgorICAgICAgICBzZWxmLl9sb2FkKCkKKyAgICAgICAgc2VsZi5femlwX2ZpbGUu
ZXh0cmFjdChmaWxlbmFtZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUp
OgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNhbid0IGRlbGV0ZSBmcm9tIGEgWmlwRmlsZVNl
dC4iKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3pp
cGZpbGVzZXRfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0
ZW0vemlwZmlsZXNldF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hOWJhNWFkOGExNzU1YjdiNmIz
ZmIzOTVlNTU2YzU1NmYwY2I1ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vc3lzdGVtL3ppcGZpbGVzZXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw5
NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQg
c2h1dGlsCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHppcGZpbGUK
KworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzeXN0ZW1fbW9jayBpbXBvcnQgTW9j
a0ZpbGVTeXN0ZW0KK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS56aXBmaWxlc2V0IGltcG9y
dCBaaXBGaWxlU2V0CisKKworY2xhc3MgRmFrZVppcChvYmplY3QpOgorICAgIGRlZiBfX2luaXRf
XyhzZWxmLCBmaWxlc3lzdGVtKToKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0
ZW0KKyAgICAgICAgc2VsZi5fZmlsZXMgPSB7fQorCisgICAgZGVmIGFkZF9maWxlKHNlbGYsIGZp
bGVuYW1lLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IGNvbnRl
bnRzCisKKyAgICBkZWYgb3BlbihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBGaWxl
U2V0RmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSwgc2VsZi5fZmlsZXN5c3RlbSkKKworICAgIGRl
ZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzLmtleXMoKQorCisg
ICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXNb
ZmlsZW5hbWVdCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAg
ICAgIHNlbGYuX2ZpbGVzeXN0ZW0ud3JpdGVfdGV4dF9maWxlKHNlbGYuX2ZpbGVzeXN0ZW0uam9p
bihwYXRoLCBmaWxlbmFtZSksIHNlbGYucmVhZChmaWxlbmFtZSkpCisKKyAgICBkZWYgZGVsZXRl
KHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDYW4ndCBkZWxldGUg
ZnJvbSBhIFppcEZpbGVTZXQuIikKKworCitjbGFzcyBaaXBGaWxlU2V0VGVzdCh1bml0dGVzdC5U
ZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc3lzdGVt
ID0gTW9ja0ZpbGVTeXN0ZW0oKQorICAgICAgICBzZWxmLl96aXAgPSBaaXBGaWxlU2V0KCdibGFo
Jywgc2VsZi5fZmlsZXN5c3RlbSwgc2VsZi5tYWtlX2Zha2VfemlwKQorCisgICAgZGVmIG1ha2Vf
ZmFrZV96aXAoc2VsZiwgemlwX3VybCk6CisgICAgICAgIHJlc3VsdCA9IEZha2VaaXAoc2VsZi5f
ZmlsZXN5c3RlbSkKKyAgICAgICAgcmVzdWx0LmFkZF9maWxlKCdzb21lLWZpbGUnLCAnY29udGVu
dHMnKQorICAgICAgICByZXN1bHQuYWRkX2ZpbGUoJ2EvYi9zb21lLW90aGVyLWZpbGUnLCAnb3Ro
ZXIgY29udGVudHMnKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgdGVzdF9vcGVu
KHNlbGYpOgorICAgICAgICBmaWxlID0gc2VsZi5femlwLm9wZW4oJ2EvYi9zb21lLW90aGVyLWZp
bGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYS9iL3NvbWUtb3RoZXItZmlsZScsIGZp
bGUubmFtZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnb3RoZXIgY29udGVudHMnLCBm
aWxlLmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygnY29udGVudHMnLCBzZWxmLl96aXAucmVhZCgnc29tZS1maWxlJykpCisK
KyAgICBkZWYgdGVzdF9leHRyYWN0KHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLm1h
eWJlX21ha2VfZGlyZWN0b3J5KCcvc29tZS1kaXInKQorICAgICAgICBzZWxmLl96aXAuZXh0cmFj
dCgnc29tZS1maWxlJywgJy9zb21lLWRpcicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxm
Ll9maWxlc3lzdGVtLmlzZmlsZSgnL3NvbWUtZGlyL3NvbWUtZmlsZScpKQorCisgICAgZGVmIHRl
c3RfZGVlcF9leHRyYWN0KHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLm1heWJlX21h
a2VfZGlyZWN0b3J5KCcvc29tZS1kaXInKQorICAgICAgICBzZWxmLl96aXAuZXh0cmFjdCgnYS9i
L3NvbWUtb3RoZXItZmlsZScsICcvc29tZS1kaXInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUo
c2VsZi5fZmlsZXN5c3RlbS5pc2ZpbGUoJy9zb21lLWRpci9hL2Ivc29tZS1vdGhlci1maWxlJykp
CisKKyAgICBkZWYgdGVzdF9jYW50X2RlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRS
YWlzZXMoRXhjZXB0aW9uLCBzZWxmLl96aXAuZGVsZXRlLCAnc29tZS1maWxlJykKKworICAgIGRl
ZiB0ZXN0X25hbWVsaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3NvbWUtZmls
ZScgaW4gc2VsZi5femlwLm5hbWVsaXN0KCkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9f
JzoKKyAgICB1bml0dGVzdC5tYWluKCkK
</data>

          </attachment>
      

    </bug>

</bugzilla>