<?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>41842</bug_id>
          
          <creation_ts>2010-07-08 02:27:08 -0700</creation_ts>
          <short_desc>Add feature detection support for NRWT</short_desc>
          <delta_ts>2010-09-03 06:07:43 -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>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Gabor Rapcsanyi">rgabor</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abecsi</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dbates</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>ossy</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>248106</commentid>
    <comment_count>0</comment_count>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-07-08 02:27:08 -0700</bug_when>
    <thetext>Now the skipped tests for disabled features are hard-coded in WebKitPort.
Add a method for checking supported features (similar to ORWT) and use this functionality on the Qt port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>248112</commentid>
    <comment_count>1</comment_count>
      <attachid>60859</attachid>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-07-08 02:47:37 -0700</bug_when>
    <thetext>Created attachment 60859
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>248337</commentid>
    <comment_count>2</comment_count>
      <attachid>60859</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-07-08 10:52:18 -0700</bug_when>
    <thetext>Comment on attachment 60859
proposed patch

Please split this into smaller functions.  That&apos;s too much python in one function for my little brain.

Shouldn&apos;t symbols_for_tests be a class-level define anyway?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>248491</commentid>
    <comment_count>3</comment_count>
      <attachid>60859</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-07-08 13:33:08 -0700</bug_when>
    <thetext>Comment on attachment 60859
proposed patch

&gt; Index: WebKitTools/ChangeLog
&gt; ===================================================================
&gt; --- WebKitTools/ChangeLog	(revision 62768)
&gt; +++ WebKitTools/ChangeLog	(working copy)
&gt; @@ -1,3 +1,13 @@
&gt; +2010-07-08  Gabor Rapcsanyi  &lt;rgabor@inf.u-szeged.hu&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Add feature detection support to NRWT.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=41842
&gt; +
&gt; +        * Scripts/webkitpy/layout_tests/port/qt.py:
&gt; +        * Scripts/webkitpy/layout_tests/port/webkit.py:
&gt; +
&gt;  2010-07-07  Daniel Bates  &lt;dbates@rim.com&gt;
&gt;  
&gt;          Reviewed by Dumitru Daniliuc.
&gt; Index: WebKitTools/Scripts/webkitpy/layout_tests/port/qt.py
&gt; ===================================================================
&gt; --- WebKitTools/Scripts/webkitpy/layout_tests/port/qt.py	(revision 62768)
&gt; +++ WebKitTools/Scripts/webkitpy/layout_tests/port/qt.py	(working copy)
&gt; @@ -93,6 +93,11 @@ class QtPort(WebKitPort):
&gt;      def _path_to_driver(self):
&gt;          return self._build_path(&apos;bin/DumpRenderTree&apos;)
&gt;  
&gt; +    def _tests_for_disabled_features(self):
&gt; +        lib_path = self._build_path(&apos;lib/libQtWebKit.so&apos;)
&gt; +        disabled_tests = webkit.WebKitPort._tests_for_disabled_features(self)
&gt; +        return disabled_tests + self._check_for_unsupported_features(lib_path)
&gt; +
&gt;      def setup_environ_for_server(self):
&gt;          env = webkit.WebKitPort.setup_environ_for_server(self)
&gt;          env[&apos;QTWEBKIT_PLUGIN_PATH&apos;] = self._build_path(&apos;lib/plugins&apos;)
&gt; Index: WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py
&gt; ===================================================================
&gt; --- WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py	(revision 62768)
&gt; +++ WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py	(working copy)
&gt; @@ -1,5 +1,6 @@
&gt;  #!/usr/bin/env python
&gt;  # Copyright (C) 2010 Google Inc. All rights reserved.
&gt; +# Copyright (C) 2010 Gabor Rapcsanyi &lt;rgabor@inf.u-szeged.hu&gt;, University of Szeged
&gt;  #
&gt;  # Redistribution and use in source and binary forms, with or without
&gt;  # modification, are permitted provided that the following conditions are
&gt; @@ -217,6 +218,36 @@ class WebKitPort(base.Port):
&gt;              &quot;platform/win&quot;,
&gt;          ]
&gt;  
&gt; +    def _check_for_unsupported_features(self, lib_path):
&gt; +        # FIXME: Implement this for Windows.
&gt; +        if sys.platform in (&apos;cygwin&apos;, &apos;win32&apos;):
&gt; +            return []
&gt; +
&gt; +        nm_command = &quot;nm&quot;
&gt; +        symbols_for_tests = {
&gt; +            &quot;MathMLElement&quot;: [&quot;mathml&quot;],
&gt; +            &quot;GraphicsLayer&quot;: [&quot;compositing&quot;],
&gt; +            &quot;WebCoreHas3DRendering&quot;: [&quot;animations/3d&quot;, &quot;transforms/3d&quot;],
&gt; +            &quot;WebGLShader&quot;: [&quot;fast/canvas/webgl&quot;],
&gt; +            &quot;WMLElement&quot;: [&quot;http/tests/wml&quot;, &quot;fast/wml&quot;, &quot;wml&quot;],
&gt; +            &quot;parseWCSSInputProperty&quot;: [&quot;fast/wcss&quot;],
&gt; +            &quot;isXHTMLMPDocument&quot;: [&quot;fast/xhtmlmp&quot;],
&gt; +        }
&gt; +
&gt; +        skipped_directories = []
&gt; +        for feature in symbols_for_tests:
&gt; +            skipped_directories += symbols_for_tests[feature]
&gt; +
&gt; +        out = os.popen(nm_command + &quot; &quot; + lib_path)
&gt; +        for line in out.readlines():
&gt; +            for feature in symbols_for_tests.copy():
&gt; +                if feature in line:
&gt; +                    for dict in symbols_for_tests[feature]:
&gt; +                        skipped_directories.remove(dict)
&gt; +                    del symbols_for_tests[feature]
&gt; +
&gt; +        return skipped_directories
&gt; +
&gt;      def _tests_for_disabled_features(self):
&gt;          # FIXME: This should use the feature detection from
&gt;          # webkitperl/features.pm to match run-webkit-tests.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:221
 +      def _check_for_unsupported_features(self, lib_path):

I&apos;d probably rename this directories_to_skip().

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:227
 +          symbols_for_tests = {

I&apos;d probably rename this something like directories_by_symbol or directories_for_symbol

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:239
 +              skipped_directories += symbols_for_tests[feature]

And here I&apos;d be tempted to do something like:

    skipped_directories = reduce(operator.add, directories_by_symbol.values())

although that might be an obscurely functional thing to do; the longer version is:

    skipped_directories = []
    for dirs in directories_by_symbol.values():
        skipped_directories += dirs

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:243
 +              for feature in symbols_for_tests.copy():

I don&apos;t think you need the copy() here.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:247
 +                      del symbols_for_tests[feature]

I&apos;d probably rename &apos;line&apos; to &apos;library_symbol&apos; and &apos;feature&apos; to &apos;feature_symbol&apos;.

I&apos;d definitely rename &apos;dict&apos; to &apos;dir&apos; or &apos;directory&apos;, since it&apos;s a directory (a string), not a dict.

Otherwise, this looks good to me. I disagree with Eric that the function is too long; if anything, I think splitting up the logic might make it harder to follow. I could be convinced that symbols_for_tests should be returned from a separate function, if we thought different ports would have different lists, but I wouldn&apos;t refactor that until it was needed. One could argue that splitting the routine up might make it easier to test (since you don&apos;t have unit tests), but I&apos;m not sure that unit tests would actually test anything interesting, so I wouldn&apos;t buy into the argument.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>248911</commentid>
    <comment_count>4</comment_count>
      <attachid>61033</attachid>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-07-09 04:24:00 -0700</bug_when>
    <thetext>Created attachment 61033
proposed_patch_v2

I have renamed the variables that Dirk suggested.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:241
 +              for feature in symbols_for_tests.copy():

This .copy() need because I remove the elements from this dictionary.

As I saw in ORWT all port use these symbols.
Just cygwin use another way to find supported features.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>248913</commentid>
    <comment_count>5</comment_count>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-07-09 04:28:36 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 60859 [details])
&gt; Please split this into smaller functions.  That&apos;s too much python in one function for my little brain.
&gt; 
&gt; Shouldn&apos;t symbols_for_tests be a class-level define anyway?

If you want I can put symbols_for_tests to a separate function as Dirk said.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260467</commentid>
    <comment_count>6</comment_count>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-05 01:53:29 -0700</bug_when>
    <thetext>So, do you have any other suggestion for this patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260827</commentid>
    <comment_count>7</comment_count>
      <attachid>61033</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-05 13:50:52 -0700</bug_when>
    <thetext>Comment on attachment 61033
proposed_patch_v2

Maybe I&apos;m missing something, but I still don&apos;t think you need the copy on line 241 of webkit.py. There&apos;s no case where you would want to delete the directories from skipped_directories and then add them back in, and so there&apos;s no point in looking at the keys in directories_for_symbol over and over again if you&apos;ve deleted them. There&apos;s no correctness issue, but it&apos;s unnecessary (and slower).

Otherwise, LGTM (but I&apos;m not a reviewer).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261181</commentid>
    <comment_count>8</comment_count>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-06 04:09:32 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 61033 [details])
&gt; Maybe I&apos;m missing something, but I still don&apos;t think you need the copy on line 241 of webkit.py. There&apos;s no case where you would want to delete the directories from skipped_directories and then add them back in, and so there&apos;s no point in looking at the keys in directories_for_symbol over and over again if you&apos;ve deleted them. There&apos;s no correctness issue, but it&apos;s unnecessary (and slower).
&gt; 
&gt; Otherwise, LGTM (but I&apos;m not a reviewer).

Without of this .copy() the python throws this:
File &quot;WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py&quot;, line 241, in directories_to_skip
    for feature_symbol in directories_for_symbol:
RuntimeError: dictionary changed size during iteration</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261434</commentid>
    <comment_count>9</comment_count>
      <attachid>61033</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-06 13:45:00 -0700</bug_when>
    <thetext>Comment on attachment 61033
proposed_patch_v2

OK.  Seems we should implement this for the other webkit platforms as well.

directories_to_skip is a bad name, since it&apos;s about skipping directories for disabled features.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261435</commentid>
    <comment_count>10</comment_count>
      <attachid>61033</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-06 13:49:03 -0700</bug_when>
    <thetext>Comment on attachment 61033
proposed_patch_v2

With this implemented, we can also now remove some hacks in:
http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py#L220

Yeah, this is not the right layer.

Some platform-specific function should do the symbol search and return an array of symbols. Then webkit.py should do the lookup in the list of conversions.

The ports don&apos;t really have to do anything.  Except right now port and platform abstractions are mashed totether, so the port will ahve to act as the platform here, and do the search.

I would just implement this all in webkit.py, except for the library path lookup of course.

This is close, but not quite right.

Also, this needs unit tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261450</commentid>
    <comment_count>11</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-06 14:07:18 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt; (From update of attachment 61033 [details] [details])
&gt; &gt; Maybe I&apos;m missing something, but I still don&apos;t think you need the copy on line 241 of webkit.py. There&apos;s no case where you would want to delete the directories from skipped_directories and then add them back in, and so there&apos;s no point in looking at the keys in directories_for_symbol over and over again if you&apos;ve deleted them. There&apos;s no correctness issue, but it&apos;s unnecessary (and slower).
&gt; &gt; 
&gt; &gt; Otherwise, LGTM (but I&apos;m not a reviewer).
&gt; 
&gt; Without of this .copy() the python throws this:
&gt; File &quot;WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py&quot;, line 241, in directories_to_skip
&gt;     for feature_symbol in directories_for_symbol:
&gt; RuntimeError: dictionary changed size during iteration

Ah, right, you&apos;re mutating the list while iterating over it. My mistake :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261456</commentid>
    <comment_count>12</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-06 14:11:13 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 61033 [details])
&gt; With this implemented, we can also now remove some hacks in:
&gt; http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py#L220
&gt; 
&gt; Yeah, this is not the right layer.
&gt; 
&gt; Some platform-specific function should do the symbol search and return an array of symbols. Then webkit.py should do the lookup in the list of conversions.
&gt; 
&gt; The ports don&apos;t really have to do anything.  Except right now port and platform abstractions are mashed totether, so the port will ahve to act as the platform here, and do the search.
&gt; 
&gt; I would just implement this all in webkit.py, except for the library path lookup of course.
&gt; 
&gt; This is close, but not quite right.
&gt;

Eric, I&apos;m not sure I agree with (or at least understand) you here. This list of directories to skip can vary by both platform and port (webkit mac vs. webkit win, webkit win vs. chromium win), and the mechanism for figuring out the presence of a given feature can vary by either mechanism as well. So I&apos;m not sure what you mean by &quot;the ports don&apos;t really have to do anything&quot;?
 
&gt; Also, this needs unit tests.

This is probably true :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261459</commentid>
    <comment_count>13</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-06 14:17:52 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 61033 [details])
&gt; OK.  Seems we should implement this for the other webkit platforms as well.
&gt; 
&gt; directories_to_skip is a bad name, since it&apos;s about skipping directories for disabled features.

I think you can look at this a couple of different ways. One way to look at this is that all it is is a list of directories to skip, but the caller doesn&apos;t know why the port wants to skip them.

Another way is to make this a &quot;features to disable&quot; (or skip) call -- not directories -- and make the features-&gt;directory mapping generic (or at least a different, overridable call), and that would suggest a different name.

A third way is to think of this is as &quot;directories to skip because the features are disabled&quot;. Of course, that would be a really long method name, even by Eric&apos;s standards. It&apos;s not obvious to me what a better  name than &quot;directories_to_skip&quot; would be.

I&apos;m actually fine with any of the three approaches. The second is the most well-factored, but it might be overkill. 

Whatever you do pick, there should be a docstring describing the contract, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262577</commentid>
    <comment_count>14</comment_count>
      <attachid>63993</attachid>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-10 02:37:56 -0700</bug_when>
    <thetext>Created attachment 63993
proposed_patch_v3

There is no platform layer in NRWT. The WebKitPort (webkit.py) inherits from the BasePort (base.py). And the ports like QtPort (qt.py) inherits from WebKitPort. So we have to do the symbol search and etc. in webkit.py as you wrote.
I have changed the patch, now its checks Windows feature support. If other ports want to use on Linux, they just have to define the _path_to_library method like in Qt. On Win platform they have to define _path_to_driver and the Mac platform doesn&apos;t use feature detection.
If its ok for you I will make a unit test for it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263416</commentid>
    <comment_count>15</comment_count>
      <attachid>63993</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-11 13:03:19 -0700</bug_when>
    <thetext>Comment on attachment 63993
proposed_patch_v3

&gt; Index: WebKitTools/ChangeLog
&gt; ===================================================================
&gt; --- WebKitTools/ChangeLog	(revision 65059)
&gt; +++ WebKitTools/ChangeLog	(working copy)
&gt; @@ -1,3 +1,14 @@
&gt; +2010-08-10  Gabor Rapcsanyi  &lt;rgabor@inf.u-szeged.hu&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Add feature detection support to NRWT.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=41842
&gt; +
&gt; +        * Scripts/webkitpy/layout_tests/port/base.py:
&gt; +        * Scripts/webkitpy/layout_tests/port/qt.py:
&gt; +        * Scripts/webkitpy/layout_tests/port/webkit.py:
&gt; +
&gt;  2010-08-09  Antonio Gomes  &lt;tonikitoo@webkit.org&gt;
&gt;  
&gt;          Reviewed by Ariya Hidayat.
&gt; Index: WebKitTools/Scripts/webkitpy/layout_tests/port/base.py
&gt; ===================================================================
&gt; --- WebKitTools/Scripts/webkitpy/layout_tests/port/base.py	(revision 65057)
&gt; +++ WebKitTools/Scripts/webkitpy/layout_tests/port/base.py	(working copy)
&gt; @@ -659,6 +659,10 @@ class Port(object):
&gt;          &quot;&quot;&quot;Returns the full path to the test driver (DumpRenderTree).&quot;&quot;&quot;
&gt;          raise NotImplementedError(&apos;Port.path_to_driver&apos;)
&gt;  
&gt; +    def _path_to_library(self):
&gt; +        &quot;&quot;&quot;Returns the full path to library of WebKit.&quot;&quot;&quot;
&gt; +        raise NotImplementedError(&apos;Port.path_to_library&apos;)
&gt; +
&gt;      def _path_to_helper(self):
&gt;          &quot;&quot;&quot;Returns the full path to the layout_test_helper binary, which
&gt;          is used to help configure the system for the test run, or None
&gt; Index: WebKitTools/Scripts/webkitpy/layout_tests/port/qt.py
&gt; ===================================================================
&gt; --- WebKitTools/Scripts/webkitpy/layout_tests/port/qt.py	(revision 65057)
&gt; +++ WebKitTools/Scripts/webkitpy/layout_tests/port/qt.py	(working copy)
&gt; @@ -93,6 +93,9 @@ class QtPort(WebKitPort):
&gt;      def _path_to_driver(self):
&gt;          return self._build_path(&apos;bin/DumpRenderTree&apos;)
&gt;  
&gt; +    def _path_to_library(self):
&gt; +        return self._build_path(&apos;lib/libQtWebKit.so&apos;)
&gt; +
&gt;      def setup_environ_for_server(self):
&gt;          env = webkit.WebKitPort.setup_environ_for_server(self)
&gt;          env[&apos;QTWEBKIT_PLUGIN_PATH&apos;] = self._build_path(&apos;lib/plugins&apos;)
&gt; Index: WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py
&gt; ===================================================================
&gt; --- WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py	(revision 65057)
&gt; +++ WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py	(working copy)
&gt; @@ -1,5 +1,6 @@
&gt;  #!/usr/bin/env python
&gt;  # Copyright (C) 2010 Google Inc. All rights reserved.
&gt; +# Copyright (C) 2010 Gabor Rapcsanyi &lt;rgabor@inf.u-szeged.hu&gt;, University of Szeged
&gt;  #
&gt;  # Redistribution and use in source and binary forms, with or without
&gt;  # modification, are permitted provided that the following conditions are
&gt; @@ -217,6 +218,48 @@ class WebKitPort(base.Port):
&gt;              &quot;platform/win&quot;,
&gt;          ]
&gt;  
&gt; +    def get_supported_features_symbol(self):

I&apos;d probably call this &quot;get_supported_features_symbol_list&quot; or &quot;_symbols&quot;, since you&apos;re returning potentially multiple things. Also, this should have a docstring if you intend for it to be overridable; if you don&apos;t, it should probably have a leading underscore in the name. 

Given that in the non-win32 case you actually return *all* symbols and not just ones used to indicate supported features, some sort of docstring or comment about that being okay might be a good idea as well.

&gt; +        library_path = self._path_to_library()
&gt; +        driver_path = self._path_to_driver()
&gt; +
&gt; +        if sys.platform in (&apos;cygwin&apos;, &apos;win32&apos;) and driver_path:
&gt; +            symbol_list = os.popen(driver_path + &quot; --print-supported-features 2&gt;&amp;1&quot;).readlines()
&gt; +        elif library_path:
&gt; +            symbol_list = os.popen(&quot;nm &quot; + library_path).readlines()
&gt; +        else:
&gt; +            symbol_list = []
&gt; +
&gt; +        return symbol_list
&gt; +
&gt; +    def get_directories_for_symbol(self):
&gt; +        if sys.platform in (&apos;cygwin&apos;, &apos;win32&apos;):
&gt; +            directories_for_symbol = {
&gt; +                &quot;Accelerated Compositing&quot;: [&quot;compositing&quot;],
&gt; +                &quot;3D Rendering&quot;: [&quot;animations/3d&quot;, &quot;transforms/3d&quot;],
&gt; +            }
&gt; +        else:
&gt; +            directories_for_symbol = {
&gt; +                &quot;MathMLElement&quot;: [&quot;mathml&quot;],
&gt; +                &quot;GraphicsLayer&quot;: [&quot;compositing&quot;],
&gt; +                &quot;WebCoreHas3DRendering&quot;: [&quot;animations/3d&quot;, &quot;transforms/3d&quot;],
&gt; +                &quot;WebGLShader&quot;: [&quot;fast/canvas/webgl&quot;],
&gt; +                &quot;WMLElement&quot;: [&quot;http/tests/wml&quot;, &quot;fast/wml&quot;, &quot;wml&quot;],
&gt; +                &quot;parseWCSSInputProperty&quot;: [&quot;fast/wcss&quot;],
&gt; +                &quot;isXHTMLMPDocument&quot;: [&quot;fast/xhtmlmp&quot;],
&gt; +            }
&gt; +        return directories_for_symbol
&gt; +
&gt; +    def skipped_directories_for_unsupported_features(self):

Still needs a docstring.

&gt; +        symbol_list = self.get_supported_features_symbol()

This is nitpicking, but you could add:

    if not symbol_list:
        return []

here just to reduce the indentation levels. On the other hand, when would this ever be null? It looks like the rest of the code works fine even if this list is null, so this check could be an unnecessary (and slightly confusing) optimization.


&gt; +        directories_for_symbol = self.get_directories_for_symbol()
&gt; +        skipped_directories = []
&gt; +        if symbol_list:
&gt; +            for feature_symbol in directories_for_symbol:
&gt; +                symbol = [library_symbol for library_symbol in symbol_list if feature_symbol in library_symbol]

Maybe call this found_symbols to be a little clearer?

Otherwise this looks fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265484</commentid>
    <comment_count>16</comment_count>
      <attachid>64576</attachid>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-17 05:53:39 -0700</bug_when>
    <thetext>Created attachment 64576
proposed_patch_v4

I have made the changes what Dirk suggest, and add a unittest for it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265489</commentid>
    <comment_count>17</comment_count>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-17 06:02:42 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 63993 [details])
&gt; This is nitpicking, but you could add:
&gt; 
&gt;     if not symbol_list:
&gt;         return []
&gt; 
&gt; here just to reduce the indentation levels. On the other hand, when would this ever be null? It looks like the rest of the code works fine even if this list is null, so this check could be an unnecessary (and slightly confusing) optimization.
&gt; 
&gt; 
&gt; &gt; +        directories_for_symbol = self.get_directories_for_symbol()
&gt; &gt; +        skipped_directories = []
&gt; &gt; +        if symbol_list:
&gt; &gt; +            for feature_symbol in directories_for_symbol:
&gt; &gt; +                symbol = [library_symbol for library_symbol in symbol_list if feature_symbol in library_symbol]

This return [] is necessary because it puts all directory to skipped_directories if it doesn&apos;t find the symbols. So if the ports doesn&apos;t declare _path_to_library() method, all of the directories will be skipped without of this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265762</commentid>
    <comment_count>18</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-17 14:11:28 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; This return [] is necessary because it puts all directory to skipped_directories if it doesn&apos;t find the symbols. So if the ports doesn&apos;t declare _path_to_library() method, all of the directories will be skipped without of this.

Ah, right. Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265887</commentid>
    <comment_count>19</comment_count>
      <attachid>64576</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-08-17 18:19:27 -0700</bug_when>
    <thetext>Comment on attachment 64576
proposed_patch_v4

Ok, I see nothing that looks wrong and I trust Dirk&apos;s opinion that this is solid.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265909</commentid>
    <comment_count>20</comment_count>
      <attachid>64576</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-17 19:36:00 -0700</bug_when>
    <thetext>Comment on attachment 64576
proposed_patch_v4

WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:662
 +      def _path_to_library(self):
This should really be _path_to_webcore, since these symbols are searched for in WebCore, not WebKit on ports which don&apos;t build all-as one.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:228
 +              symbol_list = os.popen(driver_path + &quot; --print-supported-features 2&gt;&amp;1&quot;).readlines()
We actually want to move to this model for all ports.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:221
 +      def _get_supported_features_symbols(self):
This name doesnt&apos; make a lot of sense since it&apos;s not symbols on win32.  Seems like we should have a separate path for ports which use symbols vs. supported features, no?

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:239
 +          if sys.platform in (&apos;cygwin&apos;, &apos;win32&apos;):
Yeah, these are tottally separate code paths.  Lets not conflate them.

One unit test is not sufficient for this complexity of code.

This looks fine in general.  But please separate out the runtime list lookup vs. the symbol lookup. Basically we should try running &quot;print-supported-features&quot; and if that erros out, fall back to nm on all platforms (would be my suggestion).

Thank you so much for looking at this!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266076</commentid>
    <comment_count>21</comment_count>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-18 06:31:55 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (From update of attachment 64576 [details])
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:662
&gt;  +      def _path_to_library(self):
&gt; This should really be _path_to_webcore, since these symbols are searched for in WebCore, not WebKit on ports which don&apos;t build all-as one.
&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:228
&gt;  +              symbol_list = os.popen(driver_path + &quot; --print-supported-features 2&gt;&amp;1&quot;).readlines()
&gt; We actually want to move to this model for all ports.
&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:221
&gt;  +      def _get_supported_features_symbols(self):
&gt; This name doesnt&apos; make a lot of sense since it&apos;s not symbols on win32.  Seems like we should have a separate path for ports which use symbols vs. supported features, no?
&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:239
&gt;  +          if sys.platform in (&apos;cygwin&apos;, &apos;win32&apos;):
&gt; Yeah, these are tottally separate code paths.  Lets not conflate them.
&gt; 
&gt; One unit test is not sufficient for this complexity of code.
&gt; 
&gt; This looks fine in general.  But please separate out the runtime list lookup vs. the symbol lookup. Basically we should try running &quot;print-supported-features&quot; and if that erros out, fall back to nm on all platforms (would be my suggestion).
&gt; 
&gt; Thank you so much for looking at this!

Hi Eric!

This fall-back idea sounds good but on Qt and Gtk ports the DRT ignores this switch, gets going and blocks NRWT if we execute it, like if there only were a - switch.
If we want to do this I see two ways. Change all port&apos;s DRTs which are blocking with this switch, or make a more complex explicit DRT execution routine in a separate function.
What do you think about this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266142</commentid>
    <comment_count>22</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-18 09:06:02 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; This fall-back idea sounds good but on Qt and Gtk ports the DRT ignores this switch, gets going and blocks NRWT if we execute it, like if there only were a - switch.

Interesting.  I would have expected DRT to fail when passed switches it didn&apos;t recognize.  I figured most port would use get_opt which does all that standard behavior.

&gt; If we want to do this I see two ways. Change all port&apos;s DRTs which are blocking with this switch, or make a more complex explicit DRT execution routine in a separate function.

In that case, I would just have a _runtime_feature_list() function which runs DRT --print-supported-features by default, catches any errors and returns None.  Then on ports which don&apos;t support it, but don&apos;t know how to error, we can override to return None manually.  How does that sound?

&gt; What do you think about this?

I think making fancy fallback/decision logic is less important than simply separating the code paths.  The nm codepath will eventually be removed once all ports know how to do the --print-supported-features.

--print-supported-features (runtime feature detection) is important for us to move to, because it allows us to make a per-machine decision instead of a per-port decision.  For example, if the machine is not in PST, we can skip date-sensitive tests.  If the machine has a broken copy of some library, we can skip tests which depend on said library.  Both of these types of skips are currently hacked into the project in other ways.

Again, thank you very much for all your time on this.  Making NRWT better is *very* important as ORWT is way past needing replacement.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267896</commentid>
    <comment_count>23</comment_count>
      <attachid>65116</attachid>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-23 07:30:21 -0700</bug_when>
    <thetext>Created attachment 65116
proposed_patch_v5

I have applied the changes that Eric suggested.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267978</commentid>
    <comment_count>24</comment_count>
      <attachid>65116</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-23 10:26:55 -0700</bug_when>
    <thetext>Comment on attachment 65116
proposed_patch_v5

WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:662
 +      def _path_to_webcore(self):
This should probably be _path_to_webcore_library or _path_to_symboled_webcore_library?
Maybe it makes sense given how _path_to_driver is named?

WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:663
 +          &quot;&quot;&quot;Returns the full path to WebCore.&quot;&quot;&quot;
to a built copy of WebCore?

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:226
 +          if &quot;SupportedFeatures:&quot; in feature_list:
I&apos;m not sure I fully understand what this is going to return, but I guess the unit tests will tell me...

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:233
 +          symbol_list = os.popen(&quot;nm &quot; + webcore_path).readlines()
I think you mean &quot;nm&quot;, webcore_path instead of +  That will correctly handle spaces in webcore_path

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:236
 +      def _get_directories_for_features(self):
We don&apos;t normally use &quot;get&quot; in function names in WebKit.  I don&apos;t think PEP8 does either.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:271
 +          skipped_directories = []
nit: I would have moved this next to the later loop, since it isn&apos;t used before the early return.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:276
 +              found_feature = [feature_line for feature_line in feature_list if feature in feature_line]
No need to have found_feature as a local.  Just:
if not feature in feature_list:
would do the same, no?


WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:279
 +          return skipped_directories
In fact, if you wanted to use fancy list comprehensions, you could just do this:

return sum([directories[feature] for feature in directories.keys() if feature not in feature_list])

Perhaps with better names that would be less confusing.  I&apos;m not sure.

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:259
 +      def _skipped_directories_for_unsupported_features(self):
I don&apos;t think this really needs to be limited to directories.  It could just be skipped_tests_for_unsupported_features or skipped_tests_for_disabled_features

WebKitTools/Scripts/webkitpy/layout_tests/port/webkit_unittest.py:52
 +          all_directory = reduce(operator.add, directories_for_symbols.values())
This is the same as sum(), but reduce(operatore.add might be more clear.  either way is fine.

I had difficulty understanding your unit tests.  I probably need to just look again, but maybe sharing more code between them would make them easier to parse.

Either way, I think this needs one more round.

Thank you again for all your hard work on this!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>268582</commentid>
    <comment_count>25</comment_count>
      <attachid>65280</attachid>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-24 09:04:57 -0700</bug_when>
    <thetext>Created attachment 65280
proposed_patch_v6</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>268583</commentid>
    <comment_count>26</comment_count>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-08-24 09:06:25 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; (From update of attachment 65116 [details])
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:662
&gt;  +      def _path_to_webcore(self):
&gt; This should probably be _path_to_webcore_library or _path_to_symboled_webcore_library?
&gt; Maybe it makes sense given how _path_to_driver is named?
&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:663
&gt;  +          &quot;&quot;&quot;Returns the full path to WebCore.&quot;&quot;&quot;
&gt; to a built copy of WebCore?

corrected


&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:226
&gt;  +          if &quot;SupportedFeatures:&quot; in feature_list:
&gt; I&apos;m not sure I fully understand what this is going to return, but I guess the unit tests will tell me...
&gt; 

On Win port the DRT prints that first and after print the supported features. Other port&apos;s DRTs should do the same when they implement this feature.
If we don&apos;t do this check and it returns with an error message all directories will be skipped from directories_for_features.


&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:233
&gt;  +          symbol_list = os.popen(&quot;nm &quot; + webcore_path).readlines()
&gt; I think you mean &quot;nm&quot;, webcore_path instead of +  That will correctly handle spaces in webcore_path
&gt; 

It throws invalid argument error with that comma.


&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:236
&gt;  +      def _get_directories_for_features(self):
&gt; We don&apos;t normally use &quot;get&quot; in function names in WebKit.  I don&apos;t think PEP8 does either.
&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:271
&gt;  +          skipped_directories = []
&gt; nit: I would have moved this next to the later loop, since it isn&apos;t used before the early return.
&gt; 

corrected


&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:276
&gt;  +              found_feature = [feature_line for feature_line in feature_list if feature in feature_line]
&gt; No need to have found_feature as a local.  Just:
&gt; if not feature in feature_list:
&gt; would do the same, no?
&gt; 
&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:279
&gt;  +          return skipped_directories
&gt; In fact, if you wanted to use fancy list comprehensions, you could just do this:
&gt; 
&gt; return sum([directories[feature] for feature in directories.keys() if feature not in feature_list])
&gt; 
&gt; Perhaps with better names that would be less confusing.  I&apos;m not sure.
&gt; 

corrected


&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py:259
&gt;  +      def _skipped_directories_for_unsupported_features(self):
&gt; I don&apos;t think this really needs to be limited to directories.  It could just be skipped_tests_for_unsupported_features or skipped_tests_for_disabled_features
&gt; 

renamed


&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/webkit_unittest.py:52
&gt;  +          all_directory = reduce(operator.add, directories_for_symbols.values())
&gt; This is the same as sum(), but reduce(operatore.add might be more clear.  either way is fine.
&gt; 
&gt; I had difficulty understanding your unit tests.  I probably need to just look again, but maybe sharing more code between them would make them easier to parse.
&gt; 

I have changed it. Now its more readable and better for unit testing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273478</commentid>
    <comment_count>27</comment_count>
      <attachid>65280</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-09-02 11:56:30 -0700</bug_when>
    <thetext>Comment on attachment 65280
proposed_patch_v6

So exciting!  Thank you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273519</commentid>
    <comment_count>28</comment_count>
      <attachid>65280</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-02 13:10:38 -0700</bug_when>
    <thetext>Comment on attachment 65280
proposed_patch_v6

Rejecting patch 65280 from commit-queue.

Failed to run &quot;[&apos;WebKitTools/Scripts/test-webkitpy&apos;]&quot; exit_code: 1
Last 500 characters of output:
.py&quot;, line 269, in _skipped_tests_for_unsupported_features
    feature_list = self._supported_symbol_list()
  File &quot;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py&quot;, line 234, in _supported_symbol_list
    symbol_list = &apos; &apos;.join(os.popen(&quot;nm &quot; + webcore_library_path).readlines())
TypeError: cannot concatenate &apos;str&apos; and &apos;NoneType&apos; objects

----------------------------------------------------------------------
Ran 545 tests in 9.058s

FAILED (errors=1)

Full output: http://queues.webkit.org/results/3903061</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273900</commentid>
    <comment_count>29</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2010-09-03 06:01:22 -0700</bug_when>
    <thetext>Committed r66727: &lt;http://trac.webkit.org/changeset/66727&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273902</commentid>
    <comment_count>30</comment_count>
      <attachid>65280</attachid>
    <who name="Gabor Rapcsanyi">rgabor</who>
    <bug_when>2010-09-03 06:07:43 -0700</bug_when>
    <thetext>Comment on attachment 65280
proposed_patch_v6

clearing flags
landed patch after fix</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>60859</attachid>
            <date>2010-07-08 02:47:37 -0700</date>
            <delta_ts>2010-07-09 04:24:00 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>patch_feature_detection</filename>
            <type>text/plain</type>
            <size>3486</size>
            <attacher name="Gabor Rapcsanyi">rgabor</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDYyNzY4KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDctMDggIEdhYm9yIFJhcGNzYW55aSAg
PHJnYWJvckBpbmYudS1zemVnZWQuaHU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGZlYXR1cmUgZGV0ZWN0aW9uIHN1cHBvcnQgdG8gTlJXVC4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQxODQyCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3F0LnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5OgorCiAy
MDEwLTA3LTA3ICBEYW5pZWwgQmF0ZXMgIDxkYmF0ZXNAcmltLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEdW1pdHJ1IERhbmlsaXVjLgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3F0LnB5CShyZXZpc2lvbiA2Mjc2OCkK
KysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvcXQucHkJ
KHdvcmtpbmcgY29weSkKQEAgLTkzLDYgKzkzLDExIEBAIGNsYXNzIFF0UG9ydChXZWJLaXRQb3J0
KToKICAgICBkZWYgX3BhdGhfdG9fZHJpdmVyKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5f
YnVpbGRfcGF0aCgnYmluL0R1bXBSZW5kZXJUcmVlJykKIAorICAgIGRlZiBfdGVzdHNfZm9yX2Rp
c2FibGVkX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICBsaWJfcGF0aCA9IHNlbGYuX2J1aWxkX3Bh
dGgoJ2xpYi9saWJRdFdlYktpdC5zbycpCisgICAgICAgIGRpc2FibGVkX3Rlc3RzID0gd2Via2l0
LldlYktpdFBvcnQuX3Rlc3RzX2Zvcl9kaXNhYmxlZF9mZWF0dXJlcyhzZWxmKQorICAgICAgICBy
ZXR1cm4gZGlzYWJsZWRfdGVzdHMgKyBzZWxmLl9jaGVja19mb3JfdW5zdXBwb3J0ZWRfZmVhdHVy
ZXMobGliX3BhdGgpCisKICAgICBkZWYgc2V0dXBfZW52aXJvbl9mb3Jfc2VydmVyKHNlbGYpOgog
ICAgICAgICBlbnYgPSB3ZWJraXQuV2ViS2l0UG9ydC5zZXR1cF9lbnZpcm9uX2Zvcl9zZXJ2ZXIo
c2VsZikKICAgICAgICAgZW52WydRVFdFQktJVF9QTFVHSU5fUEFUSCddID0gc2VsZi5fYnVpbGRf
cGF0aCgnbGliL3BsdWdpbnMnKQpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHJldmlzaW9uIDYyNzY4
KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJr
aXQucHkJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAjIS91c3IvYmluL2VudiBweXRo
b24KICMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisjIENvcHlyaWdodCAoQykgMjAxMCBHYWJvciBSYXBjc2FueWkgPHJnYWJvckBpbmYudS1zemVn
ZWQuaHU+LCBVbml2ZXJzaXR5IG9mIFN6ZWdlZAogIwogIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQpAQCAtMjE3LDYgKzIxOCwzNiBAQCBjbGFzcyBXZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAg
ICAgICAgICAgICAicGxhdGZvcm0vd2luIiwKICAgICAgICAgXQogCisgICAgZGVmIF9jaGVja19m
b3JfdW5zdXBwb3J0ZWRfZmVhdHVyZXMoc2VsZiwgbGliX3BhdGgpOgorICAgICAgICAjIEZJWE1F
OiBJbXBsZW1lbnQgdGhpcyBmb3IgV2luZG93cy4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGlu
ICgnY3lnd2luJywgJ3dpbjMyJyk6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBu
bV9jb21tYW5kID0gIm5tIgorICAgICAgICBzeW1ib2xzX2Zvcl90ZXN0cyA9IHsKKyAgICAgICAg
ICAgICJNYXRoTUxFbGVtZW50IjogWyJtYXRobWwiXSwKKyAgICAgICAgICAgICJHcmFwaGljc0xh
eWVyIjogWyJjb21wb3NpdGluZyJdLAorICAgICAgICAgICAgIldlYkNvcmVIYXMzRFJlbmRlcmlu
ZyI6IFsiYW5pbWF0aW9ucy8zZCIsICJ0cmFuc2Zvcm1zLzNkIl0sCisgICAgICAgICAgICAiV2Vi
R0xTaGFkZXIiOiBbImZhc3QvY2FudmFzL3dlYmdsIl0sCisgICAgICAgICAgICAiV01MRWxlbWVu
dCI6IFsiaHR0cC90ZXN0cy93bWwiLCAiZmFzdC93bWwiLCAid21sIl0sCisgICAgICAgICAgICAi
cGFyc2VXQ1NTSW5wdXRQcm9wZXJ0eSI6IFsiZmFzdC93Y3NzIl0sCisgICAgICAgICAgICAiaXNY
SFRNTE1QRG9jdW1lbnQiOiBbImZhc3QveGh0bWxtcCJdLAorICAgICAgICB9CisKKyAgICAgICAg
c2tpcHBlZF9kaXJlY3RvcmllcyA9IFtdCisgICAgICAgIGZvciBmZWF0dXJlIGluIHN5bWJvbHNf
Zm9yX3Rlc3RzOgorICAgICAgICAgICAgc2tpcHBlZF9kaXJlY3RvcmllcyArPSBzeW1ib2xzX2Zv
cl90ZXN0c1tmZWF0dXJlXQorCisgICAgICAgIG91dCA9IG9zLnBvcGVuKG5tX2NvbW1hbmQgKyAi
ICIgKyBsaWJfcGF0aCkKKyAgICAgICAgZm9yIGxpbmUgaW4gb3V0LnJlYWRsaW5lcygpOgorICAg
ICAgICAgICAgZm9yIGZlYXR1cmUgaW4gc3ltYm9sc19mb3JfdGVzdHMuY29weSgpOgorICAgICAg
ICAgICAgICAgIGlmIGZlYXR1cmUgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRp
Y3QgaW4gc3ltYm9sc19mb3JfdGVzdHNbZmVhdHVyZV06CisgICAgICAgICAgICAgICAgICAgICAg
ICBza2lwcGVkX2RpcmVjdG9yaWVzLnJlbW92ZShkaWN0KQorICAgICAgICAgICAgICAgICAgICBk
ZWwgc3ltYm9sc19mb3JfdGVzdHNbZmVhdHVyZV0KKworICAgICAgICByZXR1cm4gc2tpcHBlZF9k
aXJlY3RvcmllcworCiAgICAgZGVmIF90ZXN0c19mb3JfZGlzYWJsZWRfZmVhdHVyZXMoc2VsZik6
CiAgICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgZmVhdHVyZSBkZXRlY3Rpb24g
ZnJvbQogICAgICAgICAjIHdlYmtpdHBlcmwvZmVhdHVyZXMucG0gdG8gbWF0Y2ggcnVuLXdlYmtp
dC10ZXN0cy4K
</data>
<flag name="review"
          id="48656"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>61033</attachid>
            <date>2010-07-09 04:24:00 -0700</date>
            <delta_ts>2010-08-10 02:37:56 -0700</delta_ts>
            <desc>proposed_patch_v2</desc>
            <filename>patch_feature_detection02</filename>
            <type>text/plain</type>
            <size>3360</size>
            <attacher name="Gabor Rapcsanyi">rgabor</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDYyOTA0KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDctMDkgIEdhYm9yIFJhcGNzYW55aSAg
PHJnYWJvckBpbmYudS1zemVnZWQuaHU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGZlYXR1cmUgZGV0ZWN0aW9uIHN1cHBvcnQgdG8gTlJXVC4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQxODQyCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3F0LnB5OgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5OgorCiAy
MDEwLTA3LTA4ICBTaW1vbiBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBwbGUuY29tPgogCiAgICAg
ICAgIEZpeCBUaWdlciBwbHVnaW4gdGVzdCBmYWlsdXJlczsgdGhlICNpZmRlZnMgd2VyZSBpbmNv
cnJlY3QsIHJlc3VsdGluZwpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvcG9ydC9xdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3F0LnB5CShyZXZpc2lvbiA2Mjg5OCkKKysrIFdlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvcXQucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTkzLDYgKzkzLDExIEBAIGNsYXNzIFF0UG9ydChXZWJLaXRQb3J0KToKICAgICBk
ZWYgX3BhdGhfdG9fZHJpdmVyKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRfcGF0
aCgnYmluL0R1bXBSZW5kZXJUcmVlJykKIAorICAgIGRlZiBfdGVzdHNfZm9yX2Rpc2FibGVkX2Zl
YXR1cmVzKHNlbGYpOgorICAgICAgICBsaWJfcGF0aCA9IHNlbGYuX2J1aWxkX3BhdGgoJ2xpYi9s
aWJRdFdlYktpdC5zbycpCisgICAgICAgIGRpc2FibGVkX3Rlc3RzID0gd2Via2l0LldlYktpdFBv
cnQuX3Rlc3RzX2Zvcl9kaXNhYmxlZF9mZWF0dXJlcyhzZWxmKQorICAgICAgICByZXR1cm4gZGlz
YWJsZWRfdGVzdHMgKyBzZWxmLmRpcmVjdG9yaWVzX3RvX3NraXAobGliX3BhdGgpCisKICAgICBk
ZWYgc2V0dXBfZW52aXJvbl9mb3Jfc2VydmVyKHNlbGYpOgogICAgICAgICBlbnYgPSB3ZWJraXQu
V2ViS2l0UG9ydC5zZXR1cF9lbnZpcm9uX2Zvcl9zZXJ2ZXIoc2VsZikKICAgICAgICAgZW52WydR
VFdFQktJVF9QTFVHSU5fUEFUSCddID0gc2VsZi5fYnVpbGRfcGF0aCgnbGliL3BsdWdpbnMnKQpJ
bmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJr
aXQucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC93ZWJraXQucHkJKHJldmlzaW9uIDYyODk4KQorKysgV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHdvcmtpbmcgY29weSkK
QEAgLTQxLDYgKzQxLDcgQEAgaW1wb3J0IHNpZ25hbAogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUK
IGltcG9ydCB3ZWJicm93c2VyCitpbXBvcnQgb3BlcmF0b3IKIAogZnJvbSB3ZWJraXRweS5jb21t
b24uc3lzdGVtLmV4ZWN1dGl2ZSBpbXBvcnQgRXhlY3V0aXZlCiAKQEAgLTIxNyw2ICsyMTgsMzQg
QEAgY2xhc3MgV2ViS2l0UG9ydChiYXNlLlBvcnQpOgogICAgICAgICAgICAgInBsYXRmb3JtL3dp
biIsCiAgICAgICAgIF0KIAorICAgIGRlZiBkaXJlY3Rvcmllc190b19za2lwKHNlbGYsIGxpYl9w
YXRoKToKKyAgICAgICAgIyBGSVhNRTogSW1wbGVtZW50IHRoaXMgZm9yIFdpbmRvd3MuCisgICAg
ICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ2N5Z3dpbicsICd3aW4zMicpOgorICAgICAgICAgICAg
cmV0dXJuIFtdCisKKyAgICAgICAgbm1fY29tbWFuZCA9ICJubSIKKyAgICAgICAgZGlyZWN0b3Jp
ZXNfZm9yX3N5bWJvbCA9IHsKKyAgICAgICAgICAgICJNYXRoTUxFbGVtZW50IjogWyJtYXRobWwi
XSwKKyAgICAgICAgICAgICJHcmFwaGljc0xheWVyIjogWyJjb21wb3NpdGluZyJdLAorICAgICAg
ICAgICAgIldlYkNvcmVIYXMzRFJlbmRlcmluZyI6IFsiYW5pbWF0aW9ucy8zZCIsICJ0cmFuc2Zv
cm1zLzNkIl0sCisgICAgICAgICAgICAiV2ViR0xTaGFkZXIiOiBbImZhc3QvY2FudmFzL3dlYmds
Il0sCisgICAgICAgICAgICAiV01MRWxlbWVudCI6IFsiaHR0cC90ZXN0cy93bWwiLCAiZmFzdC93
bWwiLCAid21sIl0sCisgICAgICAgICAgICAicGFyc2VXQ1NTSW5wdXRQcm9wZXJ0eSI6IFsiZmFz
dC93Y3NzIl0sCisgICAgICAgICAgICAiaXNYSFRNTE1QRG9jdW1lbnQiOiBbImZhc3QveGh0bWxt
cCJdLAorICAgICAgICB9CisKKyAgICAgICAgc2tpcHBlZF9kaXJlY3RvcmllcyA9IHJlZHVjZShv
cGVyYXRvci5hZGQsIGRpcmVjdG9yaWVzX2Zvcl9zeW1ib2wudmFsdWVzKCkpCisKKyAgICAgICAg
b3V0ID0gb3MucG9wZW4obm1fY29tbWFuZCArICIgIiArIGxpYl9wYXRoKQorICAgICAgICBmb3Ig
bGlicmFyeV9zeW1ib2wgaW4gb3V0LnJlYWRsaW5lcygpOgorICAgICAgICAgICAgZm9yIGZlYXR1
cmVfc3ltYm9sIGluIGRpcmVjdG9yaWVzX2Zvcl9zeW1ib2wuY29weSgpOgorICAgICAgICAgICAg
ICAgIGlmIGZlYXR1cmVfc3ltYm9sIGluIGxpYnJhcnlfc3ltYm9sOgorICAgICAgICAgICAgICAg
ICAgICBmb3IgZGlyZWN0b3J5IGluIGRpcmVjdG9yaWVzX2Zvcl9zeW1ib2xbZmVhdHVyZV9zeW1i
b2xdOgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZF9kaXJlY3Rvcmllcy5yZW1vdmUo
ZGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICBkZWwgZGlyZWN0b3JpZXNfZm9yX3N5bWJv
bFtmZWF0dXJlX3N5bWJvbF0KKworICAgICAgICByZXR1cm4gc2tpcHBlZF9kaXJlY3Rvcmllcwor
CiAgICAgZGVmIF90ZXN0c19mb3JfZGlzYWJsZWRfZmVhdHVyZXMoc2VsZik6CiAgICAgICAgICMg
RklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgZmVhdHVyZSBkZXRlY3Rpb24gZnJvbQogICAgICAg
ICAjIHdlYmtpdHBlcmwvZmVhdHVyZXMucG0gdG8gbWF0Y2ggcnVuLXdlYmtpdC10ZXN0cy4K
</data>
<flag name="review"
          id="48977"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63993</attachid>
            <date>2010-08-10 02:37:56 -0700</date>
            <delta_ts>2010-08-17 05:53:39 -0700</delta_ts>
            <desc>proposed_patch_v3</desc>
            <filename>nrwt_features_new</filename>
            <type>text/plain</type>
            <size>5569</size>
            <attacher name="Gabor Rapcsanyi">rgabor</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDY1MDU5KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTAtMDgtMTAgIEdhYm9yIFJhcGNzYW55aSAg
PHJnYWJvckBpbmYudS1zemVnZWQuaHU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGZlYXR1cmUgZGV0ZWN0aW9uIHN1cHBvcnQgdG8gTlJXVC4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQxODQyCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weToKKwogMjAx
MC0wOC0wOSAgQW50b25pbyBHb21lcyAgPHRvbmlraXRvb0B3ZWJraXQub3JnPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IEFyaXlhIEhpZGF5YXQuCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CShyZXZpc2lvbiA2
NTA1NykKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQv
YmFzZS5weQkod29ya2luZyBjb3B5KQpAQCAtNjU5LDYgKzY1OSwxMCBAQCBjbGFzcyBQb3J0KG9i
amVjdCk6CiAgICAgICAgICIiIlJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgdGVzdCBkcml2
ZXIgKER1bXBSZW5kZXJUcmVlKS4iIiIKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJv
cignUG9ydC5wYXRoX3RvX2RyaXZlcicpCiAKKyAgICBkZWYgX3BhdGhfdG9fbGlicmFyeShzZWxm
KToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIGxpYnJhcnkgb2YgV2ViS2l0
LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0LnBhdGhfdG9fbGli
cmFyeScpCisKICAgICBkZWYgX3BhdGhfdG9faGVscGVyKHNlbGYpOgogICAgICAgICAiIiJSZXR1
cm5zIHRoZSBmdWxsIHBhdGggdG8gdGhlIGxheW91dF90ZXN0X2hlbHBlciBiaW5hcnksIHdoaWNo
CiAgICAgICAgIGlzIHVzZWQgdG8gaGVscCBjb25maWd1cmUgdGhlIHN5c3RlbSBmb3IgdGhlIHRl
c3QgcnVuLCBvciBOb25lCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9wb3J0L3F0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvcXQucHkJKHJldmlzaW9uIDY1MDU3KQorKysgV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5weQkod29ya2luZyBj
b3B5KQpAQCAtOTMsNiArOTMsOSBAQCBjbGFzcyBRdFBvcnQoV2ViS2l0UG9ydCk6CiAgICAgZGVm
IF9wYXRoX3RvX2RyaXZlcihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3BhdGgo
J2Jpbi9EdW1wUmVuZGVyVHJlZScpCiAKKyAgICBkZWYgX3BhdGhfdG9fbGlicmFyeShzZWxmKToK
KyAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3BhdGgoJ2xpYi9saWJRdFdlYktpdC5zbycpCisK
ICAgICBkZWYgc2V0dXBfZW52aXJvbl9mb3Jfc2VydmVyKHNlbGYpOgogICAgICAgICBlbnYgPSB3
ZWJraXQuV2ViS2l0UG9ydC5zZXR1cF9lbnZpcm9uX2Zvcl9zZXJ2ZXIoc2VsZikKICAgICAgICAg
ZW52WydRVFdFQktJVF9QTFVHSU5fUEFUSCddID0gc2VsZi5fYnVpbGRfcGF0aCgnbGliL3BsdWdp
bnMnKQpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9y
dC93ZWJraXQucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHJldmlzaW9uIDY1MDU3KQorKysgV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTEsNSArMSw2IEBACiAjIS91c3IvYmluL2VudiBweXRob24KICMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAo
QykgMjAxMCBHYWJvciBSYXBjc2FueWkgPHJnYWJvckBpbmYudS1zemVnZWQuaHU+LCBVbml2ZXJz
aXR5IG9mIFN6ZWdlZAogIwogIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjE3LDYg
KzIxOCw0OCBAQCBjbGFzcyBXZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAgICAgICAicGxh
dGZvcm0vd2luIiwKICAgICAgICAgXQogCisgICAgZGVmIGdldF9zdXBwb3J0ZWRfZmVhdHVyZXNf
c3ltYm9sKHNlbGYpOgorICAgICAgICBsaWJyYXJ5X3BhdGggPSBzZWxmLl9wYXRoX3RvX2xpYnJh
cnkoKQorICAgICAgICBkcml2ZXJfcGF0aCA9IHNlbGYuX3BhdGhfdG9fZHJpdmVyKCkKKworICAg
ICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdjeWd3aW4nLCAnd2luMzInKSBhbmQgZHJpdmVyX3Bh
dGg6CisgICAgICAgICAgICBzeW1ib2xfbGlzdCA9IG9zLnBvcGVuKGRyaXZlcl9wYXRoICsgIiAt
LXByaW50LXN1cHBvcnRlZC1mZWF0dXJlcyAyPiYxIikucmVhZGxpbmVzKCkKKyAgICAgICAgZWxp
ZiBsaWJyYXJ5X3BhdGg6CisgICAgICAgICAgICBzeW1ib2xfbGlzdCA9IG9zLnBvcGVuKCJubSAi
ICsgbGlicmFyeV9wYXRoKS5yZWFkbGluZXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAg
c3ltYm9sX2xpc3QgPSBbXQorCisgICAgICAgIHJldHVybiBzeW1ib2xfbGlzdAorCisgICAgZGVm
IGdldF9kaXJlY3Rvcmllc19mb3Jfc3ltYm9sKHNlbGYpOgorICAgICAgICBpZiBzeXMucGxhdGZv
cm0gaW4gKCdjeWd3aW4nLCAnd2luMzInKToKKyAgICAgICAgICAgIGRpcmVjdG9yaWVzX2Zvcl9z
eW1ib2wgPSB7CisgICAgICAgICAgICAgICAgIkFjY2VsZXJhdGVkIENvbXBvc2l0aW5nIjogWyJj
b21wb3NpdGluZyJdLAorICAgICAgICAgICAgICAgICIzRCBSZW5kZXJpbmciOiBbImFuaW1hdGlv
bnMvM2QiLCAidHJhbnNmb3Jtcy8zZCJdLAorICAgICAgICAgICAgfQorICAgICAgICBlbHNlOgor
ICAgICAgICAgICAgZGlyZWN0b3JpZXNfZm9yX3N5bWJvbCA9IHsKKyAgICAgICAgICAgICAgICAi
TWF0aE1MRWxlbWVudCI6IFsibWF0aG1sIl0sCisgICAgICAgICAgICAgICAgIkdyYXBoaWNzTGF5
ZXIiOiBbImNvbXBvc2l0aW5nIl0sCisgICAgICAgICAgICAgICAgIldlYkNvcmVIYXMzRFJlbmRl
cmluZyI6IFsiYW5pbWF0aW9ucy8zZCIsICJ0cmFuc2Zvcm1zLzNkIl0sCisgICAgICAgICAgICAg
ICAgIldlYkdMU2hhZGVyIjogWyJmYXN0L2NhbnZhcy93ZWJnbCJdLAorICAgICAgICAgICAgICAg
ICJXTUxFbGVtZW50IjogWyJodHRwL3Rlc3RzL3dtbCIsICJmYXN0L3dtbCIsICJ3bWwiXSwKKyAg
ICAgICAgICAgICAgICAicGFyc2VXQ1NTSW5wdXRQcm9wZXJ0eSI6IFsiZmFzdC93Y3NzIl0sCisg
ICAgICAgICAgICAgICAgImlzWEhUTUxNUERvY3VtZW50IjogWyJmYXN0L3hodG1sbXAiXSwKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzX2Zvcl9zeW1ib2wKKworICAg
IGRlZiBza2lwcGVkX2RpcmVjdG9yaWVzX2Zvcl91bnN1cHBvcnRlZF9mZWF0dXJlcyhzZWxmKToK
KyAgICAgICAgc3ltYm9sX2xpc3QgPSBzZWxmLmdldF9zdXBwb3J0ZWRfZmVhdHVyZXNfc3ltYm9s
KCkKKyAgICAgICAgZGlyZWN0b3JpZXNfZm9yX3N5bWJvbCA9IHNlbGYuZ2V0X2RpcmVjdG9yaWVz
X2Zvcl9zeW1ib2woKQorICAgICAgICBza2lwcGVkX2RpcmVjdG9yaWVzID0gW10KKyAgICAgICAg
aWYgc3ltYm9sX2xpc3Q6CisgICAgICAgICAgICBmb3IgZmVhdHVyZV9zeW1ib2wgaW4gZGlyZWN0
b3JpZXNfZm9yX3N5bWJvbDoKKyAgICAgICAgICAgICAgICBzeW1ib2wgPSBbbGlicmFyeV9zeW1i
b2wgZm9yIGxpYnJhcnlfc3ltYm9sIGluIHN5bWJvbF9saXN0IGlmIGZlYXR1cmVfc3ltYm9sIGlu
IGxpYnJhcnlfc3ltYm9sXQorICAgICAgICAgICAgICAgIGlmIG5vdCBzeW1ib2w6CisgICAgICAg
ICAgICAgICAgICAgIHNraXBwZWRfZGlyZWN0b3JpZXMuZXh0ZW5kKGRpcmVjdG9yaWVzX2Zvcl9z
eW1ib2xbZmVhdHVyZV9zeW1ib2xdKQorICAgICAgICByZXR1cm4gc2tpcHBlZF9kaXJlY3Rvcmll
cworCiAgICAgZGVmIF90ZXN0c19mb3JfZGlzYWJsZWRfZmVhdHVyZXMoc2VsZik6CiAgICAgICAg
ICMgRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgZmVhdHVyZSBkZXRlY3Rpb24gZnJvbQogICAg
ICAgICAjIHdlYmtpdHBlcmwvZmVhdHVyZXMucG0gdG8gbWF0Y2ggcnVuLXdlYmtpdC10ZXN0cy4K
QEAgLTIzOCw3ICsyODEsOCBAQCBjbGFzcyBXZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAg
ICAgICAiaHR0cC90ZXN0cy93ZWJhcmNoaXZlIiwKICAgICAgICAgICAgICJzdmcvY3VzdG9tL2lt
YWdlLXdpdGgtcHJlZml4LWluLXdlYmFyY2hpdmUuc3ZnIiwKICAgICAgICAgXQotICAgICAgICBy
ZXR1cm4gZGlzYWJsZWRfZmVhdHVyZV90ZXN0cyArIHdlYmFyY2hpdmVfdGVzdHMKKyAgICAgICAg
dW5zdXBwb3J0ZWRfZmVhdHVyZV90ZXN0cyA9IHNlbGYuc2tpcHBlZF9kaXJlY3Rvcmllc19mb3Jf
dW5zdXBwb3J0ZWRfZmVhdHVyZXMoKQorICAgICAgICByZXR1cm4gZGlzYWJsZWRfZmVhdHVyZV90
ZXN0cyArIHdlYmFyY2hpdmVfdGVzdHMgKyB1bnN1cHBvcnRlZF9mZWF0dXJlX3Rlc3RzCiAKICAg
ICBkZWYgX3Rlc3RzX2Zyb21fc2tpcHBlZF9maWxlKHNlbGYsIHNraXBwZWRfZmlsZSk6CiAgICAg
ICAgIHRlc3RzX3RvX3NraXAgPSBbXQpAQCAtMzM5LDYgKzM4Myw5IEBAIGNsYXNzIFdlYktpdFBv
cnQoYmFzZS5Qb3J0KToKICAgICBkZWYgX3BhdGhfdG9fZHJpdmVyKHNlbGYpOgogICAgICAgICBy
ZXR1cm4gc2VsZi5fYnVpbGRfcGF0aCgnRHVtcFJlbmRlclRyZWUnKQogCisgICAgZGVmIF9wYXRo
X3RvX2xpYnJhcnkoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKICAgICBkZWYgX3BhdGhf
dG9faGVscGVyKHNlbGYpOgogICAgICAgICByZXR1cm4gTm9uZQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64576</attachid>
            <date>2010-08-17 05:53:39 -0700</date>
            <delta_ts>2010-08-23 07:30:21 -0700</delta_ts>
            <desc>proposed_patch_v4</desc>
            <filename>new_feature_detection</filename>
            <type>text/plain</type>
            <size>9054</size>
            <attacher name="Gabor Rapcsanyi">rgabor</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDY1NDg3KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTAtMDgtMTcgIEdhYm9yIFJhcGNzYW55aSAg
PHJnYWJvckBpbmYudS1zemVnZWQuaHU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGZlYXR1cmUgZGV0ZWN0aW9uIHN1cHBvcnQgdG8gTlJXVC4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQxODQyCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdF91bml0dGVzdC5w
eTogQWRkZWQuCisKIDIwMTAtMDgtMTYgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBNYXJrIFJvd2UuCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CShyZXZpc2lv
biA2NTQ4NSkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvYmFzZS5weQkod29ya2luZyBjb3B5KQpAQCAtNjU5LDYgKzY1OSwxMCBAQCBjbGFzcyBQb3J0
KG9iamVjdCk6CiAgICAgICAgICIiIlJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgdGVzdCBk
cml2ZXIgKER1bXBSZW5kZXJUcmVlKS4iIiIKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRF
cnJvcignUG9ydC5wYXRoX3RvX2RyaXZlcicpCiAKKyAgICBkZWYgX3BhdGhfdG9fbGlicmFyeShz
ZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIGxpYnJhcnkgb2YgV2Vi
S2l0LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0LnBhdGhfdG9f
bGlicmFyeScpCisKICAgICBkZWYgX3BhdGhfdG9faGVscGVyKHNlbGYpOgogICAgICAgICAiIiJS
ZXR1cm5zIHRoZSBmdWxsIHBhdGggdG8gdGhlIGxheW91dF90ZXN0X2hlbHBlciBiaW5hcnksIHdo
aWNoCiAgICAgICAgIGlzIHVzZWQgdG8gaGVscCBjb25maWd1cmUgdGhlIHN5c3RlbSBmb3IgdGhl
IHRlc3QgcnVuLCBvciBOb25lCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9wb3J0L3F0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvcXQucHkJKHJldmlzaW9uIDY1NDg1KQorKysgV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5weQkod29ya2lu
ZyBjb3B5KQpAQCAtOTMsNiArOTMsOSBAQCBjbGFzcyBRdFBvcnQoV2ViS2l0UG9ydCk6CiAgICAg
ZGVmIF9wYXRoX3RvX2RyaXZlcihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3Bh
dGgoJ2Jpbi9EdW1wUmVuZGVyVHJlZScpCiAKKyAgICBkZWYgX3BhdGhfdG9fbGlicmFyeShzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3BhdGgoJ2xpYi9saWJRdFdlYktpdC5zbycp
CisKICAgICBkZWYgc2V0dXBfZW52aXJvbl9mb3Jfc2VydmVyKHNlbGYpOgogICAgICAgICBlbnYg
PSB3ZWJraXQuV2ViS2l0UG9ydC5zZXR1cF9lbnZpcm9uX2Zvcl9zZXJ2ZXIoc2VsZikKICAgICAg
ICAgZW52WydRVFdFQktJVF9QTFVHSU5fUEFUSCddID0gc2VsZi5fYnVpbGRfcGF0aCgnbGliL3Bs
dWdpbnMnKQpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC93ZWJraXQucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHJldmlzaW9uIDY1NDg1KQorKysgV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAjIS91c3IvYmluL2VudiBweXRob24KICMgQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdo
dCAoQykgMjAxMCBHYWJvciBSYXBjc2FueWkgPHJnYWJvckBpbmYudS1zemVnZWQuaHU+LCBVbml2
ZXJzaXR5IG9mIFN6ZWdlZAogIwogIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMjE3
LDYgKzIxOCw1OCBAQCBjbGFzcyBXZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAgICAgICAi
cGxhdGZvcm0vd2luIiwKICAgICAgICAgXQogCisgICAgZGVmIF9nZXRfc3VwcG9ydGVkX2ZlYXR1
cmVzX3N5bWJvbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc3VwcG9ydGVkIGZlYXR1
cmUgc3ltYm9scy4gSW4gY2FzZSBvZiBub24td2luMzIKKyAgICAgICAgcmV0dXJuIGFsbCBzeW1i
b2xzLiIiIgorICAgICAgICBsaWJyYXJ5X3BhdGggPSBzZWxmLl9wYXRoX3RvX2xpYnJhcnkoKQor
ICAgICAgICBkcml2ZXJfcGF0aCA9IHNlbGYuX3BhdGhfdG9fZHJpdmVyKCkKKworICAgICAgICBp
ZiBzeXMucGxhdGZvcm0gaW4gKCdjeWd3aW4nLCAnd2luMzInKSBhbmQgZHJpdmVyX3BhdGg6Cisg
ICAgICAgICAgICBzeW1ib2xfbGlzdCA9IG9zLnBvcGVuKGRyaXZlcl9wYXRoICsgIiAtLXByaW50
LXN1cHBvcnRlZC1mZWF0dXJlcyAyPiYxIikucmVhZGxpbmVzKCkKKyAgICAgICAgZWxpZiBsaWJy
YXJ5X3BhdGg6CisgICAgICAgICAgICBzeW1ib2xfbGlzdCA9IG9zLnBvcGVuKCJubSAiICsgbGli
cmFyeV9wYXRoKS5yZWFkbGluZXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ltYm9s
X2xpc3QgPSBbXQorCisgICAgICAgIHJldHVybiBzeW1ib2xfbGlzdAorCisgICAgZGVmIF9nZXRf
ZGlyZWN0b3JpZXNfZm9yX3N5bWJvbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdXBw
b3J0ZWQgZmVhdHVyZSBkaWN0aW9uYXJ5LiBUaGUga2V5cyBhcmUgdGhlCisgICAgICAgIHN5bWJv
bHMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBkaXJlY3RvcmllcyBpbiBsaXN0cy4iIiIKKyAgICAg
ICAgaWYgc3lzLnBsYXRmb3JtIGluICgnY3lnd2luJywgJ3dpbjMyJyk6CisgICAgICAgICAgICBk
aXJlY3Rvcmllc19mb3Jfc3ltYm9sID0geworICAgICAgICAgICAgICAgICJBY2NlbGVyYXRlZCBD
b21wb3NpdGluZyI6IFsiY29tcG9zaXRpbmciXSwKKyAgICAgICAgICAgICAgICAiM0QgUmVuZGVy
aW5nIjogWyJhbmltYXRpb25zLzNkIiwgInRyYW5zZm9ybXMvM2QiXSwKKyAgICAgICAgICAgIH0K
KyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpcmVjdG9yaWVzX2Zvcl9zeW1ib2wgPSB7Cisg
ICAgICAgICAgICAgICAgIk1hdGhNTEVsZW1lbnQiOiBbIm1hdGhtbCJdLAorICAgICAgICAgICAg
ICAgICJHcmFwaGljc0xheWVyIjogWyJjb21wb3NpdGluZyJdLAorICAgICAgICAgICAgICAgICJX
ZWJDb3JlSGFzM0RSZW5kZXJpbmciOiBbImFuaW1hdGlvbnMvM2QiLCAidHJhbnNmb3Jtcy8zZCJd
LAorICAgICAgICAgICAgICAgICJXZWJHTFNoYWRlciI6IFsiZmFzdC9jYW52YXMvd2ViZ2wiXSwK
KyAgICAgICAgICAgICAgICAiV01MRWxlbWVudCI6IFsiaHR0cC90ZXN0cy93bWwiLCAiZmFzdC93
bWwiLCAid21sIl0sCisgICAgICAgICAgICAgICAgInBhcnNlV0NTU0lucHV0UHJvcGVydHkiOiBb
ImZhc3Qvd2NzcyJdLAorICAgICAgICAgICAgICAgICJpc1hIVE1MTVBEb2N1bWVudCI6IFsiZmFz
dC94aHRtbG1wIl0sCisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBkaXJlY3Rvcmllc19m
b3Jfc3ltYm9sCisKKyAgICBkZWYgX3NraXBwZWRfZGlyZWN0b3JpZXNfZm9yX3Vuc3VwcG9ydGVk
X2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGRpcmVjdG9yaWVzIG9mIHVu
c3VwcG9ydGVkIHRlc3RzLiBTZWFyY2ggZm9yIHRoZQorICAgICAgICBzeW1ib2xzIGluIHRoZSBz
eW1ib2xfbGlzdCwgaWYgZm91bmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIGRpcmVj
dG9yaWVzIHRvIHRoZSBza2lwcGVkIGRpcmVjdG9yeSBsaXN0LiIiIgorICAgICAgICBzeW1ib2xf
bGlzdCA9IHNlbGYuX2dldF9zdXBwb3J0ZWRfZmVhdHVyZXNfc3ltYm9scygpCisgICAgICAgIGRp
cmVjdG9yaWVzX2Zvcl9zeW1ib2wgPSBzZWxmLl9nZXRfZGlyZWN0b3JpZXNfZm9yX3N5bWJvbCgp
CisgICAgICAgIHNraXBwZWRfZGlyZWN0b3JpZXMgPSBbXQorCisgICAgICAgIGlmIG5vdCBzeW1i
b2xfbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIGZvciBmZWF0dXJlX3N5
bWJvbCBpbiBkaXJlY3Rvcmllc19mb3Jfc3ltYm9sOgorICAgICAgICAgICAgZm91bmRfc3ltYm9s
cyA9IFtsaWJyYXJ5X3N5bWJvbCBmb3IgbGlicmFyeV9zeW1ib2wgaW4gc3ltYm9sX2xpc3QgaWYg
ZmVhdHVyZV9zeW1ib2wgaW4gbGlicmFyeV9zeW1ib2xdCisgICAgICAgICAgICBpZiBub3QgZm91
bmRfc3ltYm9sczoKKyAgICAgICAgICAgICAgICBza2lwcGVkX2RpcmVjdG9yaWVzLmV4dGVuZChk
aXJlY3Rvcmllc19mb3Jfc3ltYm9sW2ZlYXR1cmVfc3ltYm9sXSkKKyAgICAgICAgcmV0dXJuIHNr
aXBwZWRfZGlyZWN0b3JpZXMKKwogICAgIGRlZiBfdGVzdHNfZm9yX2Rpc2FibGVkX2ZlYXR1cmVz
KHNlbGYpOgogICAgICAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgdGhlIGZlYXR1cmUgZGV0
ZWN0aW9uIGZyb20KICAgICAgICAgIyB3ZWJraXRwZXJsL2ZlYXR1cmVzLnBtIHRvIG1hdGNoIHJ1
bi13ZWJraXQtdGVzdHMuCkBAIC0yMzgsNyArMjkxLDggQEAgY2xhc3MgV2ViS2l0UG9ydChiYXNl
LlBvcnQpOgogICAgICAgICAgICAgImh0dHAvdGVzdHMvd2ViYXJjaGl2ZSIsCiAgICAgICAgICAg
ICAic3ZnL2N1c3RvbS9pbWFnZS13aXRoLXByZWZpeC1pbi13ZWJhcmNoaXZlLnN2ZyIsCiAgICAg
ICAgIF0KLSAgICAgICAgcmV0dXJuIGRpc2FibGVkX2ZlYXR1cmVfdGVzdHMgKyB3ZWJhcmNoaXZl
X3Rlc3RzCisgICAgICAgIHVuc3VwcG9ydGVkX2ZlYXR1cmVfdGVzdHMgPSBzZWxmLl9za2lwcGVk
X2RpcmVjdG9yaWVzX2Zvcl91bnN1cHBvcnRlZF9mZWF0dXJlcygpCisgICAgICAgIHJldHVybiBk
aXNhYmxlZF9mZWF0dXJlX3Rlc3RzICsgd2ViYXJjaGl2ZV90ZXN0cyArIHVuc3VwcG9ydGVkX2Zl
YXR1cmVfdGVzdHMKIAogICAgIGRlZiBfdGVzdHNfZnJvbV9za2lwcGVkX2ZpbGUoc2VsZiwgc2tp
cHBlZF9maWxlKToKICAgICAgICAgdGVzdHNfdG9fc2tpcCA9IFtdCkBAIC0zMzksNiArMzkzLDkg
QEAgY2xhc3MgV2ViS2l0UG9ydChiYXNlLlBvcnQpOgogICAgIGRlZiBfcGF0aF90b19kcml2ZXIo
c2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9idWlsZF9wYXRoKCdEdW1wUmVuZGVyVHJlZScp
CiAKKyAgICBkZWYgX3BhdGhfdG9fbGlicmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUK
KwogICAgIGRlZiBfcGF0aF90b19oZWxwZXIoc2VsZik6CiAgICAgICAgIHJldHVybiBOb25lCiAK
SW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Vi
a2l0X3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0X3VuaXR0ZXN0LnB5CShyZXZpc2lvbiAwKQorKysg
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXRfdW5p
dHRlc3QucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTUgQEAKKyMhL3Vzci9iaW4vZW52IHB5
dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR2Fib3IgUmFwY3NhbnlpIDxyZ2Fib3JAaW5mLnUt
c3plZ2VkLmh1PiwgVW5pdmVyc2l0eSBvZiBTemVnZWQKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUg
R29vZ2xlIG5hbWUgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMg
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
IyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgdW5p
dHRlc3QKK2ltcG9ydCBvcGVyYXRvcgorCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0
LndlYmtpdCBpbXBvcnQgV2ViS2l0UG9ydAorCisKK2NsYXNzIFRlc3RXZWJLaXRQb3J0KFdlYktp
dFBvcnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzeW1ib2xfbmFtZT1Ob25lKToKKyAgICAg
ICAgc2VsZi5zeW1ib2xfbmFtZSA9IHN5bWJvbF9uYW1lCisKKyAgICBkZWYgX2dldF9zdXBwb3J0
ZWRfZmVhdHVyZXNfc3ltYm9scyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3ltYm9sX25h
bWUKKworCitjbGFzcyBXZWJLaXRQb3J0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBk
ZWYgdGVzdF9za2lwcGVkX2RpcmVjdG9yaWVzX2Zvcl91bnN1cHBvcnRlZF9mZWF0dXJlcyhzZWxm
KToKKyAgICAgICAgZGlyZWN0b3JpZXNfZm9yX3N5bWJvbCA9IFRlc3RXZWJLaXRQb3J0KCkuX2dl
dF9kaXJlY3Rvcmllc19mb3Jfc3ltYm9sKCkKKyAgICAgICAgYWxsX2RpcmVjdG9yeSA9IHJlZHVj
ZShvcGVyYXRvci5hZGQsIGRpcmVjdG9yaWVzX2Zvcl9zeW1ib2wudmFsdWVzKCkpCisgICAgICAg
IGZvciBzeW1ib2wgaW4gZGlyZWN0b3JpZXNfZm9yX3N5bWJvbDoKKyAgICAgICAgICAgIHJlc3Vs
dF9kaXJlY3RvcmllcyA9IFRlc3RXZWJLaXRQb3J0KFtzeW1ib2xdKS5fc2tpcHBlZF9kaXJlY3Rv
cmllc19mb3JfdW5zdXBwb3J0ZWRfZmVhdHVyZXMoKQorICAgICAgICAgICAgc2tpcHBlZF9kaXJl
Y3RvcmllcyA9IGRpcmVjdG9yaWVzX2Zvcl9zeW1ib2xbc3ltYm9sXQorICAgICAgICAgICAgZXhw
ZWN0ZWRfZGlyZWN0b3JpZXMgPSBsaXN0KGFsbF9kaXJlY3RvcnkpCisgICAgICAgICAgICBmb3Ig
ZGlyZWN0b3J5IGluIHNraXBwZWRfZGlyZWN0b3JpZXM6CisgICAgICAgICAgICAgICAgZXhwZWN0
ZWRfZGlyZWN0b3JpZXMucmVtb3ZlKGRpcmVjdG9yeSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwocmVzdWx0X2RpcmVjdG9yaWVzLCBleHBlY3RlZF9kaXJlY3RvcmllcykK
</data>
<flag name="review"
          id="53163"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65116</attachid>
            <date>2010-08-23 07:30:21 -0700</date>
            <delta_ts>2010-08-24 09:04:57 -0700</delta_ts>
            <desc>proposed_patch_v5</desc>
            <filename>nrwt_feature_detect_5</filename>
            <type>text/plain</type>
            <size>10291</size>
            <attacher name="Gabor Rapcsanyi">rgabor</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDY1ODA1KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTAtMDgtMjMgIEdhYm9yIFJhcGNzYW55aSAg
PHJnYWJvckBpbmYudS1zemVnZWQuaHU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGZlYXR1cmUgZGV0ZWN0aW9uIHN1cHBvcnQgdG8gTlJXVC4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQxODQyCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdF91bml0dGVzdC5w
eTogQWRkZWQuCisKIDIwMTAtMDgtMjIgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFs
QG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBcml5YSBIaWRheWF0LgpJbmRleDog
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvYmFzZS5weQkocmV2aXNpb24gNjU3OTYpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkJKHdvcmtpbmcgY29weSkKQEAgLTY1OSw2ICs2
NTksMTAgQEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICAiIiJSZXR1cm5zIHRoZSBmdWxs
IHBhdGggdG8gdGhlIHRlc3QgZHJpdmVyIChEdW1wUmVuZGVyVHJlZSkuIiIiCiAgICAgICAgIHJh
aXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BvcnQucGF0aF90b19kcml2ZXInKQogCisgICAgZGVm
IF9wYXRoX3RvX3dlYmNvcmUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIGZ1bGwgcGF0
aCB0byBXZWJDb3JlLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0
LnBhdGhfdG9fd2ViY29yZScpCisKICAgICBkZWYgX3BhdGhfdG9faGVscGVyKHNlbGYpOgogICAg
ICAgICAiIiJSZXR1cm5zIHRoZSBmdWxsIHBhdGggdG8gdGhlIGxheW91dF90ZXN0X2hlbHBlciBi
aW5hcnksIHdoaWNoCiAgICAgICAgIGlzIHVzZWQgdG8gaGVscCBjb25maWd1cmUgdGhlIHN5c3Rl
bSBmb3IgdGhlIHRlc3QgcnVuLCBvciBOb25lCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3F0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvcXQucHkJKHJldmlzaW9uIDY1Nzk2
KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5w
eQkod29ya2luZyBjb3B5KQpAQCAtOTMsNiArOTMsMTIgQEAgY2xhc3MgUXRQb3J0KFdlYktpdFBv
cnQpOgogICAgIGRlZiBfcGF0aF90b19kcml2ZXIoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxm
Ll9idWlsZF9wYXRoKCdiaW4vRHVtcFJlbmRlclRyZWUnKQogCisgICAgZGVmIF9wYXRoX3RvX3dl
YmNvcmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWlsZF9wYXRoKCdsaWIvbGliUXRX
ZWJLaXQuc28nKQorCisgICAgZGVmIF9ydW50aW1lX2ZlYXR1cmVfbGlzdChzZWxmKToKKyAgICAg
ICAgcmV0dXJuIE5vbmUKKwogICAgIGRlZiBzZXR1cF9lbnZpcm9uX2Zvcl9zZXJ2ZXIoc2VsZik6
CiAgICAgICAgIGVudiA9IHdlYmtpdC5XZWJLaXRQb3J0LnNldHVwX2Vudmlyb25fZm9yX3NlcnZl
cihzZWxmKQogICAgICAgICBlbnZbJ1FUV0VCS0lUX1BMVUdJTl9QQVRIJ10gPSBzZWxmLl9idWls
ZF9wYXRoKCdsaWIvcGx1Z2lucycpCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weQkocmV2aXNpb24gNjU3
OTYpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dl
YmtpdC5weQkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKICMhL3Vzci9iaW4vZW52IHB5
dGhvbgogIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdhYm9yIFJhcGNzYW55aSA8cmdhYm9yQGluZi51LXN6
ZWdlZC5odT4sIFVuaXZlcnNpdHkgb2YgU3plZ2VkCiAjCiAjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCkBAIC0yMTcsNiArMjE4LDY2IEBAIGNsYXNzIFdlYktpdFBvcnQoYmFzZS5Qb3J0KToK
ICAgICAgICAgICAgICJwbGF0Zm9ybS93aW4iLAogICAgICAgICBdCiAKKyAgICBkZWYgX3J1bnRp
bWVfZmVhdHVyZV9saXN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHN1cHBvcnRlZCBm
ZWF0dXJlcyBvZiBEUlQuIElmIGEgcG9ydCBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICAgdGhpcyBE
UlQgc3dpdGNoLCBpdCBoYXMgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIE5vbmUi
IiIKKyAgICAgICAgZHJpdmVyX3BhdGggPSBzZWxmLl9wYXRoX3RvX2RyaXZlcigpCisgICAgICAg
IGZlYXR1cmVfbGlzdCA9IG9zLnBvcGVuKGRyaXZlcl9wYXRoICsgIiAtLXByaW50LXN1cHBvcnRl
ZC1mZWF0dXJlcyAyPiYxIikucmVhZGxpbmVzKCkKKyAgICAgICAgaWYgIlN1cHBvcnRlZEZlYXR1
cmVzOiIgaW4gZmVhdHVyZV9saXN0OgorICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVfbGlzdAor
ICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9nZXRfc3VwcG9ydGVkX3N5bWJvbF9saXN0
KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHN1cHBvcnRlZCBzeW1ib2xzIG9mIFdlYkNv
cmUuIiIiCisgICAgICAgIHdlYmNvcmVfcGF0aCA9IHNlbGYuX3BhdGhfdG9fd2ViY29yZSgpCisg
ICAgICAgIHN5bWJvbF9saXN0ID0gb3MucG9wZW4oIm5tICIgKyB3ZWJjb3JlX3BhdGgpLnJlYWRs
aW5lcygpCisgICAgICAgIHJldHVybiBzeW1ib2xfbGlzdAorCisgICAgZGVmIF9nZXRfZGlyZWN0
b3JpZXNfZm9yX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHN1cHBvcnRl
ZCBmZWF0dXJlIGRpY3Rpb25hcnkuIFRoZSBrZXlzIGFyZSB0aGUKKyAgICAgICAgZmVhdHVyZXMg
YW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBkaXJlY3RvcmllcyBpbiBsaXN0cy4iIiIKKyAgICAgICAg
ZGlyZWN0b3JpZXNfZm9yX2ZlYXR1cmVzID0geworICAgICAgICAgICAgIkFjY2VsZXJhdGVkIENv
bXBvc2l0aW5nIjogWyJjb21wb3NpdGluZyJdLAorICAgICAgICAgICAgIjNEIFJlbmRlcmluZyI6
IFsiYW5pbWF0aW9ucy8zZCIsICJ0cmFuc2Zvcm1zLzNkIl0sCisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIGRpcmVjdG9yaWVzX2Zvcl9mZWF0dXJlcworCisgICAgZGVmIF9nZXRfZGlyZWN0b3Jp
ZXNfZm9yX3N5bWJvbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc3VwcG9ydGVkIGZl
YXR1cmUgZGljdGlvbmFyeS4gVGhlIGtleXMgYXJlIHRoZQorICAgICAgICBzeW1ib2xzIGFuZCB0
aGUgdmFsdWVzIGFyZSB0aGUgZGlyZWN0b3JpZXMgaW4gbGlzdHMuIiIiCisgICAgICAgIGRpcmVj
dG9yaWVzX2Zvcl9zeW1ib2wgPSB7CisgICAgICAgICAgICAiTWF0aE1MRWxlbWVudCI6IFsibWF0
aG1sIl0sCisgICAgICAgICAgICAiR3JhcGhpY3NMYXllciI6IFsiY29tcG9zaXRpbmciXSwKKyAg
ICAgICAgICAgICJXZWJDb3JlSGFzM0RSZW5kZXJpbmciOiBbImFuaW1hdGlvbnMvM2QiLCAidHJh
bnNmb3Jtcy8zZCJdLAorICAgICAgICAgICAgIldlYkdMU2hhZGVyIjogWyJmYXN0L2NhbnZhcy93
ZWJnbCJdLAorICAgICAgICAgICAgIldNTEVsZW1lbnQiOiBbImh0dHAvdGVzdHMvd21sIiwgImZh
c3Qvd21sIiwgIndtbCJdLAorICAgICAgICAgICAgInBhcnNlV0NTU0lucHV0UHJvcGVydHkiOiBb
ImZhc3Qvd2NzcyJdLAorICAgICAgICAgICAgImlzWEhUTUxNUERvY3VtZW50IjogWyJmYXN0L3ho
dG1sbXAiXSwKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXNfZm9yX3N5bWJv
bAorCisgICAgZGVmIF9za2lwcGVkX2RpcmVjdG9yaWVzX2Zvcl91bnN1cHBvcnRlZF9mZWF0dXJl
cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXJlY3RvcmllcyBvZiB1bnN1cHBvcnRl
ZCB0ZXN0cy4gU2VhcmNoIGZvciB0aGUKKyAgICAgICAgc3ltYm9scyBpbiB0aGUgc3ltYm9sX2xp
c3QsIGlmIGZvdW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBkaXJlY3RvcmllcyB0
byB0aGUgc2tpcHBlZCBkaXJlY3RvcnkgbGlzdC4iIiIKKyAgICAgICAgZmVhdHVyZV9saXN0ID0g
c2VsZi5fcnVudGltZV9mZWF0dXJlX2xpc3QoKQorICAgICAgICBkaXJlY3RvcmllcyA9IHNlbGYu
X2dldF9kaXJlY3Rvcmllc19mb3JfZmVhdHVyZXMoKQorCisgICAgICAgICMgaWYgRFJUIGZlYXR1
cmUgZGV0ZWN0aW9uIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWYgbm90IGZlYXR1cmVfbGlzdDoK
KyAgICAgICAgICAgIGZlYXR1cmVfbGlzdCA9IHNlbGYuX2dldF9zdXBwb3J0ZWRfc3ltYm9sX2xp
c3QoKQorICAgICAgICAgICAgZGlyZWN0b3JpZXMgPSBzZWxmLl9nZXRfZGlyZWN0b3JpZXNfZm9y
X3N5bWJvbHMoKQorCisgICAgICAgIHNraXBwZWRfZGlyZWN0b3JpZXMgPSBbXQorICAgICAgICBp
ZiBub3QgZmVhdHVyZV9saXN0OgorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgZm9y
IGZlYXR1cmUgaW4gZGlyZWN0b3JpZXM6CisgICAgICAgICAgICBmb3VuZF9mZWF0dXJlID0gW2Zl
YXR1cmVfbGluZSBmb3IgZmVhdHVyZV9saW5lIGluIGZlYXR1cmVfbGlzdCBpZiBmZWF0dXJlIGlu
IGZlYXR1cmVfbGluZV0KKyAgICAgICAgICAgIGlmIG5vdCBmb3VuZF9mZWF0dXJlOgorICAgICAg
ICAgICAgICAgIHNraXBwZWRfZGlyZWN0b3JpZXMuZXh0ZW5kKGRpcmVjdG9yaWVzW2ZlYXR1cmVd
KQorICAgICAgICByZXR1cm4gc2tpcHBlZF9kaXJlY3RvcmllcworCiAgICAgZGVmIF90ZXN0c19m
b3JfZGlzYWJsZWRfZmVhdHVyZXMoc2VsZik6CiAgICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxk
IHVzZSB0aGUgZmVhdHVyZSBkZXRlY3Rpb24gZnJvbQogICAgICAgICAjIHdlYmtpdHBlcmwvZmVh
dHVyZXMucG0gdG8gbWF0Y2ggcnVuLXdlYmtpdC10ZXN0cy4KQEAgLTIzOCw3ICsyOTksOCBAQCBj
bGFzcyBXZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAgICAgICAiaHR0cC90ZXN0cy93ZWJh
cmNoaXZlIiwKICAgICAgICAgICAgICJzdmcvY3VzdG9tL2ltYWdlLXdpdGgtcHJlZml4LWluLXdl
YmFyY2hpdmUuc3ZnIiwKICAgICAgICAgXQotICAgICAgICByZXR1cm4gZGlzYWJsZWRfZmVhdHVy
ZV90ZXN0cyArIHdlYmFyY2hpdmVfdGVzdHMKKyAgICAgICAgdW5zdXBwb3J0ZWRfZmVhdHVyZV90
ZXN0cyA9IHNlbGYuX3NraXBwZWRfZGlyZWN0b3JpZXNfZm9yX3Vuc3VwcG9ydGVkX2ZlYXR1cmVz
KCkKKyAgICAgICAgcmV0dXJuIGRpc2FibGVkX2ZlYXR1cmVfdGVzdHMgKyB3ZWJhcmNoaXZlX3Rl
c3RzICsgdW5zdXBwb3J0ZWRfZmVhdHVyZV90ZXN0cwogCiAgICAgZGVmIF90ZXN0c19mcm9tX3Nr
aXBwZWRfZmlsZShzZWxmLCBza2lwcGVkX2ZpbGUpOgogICAgICAgICB0ZXN0c190b19za2lwID0g
W10KQEAgLTMzOSw2ICs0MDEsOSBAQCBjbGFzcyBXZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAg
ZGVmIF9wYXRoX3RvX2RyaXZlcihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3Bh
dGgoJ0R1bXBSZW5kZXJUcmVlJykKIAorICAgIGRlZiBfcGF0aF90b193ZWJjb3JlKHNlbGYpOgor
ICAgICAgICByZXR1cm4gTm9uZQorCiAgICAgZGVmIF9wYXRoX3RvX2hlbHBlcihzZWxmKToKICAg
ICAgICAgcmV0dXJuIE5vbmUKIApJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC93ZWJraXRfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXRfdW5pdHRlc3Qu
cHkJKHJldmlzaW9uIDApCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9wb3J0L3dlYmtpdF91bml0dGVzdC5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3MCBA
QAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHYWJvciBSYXBj
c2FueWkgPHJnYWJvckBpbmYudS1zemVnZWQuaHU+LCBVbml2ZXJzaXR5IG9mIFN6ZWdlZAorIwor
IyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgor
IyAgICAgKiBOZWl0aGVyIHRoZSBHb29nbGUgbmFtZSBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZ
UklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9wZXJhdG9yCisKK2Zyb20gd2Via2l0
cHkubGF5b3V0X3Rlc3RzLnBvcnQud2Via2l0IGltcG9ydCBXZWJLaXRQb3J0CisKKworY2xhc3Mg
VGVzdFdlYktpdFBvcnQoV2ViS2l0UG9ydCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN5bWJv
bF9uYW1lPU5vbmUsIGZlYXR1cmVfbmFtZT1Ob25lKToKKyAgICAgICAgc2VsZi5zeW1ib2xfbmFt
ZSA9IHN5bWJvbF9uYW1lCisgICAgICAgIHNlbGYuZmVhdHVyZV9uYW1lID0gZmVhdHVyZV9uYW1l
CisKKyAgICBkZWYgX3J1bnRpbWVfZmVhdHVyZV9saXN0KHNlbGYpOgorICAgICAgICByZXR1cm4g
c2VsZi5mZWF0dXJlX25hbWUKKworICAgIGRlZiBfZ2V0X3N1cHBvcnRlZF9zeW1ib2xfbGlzdChz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3ltYm9sX25hbWUKKworCitjbGFzcyBXZWJLaXRQ
b3J0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9za2lwcGVkX2RpcmVj
dG9yaWVzX2Zvcl9zeW1ib2xzKHNlbGYpOgorICAgICAgICBkaXJlY3Rvcmllc19mb3Jfc3ltYm9s
cyA9IFRlc3RXZWJLaXRQb3J0KCkuX2dldF9kaXJlY3Rvcmllc19mb3Jfc3ltYm9scygpCisgICAg
ICAgIGFsbF9kaXJlY3RvcnkgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLCBkaXJlY3Rvcmllc19mb3Jf
c3ltYm9scy52YWx1ZXMoKSkKKyAgICAgICAgZm9yIHN5bWJvbCBpbiBkaXJlY3Rvcmllc19mb3Jf
c3ltYm9sczoKKyAgICAgICAgICAgIHJlc3VsdF9kaXJlY3RvcmllcyA9IFRlc3RXZWJLaXRQb3J0
KFtzeW1ib2xdLCBOb25lKS5fc2tpcHBlZF9kaXJlY3Rvcmllc19mb3JfdW5zdXBwb3J0ZWRfZmVh
dHVyZXMoKQorICAgICAgICAgICAgc2tpcHBlZF9kaXJlY3RvcmllcyA9IGRpcmVjdG9yaWVzX2Zv
cl9zeW1ib2xzW3N5bWJvbF0KKyAgICAgICAgICAgIGV4cGVjdGVkX2RpcmVjdG9yaWVzID0gbGlz
dChhbGxfZGlyZWN0b3J5KQorICAgICAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBza2lwcGVkX2Rp
cmVjdG9yaWVzOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2RpcmVjdG9yaWVzLnJlbW92ZShk
aXJlY3RvcnkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdF9kaXJlY3Rvcmll
cywgZXhwZWN0ZWRfZGlyZWN0b3JpZXMpCisKKyAgICBkZWYgdGVzdF9za2lwcGVkX2RpcmVjdG9y
aWVzX2Zvcl9mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgZGlyZWN0b3JpZXNfZm9yX2ZlYXR1cmVz
ID0gVGVzdFdlYktpdFBvcnQoKS5fZ2V0X2RpcmVjdG9yaWVzX2Zvcl9mZWF0dXJlcygpCisgICAg
ICAgIGFsbF9kaXJlY3RvcnkgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLCBkaXJlY3Rvcmllc19mb3Jf
ZmVhdHVyZXMudmFsdWVzKCkpCisgICAgICAgIGZvciBmZWF0dXJlIGluIGRpcmVjdG9yaWVzX2Zv
cl9mZWF0dXJlczoKKyAgICAgICAgICAgIHJlc3VsdF9kaXJlY3RvcmllcyA9IFRlc3RXZWJLaXRQ
b3J0KE5vbmUsIFtmZWF0dXJlXSkuX3NraXBwZWRfZGlyZWN0b3JpZXNfZm9yX3Vuc3VwcG9ydGVk
X2ZlYXR1cmVzKCkKKyAgICAgICAgICAgIHNraXBwZWRfZGlyZWN0b3JpZXMgPSBkaXJlY3Rvcmll
c19mb3JfZmVhdHVyZXNbZmVhdHVyZV0KKyAgICAgICAgICAgIGV4cGVjdGVkX2RpcmVjdG9yaWVz
ID0gbGlzdChhbGxfZGlyZWN0b3J5KQorICAgICAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBza2lw
cGVkX2RpcmVjdG9yaWVzOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2RpcmVjdG9yaWVzLnJl
bW92ZShkaXJlY3RvcnkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdF9kaXJl
Y3RvcmllcywgZXhwZWN0ZWRfZGlyZWN0b3JpZXMpCg==
</data>
<flag name="review"
          id="53796"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65280</attachid>
            <date>2010-08-24 09:04:57 -0700</date>
            <delta_ts>2010-09-03 06:07:43 -0700</delta_ts>
            <desc>proposed_patch_v6</desc>
            <filename>nrwt_feature_detect_6</filename>
            <type>text/plain</type>
            <size>9887</size>
            <attacher name="Gabor Rapcsanyi">rgabor</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDY1ODA1KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTAtMDgtMjMgIEdhYm9yIFJhcGNzYW55aSAg
PHJnYWJvckBpbmYudS1zemVnZWQuaHU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGZlYXR1cmUgZGV0ZWN0aW9uIHN1cHBvcnQgdG8gTlJXVC4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQxODQyCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9xdC5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weToKKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdF91bml0dGVzdC5w
eTogQWRkZWQuCisKIDIwMTAtMDgtMjIgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFs
QG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBcml5YSBIaWRheWF0LgpJbmRleDog
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvYmFzZS5weQkocmV2aXNpb24gNjU3OTYpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkJKHdvcmtpbmcgY29weSkKQEAgLTY1OSw2ICs2
NTksMTAgQEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICAiIiJSZXR1cm5zIHRoZSBmdWxs
IHBhdGggdG8gdGhlIHRlc3QgZHJpdmVyIChEdW1wUmVuZGVyVHJlZSkuIiIiCiAgICAgICAgIHJh
aXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BvcnQucGF0aF90b19kcml2ZXInKQogCisgICAgZGVm
IF9wYXRoX3RvX3dlYmNvcmVfbGlicmFyeShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUg
ZnVsbCBwYXRoIHRvIGEgYnVpbHQgY29weSBvZiBXZWJDb3JlLiIiIgorICAgICAgICByYWlzZSBO
b3RJbXBsZW1lbnRlZEVycm9yKCdQb3J0LnBhdGhfdG9fd2ViY29yZV9saWJyYXJ5JykKKwogICAg
IGRlZiBfcGF0aF90b19oZWxwZXIoc2VsZik6CiAgICAgICAgICIiIlJldHVybnMgdGhlIGZ1bGwg
cGF0aCB0byB0aGUgbGF5b3V0X3Rlc3RfaGVscGVyIGJpbmFyeSwgd2hpY2gKICAgICAgICAgaXMg
dXNlZCB0byBoZWxwIGNvbmZpZ3VyZSB0aGUgc3lzdGVtIGZvciB0aGUgdGVzdCBydW4sIG9yIE5v
bmUKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQv
cXQucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC9xdC5weQkocmV2aXNpb24gNjU3OTYpCisrKyBXZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3F0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC05Myw2
ICs5MywxMiBAQCBjbGFzcyBRdFBvcnQoV2ViS2l0UG9ydCk6CiAgICAgZGVmIF9wYXRoX3RvX2Ry
aXZlcihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3BhdGgoJ2Jpbi9EdW1wUmVu
ZGVyVHJlZScpCiAKKyAgICBkZWYgX3BhdGhfdG9fd2ViY29yZV9saWJyYXJ5KHNlbGYpOgorICAg
ICAgICByZXR1cm4gc2VsZi5fYnVpbGRfcGF0aCgnbGliL2xpYlF0V2ViS2l0LnNvJykKKworICAg
IGRlZiBfcnVudGltZV9mZWF0dXJlX2xpc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisK
ICAgICBkZWYgc2V0dXBfZW52aXJvbl9mb3Jfc2VydmVyKHNlbGYpOgogICAgICAgICBlbnYgPSB3
ZWJraXQuV2ViS2l0UG9ydC5zZXR1cF9lbnZpcm9uX2Zvcl9zZXJ2ZXIoc2VsZikKICAgICAgICAg
ZW52WydRVFdFQktJVF9QTFVHSU5fUEFUSCddID0gc2VsZi5fYnVpbGRfcGF0aCgnbGliL3BsdWdp
bnMnKQpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9y
dC93ZWJraXQucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHJldmlzaW9uIDY1Nzk2KQorKysgV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTEsNSArMSw2IEBACiAjIS91c3IvYmluL2VudiBweXRob24KICMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAo
QykgMjAxMCBHYWJvciBSYXBjc2FueWkgPHJnYWJvckBpbmYudS1zemVnZWQuaHU+LCBVbml2ZXJz
aXR5IG9mIFN6ZWdlZAogIwogIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDEsNiAr
NDIsNyBAQCBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHdl
YmJyb3dzZXIKK2ltcG9ydCBvcGVyYXRvcgogCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0u
ZXhlY3V0aXZlIGltcG9ydCBFeGVjdXRpdmUKIApAQCAtMjE3LDYgKzIxOSw2NCBAQCBjbGFzcyBX
ZWJLaXRQb3J0KGJhc2UuUG9ydCk6CiAgICAgICAgICAgICAicGxhdGZvcm0vd2luIiwKICAgICAg
ICAgXQogCisgICAgZGVmIF9ydW50aW1lX2ZlYXR1cmVfbGlzdChzZWxmKToKKyAgICAgICAgIiIi
UmV0dXJuIHRoZSBzdXBwb3J0ZWQgZmVhdHVyZXMgb2YgRFJULiBJZiBhIHBvcnQgZG9lc24ndCBz
dXBwb3J0CisgICAgICAgIHRoaXMgRFJUIHN3aXRjaCwgaXQgaGFzIHRvIG92ZXJyaWRlIHRoaXMg
bWV0aG9kIHRvIHJldHVybiBOb25lIiIiCisgICAgICAgIGRyaXZlcl9wYXRoID0gc2VsZi5fcGF0
aF90b19kcml2ZXIoKQorICAgICAgICBmZWF0dXJlX2xpc3QgPSAnICcuam9pbihvcy5wb3Blbihk
cml2ZXJfcGF0aCArICIgLS1wcmludC1zdXBwb3J0ZWQtZmVhdHVyZXMgMj4mMSIpLnJlYWRsaW5l
cygpKQorICAgICAgICBpZiAiU3VwcG9ydGVkRmVhdHVyZXM6IiBpbiBmZWF0dXJlX2xpc3Q6Cisg
ICAgICAgICAgICByZXR1cm4gZmVhdHVyZV9saXN0CisgICAgICAgIHJldHVybiBOb25lCisKKyAg
ICBkZWYgX3N1cHBvcnRlZF9zeW1ib2xfbGlzdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRo
ZSBzdXBwb3J0ZWQgc3ltYm9scyBvZiBXZWJDb3JlLiIiIgorICAgICAgICB3ZWJjb3JlX2xpYnJh
cnlfcGF0aCA9IHNlbGYuX3BhdGhfdG9fd2ViY29yZV9saWJyYXJ5KCkKKyAgICAgICAgc3ltYm9s
X2xpc3QgPSAnICcuam9pbihvcy5wb3Blbigibm0gIiArIHdlYmNvcmVfbGlicmFyeV9wYXRoKS5y
ZWFkbGluZXMoKSkKKyAgICAgICAgcmV0dXJuIHN5bWJvbF9saXN0CisKKyAgICBkZWYgX2RpcmVj
dG9yaWVzX2Zvcl9mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdXBwb3J0
ZWQgZmVhdHVyZSBkaWN0aW9uYXJ5LiBUaGUga2V5cyBhcmUgdGhlCisgICAgICAgIGZlYXR1cmVz
IGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgZGlyZWN0b3JpZXMgaW4gbGlzdHMuIiIiCisgICAgICAg
IGRpcmVjdG9yaWVzX2Zvcl9mZWF0dXJlcyA9IHsKKyAgICAgICAgICAgICJBY2NlbGVyYXRlZCBD
b21wb3NpdGluZyI6IFsiY29tcG9zaXRpbmciXSwKKyAgICAgICAgICAgICIzRCBSZW5kZXJpbmci
OiBbImFuaW1hdGlvbnMvM2QiLCAidHJhbnNmb3Jtcy8zZCJdLAorICAgICAgICB9CisgICAgICAg
IHJldHVybiBkaXJlY3Rvcmllc19mb3JfZmVhdHVyZXMKKworICAgIGRlZiBfZGlyZWN0b3JpZXNf
Zm9yX3N5bWJvbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc3VwcG9ydGVkIGZlYXR1
cmUgZGljdGlvbmFyeS4gVGhlIGtleXMgYXJlIHRoZQorICAgICAgICBzeW1ib2xzIGFuZCB0aGUg
dmFsdWVzIGFyZSB0aGUgZGlyZWN0b3JpZXMgaW4gbGlzdHMuIiIiCisgICAgICAgIGRpcmVjdG9y
aWVzX2Zvcl9zeW1ib2wgPSB7CisgICAgICAgICAgICAiTWF0aE1MRWxlbWVudCI6IFsibWF0aG1s
Il0sCisgICAgICAgICAgICAiR3JhcGhpY3NMYXllciI6IFsiY29tcG9zaXRpbmciXSwKKyAgICAg
ICAgICAgICJXZWJDb3JlSGFzM0RSZW5kZXJpbmciOiBbImFuaW1hdGlvbnMvM2QiLCAidHJhbnNm
b3Jtcy8zZCJdLAorICAgICAgICAgICAgIldlYkdMU2hhZGVyIjogWyJmYXN0L2NhbnZhcy93ZWJn
bCJdLAorICAgICAgICAgICAgIldNTEVsZW1lbnQiOiBbImh0dHAvdGVzdHMvd21sIiwgImZhc3Qv
d21sIiwgIndtbCJdLAorICAgICAgICAgICAgInBhcnNlV0NTU0lucHV0UHJvcGVydHkiOiBbImZh
c3Qvd2NzcyJdLAorICAgICAgICAgICAgImlzWEhUTUxNUERvY3VtZW50IjogWyJmYXN0L3hodG1s
bXAiXSwKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXNfZm9yX3N5bWJvbAor
CisgICAgZGVmIF9za2lwcGVkX3Rlc3RzX2Zvcl91bnN1cHBvcnRlZF9mZWF0dXJlcyhzZWxmKToK
KyAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXJlY3RvcmllcyBvZiB1bnN1cHBvcnRlZCB0ZXN0cy4g
U2VhcmNoIGZvciB0aGUKKyAgICAgICAgc3ltYm9scyBpbiB0aGUgc3ltYm9sX2xpc3QsIGlmIGZv
dW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBkaXJlY3RvcmllcyB0byB0aGUgc2tp
cHBlZCBkaXJlY3RvcnkgbGlzdC4iIiIKKyAgICAgICAgZmVhdHVyZV9saXN0ID0gc2VsZi5fcnVu
dGltZV9mZWF0dXJlX2xpc3QoKQorICAgICAgICBkaXJlY3RvcmllcyA9IHNlbGYuX2RpcmVjdG9y
aWVzX2Zvcl9mZWF0dXJlcygpCisKKyAgICAgICAgIyBpZiBEUlQgZmVhdHVyZSBkZXRlY3Rpb24g
bm90IHN1cHBvcnRlZAorICAgICAgICBpZiBub3QgZmVhdHVyZV9saXN0OgorICAgICAgICAgICAg
ZmVhdHVyZV9saXN0ID0gc2VsZi5fc3VwcG9ydGVkX3N5bWJvbF9saXN0KCkKKyAgICAgICAgICAg
IGRpcmVjdG9yaWVzID0gc2VsZi5fZGlyZWN0b3JpZXNfZm9yX3N5bWJvbHMoKQorCisgICAgICAg
IGlmIG5vdCBmZWF0dXJlX2xpc3Q6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBz
a2lwcGVkX2RpcmVjdG9yaWVzID0gW2RpcmVjdG9yaWVzW2ZlYXR1cmVdCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmb3IgZmVhdHVyZSBpbiBkaXJlY3Rvcmllcy5rZXlzKCkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZlYXR1cmUgbm90IGluIGZlYXR1cmVfbGlzdF0K
KyAgICAgICAgcmV0dXJuIHJlZHVjZShvcGVyYXRvci5hZGQsIHNraXBwZWRfZGlyZWN0b3JpZXMp
CisKICAgICBkZWYgX3Rlc3RzX2Zvcl9kaXNhYmxlZF9mZWF0dXJlcyhzZWxmKToKICAgICAgICAg
IyBGSVhNRTogVGhpcyBzaG91bGQgdXNlIHRoZSBmZWF0dXJlIGRldGVjdGlvbiBmcm9tCiAgICAg
ICAgICMgd2Via2l0cGVybC9mZWF0dXJlcy5wbSB0byBtYXRjaCBydW4td2Via2l0LXRlc3RzLgpA
QCAtMjM4LDcgKzI5OCw4IEBAIGNsYXNzIFdlYktpdFBvcnQoYmFzZS5Qb3J0KToKICAgICAgICAg
ICAgICJodHRwL3Rlc3RzL3dlYmFyY2hpdmUiLAogICAgICAgICAgICAgInN2Zy9jdXN0b20vaW1h
Z2Utd2l0aC1wcmVmaXgtaW4td2ViYXJjaGl2ZS5zdmciLAogICAgICAgICBdCi0gICAgICAgIHJl
dHVybiBkaXNhYmxlZF9mZWF0dXJlX3Rlc3RzICsgd2ViYXJjaGl2ZV90ZXN0cworICAgICAgICB1
bnN1cHBvcnRlZF9mZWF0dXJlX3Rlc3RzID0gc2VsZi5fc2tpcHBlZF90ZXN0c19mb3JfdW5zdXBw
b3J0ZWRfZmVhdHVyZXMoKQorICAgICAgICByZXR1cm4gZGlzYWJsZWRfZmVhdHVyZV90ZXN0cyAr
IHdlYmFyY2hpdmVfdGVzdHMgKyB1bnN1cHBvcnRlZF9mZWF0dXJlX3Rlc3RzCiAKICAgICBkZWYg
X3Rlc3RzX2Zyb21fc2tpcHBlZF9maWxlKHNlbGYsIHNraXBwZWRfZmlsZSk6CiAgICAgICAgIHRl
c3RzX3RvX3NraXAgPSBbXQpAQCAtMzM5LDYgKzQwMCw5IEBAIGNsYXNzIFdlYktpdFBvcnQoYmFz
ZS5Qb3J0KToKICAgICBkZWYgX3BhdGhfdG9fZHJpdmVyKHNlbGYpOgogICAgICAgICByZXR1cm4g
c2VsZi5fYnVpbGRfcGF0aCgnRHVtcFJlbmRlclRyZWUnKQogCisgICAgZGVmIF9wYXRoX3RvX3dl
YmNvcmVfbGlicmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgIGRlZiBfcGF0
aF90b19oZWxwZXIoc2VsZik6CiAgICAgICAgIHJldHVybiBOb25lCiAKSW5kZXg6IFdlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2Via2l0X3VuaXR0ZXN0LnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvd2Via2l0X3VuaXR0ZXN0LnB5CShyZXZpc2lvbiAwKQorKysgV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXRfdW5pdHRlc3QucHkJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsNTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmln
aHQgKEMpIDIwMTAgR2Fib3IgUmFwY3NhbnlpIDxyZ2Fib3JAaW5mLnUtc3plZ2VkLmh1PiwgVW5p
dmVyc2l0eSBvZiBTemVnZWQKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0
OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgR29vZ2xlIG5hbWUgbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisj
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB3
ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC53ZWJraXQgaW1wb3J0IFdlYktpdFBvcnQKKworCitj
bGFzcyBUZXN0V2ViS2l0UG9ydChXZWJLaXRQb3J0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwg
c3ltYm9sX2xpc3Q9Tm9uZSwgZmVhdHVyZV9saXN0PU5vbmUpOgorICAgICAgICBzZWxmLnN5bWJv
bF9saXN0ID0gc3ltYm9sX2xpc3QKKyAgICAgICAgc2VsZi5mZWF0dXJlX2xpc3QgPSBmZWF0dXJl
X2xpc3QKKworICAgIGRlZiBfcnVudGltZV9mZWF0dXJlX2xpc3Qoc2VsZik6CisgICAgICAgIHJl
dHVybiBzZWxmLmZlYXR1cmVfbGlzdAorCisgICAgZGVmIF9zdXBwb3J0ZWRfc3ltYm9sX2xpc3Qo
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN5bWJvbF9saXN0CisKKworY2xhc3MgV2ViS2l0
UG9ydFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2tpcHBlZF9kaXJl
Y3Rvcmllc19mb3Jfc3ltYm9scyhzZWxmKToKKyAgICAgICAgc3VwcG9ydGVkX3N5bWJvbHMgPSBb
IkdyYXBoaWNzTGF5ZXIiLCAiV2ViQ29yZUhhczNEUmVuZGVyaW5nIiwgImlzWEhUTUxNUERvY3Vt
ZW50IiwgImZvb1N5bWJvbCJdCisgICAgICAgIGV4cGVjdGVkX2RpcmVjdG9yaWVzID0gc2V0KFsi
bWF0aG1sIiwgImZhc3QvY2FudmFzL3dlYmdsIiwgImh0dHAvdGVzdHMvd21sIiwgImZhc3Qvd21s
IiwgIndtbCIsICJmYXN0L3djc3MiXSkKKyAgICAgICAgcmVzdWx0X2RpcmVjdG9yaWVzID0gc2V0
KFRlc3RXZWJLaXRQb3J0KHN1cHBvcnRlZF9zeW1ib2xzLCBOb25lKS5fc2tpcHBlZF90ZXN0c19m
b3JfdW5zdXBwb3J0ZWRfZmVhdHVyZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1
bHRfZGlyZWN0b3JpZXMsIGV4cGVjdGVkX2RpcmVjdG9yaWVzKQorCisgICAgZGVmIHRlc3Rfc2tp
cHBlZF9kaXJlY3Rvcmllc19mb3JfZmVhdHVyZXMoc2VsZik6CisgICAgICAgIHN1cHBvcnRlZF9m
ZWF0dXJlcyA9IFsiQWNjZWxlcmF0ZWQgQ29tcG9zaXRpbmciLCAiRm9vIEZlYXR1cmUiXQorICAg
ICAgICBleHBlY3RlZF9kaXJlY3RvcmllcyA9IHNldChbImFuaW1hdGlvbnMvM2QiLCAidHJhbnNm
b3Jtcy8zZCJdKQorICAgICAgICByZXN1bHRfZGlyZWN0b3JpZXMgPSBzZXQoVGVzdFdlYktpdFBv
cnQoTm9uZSwgc3VwcG9ydGVkX2ZlYXR1cmVzKS5fc2tpcHBlZF90ZXN0c19mb3JfdW5zdXBwb3J0
ZWRfZmVhdHVyZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRfZGlyZWN0b3Jp
ZXMsIGV4cGVjdGVkX2RpcmVjdG9yaWVzKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>