<?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>27119</bug_id>
          
          <creation_ts>2009-07-09 07:54:29 -0700</creation_ts>
          <short_desc>bugzilla-tool: Add create-bug command</short_desc>
          <delta_ts>2009-07-29 04:35:19 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="David Kilzer (:ddkilzer)">ddkilzer</reporter>
          <assigned_to name="David Kilzer (:ddkilzer)">ddkilzer</assigned_to>
          <cc>aroben</cc>
    
    <cc>eric</cc>
    
    <cc>levin</cc>
    
    <cc>mjs</cc>
    
    <cc>mrowe</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>130663</commentid>
    <comment_count>0</comment_count>
      <attachid>32518</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-09 07:54:29 -0700</bug_when>
    <thetext>Created attachment 32518
Patch v1

Reviewed by NOBODY (OOPS!).

Initial pass at a &quot;create-bug&quot; command for bugzilla-tool.  This
version only works with local git commits since that was the
immediate need.

* Scripts/bugzilla-tool: Added CreateBugWithPatch class.
(CreateBugWithPatch.__init__): Added.
(CreateBugWithPatch.execute): Added.
(BugzillaTool.__init__): Added create-bug command.
* Scripts/modules/bugzilla.py:
(Bugzilla.prompt_for_component): Added.
(Bugzilla.create_bug_with_patch): Added.
---
 3 files changed, 101 insertions(+), 1 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>130830</commentid>
    <comment_count>1</comment_count>
      <attachid>32518</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-07-09 21:20:21 -0700</bug_when>
    <thetext>Comment on attachment 32518
Patch v1

I think you should make this work with svn before it goes in as this is the primary tool used by this project.  Adding git support as well is okay, but it should not be the only way to do anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>130843</commentid>
    <comment_count>2</comment_count>
      <attachid>32518</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-09 23:25:20 -0700</bug_when>
    <thetext>Comment on attachment 32518
Patch v1

I think it&apos;s entirely reasonable that the first run of create-bug works only with git. :)  Since at least 2 of the 3 known users of bugzilla-tool are git users. :)

maybe this would be &quot;bug-from-commits&quot; and &quot;bug-from-diff&quot; is the one svn users would use.  It&apos;s possible we could wrap them both into a single command, although currently post-diff and post-commits are separate because git users (at least myself) use both at different times.  post-diff is the only one which svn users use equivalently bug-from-diff would be for svn users so they don&apos;t have to create a patch file.

I really like the --cc option.  &quot;gcl upload&quot; (google&apos;s equivalent command) has a -r option to do that which is similarly awesome!

It seems we should name the option &quot;COMMIT&quot; instead of COMMITISH if only one commit is supported?

I thikn this should be in its own function:
480         commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in commit_message.splitlines()]
 481 
 482         bug_title = commit_lines[0]
 483         comment_text = &quot;\n&quot;.join(commit_lines[1:])
 484         comment_text += &quot;\n---\n&quot;
 485         comment_text += tool.scm().files_changed_summary_for_commit(commit_id)

(title, description) = title_and_description_for_bug(commit_text)
 maybe?

It seems this belongs in a local: (since you type it out twice)
self.browser.find_control(&apos;component&apos;).items

Aren&apos;t bug descriptions required by bugzilla?

I would probably break the create_bug function up into smaller pieces still.  I tend to be alergic to functions longer than about 30 lines. ;)

In general this looks great though!

So I&apos;m not going to reverse Sam&apos;s review, but I don&apos;t think SVN support needs to be required in the first patch.  Certainly SVN support should follow, but bugzilla-tool hasn&apos;t even been announced on webkit-dev yet, so I don&apos;t really view it as a critical project infrastructure requiring of SVN support.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131021</commentid>
    <comment_count>3</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-10 17:10:22 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 32518 [details])

&gt; maybe this would be &quot;bug-from-commits&quot; and &quot;bug-from-diff&quot; is the one svn users
&gt; would use.  It&apos;s possible we could wrap them both into a single command,
&gt; although currently post-diff and post-commits are separate because git users
&gt; (at least myself) use both at different times.  post-diff is the only one which
&gt; svn users use equivalently bug-from-diff would be for svn users so they don&apos;t
&gt; have to create a patch file.

Yes, I should have named the command CreateBugWithCommit() instead of CreateBugWithPatch().  It would be nice if the create-bug command would work with both SCMs without having to create different commands for each.

&gt; It seems we should name the option &quot;COMMIT&quot; instead of COMMITISH if only one
&gt; commit is supported?

I wanted it to support multiple commits eventually, just not in the first pass.  I will change this for the first version and update it later.

&gt; I thikn this should be in its own function:
&gt; 480         commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in
&gt; commit_message.splitlines()]
&gt;  481 
&gt;  482         bug_title = commit_lines[0]
&gt;  483         comment_text = &quot;\n&quot;.join(commit_lines[1:])
&gt;  484         comment_text += &quot;\n---\n&quot;
&gt;  485         comment_text +=
&gt; tool.scm().files_changed_summary_for_commit(commit_id)
&gt; 
&gt; (title, description) = title_and_description_for_bug(commit_text)
&gt;  maybe?

I created a CommitMessage class that does this for you.  Haven&apos;t uploaded it quite yet.

&gt; It seems this belongs in a local: (since you type it out twice)
&gt; self.browser.find_control(&apos;component&apos;).items

Okay.

&gt; Aren&apos;t bug descriptions required by bugzilla?

Please re-read the list of create_bug_with_patch() arguments.  Perhaps I should be using named parameters to make it clearer?  Or creating a dictionary and passing that in.  Yes, a bug[] dictionary would be nicer.

&gt; I would probably break the create_bug function up into smaller pieces still.  I
&gt; tend to be alergic to functions longer than about 30 lines. ;)

Yes, I could probably break out the error handling stuff into a separate method.

&gt; In general this looks great though!

Thanks!

Note that I probably won&apos;t have time to work on this again until Tuesday.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131044</commentid>
    <comment_count>4</comment_count>
      <attachid>32600</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-10 18:39:23 -0700</bug_when>
    <thetext>Created attachment 32600
Patch v2: More WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131046</commentid>
    <comment_count>5</comment_count>
      <attachid>32600</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-10 18:41:39 -0700</bug_when>
    <thetext>Comment on attachment 32600
Patch v2: More WIP

Refactored a bit to address most issues in Comment #2 except the create_bug_with_patch() method signature.

Just have to add svn CreateBug.support to createBugFromPatch() now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131063</commentid>
    <comment_count>6</comment_count>
      <attachid>32609</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-10 22:04:33 -0700</bug_when>
    <thetext>Created attachment 32609
Patch v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131064</commentid>
    <comment_count>7</comment_count>
      <attachid>32609</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-10 22:05:43 -0700</bug_when>
    <thetext>Comment on attachment 32609
Patch v3

This implements create-bug for both svn and git.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131065</commentid>
    <comment_count>8</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-10 22:07:17 -0700</bug_when>
    <thetext>Bug 27173 was created with Patch v3 from an svn working directory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131070</commentid>
    <comment_count>9</comment_count>
      <attachid>32609</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-10 22:39:11 -0700</bug_when>
    <thetext>Comment on attachment 32609
Patch v3

 489         bug_id = tool.bugs.create_bug_with_patch(bug_title, comment_text, options.component, diff_file, &quot;Patch v1&quot;, cc=options.cc, mark_for_review=options.review)

Is &quot;Patch v1&quot; intended there?

You don&apos;t have to forward declare in python AFAIK:
bug_title = &quot;&quot;
 476         comment_text = &quot;&quot;

It seems this wants to be its own function:
80             commit_message = tool.scm().commit_message_for_commit(commit_id)
 481             commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in commit_message.splitlines()]
 482             bug_title = commit_lines[0]
 483             comment_text = &quot;\n&quot;.join(commit_lines[1:]) + &quot;\n&quot;
 484             comment_text += &quot;---\n&quot;
 485             comment_text += tool.scm().files_changed_summary_for_commit(commit_id)


There seems to be come copy/paste from the previous section:
 503             commit_message = commit_message_for_this_commit(tool.scm())
 504             commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in commit_message.splitlines()]
 505             bug_title = commit_lines[0]
 506             comment_text = &quot;\n&quot;.join(commit_lines[1:]) + &quot;\n&quot;

AGain, no need for forward-declare:
498         bug_title = &quot;&quot;
 499         comment_text = &quot;&quot;

We shoudl just fix all these functions to detect a string and turn it into a file for Mechanize:
         diff = tool.scm().create_patch()
 509         diff_file = StringIO.StringIO(diff) # create_bug_with_patch expects a file-like object
 510         bug_id = tool.bugs.create_bug_with_patch(bug_title, comment_text, options.component, diff_file, &quot;Patch v1&quot;, cc=options.cc, mark_for_review=options.review)

You can invert the order of the clauses with:
if len(args) == 0
and use
if len(args) instead.  Doesn&apos;t really matter.

r- for the copy/paste code.  Otherwise this seems fine in general.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131079</commentid>
    <comment_count>10</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-10 23:04:10 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 32609 [details])
&gt;  bug_id = tool.bugs.create_bug_with_patch(bug_title, comment_text, options.component, diff_file, &quot;Patch v1&quot;, cc=options.cc, mark_for_review=options.review)
&gt; 
&gt; Is &quot;Patch v1&quot; intended there?

Absolutely.  It&apos;s a sane default for the first patch in the bug.  I want to do more in this area, specifically:

- Make bzt smart enough to increment &quot;Patch vN&quot; to &quot;Patch vN+1&quot; when new patches are attached.
- Give the user the ability to write their own patch description via command line for create-bug and post-commit and post-diff.  (And custom patch comments.)

But I wanted to get create-bug landed first.

&gt; You don&apos;t have to forward declare in python AFAIK:
&gt; bug_title = &quot;&quot;
&gt; comment_text = &quot;&quot;

Umm, yes, but these variables will be out of scope if I don&apos;t declare them outside the if/else statement, right?

&gt; It seems this wants to be its own function:
&gt;  480             commit_message = tool.scm().commit_message_for_commit(commit_id)
&gt;  481             commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in
&gt; commit_message.splitlines()]
&gt;  482             bug_title = commit_lines[0]
&gt;  483             comment_text = &quot;\n&quot;.join(commit_lines[1:]) + &quot;\n&quot;
&gt;  484             comment_text += &quot;---\n&quot;
&gt;  485             comment_text +=
&gt; tool.scm().files_changed_summary_for_commit(commit_id)

That code wants to be rewritten after Bug 27172 lands.  It&apos;s waiting for a review.

&gt; There seems to be come copy/paste from the previous section:
&gt;  503             commit_message = commit_message_for_this_commit(tool.scm())
&gt;  504             commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in
&gt; commit_message.splitlines()]
&gt;  505             bug_title = commit_lines[0]
&gt;  506             comment_text = &quot;\n&quot;.join(commit_lines[1:]) + &quot;\n&quot;

Yep.  I did that in the name of getting create-bug into the hands of the people.  I was going to clean this up with 27172 or this bug, which ever landed last.

&gt; AGain, no need for forward-declare:
&gt;  498         bug_title = &quot;&quot;
&gt;  499         comment_text = &quot;&quot;

Can you explain how variable scoping works in Python?

&gt; We shoudl just fix all these functions to detect a string and turn it into a
&gt; file for Mechanize:
&gt;  508         diff = tool.scm().create_patch()
&gt;  509         diff_file = StringIO.StringIO(diff) # create_bug_with_patch
&gt; expects a file-like object
&gt;  510         bug_id = tool.bugs.create_bug_with_patch(bug_title, comment_text,
&gt; options.component, diff_file, &quot;Patch v1&quot;, cc=options.cc,
&gt; mark_for_review=options.review)

How does one &quot;detect a string&quot; in Python?

&gt; You can invert the order of the clauses with:
&gt; if len(args) == 0
&gt; and use
&gt; if len(args) instead.  Doesn&apos;t really matter.

Okay.

&gt; r- for the copy/paste code.  Otherwise this seems fine in general.

Further refinements will have to wait until Tuesday.  I&apos;d appreciate answers to my questions in the meantime.  Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131093</commentid>
    <comment_count>11</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-10 23:28:57 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; (From update of attachment 32609 [details] [details])
&gt; That code wants to be rewritten after Bug 27172 lands.  It&apos;s waiting for a
&gt; review.

Done.  Feel free to email me directly if I miss your reviews in the queue for some reason.  The queue is a bit large to be able to see much in atm. ;)

&gt; Can you explain how variable scoping works in Python?

No, and I probably am remembering it wrong. :(  Your sense that they should be &quot;out of scope&quot; makes sense.

&gt; How does one &quot;detect a string&quot; in Python?

I think there are typeof and isinstance operators.  I&apos;m pretty sure I detect a dict at one point in the code.

Hum... just found http://www.canonical.org/~kragen/isinstance/

&gt; Further refinements will have to wait until Tuesday.  I&apos;d appreciate answers to
&gt; my questions in the meantime.  Thanks!

Thanks again!  Hopefully I&apos;ve answered them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131094</commentid>
    <comment_count>12</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-10 23:29:28 -0700</bug_when>
    <thetext>Dave Levin has much more python-fu than I do, btw.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131097</commentid>
    <comment_count>13</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-07-10 23:39:21 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; &gt; Can you explain how variable scoping works in Python?
&gt; 
&gt; No, and I probably am remembering it wrong. :(  Your sense that they should be
&gt; &quot;out of scope&quot; makes sense.

Python is a little bit like JavaScript in that functions introduce a new scope, but the contents of &quot;if&quot;, &quot;while&quot; and friends don&apos;t.  The only gotcha is that, unlike JavaScript, the variable name is not actually bound until the assignment statement executes.  If you access the variable before the assignment executes you&apos;ll be greeted with a name error.  This is especially important to keep in mind if only one side of an if/else assigns to a variable.

&gt; &gt; How does one &quot;detect a string&quot; in Python?
&gt; 
&gt; I think there are typeof and isinstance operators.  I&apos;m pretty sure I detect a
&gt; dict at one point in the code.

One typically doesn&apos;t do type detection in Python.  What are we trying to do here?  Avoid callers needing to wrap a string up in a StringIO object before passing to a function that takes a file-like object?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131099</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-10 23:45:03 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #11)

Thank you for the scoping help.

&gt; One typically doesn&apos;t do type detection in Python.  What are we trying to do
&gt; here?  Avoid callers needing to wrap a string up in a StringIO object before
&gt; passing to a function that takes a file-like object?

Yes.  Mechanize (or really ClientForm) requires a &quot;file like object&quot; (one with a .read()) be passed to to file upload controls.  We often end up with strings and thus wrap them with StringIO.  When there was just one callsite where I had to wrap first with StringIO it made sense to do it outside of the &quot;post attachment&quot; function.  Now there are a bunch of callsites and it seems that the Bugzilla class should handle either strings or file-like objects and be able to convert strings using StringIO when necessary.  (ideally ClientForm would do this for us, but alas it does not).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135439</commentid>
    <comment_count>15</comment_count>
      <attachid>33683</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-28 17:41:30 -0700</bug_when>
    <thetext>Created attachment 33683
Patch v4</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135441</commentid>
    <comment_count>16</comment_count>
      <attachid>33683</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-28 17:44:50 -0700</bug_when>
    <thetext>Comment on attachment 33683
Patch v4

(In reply to comment #9)
&gt; (From update of attachment 32609 [details])
&gt;  489         bug_id = tool.bugs.create_bug_with_patch(bug_title, comment_text,
&gt; options.component, diff_file, &quot;Patch v1&quot;, cc=options.cc,
&gt; mark_for_review=options.review)
&gt; 
&gt; Is &quot;Patch v1&quot; intended there?

Yes.  It&apos;s a sensible default until a switch is added later to provide a patch description.

&gt; You don&apos;t have to forward declare in python AFAIK:
&gt; bug_title = &quot;&quot;
&gt;  476         comment_text = &quot;&quot;

Due to scoping rules in Python, this was required.

&gt; It seems this wants to be its own function:
&gt; 80             commit_message = tool.scm().commit_message_for_commit(commit_id)
&gt;  481             commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in
&gt; commit_message.splitlines()]
&gt;  482             bug_title = commit_lines[0]
&gt;  483             comment_text = &quot;\n&quot;.join(commit_lines[1:]) + &quot;\n&quot;
&gt;  484             comment_text += &quot;---\n&quot;
&gt;  485             comment_text +=
&gt; tool.scm().files_changed_summary_for_commit(commit_id)
&gt; 
&gt; There seems to be come copy/paste from the previous section:
&gt;  503             commit_message = commit_message_for_this_commit(tool.scm())
&gt;  504             commit_lines = [re.sub(&apos;^ {0,8}&apos;, &apos;&apos;, line, 1) for line in
&gt; commit_message.splitlines()]
&gt;  505             bug_title = commit_lines[0]
&gt;  506             comment_text = &quot;\n&quot;.join(commit_lines[1:]) + &quot;\n&quot;

These were updated to use CommitMessage methods from Bug 27172.

&gt; AGain, no need for forward-declare:
&gt; 498         bug_title = &quot;&quot;
&gt;  499         comment_text = &quot;&quot;

They are needed.

&gt; We shoudl just fix all these functions to detect a string and turn it into a
&gt; file for Mechanize:
&gt;          diff = tool.scm().create_patch()
&gt;  509         diff_file = StringIO.StringIO(diff) # create_bug_with_patch
&gt; expects a file-like object
&gt;  510         bug_id = tool.bugs.create_bug_with_patch(bug_title, comment_text,
&gt; options.component, diff_file, &quot;Patch v1&quot;, cc=options.cc,
&gt; mark_for_review=options.review)

Not done per Comment #11 and Comment #13.

&gt; You can invert the order of the clauses with:
&gt; if len(args) == 0
&gt; and use
&gt; if len(args) instead.  Doesn&apos;t really matter.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135444</commentid>
    <comment_count>17</comment_count>
      <attachid>33683</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-28 17:54:36 -0700</bug_when>
    <thetext>Comment on attachment 33683
Patch v4

&gt; +            make_option(&quot;--no-prompt&quot;, action=&quot;store_true&quot;, dest=&quot;prompt&quot;, default=True, help=&quot;Do not prompt for bug title and comment; use commit log instead.&quot;),

This should be:  action=&quot;store_false&quot;

&gt; +            commit_message = tool.scm().commit_message_for_commit(commit_id)

This should be:  commit_message_for_local_commit(commit_id)

I will fix these when landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135463</commentid>
    <comment_count>18</comment_count>
      <attachid>33683</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-28 19:22:15 -0700</bug_when>
    <thetext>Comment on attachment 33683
Patch v4

Biggest concern:

I don&apos;t understand the bootstrapping aspect to this. In order to create a well formed patch, I need a changelog with a bug link/title.  This tool creates a bug for a patch, but by definition, the patch must not be well formed because the bug doesn&apos;t exist yet.

It could modify the ChangeLog right after creating the bug (but that sounds complicated especially considering that you can given it a COMMITISH....)

On to the details.


&gt; diff --git a/WebKitTools/Scripts/bugzilla-tool b/WebKitTools/Scripts/bugzilla-tool
&gt; +class CreateBug(Command):
&gt; +    def __init__(self):
&gt; +        Command.__init__(self, &apos;Create a bug from local changes or local commits&apos;, &apos;[COMMITISH]&apos;, options=options)

Nice to add period to this sentence.

&gt; +
&gt; +    def create_bug_from_commit(self, options, args, tool):
&gt; +        commit_ids = tool.scm().commit_ids_from_range_arguments(args, cherry_pick=True)

This won&apos;t be very friendly to svn users if they happen to given an extra argument.  Maybe it should check that it is git and if not, error out with a friendly message.


&gt; diff --git a/WebKitTools/Scripts/modules/bugzilla.py b/WebKitTools/Scripts/modules/bugzilla.py
&gt; +    def check_create_bug_response_returning_bug_id_on_success(self, response_html):

If you don&apos;t expect external callers, then prefix it with a _

It is quite long. What about _get_create_bug_id(self, create_bug_response):
or something else (even) shorter?

&gt; +    def create_bug_with_patch(self, bug_title, bug_description, component, patch_file_object, patch_description, cc, mark_for_review=False):
...
&gt; +        if not component or component not in [item.name for item in component_items]:
&gt; +            component = self.prompt_for_component([item.name for item in component_items])

This is fine.  I like this better:

        component_names = map(lambda item: item.name, component_items)
        if not component or component not in component_names:
            component = self.prompt_for_component(component_names)

You choose.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135481</commentid>
    <comment_count>19</comment_count>
      <attachid>33691</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-28 21:47:48 -0700</bug_when>
    <thetext>Created attachment 33691
Patch v5</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135487</commentid>
    <comment_count>20</comment_count>
      <attachid>33691</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-28 21:57:53 -0700</bug_when>
    <thetext>Comment on attachment 33691
Patch v5

(In reply to comment #18)
&gt; (From update of attachment 33683 [details])
&gt; Biggest concern:
&gt; 
&gt; I don&apos;t understand the bootstrapping aspect to this. In order to create a well
&gt; formed patch, I need a changelog with a bug link/title.  This tool creates a
&gt; bug for a patch, but by definition, the patch must not be well formed because
&gt; the bug doesn&apos;t exist yet.
&gt; 
&gt; It could modify the ChangeLog right after creating the bug (but that sounds
&gt; complicated especially considering that you can given it a COMMITISH....)

I honestly don&apos;t understand what you&apos;re asking here.  This is the workflow I envision for git and svn:

Git
1. Modify code.
2. Run prepare-ChangeLog
3. Edit ChangeLogs.
4. Commit the patch.
5. Run bugzilla-tool create-bug.

Svn (or local changes to Git, if you roll that way)
1. Modify code.
2. Run prepare-ChangeLog
3. Edit ChangeLogs.
4. Run bugzilla-tool create-bug.

Either way you have to go back and add the bug number to the ChangeLog files currently.  This addresses the initial need for a way to create a Bugzilla bug for a patch, which Maciej and others have been asking for on webkit-dev.

After this create-bug patch lands, I plan to make it possible to substitute the bug number in the ChangeLog entry before you commit--similar to how the reviewer is added now.  I just didn&apos;t want to do it all at once and create a huge patch.

&gt; &gt; +        Command.__init__(self, &apos;Create a bug from local changes or local commits&apos;, &apos;[COMMITISH]&apos;, options=options)
&gt; 
&gt; Nice to add period to this sentence.

Done.

&gt; &gt; +    def create_bug_from_commit(self, options, args, tool):
&gt; &gt; +        commit_ids = tool.scm().commit_ids_from_range_arguments(args, cherry_pick=True)
&gt; 
&gt; This won&apos;t be very friendly to svn users if they happen to given an extra
&gt; argument.  Maybe it should check that it is git and if not, error out with a
&gt; friendly message.

Fixed before create_bug_from_commit() is called.

&gt; &gt; +    def check_create_bug_response_returning_bug_id_on_success(self, response_html):
&gt; 
&gt; If you don&apos;t expect external callers, then prefix it with a _
&gt; 
&gt; It is quite long. What about _get_create_bug_id(self, create_bug_response):
&gt; or something else (even) shorter?

I was trying to use a descriptive method name here, but I guess I got carried away.  Added &quot;_&quot; prefix and removed &quot;_returning_bug_id_on_success&quot; suffix.

&gt; &gt; +    def create_bug_with_patch(self, bug_title, bug_description, component, patch_file_object, patch_description, cc, mark_for_review=False):
&gt; ...
&gt; &gt; +        if not component or component not in [item.name for item in component_items]:
&gt; &gt; +            component = self.prompt_for_component([item.name for item in component_items])
&gt; 
&gt; This is fine.  I like this better:
&gt; 
&gt;         component_names = map(lambda item: item.name, component_items)
&gt;         if not component or component not in component_names:
&gt;             component = self.prompt_for_component(component_names)
&gt; 
&gt; You choose.

I chose your way.  I&apos;m new to python, so I haven&apos;t used this map/lambda construct.  Very concise, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135491</commentid>
    <comment_count>21</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-28 22:12:31 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 33683 [details])
&gt; Biggest concern:
&gt; 
&gt; I don&apos;t understand the bootstrapping aspect to this. In order to create a well
&gt; formed patch, I need a changelog with a bug link/title.  This tool creates a
&gt; bug for a patch, but by definition, the patch must not be well formed because
&gt; the bug doesn&apos;t exist yet.

I see what you&apos;re asking.  Creating a bug for the sole purpose of reviewing a patch is a common practice when you&apos;re doing clean-up work or merging changes from a port back to the main repository.  You don&apos;t really need to create the bug until you&apos;re done with the patch, which this command provides.  It&apos;s a fairly common workflow that the Safari team uses.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135496</commentid>
    <comment_count>22</comment_count>
      <attachid>33691</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-28 22:40:28 -0700</bug_when>
    <thetext>Comment on attachment 33691
Patch v5


&gt; diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
&gt; +2009-07-28  David Kilzer  &lt;ddkilzer@apple.com&gt;
&gt; +
&gt; +        &lt;http://webkit.org/b/27119&gt; bugzilla-tool: Add create-bug command
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Implement &quot;create-bug&quot; command for bugzilla-tool.

oooo new format :)


&gt; diff --git a/WebKitTools/Scripts/modules/bugzilla.py b/WebKitTools/Scripts/modules/bugzilla.py

&gt; +        if match:
&gt; +            text_lines = BeautifulSoup(match.group(&apos;error_message&apos;)).findAll(text=True)
&gt; +            error_message = &quot;\n&quot; + &apos;\n&apos;.join([&quot;  &quot; + line.strip() for line in text_lines if line.strip()])

fwiw, this statment is at the edge of the complexity boundary.  It is hard to define but when you start seeing &quot;for in if&quot; + other stuff, you&apos;re close.

I&apos;d leave it as is though.  Just something to keep in mind in your future python writing sessions :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135563</commentid>
    <comment_count>23</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-07-29 04:35:19 -0700</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebKitTools/ChangeLog
	M	WebKitTools/Scripts/bugzilla-tool
	M	WebKitTools/Scripts/modules/bugzilla.py
Committed r46538
	M	WebKitTools/ChangeLog
	M	WebKitTools/Scripts/modules/bugzilla.py
	M	WebKitTools/Scripts/bugzilla-tool
r46538 = 9c9cf704d95dadecc84ee834a62d67bf78f81e1c (trunk)
No changes between current HEAD and refs/remotes/trunk
Resetting to the latest refs/remotes/trunk
http://trac.webkit.org/changeset/46538</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>32518</attachid>
            <date>2009-07-09 07:54:29 -0700</date>
            <delta_ts>2009-07-10 18:39:20 -0700</delta_ts>
            <desc>Patch v1</desc>
            <filename>20090709075428.patch</filename>
            <type>text/plain</type>
            <size>7189</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBiMGZiZjU4Li4yZDhlMTIwIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMDktMDct
MDkgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KKworICAgICAgICBidWd6aWxs
YS10b29sOiBBZGQgY3JlYXRlLWJ1ZyBjb21tYW5kCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCBwYXNzIGF0IGEgImNyZWF0ZS1idWciIGNv
bW1hbmQgZm9yIGJ1Z3ppbGxhLXRvb2wuICBUaGlzCisgICAgICAgIHZlcnNpb24gb25seSB3b3Jr
cyB3aXRoIGxvY2FsIGdpdCBjb21taXRzIHNpbmNlIHRoYXQgd2FzIHRoZQorICAgICAgICBpbW1l
ZGlhdGUgbmVlZC4KKworICAgICAgICAqIFNjcmlwdHMvYnVnemlsbGEtdG9vbDogQWRkZWQgQ3Jl
YXRlQnVnV2l0aFBhdGNoIGNsYXNzLgorICAgICAgICAoQ3JlYXRlQnVnV2l0aFBhdGNoLl9faW5p
dF9fKTogQWRkZWQuCisgICAgICAgIChDcmVhdGVCdWdXaXRoUGF0Y2guZXhlY3V0ZSk6IEFkZGVk
LgorICAgICAgICAoQnVnemlsbGFUb29sLl9faW5pdF9fKTogQWRkZWQgY3JlYXRlLWJ1ZyBjb21t
YW5kLgorICAgICAgICAqIFNjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weToKKyAgICAgICAgKEJ1
Z3ppbGxhLnByb21wdF9mb3JfY29tcG9uZW50KTogQWRkZWQuCisgICAgICAgIChCdWd6aWxsYS5j
cmVhdGVfYnVnX3dpdGhfcGF0Y2gpOiBBZGRlZC4KKwogMjAwOS0wNy0wOCAgRGF2aWQgS2lsemVy
ICA8ZGRraWx6ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIEJ1ZyAyNzA2MjogYnVnemlsbGEtdG9v
bDogcG9zdC1jb21taXRzIHNob3VsZCByZWFkIGJ1ZyBpZCBmcm9tIGNvbW1pdCBsb2cgYW5kIGFj
dHVhbGx5IHdvcmsKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVnemlsbGEtdG9v
bCBiL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVnemlsbGEtdG9vbAppbmRleCAyYjkwNzgwLi4wMDE1
ODljIDEwMDc1NQotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wKKysrIGIv
V2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29sCkBAIC00NTUsNiArNDU1LDQwIEBAIGNs
YXNzIFBvc3RDb21taXRzQXNQYXRjaGVzVG9CdWcoQ29tbWFuZCk6CiAgICAgICAgICAgICB0b29s
LmJ1Z3MuYWRkX3BhdGNoX3RvX2J1ZyhidWdfaWQsIGRpZmZfZmlsZSwgZGVzY3JpcHRpb24sIGNv
bW1lbnRfdGV4dCwgbWFya19mb3JfcmV2aWV3PW9wdGlvbnMucmV2aWV3KQogCiAKK2NsYXNzIENy
ZWF0ZUJ1Z1dpdGhQYXRjaChDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAg
ICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1jYyIsIGFjdGlvbj0i
c3RvcmUiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJjYyIsIGhlbHA9IkNvbW1hLXNlcGFyYXRlZCBs
aXN0IG9mIGVtYWlsIGFkZHJlc3NlcyB0byBjYXJib24tY29weS4iKSwKKyAgICAgICAgICAgIG1h
a2Vfb3B0aW9uKCItLWNvbXBvbmVudCIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHJpbmciLCBk
ZXN0PSJjb21wb25lbnQiLCBoZWxwPSJDb21wb25lbnQgZm9yIHRoZSBuZXcgYnVnLiIpLAorICAg
ICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tcmV2aWV3IiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIs
IGRlc3Q9InJldmlldyIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iRG8gbm90IG1hcmsgdGhlIHBhdGNo
IGZvciByZXZpZXcuIiksCisgICAgICAgIF0KKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxm
LCAnQ3JlYXRlIGEgYnVnIGZyb20gbG9jYWwgY29tbWl0KHMpJywgJ0NPTU1JVElTSCcsIG9wdGlv
bnM9b3B0aW9ucykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wp
OgorICAgICAgICAjIEZJWE1FOiBTdXBwb3J0IHBhdGNoIGZpbGVzCisgICAgICAgIGlmIG5vdCB0
b29sLnNjbSgpLnN1cHBvcnRzX2xvY2FsX2NvbW1pdHMoKToKKyAgICAgICAgICAgIGVycm9yKHRv
b2wuc2NtKCkuZGlzcGxheV9uYW1lKCkgKyAiIGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgY29tbWl0
cy4iKQorCisgICAgICAgIGNvbW1pdF9pZHMgPSB0b29sLnNjbSgpLmNvbW1pdF9pZHNfZnJvbV9y
YW5nZV9hcmd1bWVudHMoYXJncywgY2hlcnJ5X3BpY2s9VHJ1ZSkKKworICAgICAgICBpZiBsZW4o
Y29tbWl0X2lkcykgPiAxOgorICAgICAgICAgICAgZXJyb3IoIkNyZWF0aW5nIGEgYnVnIHdpdGgg
bXVsdGlwbGUgcGF0Y2hlcyBpcyBub3Qgc3VwcG9ydGVkLiIpCisKKyAgICAgICAgY29tbWl0X2lk
ID0gY29tbWl0X2lkc1swXQorCisgICAgICAgIGNvbW1pdF9tZXNzYWdlID0gdG9vbC5zY20oKS5j
b21taXRfbWVzc2FnZV9mb3JfY29tbWl0KGNvbW1pdF9pZCkKKyAgICAgICAgY29tbWl0X2xpbmVz
ID0gW3JlLnN1YignXiB7MCw4fScsICcnLCBsaW5lLCAxKSBmb3IgbGluZSBpbiBjb21taXRfbWVz
c2FnZS5zcGxpdGxpbmVzKCldCisKKyAgICAgICAgYnVnX3RpdGxlID0gY29tbWl0X2xpbmVzWzBd
CisgICAgICAgIGNvbW1lbnRfdGV4dCA9ICJcbiIuam9pbihjb21taXRfbGluZXNbMTpdKQorICAg
ICAgICBjb21tZW50X3RleHQgKz0gIlxuLS0tXG4iCisgICAgICAgIGNvbW1lbnRfdGV4dCArPSB0
b29sLnNjbSgpLmZpbGVzX2NoYW5nZWRfc3VtbWFyeV9mb3JfY29tbWl0KGNvbW1pdF9pZCkKKwor
ICAgICAgICBkaWZmID0gdG9vbC5zY20oKS5jcmVhdGVfcGF0Y2hfZnJvbV9sb2NhbF9jb21taXQo
Y29tbWl0X2lkKQorICAgICAgICBkaWZmX2ZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTyhkaWZmKSAj
IGNyZWF0ZV9idWdfd2l0aF9wYXRjaCBleHBlY3RzIGEgZmlsZS1saWtlIG9iamVjdAorICAgICAg
ICB0b29sLmJ1Z3MuY3JlYXRlX2J1Z193aXRoX3BhdGNoKGJ1Z190aXRsZSwgY29tbWVudF90ZXh0
LCBvcHRpb25zLmNvbXBvbmVudCwgZGlmZl9maWxlLCAiUGF0Y2ggdjEiLCBjYz1vcHRpb25zLmNj
LCBtYXJrX2Zvcl9yZXZpZXc9b3B0aW9ucy5yZXZpZXcpCisKKwogY2xhc3MgTm9uV3JhcHBpbmdF
cGlsb2dJbmRlbnRlZEhlbHBGb3JtYXR0ZXIoSW5kZW50ZWRIZWxwRm9ybWF0dGVyKToKICAgICBk
ZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIEluZGVudGVkSGVscEZvcm1hdHRlci5fX2luaXRf
XyhzZWxmKQpAQCAtNDgwLDYgKzUxNCw3IEBAIGNsYXNzIEJ1Z3ppbGxhVG9vbDoKICAgICAgICAg
ICAgIHsgJ25hbWUnIDogJ2J1Z3MtdG8tY29tbWl0JywgJ29iamVjdCcgOiBCdWdzSW5Db21taXRR
dWV1ZSgpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICdwYXRjaGVzLXRvLWNvbW1pdCcsICdv
YmplY3QnIDogUGF0Y2hlc0luQ29tbWl0UXVldWUoKSB9LAogICAgICAgICAgICAgeyAnbmFtZScg
OiAncmV2aWV3ZWQtcGF0Y2hlcycsICdvYmplY3QnIDogUmV2aWV3ZWRQYXRjaGVzT25CdWcoKSB9
LAorICAgICAgICAgICAgeyAnbmFtZScgOiAnY3JlYXRlLWJ1ZycsICdvYmplY3QnIDogQ3JlYXRl
QnVnV2l0aFBhdGNoKCkgfSwKICAgICAgICAgICAgIHsgJ25hbWUnIDogJ2FwcGx5LXBhdGNoZXMn
LCAnb2JqZWN0JyA6IEFwcGx5UGF0Y2hlc0Zyb21CdWcoKSB9LAogICAgICAgICAgICAgeyAnbmFt
ZScgOiAnbGFuZC1kaWZmJywgJ29iamVjdCcgOiBMYW5kQW5kVXBkYXRlQnVnKCkgfSwKICAgICAg
ICAgICAgIHsgJ25hbWUnIDogJ2xhbmQtcGF0Y2hlcycsICdvYmplY3QnIDogTGFuZFBhdGNoZXNG
cm9tQnVncygpIH0sCkBAIC00OTEsNyArNTI2LDcgQEAgY2xhc3MgQnVnemlsbGFUb29sOgogICAg
ICAgICAKICAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9uX3BhcnNlciA9IEhlbHBQcmludGluZ09w
dGlvblBhcnNlcih1c2FnZT1zZWxmLnVzYWdlX2xpbmUoKSwgZm9ybWF0dGVyPU5vbldyYXBwaW5n
RXBpbG9nSW5kZW50ZWRIZWxwRm9ybWF0dGVyKCksIGVwaWxvZz1zZWxmLmNvbW1hbmRzX3VzYWdl
KCkpCiAgICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIuYWRkX29wdGlvbigiLS1kcnkt
cnVuIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZHJ5cnVuIiwgaGVscD0iZG8gbm90IHRv
dWNoIHJlbW90ZSBzZXJ2ZXJzIiwgZGVmYXVsdD1GYWxzZSkKLSAgICAKKwogICAgIGRlZiBzY20o
c2VsZik6CiAgICAgICAgICMgTGF6aWx5IGluaXRpYWxpemUgU0NNIHRvIG5vdCBlcnJvci1vdXQg
YmVmb3JlIGNvbW1hbmQgbGluZSBwYXJzaW5nIChvciB3aGVuIHJ1bm5pbmcgbm9uLXNjbSBjb21t
YW5kcykuCiAgICAgICAgIG9yaWdpbmFsX2N3ZCA9IG9zLnBhdGguYWJzcGF0aCgnLicpCmRpZmYg
LS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkgYi9XZWJLaXRU
b29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKaW5kZXggN2JmODNkZS4uZTQxYjliMiAx
MDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5CisrKyBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weQpAQCAtMjU3LDYgKzI1Nyw1
MyBAQCBjbGFzcyBCdWd6aWxsYToKICAgICAgICAgc2VsZi5icm93c2VyLmFkZF9maWxlKHBhdGNo
X2ZpbGVfb2JqZWN0LCAidGV4dC9wbGFpbiIsICJidWctJXMtJXMucGF0Y2giICUgKGJ1Z19pZCwg
dGltZXN0YW1wKCkpKQogICAgICAgICBzZWxmLmJyb3dzZXIuc3VibWl0KCkKIAorICAgIGRlZiBw
cm9tcHRfZm9yX2NvbXBvbmVudChzZWxmLCBjb21wb25lbnRzKToKKyAgICAgICAgbG9nKCJQbGVh
c2UgcGljayBhIGNvbXBvbmVudDoiKQorICAgICAgICBpID0gMAorICAgICAgICBmb3IgbmFtZSBp
biBjb21wb25lbnRzOgorICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBsb2coIiUyZC4g
JXMiICUgKGksIG5hbWUpKQorICAgICAgICByZXN1bHQgPSBpbnQocmF3X2lucHV0KCJFbnRlciBh
IG51bWJlcjogIikpIC0gMQorICAgICAgICByZXR1cm4gY29tcG9uZW50c1tyZXN1bHRdCisKKyAg
ICBkZWYgY3JlYXRlX2J1Z193aXRoX3BhdGNoKHNlbGYsIGJ1Z190aXRsZSwgYnVnX2Rlc2NyaXB0
aW9uLCBjb21wb25lbnQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBwYXRjaF9kZXNjcmlwdGlvbiwgY2Ms
IG1hcmtfZm9yX3Jldmlldz1GYWxzZSk6CisgICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKKwor
ICAgICAgICBsb2coJ0NyZWF0aW5nIGJ1ZyB3aXRoIHBhdGNoIGRlc2NyaXB0aW9uICIlcyInICUg
cGF0Y2hfZGVzY3JpcHRpb24pCisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAgICAg
bG9nKGJ1Z19kZXNjcmlwdGlvbikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYu
YnJvd3Nlci5vcGVuKHNlbGYuYnVnX3NlcnZlciArICJlbnRlcl9idWcuY2dpP3Byb2R1Y3Q9V2Vi
S2l0IikKKyAgICAgICAgc2VsZi5icm93c2VyLnNlbGVjdF9mb3JtKG5hbWU9IkNyZWF0ZSIpCisg
ICAgICAgIGlmIG5vdCBjb21wb25lbnQgb3IgY29tcG9uZW50IG5vdCBpbiBbaXRlbS5uYW1lIGZv
ciBpdGVtIGluIHNlbGYuYnJvd3Nlci5maW5kX2NvbnRyb2woJ2NvbXBvbmVudCcpLml0ZW1zXToK
KyAgICAgICAgICAgIGNvbXBvbmVudCA9IHNlbGYucHJvbXB0X2Zvcl9jb21wb25lbnQoW2l0ZW0u
bmFtZSBmb3IgaXRlbSBpbiBzZWxmLmJyb3dzZXIuZmluZF9jb250cm9sKCdjb21wb25lbnQnKS5p
dGVtc10pCisgICAgICAgIHNlbGYuYnJvd3NlclsnY29tcG9uZW50J10gPSBbY29tcG9uZW50XQor
ICAgICAgICBzZWxmLmJyb3dzZXJbJ2NjJ10gPSBjYworICAgICAgICBzZWxmLmJyb3dzZXJbJ3No
b3J0X2Rlc2MnXSA9IGJ1Z190aXRsZQorICAgICAgICBpZiBidWdfZGVzY3JpcHRpb246CisgICAg
ICAgICAgICBsb2coYnVnX2Rlc2NyaXB0aW9uKQorICAgICAgICAgICAgc2VsZi5icm93c2VyWydj
b21tZW50J10gPSBidWdfZGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi5icm93c2VyWydkZXNjcmlw
dGlvbiddID0gcGF0Y2hfZGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi5icm93c2VyWydpc3BhdGNo
J10gPSAoIjEiLCkKKyAgICAgICAgc2VsZi5icm93c2VyWydmbGFnX3R5cGUtMSddID0gKCc/Jywp
IGlmIG1hcmtfZm9yX3JldmlldyBlbHNlICgnWCcsKQorICAgICAgICBzZWxmLmJyb3dzZXIuYWRk
X2ZpbGUocGF0Y2hfZmlsZV9vYmplY3QsICJ0ZXh0L3BsYWluIiwgIiVzLnBhdGNoIiAlIHRpbWVz
dGFtcCgpLCAnZGF0YScpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5icm93c2VyLnN1Ym1pdCgp
CisKKyAgICAgICAgcmVzcG9uc2VfaHRtbCA9IHJlc3BvbnNlLnJlYWQoKQorICAgICAgICBtYXRj
aCA9IHJlLnNlYXJjaCgiPHRpdGxlPkJ1ZyAoP1A8YnVnX2lkPlxkKykgU3VibWl0dGVkPC90aXRs
ZT4iLCByZXNwb25zZV9odG1sKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGJ1Z19p
ZCA9IG1hdGNoLmdyb3VwKCdidWdfaWQnKQorICAgICAgICAgICAgbG9nKCJCdWcgJXMgY3JlYXRl
ZC4iICUgYnVnX2lkKQorICAgICAgICAgICAgbG9nKHNlbGYuYnVnX3NlcnZlciArICJzaG93X2J1
Zy5jZ2k/aWQ9IiArIGJ1Z19pZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hdGNoID0g
cmUuc2VhcmNoKCc8ZGl2IGlkPSJidWd6aWxsYS1ib2R5Ij4oP1A8ZXJyb3JfbWVzc2FnZT4uKyk8
ZGl2IGlkPSJmb290ZXIiPicsIHJlc3BvbnNlX2h0bWwsIHJlLkRPVEFMTCkKKyAgICAgICAgICAg
IGVycm9yX21lc3NhZ2UgPSAiRkFJTCIKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAg
ICAgICAgIHRleHRfbGluZXMgPSBCZWF1dGlmdWxTb3VwKG1hdGNoLmdyb3VwKCdlcnJvcl9tZXNz
YWdlJykpLmZpbmRBbGwodGV4dD1UcnVlKQorICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2Ug
PSAnXG4nLmpvaW4oWyIgICIgKyBsaW5lLnN0cmlwKCkgZm9yIGxpbmUgaW4gdGV4dF9saW5lcyBp
ZiBsaW5lLnN0cmlwKCldKQorICAgICAgICAgICAgZXJyb3IoIkJ1ZyBub3QgY3JlYXRlZDpcbiVz
IiAlIGVycm9yX21lc3NhZ2UpCisKICAgICBkZWYgb2Jzb2xldGVfYXR0YWNobWVudChzZWxmLCBh
dHRhY2htZW50X2lkLCBjb21tZW50X3RleHQgPSBOb25lKToKICAgICAgICAgc2VsZi5hdXRoZW50
aWNhdGUoKQ==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>32600</attachid>
            <date>2009-07-10 18:39:23 -0700</date>
            <delta_ts>2009-07-10 22:04:30 -0700</delta_ts>
            <desc>Patch v2: More WIP</desc>
            <filename>bug-27119-20090710183922.patch</filename>
            <type>text/plain</type>
            <size>8025</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyNjRhOWI4Li4yNGJlYjBhIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjYgQEAKIDIwMDktMDct
MTAgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KIAorICAgICAgICA8aHR0cDov
L3dlYmtpdC5vcmcvYi8yNzExOT4gYnVnemlsbGEtdG9vbDogQWRkIGNyZWF0ZS1idWcgY29tbWFu
ZAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRp
YWwgcGFzcyBhdCBhICJjcmVhdGUtYnVnIiBjb21tYW5kIGZvciBidWd6aWxsYS10b29sLiAgVGhp
cworICAgICAgICB2ZXJzaW9uIG9ubHkgd29ya3Mgd2l0aCBsb2NhbCBnaXQgY29tbWl0cyBzaW5j
ZSB0aGF0IHdhcyB0aGUKKyAgICAgICAgaW1tZWRpYXRlIG5lZWQuCisKKyAgICAgICAgKiBTY3Jp
cHRzL2J1Z3ppbGxhLXRvb2w6IEFkZGVkIENyZWF0ZUJ1Z1dpdGhQYXRjaCBjbGFzcy4KKyAgICAg
ICAgKENyZWF0ZUJ1Zy5fX2luaXRfXyk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlQnVnLmNyZWF0
ZUJ1Z0Zyb21Db21taXQpOiBBZGRlZC4KKyAgICAgICAgKENyZWF0ZUJ1Zy5jcmVhdGVCdWdGcm9t
UGF0Y2gpOiBBZGRlZC4KKyAgICAgICAgKENyZWF0ZUJ1Zy5leGVjdXRlKTogQWRkZWQuCisgICAg
ICAgIChCdWd6aWxsYVRvb2wuX19pbml0X18pOiBBZGRlZCBjcmVhdGUtYnVnIGNvbW1hbmQuCisg
ICAgICAgICogU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5OgorICAgICAgICAoQnVnemlsbGEu
cHJvbXB0X2Zvcl9jb21wb25lbnQpOiBBZGRlZC4KKyAgICAgICAgKEJ1Z3ppbGxhLmNoZWNrX2Ny
ZWF0ZV9idWdfcmVzcG9uc2VfcmV0dXJuaW5nX2J1Z19pZF9vbl9zdWNjZXNzKTogQWRkZWQuCisg
ICAgICAgIChCdWd6aWxsYS5jcmVhdGVfYnVnX3dpdGhfcGF0Y2gpOiBBZGRlZC4KKworMjAwOS0w
Ny0xMCAgRGF2aWQgS2lsemVyICA8ZGRraWx6ZXJAYXBwbGUuY29tPgorCiAgICAgICAgIDxodHRw
Oi8vd2Via2l0Lm9yZy9iLzI3MTE3PiBidWd6aWxsYS10b29sOiB1c2UgTWFjIE9TIFgga2V5Y2hh
aW4gZm9yIGF1dGhlbnRpY2F0aW9uCiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwu
CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wgYi9XZWJLaXRU
b29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wKaW5kZXggN2I2MjRiOS4uNDhiN2E1NiAxMDA3NTUK
LS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29sCisrKyBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvYnVnemlsbGEtdG9vbApAQCAtNDU0LDYgKzQ1NCw1MSBAQCBjbGFzcyBQb3N0Q29t
bWl0c0FzUGF0Y2hlc1RvQnVnKENvbW1hbmQpOgogICAgICAgICAgICAgdG9vbC5idWdzLmFkZF9w
YXRjaF90b19idWcoYnVnX2lkLCBkaWZmX2ZpbGUsIGRlc2NyaXB0aW9uLCBjb21tZW50X3RleHQs
IG1hcmtfZm9yX3Jldmlldz1vcHRpb25zLnJldmlldykKIAogCitjbGFzcyBDcmVhdGVCdWcoQ29t
bWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gWworICAg
ICAgICAgICAgbWFrZV9vcHRpb24oIi0tY2MiLCBhY3Rpb249InN0b3JlIiwgdHlwZT0ic3RyaW5n
IiwgZGVzdD0iY2MiLCBoZWxwPSJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBlbWFpbCBhZGRyZXNz
ZXMgdG8gY2FyYm9uLWNvcHkuIiksCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1jb21wb25l
bnQiLCBhY3Rpb249InN0b3JlIiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iY29tcG9uZW50IiwgaGVs
cD0iQ29tcG9uZW50IGZvciB0aGUgbmV3IGJ1Zy4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9u
KCItLW5vLXJldmlldyIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJyZXZpZXciLCBkZWZh
dWx0PVRydWUsIGhlbHA9IkRvIG5vdCBtYXJrIHRoZSBwYXRjaCBmb3IgcmV2aWV3LiIpLAorICAg
ICAgICBdCisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ0NyZWF0ZSBhIGJ1ZyBmcm9t
IGxvY2FsIGNoYW5nZXMgb3IgbG9jYWwgY29tbWl0cycsICdbQ09NTUlUSVNIXScsIG9wdGlvbnM9
b3B0aW9ucykKKworICAgIGRlZiBjcmVhdGVCdWdGcm9tQ29tbWl0KHNlbGYsIG9wdGlvbnMsIGFy
Z3MsIHRvb2wpOgorICAgICAgICBjb21taXRfaWRzID0gdG9vbC5zY20oKS5jb21taXRfaWRzX2Zy
b21fcmFuZ2VfYXJndW1lbnRzKGFyZ3MsIGNoZXJyeV9waWNrPVRydWUpCisKKyAgICAgICAgaWYg
bGVuKGNvbW1pdF9pZHMpID4gMzoKKyAgICAgICAgICAgIGVycm9yKCJBcmUgeW91IHN1cmUgeW91
IHdhbnQgdG8gY3JlYXRlIG9uZSBidWcgd2l0aCAlcyBwYXRjaGVzPyIgJSBsZW4oY29tbWl0X2lk
cykpCisKKyAgICAgICAgY29tbWl0X2lkID0gY29tbWl0X2lkc1swXQorCisgICAgICAgIGNvbW1p
dF9tZXNzYWdlID0gdG9vbC5zY20oKS5jb21taXRfbWVzc2FnZV9mb3JfY29tbWl0KGNvbW1pdF9p
ZCkKKyAgICAgICAgY29tbWl0X2xpbmVzID0gW3JlLnN1YignXiB7MCw4fScsICcnLCBsaW5lLCAx
KSBmb3IgbGluZSBpbiBjb21taXRfbWVzc2FnZS5zcGxpdGxpbmVzKCldCisKKyAgICAgICAgYnVn
X3RpdGxlID0gY29tbWl0X2xpbmVzWzBdCisgICAgICAgIGNvbW1lbnRfdGV4dCA9ICJcbiIuam9p
bihjb21taXRfbGluZXNbMTpdKSArICJcbiIKKyAgICAgICAgY29tbWVudF90ZXh0ICs9ICItLS1c
biIKKyAgICAgICAgY29tbWVudF90ZXh0ICs9IHRvb2wuc2NtKCkuZmlsZXNfY2hhbmdlZF9zdW1t
YXJ5X2Zvcl9jb21taXQoY29tbWl0X2lkKQorCisgICAgICAgIGRpZmYgPSB0b29sLnNjbSgpLmNy
ZWF0ZV9wYXRjaF9mcm9tX2xvY2FsX2NvbW1pdChjb21taXRfaWQpCisgICAgICAgIGRpZmZfZmls
ZSA9IFN0cmluZ0lPLlN0cmluZ0lPKGRpZmYpICMgY3JlYXRlX2J1Z193aXRoX3BhdGNoIGV4cGVj
dHMgYSBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgIGJ1Z19pZCA9IHRvb2wuYnVncy5jcmVhdGVf
YnVnX3dpdGhfcGF0Y2goYnVnX3RpdGxlLCBjb21tZW50X3RleHQsIG9wdGlvbnMuY29tcG9uZW50
LCBkaWZmX2ZpbGUsICJQYXRjaCB2MSIsIGNjPW9wdGlvbnMuY2MsIG1hcmtfZm9yX3Jldmlldz1v
cHRpb25zLnJldmlldykKKworICAgICAgICBpZiBidWdfaWQgYW5kIGxlbihjb21taXRfaWRzKSA+
IDE6CisgICAgICAgICAgICBvcHRpb25zLmJ1Z19pZCA9IGJ1Z19pZAorICAgICAgICAgICAgb3B0
aW9ucy5vYnNvbGV0ZV9wYXRjaGVzID0gRmFsc2UKKyAgICAgICAgICAgICMgRklYTUU6IFdlIHNo
b3VsZCBwYXNzIHRocm91Z2ggLS1uby1jb21tZW50IHN3aXRjaCBhcyB3ZWxsLgorICAgICAgICAg
ICAgUG9zdENvbW1pdHNBc1BhdGNoZXNUb0J1Zy5leGVjdXRlKHNlbGYsIG9wdGlvbnMsIGNvbW1p
dF9pZHNbMTpdLCB0b29sKQorCisgICAgZGVmIGNyZWF0ZUJ1Z0Zyb21QYXRjaChzZWxmLCBvcHRp
b25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgIk5v
dCBpbXBsZW1lbnRlZCB5ZXQuIgorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgYXJn
cywgdG9vbCk6CisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAwOgorICAgICAgICAgICAgc2VsZi5j
cmVhdGVCdWdGcm9tUGF0Y2gob3B0aW9ucywgYXJncywgdG9vbCkKKyAgICAgICAgZWxzZToKKyAg
ICAgICAgICAgIHNlbGYuY3JlYXRlQnVnRnJvbUNvbW1pdChvcHRpb25zLCBhcmdzLCB0b29sKQor
CisKIGNsYXNzIE5vbldyYXBwaW5nRXBpbG9nSW5kZW50ZWRIZWxwRm9ybWF0dGVyKEluZGVudGVk
SGVscEZvcm1hdHRlcik6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBJbmRlbnRl
ZEhlbHBGb3JtYXR0ZXIuX19pbml0X18oc2VsZikKQEAgLTQ3OSw2ICs1MjQsNyBAQCBjbGFzcyBC
dWd6aWxsYVRvb2w6CiAgICAgICAgICAgICB7ICduYW1lJyA6ICdidWdzLXRvLWNvbW1pdCcsICdv
YmplY3QnIDogQnVnc0luQ29tbWl0UXVldWUoKSB9LAogICAgICAgICAgICAgeyAnbmFtZScgOiAn
cGF0Y2hlcy10by1jb21taXQnLCAnb2JqZWN0JyA6IFBhdGNoZXNJbkNvbW1pdFF1ZXVlKCkgfSwK
ICAgICAgICAgICAgIHsgJ25hbWUnIDogJ3Jldmlld2VkLXBhdGNoZXMnLCAnb2JqZWN0JyA6IFJl
dmlld2VkUGF0Y2hlc09uQnVnKCkgfSwKKyAgICAgICAgICAgIHsgJ25hbWUnIDogJ2NyZWF0ZS1i
dWcnLCAnb2JqZWN0JyA6IENyZWF0ZUJ1ZygpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICdh
cHBseS1wYXRjaGVzJywgJ29iamVjdCcgOiBBcHBseVBhdGNoZXNGcm9tQnVnKCkgfSwKICAgICAg
ICAgICAgIHsgJ25hbWUnIDogJ2xhbmQtZGlmZicsICdvYmplY3QnIDogTGFuZEFuZFVwZGF0ZUJ1
ZygpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICdsYW5kLXBhdGNoZXMnLCAnb2JqZWN0JyA6
IExhbmRQYXRjaGVzRnJvbUJ1Z3MoKSB9LApAQCAtNDkwLDcgKzUzNiw3IEBAIGNsYXNzIEJ1Z3pp
bGxhVG9vbDoKICAgICAgICAgCiAgICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbl9wYXJzZXIgPSBI
ZWxwUHJpbnRpbmdPcHRpb25QYXJzZXIodXNhZ2U9c2VsZi51c2FnZV9saW5lKCksIGZvcm1hdHRl
cj1Ob25XcmFwcGluZ0VwaWxvZ0luZGVudGVkSGVscEZvcm1hdHRlcigpLCBlcGlsb2c9c2VsZi5j
b21tYW5kc191c2FnZSgpKQogICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25fcGFyc2VyLmFkZF9v
cHRpb24oIi0tZHJ5LXJ1biIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImRyeXJ1biIsIGhl
bHA9ImRvIG5vdCB0b3VjaCByZW1vdGUgc2VydmVycyIsIGRlZmF1bHQ9RmFsc2UpCi0gICAgCisK
ICAgICBkZWYgc2NtKHNlbGYpOgogICAgICAgICAjIExhemlseSBpbml0aWFsaXplIFNDTSB0byBu
b3QgZXJyb3Itb3V0IGJlZm9yZSBjb21tYW5kIGxpbmUgcGFyc2luZyAob3Igd2hlbiBydW5uaW5n
IG5vbi1zY20gY29tbWFuZHMpLgogICAgICAgICBvcmlnaW5hbF9jd2QgPSBvcy5wYXRoLmFic3Bh
dGgoJy4nKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxh
LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5CmluZGV4IDFkYWYw
NzMuLmQxODQ4NjQgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9idWd6
aWxsYS5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKQEAg
LTI5NCw2ICsyOTQsNTcgQEAgY2xhc3MgQnVnemlsbGE6CiAgICAgICAgIHNlbGYuYnJvd3Nlci5h
ZGRfZmlsZShwYXRjaF9maWxlX29iamVjdCwgInRleHQvcGxhaW4iLCAiYnVnLSVzLSVzLnBhdGNo
IiAlIChidWdfaWQsIHRpbWVzdGFtcCgpKSkKICAgICAgICAgc2VsZi5icm93c2VyLnN1Ym1pdCgp
CiAKKyAgICBkZWYgcHJvbXB0X2Zvcl9jb21wb25lbnQoc2VsZiwgY29tcG9uZW50cyk6CisgICAg
ICAgIGxvZygiUGxlYXNlIHBpY2sgYSBjb21wb25lbnQ6IikKKyAgICAgICAgaSA9IDAKKyAgICAg
ICAgZm9yIG5hbWUgaW4gY29tcG9uZW50czoKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAg
ICAgbG9nKCIlMmQuICVzIiAlIChpLCBuYW1lKSkKKyAgICAgICAgcmVzdWx0ID0gaW50KHJhd19p
bnB1dCgiRW50ZXIgYSBudW1iZXI6ICIpKSAtIDEKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNb
cmVzdWx0XQorCisgICAgZGVmIGNoZWNrX2NyZWF0ZV9idWdfcmVzcG9uc2VfcmV0dXJuaW5nX2J1
Z19pZF9vbl9zdWNjZXNzKHNlbGYsIHJlc3BvbnNlX2h0bWwpOgorICAgICAgICBtYXRjaCA9IHJl
LnNlYXJjaCgiPHRpdGxlPkJ1ZyAoP1A8YnVnX2lkPlxkKykgU3VibWl0dGVkPC90aXRsZT4iLCBy
ZXNwb25zZV9odG1sKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiBtYXRj
aC5ncm91cCgnYnVnX2lkJykKKworICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnPGRpdiBpZD0i
YnVnemlsbGEtYm9keSI+KD9QPGVycm9yX21lc3NhZ2U+LispPGRpdiBpZD0iZm9vdGVyIj4nLCBy
ZXNwb25zZV9odG1sLCByZS5ET1RBTEwpCisgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRkFJTCIK
KyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICB0ZXh0X2xpbmVzID0gQmVhdXRpZnVsU291
cChtYXRjaC5ncm91cCgnZXJyb3JfbWVzc2FnZScpKS5maW5kQWxsKHRleHQ9VHJ1ZSkKKyAgICAg
ICAgICAgIGVycm9yX21lc3NhZ2UgPSAiXG4iICsgJ1xuJy5qb2luKFsiICAiICsgbGluZS5zdHJp
cCgpIGZvciBsaW5lIGluIHRleHRfbGluZXMgaWYgbGluZS5zdHJpcCgpXSkKKyAgICAgICAgZXJy
b3IoIkJ1ZyBub3QgY3JlYXRlZDogJXMiICUgZXJyb3JfbWVzc2FnZSkKKworICAgIGRlZiBjcmVh
dGVfYnVnX3dpdGhfcGF0Y2goc2VsZiwgYnVnX3RpdGxlLCBidWdfZGVzY3JpcHRpb24sIGNvbXBv
bmVudCwgcGF0Y2hfZmlsZV9vYmplY3QsIHBhdGNoX2Rlc2NyaXB0aW9uLCBjYywgbWFya19mb3Jf
cmV2aWV3PUZhbHNlKToKKyAgICAgICAgc2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxv
ZygnQ3JlYXRpbmcgYnVnIHdpdGggcGF0Y2ggZGVzY3JpcHRpb24gIiVzIicgJSBwYXRjaF9kZXNj
cmlwdGlvbikKKyAgICAgICAgaWYgc2VsZi5kcnlydW46CisgICAgICAgICAgICBsb2coYnVnX2Rl
c2NyaXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5icm93c2VyLm9w
ZW4oc2VsZi5idWdfc2VydmVyX3VybCArICJlbnRlcl9idWcuY2dpP3Byb2R1Y3Q9V2ViS2l0IikK
KyAgICAgICAgc2VsZi5icm93c2VyLnNlbGVjdF9mb3JtKG5hbWU9IkNyZWF0ZSIpCisgICAgICAg
IGNvbXBvbmVudF9pdGVtcyA9IHNlbGYuYnJvd3Nlci5maW5kX2NvbnRyb2woJ2NvbXBvbmVudCcp
Lml0ZW1zCisgICAgICAgIGlmIG5vdCBjb21wb25lbnQgb3IgY29tcG9uZW50IG5vdCBpbiBbaXRl
bS5uYW1lIGZvciBpdGVtIGluIGNvbXBvbmVudF9pdGVtc106CisgICAgICAgICAgICBjb21wb25l
bnQgPSBzZWxmLnByb21wdF9mb3JfY29tcG9uZW50KFtpdGVtLm5hbWUgZm9yIGl0ZW0gaW4gY29t
cG9uZW50X2l0ZW1zXSkKKyAgICAgICAgc2VsZi5icm93c2VyWydjb21wb25lbnQnXSA9IFtjb21w
b25lbnRdCisgICAgICAgIHNlbGYuYnJvd3NlclsnY2MnXSA9IGNjCisgICAgICAgIHNlbGYuYnJv
d3Nlclsnc2hvcnRfZGVzYyddID0gYnVnX3RpdGxlCisgICAgICAgIGlmIGJ1Z19kZXNjcmlwdGlv
bjoKKyAgICAgICAgICAgIGxvZyhidWdfZGVzY3JpcHRpb24pCisgICAgICAgICAgICBzZWxmLmJy
b3dzZXJbJ2NvbW1lbnQnXSA9IGJ1Z19kZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmJyb3dzZXJb
J2Rlc2NyaXB0aW9uJ10gPSBwYXRjaF9kZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmJyb3dzZXJb
J2lzcGF0Y2gnXSA9ICgiMSIsKQorICAgICAgICBzZWxmLmJyb3dzZXJbJ2ZsYWdfdHlwZS0xJ10g
PSAoJz8nLCkgaWYgbWFya19mb3JfcmV2aWV3IGVsc2UgKCdYJywpCisgICAgICAgIHNlbGYuYnJv
d3Nlci5hZGRfZmlsZShwYXRjaF9maWxlX29iamVjdCwgInRleHQvcGxhaW4iLCAiJXMucGF0Y2gi
ICUgdGltZXN0YW1wKCksICdkYXRhJykKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmJyb3dzZXIu
c3VibWl0KCkKKworICAgICAgICBidWdfaWQgPSBjaGVja19jcmVhdGVfYnVnX3Jlc3BvbnNlX3Jl
dHVybmluZ19idWdfaWRfb25fc3VjY2VzcyhyZXNwb25zZS5yZWFkKCkpCisgICAgICAgIGxvZygi
QnVnICVzIGNyZWF0ZWQuIiAlIGJ1Z19pZCkKKyAgICAgICAgbG9nKHNlbGYuYnVnX3NlcnZlcl91
cmwgKyAic2hvd19idWcuY2dpP2lkPSIgKyBidWdfaWQpCisgICAgICAgIHJldHVybiBidWdfaWQK
KwogICAgIGRlZiBvYnNvbGV0ZV9hdHRhY2htZW50KHNlbGYsIGF0dGFjaG1lbnRfaWQsIGNvbW1l
bnRfdGV4dCA9IE5vbmUpOgogICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZSgp
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>32609</attachid>
            <date>2009-07-10 22:04:33 -0700</date>
            <delta_ts>2009-07-28 17:41:27 -0700</delta_ts>
            <desc>Patch v3</desc>
            <filename>bug-27119-20090710220433.patch</filename>
            <type>text/plain</type>
            <size>9369</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyNjRhOWI4Li40NjRjOTEzIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjUgQEAKIDIwMDktMDct
MTAgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KIAorICAgICAgICA8aHR0cDov
L3dlYmtpdC5vcmcvYi8yNzExOT4gYnVnemlsbGEtdG9vbDogQWRkIGNyZWF0ZS1idWcgY29tbWFu
ZAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxl
bWVudCAiY3JlYXRlLWJ1ZyIgY29tbWFuZCBmb3IgYnVnemlsbGEtdG9vbC4KKworICAgICAgICAq
IFNjcmlwdHMvYnVnemlsbGEtdG9vbDogQWRkZWQgQ3JlYXRlQnVnIGNsYXNzLgorICAgICAgICAo
Q3JlYXRlQnVnLl9faW5pdF9fKTogQWRkZWQuCisgICAgICAgIChDcmVhdGVCdWcuY3JlYXRlX2J1
Z19mcm9tX2NvbW1pdCk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlQnVnLmNyZWF0ZV9idWdfZnJv
bV9wYXRjaCk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlQnVnLnByb21wdF9mb3JfYnVnX3RpdGxl
X2FuZF9jb21tZW50KTogQWRkZWQuCisgICAgICAgIChDcmVhdGVCdWcuZXhlY3V0ZSk6IEFkZGVk
LgorICAgICAgICAoQnVnemlsbGFUb29sLl9faW5pdF9fKTogQWRkZWQgY3JlYXRlLWJ1ZyBjb21t
YW5kLgorICAgICAgICAqIFNjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weToKKyAgICAgICAgKEJ1
Z3ppbGxhLnByb21wdF9mb3JfY29tcG9uZW50KTogQWRkZWQuCisgICAgICAgIChCdWd6aWxsYS5j
aGVja19jcmVhdGVfYnVnX3Jlc3BvbnNlX3JldHVybmluZ19idWdfaWRfb25fc3VjY2Vzcyk6IEFk
ZGVkLgorICAgICAgICAoQnVnemlsbGEuY3JlYXRlX2J1Z193aXRoX3BhdGNoKTogQWRkZWQuCisK
KzIwMDktMDctMTAgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KKwogICAgICAg
ICA8aHR0cDovL3dlYmtpdC5vcmcvYi8yNzExNz4gYnVnemlsbGEtdG9vbDogdXNlIE1hYyBPUyBY
IGtleWNoYWluIGZvciBhdXRoZW50aWNhdGlvbgogCiAgICAgICAgIFJldmlld2VkIGJ5IEVyaWMg
U2VpZGVsLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29sIGIv
V2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29sCmluZGV4IDdiNjI0YjkuLjU4ODYyMDIg
MTAwNzU1Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVnemlsbGEtdG9vbAorKysgYi9XZWJL
aXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRvb2wKQEAgLTQ1NCw2ICs0NTQsNzYgQEAgY2xhc3Mg
UG9zdENvbW1pdHNBc1BhdGNoZXNUb0J1ZyhDb21tYW5kKToKICAgICAgICAgICAgIHRvb2wuYnVn
cy5hZGRfcGF0Y2hfdG9fYnVnKGJ1Z19pZCwgZGlmZl9maWxlLCBkZXNjcmlwdGlvbiwgY29tbWVu
dF90ZXh0LCBtYXJrX2Zvcl9yZXZpZXc9b3B0aW9ucy5yZXZpZXcpCiAKIAorY2xhc3MgQ3JlYXRl
QnVnKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9
IFsKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLWNjIiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9
InN0cmluZyIsIGRlc3Q9ImNjIiwgaGVscD0iQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZW1haWwg
YWRkcmVzc2VzIHRvIGNhcmJvbi1jb3B5LiIpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0t
Y29tcG9uZW50IiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9ImNvbXBvbmVu
dCIsIGhlbHA9IkNvbXBvbmVudCBmb3IgdGhlIG5ldyBidWcuIiksCisgICAgICAgICAgICBtYWtl
X29wdGlvbigiLS1uby1wcm9tcHQiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJwcm9tcHQi
LCBkZWZhdWx0PVRydWUsIGhlbHA9IkRvIG5vdCBwcm9tcHQgZm9yIGJ1ZyB0aXRsZSBhbmQgY29t
bWVudDsgdXNlIGNvbW1pdCBsb2cgaW5zdGVhZC4iKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9u
KCItLW5vLXJldmlldyIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJyZXZpZXciLCBkZWZh
dWx0PVRydWUsIGhlbHA9IkRvIG5vdCBtYXJrIHRoZSBwYXRjaCBmb3IgcmV2aWV3LiIpLAorICAg
ICAgICBdCisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgJ0NyZWF0ZSBhIGJ1ZyBmcm9t
IGxvY2FsIGNoYW5nZXMgb3IgbG9jYWwgY29tbWl0cycsICdbQ09NTUlUSVNIXScsIG9wdGlvbnM9
b3B0aW9ucykKKworICAgIGRlZiBjcmVhdGVfYnVnX2Zyb21fY29tbWl0KHNlbGYsIG9wdGlvbnMs
IGFyZ3MsIHRvb2wpOgorICAgICAgICBjb21taXRfaWRzID0gdG9vbC5zY20oKS5jb21taXRfaWRz
X2Zyb21fcmFuZ2VfYXJndW1lbnRzKGFyZ3MsIGNoZXJyeV9waWNrPVRydWUpCisKKyAgICAgICAg
aWYgbGVuKGNvbW1pdF9pZHMpID4gMzoKKyAgICAgICAgICAgIGVycm9yKCJBcmUgeW91IHN1cmUg
eW91IHdhbnQgdG8gY3JlYXRlIG9uZSBidWcgd2l0aCAlcyBwYXRjaGVzPyIgJSBsZW4oY29tbWl0
X2lkcykpCisKKyAgICAgICAgY29tbWl0X2lkID0gY29tbWl0X2lkc1swXQorCisgICAgICAgIGJ1
Z190aXRsZSA9ICIiCisgICAgICAgIGNvbW1lbnRfdGV4dCA9ICIiCisgICAgICAgIGlmIG9wdGlv
bnMucHJvbXB0OgorICAgICAgICAgICAgKGJ1Z190aXRsZSwgY29tbWVudF90ZXh0KSA9IHNlbGYu
cHJvbXB0X2Zvcl9idWdfdGl0bGVfYW5kX2NvbW1lbnQoKQorICAgICAgICBlbHNlOgorICAgICAg
ICAgICAgY29tbWl0X21lc3NhZ2UgPSB0b29sLnNjbSgpLmNvbW1pdF9tZXNzYWdlX2Zvcl9jb21t
aXQoY29tbWl0X2lkKQorICAgICAgICAgICAgY29tbWl0X2xpbmVzID0gW3JlLnN1YignXiB7MCw4
fScsICcnLCBsaW5lLCAxKSBmb3IgbGluZSBpbiBjb21taXRfbWVzc2FnZS5zcGxpdGxpbmVzKCld
CisgICAgICAgICAgICBidWdfdGl0bGUgPSBjb21taXRfbGluZXNbMF0KKyAgICAgICAgICAgIGNv
bW1lbnRfdGV4dCA9ICJcbiIuam9pbihjb21taXRfbGluZXNbMTpdKSArICJcbiIKKyAgICAgICAg
ICAgIGNvbW1lbnRfdGV4dCArPSAiLS0tXG4iCisgICAgICAgICAgICBjb21tZW50X3RleHQgKz0g
dG9vbC5zY20oKS5maWxlc19jaGFuZ2VkX3N1bW1hcnlfZm9yX2NvbW1pdChjb21taXRfaWQpCisK
KyAgICAgICAgZGlmZiA9IHRvb2wuc2NtKCkuY3JlYXRlX3BhdGNoX2Zyb21fbG9jYWxfY29tbWl0
KGNvbW1pdF9pZCkKKyAgICAgICAgZGlmZl9maWxlID0gU3RyaW5nSU8uU3RyaW5nSU8oZGlmZikg
IyBjcmVhdGVfYnVnX3dpdGhfcGF0Y2ggZXhwZWN0cyBhIGZpbGUtbGlrZSBvYmplY3QKKyAgICAg
ICAgYnVnX2lkID0gdG9vbC5idWdzLmNyZWF0ZV9idWdfd2l0aF9wYXRjaChidWdfdGl0bGUsIGNv
bW1lbnRfdGV4dCwgb3B0aW9ucy5jb21wb25lbnQsIGRpZmZfZmlsZSwgIlBhdGNoIHYxIiwgY2M9
b3B0aW9ucy5jYywgbWFya19mb3JfcmV2aWV3PW9wdGlvbnMucmV2aWV3KQorCisgICAgICAgIGlm
IGJ1Z19pZCBhbmQgbGVuKGNvbW1pdF9pZHMpID4gMToKKyAgICAgICAgICAgIG9wdGlvbnMuYnVn
X2lkID0gYnVnX2lkCisgICAgICAgICAgICBvcHRpb25zLm9ic29sZXRlX3BhdGNoZXMgPSBGYWxz
ZQorICAgICAgICAgICAgIyBGSVhNRTogV2Ugc2hvdWxkIHBhc3MgdGhyb3VnaCAtLW5vLWNvbW1l
bnQgc3dpdGNoIGFzIHdlbGwuCisgICAgICAgICAgICBQb3N0Q29tbWl0c0FzUGF0Y2hlc1RvQnVn
LmV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgY29tbWl0X2lkc1sxOl0sIHRvb2wpCisKKyAgICBkZWYg
Y3JlYXRlX2J1Z19mcm9tX3BhdGNoKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAg
ICBidWdfdGl0bGUgPSAiIgorICAgICAgICBjb21tZW50X3RleHQgPSAiIgorICAgICAgICBpZiBv
cHRpb25zLnByb21wdDoKKyAgICAgICAgICAgIChidWdfdGl0bGUsIGNvbW1lbnRfdGV4dCkgPSBz
ZWxmLnByb21wdF9mb3JfYnVnX3RpdGxlX2FuZF9jb21tZW50KCkKKyAgICAgICAgZWxzZToKKyAg
ICAgICAgICAgIGNvbW1pdF9tZXNzYWdlID0gY29tbWl0X21lc3NhZ2VfZm9yX3RoaXNfY29tbWl0
KHRvb2wuc2NtKCkpCisgICAgICAgICAgICBjb21taXRfbGluZXMgPSBbcmUuc3ViKCdeIHswLDh9
JywgJycsIGxpbmUsIDEpIGZvciBsaW5lIGluIGNvbW1pdF9tZXNzYWdlLnNwbGl0bGluZXMoKV0K
KyAgICAgICAgICAgIGJ1Z190aXRsZSA9IGNvbW1pdF9saW5lc1swXQorICAgICAgICAgICAgY29t
bWVudF90ZXh0ID0gIlxuIi5qb2luKGNvbW1pdF9saW5lc1sxOl0pICsgIlxuIgorCisgICAgICAg
IGRpZmYgPSB0b29sLnNjbSgpLmNyZWF0ZV9wYXRjaCgpCisgICAgICAgIGRpZmZfZmlsZSA9IFN0
cmluZ0lPLlN0cmluZ0lPKGRpZmYpICMgY3JlYXRlX2J1Z193aXRoX3BhdGNoIGV4cGVjdHMgYSBm
aWxlLWxpa2Ugb2JqZWN0CisgICAgICAgIGJ1Z19pZCA9IHRvb2wuYnVncy5jcmVhdGVfYnVnX3dp
dGhfcGF0Y2goYnVnX3RpdGxlLCBjb21tZW50X3RleHQsIG9wdGlvbnMuY29tcG9uZW50LCBkaWZm
X2ZpbGUsICJQYXRjaCB2MSIsIGNjPW9wdGlvbnMuY2MsIG1hcmtfZm9yX3Jldmlldz1vcHRpb25z
LnJldmlldykKKworICAgIGRlZiBwcm9tcHRfZm9yX2J1Z190aXRsZV9hbmRfY29tbWVudChzZWxm
KToKKyAgICAgICAgYnVnX3RpdGxlID0gcmF3X2lucHV0KCJCdWcgdGl0bGU6ICIpCisgICAgICAg
IHByaW50KCJCdWcgY29tbWVudCAoaGl0IF5EIG9uIGJsYW5rIGxpbmUgdG8gZW5kKToiKQorICAg
ICAgICBsaW5lcyA9IHN5cy5zdGRpbi5yZWFkbGluZXMoKQorICAgICAgICBzeXMuc3RkaW4uc2Vl
aygwLCBvcy5TRUVLX0VORCkKKyAgICAgICAgY29tbWVudF90ZXh0ID0gJycuam9pbihsaW5lcykK
KyAgICAgICAgcmV0dXJuIChidWdfdGl0bGUsIGNvbW1lbnRfdGV4dCkKKworICAgIGRlZiBleGVj
dXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBpZiBsZW4oYXJncykgPT0g
MDoKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX2J1Z19mcm9tX3BhdGNoKG9wdGlvbnMsIGFyZ3Ms
IHRvb2wpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9idWdfZnJvbV9j
b21taXQob3B0aW9ucywgYXJncywgdG9vbCkKKworCiBjbGFzcyBOb25XcmFwcGluZ0VwaWxvZ0lu
ZGVudGVkSGVscEZvcm1hdHRlcihJbmRlbnRlZEhlbHBGb3JtYXR0ZXIpOgogICAgIGRlZiBfX2lu
aXRfXyhzZWxmKToKICAgICAgICAgSW5kZW50ZWRIZWxwRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYp
CkBAIC00NzksNiArNTQ5LDcgQEAgY2xhc3MgQnVnemlsbGFUb29sOgogICAgICAgICAgICAgeyAn
bmFtZScgOiAnYnVncy10by1jb21taXQnLCAnb2JqZWN0JyA6IEJ1Z3NJbkNvbW1pdFF1ZXVlKCkg
fSwKICAgICAgICAgICAgIHsgJ25hbWUnIDogJ3BhdGNoZXMtdG8tY29tbWl0JywgJ29iamVjdCcg
OiBQYXRjaGVzSW5Db21taXRRdWV1ZSgpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICdyZXZp
ZXdlZC1wYXRjaGVzJywgJ29iamVjdCcgOiBSZXZpZXdlZFBhdGNoZXNPbkJ1ZygpIH0sCisgICAg
ICAgICAgICB7ICduYW1lJyA6ICdjcmVhdGUtYnVnJywgJ29iamVjdCcgOiBDcmVhdGVCdWcoKSB9
LAogICAgICAgICAgICAgeyAnbmFtZScgOiAnYXBwbHktcGF0Y2hlcycsICdvYmplY3QnIDogQXBw
bHlQYXRjaGVzRnJvbUJ1ZygpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICdsYW5kLWRpZmYn
LCAnb2JqZWN0JyA6IExhbmRBbmRVcGRhdGVCdWcoKSB9LAogICAgICAgICAgICAgeyAnbmFtZScg
OiAnbGFuZC1wYXRjaGVzJywgJ29iamVjdCcgOiBMYW5kUGF0Y2hlc0Zyb21CdWdzKCkgfSwKQEAg
LTQ5MCw3ICs1NjEsNyBAQCBjbGFzcyBCdWd6aWxsYVRvb2w6CiAgICAgICAgIAogICAgICAgICBz
ZWxmLmdsb2JhbF9vcHRpb25fcGFyc2VyID0gSGVscFByaW50aW5nT3B0aW9uUGFyc2VyKHVzYWdl
PXNlbGYudXNhZ2VfbGluZSgpLCBmb3JtYXR0ZXI9Tm9uV3JhcHBpbmdFcGlsb2dJbmRlbnRlZEhl
bHBGb3JtYXR0ZXIoKSwgZXBpbG9nPXNlbGYuY29tbWFuZHNfdXNhZ2UoKSkKICAgICAgICAgc2Vs
Zi5nbG9iYWxfb3B0aW9uX3BhcnNlci5hZGRfb3B0aW9uKCItLWRyeS1ydW4iLCBhY3Rpb249InN0
b3JlX3RydWUiLCBkZXN0PSJkcnlydW4iLCBoZWxwPSJkbyBub3QgdG91Y2ggcmVtb3RlIHNlcnZl
cnMiLCBkZWZhdWx0PUZhbHNlKQotICAgIAorCiAgICAgZGVmIHNjbShzZWxmKToKICAgICAgICAg
IyBMYXppbHkgaW5pdGlhbGl6ZSBTQ00gdG8gbm90IGVycm9yLW91dCBiZWZvcmUgY29tbWFuZCBs
aW5lIHBhcnNpbmcgKG9yIHdoZW4gcnVubmluZyBub24tc2NtIGNvbW1hbmRzKS4KICAgICAgICAg
b3JpZ2luYWxfY3dkID0gb3MucGF0aC5hYnNwYXRoKCcuJykKZGlmZiAtLWdpdCBhL1dlYktpdFRv
b2xzL1NjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9k
dWxlcy9idWd6aWxsYS5weQppbmRleCAxZGFmMDczLi4wMTY1ODA3IDEwMDY0NAotLS0gYS9XZWJL
aXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKKysrIGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5CkBAIC0yOTQsNiArMjk0LDU3IEBAIGNsYXNzIEJ1Z3pp
bGxhOgogICAgICAgICBzZWxmLmJyb3dzZXIuYWRkX2ZpbGUocGF0Y2hfZmlsZV9vYmplY3QsICJ0
ZXh0L3BsYWluIiwgImJ1Zy0lcy0lcy5wYXRjaCIgJSAoYnVnX2lkLCB0aW1lc3RhbXAoKSkpCiAg
ICAgICAgIHNlbGYuYnJvd3Nlci5zdWJtaXQoKQogCisgICAgZGVmIHByb21wdF9mb3JfY29tcG9u
ZW50KHNlbGYsIGNvbXBvbmVudHMpOgorICAgICAgICBsb2coIlBsZWFzZSBwaWNrIGEgY29tcG9u
ZW50OiIpCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBuYW1lIGluIGNvbXBvbmVudHM6Cisg
ICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIGxvZygiJTJkLiAlcyIgJSAoaSwgbmFtZSkp
CisgICAgICAgIHJlc3VsdCA9IGludChyYXdfaW5wdXQoIkVudGVyIGEgbnVtYmVyOiAiKSkgLSAx
CisgICAgICAgIHJldHVybiBjb21wb25lbnRzW3Jlc3VsdF0KKworICAgIGRlZiBjaGVja19jcmVh
dGVfYnVnX3Jlc3BvbnNlX3JldHVybmluZ19idWdfaWRfb25fc3VjY2VzcyhzZWxmLCByZXNwb25z
ZV9odG1sKToKKyAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goIjx0aXRsZT5CdWcgKD9QPGJ1Z19p
ZD5cZCspIFN1Ym1pdHRlZDwvdGl0bGU+IiwgcmVzcG9uc2VfaHRtbCkKKyAgICAgICAgaWYgbWF0
Y2g6CisgICAgICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoJ2J1Z19pZCcpCisKKyAgICAgICAg
bWF0Y2ggPSByZS5zZWFyY2goJzxkaXYgaWQ9ImJ1Z3ppbGxhLWJvZHkiPig/UDxlcnJvcl9tZXNz
YWdlPi4rKTxkaXYgaWQ9ImZvb3RlciI+JywgcmVzcG9uc2VfaHRtbCwgcmUuRE9UQUxMKQorICAg
ICAgICBlcnJvcl9tZXNzYWdlID0gIkZBSUwiCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAg
ICAgdGV4dF9saW5lcyA9IEJlYXV0aWZ1bFNvdXAobWF0Y2guZ3JvdXAoJ2Vycm9yX21lc3NhZ2Un
KSkuZmluZEFsbCh0ZXh0PVRydWUpCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIlxuIiAr
ICdcbicuam9pbihbIiAgIiArIGxpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiB0ZXh0X2xpbmVzIGlm
IGxpbmUuc3RyaXAoKV0pCisgICAgICAgIGVycm9yKCJCdWcgbm90IGNyZWF0ZWQ6ICVzIiAlIGVy
cm9yX21lc3NhZ2UpCisKKyAgICBkZWYgY3JlYXRlX2J1Z193aXRoX3BhdGNoKHNlbGYsIGJ1Z190
aXRsZSwgYnVnX2Rlc2NyaXB0aW9uLCBjb21wb25lbnQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBwYXRj
aF9kZXNjcmlwdGlvbiwgY2MsIG1hcmtfZm9yX3Jldmlldz1GYWxzZSk6CisgICAgICAgIHNlbGYu
YXV0aGVudGljYXRlKCkKKworICAgICAgICBsb2coJ0NyZWF0aW5nIGJ1ZyB3aXRoIHBhdGNoIGRl
c2NyaXB0aW9uICIlcyInICUgcGF0Y2hfZGVzY3JpcHRpb24pCisgICAgICAgIGlmIHNlbGYuZHJ5
cnVuOgorICAgICAgICAgICAgbG9nKGJ1Z19kZXNjcmlwdGlvbikKKyAgICAgICAgICAgIHJldHVy
bgorCisgICAgICAgIHNlbGYuYnJvd3Nlci5vcGVuKHNlbGYuYnVnX3NlcnZlcl91cmwgKyAiZW50
ZXJfYnVnLmNnaT9wcm9kdWN0PVdlYktpdCIpCisgICAgICAgIHNlbGYuYnJvd3Nlci5zZWxlY3Rf
Zm9ybShuYW1lPSJDcmVhdGUiKQorICAgICAgICBjb21wb25lbnRfaXRlbXMgPSBzZWxmLmJyb3dz
ZXIuZmluZF9jb250cm9sKCdjb21wb25lbnQnKS5pdGVtcworICAgICAgICBpZiBub3QgY29tcG9u
ZW50IG9yIGNvbXBvbmVudCBub3QgaW4gW2l0ZW0ubmFtZSBmb3IgaXRlbSBpbiBjb21wb25lbnRf
aXRlbXNdOgorICAgICAgICAgICAgY29tcG9uZW50ID0gc2VsZi5wcm9tcHRfZm9yX2NvbXBvbmVu
dChbaXRlbS5uYW1lIGZvciBpdGVtIGluIGNvbXBvbmVudF9pdGVtc10pCisgICAgICAgIHNlbGYu
YnJvd3NlclsnY29tcG9uZW50J10gPSBbY29tcG9uZW50XQorICAgICAgICBzZWxmLmJyb3dzZXJb
J2NjJ10gPSBjYworICAgICAgICBzZWxmLmJyb3dzZXJbJ3Nob3J0X2Rlc2MnXSA9IGJ1Z190aXRs
ZQorICAgICAgICBpZiBidWdfZGVzY3JpcHRpb246CisgICAgICAgICAgICBsb2coYnVnX2Rlc2Ny
aXB0aW9uKQorICAgICAgICAgICAgc2VsZi5icm93c2VyWydjb21tZW50J10gPSBidWdfZGVzY3Jp
cHRpb24KKyAgICAgICAgc2VsZi5icm93c2VyWydkZXNjcmlwdGlvbiddID0gcGF0Y2hfZGVzY3Jp
cHRpb24KKyAgICAgICAgc2VsZi5icm93c2VyWydpc3BhdGNoJ10gPSAoIjEiLCkKKyAgICAgICAg
c2VsZi5icm93c2VyWydmbGFnX3R5cGUtMSddID0gKCc/JywpIGlmIG1hcmtfZm9yX3JldmlldyBl
bHNlICgnWCcsKQorICAgICAgICBzZWxmLmJyb3dzZXIuYWRkX2ZpbGUocGF0Y2hfZmlsZV9vYmpl
Y3QsICJ0ZXh0L3BsYWluIiwgIiVzLnBhdGNoIiAlIHRpbWVzdGFtcCgpLCAnZGF0YScpCisgICAg
ICAgIHJlc3BvbnNlID0gc2VsZi5icm93c2VyLnN1Ym1pdCgpCisKKyAgICAgICAgYnVnX2lkID0g
c2VsZi5jaGVja19jcmVhdGVfYnVnX3Jlc3BvbnNlX3JldHVybmluZ19idWdfaWRfb25fc3VjY2Vz
cyhyZXNwb25zZS5yZWFkKCkpCisgICAgICAgIGxvZygiQnVnICVzIGNyZWF0ZWQuIiAlIGJ1Z19p
ZCkKKyAgICAgICAgbG9nKHNlbGYuYnVnX3NlcnZlcl91cmwgKyAic2hvd19idWcuY2dpP2lkPSIg
KyBidWdfaWQpCisgICAgICAgIHJldHVybiBidWdfaWQKKwogICAgIGRlZiBvYnNvbGV0ZV9hdHRh
Y2htZW50KHNlbGYsIGF0dGFjaG1lbnRfaWQsIGNvbW1lbnRfdGV4dCA9IE5vbmUpOgogICAgICAg
ICBzZWxmLmF1dGhlbnRpY2F0ZSgp
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33683</attachid>
            <date>2009-07-28 17:41:30 -0700</date>
            <delta_ts>2009-07-28 21:47:44 -0700</delta_ts>
            <desc>Patch v4</desc>
            <filename>bug-27119-20090728174130.patch</filename>
            <type>text/plain</type>
            <size>8585</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA0MWZhZWE2Li5hNWVkMmNjIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAKKzIwMDktMDct
MjggIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KKworICAgICAgICA8aHR0cDov
L3dlYmtpdC5vcmcvYi8yNzExOT4gYnVnemlsbGEtdG9vbDogQWRkIGNyZWF0ZS1idWcgY29tbWFu
ZAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxl
bWVudCAiY3JlYXRlLWJ1ZyIgY29tbWFuZCBmb3IgYnVnemlsbGEtdG9vbC4KKworICAgICAgICAq
IFNjcmlwdHMvYnVnemlsbGEtdG9vbDogQWRkZWQgQ3JlYXRlQnVnIGNsYXNzLgorICAgICAgICAo
Q3JlYXRlQnVnLl9faW5pdF9fKTogQWRkZWQuCisgICAgICAgIChDcmVhdGVCdWcuY3JlYXRlX2J1
Z19mcm9tX2NvbW1pdCk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlQnVnLmNyZWF0ZV9idWdfZnJv
bV9wYXRjaCk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlQnVnLnByb21wdF9mb3JfYnVnX3RpdGxl
X2FuZF9jb21tZW50KTogQWRkZWQuCisgICAgICAgIChDcmVhdGVCdWcuZXhlY3V0ZSk6IEFkZGVk
LgorICAgICAgICAoQnVnemlsbGFUb29sLl9faW5pdF9fKTogQWRkZWQgY3JlYXRlLWJ1ZyBjb21t
YW5kLgorICAgICAgICAqIFNjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weToKKyAgICAgICAgKEJ1
Z3ppbGxhLnByb21wdF9mb3JfY29tcG9uZW50KTogQWRkZWQuCisgICAgICAgIChCdWd6aWxsYS5j
aGVja19jcmVhdGVfYnVnX3Jlc3BvbnNlX3JldHVybmluZ19idWdfaWRfb25fc3VjY2Vzcyk6IEFk
ZGVkLgorICAgICAgICAoQnVnemlsbGEuY3JlYXRlX2J1Z193aXRoX3BhdGNoKTogQWRkZWQuCisK
IDIwMDktMDctMjggIE1hcmsgUm93ZSAgPG1yb3dlQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBPbGl2ZXIgSHVudC4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVn
emlsbGEtdG9vbCBiL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVnemlsbGEtdG9vbAppbmRleCA3ZDk4
OGFlLi4wOTAyOGY4IDEwMDc1NQotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRv
b2wKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29sCkBAIC00NTQsNiArNDU0
LDc0IEBAIGNsYXNzIFBvc3RDb21taXRzQXNQYXRjaGVzVG9CdWcoQ29tbWFuZCk6CiAgICAgICAg
ICAgICB0b29sLmJ1Z3MuYWRkX3BhdGNoX3RvX2J1ZyhidWdfaWQsIGRpZmZfZmlsZSwgZGVzY3Jp
cHRpb24sIGNvbW1lbnRfdGV4dCwgbWFya19mb3JfcmV2aWV3PW9wdGlvbnMucmV2aWV3KQogCiAK
K2NsYXNzIENyZWF0ZUJ1ZyhDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAg
ICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1jYyIsIGFjdGlvbj0i
c3RvcmUiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJjYyIsIGhlbHA9IkNvbW1hLXNlcGFyYXRlZCBs
aXN0IG9mIGVtYWlsIGFkZHJlc3NlcyB0byBjYXJib24tY29weS4iKSwKKyAgICAgICAgICAgIG1h
a2Vfb3B0aW9uKCItLWNvbXBvbmVudCIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHJpbmciLCBk
ZXN0PSJjb21wb25lbnQiLCBoZWxwPSJDb21wb25lbnQgZm9yIHRoZSBuZXcgYnVnLiIpLAorICAg
ICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tcHJvbXB0IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwg
ZGVzdD0icHJvbXB0IiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEbyBub3QgcHJvbXB0IGZvciBidWcg
dGl0bGUgYW5kIGNvbW1lbnQ7IHVzZSBjb21taXQgbG9nIGluc3RlYWQuIiksCisgICAgICAgICAg
ICBtYWtlX29wdGlvbigiLS1uby1yZXZpZXciLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0i
cmV2aWV3IiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJEbyBub3QgbWFyayB0aGUgcGF0Y2ggZm9yIHJl
dmlldy4iKSwKKyAgICAgICAgXQorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsICdDcmVh
dGUgYSBidWcgZnJvbSBsb2NhbCBjaGFuZ2VzIG9yIGxvY2FsIGNvbW1pdHMnLCAnW0NPTU1JVElT
SF0nLCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBkZWYgY3JlYXRlX2J1Z19mcm9tX2NvbW1pdChz
ZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgY29tbWl0X2lkcyA9IHRvb2wuc2Nt
KCkuY29tbWl0X2lkc19mcm9tX3JhbmdlX2FyZ3VtZW50cyhhcmdzLCBjaGVycnlfcGljaz1UcnVl
KQorCisgICAgICAgIGlmIGxlbihjb21taXRfaWRzKSA+IDM6CisgICAgICAgICAgICBlcnJvcigi
QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNyZWF0ZSBvbmUgYnVnIHdpdGggJXMgcGF0Y2hlcz8i
ICUgbGVuKGNvbW1pdF9pZHMpKQorCisgICAgICAgIGNvbW1pdF9pZCA9IGNvbW1pdF9pZHNbMF0K
KworICAgICAgICBidWdfdGl0bGUgPSAiIgorICAgICAgICBjb21tZW50X3RleHQgPSAiIgorICAg
ICAgICBpZiBvcHRpb25zLnByb21wdDoKKyAgICAgICAgICAgIChidWdfdGl0bGUsIGNvbW1lbnRf
dGV4dCkgPSBzZWxmLnByb21wdF9mb3JfYnVnX3RpdGxlX2FuZF9jb21tZW50KCkKKyAgICAgICAg
ZWxzZToKKyAgICAgICAgICAgIGNvbW1pdF9tZXNzYWdlID0gdG9vbC5zY20oKS5jb21taXRfbWVz
c2FnZV9mb3JfY29tbWl0KGNvbW1pdF9pZCkKKyAgICAgICAgICAgIGJ1Z190aXRsZSA9IGNvbW1p
dF9tZXNzYWdlLmRlc2NyaXB0aW9uKGxzdHJpcD1UcnVlLCBzdHJpcF91cmw9VHJ1ZSkKKyAgICAg
ICAgICAgIGNvbW1lbnRfdGV4dCA9IGNvbW1pdF9tZXNzYWdlLmJvZHkobHN0cmlwPVRydWUpCisg
ICAgICAgICAgICBjb21tZW50X3RleHQgKz0gIi0tLVxuIgorICAgICAgICAgICAgY29tbWVudF90
ZXh0ICs9IHRvb2wuc2NtKCkuZmlsZXNfY2hhbmdlZF9zdW1tYXJ5X2Zvcl9jb21taXQoY29tbWl0
X2lkKQorCisgICAgICAgIGRpZmYgPSB0b29sLnNjbSgpLmNyZWF0ZV9wYXRjaF9mcm9tX2xvY2Fs
X2NvbW1pdChjb21taXRfaWQpCisgICAgICAgIGRpZmZfZmlsZSA9IFN0cmluZ0lPLlN0cmluZ0lP
KGRpZmYpICMgY3JlYXRlX2J1Z193aXRoX3BhdGNoIGV4cGVjdHMgYSBmaWxlLWxpa2Ugb2JqZWN0
CisgICAgICAgIGJ1Z19pZCA9IHRvb2wuYnVncy5jcmVhdGVfYnVnX3dpdGhfcGF0Y2goYnVnX3Rp
dGxlLCBjb21tZW50X3RleHQsIG9wdGlvbnMuY29tcG9uZW50LCBkaWZmX2ZpbGUsICJQYXRjaCB2
MSIsIGNjPW9wdGlvbnMuY2MsIG1hcmtfZm9yX3Jldmlldz1vcHRpb25zLnJldmlldykKKworICAg
ICAgICBpZiBidWdfaWQgYW5kIGxlbihjb21taXRfaWRzKSA+IDE6CisgICAgICAgICAgICBvcHRp
b25zLmJ1Z19pZCA9IGJ1Z19pZAorICAgICAgICAgICAgb3B0aW9ucy5vYnNvbGV0ZV9wYXRjaGVz
ID0gRmFsc2UKKyAgICAgICAgICAgICMgRklYTUU6IFdlIHNob3VsZCBwYXNzIHRocm91Z2ggLS1u
by1jb21tZW50IHN3aXRjaCBhcyB3ZWxsLgorICAgICAgICAgICAgUG9zdENvbW1pdHNBc1BhdGNo
ZXNUb0J1Zy5leGVjdXRlKHNlbGYsIG9wdGlvbnMsIGNvbW1pdF9pZHNbMTpdLCB0b29sKQorCisg
ICAgZGVmIGNyZWF0ZV9idWdfZnJvbV9wYXRjaChzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToK
KyAgICAgICAgYnVnX3RpdGxlID0gIiIKKyAgICAgICAgY29tbWVudF90ZXh0ID0gIiIKKyAgICAg
ICAgaWYgb3B0aW9ucy5wcm9tcHQ6CisgICAgICAgICAgICAoYnVnX3RpdGxlLCBjb21tZW50X3Rl
eHQpID0gc2VsZi5wcm9tcHRfZm9yX2J1Z190aXRsZV9hbmRfY29tbWVudCgpCisgICAgICAgIGVs
c2U6CisgICAgICAgICAgICBjb21taXRfbWVzc2FnZSA9IGNvbW1pdF9tZXNzYWdlX2Zvcl90aGlz
X2NvbW1pdCh0b29sLnNjbSgpKQorICAgICAgICAgICAgYnVnX3RpdGxlID0gY29tbWl0X21lc3Nh
Z2UuZGVzY3JpcHRpb24obHN0cmlwPVRydWUsIHN0cmlwX3VybD1UcnVlKQorICAgICAgICAgICAg
Y29tbWVudF90ZXh0ID0gY29tbWl0X21lc3NhZ2UuYm9keShsc3RyaXA9VHJ1ZSkKKworICAgICAg
ICBkaWZmID0gdG9vbC5zY20oKS5jcmVhdGVfcGF0Y2goKQorICAgICAgICBkaWZmX2ZpbGUgPSBT
dHJpbmdJTy5TdHJpbmdJTyhkaWZmKSAjIGNyZWF0ZV9idWdfd2l0aF9wYXRjaCBleHBlY3RzIGEg
ZmlsZS1saWtlIG9iamVjdAorICAgICAgICBidWdfaWQgPSB0b29sLmJ1Z3MuY3JlYXRlX2J1Z193
aXRoX3BhdGNoKGJ1Z190aXRsZSwgY29tbWVudF90ZXh0LCBvcHRpb25zLmNvbXBvbmVudCwgZGlm
Zl9maWxlLCAiUGF0Y2ggdjEiLCBjYz1vcHRpb25zLmNjLCBtYXJrX2Zvcl9yZXZpZXc9b3B0aW9u
cy5yZXZpZXcpCisKKyAgICBkZWYgcHJvbXB0X2Zvcl9idWdfdGl0bGVfYW5kX2NvbW1lbnQoc2Vs
Zik6CisgICAgICAgIGJ1Z190aXRsZSA9IHJhd19pbnB1dCgiQnVnIHRpdGxlOiAiKQorICAgICAg
ICBwcmludCgiQnVnIGNvbW1lbnQgKGhpdCBeRCBvbiBibGFuayBsaW5lIHRvIGVuZCk6IikKKyAg
ICAgICAgbGluZXMgPSBzeXMuc3RkaW4ucmVhZGxpbmVzKCkKKyAgICAgICAgc3lzLnN0ZGluLnNl
ZWsoMCwgb3MuU0VFS19FTkQpCisgICAgICAgIGNvbW1lbnRfdGV4dCA9ICcnLmpvaW4obGluZXMp
CisgICAgICAgIHJldHVybiAoYnVnX3RpdGxlLCBjb21tZW50X3RleHQpCisKKyAgICBkZWYgZXhl
Y3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpOgor
ICAgICAgICAgICAgc2VsZi5jcmVhdGVfYnVnX2Zyb21fY29tbWl0KG9wdGlvbnMsIGFyZ3MsIHRv
b2wpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9idWdfZnJvbV9wYXRj
aChvcHRpb25zLCBhcmdzLCB0b29sKQorCisKIGNsYXNzIE5vbldyYXBwaW5nRXBpbG9nSW5kZW50
ZWRIZWxwRm9ybWF0dGVyKEluZGVudGVkSGVscEZvcm1hdHRlcik6CiAgICAgZGVmIF9faW5pdF9f
KHNlbGYpOgogICAgICAgICBJbmRlbnRlZEhlbHBGb3JtYXR0ZXIuX19pbml0X18oc2VsZikKQEAg
LTQ4MSw2ICs1NDksNyBAQCBjbGFzcyBCdWd6aWxsYVRvb2w6CiAgICAgICAgICAgICB7ICduYW1l
JyA6ICdidWdzLXRvLWNvbW1pdCcsICdvYmplY3QnIDogQnVnc0luQ29tbWl0UXVldWUoKSB9LAog
ICAgICAgICAgICAgeyAnbmFtZScgOiAncGF0Y2hlcy10by1jb21taXQnLCAnb2JqZWN0JyA6IFBh
dGNoZXNJbkNvbW1pdFF1ZXVlKCkgfSwKICAgICAgICAgICAgIHsgJ25hbWUnIDogJ3Jldmlld2Vk
LXBhdGNoZXMnLCAnb2JqZWN0JyA6IFJldmlld2VkUGF0Y2hlc09uQnVnKCkgfSwKKyAgICAgICAg
ICAgIHsgJ25hbWUnIDogJ2NyZWF0ZS1idWcnLCAnb2JqZWN0JyA6IENyZWF0ZUJ1ZygpIH0sCiAg
ICAgICAgICAgICB7ICduYW1lJyA6ICdhcHBseS1wYXRjaGVzJywgJ29iamVjdCcgOiBBcHBseVBh
dGNoZXNGcm9tQnVnKCkgfSwKICAgICAgICAgICAgIHsgJ25hbWUnIDogJ2xhbmQtZGlmZicsICdv
YmplY3QnIDogTGFuZEFuZFVwZGF0ZUJ1ZygpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICds
YW5kLXBhdGNoZXMnLCAnb2JqZWN0JyA6IExhbmRQYXRjaGVzRnJvbUJ1Z3MoKSB9LApkaWZmIC0t
Z2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5IGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5CmluZGV4IGZhNTZkNzguLjNiZDFkODcgMTAw
NjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weQorKysgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKQEAgLTI5OCw2ICsyOTgsNTcg
QEAgY2xhc3MgQnVnemlsbGE6CiAgICAgICAgIHNlbGYuYnJvd3Nlci5hZGRfZmlsZShwYXRjaF9m
aWxlX29iamVjdCwgInRleHQvcGxhaW4iLCAiYnVnLSVzLSVzLnBhdGNoIiAlIChidWdfaWQsIHRp
bWVzdGFtcCgpKSkKICAgICAgICAgc2VsZi5icm93c2VyLnN1Ym1pdCgpCiAKKyAgICBkZWYgcHJv
bXB0X2Zvcl9jb21wb25lbnQoc2VsZiwgY29tcG9uZW50cyk6CisgICAgICAgIGxvZygiUGxlYXNl
IHBpY2sgYSBjb21wb25lbnQ6IikKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIG5hbWUgaW4g
Y29tcG9uZW50czoKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgbG9nKCIlMmQuICVz
IiAlIChpLCBuYW1lKSkKKyAgICAgICAgcmVzdWx0ID0gaW50KHJhd19pbnB1dCgiRW50ZXIgYSBu
dW1iZXI6ICIpKSAtIDEKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNbcmVzdWx0XQorCisgICAg
ZGVmIGNoZWNrX2NyZWF0ZV9idWdfcmVzcG9uc2VfcmV0dXJuaW5nX2J1Z19pZF9vbl9zdWNjZXNz
KHNlbGYsIHJlc3BvbnNlX2h0bWwpOgorICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgiPHRpdGxl
PkJ1ZyAoP1A8YnVnX2lkPlxkKykgU3VibWl0dGVkPC90aXRsZT4iLCByZXNwb25zZV9odG1sKQor
ICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgnYnVnX2lk
JykKKworICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnPGRpdiBpZD0iYnVnemlsbGEtYm9keSI+
KD9QPGVycm9yX21lc3NhZ2U+LispPGRpdiBpZD0iZm9vdGVyIj4nLCByZXNwb25zZV9odG1sLCBy
ZS5ET1RBTEwpCisgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRkFJTCIKKyAgICAgICAgaWYgbWF0
Y2g6CisgICAgICAgICAgICB0ZXh0X2xpbmVzID0gQmVhdXRpZnVsU291cChtYXRjaC5ncm91cCgn
ZXJyb3JfbWVzc2FnZScpKS5maW5kQWxsKHRleHQ9VHJ1ZSkKKyAgICAgICAgICAgIGVycm9yX21l
c3NhZ2UgPSAiXG4iICsgJ1xuJy5qb2luKFsiICAiICsgbGluZS5zdHJpcCgpIGZvciBsaW5lIGlu
IHRleHRfbGluZXMgaWYgbGluZS5zdHJpcCgpXSkKKyAgICAgICAgZXJyb3IoIkJ1ZyBub3QgY3Jl
YXRlZDogJXMiICUgZXJyb3JfbWVzc2FnZSkKKworICAgIGRlZiBjcmVhdGVfYnVnX3dpdGhfcGF0
Y2goc2VsZiwgYnVnX3RpdGxlLCBidWdfZGVzY3JpcHRpb24sIGNvbXBvbmVudCwgcGF0Y2hfZmls
ZV9vYmplY3QsIHBhdGNoX2Rlc2NyaXB0aW9uLCBjYywgbWFya19mb3JfcmV2aWV3PUZhbHNlKToK
KyAgICAgICAgc2VsZi5hdXRoZW50aWNhdGUoKQorCisgICAgICAgIGxvZygnQ3JlYXRpbmcgYnVn
IHdpdGggcGF0Y2ggZGVzY3JpcHRpb24gIiVzIicgJSBwYXRjaF9kZXNjcmlwdGlvbikKKyAgICAg
ICAgaWYgc2VsZi5kcnlydW46CisgICAgICAgICAgICBsb2coYnVnX2Rlc2NyaXB0aW9uKQorICAg
ICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5icm93c2VyLm9wZW4oc2VsZi5idWdfc2Vy
dmVyX3VybCArICJlbnRlcl9idWcuY2dpP3Byb2R1Y3Q9V2ViS2l0IikKKyAgICAgICAgc2VsZi5i
cm93c2VyLnNlbGVjdF9mb3JtKG5hbWU9IkNyZWF0ZSIpCisgICAgICAgIGNvbXBvbmVudF9pdGVt
cyA9IHNlbGYuYnJvd3Nlci5maW5kX2NvbnRyb2woJ2NvbXBvbmVudCcpLml0ZW1zCisgICAgICAg
IGlmIG5vdCBjb21wb25lbnQgb3IgY29tcG9uZW50IG5vdCBpbiBbaXRlbS5uYW1lIGZvciBpdGVt
IGluIGNvbXBvbmVudF9pdGVtc106CisgICAgICAgICAgICBjb21wb25lbnQgPSBzZWxmLnByb21w
dF9mb3JfY29tcG9uZW50KFtpdGVtLm5hbWUgZm9yIGl0ZW0gaW4gY29tcG9uZW50X2l0ZW1zXSkK
KyAgICAgICAgc2VsZi5icm93c2VyWydjb21wb25lbnQnXSA9IFtjb21wb25lbnRdCisgICAgICAg
IHNlbGYuYnJvd3NlclsnY2MnXSA9IGNjCisgICAgICAgIHNlbGYuYnJvd3Nlclsnc2hvcnRfZGVz
YyddID0gYnVnX3RpdGxlCisgICAgICAgIGlmIGJ1Z19kZXNjcmlwdGlvbjoKKyAgICAgICAgICAg
IGxvZyhidWdfZGVzY3JpcHRpb24pCisgICAgICAgICAgICBzZWxmLmJyb3dzZXJbJ2NvbW1lbnQn
XSA9IGJ1Z19kZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmJyb3dzZXJbJ2Rlc2NyaXB0aW9uJ10g
PSBwYXRjaF9kZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmJyb3dzZXJbJ2lzcGF0Y2gnXSA9ICgi
MSIsKQorICAgICAgICBzZWxmLmJyb3dzZXJbJ2ZsYWdfdHlwZS0xJ10gPSAoJz8nLCkgaWYgbWFy
a19mb3JfcmV2aWV3IGVsc2UgKCdYJywpCisgICAgICAgIHNlbGYuYnJvd3Nlci5hZGRfZmlsZShw
YXRjaF9maWxlX29iamVjdCwgInRleHQvcGxhaW4iLCAiJXMucGF0Y2giICUgdGltZXN0YW1wKCks
ICdkYXRhJykKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmJyb3dzZXIuc3VibWl0KCkKKworICAg
ICAgICBidWdfaWQgPSBzZWxmLmNoZWNrX2NyZWF0ZV9idWdfcmVzcG9uc2VfcmV0dXJuaW5nX2J1
Z19pZF9vbl9zdWNjZXNzKHJlc3BvbnNlLnJlYWQoKSkKKyAgICAgICAgbG9nKCJCdWcgJXMgY3Jl
YXRlZC4iICUgYnVnX2lkKQorICAgICAgICBsb2coc2VsZi5idWdfc2VydmVyX3VybCArICJzaG93
X2J1Zy5jZ2k/aWQ9IiArIGJ1Z19pZCkKKyAgICAgICAgcmV0dXJuIGJ1Z19pZAorCiAgICAgZGVm
IG9ic29sZXRlX2F0dGFjaG1lbnQoc2VsZiwgYXR0YWNobWVudF9pZCwgY29tbWVudF90ZXh0ID0g
Tm9uZSk6CiAgICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCk=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33691</attachid>
            <date>2009-07-28 21:47:48 -0700</date>
            <delta_ts>2009-07-28 22:40:28 -0700</delta_ts>
            <desc>Patch v5</desc>
            <filename>bug-27119-20090728214747.patch</filename>
            <type>text/plain</type>
            <size>8718</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA0MWZhZWE2Li5hNWVkMmNjIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAKKzIwMDktMDct
MjggIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KKworICAgICAgICA8aHR0cDov
L3dlYmtpdC5vcmcvYi8yNzExOT4gYnVnemlsbGEtdG9vbDogQWRkIGNyZWF0ZS1idWcgY29tbWFu
ZAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxl
bWVudCAiY3JlYXRlLWJ1ZyIgY29tbWFuZCBmb3IgYnVnemlsbGEtdG9vbC4KKworICAgICAgICAq
IFNjcmlwdHMvYnVnemlsbGEtdG9vbDogQWRkZWQgQ3JlYXRlQnVnIGNsYXNzLgorICAgICAgICAo
Q3JlYXRlQnVnLl9faW5pdF9fKTogQWRkZWQuCisgICAgICAgIChDcmVhdGVCdWcuY3JlYXRlX2J1
Z19mcm9tX2NvbW1pdCk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlQnVnLmNyZWF0ZV9idWdfZnJv
bV9wYXRjaCk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlQnVnLnByb21wdF9mb3JfYnVnX3RpdGxl
X2FuZF9jb21tZW50KTogQWRkZWQuCisgICAgICAgIChDcmVhdGVCdWcuZXhlY3V0ZSk6IEFkZGVk
LgorICAgICAgICAoQnVnemlsbGFUb29sLl9faW5pdF9fKTogQWRkZWQgY3JlYXRlLWJ1ZyBjb21t
YW5kLgorICAgICAgICAqIFNjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weToKKyAgICAgICAgKEJ1
Z3ppbGxhLnByb21wdF9mb3JfY29tcG9uZW50KTogQWRkZWQuCisgICAgICAgIChCdWd6aWxsYS5j
aGVja19jcmVhdGVfYnVnX3Jlc3BvbnNlX3JldHVybmluZ19idWdfaWRfb25fc3VjY2Vzcyk6IEFk
ZGVkLgorICAgICAgICAoQnVnemlsbGEuY3JlYXRlX2J1Z193aXRoX3BhdGNoKTogQWRkZWQuCisK
IDIwMDktMDctMjggIE1hcmsgUm93ZSAgPG1yb3dlQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBPbGl2ZXIgSHVudC4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVn
emlsbGEtdG9vbCBiL1dlYktpdFRvb2xzL1NjcmlwdHMvYnVnemlsbGEtdG9vbAppbmRleCA3ZDk4
OGFlLi44YWEzN2YwIDEwMDc1NQotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL2J1Z3ppbGxhLXRv
b2wKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9idWd6aWxsYS10b29sCkBAIC00NTQsNiArNDU0
LDc2IEBAIGNsYXNzIFBvc3RDb21taXRzQXNQYXRjaGVzVG9CdWcoQ29tbWFuZCk6CiAgICAgICAg
ICAgICB0b29sLmJ1Z3MuYWRkX3BhdGNoX3RvX2J1ZyhidWdfaWQsIGRpZmZfZmlsZSwgZGVzY3Jp
cHRpb24sIGNvbW1lbnRfdGV4dCwgbWFya19mb3JfcmV2aWV3PW9wdGlvbnMucmV2aWV3KQogCiAK
K2NsYXNzIENyZWF0ZUJ1ZyhDb21tYW5kKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAg
ICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1jYyIsIGFjdGlvbj0i
c3RvcmUiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJjYyIsIGhlbHA9IkNvbW1hLXNlcGFyYXRlZCBs
aXN0IG9mIGVtYWlsIGFkZHJlc3NlcyB0byBjYXJib24tY29weS4iKSwKKyAgICAgICAgICAgIG1h
a2Vfb3B0aW9uKCItLWNvbXBvbmVudCIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHJpbmciLCBk
ZXN0PSJjb21wb25lbnQiLCBoZWxwPSJDb21wb25lbnQgZm9yIHRoZSBuZXcgYnVnLiIpLAorICAg
ICAgICAgICAgbWFrZV9vcHRpb24oIi0tbm8tcHJvbXB0IiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIs
IGRlc3Q9InByb21wdCIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iRG8gbm90IHByb21wdCBmb3IgYnVn
IHRpdGxlIGFuZCBjb21tZW50OyB1c2UgY29tbWl0IGxvZyBpbnN0ZWFkLiIpLAorICAgICAgICAg
ICAgbWFrZV9vcHRpb24oIi0tbm8tcmV2aWV3IiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9
InJldmlldyIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iRG8gbm90IG1hcmsgdGhlIHBhdGNoIGZvciBy
ZXZpZXcuIiksCisgICAgICAgIF0KKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCAnQ3Jl
YXRlIGEgYnVnIGZyb20gbG9jYWwgY2hhbmdlcyBvciBsb2NhbCBjb21taXRzLicsICdbQ09NTUlU
SVNIXScsIG9wdGlvbnM9b3B0aW9ucykKKworICAgIGRlZiBjcmVhdGVfYnVnX2Zyb21fY29tbWl0
KHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBjb21taXRfaWRzID0gdG9vbC5z
Y20oKS5jb21taXRfaWRzX2Zyb21fcmFuZ2VfYXJndW1lbnRzKGFyZ3MsIGNoZXJyeV9waWNrPVRy
dWUpCisKKyAgICAgICAgaWYgbGVuKGNvbW1pdF9pZHMpID4gMzoKKyAgICAgICAgICAgIGVycm9y
KCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY3JlYXRlIG9uZSBidWcgd2l0aCAlcyBwYXRjaGVz
PyIgJSBsZW4oY29tbWl0X2lkcykpCisKKyAgICAgICAgY29tbWl0X2lkID0gY29tbWl0X2lkc1sw
XQorCisgICAgICAgIGJ1Z190aXRsZSA9ICIiCisgICAgICAgIGNvbW1lbnRfdGV4dCA9ICIiCisg
ICAgICAgIGlmIG9wdGlvbnMucHJvbXB0OgorICAgICAgICAgICAgKGJ1Z190aXRsZSwgY29tbWVu
dF90ZXh0KSA9IHNlbGYucHJvbXB0X2Zvcl9idWdfdGl0bGVfYW5kX2NvbW1lbnQoKQorICAgICAg
ICBlbHNlOgorICAgICAgICAgICAgY29tbWl0X21lc3NhZ2UgPSB0b29sLnNjbSgpLmNvbW1pdF9t
ZXNzYWdlX2Zvcl9sb2NhbF9jb21taXQoY29tbWl0X2lkKQorICAgICAgICAgICAgYnVnX3RpdGxl
ID0gY29tbWl0X21lc3NhZ2UuZGVzY3JpcHRpb24obHN0cmlwPVRydWUsIHN0cmlwX3VybD1UcnVl
KQorICAgICAgICAgICAgY29tbWVudF90ZXh0ID0gY29tbWl0X21lc3NhZ2UuYm9keShsc3RyaXA9
VHJ1ZSkKKyAgICAgICAgICAgIGNvbW1lbnRfdGV4dCArPSAiLS0tXG4iCisgICAgICAgICAgICBj
b21tZW50X3RleHQgKz0gdG9vbC5zY20oKS5maWxlc19jaGFuZ2VkX3N1bW1hcnlfZm9yX2NvbW1p
dChjb21taXRfaWQpCisKKyAgICAgICAgZGlmZiA9IHRvb2wuc2NtKCkuY3JlYXRlX3BhdGNoX2Zy
b21fbG9jYWxfY29tbWl0KGNvbW1pdF9pZCkKKyAgICAgICAgZGlmZl9maWxlID0gU3RyaW5nSU8u
U3RyaW5nSU8oZGlmZikgIyBjcmVhdGVfYnVnX3dpdGhfcGF0Y2ggZXhwZWN0cyBhIGZpbGUtbGlr
ZSBvYmplY3QKKyAgICAgICAgYnVnX2lkID0gdG9vbC5idWdzLmNyZWF0ZV9idWdfd2l0aF9wYXRj
aChidWdfdGl0bGUsIGNvbW1lbnRfdGV4dCwgb3B0aW9ucy5jb21wb25lbnQsIGRpZmZfZmlsZSwg
IlBhdGNoIHYxIiwgY2M9b3B0aW9ucy5jYywgbWFya19mb3JfcmV2aWV3PW9wdGlvbnMucmV2aWV3
KQorCisgICAgICAgIGlmIGJ1Z19pZCBhbmQgbGVuKGNvbW1pdF9pZHMpID4gMToKKyAgICAgICAg
ICAgIG9wdGlvbnMuYnVnX2lkID0gYnVnX2lkCisgICAgICAgICAgICBvcHRpb25zLm9ic29sZXRl
X3BhdGNoZXMgPSBGYWxzZQorICAgICAgICAgICAgIyBGSVhNRTogV2Ugc2hvdWxkIHBhc3MgdGhy
b3VnaCAtLW5vLWNvbW1lbnQgc3dpdGNoIGFzIHdlbGwuCisgICAgICAgICAgICBQb3N0Q29tbWl0
c0FzUGF0Y2hlc1RvQnVnLmV4ZWN1dGUoc2VsZiwgb3B0aW9ucywgY29tbWl0X2lkc1sxOl0sIHRv
b2wpCisKKyAgICBkZWYgY3JlYXRlX2J1Z19mcm9tX3BhdGNoKHNlbGYsIG9wdGlvbnMsIGFyZ3Ms
IHRvb2wpOgorICAgICAgICBidWdfdGl0bGUgPSAiIgorICAgICAgICBjb21tZW50X3RleHQgPSAi
IgorICAgICAgICBpZiBvcHRpb25zLnByb21wdDoKKyAgICAgICAgICAgIChidWdfdGl0bGUsIGNv
bW1lbnRfdGV4dCkgPSBzZWxmLnByb21wdF9mb3JfYnVnX3RpdGxlX2FuZF9jb21tZW50KCkKKyAg
ICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbW1pdF9tZXNzYWdlID0gY29tbWl0X21lc3NhZ2Vf
Zm9yX3RoaXNfY29tbWl0KHRvb2wuc2NtKCkpCisgICAgICAgICAgICBidWdfdGl0bGUgPSBjb21t
aXRfbWVzc2FnZS5kZXNjcmlwdGlvbihsc3RyaXA9VHJ1ZSwgc3RyaXBfdXJsPVRydWUpCisgICAg
ICAgICAgICBjb21tZW50X3RleHQgPSBjb21taXRfbWVzc2FnZS5ib2R5KGxzdHJpcD1UcnVlKQor
CisgICAgICAgIGRpZmYgPSB0b29sLnNjbSgpLmNyZWF0ZV9wYXRjaCgpCisgICAgICAgIGRpZmZf
ZmlsZSA9IFN0cmluZ0lPLlN0cmluZ0lPKGRpZmYpICMgY3JlYXRlX2J1Z193aXRoX3BhdGNoIGV4
cGVjdHMgYSBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgIGJ1Z19pZCA9IHRvb2wuYnVncy5jcmVh
dGVfYnVnX3dpdGhfcGF0Y2goYnVnX3RpdGxlLCBjb21tZW50X3RleHQsIG9wdGlvbnMuY29tcG9u
ZW50LCBkaWZmX2ZpbGUsICJQYXRjaCB2MSIsIGNjPW9wdGlvbnMuY2MsIG1hcmtfZm9yX3Jldmll
dz1vcHRpb25zLnJldmlldykKKworICAgIGRlZiBwcm9tcHRfZm9yX2J1Z190aXRsZV9hbmRfY29t
bWVudChzZWxmKToKKyAgICAgICAgYnVnX3RpdGxlID0gcmF3X2lucHV0KCJCdWcgdGl0bGU6ICIp
CisgICAgICAgIHByaW50KCJCdWcgY29tbWVudCAoaGl0IF5EIG9uIGJsYW5rIGxpbmUgdG8gZW5k
KToiKQorICAgICAgICBsaW5lcyA9IHN5cy5zdGRpbi5yZWFkbGluZXMoKQorICAgICAgICBzeXMu
c3RkaW4uc2VlaygwLCBvcy5TRUVLX0VORCkKKyAgICAgICAgY29tbWVudF90ZXh0ID0gJycuam9p
bihsaW5lcykKKyAgICAgICAgcmV0dXJuIChidWdfdGl0bGUsIGNvbW1lbnRfdGV4dCkKKworICAg
IGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBpZiBsZW4o
YXJncyk6CisgICAgICAgICAgICBpZiAobm90IHRvb2wuc2NtKCkuc3VwcG9ydHNfbG9jYWxfY29t
bWl0cygpKToKKyAgICAgICAgICAgICAgICBlcnJvcigiRXh0cmEgYXJndW1lbnRzIG5vdCBzdXBw
b3J0ZWQ7IHBhdGNoIGlzIHRha2VuIGZyb20gd29ya2luZyBkaXJlY3RvcnkuIikKKyAgICAgICAg
ICAgIHNlbGYuY3JlYXRlX2J1Z19mcm9tX2NvbW1pdChvcHRpb25zLCBhcmdzLCB0b29sKQorICAg
ICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVfYnVnX2Zyb21fcGF0Y2gob3B0aW9u
cywgYXJncywgdG9vbCkKKworCiBjbGFzcyBOb25XcmFwcGluZ0VwaWxvZ0luZGVudGVkSGVscEZv
cm1hdHRlcihJbmRlbnRlZEhlbHBGb3JtYXR0ZXIpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmKToK
ICAgICAgICAgSW5kZW50ZWRIZWxwRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYpCkBAIC00ODEsNiAr
NTUxLDcgQEAgY2xhc3MgQnVnemlsbGFUb29sOgogICAgICAgICAgICAgeyAnbmFtZScgOiAnYnVn
cy10by1jb21taXQnLCAnb2JqZWN0JyA6IEJ1Z3NJbkNvbW1pdFF1ZXVlKCkgfSwKICAgICAgICAg
ICAgIHsgJ25hbWUnIDogJ3BhdGNoZXMtdG8tY29tbWl0JywgJ29iamVjdCcgOiBQYXRjaGVzSW5D
b21taXRRdWV1ZSgpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICdyZXZpZXdlZC1wYXRjaGVz
JywgJ29iamVjdCcgOiBSZXZpZXdlZFBhdGNoZXNPbkJ1ZygpIH0sCisgICAgICAgICAgICB7ICdu
YW1lJyA6ICdjcmVhdGUtYnVnJywgJ29iamVjdCcgOiBDcmVhdGVCdWcoKSB9LAogICAgICAgICAg
ICAgeyAnbmFtZScgOiAnYXBwbHktcGF0Y2hlcycsICdvYmplY3QnIDogQXBwbHlQYXRjaGVzRnJv
bUJ1ZygpIH0sCiAgICAgICAgICAgICB7ICduYW1lJyA6ICdsYW5kLWRpZmYnLCAnb2JqZWN0JyA6
IExhbmRBbmRVcGRhdGVCdWcoKSB9LAogICAgICAgICAgICAgeyAnbmFtZScgOiAnbGFuZC1wYXRj
aGVzJywgJ29iamVjdCcgOiBMYW5kUGF0Y2hlc0Zyb21CdWdzKCkgfSwKZGlmZiAtLWdpdCBhL1dl
YktpdFRvb2xzL1NjcmlwdHMvbW9kdWxlcy9idWd6aWxsYS5weSBiL1dlYktpdFRvb2xzL1Njcmlw
dHMvbW9kdWxlcy9idWd6aWxsYS5weQppbmRleCBmYTU2ZDc4Li43YTkyN2ExIDEwMDY0NAotLS0g
YS9XZWJLaXRUb29scy9TY3JpcHRzL21vZHVsZXMvYnVnemlsbGEucHkKKysrIGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy9tb2R1bGVzL2J1Z3ppbGxhLnB5CkBAIC0yOTgsNiArMjk4LDU4IEBAIGNsYXNz
IEJ1Z3ppbGxhOgogICAgICAgICBzZWxmLmJyb3dzZXIuYWRkX2ZpbGUocGF0Y2hfZmlsZV9vYmpl
Y3QsICJ0ZXh0L3BsYWluIiwgImJ1Zy0lcy0lcy5wYXRjaCIgJSAoYnVnX2lkLCB0aW1lc3RhbXAo
KSkpCiAgICAgICAgIHNlbGYuYnJvd3Nlci5zdWJtaXQoKQogCisgICAgZGVmIHByb21wdF9mb3Jf
Y29tcG9uZW50KHNlbGYsIGNvbXBvbmVudHMpOgorICAgICAgICBsb2coIlBsZWFzZSBwaWNrIGEg
Y29tcG9uZW50OiIpCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBuYW1lIGluIGNvbXBvbmVu
dHM6CisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIGxvZygiJTJkLiAlcyIgJSAoaSwg
bmFtZSkpCisgICAgICAgIHJlc3VsdCA9IGludChyYXdfaW5wdXQoIkVudGVyIGEgbnVtYmVyOiAi
KSkgLSAxCisgICAgICAgIHJldHVybiBjb21wb25lbnRzW3Jlc3VsdF0KKworICAgIGRlZiBfY2hl
Y2tfY3JlYXRlX2J1Z19yZXNwb25zZShzZWxmLCByZXNwb25zZV9odG1sKToKKyAgICAgICAgbWF0
Y2ggPSByZS5zZWFyY2goIjx0aXRsZT5CdWcgKD9QPGJ1Z19pZD5cZCspIFN1Ym1pdHRlZDwvdGl0
bGU+IiwgcmVzcG9uc2VfaHRtbCkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXR1
cm4gbWF0Y2guZ3JvdXAoJ2J1Z19pZCcpCisKKyAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goJzxk
aXYgaWQ9ImJ1Z3ppbGxhLWJvZHkiPig/UDxlcnJvcl9tZXNzYWdlPi4rKTxkaXYgaWQ9ImZvb3Rl
ciI+JywgcmVzcG9uc2VfaHRtbCwgcmUuRE9UQUxMKQorICAgICAgICBlcnJvcl9tZXNzYWdlID0g
IkZBSUwiCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgdGV4dF9saW5lcyA9IEJlYXV0
aWZ1bFNvdXAobWF0Y2guZ3JvdXAoJ2Vycm9yX21lc3NhZ2UnKSkuZmluZEFsbCh0ZXh0PVRydWUp
CisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gIlxuIiArICdcbicuam9pbihbIiAgIiArIGxp
bmUuc3RyaXAoKSBmb3IgbGluZSBpbiB0ZXh0X2xpbmVzIGlmIGxpbmUuc3RyaXAoKV0pCisgICAg
ICAgIGVycm9yKCJCdWcgbm90IGNyZWF0ZWQ6ICVzIiAlIGVycm9yX21lc3NhZ2UpCisKKyAgICBk
ZWYgY3JlYXRlX2J1Z193aXRoX3BhdGNoKHNlbGYsIGJ1Z190aXRsZSwgYnVnX2Rlc2NyaXB0aW9u
LCBjb21wb25lbnQsIHBhdGNoX2ZpbGVfb2JqZWN0LCBwYXRjaF9kZXNjcmlwdGlvbiwgY2MsIG1h
cmtfZm9yX3Jldmlldz1GYWxzZSk6CisgICAgICAgIHNlbGYuYXV0aGVudGljYXRlKCkKKworICAg
ICAgICBsb2coJ0NyZWF0aW5nIGJ1ZyB3aXRoIHBhdGNoIGRlc2NyaXB0aW9uICIlcyInICUgcGF0
Y2hfZGVzY3JpcHRpb24pCisgICAgICAgIGlmIHNlbGYuZHJ5cnVuOgorICAgICAgICAgICAgbG9n
KGJ1Z19kZXNjcmlwdGlvbikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuYnJv
d3Nlci5vcGVuKHNlbGYuYnVnX3NlcnZlcl91cmwgKyAiZW50ZXJfYnVnLmNnaT9wcm9kdWN0PVdl
YktpdCIpCisgICAgICAgIHNlbGYuYnJvd3Nlci5zZWxlY3RfZm9ybShuYW1lPSJDcmVhdGUiKQor
ICAgICAgICBjb21wb25lbnRfaXRlbXMgPSBzZWxmLmJyb3dzZXIuZmluZF9jb250cm9sKCdjb21w
b25lbnQnKS5pdGVtcworICAgICAgICBjb21wb25lbnRfbmFtZXMgPSBtYXAobGFtYmRhIGl0ZW06
IGl0ZW0ubmFtZSwgY29tcG9uZW50X2l0ZW1zKQorICAgICAgICBpZiBub3QgY29tcG9uZW50IG9y
IGNvbXBvbmVudCBub3QgaW4gY29tcG9uZW50X25hbWVzOgorICAgICAgICAgICAgY29tcG9uZW50
ID0gc2VsZi5wcm9tcHRfZm9yX2NvbXBvbmVudChjb21wb25lbnRfbmFtZXMpCisgICAgICAgIHNl
bGYuYnJvd3NlclsnY29tcG9uZW50J10gPSBbY29tcG9uZW50XQorICAgICAgICBzZWxmLmJyb3dz
ZXJbJ2NjJ10gPSBjYworICAgICAgICBzZWxmLmJyb3dzZXJbJ3Nob3J0X2Rlc2MnXSA9IGJ1Z190
aXRsZQorICAgICAgICBpZiBidWdfZGVzY3JpcHRpb246CisgICAgICAgICAgICBsb2coYnVnX2Rl
c2NyaXB0aW9uKQorICAgICAgICAgICAgc2VsZi5icm93c2VyWydjb21tZW50J10gPSBidWdfZGVz
Y3JpcHRpb24KKyAgICAgICAgc2VsZi5icm93c2VyWydkZXNjcmlwdGlvbiddID0gcGF0Y2hfZGVz
Y3JpcHRpb24KKyAgICAgICAgc2VsZi5icm93c2VyWydpc3BhdGNoJ10gPSAoIjEiLCkKKyAgICAg
ICAgc2VsZi5icm93c2VyWydmbGFnX3R5cGUtMSddID0gKCc/JywpIGlmIG1hcmtfZm9yX3Jldmll
dyBlbHNlICgnWCcsKQorICAgICAgICBzZWxmLmJyb3dzZXIuYWRkX2ZpbGUocGF0Y2hfZmlsZV9v
YmplY3QsICJ0ZXh0L3BsYWluIiwgIiVzLnBhdGNoIiAlIHRpbWVzdGFtcCgpLCAnZGF0YScpCisg
ICAgICAgIHJlc3BvbnNlID0gc2VsZi5icm93c2VyLnN1Ym1pdCgpCisKKyAgICAgICAgYnVnX2lk
ID0gc2VsZi5fY2hlY2tfY3JlYXRlX2J1Z19yZXNwb25zZShyZXNwb25zZS5yZWFkKCkpCisgICAg
ICAgIGxvZygiQnVnICVzIGNyZWF0ZWQuIiAlIGJ1Z19pZCkKKyAgICAgICAgbG9nKHNlbGYuYnVn
X3NlcnZlcl91cmwgKyAic2hvd19idWcuY2dpP2lkPSIgKyBidWdfaWQpCisgICAgICAgIHJldHVy
biBidWdfaWQKKwogICAgIGRlZiBvYnNvbGV0ZV9hdHRhY2htZW50KHNlbGYsIGF0dGFjaG1lbnRf
aWQsIGNvbW1lbnRfdGV4dCA9IE5vbmUpOgogICAgICAgICBzZWxmLmF1dGhlbnRpY2F0ZSgp
</data>
<flag name="review"
          id="17911"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>