<?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>38572</bug_id>
          
          <creation_ts>2010-05-05 02:00:15 -0700</creation_ts>
          <short_desc>[WTFURL] Add core URL parser</short_desc>
          <delta_ts>2010-05-07 13:17:29 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>ap</cc>
    
    <cc>brettw</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>mjs</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>221014</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 02:00:15 -0700</bug_when>
    <thetext>[WTFURL] Add core URL parser</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221017</commentid>
    <comment_count>1</comment_count>
      <attachid>55100</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 02:03:37 -0700</bug_when>
    <thetext>Created attachment 55100
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221018</commentid>
    <comment_count>2</comment_count>
      <attachid>55100</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 02:04:05 -0700</bug_when>
    <thetext>Comment on attachment 55100
Patch

oops.  not quite ready</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221021</commentid>
    <comment_count>3</comment_count>
      <attachid>55101</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 02:13:10 -0700</bug_when>
    <thetext>Created attachment 55101
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221025</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-05 02:15:19 -0700</bug_when>
    <thetext>Attachment 55101 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
JavaScriptCore/wtf/url/src/URLParser.h:69:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/url/src/URLParser.h:374:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/url/src/URLParser.h:558:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/url/src/URLParser.h:591:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 4 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221026</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 02:16:40 -0700</bug_when>
    <thetext>&gt; If any of these errors are false positives, please file a bug against
&gt; check-webkit-style.

These are false positives, sadly.  It&apos;s a long-standing bug in the style checker that I don&apos;t have a good idea how to fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221278</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 14:10:50 -0700</bug_when>
    <thetext>Alexey, would you like to be CCed on all these patches, or just the more interesting ones?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221328</commentid>
    <comment_count>7</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-05-05 16:04:34 -0700</bug_when>
    <thetext>Thanks - all would be just fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221356</commentid>
    <comment_count>8</comment_count>
      <attachid>55173</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 16:45:47 -0700</bug_when>
    <thetext>Created attachment 55173
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221358</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 16:46:36 -0700</bug_when>
    <thetext>Updated with the ref =&gt; fragment renaming from Bug 38566.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221360</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-05 16:51:20 -0700</bug_when>
    <thetext>Attachment 55173 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
JavaScriptCore/wtf/url/src/URLParser.h:69:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/url/src/URLParser.h:374:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/url/src/URLParser.h:558:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/url/src/URLParser.h:591:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 4 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221377</commentid>
    <comment_count>11</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-05-05 17:34:37 -0700</bug_when>
    <thetext>&gt; +        This patch adds the core of the URL parser.  The URL parser uses a
&gt; +        templated notion of a character to support different character types.

Ideally, we should match Unicode nomenclature, and call these &quot;code units&quot;
&lt;http://unicode.org/glossary/#code_unit&gt;. It&apos;s wrong to call a UTF-16 code unit
a character, even though that&apos;s already established in WebKit code and some
Web-related specifications - but using this word for bytes in UTF-8 strings is
just weird.

&gt;        &apos;sources&apos;: [
&gt;          &apos;src/URLComponent.h&apos;,
&gt; +        &apos;src/URLParser.h&apos;,

Is this intentional? My understanding was that no port (including chromium) was
using this right away, and it&apos;s strange that only a header was added.

&gt; + * The contents of this file are subject to the Mozilla Public License Version

Aren&apos;t we supposed to only leave LGPL when importing Mozilla code? I don&apos;t know
for sure, but I never saw any official word permitting tri-license in WebKit
repository.

&gt; +    // This handles everything that may be an authority terminator, including
&gt; +    // backslash. For special backslash handling see parseAfterScheme.
&gt; +    static bool isAuthorityTerminator(CHAR ch)

Why not call it &quot;isPossibleAuthorityTerminator&quot; then? BTW, I didn&apos;t know that
semicolon could do that.

Also, I&apos;d make this function just take UChar32. We only need CHAR in arrays.

&gt; +    // Given an already-identified auth section, breaks it into its consituent

Typo: &quot;consituent&quot;

&gt; +    static void parseAuthority(const CHAR* spec, const URLComponent&amp; auth, URLComponent* username, URLComponent* password, URLComponent* host, URLComponent* port)

All URLComponent arguments are required here, so they should all be passed in
the same way, either by pointer or by reference. Or is it some calling
convention I do not know about?

&gt; +        // FIXME: add ASSERT(auth.isValid()); // We should always get an authority.
&gt; +        if (auth.length() == 0) {

Should be !auth.length() (or can we even say auth.isEmpty()?)

&gt; +        // Search backwards for @, which is the separator between the user info and
&gt; +        // the server info.
&gt; +        int i = auth.begin() + auth.length() - 1;
&gt; +        while (i &gt; auth.begin() &amp;&amp; spec[i] != &apos;@&apos;)
&gt; +            --i;

This will find &apos;@&apos; as the last character, but not as the first one. If that&apos;s
correct, this should ideally have a comment explaining why we don&apos;t care.

I only read a small portion of the patch, but it changed while I was looking at
it; will start over later or tomorrow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221386</commentid>
    <comment_count>12</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 17:45:38 -0700</bug_when>
    <thetext>&gt; &gt;        &apos;sources&apos;: [
&gt; &gt;          &apos;src/URLComponent.h&apos;,
&gt; &gt; +        &apos;src/URLParser.h&apos;,
&gt; 
&gt; Is this intentional? My understanding was that no port (including chromium) was
&gt; using this right away, and it&apos;s strange that only a header was added.

This build file isn&apos;t used by any port at the moment, but I&apos;m trying to land the library in an incrementally buildable form.  We can omit the build file if you like.  (I have a local git repo with a complete build file that I can work from.)

&gt; &gt; + * The contents of this file are subject to the Mozilla Public License Version
&gt; 
&gt; Aren&apos;t we supposed to only leave LGPL when importing Mozilla code? I don&apos;t know
&gt; for sure, but I never saw any official word permitting tri-license in WebKit
&gt; repository.

Dunno.  I&apos;m happy to strip this down to LGPL if that&apos;s the thing to do.

&gt; &gt; +    // This handles everything that may be an authority terminator, including
&gt; &gt; +    // backslash. For special backslash handling see parseAfterScheme.
&gt; &gt; +    static bool isAuthorityTerminator(CHAR ch)
&gt; 
&gt; Why not call it &quot;isPossibleAuthorityTerminator&quot; then? BTW, I didn&apos;t know that
&gt; semicolon could do that.

Will do.

&gt; Also, I&apos;d make this function just take UChar32. We only need CHAR in arrays.

The original library used concrete types for these also, but it used a different concrete type.  :)

My plan is to leave the concrete string types one or two layers up in the library so that different folks can use it with different types of strings (e.g., WTFString and std::wstring).

&gt; &gt; +    // Given an already-identified auth section, breaks it into its consituent
&gt; 
&gt; Typo: &quot;consituent&quot;

Will do.

&gt; &gt; +    static void parseAuthority(const CHAR* spec, const URLComponent&amp; auth, URLComponent* username, URLComponent* password, URLComponent* host, URLComponent* port)
&gt; 
&gt; All URLComponent arguments are required here, so they should all be passed in
&gt; the same way, either by pointer or by reference. Or is it some calling
&gt; convention I do not know about?

This is an artifact of the original Google style of this function.  In that convention, input parameters are passed by constant reference and output parameters are passed by pointer.  In this case, we&apos;re extracting the username, password, host, and port from the auth &quot;meta&quot;-component.  I can convert the output parameters to non-constant references if you prefer.

&gt; &gt; +        // FIXME: add ASSERT(auth.isValid()); // We should always get an authority.
&gt; &gt; +        if (auth.length() == 0) {
&gt; 
&gt; Should be !auth.length() (or can we even say auth.isEmpty()?)

I&apos;ll add an isEmpty() method because I personally dislike !auth.length().

&gt; &gt; +        // Search backwards for @, which is the separator between the user info and
&gt; &gt; +        // the server info.
&gt; &gt; +        int i = auth.begin() + auth.length() - 1;
&gt; &gt; +        while (i &gt; auth.begin() &amp;&amp; spec[i] != &apos;@&apos;)
&gt; &gt; +            --i;
&gt; 
&gt; This will find &apos;@&apos; as the last character, but not as the first one. If that&apos;s
&gt; correct, this should ideally have a comment explaining why we don&apos;t care.

I believe it&apos;s correct, but I don&apos;t have a reference off-hand.  The reason is that people might have passwords that contain @ characters and they might not URL-encode them.

&gt; I only read a small portion of the patch, but it changed while I was looking at
&gt; it; will start over later or tomorrow.

Ah sorry about that.  I updated it to reflect the fact that Maciej asked me to rename ref to fragment.

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221400</commentid>
    <comment_count>13</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-05-05 18:01:22 -0700</bug_when>
    <thetext>&gt; We can omit the build file if you like.

I don&apos;t have a strong preference about what goes into .gyp files - if it&apos;s fine with port maintainers, it&apos;s fine with me.

&gt; My plan is to leave the concrete string types one or two layers up in the
&gt; library so that different folks can use it with different types of strings
&gt; (e.g., WTFString and std::wstring).

Understood. Ideally, there would be a way to not seed confusion between code points (AKA characters) and code units though.

&gt; I can convert the output parameters to non-constant references if you prefer.

Yes, I think that it would be beneficial.

&gt; I believe it&apos;s correct, but I don&apos;t have a reference off-hand.

My question was about something else, but I just misread the code, sorry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221421</commentid>
    <comment_count>14</comment_count>
      <attachid>55188</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 18:27:30 -0700</bug_when>
    <thetext>Created attachment 55188
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221422</commentid>
    <comment_count>15</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 18:28:38 -0700</bug_when>
    <thetext>I think this license block is what you asked for.  I found it in Arean.cpp, which seems like a perfectly respectable file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221433</commentid>
    <comment_count>16</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-05-05 18:53:52 -0700</bug_when>
    <thetext>I defer to Maciej on this topic. Formal requirements on patch submission page don&apos;t allow for such license text.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221473</commentid>
    <comment_count>17</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 21:48:34 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; I defer to Maciej on this topic. Formal requirements on patch submission page
&gt; don&apos;t allow for such license text.

I&apos;m happy to use whatever license block you like.  Can you point me to an example file?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221870</commentid>
    <comment_count>18</comment_count>
      <attachid>55188</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-05-06 12:03:38 -0700</bug_when>
    <thetext>Comment on attachment 55188
Patch

&gt; I&apos;m happy to use whatever license block you like.  &gt; Can you point me to an
example file?

I&apos;m still deferring to Maciej, but an example of what I did last time when importing a Mozilla tri-license file is in LayoutTests/java/lc3.

+    // Compatability data points. I list &quot;host&quot;, &quot;path&quot; extracted:

Typo: should be &quot;compatibility&quot;. I don&apos;t think that having the &quot;Us&quot; column is a good idea, there is too much danger of it getting out of sync. Data for IE6 an unspecified version of Firefox is of questionable value, too.

+        // Found &quot;//&lt;some data&gt;&quot;, looks like an authority section. Treat everything

Even if it&apos;s &quot;javascript://%20Nothing%20but%20a%20comment&quot;? If this function is only called for standard URLs, a comment should explain that.

Similar comment for parsePath() - &apos;?&apos; and &quot;#&quot; characters don&apos;t break non-standard URLs into pieces.

+            case &apos;#&apos;:
+                // Record the first # sign only.
+                if (refSeparator &lt; 0)
+                    refSeparator = i;
+                break;

Seems appropriate to break out of the loop here for slightly better performance, and possibly more readable code.

+        // components. The code below words from the end back to the beginning,

&quot;words&quot;?

+    // Initializes a path URL which is merely a scheme followed by a path. Examples
+    // include &quot;about:foo&quot; and &quot;javascript:alert(&apos;bar&apos;);&quot;
+    static void parsePathURL(const CHAR* spec, int specLength, URLSegments&amp; parsed)

It&apos;s quite unclear which functions are API, and which are internal implementation. In particular, why does parsePathURL() trim spaces, given that some code has already checked the URL and found it to be a path URL, necessarily trimming spaces just for that?

A related general question: what kind of input do these functions operate on? Is it byte arrays, or not? I&apos;d expect &quot;spec&quot; to be a byte array, but they are all const CHAR*.

+        } else {
+            // No scheme found, just path.

What cases is this expected to catch? We seem to fall back on this case for /foo/bar UNIX-style paths, but not for C:\foo\bar ones. And a colon in a UNIX-style path would fool us, too.

Same comments about mailto parser.

+        if (!component.isNonempty())

Not part of this patch, but &quot;empty&quot; should be capitalized. And double negation isn&apos;t great.

+        // Skip over any leading 0s.

A drive-by comment: do we have a test for spaces between &apos;:&apos; and port, e.g. &quot;http://foo.com:   80/&quot;?

+        // Copy valid digits to the buffer.
+        char digits[maxDigits + 1]; // +1 for null terminator
+        for (int i = 0; i &lt; nonZeroDigits.length(); i++) {
+            CHAR ch = spec[nonZeroDigits.begin() + i];
+            if (!isPortDigit(ch)) {
+                // Invalid port digit, fail.
+                return InvalidPort;
+            }
+            digits[i] = static_cast&lt;char&gt;(ch);
+        }

We&apos;re doing all this work just to call atoi in the end? We could just as easily parse the number directly.

+        // parameter. The path should start with a slash, so we don&apos;t need to check
+        // the first one.

This comment slightly clashes with a later one: &quot;No slash found, this means the input was degenerate.&quot;

+        if (!query.isNonempty())

More double negation.

+    // We treat slashes and backslashes the same for IE compatability.

Should be &quot;compatibility&quot;.

+    // Given an already-initialized begin index and length, this shrinks the range
+    // to eliminate &quot;should-be-trimmed&quot; characters. Note that the length does *not*
+    // indicate the length of untrimmed data from |begin|, but rather the position
+    // in the input string (so the string starts at character |begin| in the spec,
+    // and goes until |length|).

Then it shouldn&apos;t be called length.

+} // namespace WTF
+
+#endif // URLParser_h

If there is anything in this file to use outside of WTF, there should be using decarations for these symbols.

I expect that you&apos;ll want to address some of the above comments, so marking r-.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221874</commentid>
    <comment_count>19</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-06 12:07:37 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 55188 [details])
&gt; &gt; I&apos;m happy to use whatever license block you like.  &gt; Can you point me to an
&gt; example file?
&gt; 
&gt; I&apos;m still deferring to Maciej, but an example of what I did last time when
&gt; importing a Mozilla tri-license file is in LayoutTests/java/lc3.

I asked him on IRC last night.  He said it was fine.  Will look at the rest of your comments after lunch.  Thanks for the review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221907</commentid>
    <comment_count>20</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2010-05-06 13:13:07 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 55188 [details])
&gt; &gt; I&apos;m happy to use whatever license block you like.  &gt; Can you point me to an
&gt; example file?
&gt; 
&gt; I&apos;m still deferring to Maciej, but an example of what I did last time when
&gt; importing a Mozilla tri-license file is in LayoutTests/java/lc3.
&gt; 
&gt; +    // Compatability data points. I list &quot;host&quot;, &quot;path&quot; extracted:
&gt; 
&gt; Typo: should be &quot;compatibility&quot;. I don&apos;t think that having the &quot;Us&quot; column is a
&gt; good idea, there is too much danger of it getting out of sync. Data for IE6 an
&gt; unspecified version of Firefox is of questionable value, too.
&gt; 
&gt; +        // Found &quot;//&lt;some data&gt;&quot;, looks like an authority section. Treat
&gt; everything
&gt; 
&gt; Even if it&apos;s &quot;javascript://%20Nothing%20but%20a%20comment&quot;? If this function is
&gt; only called for standard URLs, a comment should explain that.

It&apos;s correct this is called only for standard URLs.

&gt; Similar comment for parsePath() - &apos;?&apos; and &quot;#&quot; characters don&apos;t break
&gt; non-standard URLs into pieces.

A &quot;path URL&quot; is javascript: or data: with no breaking, named so because the data is contained in the &quot;path&quot; component of the URL. This function parses the path of a URL, which is used for both standard and file URLs. Probably the comment should state this.


&gt; +            case &apos;#&apos;:
&gt; +                // Record the first # sign only.
&gt; +                if (refSeparator &lt; 0)
&gt; +                    refSeparator = i;
&gt; +                break;
&gt; 
&gt; Seems appropriate to break out of the loop here for slightly better
&gt; performance, and possibly more readable code.
&gt; 
&gt; +        // components. The code below words from the end back to the
&gt; beginning,
&gt; 
&gt; &quot;words&quot;?
&gt; 
&gt; +    // Initializes a path URL which is merely a scheme followed by a path.
&gt; Examples
&gt; +    // include &quot;about:foo&quot; and &quot;javascript:alert(&apos;bar&apos;);&quot;
&gt; +    static void parsePathURL(const CHAR* spec, int specLength, URLSegments&amp;
&gt; parsed)
&gt; 
&gt; It&apos;s quite unclear which functions are API, and which are internal
&gt; implementation. In particular, why does parsePathURL() trim spaces, given that
&gt; some code has already checked the URL and found it to be a path URL,
&gt; necessarily trimming spaces just for that?

I agree this trimming looks unnecessary.

There are three layers of API, here. The top layer is the object-oriented layer (KURL, GURL) which isn&apos;t relevant to this work. The bottom layer is the low level &quot;given this file URL parse it as a file URL&quot;. There is a middle layer that figures out what type of URL it is, knows about known schemes, and then dispatches to the correct low-level parser and canonicalizer.

Chrome uses all of these layers in different places. For example, our URL bar calls ParseStandardURL directly because the user is typing URL fragments and we want to know &quot;given this input, what is the most reasonable possible thing that this could be if it was a standard URL.&quot;

&gt; A related general question: what kind of input do these functions operate on?
&gt; Is it byte arrays, or not? I&apos;d expect &quot;spec&quot; to be a byte array, but they are
&gt; all const CHAR*.

They operate on both byte arrays and UTF-16. It&apos;s templatized/overloaded to support both. The canonical version of a URL we use is 8-bit, which has a nice space advantage and also matches the network format. But many sources of uncanonicalized URL data have 16-bit encoding, for example, the DOM, which is why there is this duality.

&gt; +        } else {
&gt; +            // No scheme found, just path.
&gt; 
&gt; What cases is this expected to catch? We seem to fall back on this case for
&gt; /foo/bar UNIX-style paths, but not for C:\foo\bar ones. And a colon in a
&gt; UNIX-style path would fool us, too.

Yes, that&apos;s correct. If you ever hit this code, the URL is invalid. But this code is to make the most reasonable possible parsing of the invalid URL possible. This is necessary, for example, in the above example of the URL, where the URL may be invalid but we don&apos;t care (because we can fix it once we know where things are, for example, by adding &quot;http&quot;.


&gt; Same comments about mailto parser.
&gt; 
&gt; +        if (!component.isNonempty())
&gt; 
&gt; Not part of this patch, but &quot;empty&quot; should be capitalized. And double negation
&gt; isn&apos;t great.

The &quot;problem&quot; is that there are three states: (0,-1) meaning invalid or not present (x,0) meaning valid but 0-length, and (x,y) meaning valid and nonzero length. The name IsEmpty gives some ambiguity about whether it treats invalid parts as empty, and I didn&apos;t want people to write code like if (!isValid() &amp;&amp; !isEmpty()). Nonempty is unambiguously &quot;there are characters&quot; here which also corresponds to the thing we most often want to test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221913</commentid>
    <comment_count>21</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2010-05-06 13:20:39 -0700</bug_when>
    <thetext>Adam, I&apos;m confused about why this is all implemented in a header file. The old code had concrete types only in header files. Then it had templatized versions in the .cc files. The intent of this was to ensure there would be exactly one copy of each of the two versions of the code globally in the entire project. Since we know there are exactly two possible implementations of each template, we can do this trick to help the compiler generate exactly the two versions it needs globally.

My understanding of templates in headers is that the compiler must generate all version of the code used in any particular source file and include that in the object file, since it doesn&apos;t know what other stuff that object file might be linked to in the future. This can possibly generate a huge amount of duplicated code. Then my understanding is that optimizing linkers will try to clean up this mess, but this is imperfect, doesn&apos;t happen in debug mode, and slows down linking.

If all compilers we use are guaranteed not to generate duplicate code in this case, and it doesn&apos;t slow down compiling and linking, I&apos;m fine having these in a header. But I&apos;m currently quite uncomfortable with that approach and I much prefer the concrete types in public APIs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221935</commentid>
    <comment_count>22</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-06 13:39:24 -0700</bug_when>
    <thetext>&gt; Adam, I&apos;m confused about why this is all implemented in a header file.

Client won&apos;t be using the header directly.  Instead, they&apos;ll access the library through an interface with concrete types.  For example, here&apos;s a first draft of part of the interface for Chromium:

https://bugs.webkit.org/show_bug.cgi?id=38633

The patch in that bug probably isn&apos;t how this is going to turn out in the end, but that should give an idea.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222222</commentid>
    <comment_count>23</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-07 00:39:29 -0700</bug_when>
    <thetext>&gt; +    // Compatability data points. I list &quot;host&quot;, &quot;path&quot; extracted:
&gt; 
&gt; Typo: should be &quot;compatibility&quot;.

Fixed.

&gt; I don&apos;t think that having the &quot;Us&quot; column is a
&gt; good idea, there is too much danger of it getting out of sync. Data for IE6 an
&gt; unspecified version of Firefox is of questionable value, too.

Removed.

&gt; +        // Found &quot;//&lt;some data&gt;&quot;, looks like an authority section. Treat
&gt; everything
&gt; 
&gt; Even if it&apos;s &quot;javascript://%20Nothing%20but%20a%20comment&quot;? If this function is
&gt; only called for standard URLs, a comment should explain that.

Done.

&gt; Similar comment for parsePath() - &apos;?&apos; and &quot;#&quot; characters don&apos;t break
&gt; non-standard URLs into pieces.
&gt; 
&gt; +            case &apos;#&apos;:
&gt; +                // Record the first # sign only.
&gt; +                if (refSeparator &lt; 0)
&gt; +                    refSeparator = i;
&gt; +                break;
&gt; 
&gt; Seems appropriate to break out of the loop here for slightly better
&gt; performance, and possibly more readable code.

I&apos;m not sure how to break out of the loop without a goto, and I&apos;m not sure having a goto improve readability.  :)

&gt; +        // components. The code below words from the end back to the
&gt; beginning,
&gt; 
&gt; &quot;words&quot;?

Presumably &quot;works&quot;.  Fixed.

&gt; +    // Initializes a path URL which is merely a scheme followed by a path.
&gt; Examples
&gt; +    // include &quot;about:foo&quot; and &quot;javascript:alert(&apos;bar&apos;);&quot;
&gt; +    static void parsePathURL(const CHAR* spec, int specLength, URLSegments&amp;
&gt; parsed)
&gt; 
&gt; It&apos;s quite unclear which functions are API, and which are internal
&gt; implementation. In particular, why does parsePathURL() trim spaces, given that
&gt; some code has already checked the URL and found it to be a path URL,
&gt; necessarily trimming spaces just for that?

I&apos;m slightly hesitant to remove this code until we&apos;ve got more of the library landed so we can see which methods are exposed publicly.  I&apos;ve added a FIXME to reflect our current understanding.

&gt; A related general question: what kind of input do these functions operate on?
&gt; Is it byte arrays, or not? I&apos;d expect &quot;spec&quot; to be a byte array, but they are
&gt; all const CHAR*.

See brettw&apos;s answer above.

&gt; +        } else {
&gt; +            // No scheme found, just path.
&gt; 
&gt; What cases is this expected to catch? We seem to fall back on this case for
&gt; /foo/bar UNIX-style paths, but not for C:\foo\bar ones. And a colon in a
&gt; UNIX-style path would fool us, too.

See brettw&apos;s answer above.

&gt; Same comments about mailto parser.
&gt; 
&gt; +        if (!component.isNonempty())
&gt; 
&gt; Not part of this patch, but &quot;empty&quot; should be capitalized.

Done.

&gt; And double negation isn&apos;t great.

Yeah, that doesn&apos;t seem ideal.  Changed to isEmptyOrInvalid().

&gt; +        // Skip over any leading 0s.
&gt; 
&gt; A drive-by comment: do we have a test for spaces between &apos;:&apos; and port, e.g.
&gt; &quot;http://foo.com:   80/&quot;?

I think so:
http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/segments.js#L20

I&apos;m not sure if that test covers what you&apos;re interested in.

&gt; +        // Copy valid digits to the buffer.
&gt; +        char digits[maxDigits + 1]; // +1 for null terminator
&gt; +        for (int i = 0; i &lt; nonZeroDigits.length(); i++) {
&gt; +            CHAR ch = spec[nonZeroDigits.begin() + i];
&gt; +            if (!isPortDigit(ch)) {
&gt; +                // Invalid port digit, fail.
&gt; +                return InvalidPort;
&gt; +            }
&gt; +            digits[i] = static_cast&lt;char&gt;(ch);
&gt; +        }
&gt; 
&gt; We&apos;re doing all this work just to call atoi in the end? We could just as easily
&gt; parse the number directly.

Indeed.  Done.

&gt; +        // parameter. The path should start with a slash, so we don&apos;t need to
&gt; check
&gt; +        // the first one.
&gt; 
&gt; This comment slightly clashes with a later one: &quot;No slash found, this means the
&gt; input was degenerate.&quot;

Fixed.

&gt; +        if (!query.isNonempty())
&gt; 
&gt; More double negation.

Fixed.

&gt; +    // We treat slashes and backslashes the same for IE compatability.
&gt; 
&gt; Should be &quot;compatibility&quot;.

Fixed.

&gt; +    // Given an already-initialized begin index and length, this shrinks the
&gt; range
&gt; +    // to eliminate &quot;should-be-trimmed&quot; characters. Note that the length does
&gt; *not*
&gt; +    // indicate the length of untrimmed data from |begin|, but rather the
&gt; position
&gt; +    // in the input string (so the string starts at character |begin| in the
&gt; spec,
&gt; +    // and goes until |length|).
&gt; 
&gt; Then it shouldn&apos;t be called length.

What name do you suggest?  I&apos;ve changed it to &quot;specLength&quot; because that&apos;s the name of the parameter that&apos;s always supplied.  (Note that although &quot;end&quot; is a tempting name, it&apos;s actually end+1.)

&gt; +} // namespace WTF
&gt; +
&gt; +#endif // URLParser_h
&gt; 
&gt; If there is anything in this file to use outside of WTF, there should be using
&gt; decarations for these symbols.

The exported symbols will use concrete types.  Client aren&apos;t meant to call into this code directly.

&gt; I expect that you&apos;ll want to address some of the above comments, so marking r-.

Thanks for the review.  Updated patch coming shortly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222227</commentid>
    <comment_count>24</comment_count>
      <attachid>55348</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-07 00:43:39 -0700</bug_when>
    <thetext>Created attachment 55348
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222391</commentid>
    <comment_count>25</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-05-07 08:33:07 -0700</bug_when>
    <thetext>&gt; I&apos;m not sure how to break out of the loop without a goto, and I&apos;m not sure
&gt; having a goto improve readability.  :)

        for (int i = path.begin(); i &lt; pathEnd; i++) {
            switch (spec[i]) {
            case &apos;?&apos;:
                // Only match the query string if it precedes the reference fragment
                // and when we haven&apos;t found one already.
-                if (refSeparator &lt; 0 &amp;&amp; querySeparator &lt; 0)
+                if (querySeparator &lt; 0)
                    querySeparator = i;
                break;
            case &apos;#&apos;:
                // Record the first # sign only.
-                if (refSeparator &lt; 0)
-                    refSeparator = i;
+                refSeparator = i;
+                i = pathEnd; // Break out of the loop.
                break;
            default:
                break;
            }
        }

Another alternative is to avoid using switch, which is rather pointless for two cases - then break would work.

&gt; What name do you suggest?  I&apos;ve changed it to &quot;specLength&quot; because that&apos;s the
&gt; name of the parameter that&apos;s always supplied.  (Note that although &quot;end&quot; is a
&gt; tempting name, it&apos;s actually end+1.)

I don&apos;t see it changed in trimURL(), which is the function I was commenting about.

It&apos;s a common idiom to use &quot;end&quot; for a position just after the end, see e.g. Vector::end(), or even the code quoted above that uses pathEnd.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222485</commentid>
    <comment_count>26</comment_count>
      <attachid>55396</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-07 10:57:14 -0700</bug_when>
    <thetext>Created attachment 55396
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222486</commentid>
    <comment_count>27</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-07 10:57:59 -0700</bug_when>
    <thetext>(In reply to comment #25)
&gt; &gt; I&apos;m not sure how to break out of the loop without a goto, and I&apos;m not sure
&gt; &gt; having a goto improve readability.  :)
&gt; 
&gt;         for (int i = path.begin(); i &lt; pathEnd; i++) {
&gt;             switch (spec[i]) {
&gt;             case &apos;?&apos;:
&gt;                 // Only match the query string if it precedes the reference
&gt; fragment
&gt;                 // and when we haven&apos;t found one already.
&gt; -                if (refSeparator &lt; 0 &amp;&amp; querySeparator &lt; 0)
&gt; +                if (querySeparator &lt; 0)
&gt;                     querySeparator = i;
&gt;                 break;
&gt;             case &apos;#&apos;:
&gt;                 // Record the first # sign only.
&gt; -                if (refSeparator &lt; 0)
&gt; -                    refSeparator = i;
&gt; +                refSeparator = i;
&gt; +                i = pathEnd; // Break out of the loop.
&gt;                 break;
&gt;             default:
&gt;                 break;
&gt;             }
&gt;         }

Done.

&gt; &gt; What name do you suggest?  I&apos;ve changed it to &quot;specLength&quot; because that&apos;s the
&gt; &gt; name of the parameter that&apos;s always supplied.  (Note that although &quot;end&quot; is a
&gt; &gt; tempting name, it&apos;s actually end+1.)
&gt; 
&gt; I don&apos;t see it changed in trimURL(), which is the function I was commenting
&gt; about.
&gt; 
&gt; It&apos;s a common idiom to use &quot;end&quot; for a position just after the end, see e.g.
&gt; Vector::end(), or even the code quoted above that uses pathEnd.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222518</commentid>
    <comment_count>28</comment_count>
      <attachid>55396</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-05-07 11:55:33 -0700</bug_when>
    <thetext>Comment on attachment 55396
Patch

+    // the // last CHAR in spec), this shrinks the range to eliminate

The second &quot;//&quot; looks like an error.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222556</commentid>
    <comment_count>29</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-07 12:35:59 -0700</bug_when>
    <thetext>(In reply to comment #28)
&gt; (From update of attachment 55396 [details])
&gt; +    // the // last CHAR in spec), this shrinks the range to eliminate
&gt; 
&gt; The second &quot;//&quot; looks like an error.

Oops.  Yeah.  Textmate is terrible at re-wrapping comments.

&gt; r=me

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222569</commentid>
    <comment_count>30</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-07 12:57:10 -0700</bug_when>
    <thetext>Committed r58966: &lt;http://trac.webkit.org/changeset/58966&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222576</commentid>
    <comment_count>31</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-07 13:10:30 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/58966 might have broken Chromium Linux Release
The following changes are on the blame list:
http://trac.webkit.org/changeset/58966
http://trac.webkit.org/changeset/58967</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>222579</commentid>
    <comment_count>32</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-05-07 13:17:29 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; http://trac.webkit.org/changeset/58966 might have broken Chromium Linux Release
&gt; The following changes are on the blame list:
&gt; http://trac.webkit.org/changeset/58966
&gt; http://trac.webkit.org/changeset/58967

No worries!  This was r58967, and I have taken care of it.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55100</attachid>
            <date>2010-05-05 02:03:37 -0700</date>
            <delta_ts>2010-05-05 02:04:05 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38572-20100505020336.patch</filename>
            <type>text/plain</type>
            <size>28048</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4ODA3KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDYgQEAKKzIwMTAtMDUtMDUgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbV1RGVVJMXSBBZGQgY29yZSBVUkwgcGFyc2VyCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODU3MgorCisgICAgICAgIFRo
aXMgcGF0Y2ggYWRkcyB0aGUgY29yZSBvZiB0aGUgVVJMIHBhcnNlci4gIFRoZSBVUkwgcGFyc2Vy
IHVzZXMgYQorICAgICAgICB0ZW1wbGF0ZWQgbm90aW9uIG9mIGEgY2hhcmFjdGVyIHRvIHN1cHBv
cnQgZGlmZmVyZW50IGNoYXJhY3RlciB0eXBlcy4KKyAgICAgICAgTGF0ZXIgd2UnbGwgYWRkIHNv
bWUgbm9uLXRlbXBsYXRlZCBBUElzIHdpdGggY29uY3JldGUgdHlwZXMgdGhhdAorICAgICAgICBj
bGllbnRzIGNhbiB1c2UgbW9yZSBjb252ZW5pZW50bHkuCisKKyAgICAgICAgVGhlIFVSTFBhcnNl
ciBoYXMgYSBjb3VwbGUgY2FsbHMgdG8gQVNTRVJUKCksIHdoaWNoIEkndmUgY29tbWVudGVkIG91
dAorICAgICAgICBmb3Igbm93LiAgSSdtIG5vdCAxMDAlIHN1cmUgaG93IHRvIGhhbmRsZSB0aGUg
ZGVwZW5kZW5jeSBpc3N1ZXMgdGhlcmUKKyAgICAgICAgeWV0LCBzbyBJJ3ZlIHB1bnRlZCBvbiB0
aGUgaXNzdWUgZm9yIG5vdy4KKworICAgICAgICBBbHNvLCB0aGVyZSBhcmUgYSBudW1iZXIgb2Yg
bWV0aG9kcyB0aGF0IE9PUFMKKworICAgICAgICAqIHd0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5o
OgorICAgICAgICAoV1RGOjpVUkxDb21wb25lbnQ6OmZyb21SYW5nZSk6CisgICAgICAgICogd3Rm
L3VybC9zcmMvVVJMUGFyc2VyLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6Oik6
CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6SXNBdXRob3JpdHlUZXJtaW5hdG9yKToKKyAgICAg
ICAgKFdURjo6VVJMUGFyc2VyOjpEb1BhcnNlQXV0aG9yaXR5KToKKyAgICAgICAgKFdURjo6VVJM
UGFyc2VyOjpEb0V4dHJhY3RTY2hlbWUpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OkRvUGFy
c2VBZnRlclNjaGVtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6RG9QYXJzZVN0YW5kYXJk
VVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpQYXJzZVBhdGgpOgorICAgICAgICAoV1RG
OjpVUkxQYXJzZXI6OkRvUGFyc2VQYXRoVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpE
b1BhcnNlTWFpbHRvVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpEb1BhcnNlUG9ydCk6
CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6RG9FeHRyYWN0RmlsZU5hbWUpOgorICAgICAgICAo
V1RGOjpVUkxQYXJzZXI6OkRvRXh0cmFjdFF1ZXJ5S2V5VmFsdWUpOgorICAgICAgICAoV1RGOjpV
UkxQYXJzZXI6OmlzVVJMU2xhc2gpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnNob3VsZFRy
aW1Gcm9tVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjp0cmltVVJMKToKKyAgICAgICAg
KFdURjo6VVJMUGFyc2VyOjpjb25zZWN1dGl2ZVNsYXNoZXMpOgorICAgICAgICAoV1RGOjpVUkxQ
YXJzZXI6OklzUG9ydERpZ2l0KToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpGaW5kTmV4dEF1
dGhvcml0eVRlcm1pbmF0b3IpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OlBhcnNlVXNlcklu
Zm8pOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OlBhcnNlU2VydmVySW5mbyk6CisgICAgICAg
ICogd3RmL3VybC93dGZ1cmwuZ3lwOgorCiAyMDEwLTA1LTA0ICBZb25nanVuIFpoYW5nICA8eW9u
Z2p1bl96aGFuZ0BhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIu
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3d0ZnVybC5neXAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvd3RmL3VybC93dGZ1cmwuZ3lwCShyZXZpc2lvbiA1ODc5NykKKysrIEph
dmFTY3JpcHRDb3JlL3d0Zi91cmwvd3RmdXJsLmd5cAkod29ya2luZyBjb3B5KQpAQCAtMzksNiAr
MzksNyBAQAogICAgICAgXSwKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnc3JjL1VSTENv
bXBvbmVudC5oJywKKyAgICAgICAgJ3NyYy9VUkxQYXJzZXIuaCcsCiAgICAgICBdLAogICAgICAg
J2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CiAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBb
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAkocmV2aXNp
b24gNTg3OTcpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAko
d29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsMTMgQEAgcHVibGljOgogICAgIFVSTENvbXBvbmVu
dCgpIDogbV9iZWdpbigwKSwgbV9sZW5ndGgoLTEpIHsgfQogICAgIFVSTENvbXBvbmVudChpbnQg
YmVnaW4sIGludCBsZW5ndGgpIDogbV9iZWdpbihiZWdpbiksIG1fbGVuZ3RoKGxlbmd0aCkgeyB9
CiAKKyAgICAvLyBIZWxwZXIgdGhhdCByZXR1cm5zIGEgY29tcG9uZW50IGNyZWF0ZWQgd2l0aCB0
aGUgZ2l2ZW4gYmVnaW4gYW5kIGVuZGluZworICAgIC8vIHBvaW50cy4gVGhlIGVuZGluZyBwb2lu
dCBpcyBub24taW5jbHVzaXZlLgorICAgIHN0YXRpYyBpbmxpbmUgVVJMQ29tcG9uZW50IGZyb21S
YW5nZShpbnQgYmVnaW4sIGludCBlbmQpCisgICAgeworICAgICAgICByZXR1cm4gVVJMQ29tcG9u
ZW50KGJlZ2luLCBlbmQgLSBiZWdpbik7CisgICAgfQorCiAgICAgLy8gUmV0dXJucyB0cnVlIGlm
IHRoaXMgY29tcG9uZW50IGlzIHZhbGlkLCBtZWFuaW5nIHRoZSBsZW5ndGggaXMgZ2l2ZW4uIEV2
ZW4KICAgICAvLyB2YWxpZCBjb21wb25lbnRzIG1heSBiZSBlbXB0eSB0byByZWNvcmQgdGhlIGZh
Y3QgdGhhdCB0aGV5IGV4aXN0LgogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1f
bGVuZ3RoICE9IC0xOyB9CkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxQYXJz
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxQYXJzZXIu
aAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFBhcnNlci5o
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYwNCBAQAorLyogQmFzZWQgb24gbnNVUkxQYXJzZXJz
LmNjIGZyb20gTW96aWxsYQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxs
YSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCisgKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5
IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNl
bnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIGh0dHA6Ly93
d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRo
ZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCisgKiBXSVRIT1VU
IFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhl
IExpY2Vuc2UKKyAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBh
bmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisgKiBMaWNlbnNlLgorICoKKyAqIFRoZSBPcmlnaW5h
bCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVy
IG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCisgKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jw
b3JhdGlvbi4KKyAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFy
ZSBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KKyAqCisgKiBDb250cmlidXRvcihzKToKKyAqICAgRGFyaW4gRmlzaGVyIChv
cmlnaW5hbCBhdXRob3IpCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRo
aXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGVpdGhlciB0aGUgR05V
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBv
cgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBv
ciBsYXRlciAodGhlICJMR1BMIiksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9m
IHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAorICogb2YgdGhvc2Ug
YWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBm
aWxlIG9ubHkKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQ
TCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8KKyAqIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhp
cyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCisgKiBkZWNp
c2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdp
dGggdGhlIG5vdGljZQorICogYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQ
TCBvciB0aGUgTEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUKKyAqIHRoZSBwcm92aXNpb25zIGFi
b3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIK
KyAqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwu
CisgKgorICogKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogKi8KKworI2lmbmRlZiBVUkxQ
YXJzZXJfaAorI2RlZmluZSBVUkxQYXJzZXJfaAorCisjaW5jbHVkZSAiVVJMQ29tcG9uZW50Lmgi
CisjaW5jbHVkZSAiVVJMU2VnbWVudHMuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1l
c3BhY2UgV1RGIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgQ0hBUj4KK2NsYXNzIFVSTFBhcnNlciB7
CitwdWJsaWM6CisgICAgZW51bSBTcGVjaWFsUG9ydCB7CisgICAgICAgIFVuc3BlY2lmaWVkUG9y
dCA9IC0xLAorICAgICAgICBJbnZhbGlkUG9ydCA9IC0yLAorICAgIH07CisKKyAgICAvLyBUaGlz
IGhhbmRsZXMgZXZlcnl0aGluZyB0aGF0IG1heSBiZSBhbiBhdXRob3JpdHkgdGVybWluYXRvciwg
aW5jbHVkaW5nCisgICAgLy8gYmFja3NsYXNoLiBGb3Igc3BlY2lhbCBiYWNrc2xhc2ggaGFuZGxp
bmcgc2VlIERvUGFyc2VBZnRlclNjaGVtZS4KKyAgICBzdGF0aWMgYm9vbCBJc0F1dGhvcml0eVRl
cm1pbmF0b3IoQ0hBUiBjaCkKKyAgICB7CisgICAgICAgIHJldHVybiBVUkxQYXJzZXI6OmlzVVJM
U2xhc2goY2gpIHx8IGNoID09ICc/JyB8fCBjaCA9PSAnIycgfHwgY2ggPT0gJzsnOworICAgIH0K
KworICAgIC8vIEdpdmVuIGFuIGFscmVhZHktaWRlbnRpZmllZCBhdXRoIHNlY3Rpb24sIGJyZWFr
cyBpdCBpbnRvIGl0cyBjb25zaXR1ZW50CisgICAgLy8gcGFydHMuIFRoZSBwb3J0IG51bWJlciB3
aWxsIGJlIHBhcnNlZCBhbmQgdGhlIHJlc3VsdGluZyBpbnRlZ2VyIHdpbGwgYmUKKyAgICAvLyBm
aWxsZWQgaW50byB0aGUgZ2l2ZW4gKnBvcnQgdmFyaWFibGUsIG9yIC0xIGlmIHRoZXJlIGlzIG5v
IHBvcnQgbnVtYmVyIG9yIGl0CisgICAgLy8gaXMgaW52YWxpZC4KKyAgICBzdGF0aWMgdm9pZCBE
b1BhcnNlQXV0aG9yaXR5KGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0IFVSTENvbXBvbmVudCYgYXV0
aCwgVVJMQ29tcG9uZW50KiB1c2VybmFtZSwgVVJMQ29tcG9uZW50KiBwYXNzd29yZCwgVVJMQ29t
cG9uZW50KiBob3N0LCBVUkxDb21wb25lbnQqIHBvcnQpCisgICAgeworICAgICAgICAvLyBGSVhN
RTogYWRkIEFTU0VSVChhdXRoLmlzVmFsaWQoKSk7IC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGFu
IGF1dGhvcml0eS4KKyAgICAgICAgaWYgKGF1dGgubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAg
ICAgdXNlcm5hbWUtPnJlc2V0KCk7CisgICAgICAgICAgICBwYXNzd29yZC0+cmVzZXQoKTsKKyAg
ICAgICAgICAgIGhvc3QtPnJlc2V0KCk7CisgICAgICAgICAgICBwb3J0LT5yZXNldCgpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VhcmNoIGJhY2t3YXJk
cyBmb3IgQCwgd2hpY2ggaXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSB1c2VyIGluZm8gYW5k
CisgICAgICAgIC8vIHRoZSBzZXJ2ZXIgaW5mby4KKyAgICAgICAgaW50IGkgPSBhdXRoLmJlZ2lu
KCkgKyBhdXRoLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgd2hpbGUgKGkgPiBhdXRoLmJlZ2luKCkg
JiYgc3BlY1tpXSAhPSAnQCcpCisgICAgICAgICAgICAtLWk7CisKKyAgICAgICAgaWYgKHNwZWNb
aV0gPT0gJ0AnKSB7CisgICAgICAgICAgICAvLyBGb3VuZCB1c2VyIGluZm86IDx1c2VyLWluZm8+
QDxzZXJ2ZXItaW5mbz4KKyAgICAgICAgICAgIFBhcnNlVXNlckluZm8oc3BlYywgVVJMQ29tcG9u
ZW50KGF1dGguYmVnaW4oKSwgaSAtIGF1dGguYmVnaW4oKSksCisgICAgICAgICAgICB1c2VybmFt
ZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgUGFyc2VTZXJ2ZXJJbmZvKHNwZWMsIFVSTENvbXBv
bmVudDo6ZnJvbVJhbmdlKGkgKyAxLCBhdXRoLmJlZ2luKCkgKyBhdXRoLmxlbmd0aCgpKSwKKyAg
ICAgICAgICAgIGhvc3QsIHBvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8g
Tm8gdXNlciBpbmZvLCBldmVyeXRoaW5nIGlzIHNlcnZlciBpbmZvLgorICAgICAgICAgICAgdXNl
cm5hbWUtPnJlc2V0KCk7CisgICAgICAgICAgICBwYXNzd29yZC0+cmVzZXQoKTsKKyAgICAgICAg
ICAgIFBhcnNlU2VydmVySW5mbyhzcGVjLCBhdXRoLCBob3N0LCBwb3J0KTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHN0YXRpYyBib29sIERvRXh0cmFjdFNjaGVtZShjb25zdCBDSEFSKiBzcGVj
LCBpbnQgc3BlY0xlbmd0aCwgVVJMQ29tcG9uZW50KiBzY2hlbWUpCisgICAgeworICAgICAgICAv
LyBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAg
ICBpbnQgYmVnaW4gPSAwOworICAgICAgICB3aGlsZSAoYmVnaW4gPCBzcGVjTGVuZ3RoICYmIFVS
TFBhcnNlcjo6c2hvdWxkVHJpbUZyb21VUkwoc3BlY1tiZWdpbl0pKQorICAgICAgICAgICAgYmVn
aW4rKzsKKyAgICAgICAgaWYgKGJlZ2luID09IHNwZWNMZW5ndGgpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7IC8vIElucHV0IGlzIGVtcHR5IG9yIGFsbCB3aGl0ZXNwYWNlLgorCisgICAgICAg
IC8vIEZpbmQgdGhlIGZpcnN0IGNvbG9uIGNoYXJhY3Rlci4KKyAgICAgICAgZm9yIChpbnQgaSA9
IGJlZ2luOyBpIDwgc3BlY0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3BlY1tpXSA9
PSAnOicpIHsKKyAgICAgICAgICAgICAgICAqc2NoZW1lID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFu
Z2UoYmVnaW4sIGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gY29sb24gZm91bmQ6IG5v
IHNjaGVtZQorICAgIH0KKworICAgIC8vIEZpbGxzIGluIGFsbCBtZW1iZXJzIG9mIHRoZSBVUkxT
ZWdtZW50cyBzdHJ1Y3R1cmUgZXhjZXB0IGZvciB0aGUgc2NoZW1lLgorICAgIC8vCisgICAgLy8g
fHNwZWN8IGlzIHRoZSBmdWxsIHNwZWMgYmVpbmcgcGFyc2VkLCBvZiBsZW5ndGggfHNwZWNMZW5n
dGh8LgorICAgIC8vIHxhZnRlclNjaGVtZXwgaXMgdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBm
b2xsb3dpbmcgdGhlIHNjaGVtZSAoYWZ0ZXIgdGhlCisgICAgLy8gICBjb2xvbikgd2hlcmUgd2Un
bGwgYmVnaW4gcGFyc2luZy4KKyAgICAvLworICAgIC8vIENvbXBhdGFiaWxpdHkgZGF0YSBwb2lu
dHMuIEkgbGlzdCAiaG9zdCIsICJwYXRoIiBleHRyYWN0ZWQ6CisgICAgLy8gSW5wdXQgICAgICAg
ICAgICAgICAgSUU2ICAgICAgICAgICAgIEZpcmVmb3ggICAgICAgICAgICAgICAgVXMKKyAgICAv
LyAtLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0gICAg
ICAgICAtLS0tLS0tLS0tLS0tLQorICAgIC8vIGh0dHA6Ly9mb28uY29tLyAgICAgICJmb28uY29t
IiwgIi8iICAiZm9vLmNvbSIsICIvIiAgICAgICAgICJmb28uY29tIiwgIi8iCisgICAgLy8gaHR0
cDpmb28uY29tLyAgICAgICAgImZvby5jb20iLCAiLyIgICJmb28uY29tIiwgIi8iICAgICAgICAg
ImZvby5jb20iLCAiLyIKKyAgICAvLyBodHRwOi9mb28uY29tLyAgICAgICBmYWlsKCopICAgICAg
ICAgImZvby5jb20iLCAiLyIgICAgICAgICAiZm9vLmNvbSIsICIvIgorICAgIC8vIGh0dHA6XGZv
by5jb20vICAgICAgIGZhaWwoKikgICAgICAgICAiXGZvby5jb20iLCAiLyIoZmFpbCkgICJmb28u
Y29tIiwgIi8iCisgICAgLy8gaHR0cDovLy8vZm9vLmNvbS8gICAgImZvby5jb20iLCAiLyIgICJm
b28uY29tIiwgIi8iICAgICAgICAgImZvby5jb20iLCAiLyIKKyAgICAvLworICAgIC8vICgqKSBJ
bnRlcmVzdGluZ2x5LCBhbHRob3VnaCBJRSBmYWlscyB0byBsb2FkIHRoZXNlIFVSTHMsIGl0cyBo
aXN0b3J5CisgICAgLy8gY2Fub25pY2FsaXplciBoYW5kbGVzIHRoZW0sIG1lYW5pbmcgaWYgeW91
J3ZlIGJlZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyAiaHR0cDovL2Zvby5jb20vIiBs
aW5rLCBpdCB3aWxsIGJlIGNvbG9yZWQuCisgICAgc3RhdGljIHZvaWQgRG9QYXJzZUFmdGVyU2No
ZW1lKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3RoLCBpbnQgYWZ0ZXJTY2hlbWUsIFVS
TFNlZ21lbnRzKiBwYXJzZWQpCisgICAgeworICAgICAgICBpbnQgbnVtYmVyT2ZTbGFzaGVzID0g
Y29uc2VjdXRpdmVTbGFzaGVzKHNwZWMsIGFmdGVyU2NoZW1lLCBzcGVjTGVuZ3RoKTsKKyAgICAg
ICAgaW50IGFmdGVyU2xhc2hlcyA9IGFmdGVyU2NoZW1lICsgbnVtYmVyT2ZTbGFzaGVzOworCisg
ICAgICAgIC8vIEZpcnN0IHNwbGl0IGludG8gdHdvIG1haW4gcGFydHMsIHRoZSBhdXRob3JpdHkg
KHVzZXJuYW1lLCBwYXNzd29yZCwgaG9zdCwKKyAgICAgICAgLy8gYW5kIHBvcnQpIGFuZCB0aGUg
ZnVsbCBwYXRoIChwYXRoLCBxdWVyeSwgYW5kIHJlZmVyZW5jZSkuCisgICAgICAgIFVSTENvbXBv
bmVudCBhdXRob3JpdHk7CisgICAgICAgIFVSTENvbXBvbmVudCBmdWxsUGF0aDsKKworICAgICAg
ICAvLyBGb3VuZCAiLy88c29tZSBkYXRhPiIsIGxvb2tzIGxpa2UgYW4gYXV0aG9yaXR5IHNlY3Rp
b24uIFRyZWF0IGV2ZXJ5dGhpbmcKKyAgICAgICAgLy8gZnJvbSB0aGVyZSB0byB0aGUgbmV4dCBz
bGFzaCAob3IgZW5kIG9mIHNwZWMpIHRvIGJlIHRoZSBhdXRob3JpdHkuIE5vdGUKKyAgICAgICAg
Ly8gdGhhdCB3ZSBpZ25vcmUgdGhlIG51bWJlciBvZiBzbGFzaGVzIGFuZCB0cmVhdCBpdCBhcyB0
aGUgYXV0aG9yaXR5LgorICAgICAgICBpbnQgYXV0aEVuZCA9IEZpbmROZXh0QXV0aG9yaXR5VGVy
bWluYXRvcihzcGVjLCBhZnRlclNsYXNoZXMsIHNwZWNMZW5ndGgpOworICAgICAgICBhdXRob3Jp
dHkgPSBVUkxDb21wb25lbnQoYWZ0ZXJTbGFzaGVzLCBhdXRoRW5kIC0gYWZ0ZXJTbGFzaGVzKTsK
KworICAgICAgICBpZiAoYXV0aEVuZCA9PSBzcGVjTGVuZ3RoKSAvLyBObyBiZWdpbm5pbmcgb2Yg
cGF0aCBmb3VuZC4KKyAgICAgICAgICAgIGZ1bGxQYXRoID0gVVJMQ29tcG9uZW50KCk7CisgICAg
ICAgIGVsc2UgLy8gRXZlcnl0aGluZyBzdGFydGluZyBmcm9tIHRoZSBzbGFzaCB0byB0aGUgZW5k
IGlzIHRoZSBwYXRoLgorICAgICAgICAgICAgZnVsbFBhdGggPSBVUkxDb21wb25lbnQoYXV0aEVu
ZCwgc3BlY0xlbmd0aCAtIGF1dGhFbmQpOworCisgICAgICAgIC8vIE5vdyBwYXJzZSB0aG9zZSB0
d28gc3ViLXBhcnRzLgorICAgICAgICBEb1BhcnNlQXV0aG9yaXR5KHNwZWMsIGF1dGhvcml0eSwg
JnBhcnNlZC0+dXNlcm5hbWUsICZwYXJzZWQtPnBhc3N3b3JkLCAmcGFyc2VkLT5ob3N0LCAmcGFy
c2VkLT5wb3J0KTsKKyAgICAgICAgUGFyc2VQYXRoKHNwZWMsIGZ1bGxQYXRoLCAmcGFyc2VkLT5w
YXRoLCAmcGFyc2VkLT5xdWVyeSwgJnBhcnNlZC0+cmVmKTsKKyAgICB9CisKKyAgICAvLyBUaGUg
bWFpbiBwYXJzaW5nIGZ1bmN0aW9uIGZvciBzdGFuZGFyZCBVUkxzLiBTdGFuZGFyZCBVUkxzIGhh
dmUgYSBzY2hlbWUsCisgICAgLy8gaG9zdCwgcGF0aCwgZXRjLgorICAgIHN0YXRpYyB2b2lkIERv
UGFyc2VTdGFuZGFyZFVSTChjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMU2Vn
bWVudHMqIHBhcnNlZCkKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBhZGQgQVNTRVJUKHNwZWNM
ZW5ndGggPj0gMCk7CisKKyAgICAgICAgLy8gU3RyaXAgbGVhZGluZyAmIHRyYWlsaW5nIHNwYWNl
cyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAgICBpbnQgYmVnaW4gPSAwOworICAgICAg
ICBVUkxQYXJzZXI6OnRyaW1VUkwoc3BlYywgJmJlZ2luLCAmc3BlY0xlbmd0aCk7CisKKyAgICAg
ICAgaW50IGFmdGVyU2NoZW1lOworICAgICAgICBpZiAoRG9FeHRyYWN0U2NoZW1lKHNwZWMsIHNw
ZWNMZW5ndGgsICZwYXJzZWQtPnNjaGVtZSkpCisgICAgICAgICAgICBhZnRlclNjaGVtZSA9IHBh
cnNlZC0+c2NoZW1lLmVuZCgpICsgMTsgLy8gU2tpcCBwYXN0IHRoZSBjb2xvbi4KKyAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAvLyBTYXkgdGhlcmUncyBubyBzY2hlbWUgd2hlbiB0aGVyZSBp
cyBhIGNvbG9uLiBXZSBjb3VsZCBhbHNvIHNheSB0aGF0CisgICAgICAgICAgICAvLyBldmVyeXRo
aW5nIGlzIHRoZSBzY2hlbWUuIEJvdGggd291bGQgcHJvZHVjZSBhbiBpbnZhbGlkIFVSTCwgYnV0
IHRoaXMgd2F5CisgICAgICAgICAgICAvLyBzZWVtcyBsZXNzIHdyb25nIGluIG1vcmUgY2FzZXMu
CisgICAgICAgICAgICBwYXJzZWQtPnNjaGVtZS5yZXNldCgpOworICAgICAgICAgICAgYWZ0ZXJT
Y2hlbWUgPSBiZWdpbjsKKyAgICAgICAgfQorICAgICAgICBEb1BhcnNlQWZ0ZXJTY2hlbWUoc3Bl
Yywgc3BlY0xlbmd0aCwgYWZ0ZXJTY2hlbWUsIHBhcnNlZCk7CisgICAgfQorCisgICAgc3RhdGlj
IHZvaWQgUGFyc2VQYXRoKGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0IFVSTENvbXBvbmVudCYgcGF0
aCwgVVJMQ29tcG9uZW50KiBmaWxlcGF0aCwgVVJMQ29tcG9uZW50KiBxdWVyeSwgVVJMQ29tcG9u
ZW50KiByZWYpCisgICAgeworICAgICAgICAvLyBwYXRoID0gWy9dPHNlZ21lbnQxPi88c2VnbWVu
dDI+LzwuLi4+LzxzZWdtZW50Tj47PHBhcmFtPj88cXVlcnk+IzxyZWY+CisKKyAgICAgICAgLy8g
U3BlY2lhbCBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gcGF0aC4KKyAgICAgICAgaWYgKHBhdGgubGVu
Z3RoKCkgPT0gLTEpIHsKKyAgICAgICAgICAgIGZpbGVwYXRoLT5yZXNldCgpOworICAgICAgICAg
ICAgcXVlcnktPnJlc2V0KCk7CisgICAgICAgICAgICByZWYtPnJlc2V0KCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQocGF0aC5s
ZW5ndGgoKSA+IDApOyAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2ZSAwIGxlbmd0aCBwYXRocy4KKwor
ICAgICAgICAvLyBTZWFyY2ggZm9yIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWl0aGVyID8gb3IgIy4K
KyAgICAgICAgaW50IHBhdGhFbmQgPSBwYXRoLmJlZ2luKCkgKyBwYXRoLmxlbmd0aCgpOworCisg
ICAgICAgIGludCBxdWVyeVNlcGFyYXRvciA9IC0xOyAvLyBJbmRleCBvZiB0aGUgJz8nCisgICAg
ICAgIGludCByZWZTZXBhcmF0b3IgPSAtMTsgLy8gSW5kZXggb2YgdGhlICcjJworICAgICAgICBm
b3IgKGludCBpID0gcGF0aC5iZWdpbigpOyBpIDwgcGF0aEVuZDsgaSsrKSB7CisgICAgICAgICAg
ICBzd2l0Y2ggKHNwZWNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAg
ICAgIC8vIE9ubHkgbWF0Y2ggdGhlIHF1ZXJ5IHN0cmluZyBpZiBpdCBwcmVjZWRlcyB0aGUgcmVm
ZXJlbmNlIGZyYWdtZW50CisgICAgICAgICAgICAgICAgLy8gYW5kIHdoZW4gd2UgaGF2ZW4ndCBm
b3VuZCBvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBpZiAocmVmU2VwYXJhdG9yIDwgMCAm
JiBxdWVyeVNlcGFyYXRvciA8IDApCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U2VwYXJhdG9y
ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyMnOgorICAg
ICAgICAgICAgICAgIC8vIFJlY29yZCB0aGUgZmlyc3QgIyBzaWduIG9ubHkuCisgICAgICAgICAg
ICAgICAgaWYgKHJlZlNlcGFyYXRvciA8IDApCisgICAgICAgICAgICAgICAgICAgIHJlZlNlcGFy
YXRvciA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gTWFya2VycyBwb2ludGluZyB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIGVhY2ggb2YgdGhl
c2UgY29ycmVzcG9uZGluZworICAgICAgICAvLyBjb21wb25lbnRzLiBUaGUgY29kZSBiZWxvdyB3
b3JkcyBmcm9tIHRoZSBlbmQgYmFjayB0byB0aGUgYmVnaW5uaW5nLAorICAgICAgICAvLyBhbmQg
d2lsbCB1cGRhdGUgdGhlc2UgaW5kaWNlcyBhcyBpdCBmaW5kcyBjb21wb25lbnRzIHRoYXQgZXhp
c3QuCisgICAgICAgIGludCBmaWxlRW5kLCBxdWVyeUVuZDsKKworICAgICAgICAvLyBSZWYgZnJh
Z21lbnQ6IGZyb20gdGhlICMgdG8gdGhlIGVuZCBvZiB0aGUgcGF0aC4KKyAgICAgICAgaWYgKHJl
ZlNlcGFyYXRvciA+PSAwKSB7CisgICAgICAgICAgICBmaWxlRW5kID0gcmVmU2VwYXJhdG9yOwor
ICAgICAgICAgICAgcXVlcnlFbmQgPSByZWZTZXBhcmF0b3I7CisgICAgICAgICAgICAqcmVmID0g
VVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocmVmU2VwYXJhdG9yICsgMSwgcGF0aEVuZCk7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlRW5kID0gcGF0aEVuZDsKKyAgICAgICAgICAg
IHF1ZXJ5RW5kID0gcGF0aEVuZDsKKyAgICAgICAgICAgIHJlZi0+cmVzZXQoKTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIFF1ZXJ5IGZyYWdtZW50OiBldmVyeXRoaW5nIGZyb20gdGhlID8gdG8g
dGhlIG5leHQgYm91bmRhcnkgKGVpdGhlciB0aGUgZW5kCisgICAgICAgIC8vIG9mIHRoZSBwYXRo
IG9yIHRoZSByZWYgZnJhZ21lbnQpLgorICAgICAgICBpZiAocXVlcnlTZXBhcmF0b3IgPj0gMCkg
eworICAgICAgICAgICAgZmlsZUVuZCA9IHF1ZXJ5U2VwYXJhdG9yOworICAgICAgICAgICAgKnF1
ZXJ5ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocXVlcnlTZXBhcmF0b3IgKyAxLCBxdWVyeUVu
ZCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcXVlcnktPnJlc2V0KCk7CisKKyAgICAg
ICAgLy8gRmlsZSBwYXRoOiB0cmVhdCBhbiBlbXB0eSBmaWxlIHBhdGggYXMgbm8gZmlsZSBwYXRo
LgorICAgICAgICBpZiAoZmlsZUVuZCAhPSBwYXRoLmJlZ2luKCkpCisgICAgICAgICAgICAqZmls
ZXBhdGggPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShwYXRoLmJlZ2luKCksIGZpbGVFbmQpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBmaWxlcGF0aC0+cmVzZXQoKTsKKyAgICB9CisKKyAg
ICAvLyBJbml0aWFsaXplcyBhIHBhdGggVVJMIHdoaWNoIGlzIG1lcmVseSBhIHNjaGVtZSBmb2xs
b3dlZCBieSBhIHBhdGguIEV4YW1wbGVzCisgICAgLy8gaW5jbHVkZSAiYWJvdXQ6Zm9vIiBhbmQg
ImphdmFzY3JpcHQ6YWxlcnQoJ2JhcicpOyIKKyAgICBzdGF0aWMgdm9pZCBEb1BhcnNlUGF0aFVS
TChjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMU2VnbWVudHMqIHBhcnNlZCkK
KyAgICB7CisgICAgICAgIC8vIEdldCB0aGUgbm9uLXBhdGggYW5kIG5vbi1zY2hlbWUgcGFydHMg
b2YgdGhlIFVSTCBvdXQgb2YgdGhlIHdheSwgd2UgbmV2ZXIKKyAgICAgICAgLy8gdXNlIHRoZW0u
CisgICAgICAgIHBhcnNlZC0+dXNlcm5hbWUucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLT5wYXNz
d29yZC5yZXNldCgpOworICAgICAgICBwYXJzZWQtPmhvc3QucmVzZXQoKTsKKyAgICAgICAgcGFy
c2VkLT5wb3J0LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+cXVlcnkucmVzZXQoKTsKKyAgICAg
ICAgcGFyc2VkLT5yZWYucmVzZXQoKTsKKworICAgICAgICAvLyBTdHJpcCBsZWFkaW5nICYgdHJh
aWxpbmcgc3BhY2VzIGFuZCBjb250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIGludCBiZWdpbiA9
IDA7CisgICAgICAgIFVSTFBhcnNlcjo6dHJpbVVSTChzcGVjLCAmYmVnaW4sICZzcGVjTGVuZ3Ro
KTsKKworICAgICAgICAvLyBIYW5kbGUgZW1wdHkgc3BlY3Mgb3Igb25lcyB0aGF0IGNvbnRhaW4g
b25seSB3aGl0ZXNwYWNlIG9yIGNvbnRyb2wgY2hhcnMuCisgICAgICAgIGlmIChiZWdpbiA9PSBz
cGVjTGVuZ3RoKSB7CisgICAgICAgICAgICBwYXJzZWQtPnNjaGVtZS5yZXNldCgpOworICAgICAg
ICAgICAgcGFyc2VkLT5wYXRoLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBzY2hlbWUsIHdpdGggdGhlIHBhdGggYmVpbmcg
ZXZlcnl0aGluZyBmb2xsb3dpbmcuIFdlIGFsc28KKyAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNl
IHdoZXJlIHRoZXJlIGlzIG5vIHNjaGVtZS4KKyAgICAgICAgaWYgKERvRXh0cmFjdFNjaGVtZSgm
c3BlY1tiZWdpbl0sIHNwZWNMZW5ndGggLSBiZWdpbiwgJnBhcnNlZC0+c2NoZW1lKSkgeworICAg
ICAgICAgICAgLy8gT2Zmc2V0IHRoZSByZXN1bHRzIHNpbmNlIHdlIGdhdmUgRG9FeHRyYWN0U2No
ZW1lIGEgc3Vic3RyaW5nLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUuc2V0QmVnaW4ocGFy
c2VkLT5zY2hlbWUuYmVnaW4oKSArIGJlZ2luKTsKKworICAgICAgICAgICAgLy8gRm9yIGNvbXBh
dGFiaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQgVVJMIHBhcnNlciwgd2UgdHJlYXQgbm8gcGF0aCBh
cworICAgICAgICAgICAgLy8gLTEsIHJhdGhlciB0aGFuIGhhdmluZyBhIGxlbmd0aCBvZiAwICh3
ZSBub3JtYWxseSB3b3VsZG4ndCBjYXJlIHNvCisgICAgICAgICAgICAvLyBtdWNoIGZvciB0aGVz
ZSBub24tc3RhbmRhcmQgVVJMcykuCisgICAgICAgICAgICBpZiAocGFyc2VkLT5zY2hlbWUuZW5k
KCkgPT0gc3BlY0xlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgcGFyc2VkLT5wYXRoLnJlc2V0
KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGFyc2VkLT5wYXRoID0gVVJM
Q29tcG9uZW50Ojpmcm9tUmFuZ2UocGFyc2VkLT5zY2hlbWUuZW5kKCkgKyAxLCBzcGVjTGVuZ3Ro
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHNjaGVtZSBmb3VuZCwganVz
dCBwYXRoLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAgICAg
IHBhcnNlZC0+cGF0aCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGJlZ2luLCBzcGVjTGVuZ3Ro
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIERvUGFyc2VNYWlsdG9VUkwo
Y29uc3QgQ0hBUiogc3BlYywgaW50IHNwZWNMZW5ndGgsIFVSTFNlZ21lbnRzKiBwYXJzZWQpCisg
ICAgeworICAgICAgICAvLyBGSVhNRTogYWRkIEFTU0VSVChzcGVjTGVuZ3RoID49IDApOworCisg
ICAgICAgIC8vIEdldCB0aGUgbm9uLXBhdGggYW5kIG5vbi1zY2hlbWUgcGFydHMgb2YgdGhlIFVS
TCBvdXQgb2YgdGhlIHdheSwgd2UgbmV2ZXIKKyAgICAgICAgLy8gdXNlIHRoZW0uCisgICAgICAg
IHBhcnNlZC0+dXNlcm5hbWUucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLT5wYXNzd29yZC5yZXNl
dCgpOworICAgICAgICBwYXJzZWQtPmhvc3QucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLT5wb3J0
LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+cmVmLnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+
cXVlcnkucmVzZXQoKTsgLy8gTWF5IHVzZSB0aGlzOyByZXNldCBmb3IgY29udmVuaWVuY2UuCisK
KyAgICAgICAgLy8gU3RyaXAgbGVhZGluZyAmIHRyYWlsaW5nIHNwYWNlcyBhbmQgY29udHJvbCBj
aGFyYWN0ZXJzLgorICAgICAgICBpbnQgYmVnaW4gPSAwOworICAgICAgICBVUkxQYXJzZXI6OlVS
TFBhcnNlcjo6dHJpbVVSTChzcGVjLCAmYmVnaW4sICZzcGVjTGVuZ3RoKTsKKworICAgICAgICAv
LyBIYW5kbGUgZW1wdHkgc3BlY3Mgb3Igb25lcyB0aGF0IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNl
IG9yIGNvbnRyb2wgY2hhcnMuCisgICAgICAgIGlmIChiZWdpbiA9PSBzcGVjTGVuZ3RoKSB7Cisg
ICAgICAgICAgICBwYXJzZWQtPnNjaGVtZS5yZXNldCgpOworICAgICAgICAgICAgcGFyc2VkLT5w
YXRoLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBp
bnQgcGF0aEJlZ2luID0gLTE7CisgICAgICAgIGludCBwYXRoRW5kID0gLTE7CisKKyAgICAgICAg
Ly8gRXh0cmFjdCB0aGUgc2NoZW1lLCB3aXRoIHRoZSBwYXRoIGJlaW5nIGV2ZXJ5dGhpbmcgZm9s
bG93aW5nLiBXZSBhbHNvCisgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBp
cyBubyBzY2hlbWUuCisgICAgICAgIGlmIChEb0V4dHJhY3RTY2hlbWUoJnNwZWNbYmVnaW5dLCBz
cGVjTGVuZ3RoIC0gYmVnaW4sICZwYXJzZWQtPnNjaGVtZSkpIHsKKyAgICAgICAgICAgIC8vIE9m
ZnNldCB0aGUgcmVzdWx0cyBzaW5jZSB3ZSBnYXZlIERvRXh0cmFjdFNjaGVtZSBhIHN1YnN0cmlu
Zy4KKyAgICAgICAgICAgIHBhcnNlZC0+c2NoZW1lLnNldEJlZ2luKHBhcnNlZC0+c2NoZW1lLmJl
Z2luKCkgKyBiZWdpbik7CisKKyAgICAgICAgICAgIGlmIChwYXJzZWQtPnNjaGVtZS5lbmQoKSAh
PSBzcGVjTGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgIHBhdGhCZWdpbiA9IHBhcnNlZC0+
c2NoZW1lLmVuZCgpICsgMTsKKyAgICAgICAgICAgICAgICBwYXRoRW5kID0gc3BlY0xlbmd0aDsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHNjaGVt
ZSBmb3VuZCwganVzdCBwYXRoLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUucmVzZXQoKTsK
KyAgICAgICAgICAgIHBhdGhCZWdpbiA9IGJlZ2luOworICAgICAgICAgICAgcGF0aEVuZCA9IHNw
ZWNMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvLyBTcGxpdCBbcGF0aEJlZ2luLCBwYXRo
RW5kKSBpbnRvIGEgcGF0aCArIHF1ZXJ5LgorICAgICAgICBmb3IgKGludCBpID0gcGF0aEJlZ2lu
OyBpIDwgcGF0aEVuZDsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3BlY1tpXSA9PSAnPycpIHsK
KyAgICAgICAgICAgICAgICBwYXJzZWQtPnF1ZXJ5ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2Uo
aSArIDEsIHBhdGhFbmQpOworICAgICAgICAgICAgICAgIHBhdGhFbmQgPSBpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9y
IGNvbXBhdGFiaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQgVVJMIHBhcnNlciwgdHJlYXQgbm8gcGF0
aCBhcworICAgICAgICAvLyAtMSwgcmF0aGVyIHRoYW4gaGF2aW5nIGEgbGVuZ3RoIG9mIDAKKyAg
ICAgICAgaWYgKHBhdGhCZWdpbiA9PSBwYXRoRW5kKQorICAgICAgICAgICAgcGFyc2VkLT5wYXRo
LnJlc2V0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcnNlZC0+cGF0aCA9IFVSTENv
bXBvbmVudDo6ZnJvbVJhbmdlKHBhdGhCZWdpbiwgcGF0aEVuZCk7CisgICAgfQorCisgICAgLy8g
Q29udmVydHMgYSBwb3J0IG51bWJlciBpbiBhIHN0cmluZyB0byBhbiBpbnRlZ2VyLiBXZSdkIGxp
a2UgdG8ganVzdCBjYWxsCisgICAgLy8gc3NjYW5mIGJ1dCBvdXIgaW5wdXQgaXMgbm90IDAtdGVy
bWluYXRlZCwgd2hpY2ggc3NjYW5mIHJlcXVpcmVzLiBJbnN0ZWFkLAorICAgIC8vIHdlIGNvcHkg
dGhlIGRpZ2l0cyB0byBhIHNtYWxsIHN0YWNrIGJ1ZmZlciAoc2luY2Ugd2Uga25vdyB0aGUgbWF4
aW11bSBudW1iZXIKKyAgICAvLyBvZiBkaWdpdHMgaW4gYSB2YWxpZCBwb3J0IG51bWJlcikgdGhh
dCB3ZSBjYW4gMCB0ZXJtaW5hdGUuCisgICAgc3RhdGljIGludCBEb1BhcnNlUG9ydChjb25zdCBD
SEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIGNvbXBvbmVudCkKKyAgICB7CisgICAgICAg
IC8vIEVhc3kgc3VjY2VzcyBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gcG9ydC4KKyAgICAgICAgY29u
c3QgaW50IG1heERpZ2l0cyA9IDU7CisgICAgICAgIGlmICghY29tcG9uZW50LmlzTm9uZW1wdHko
KSkKKyAgICAgICAgICAgIHJldHVybiBVbnNwZWNpZmllZFBvcnQ7CisKKyAgICAgICAgLy8gU2tp
cCBvdmVyIGFueSBsZWFkaW5nIDBzLgorICAgICAgICBVUkxDb21wb25lbnQgbm9uWmVyb0RpZ2l0
cyhjb21wb25lbnQuZW5kKCksIDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBv
bmVudC5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3BlY1tjb21wb25lbnQuYmVn
aW4oKSArIGldICE9ICcwJykgeworICAgICAgICAgICAgICAgIG5vblplcm9EaWdpdHMgPSBVUkxD
b21wb25lbnQ6OmZyb21SYW5nZShjb21wb25lbnQuYmVnaW4oKSArIGksIGNvbXBvbmVudC5lbmQo
KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKG5vblplcm9EaWdpdHMubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVy
biAwOyAvLyBBbGwgZGlnaXRzIHdlcmUgMC4KKworICAgICAgICAvLyBWZXJpZnkgd2UgZG9uJ3Qg
aGF2ZSB0b28gbWFueSBkaWdpdHMgKHdlJ2xsIGJlIGNvcHlpbmcgdG8gb3VyIGJ1ZmZlciBzbwor
ICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvdWJsZS1jaGVjaykuCisgICAgICAgIGlmIChub25aZXJv
RGlnaXRzLmxlbmd0aCgpID4gbWF4RGlnaXRzKQorICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQ
b3J0OworCisgICAgICAgIC8vIENvcHkgdmFsaWQgZGlnaXRzIHRvIHRoZSBidWZmZXIuCisgICAg
ICAgIGNoYXIgZGlnaXRzW21heERpZ2l0cyArIDFdOyAvLyArMSBmb3IgbnVsbCB0ZXJtaW5hdG9y
CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uWmVyb0RpZ2l0cy5sZW5ndGgoKTsgaSsr
KSB7CisgICAgICAgICAgICBDSEFSIGNoID0gc3BlY1tub25aZXJvRGlnaXRzLmJlZ2luKCkgKyBp
XTsKKyAgICAgICAgICAgIGlmICghSXNQb3J0RGlnaXQoY2gpKSB7CisgICAgICAgICAgICAgICAg
Ly8gSW52YWxpZCBwb3J0IGRpZ2l0LCBmYWlsLgorICAgICAgICAgICAgICAgIHJldHVybiBJbnZh
bGlkUG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZ2l0c1tpXSA9IHN0YXRpY19j
YXN0PGNoYXI+KGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE51bGwtdGVybWluYXRlIHRo
ZSBzdHJpbmcgYW5kIGNvbnZlcnQgdG8gaW50ZWdlci4gU2luY2Ugd2UgZ3VhcmFudGVlCisgICAg
ICAgIC8vIG9ubHkgZGlnaXRzLCBhdG9pJ3MgbGFjayBvZiBlcnJvciBoYW5kbGluZyBpcyBPSy4K
KyAgICAgICAgZGlnaXRzW25vblplcm9EaWdpdHMubGVuZ3RoKCldID0gMDsKKyAgICAgICAgaW50
IHBvcnQgPSBhdG9pKGRpZ2l0cyk7CisgICAgICAgIGlmIChwb3J0ID4gNjU1MzUpCisgICAgICAg
ICAgICByZXR1cm4gSW52YWxpZFBvcnQ7IC8vIE91dCBvZiByYW5nZS4KKyAgICAgICAgcmV0dXJu
IHBvcnQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgRG9FeHRyYWN0RmlsZU5hbWUoY29uc3Qg
Q0hBUiogc3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBwYXRoLCBVUkxDb21wb25lbnQqIGZpbGVO
YW1lKQorICAgIHsKKyAgICAgICAgLy8gSGFuZGxlIGVtcHR5IHBhdGhzOiB0aGV5IGhhdmUgbm8g
ZmlsZSBuYW1lcy4KKyAgICAgICAgaWYgKCFwYXRoLmlzTm9uZW1wdHkoKSkgeworICAgICAgICAg
ICAgZmlsZU5hbWUtPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBTZWFyY2ggYmFja3dhcmRzIGZvciBhIHBhcmFtZXRlciwgd2hpY2ggaXMgYSBu
b3JtYWxseSB1bnVzZWQgZmllbGQgaW4gYQorICAgICAgICAvLyBVUkwgZGVsaW1pdGVkIGJ5IGEg
c2VtaWNvbG9uLiBXZSBwYXJzZSB0aGUgcGFyYW1ldGVyIGFzIHBhcnQgb2YgdGhlCisgICAgICAg
IC8vIHBhdGgsIGJ1dCBoZXJlLCB3ZSBkb24ndCB3YW50IHRvIGNvdW50IGl0LiBUaGUgbGFzdCBz
ZW1pY29sb24gaXMgdGhlCisgICAgICAgIC8vIHBhcmFtZXRlci4gVGhlIHBhdGggc2hvdWxkIHN0
YXJ0IHdpdGggYSBzbGFzaCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjaworICAgICAgICAvLyB0
aGUgZmlyc3Qgb25lLgorICAgICAgICBpbnQgZmlsZUVuZCA9IHBhdGguZW5kKCk7CisgICAgICAg
IGZvciAoaW50IGkgPSBwYXRoLmVuZCgpIC0gMTsgaSA+IHBhdGguYmVnaW4oKTsgaS0tKSB7Cisg
ICAgICAgICAgICBpZiAoc3BlY1tpXSA9PSAnOycpIHsKKyAgICAgICAgICAgICAgICBmaWxlRW5k
ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIC8vIE5vdyBzZWFyY2ggYmFja3dhcmRzIGZyb20gdGhlIGZpbGVuYW1lIGVuZCB0
byB0aGUgcHJldmlvdXMgc2xhc2gKKyAgICAgICAgLy8gdG8gZmluZCB0aGUgYmVnaW5uaW5nIG9m
IHRoZSBmaWxlbmFtZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IGZpbGVFbmQgLSAxOyBpID49IHBh
dGguYmVnaW4oKTsgaS0tKSB7CisgICAgICAgICAgICBpZiAoaXNVUkxTbGFzaChzcGVjW2ldKSkg
eworICAgICAgICAgICAgICAgIC8vIEZpbGUgbmFtZSBpcyBldmVyeXRoaW5nIGZvbGxvd2luZyB0
aGlzIGNoYXJhY3RlciB0byB0aGUgZW5kCisgICAgICAgICAgICAgICAgKmZpbGVOYW1lID0gVVJM
Q29tcG9uZW50Ojpmcm9tUmFuZ2UoaSArIDEsIGZpbGVFbmQpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIHNsYXNoIGZv
dW5kLCB0aGlzIG1lYW5zIHRoZSBpbnB1dCB3YXMgZGVnZW5lcmF0ZSAoZ2VuZXJhbGx5IHBhdGhz
CisgICAgICAgIC8vIHdpbGwgc3RhcnQgd2l0aCBhIHNsYXNoKS4gTGV0J3MgY2FsbCBldmVyeXRo
aW5nIHRoZSBmaWxlIG5hbWUuCisgICAgICAgICpmaWxlTmFtZSA9IFVSTENvbXBvbmVudDo6ZnJv
bVJhbmdlKHBhdGguYmVnaW4oKSwgZmlsZUVuZCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wg
RG9FeHRyYWN0UXVlcnlLZXlWYWx1ZShjb25zdCBDSEFSKiBzcGVjLCBVUkxDb21wb25lbnQqIHF1
ZXJ5LCBVUkxDb21wb25lbnQqIGtleSwgVVJMQ29tcG9uZW50KiB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIGlmICghcXVlcnktPmlzTm9uZW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICBpbnQgc3RhcnQgPSBxdWVyeS0+YmVnaW4oKTsKKyAgICAgICAgaW50IGN1cnJl
bnQgPSBzdGFydDsKKyAgICAgICAgaW50IGVuZCA9IHF1ZXJ5LT5lbmQoKTsKKworICAgICAgICAv
LyBXZSBhc3N1bWUgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgaXMgdGhlIGJlZ2lubmluZyBv
ZiB0aGUgImtleSIgYW5kIHdlCisgICAgICAgIC8vIHNraXAgdG8gdGhlIGVuZCBvZiBpdC4KKyAg
ICAgICAga2V5LT5zZXRCZWdpbihjdXJyZW50KTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgPCBl
bmQgJiYgc3BlY1tjdXJyZW50XSAhPSAnJicgJiYgc3BlY1tjdXJyZW50XSAhPSAnPScpCisgICAg
ICAgICAgICArK2N1cnJlbnQ7CisgICAgICAgIGtleS0+c2V0TGVuZ3RoKGN1cnJlbnQgLSBrZXkt
PmJlZ2luKCkpOworCisgICAgICAgIC8vIFNraXAgdGhlIHNlcGFyYXRvciBhZnRlciB0aGUga2V5
IChpZiBhbnkpLgorICAgICAgICBpZiAoY3VycmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdID09
ICc9JykKKyAgICAgICAgICAgICsrY3VycmVudDsKKworICAgICAgICAvLyBGaW5kIHRoZSB2YWx1
ZSBwYXJ0LgorICAgICAgICB2YWx1ZS0+c2V0QmVnaW4oY3VycmVudCk7CisgICAgICAgIHdoaWxl
IChjdXJyZW50IDwgZW5kICYmIHNwZWNbY3VycmVudF0gIT0gJyYnKQorICAgICAgICAgICAgKytj
dXJyZW50OworICAgICAgICB2YWx1ZS0+c2V0TGVuZ3RoKGN1cnJlbnQgLSB2YWx1ZS0+YmVnaW4o
KSk7CisKKyAgICAgICAgLy8gRmluYWxseSBza2lwIHRoZSBuZXh0IHNlcGFyYXRvciBpZiBhbnkK
KyAgICAgICAgaWYgKGN1cnJlbnQgPCBlbmQgJiYgc3BlY1tjdXJyZW50XSA9PSAnJicpCisgICAg
ICAgICAgICArK2N1cnJlbnQ7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgbmV3IHF1ZXJ5CisgICAg
ICAgICpxdWVyeSA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGN1cnJlbnQsIGVuZCk7CisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKworLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIHByb3Rl
Y3RlZCBvciBwcml2YXRlLgorcHVibGljOgorICAgIC8vIFdlIHRyZWF0IHNsYXNoZXMgYW5kIGJh
Y2tzbGFzaGVzIHRoZSBzYW1lIGZvciBJRSBjb21wYXRhYmlsaXR5LgorICAgIHN0YXRpYyBpbmxp
bmUgYm9vbCBpc1VSTFNsYXNoKENIQVIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gY2ggPT0g
Jy8nIHx8IGNoID09ICdcXCc7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdlIHNo
b3VsZCB0cmltIHRoaXMgY2hhcmFjdGVyIGZyb20gdGhlIFVSTCBiZWNhdXNlIGl0IGlzIGEKKyAg
ICAvLyBzcGFjZSBvciBhIGNvbnRyb2wgY2hhcmFjdGVyLgorICAgIHN0YXRpYyBpbmxpbmUgYm9v
bCBzaG91bGRUcmltRnJvbVVSTChDSEFSIGNoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNoIDw9
ICcgJzsKKyAgICB9CisKKyAgICAvLyBHaXZlbiBhbiBhbHJlYWR5LWluaXRpYWxpemVkIGJlZ2lu
IGluZGV4IGFuZCBsZW5ndGgsIHRoaXMgc2hyaW5rcyB0aGUgcmFuZ2UKKyAgICAvLyB0byBlbGlt
aW5hdGUgInNob3VsZC1iZS10cmltbWVkIiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIGxlbmd0
aCBkb2VzICpub3QqCisgICAgLy8gaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB1bnRyaW1tZWQgZGF0
YSBmcm9tIHwqYmVnaW58LCBidXQgcmF0aGVyIHRoZSBwb3NpdGlvbgorICAgIC8vIGluIHRoZSBp
bnB1dCBzdHJpbmcgKHNvIHRoZSBzdHJpbmcgc3RhcnRzIGF0IGNoYXJhY3RlciB8KmJlZ2lufCBp
biB0aGUgc3BlYywKKyAgICAvLyBhbmQgZ29lcyB1bnRpbCB8KmxlbnwpLgorICAgIHN0YXRpYyBp
bmxpbmUgdm9pZCB0cmltVVJMKGNvbnN0IENIQVIqIHNwZWMsIGludCogYmVnaW4sIGludCogbGVu
Z3RoKQorICAgIHsKKyAgICAgICAgLy8gU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBjb250
cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIHdoaWxlICgqYmVnaW4gPCAqbGVuZ3RoICYmIHNob3Vs
ZFRyaW1Gcm9tVVJMKHNwZWNbKmJlZ2luXSkpCisgICAgICAgICAgICAoKmJlZ2luKSsrOworCisg
ICAgICAgIC8vIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGNvbnRyb2wgY2hhcmFjdGVy
cy4gV2UgbmVlZCB0aGUgPmkgdGVzdCBmb3IKKyAgICAgICAgLy8gd2hlbiB0aGUgaW5wdXQgc3Ry
aW5nIGlzIGFsbCBibGFua3M7IHdlIGRvbid0IHdhbnQgdG8gYmFjayBwYXN0IHRoZSBpbnB1dC4K
KyAgICAgICAgd2hpbGUgKCpsZW5ndGggPiAqYmVnaW4gJiYgc2hvdWxkVHJpbUZyb21VUkwoc3Bl
Y1sqbGVuZ3RoIC0gMV0pKQorICAgICAgICAgICAgKCpsZW5ndGgpLS07CisgICAgfQorCisgICAg
Ly8gQ291bnRzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgc2xhc2hlcyBzdGFydGluZyBhdCB0
aGUgZ2l2ZW4gb2Zmc2V0CisgICAgLy8gaW4gdGhlIGdpdmVuIHN0cmluZyBvZiB0aGUgZ2l2ZW4g
bGVuZ3RoLgorICAgIHN0YXRpYyBpbmxpbmUgaW50IGNvbnNlY3V0aXZlU2xhc2hlcyhjb25zdCBD
SEFSICpzdHJpbmcsIGludCBiZWdpbk9mZnNldCwgaW50IHN0cmluZ0xlbmd0aCkKKyAgICB7Cisg
ICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChiZWdpbk9mZnNldCArIGNvdW50
IDwgc3RyaW5nTGVuZ3RoICYmIGlzVVJMU2xhc2goc3RyaW5nW2JlZ2luT2Zmc2V0ICsgY291bnRd
KSkKKyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisK
K3ByaXZhdGU6CisgICAgLy8gVVJMUGFyc2VyIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4KKyAgICBV
UkxQYXJzZXIoKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVy
IGlzIGEgdmFsaWQgZGlnaXQgdG8gdXNlIGluIGEgcG9ydC4KKyAgICBzdGF0aWMgaW5saW5lIGJv
b2wgSXNQb3J0RGlnaXQoQ0hBUiBjaCkKKyAgICB7CisgICAgICAgIHJldHVybiBjaCA+PSAnMCcg
JiYgY2ggPD0gJzknOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUg
bmV4dCBhdXRob3JpdHkgdGVybWluYXRvciBpbiB0aGUgaW5wdXQgc3RhcnRpbmcKKyAgICAvLyBm
cm9tIHN0YXJ0T2Zmc2V0LiBJZiBubyB0ZXJtaW5hdG9yIGlzIGZvdW5kLCB0aGUgcmV0dXJuIHZh
bHVlIHdpbGwgYmUgZXF1YWwKKyAgICAvLyB0byBzcGVjTGVuZ3RoLgorICAgIHN0YXRpYyBpbnQg
RmluZE5leHRBdXRob3JpdHlUZXJtaW5hdG9yKGNvbnN0IENIQVIqIHNwZWMsIGludCBzdGFydE9m
ZnNldCwgaW50IHNwZWNMZW5ndGgpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnRP
ZmZzZXQ7IGkgPCBzcGVjTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChJc0F1dGhvcml0
eVRlcm1pbmF0b3Ioc3BlY1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHNwZWNMZW5ndGg7IC8vIE5vdCBmb3VuZC4KKyAgICB9CisKKyAg
ICBzdGF0aWMgdm9pZCBQYXJzZVVzZXJJbmZvKGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0IFVSTENv
bXBvbmVudCYgdXNlciwgVVJMQ29tcG9uZW50KiB1c2VybmFtZSwgVVJMQ29tcG9uZW50KiBwYXNz
d29yZCkKKyAgICB7CisgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGNvbG9uIGluIHRoZSB1c2Vy
IHNlY3Rpb24sIHdoaWNoIHNlcGFyYXRlcyB0aGUgdXNlcm5hbWUgYW5kCisgICAgICAgIC8vIHBh
c3N3b3JkLgorICAgICAgICBpbnQgY29sb25PZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAoY29s
b25PZmZzZXQgPCB1c2VyLmxlbmd0aCgpICYmIHNwZWNbdXNlci5iZWdpbigpICsgY29sb25PZmZz
ZXRdICE9ICc6JykKKyAgICAgICAgICAgIGNvbG9uT2Zmc2V0Kys7CisKKyAgICAgICAgaWYgKGNv
bG9uT2Zmc2V0IDwgdXNlci5sZW5ndGgoKSkgeworICAgICAgICAgICAgLy8gRm91bmQgc2VwYXJh
dG9yOiA8dXNlcm5hbWU+OjxwYXNzd29yZD4KKyAgICAgICAgICAgICp1c2VybmFtZSA9IFVSTENv
bXBvbmVudCh1c2VyLmJlZ2luKCksIGNvbG9uT2Zmc2V0KTsKKyAgICAgICAgICAgICpwYXNzd29y
ZCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHVzZXIuYmVnaW4oKSArIGNvbG9uT2Zmc2V0ICsg
MSwgdXNlci5iZWdpbigpICsgdXNlci5sZW5ndGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAvLyBObyBzZXBhcmF0b3IsIHRyZWF0IGV2ZXJ5dGhpbmcgYXMgdGhlIHVzZXJuYW1l
CisgICAgICAgICAgICAqdXNlcm5hbWUgPSB1c2VyOworICAgICAgICAgICAgKnBhc3N3b3JkID0g
VVJMQ29tcG9uZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBQYXJz
ZVNlcnZlckluZm8oY29uc3QgQ0hBUiogc3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBzZXJ2ZXJJ
bmZvLCBVUkxDb21wb25lbnQqIGhvc3QsIFVSTENvbXBvbmVudCogcG9ydCkKKyAgICB7CisgICAg
ICAgIGlmIChzZXJ2ZXJJbmZvLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIC8vIE5vIHNl
cnZlciBpbmZvLCBob3N0IG5hbWUgaXMgZW1wdHkuCisgICAgICAgICAgICBob3N0LT5yZXNldCgp
OworICAgICAgICAgICAgcG9ydC0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorCisgICAgICAgIC8vIElmIHRoZSBob3N0IHN0YXJ0cyB3aXRoIGEgbGVmdC1icmFja2V0
LCBhc3N1bWUgdGhlIGVudGlyZSBob3N0IGlzIGFuCisgICAgICAgIC8vIElQdjYgbGl0ZXJhbC4g
IE90aGVyd2lzZSwgYXNzdW1lIG5vbmUgb2YgdGhlIGhvc3QgaXMgYW4gSVB2NiBsaXRlcmFsLgor
ICAgICAgICAvLyBUaGlzIGFzc3VtcHRpb24gd2lsbCBiZSBvdmVycmlkZGVuIGlmIHdlIGZpbmQg
YSByaWdodC1icmFja2V0LgorICAgICAgICAvLworICAgICAgICAvLyBPdXIgSVB2NiBhZGRyZXNz
IGNhbm9uaWNhbGl6YXRpb24gY29kZSByZXF1aXJlcyBib3RoIGJyYWNrZXRzIHRvIGV4aXN0LAor
ICAgICAgICAvLyBidXQgdGhlIGFiaWxpdHkgdG8gbG9jYXRlIGFuIGluY29tcGxldGUgYWRkcmVz
cyBjYW4gc3RpbGwgYmUgdXNlZnVsLgorICAgICAgICBpbnQgaXB2NlRlcm1pbmF0b3IgPSBzcGVj
W3NlcnZlckluZm8uYmVnaW4oKV0gPT0gJ1snID8gc2VydmVySW5mby5lbmQoKSA6IC0xOworICAg
ICAgICBpbnQgY29sb24gPSAtMTsKKworICAgICAgICAvLyBGaW5kIHRoZSBsYXN0IHJpZ2h0LWJy
YWNrZXQsIGFuZCB0aGUgbGFzdCBjb2xvbi4KKyAgICAgICAgZm9yIChpbnQgaSA9IHNlcnZlcklu
Zm8uYmVnaW4oKTsgaSA8IHNlcnZlckluZm8uZW5kKCk7IGkrKykgeworICAgICAgICAgICAgc3dp
dGNoIChzcGVjW2ldKSB7CisgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICBp
cHY2VGVybWluYXRvciA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlICc6JzoKKyAgICAgICAgICAgICAgICBjb2xvbiA9IGk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbG9uID4gaXB2NlRlcm1pbmF0b3Ip
IHsKKyAgICAgICAgICAgIC8vIEZvdW5kIGEgcG9ydCBudW1iZXI6IDxob3N0bmFtZT46PHBvcnQ+
CisgICAgICAgICAgICAqaG9zdCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHNlcnZlckluZm8u
YmVnaW4oKSwgY29sb24pOworICAgICAgICAgICAgaWYgKGhvc3QtPmxlbmd0aCgpID09IDApCisg
ICAgICAgICAgICAgICAgaG9zdC0+cmVzZXQoKTsKKyAgICAgICAgICAgICpwb3J0ID0gVVJMQ29t
cG9uZW50Ojpmcm9tUmFuZ2UoY29sb24gKyAxLCBzZXJ2ZXJJbmZvLmVuZCgpKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHBvcnQ6IDxob3N0bmFtZT4KKyAgICAgICAgICAg
ICpob3N0ID0gc2VydmVySW5mbzsKKyAgICAgICAgICAgIHBvcnQtPnJlc2V0KCk7CisgICAgICAg
IH0KKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIFVSTFBhcnNl
cl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55101</attachid>
            <date>2010-05-05 02:13:10 -0700</date>
            <delta_ts>2010-05-05 16:45:41 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38572-20100505021308.patch</filename>
            <type>text/plain</type>
            <size>28218</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4ODA3KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDkgQEAKKzIwMTAtMDUtMDUgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbV1RGVVJMXSBBZGQgY29yZSBVUkwgcGFyc2VyCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODU3MgorCisgICAgICAgIFRo
aXMgcGF0Y2ggYWRkcyB0aGUgY29yZSBvZiB0aGUgVVJMIHBhcnNlci4gIFRoZSBVUkwgcGFyc2Vy
IHVzZXMgYQorICAgICAgICB0ZW1wbGF0ZWQgbm90aW9uIG9mIGEgY2hhcmFjdGVyIHRvIHN1cHBv
cnQgZGlmZmVyZW50IGNoYXJhY3RlciB0eXBlcy4KKyAgICAgICAgTGF0ZXIgd2UnbGwgYWRkIHNv
bWUgbm9uLXRlbXBsYXRlZCBBUElzIHdpdGggY29uY3JldGUgdHlwZXMgdGhhdAorICAgICAgICBj
bGllbnRzIGNhbiB1c2UgbW9yZSBjb252ZW5pZW50bHkuCisKKyAgICAgICAgVGhlIFVSTFBhcnNl
ciBoYXMgYSBjb3VwbGUgY2FsbHMgdG8gQVNTRVJUKCksIHdoaWNoIEkndmUgY29tbWVudGVkIG91
dAorICAgICAgICBmb3Igbm93LiAgSSdtIG5vdCAxMDAlIHN1cmUgaG93IHRvIGhhbmRsZSB0aGUg
ZGVwZW5kZW5jeSBpc3N1ZXMgdGhlcmUKKyAgICAgICAgeWV0LCBzbyBJJ3ZlIHB1bnRlZCBvbiB0
aGUgaXNzdWUgZm9yIG5vdy4KKworICAgICAgICBBbHNvLCB0aGVyZSBhcmUgYSBudW1iZXIgb2Yg
bWV0aG9kcyB0aGF0IGFyZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhpcworICAgICAgICBwYXRjaCB0
aGF0IGFyZSBvbmx5IHVzZWQgYnkgdGhlIGNhbm9uaWNhbGl6ZXIuICBNeSBwbGFuIGlzIHRvIG1h
a2UKKyAgICAgICAgdGhvc2UgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgYW5kIG1ha2UgdGhlIGNhbm9u
aWNhbGl6ZXIgYSBmcmllbmQgb2YgdGhlCisgICAgICAgIHBhcnNlci4gIFRoZSBkZXRhaWxzIHdp
bGwgYmUgaW4gYSBsYXRlciBwYXRjaC4KKworICAgICAgICAqIHd0Zi91cmwvc3JjL1VSTENvbXBv
bmVudC5oOgorICAgICAgICAoV1RGOjpVUkxDb21wb25lbnQ6OmZyb21SYW5nZSk6CisgICAgICAg
ICogd3RmL3VybC9zcmMvVVJMUGFyc2VyLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpVUkxQYXJz
ZXI6Oik6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6aXNBdXRob3JpdHlUZXJtaW5hdG9yKToK
KyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZUF1dGhvcml0eSk6CisgICAgICAgIChXVEY6
OlVSTFBhcnNlcjo6ZXh0cmFjdFNjaGVtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFy
c2VBZnRlclNjaGVtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VTdGFuZGFyZFVS
TCk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VQYXRoKToKKyAgICAgICAgKFdURjo6
VVJMUGFyc2VyOjpwYXJzZVBhdGhVUkwpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnBhcnNl
TWFpbHRvVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZVBvcnQpOgorICAgICAg
ICAoV1RGOjpVUkxQYXJzZXI6OmV4dHJhY3RGaWxlTmFtZSk6CisgICAgICAgIChXVEY6OlVSTFBh
cnNlcjo6ZXh0cmFjdFF1ZXJ5S2V5VmFsdWUpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6Omlz
VVJMU2xhc2gpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnNob3VsZFRyaW1Gcm9tVVJMKToK
KyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjp0cmltVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFy
c2VyOjpjb25zZWN1dGl2ZVNsYXNoZXMpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OmlzUG9y
dERpZ2l0KToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpuZXh0QXV0aG9yaXR5VGVybWluYXRv
cik6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VVc2VySW5mbyk6CisgICAgICAgIChX
VEY6OlVSTFBhcnNlcjo6cGFyc2VTZXJ2ZXJJbmZvKToKKyAgICAgICAgKiB3dGYvdXJsL3d0ZnVy
bC5neXA6CisKIDIwMTAtMDUtMDQgIFlvbmdqdW4gWmhhbmcgIDx5b25nanVuX3poYW5nQGFwcGxl
LmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL3d0Zi91cmwvd3RmdXJsLmd5cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93
dGYvdXJsL3d0ZnVybC5neXAJKHJldmlzaW9uIDU4Nzk3KQorKysgSmF2YVNjcmlwdENvcmUvd3Rm
L3VybC93dGZ1cmwuZ3lwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAgICAgICBd
LAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICdzcmMvVVJMQ29tcG9uZW50LmgnLAorICAg
ICAgICAnc3JjL1VSTFBhcnNlci5oJywKICAgICAgIF0sCiAgICAgICAnZGlyZWN0X2RlcGVuZGVu
dF9zZXR0aW5ncyc6IHsKICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL3d0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL3d0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCShyZXZpc2lvbiA1ODc5NykKKysrIEph
dmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0zNyw2ICszNywxMyBAQCBwdWJsaWM6CiAgICAgVVJMQ29tcG9uZW50KCkgOiBtX2JlZ2luKDAp
LCBtX2xlbmd0aCgtMSkgeyB9CiAgICAgVVJMQ29tcG9uZW50KGludCBiZWdpbiwgaW50IGxlbmd0
aCkgOiBtX2JlZ2luKGJlZ2luKSwgbV9sZW5ndGgobGVuZ3RoKSB7IH0KIAorICAgIC8vIEhlbHBl
ciB0aGF0IHJldHVybnMgYSBjb21wb25lbnQgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBiZWdpbiBh
bmQgZW5kaW5nCisgICAgLy8gcG9pbnRzLiBUaGUgZW5kaW5nIHBvaW50IGlzIG5vbi1pbmNsdXNp
dmUuCisgICAgc3RhdGljIGlubGluZSBVUkxDb21wb25lbnQgZnJvbVJhbmdlKGludCBiZWdpbiwg
aW50IGVuZCkKKyAgICB7CisgICAgICAgIHJldHVybiBVUkxDb21wb25lbnQoYmVnaW4sIGVuZCAt
IGJlZ2luKTsKKyAgICB9CisKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQg
aXMgdmFsaWQsIG1lYW5pbmcgdGhlIGxlbmd0aCBpcyBnaXZlbi4gRXZlbgogICAgIC8vIHZhbGlk
IGNvbXBvbmVudHMgbWF5IGJlIGVtcHR5IHRvIHJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZXkgZXhp
c3QuCiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGggIT0gLTE7IH0K
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFBhcnNlci5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFBhcnNlci5oCShyZXZpc2lvbiAwKQor
KysgSmF2YVNjcmlwdENvcmUvd3RmL3VybC9zcmMvVVJMUGFyc2VyLmgJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsNjA0IEBACisvKiBCYXNlZCBvbiBuc1VSTFBhcnNlcnMuY2MgZnJvbSBNb3ppbGxh
CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgY29udGVu
dHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNl
IFZlcnNpb24KKyAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZp
bGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0
YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9N
UEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz
dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKyAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5Z
IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorICogZm9y
IHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1
bmRlciB0aGUKKyAqIExpY2Vuc2UuCisgKgorICogVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxs
YS5vcmcgY29kZS4KKyAqCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFs
IENvZGUgaXMKKyAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgorICogUG9y
dGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykg
MTk5OAorICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoK
KyAqIENvbnRyaWJ1dG9yKHMpOgorICogICBEYXJpbiBGaXNoZXIgKG9yaWdpbmFsIGF1dGhvcikK
KyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1
c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCisgKiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxH
UEwiKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUg
TEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCisgKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdp
c2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQorICogdW5k
ZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFs
bG93IG90aGVycyB0bworICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKKyAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5n
IHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisg
KiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJ
ZiB5b3UgZG8gbm90IGRlbGV0ZQorICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50
IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogdGhlIHRlcm1zIG9m
IGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKyAqCisgKiAqKioqKiBF
TkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLworCisjaWZuZGVmIFVSTFBhcnNlcl9oCisjZGVmaW5l
IFVSTFBhcnNlcl9oCisKKyNpbmNsdWRlICJVUkxDb21wb25lbnQuaCIKKyNpbmNsdWRlICJVUkxT
ZWdtZW50cy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit0
ZW1wbGF0ZTx0eXBlbmFtZSBDSEFSPgorY2xhc3MgVVJMUGFyc2VyIHsKK3B1YmxpYzoKKyAgICBl
bnVtIFNwZWNpYWxQb3J0IHsKKyAgICAgICAgVW5zcGVjaWZpZWRQb3J0ID0gLTEsCisgICAgICAg
IEludmFsaWRQb3J0ID0gLTIsCisgICAgfTsKKworICAgIC8vIFRoaXMgaGFuZGxlcyBldmVyeXRo
aW5nIHRoYXQgbWF5IGJlIGFuIGF1dGhvcml0eSB0ZXJtaW5hdG9yLCBpbmNsdWRpbmcKKyAgICAv
LyBiYWNrc2xhc2guIEZvciBzcGVjaWFsIGJhY2tzbGFzaCBoYW5kbGluZyBzZWUgcGFyc2VBZnRl
clNjaGVtZS4KKyAgICBzdGF0aWMgYm9vbCBpc0F1dGhvcml0eVRlcm1pbmF0b3IoQ0hBUiBjaCkK
KyAgICB7CisgICAgICAgIHJldHVybiBVUkxQYXJzZXI6OmlzVVJMU2xhc2goY2gpIHx8IGNoID09
ICc/JyB8fCBjaCA9PSAnIycgfHwgY2ggPT0gJzsnOworICAgIH0KKworICAgIC8vIEdpdmVuIGFu
IGFscmVhZHktaWRlbnRpZmllZCBhdXRoIHNlY3Rpb24sIGJyZWFrcyBpdCBpbnRvIGl0cyBjb25z
aXR1ZW50CisgICAgLy8gcGFydHMuIFRoZSBwb3J0IG51bWJlciB3aWxsIGJlIHBhcnNlZCBhbmQg
dGhlIHJlc3VsdGluZyBpbnRlZ2VyIHdpbGwgYmUKKyAgICAvLyBmaWxsZWQgaW50byB0aGUgZ2l2
ZW4gKnBvcnQgdmFyaWFibGUsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHBvcnQgbnVtYmVyIG9yIGl0
CisgICAgLy8gaXMgaW52YWxpZC4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZUF1dGhvcml0eShjb25z
dCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIGF1dGgsIFVSTENvbXBvbmVudCogdXNl
cm5hbWUsIFVSTENvbXBvbmVudCogcGFzc3dvcmQsIFVSTENvbXBvbmVudCogaG9zdCwgVVJMQ29t
cG9uZW50KiBwb3J0KQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQoYXV0aC5p
c1ZhbGlkKCkpOyAvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhbiBhdXRob3JpdHkuCisgICAgICAg
IGlmIChhdXRoLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHVzZXJuYW1lLT5yZXNldCgp
OworICAgICAgICAgICAgcGFzc3dvcmQtPnJlc2V0KCk7CisgICAgICAgICAgICBob3N0LT5yZXNl
dCgpOworICAgICAgICAgICAgcG9ydC0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgZm9yIEAsIHdoaWNoIGlzIHRo
ZSBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgdXNlciBpbmZvIGFuZAorICAgICAgICAvLyB0aGUgc2Vy
dmVyIGluZm8uCisgICAgICAgIGludCBpID0gYXV0aC5iZWdpbigpICsgYXV0aC5sZW5ndGgoKSAt
IDE7CisgICAgICAgIHdoaWxlIChpID4gYXV0aC5iZWdpbigpICYmIHNwZWNbaV0gIT0gJ0AnKQor
ICAgICAgICAgICAgLS1pOworCisgICAgICAgIGlmIChzcGVjW2ldID09ICdAJykgeworICAgICAg
ICAgICAgLy8gRm91bmQgdXNlciBpbmZvOiA8dXNlci1pbmZvPkA8c2VydmVyLWluZm8+CisgICAg
ICAgICAgICBwYXJzZVVzZXJJbmZvKHNwZWMsIFVSTENvbXBvbmVudChhdXRoLmJlZ2luKCksIGkg
LSBhdXRoLmJlZ2luKCkpLAorICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAg
ICAgICAgIHBhcnNlU2VydmVySW5mbyhzcGVjLCBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShpICsg
MSwgYXV0aC5iZWdpbigpICsgYXV0aC5sZW5ndGgoKSksCisgICAgICAgICAgICBob3N0LCBwb3J0
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHVzZXIgaW5mbywgZXZlcnl0
aGluZyBpcyBzZXJ2ZXIgaW5mby4KKyAgICAgICAgICAgIHVzZXJuYW1lLT5yZXNldCgpOworICAg
ICAgICAgICAgcGFzc3dvcmQtPnJlc2V0KCk7CisgICAgICAgICAgICBwYXJzZVNlcnZlckluZm8o
c3BlYywgYXV0aCwgaG9zdCwgcG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMg
Ym9vbCBleHRyYWN0U2NoZW1lKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxD
b21wb25lbnQqIHNjaGVtZSkKKyAgICB7CisgICAgICAgIC8vIFNraXAgbGVhZGluZyB3aGl0ZXNw
YWNlIGFuZCBjb250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIGludCBiZWdpbiA9IDA7CisgICAg
ICAgIHdoaWxlIChiZWdpbiA8IHNwZWNMZW5ndGggJiYgVVJMUGFyc2VyOjpzaG91bGRUcmltRnJv
bVVSTChzcGVjW2JlZ2luXSkpCisgICAgICAgICAgICBiZWdpbisrOworICAgICAgICBpZiAoYmVn
aW4gPT0gc3BlY0xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gSW5wdXQgaXMg
ZW1wdHkgb3IgYWxsIHdoaXRlc3BhY2UuCisKKyAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgY29s
b24gY2hhcmFjdGVyLgorICAgICAgICBmb3IgKGludCBpID0gYmVnaW47IGkgPCBzcGVjTGVuZ3Ro
OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzcGVjW2ldID09ICc6JykgeworICAgICAgICAgICAg
ICAgICpzY2hlbWUgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShiZWdpbiwgaSk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIGZhbHNlOyAvLyBObyBjb2xvbiBmb3VuZDogbm8gc2NoZW1lCisgICAgfQorCisgICAg
Ly8gRmlsbHMgaW4gYWxsIG1lbWJlcnMgb2YgdGhlIFVSTFNlZ21lbnRzIHN0cnVjdHVyZSBleGNl
cHQgZm9yIHRoZSBzY2hlbWUuCisgICAgLy8KKyAgICAvLyB8c3BlY3wgaXMgdGhlIGZ1bGwgc3Bl
YyBiZWluZyBwYXJzZWQsIG9mIGxlbmd0aCB8c3BlY0xlbmd0aHwuCisgICAgLy8gfGFmdGVyU2No
ZW1lfCBpcyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgc2NoZW1lIChh
ZnRlciB0aGUKKyAgICAvLyAgIGNvbG9uKSB3aGVyZSB3ZSdsbCBiZWdpbiBwYXJzaW5nLgorICAg
IC8vCisgICAgLy8gQ29tcGF0YWJpbGl0eSBkYXRhIHBvaW50cy4gSSBsaXN0ICJob3N0IiwgInBh
dGgiIGV4dHJhY3RlZDoKKyAgICAvLyBJbnB1dCAgICAgICAgICAgICAgICBJRTYgICAgICAgICAg
ICAgRmlyZWZveCAgICAgICAgICAgICAgICBVcworICAgIC8vIC0tLS0tICAgICAgICAgICAgICAg
IC0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLSAgICAgICAgIC0tLS0tLS0tLS0tLS0tCisg
ICAgLy8gaHR0cDovL2Zvby5jb20vICAgICAgImZvby5jb20iLCAiLyIgICJmb28uY29tIiwgIi8i
ICAgICAgICAgImZvby5jb20iLCAiLyIKKyAgICAvLyBodHRwOmZvby5jb20vICAgICAgICAiZm9v
LmNvbSIsICIvIiAgImZvby5jb20iLCAiLyIgICAgICAgICAiZm9vLmNvbSIsICIvIgorICAgIC8v
IGh0dHA6L2Zvby5jb20vICAgICAgIGZhaWwoKikgICAgICAgICAiZm9vLmNvbSIsICIvIiAgICAg
ICAgICJmb28uY29tIiwgIi8iCisgICAgLy8gaHR0cDpcZm9vLmNvbS8gICAgICAgZmFpbCgqKSAg
ICAgICAgICJcZm9vLmNvbSIsICIvIihmYWlsKSAgImZvby5jb20iLCAiLyIKKyAgICAvLyBodHRw
Oi8vLy9mb28uY29tLyAgICAiZm9vLmNvbSIsICIvIiAgImZvby5jb20iLCAiLyIgICAgICAgICAi
Zm9vLmNvbSIsICIvIgorICAgIC8vCisgICAgLy8gKCopIEludGVyZXN0aW5nbHksIGFsdGhvdWdo
IElFIGZhaWxzIHRvIGxvYWQgdGhlc2UgVVJMcywgaXRzIGhpc3RvcnkKKyAgICAvLyBjYW5vbmlj
YWxpemVyIGhhbmRsZXMgdGhlbSwgbWVhbmluZyBpZiB5b3UndmUgYmVlbiB0byB0aGUgY29ycmVz
cG9uZGluZworICAgIC8vICJodHRwOi8vZm9vLmNvbS8iIGxpbmssIGl0IHdpbGwgYmUgY29sb3Jl
ZC4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZUFmdGVyU2NoZW1lKGNvbnN0IENIQVIqIHNwZWMsIGlu
dCBzcGVjTGVuZ3RoLCBpbnQgYWZ0ZXJTY2hlbWUsIFVSTFNlZ21lbnRzKiBwYXJzZWQpCisgICAg
eworICAgICAgICBpbnQgbnVtYmVyT2ZTbGFzaGVzID0gY29uc2VjdXRpdmVTbGFzaGVzKHNwZWMs
IGFmdGVyU2NoZW1lLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAgaW50IGFmdGVyU2xhc2hlcyA9IGFm
dGVyU2NoZW1lICsgbnVtYmVyT2ZTbGFzaGVzOworCisgICAgICAgIC8vIEZpcnN0IHNwbGl0IGlu
dG8gdHdvIG1haW4gcGFydHMsIHRoZSBhdXRob3JpdHkgKHVzZXJuYW1lLCBwYXNzd29yZCwgaG9z
dCwKKyAgICAgICAgLy8gYW5kIHBvcnQpIGFuZCB0aGUgZnVsbCBwYXRoIChwYXRoLCBxdWVyeSwg
YW5kIHJlZmVyZW5jZSkuCisgICAgICAgIFVSTENvbXBvbmVudCBhdXRob3JpdHk7CisgICAgICAg
IFVSTENvbXBvbmVudCBmdWxsUGF0aDsKKworICAgICAgICAvLyBGb3VuZCAiLy88c29tZSBkYXRh
PiIsIGxvb2tzIGxpa2UgYW4gYXV0aG9yaXR5IHNlY3Rpb24uIFRyZWF0IGV2ZXJ5dGhpbmcKKyAg
ICAgICAgLy8gZnJvbSB0aGVyZSB0byB0aGUgbmV4dCBzbGFzaCAob3IgZW5kIG9mIHNwZWMpIHRv
IGJlIHRoZSBhdXRob3JpdHkuIE5vdGUKKyAgICAgICAgLy8gdGhhdCB3ZSBpZ25vcmUgdGhlIG51
bWJlciBvZiBzbGFzaGVzIGFuZCB0cmVhdCBpdCBhcyB0aGUgYXV0aG9yaXR5LgorICAgICAgICBp
bnQgYXV0aEVuZCA9IG5leHRBdXRob3JpdHlUZXJtaW5hdG9yKHNwZWMsIGFmdGVyU2xhc2hlcywg
c3BlY0xlbmd0aCk7CisgICAgICAgIGF1dGhvcml0eSA9IFVSTENvbXBvbmVudChhZnRlclNsYXNo
ZXMsIGF1dGhFbmQgLSBhZnRlclNsYXNoZXMpOworCisgICAgICAgIGlmIChhdXRoRW5kID09IHNw
ZWNMZW5ndGgpIC8vIE5vIGJlZ2lubmluZyBvZiBwYXRoIGZvdW5kLgorICAgICAgICAgICAgZnVs
bFBhdGggPSBVUkxDb21wb25lbnQoKTsKKyAgICAgICAgZWxzZSAvLyBFdmVyeXRoaW5nIHN0YXJ0
aW5nIGZyb20gdGhlIHNsYXNoIHRvIHRoZSBlbmQgaXMgdGhlIHBhdGguCisgICAgICAgICAgICBm
dWxsUGF0aCA9IFVSTENvbXBvbmVudChhdXRoRW5kLCBzcGVjTGVuZ3RoIC0gYXV0aEVuZCk7CisK
KyAgICAgICAgLy8gTm93IHBhcnNlIHRob3NlIHR3byBzdWItcGFydHMuCisgICAgICAgIHBhcnNl
QXV0aG9yaXR5KHNwZWMsIGF1dGhvcml0eSwgJnBhcnNlZC0+dXNlcm5hbWUsICZwYXJzZWQtPnBh
c3N3b3JkLCAmcGFyc2VkLT5ob3N0LCAmcGFyc2VkLT5wb3J0KTsKKyAgICAgICAgcGFyc2VQYXRo
KHNwZWMsIGZ1bGxQYXRoLCAmcGFyc2VkLT5wYXRoLCAmcGFyc2VkLT5xdWVyeSwgJnBhcnNlZC0+
cmVmKTsKKyAgICB9CisKKyAgICAvLyBUaGUgbWFpbiBwYXJzaW5nIGZ1bmN0aW9uIGZvciBzdGFu
ZGFyZCBVUkxzLiBTdGFuZGFyZCBVUkxzIGhhdmUgYSBzY2hlbWUsCisgICAgLy8gaG9zdCwgcGF0
aCwgZXRjLgorICAgIHN0YXRpYyB2b2lkIHBhcnNlU3RhbmRhcmRVUkwoY29uc3QgQ0hBUiogc3Bl
YywgaW50IHNwZWNMZW5ndGgsIFVSTFNlZ21lbnRzKiBwYXJzZWQpCisgICAgeworICAgICAgICAv
LyBGSVhNRTogYWRkIEFTU0VSVChzcGVjTGVuZ3RoID49IDApOworCisgICAgICAgIC8vIFN0cmlw
IGxlYWRpbmcgJiB0cmFpbGluZyBzcGFjZXMgYW5kIGNvbnRyb2wgY2hhcmFjdGVycy4KKyAgICAg
ICAgaW50IGJlZ2luID0gMDsKKyAgICAgICAgVVJMUGFyc2VyOjp0cmltVVJMKHNwZWMsICZiZWdp
biwgJnNwZWNMZW5ndGgpOworCisgICAgICAgIGludCBhZnRlclNjaGVtZTsKKyAgICAgICAgaWYg
KGV4dHJhY3RTY2hlbWUoc3BlYywgc3BlY0xlbmd0aCwgJnBhcnNlZC0+c2NoZW1lKSkKKyAgICAg
ICAgICAgIGFmdGVyU2NoZW1lID0gcGFyc2VkLT5zY2hlbWUuZW5kKCkgKyAxOyAvLyBTa2lwIHBh
c3QgdGhlIGNvbG9uLgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNheSB0aGVyZSdz
IG5vIHNjaGVtZSB3aGVuIHRoZXJlIGlzIGEgY29sb24uIFdlIGNvdWxkIGFsc28gc2F5IHRoYXQK
KyAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgdGhlIHNjaGVtZS4gQm90aCB3b3VsZCBwcm9k
dWNlIGFuIGludmFsaWQgVVJMLCBidXQgdGhpcyB3YXkKKyAgICAgICAgICAgIC8vIHNlZW1zIGxl
c3Mgd3JvbmcgaW4gbW9yZSBjYXNlcy4KKyAgICAgICAgICAgIHBhcnNlZC0+c2NoZW1lLnJlc2V0
KCk7CisgICAgICAgICAgICBhZnRlclNjaGVtZSA9IGJlZ2luOworICAgICAgICB9CisgICAgICAg
IHBhcnNlQWZ0ZXJTY2hlbWUoc3BlYywgc3BlY0xlbmd0aCwgYWZ0ZXJTY2hlbWUsIHBhcnNlZCk7
CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcGFyc2VQYXRoKGNvbnN0IENIQVIqIHNwZWMsIGNv
bnN0IFVSTENvbXBvbmVudCYgcGF0aCwgVVJMQ29tcG9uZW50KiBmaWxlcGF0aCwgVVJMQ29tcG9u
ZW50KiBxdWVyeSwgVVJMQ29tcG9uZW50KiByZWYpCisgICAgeworICAgICAgICAvLyBwYXRoID0g
Wy9dPHNlZ21lbnQxPi88c2VnbWVudDI+LzwuLi4+LzxzZWdtZW50Tj47PHBhcmFtPj88cXVlcnk+
IzxyZWY+CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gcGF0aC4K
KyAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gLTEpIHsKKyAgICAgICAgICAgIGZpbGVwYXRo
LT5yZXNldCgpOworICAgICAgICAgICAgcXVlcnktPnJlc2V0KCk7CisgICAgICAgICAgICByZWYt
PnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gRklY
TUU6IGFkZCBBU1NFUlQocGF0aC5sZW5ndGgoKSA+IDApOyAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2
ZSAwIGxlbmd0aCBwYXRocy4KKworICAgICAgICAvLyBTZWFyY2ggZm9yIGZpcnN0IG9jY3VycmVu
Y2Ugb2YgZWl0aGVyID8gb3IgIy4KKyAgICAgICAgaW50IHBhdGhFbmQgPSBwYXRoLmJlZ2luKCkg
KyBwYXRoLmxlbmd0aCgpOworCisgICAgICAgIGludCBxdWVyeVNlcGFyYXRvciA9IC0xOyAvLyBJ
bmRleCBvZiB0aGUgJz8nCisgICAgICAgIGludCByZWZTZXBhcmF0b3IgPSAtMTsgLy8gSW5kZXgg
b2YgdGhlICcjJworICAgICAgICBmb3IgKGludCBpID0gcGF0aC5iZWdpbigpOyBpIDwgcGF0aEVu
ZDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHNwZWNbaV0pIHsKKyAgICAgICAgICAgIGNh
c2UgJz8nOgorICAgICAgICAgICAgICAgIC8vIE9ubHkgbWF0Y2ggdGhlIHF1ZXJ5IHN0cmluZyBp
ZiBpdCBwcmVjZWRlcyB0aGUgcmVmZXJlbmNlIGZyYWdtZW50CisgICAgICAgICAgICAgICAgLy8g
YW5kIHdoZW4gd2UgaGF2ZW4ndCBmb3VuZCBvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBp
ZiAocmVmU2VwYXJhdG9yIDwgMCAmJiBxdWVyeVNlcGFyYXRvciA8IDApCisgICAgICAgICAgICAg
ICAgICAgIHF1ZXJ5U2VwYXJhdG9yID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgIC8vIFJlY29yZCB0aGUgZmlyc3QgIyBz
aWduIG9ubHkuCisgICAgICAgICAgICAgICAgaWYgKHJlZlNlcGFyYXRvciA8IDApCisgICAgICAg
ICAgICAgICAgICAgIHJlZlNlcGFyYXRvciA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgLy8gTWFya2VycyBwb2ludGluZyB0byB0aGUgY2hhcmFj
dGVyIGFmdGVyIGVhY2ggb2YgdGhlc2UgY29ycmVzcG9uZGluZworICAgICAgICAvLyBjb21wb25l
bnRzLiBUaGUgY29kZSBiZWxvdyB3b3JkcyBmcm9tIHRoZSBlbmQgYmFjayB0byB0aGUgYmVnaW5u
aW5nLAorICAgICAgICAvLyBhbmQgd2lsbCB1cGRhdGUgdGhlc2UgaW5kaWNlcyBhcyBpdCBmaW5k
cyBjb21wb25lbnRzIHRoYXQgZXhpc3QuCisgICAgICAgIGludCBmaWxlRW5kLCBxdWVyeUVuZDsK
KworICAgICAgICAvLyBSZWYgZnJhZ21lbnQ6IGZyb20gdGhlICMgdG8gdGhlIGVuZCBvZiB0aGUg
cGF0aC4KKyAgICAgICAgaWYgKHJlZlNlcGFyYXRvciA+PSAwKSB7CisgICAgICAgICAgICBmaWxl
RW5kID0gcmVmU2VwYXJhdG9yOworICAgICAgICAgICAgcXVlcnlFbmQgPSByZWZTZXBhcmF0b3I7
CisgICAgICAgICAgICAqcmVmID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocmVmU2VwYXJhdG9y
ICsgMSwgcGF0aEVuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlRW5kID0g
cGF0aEVuZDsKKyAgICAgICAgICAgIHF1ZXJ5RW5kID0gcGF0aEVuZDsKKyAgICAgICAgICAgIHJl
Zi0+cmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFF1ZXJ5IGZyYWdtZW50OiBldmVy
eXRoaW5nIGZyb20gdGhlID8gdG8gdGhlIG5leHQgYm91bmRhcnkgKGVpdGhlciB0aGUgZW5kCisg
ICAgICAgIC8vIG9mIHRoZSBwYXRoIG9yIHRoZSByZWYgZnJhZ21lbnQpLgorICAgICAgICBpZiAo
cXVlcnlTZXBhcmF0b3IgPj0gMCkgeworICAgICAgICAgICAgZmlsZUVuZCA9IHF1ZXJ5U2VwYXJh
dG9yOworICAgICAgICAgICAgKnF1ZXJ5ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocXVlcnlT
ZXBhcmF0b3IgKyAxLCBxdWVyeUVuZCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcXVl
cnktPnJlc2V0KCk7CisKKyAgICAgICAgLy8gRmlsZSBwYXRoOiB0cmVhdCBhbiBlbXB0eSBmaWxl
IHBhdGggYXMgbm8gZmlsZSBwYXRoLgorICAgICAgICBpZiAoZmlsZUVuZCAhPSBwYXRoLmJlZ2lu
KCkpCisgICAgICAgICAgICAqZmlsZXBhdGggPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShwYXRo
LmJlZ2luKCksIGZpbGVFbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmaWxlcGF0aC0+
cmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplcyBhIHBhdGggVVJMIHdoaWNoIGlz
IG1lcmVseSBhIHNjaGVtZSBmb2xsb3dlZCBieSBhIHBhdGguIEV4YW1wbGVzCisgICAgLy8gaW5j
bHVkZSAiYWJvdXQ6Zm9vIiBhbmQgImphdmFzY3JpcHQ6YWxlcnQoJ2JhcicpOyIKKyAgICBzdGF0
aWMgdm9pZCBwYXJzZVBhdGhVUkwoY29uc3QgQ0hBUiogc3BlYywgaW50IHNwZWNMZW5ndGgsIFVS
TFNlZ21lbnRzKiBwYXJzZWQpCisgICAgeworICAgICAgICAvLyBHZXQgdGhlIG5vbi1wYXRoIGFu
ZCBub24tc2NoZW1lIHBhcnRzIG9mIHRoZSBVUkwgb3V0IG9mIHRoZSB3YXksIHdlIG5ldmVyCisg
ICAgICAgIC8vIHVzZSB0aGVtLgorICAgICAgICBwYXJzZWQtPnVzZXJuYW1lLnJlc2V0KCk7Cisg
ICAgICAgIHBhcnNlZC0+cGFzc3dvcmQucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLT5ob3N0LnJl
c2V0KCk7CisgICAgICAgIHBhcnNlZC0+cG9ydC5yZXNldCgpOworICAgICAgICBwYXJzZWQtPnF1
ZXJ5LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+cmVmLnJlc2V0KCk7CisKKyAgICAgICAgLy8g
U3RyaXAgbGVhZGluZyAmIHRyYWlsaW5nIHNwYWNlcyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgor
ICAgICAgICBpbnQgYmVnaW4gPSAwOworICAgICAgICBVUkxQYXJzZXI6OnRyaW1VUkwoc3BlYywg
JmJlZ2luLCAmc3BlY0xlbmd0aCk7CisKKyAgICAgICAgLy8gSGFuZGxlIGVtcHR5IHNwZWNzIG9y
IG9uZXMgdGhhdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZSBvciBjb250cm9sIGNoYXJzLgorICAg
ICAgICBpZiAoYmVnaW4gPT0gc3BlY0xlbmd0aCkgeworICAgICAgICAgICAgcGFyc2VkLT5zY2hl
bWUucmVzZXQoKTsKKyAgICAgICAgICAgIHBhcnNlZC0+cGF0aC5yZXNldCgpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2NoZW1lLCB3
aXRoIHRoZSBwYXRoIGJlaW5nIGV2ZXJ5dGhpbmcgZm9sbG93aW5nLiBXZSBhbHNvCisgICAgICAg
IC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBzY2hlbWUuCisgICAgICAgIGlm
IChleHRyYWN0U2NoZW1lKCZzcGVjW2JlZ2luXSwgc3BlY0xlbmd0aCAtIGJlZ2luLCAmcGFyc2Vk
LT5zY2hlbWUpKSB7CisgICAgICAgICAgICAvLyBPZmZzZXQgdGhlIHJlc3VsdHMgc2luY2Ugd2Ug
Z2F2ZSBleHRyYWN0U2NoZW1lIGEgc3Vic3RyaW5nLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hl
bWUuc2V0QmVnaW4ocGFyc2VkLT5zY2hlbWUuYmVnaW4oKSArIGJlZ2luKTsKKworICAgICAgICAg
ICAgLy8gRm9yIGNvbXBhdGFiaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQgVVJMIHBhcnNlciwgd2Ug
dHJlYXQgbm8gcGF0aCBhcworICAgICAgICAgICAgLy8gLTEsIHJhdGhlciB0aGFuIGhhdmluZyBh
IGxlbmd0aCBvZiAwICh3ZSBub3JtYWxseSB3b3VsZG4ndCBjYXJlIHNvCisgICAgICAgICAgICAv
LyBtdWNoIGZvciB0aGVzZSBub24tc3RhbmRhcmQgVVJMcykuCisgICAgICAgICAgICBpZiAocGFy
c2VkLT5zY2hlbWUuZW5kKCkgPT0gc3BlY0xlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgcGFy
c2VkLT5wYXRoLnJlc2V0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGFy
c2VkLT5wYXRoID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocGFyc2VkLT5zY2hlbWUuZW5kKCkg
KyAxLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHNj
aGVtZSBmb3VuZCwganVzdCBwYXRoLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUucmVzZXQo
KTsKKyAgICAgICAgICAgIHBhcnNlZC0+cGF0aCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGJl
Z2luLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHBh
cnNlTWFpbHRvVVJMKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxTZWdtZW50
cyogcGFyc2VkKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQoc3BlY0xlbmd0
aCA+PSAwKTsKKworICAgICAgICAvLyBHZXQgdGhlIG5vbi1wYXRoIGFuZCBub24tc2NoZW1lIHBh
cnRzIG9mIHRoZSBVUkwgb3V0IG9mIHRoZSB3YXksIHdlIG5ldmVyCisgICAgICAgIC8vIHVzZSB0
aGVtLgorICAgICAgICBwYXJzZWQtPnVzZXJuYW1lLnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+
cGFzc3dvcmQucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLT5ob3N0LnJlc2V0KCk7CisgICAgICAg
IHBhcnNlZC0+cG9ydC5yZXNldCgpOworICAgICAgICBwYXJzZWQtPnJlZi5yZXNldCgpOworICAg
ICAgICBwYXJzZWQtPnF1ZXJ5LnJlc2V0KCk7IC8vIE1heSB1c2UgdGhpczsgcmVzZXQgZm9yIGNv
bnZlbmllbmNlLgorCisgICAgICAgIC8vIFN0cmlwIGxlYWRpbmcgJiB0cmFpbGluZyBzcGFjZXMg
YW5kIGNvbnRyb2wgY2hhcmFjdGVycy4KKyAgICAgICAgaW50IGJlZ2luID0gMDsKKyAgICAgICAg
VVJMUGFyc2VyOjpVUkxQYXJzZXI6OnRyaW1VUkwoc3BlYywgJmJlZ2luLCAmc3BlY0xlbmd0aCk7
CisKKyAgICAgICAgLy8gSGFuZGxlIGVtcHR5IHNwZWNzIG9yIG9uZXMgdGhhdCBjb250YWluIG9u
bHkgd2hpdGVzcGFjZSBvciBjb250cm9sIGNoYXJzLgorICAgICAgICBpZiAoYmVnaW4gPT0gc3Bl
Y0xlbmd0aCkgeworICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAg
ICAgIHBhcnNlZC0+cGF0aC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisKKyAgICAgICAgaW50IHBhdGhCZWdpbiA9IC0xOworICAgICAgICBpbnQgcGF0aEVuZCA9IC0x
OworCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNjaGVtZSwgd2l0aCB0aGUgcGF0aCBiZWluZyBl
dmVyeXRoaW5nIGZvbGxvd2luZy4gV2UgYWxzbworICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ug
d2hlcmUgdGhlcmUgaXMgbm8gc2NoZW1lLgorICAgICAgICBpZiAoZXh0cmFjdFNjaGVtZSgmc3Bl
Y1tiZWdpbl0sIHNwZWNMZW5ndGggLSBiZWdpbiwgJnBhcnNlZC0+c2NoZW1lKSkgeworICAgICAg
ICAgICAgLy8gT2Zmc2V0IHRoZSByZXN1bHRzIHNpbmNlIHdlIGdhdmUgZXh0cmFjdFNjaGVtZSBh
IHN1YnN0cmluZy4KKyAgICAgICAgICAgIHBhcnNlZC0+c2NoZW1lLnNldEJlZ2luKHBhcnNlZC0+
c2NoZW1lLmJlZ2luKCkgKyBiZWdpbik7CisKKyAgICAgICAgICAgIGlmIChwYXJzZWQtPnNjaGVt
ZS5lbmQoKSAhPSBzcGVjTGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgIHBhdGhCZWdpbiA9
IHBhcnNlZC0+c2NoZW1lLmVuZCgpICsgMTsKKyAgICAgICAgICAgICAgICBwYXRoRW5kID0gc3Bl
Y0xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8v
IE5vIHNjaGVtZSBmb3VuZCwganVzdCBwYXRoLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUu
cmVzZXQoKTsKKyAgICAgICAgICAgIHBhdGhCZWdpbiA9IGJlZ2luOworICAgICAgICAgICAgcGF0
aEVuZCA9IHNwZWNMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvLyBTcGxpdCBbcGF0aEJl
Z2luLCBwYXRoRW5kKSBpbnRvIGEgcGF0aCArIHF1ZXJ5LgorICAgICAgICBmb3IgKGludCBpID0g
cGF0aEJlZ2luOyBpIDwgcGF0aEVuZDsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3BlY1tpXSA9
PSAnPycpIHsKKyAgICAgICAgICAgICAgICBwYXJzZWQtPnF1ZXJ5ID0gVVJMQ29tcG9uZW50Ojpm
cm9tUmFuZ2UoaSArIDEsIHBhdGhFbmQpOworICAgICAgICAgICAgICAgIHBhdGhFbmQgPSBpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gRm9yIGNvbXBhdGFiaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQgVVJMIHBhcnNlciwgdHJl
YXQgbm8gcGF0aCBhcworICAgICAgICAvLyAtMSwgcmF0aGVyIHRoYW4gaGF2aW5nIGEgbGVuZ3Ro
IG9mIDAKKyAgICAgICAgaWYgKHBhdGhCZWdpbiA9PSBwYXRoRW5kKQorICAgICAgICAgICAgcGFy
c2VkLT5wYXRoLnJlc2V0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcnNlZC0+cGF0
aCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHBhdGhCZWdpbiwgcGF0aEVuZCk7CisgICAgfQor
CisgICAgLy8gQ29udmVydHMgYSBwb3J0IG51bWJlciBpbiBhIHN0cmluZyB0byBhbiBpbnRlZ2Vy
LiBXZSdkIGxpa2UgdG8ganVzdCBjYWxsCisgICAgLy8gc3NjYW5mIGJ1dCBvdXIgaW5wdXQgaXMg
bm90IDAtdGVybWluYXRlZCwgd2hpY2ggc3NjYW5mIHJlcXVpcmVzLiBJbnN0ZWFkLAorICAgIC8v
IHdlIGNvcHkgdGhlIGRpZ2l0cyB0byBhIHNtYWxsIHN0YWNrIGJ1ZmZlciAoc2luY2Ugd2Uga25v
dyB0aGUgbWF4aW11bSBudW1iZXIKKyAgICAvLyBvZiBkaWdpdHMgaW4gYSB2YWxpZCBwb3J0IG51
bWJlcikgdGhhdCB3ZSBjYW4gMCB0ZXJtaW5hdGUuCisgICAgc3RhdGljIGludCBwYXJzZVBvcnQo
Y29uc3QgQ0hBUiogc3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBjb21wb25lbnQpCisgICAgewor
ICAgICAgICAvLyBFYXN5IHN1Y2Nlc3MgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIHBvcnQuCisgICAg
ICAgIGNvbnN0IGludCBtYXhEaWdpdHMgPSA1OworICAgICAgICBpZiAoIWNvbXBvbmVudC5pc05v
bmVtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gVW5zcGVjaWZpZWRQb3J0OworCisgICAgICAg
IC8vIFNraXAgb3ZlciBhbnkgbGVhZGluZyAwcy4KKyAgICAgICAgVVJMQ29tcG9uZW50IG5vblpl
cm9EaWdpdHMoY29tcG9uZW50LmVuZCgpLCAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBjb21wb25lbnQubGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKHNwZWNbY29tcG9u
ZW50LmJlZ2luKCkgKyBpXSAhPSAnMCcpIHsKKyAgICAgICAgICAgICAgICBub25aZXJvRGlnaXRz
ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoY29tcG9uZW50LmJlZ2luKCkgKyBpLCBjb21wb25l
bnQuZW5kKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIGlmIChub25aZXJvRGlnaXRzLmxlbmd0aCgpID09IDApCisgICAgICAgICAg
ICByZXR1cm4gMDsgLy8gQWxsIGRpZ2l0cyB3ZXJlIDAuCisKKyAgICAgICAgLy8gVmVyaWZ5IHdl
IGRvbid0IGhhdmUgdG9vIG1hbnkgZGlnaXRzICh3ZSdsbCBiZSBjb3B5aW5nIHRvIG91ciBidWZm
ZXIgc28KKyAgICAgICAgLy8gd2UgbmVlZCB0byBkb3VibGUtY2hlY2spLgorICAgICAgICBpZiAo
bm9uWmVyb0RpZ2l0cy5sZW5ndGgoKSA+IG1heERpZ2l0cykKKyAgICAgICAgICAgIHJldHVybiBJ
bnZhbGlkUG9ydDsKKworICAgICAgICAvLyBDb3B5IHZhbGlkIGRpZ2l0cyB0byB0aGUgYnVmZmVy
LgorICAgICAgICBjaGFyIGRpZ2l0c1ttYXhEaWdpdHMgKyAxXTsgLy8gKzEgZm9yIG51bGwgdGVy
bWluYXRvcgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblplcm9EaWdpdHMubGVuZ3Ro
KCk7IGkrKykgeworICAgICAgICAgICAgQ0hBUiBjaCA9IHNwZWNbbm9uWmVyb0RpZ2l0cy5iZWdp
bigpICsgaV07CisgICAgICAgICAgICBpZiAoIWlzUG9ydERpZ2l0KGNoKSkgeworICAgICAgICAg
ICAgICAgIC8vIEludmFsaWQgcG9ydCBkaWdpdCwgZmFpbC4KKyAgICAgICAgICAgICAgICByZXR1
cm4gSW52YWxpZFBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaWdpdHNbaV0gPSBz
dGF0aWNfY2FzdDxjaGFyPihjaCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOdWxsLXRlcm1p
bmF0ZSB0aGUgc3RyaW5nIGFuZCBjb252ZXJ0IHRvIGludGVnZXIuIFNpbmNlIHdlIGd1YXJhbnRl
ZQorICAgICAgICAvLyBvbmx5IGRpZ2l0cywgYXRvaSdzIGxhY2sgb2YgZXJyb3IgaGFuZGxpbmcg
aXMgT0suCisgICAgICAgIGRpZ2l0c1tub25aZXJvRGlnaXRzLmxlbmd0aCgpXSA9IDA7CisgICAg
ICAgIGludCBwb3J0ID0gYXRvaShkaWdpdHMpOworICAgICAgICBpZiAocG9ydCA+IDY1NTM1KQor
ICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQb3J0OyAvLyBPdXQgb2YgcmFuZ2UuCisgICAgICAg
IHJldHVybiBwb3J0OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGV4dHJhY3RGaWxlTmFtZShj
b25zdCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIHBhdGgsIFVSTENvbXBvbmVudCog
ZmlsZU5hbWUpCisgICAgeworICAgICAgICAvLyBIYW5kbGUgZW1wdHkgcGF0aHM6IHRoZXkgaGF2
ZSBubyBmaWxlIG5hbWVzLgorICAgICAgICBpZiAoIXBhdGguaXNOb25lbXB0eSgpKSB7CisgICAg
ICAgICAgICBmaWxlTmFtZS0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgZm9yIGEgcGFyYW1ldGVyLCB3aGljaCBp
cyBhIG5vcm1hbGx5IHVudXNlZCBmaWVsZCBpbiBhCisgICAgICAgIC8vIFVSTCBkZWxpbWl0ZWQg
YnkgYSBzZW1pY29sb24uIFdlIHBhcnNlIHRoZSBwYXJhbWV0ZXIgYXMgcGFydCBvZiB0aGUKKyAg
ICAgICAgLy8gcGF0aCwgYnV0IGhlcmUsIHdlIGRvbid0IHdhbnQgdG8gY291bnQgaXQuIFRoZSBs
YXN0IHNlbWljb2xvbiBpcyB0aGUKKyAgICAgICAgLy8gcGFyYW1ldGVyLiBUaGUgcGF0aCBzaG91
bGQgc3RhcnQgd2l0aCBhIHNsYXNoLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrCisgICAgICAg
IC8vIHRoZSBmaXJzdCBvbmUuCisgICAgICAgIGludCBmaWxlRW5kID0gcGF0aC5lbmQoKTsKKyAg
ICAgICAgZm9yIChpbnQgaSA9IHBhdGguZW5kKCkgLSAxOyBpID4gcGF0aC5iZWdpbigpOyBpLS0p
IHsKKyAgICAgICAgICAgIGlmIChzcGVjW2ldID09ICc7JykgeworICAgICAgICAgICAgICAgIGZp
bGVFbmQgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgLy8gTm93IHNlYXJjaCBiYWNrd2FyZHMgZnJvbSB0aGUgZmlsZW5hbWUg
ZW5kIHRvIHRoZSBwcmV2aW91cyBzbGFzaAorICAgICAgICAvLyB0byBmaW5kIHRoZSBiZWdpbm5p
bmcgb2YgdGhlIGZpbGVuYW1lLgorICAgICAgICBmb3IgKGludCBpID0gZmlsZUVuZCAtIDE7IGkg
Pj0gcGF0aC5iZWdpbigpOyBpLS0pIHsKKyAgICAgICAgICAgIGlmIChpc1VSTFNsYXNoKHNwZWNb
aV0pKSB7CisgICAgICAgICAgICAgICAgLy8gRmlsZSBuYW1lIGlzIGV2ZXJ5dGhpbmcgZm9sbG93
aW5nIHRoaXMgY2hhcmFjdGVyIHRvIHRoZSBlbmQKKyAgICAgICAgICAgICAgICAqZmlsZU5hbWUg
PSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShpICsgMSwgZmlsZUVuZCk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gc2xh
c2ggZm91bmQsIHRoaXMgbWVhbnMgdGhlIGlucHV0IHdhcyBkZWdlbmVyYXRlIChnZW5lcmFsbHkg
cGF0aHMKKyAgICAgICAgLy8gd2lsbCBzdGFydCB3aXRoIGEgc2xhc2gpLiBMZXQncyBjYWxsIGV2
ZXJ5dGhpbmcgdGhlIGZpbGUgbmFtZS4KKyAgICAgICAgKmZpbGVOYW1lID0gVVJMQ29tcG9uZW50
Ojpmcm9tUmFuZ2UocGF0aC5iZWdpbigpLCBmaWxlRW5kKTsKKyAgICB9CisKKyAgICBzdGF0aWMg
Ym9vbCBleHRyYWN0UXVlcnlLZXlWYWx1ZShjb25zdCBDSEFSKiBzcGVjLCBVUkxDb21wb25lbnQq
IHF1ZXJ5LCBVUkxDb21wb25lbnQqIGtleSwgVVJMQ29tcG9uZW50KiB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIGlmICghcXVlcnktPmlzTm9uZW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBpbnQgc3RhcnQgPSBxdWVyeS0+YmVnaW4oKTsKKyAgICAgICAgaW50IGN1
cnJlbnQgPSBzdGFydDsKKyAgICAgICAgaW50IGVuZCA9IHF1ZXJ5LT5lbmQoKTsKKworICAgICAg
ICAvLyBXZSBhc3N1bWUgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgaXMgdGhlIGJlZ2lubmlu
ZyBvZiB0aGUgImtleSIgYW5kIHdlCisgICAgICAgIC8vIHNraXAgdG8gdGhlIGVuZCBvZiBpdC4K
KyAgICAgICAga2V5LT5zZXRCZWdpbihjdXJyZW50KTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQg
PCBlbmQgJiYgc3BlY1tjdXJyZW50XSAhPSAnJicgJiYgc3BlY1tjdXJyZW50XSAhPSAnPScpCisg
ICAgICAgICAgICArK2N1cnJlbnQ7CisgICAgICAgIGtleS0+c2V0TGVuZ3RoKGN1cnJlbnQgLSBr
ZXktPmJlZ2luKCkpOworCisgICAgICAgIC8vIFNraXAgdGhlIHNlcGFyYXRvciBhZnRlciB0aGUg
a2V5IChpZiBhbnkpLgorICAgICAgICBpZiAoY3VycmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRd
ID09ICc9JykKKyAgICAgICAgICAgICsrY3VycmVudDsKKworICAgICAgICAvLyBGaW5kIHRoZSB2
YWx1ZSBwYXJ0LgorICAgICAgICB2YWx1ZS0+c2V0QmVnaW4oY3VycmVudCk7CisgICAgICAgIHdo
aWxlIChjdXJyZW50IDwgZW5kICYmIHNwZWNbY3VycmVudF0gIT0gJyYnKQorICAgICAgICAgICAg
KytjdXJyZW50OworICAgICAgICB2YWx1ZS0+c2V0TGVuZ3RoKGN1cnJlbnQgLSB2YWx1ZS0+YmVn
aW4oKSk7CisKKyAgICAgICAgLy8gRmluYWxseSBza2lwIHRoZSBuZXh0IHNlcGFyYXRvciBpZiBh
bnkKKyAgICAgICAgaWYgKGN1cnJlbnQgPCBlbmQgJiYgc3BlY1tjdXJyZW50XSA9PSAnJicpCisg
ICAgICAgICAgICArK2N1cnJlbnQ7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgbmV3IHF1ZXJ5Cisg
ICAgICAgICpxdWVyeSA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGN1cnJlbnQsIGVuZCk7Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIHBy
b3RlY3RlZCBvciBwcml2YXRlLgorcHVibGljOgorICAgIC8vIFdlIHRyZWF0IHNsYXNoZXMgYW5k
IGJhY2tzbGFzaGVzIHRoZSBzYW1lIGZvciBJRSBjb21wYXRhYmlsaXR5LgorICAgIHN0YXRpYyBp
bmxpbmUgYm9vbCBpc1VSTFNsYXNoKENIQVIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gY2gg
PT0gJy8nIHx8IGNoID09ICdcXCc7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdl
IHNob3VsZCB0cmltIHRoaXMgY2hhcmFjdGVyIGZyb20gdGhlIFVSTCBiZWNhdXNlIGl0IGlzIGEK
KyAgICAvLyBzcGFjZSBvciBhIGNvbnRyb2wgY2hhcmFjdGVyLgorICAgIHN0YXRpYyBpbmxpbmUg
Ym9vbCBzaG91bGRUcmltRnJvbVVSTChDSEFSIGNoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNo
IDw9ICcgJzsKKyAgICB9CisKKyAgICAvLyBHaXZlbiBhbiBhbHJlYWR5LWluaXRpYWxpemVkIGJl
Z2luIGluZGV4IGFuZCBsZW5ndGgsIHRoaXMgc2hyaW5rcyB0aGUgcmFuZ2UKKyAgICAvLyB0byBl
bGltaW5hdGUgInNob3VsZC1iZS10cmltbWVkIiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIGxl
bmd0aCBkb2VzICpub3QqCisgICAgLy8gaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB1bnRyaW1tZWQg
ZGF0YSBmcm9tIHwqYmVnaW58LCBidXQgcmF0aGVyIHRoZSBwb3NpdGlvbgorICAgIC8vIGluIHRo
ZSBpbnB1dCBzdHJpbmcgKHNvIHRoZSBzdHJpbmcgc3RhcnRzIGF0IGNoYXJhY3RlciB8KmJlZ2lu
fCBpbiB0aGUgc3BlYywKKyAgICAvLyBhbmQgZ29lcyB1bnRpbCB8KmxlbnwpLgorICAgIHN0YXRp
YyBpbmxpbmUgdm9pZCB0cmltVVJMKGNvbnN0IENIQVIqIHNwZWMsIGludCogYmVnaW4sIGludCog
bGVuZ3RoKQorICAgIHsKKyAgICAgICAgLy8gU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBj
b250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIHdoaWxlICgqYmVnaW4gPCAqbGVuZ3RoICYmIHNo
b3VsZFRyaW1Gcm9tVVJMKHNwZWNbKmJlZ2luXSkpCisgICAgICAgICAgICAoKmJlZ2luKSsrOwor
CisgICAgICAgIC8vIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGNvbnRyb2wgY2hhcmFj
dGVycy4gV2UgbmVlZCB0aGUgPmkgdGVzdCBmb3IKKyAgICAgICAgLy8gd2hlbiB0aGUgaW5wdXQg
c3RyaW5nIGlzIGFsbCBibGFua3M7IHdlIGRvbid0IHdhbnQgdG8gYmFjayBwYXN0IHRoZSBpbnB1
dC4KKyAgICAgICAgd2hpbGUgKCpsZW5ndGggPiAqYmVnaW4gJiYgc2hvdWxkVHJpbUZyb21VUkwo
c3BlY1sqbGVuZ3RoIC0gMV0pKQorICAgICAgICAgICAgKCpsZW5ndGgpLS07CisgICAgfQorCisg
ICAgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgc2xhc2hlcyBzdGFydGluZyBh
dCB0aGUgZ2l2ZW4gb2Zmc2V0CisgICAgLy8gaW4gdGhlIGdpdmVuIHN0cmluZyBvZiB0aGUgZ2l2
ZW4gbGVuZ3RoLgorICAgIHN0YXRpYyBpbmxpbmUgaW50IGNvbnNlY3V0aXZlU2xhc2hlcyhjb25z
dCBDSEFSICpzdHJpbmcsIGludCBiZWdpbk9mZnNldCwgaW50IHN0cmluZ0xlbmd0aCkKKyAgICB7
CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChiZWdpbk9mZnNldCArIGNv
dW50IDwgc3RyaW5nTGVuZ3RoICYmIGlzVVJMU2xhc2goc3RyaW5nW2JlZ2luT2Zmc2V0ICsgY291
bnRdKSkKKyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9
CisKK3ByaXZhdGU6CisgICAgLy8gVVJMUGFyc2VyIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4KKyAg
ICBVUkxQYXJzZXIoKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhcmFj
dGVyIGlzIGEgdmFsaWQgZGlnaXQgdG8gdXNlIGluIGEgcG9ydC4KKyAgICBzdGF0aWMgaW5saW5l
IGJvb2wgaXNQb3J0RGlnaXQoQ0hBUiBjaCkKKyAgICB7CisgICAgICAgIHJldHVybiBjaCA+PSAn
MCcgJiYgY2ggPD0gJzknOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIG9mZnNldCBvZiB0
aGUgbmV4dCBhdXRob3JpdHkgdGVybWluYXRvciBpbiB0aGUgaW5wdXQgc3RhcnRpbmcKKyAgICAv
LyBmcm9tIHN0YXJ0T2Zmc2V0LiBJZiBubyB0ZXJtaW5hdG9yIGlzIGZvdW5kLCB0aGUgcmV0dXJu
IHZhbHVlIHdpbGwgYmUgZXF1YWwKKyAgICAvLyB0byBzcGVjTGVuZ3RoLgorICAgIHN0YXRpYyBp
bnQgbmV4dEF1dGhvcml0eVRlcm1pbmF0b3IoY29uc3QgQ0hBUiogc3BlYywgaW50IHN0YXJ0T2Zm
c2V0LCBpbnQgc3BlY0xlbmd0aCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydE9m
ZnNldDsgaSA8IHNwZWNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzQXV0aG9yaXR5
VGVybWluYXRvcihzcGVjW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gc3BlY0xlbmd0aDsgLy8gTm90IGZvdW5kLgorICAgIH0KKworICAg
IHN0YXRpYyB2b2lkIHBhcnNlVXNlckluZm8oY29uc3QgQ0hBUiogc3BlYywgY29uc3QgVVJMQ29t
cG9uZW50JiB1c2VyLCBVUkxDb21wb25lbnQqIHVzZXJuYW1lLCBVUkxDb21wb25lbnQqIHBhc3N3
b3JkKQorICAgIHsKKyAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgY29sb24gaW4gdGhlIHVzZXIg
c2VjdGlvbiwgd2hpY2ggc2VwYXJhdGVzIHRoZSB1c2VybmFtZSBhbmQKKyAgICAgICAgLy8gcGFz
c3dvcmQuCisgICAgICAgIGludCBjb2xvbk9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChjb2xv
bk9mZnNldCA8IHVzZXIubGVuZ3RoKCkgJiYgc3BlY1t1c2VyLmJlZ2luKCkgKyBjb2xvbk9mZnNl
dF0gIT0gJzonKQorICAgICAgICAgICAgY29sb25PZmZzZXQrKzsKKworICAgICAgICBpZiAoY29s
b25PZmZzZXQgPCB1c2VyLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAvLyBGb3VuZCBzZXBhcmF0
b3I6IDx1c2VybmFtZT46PHBhc3N3b3JkPgorICAgICAgICAgICAgKnVzZXJuYW1lID0gVVJMQ29t
cG9uZW50KHVzZXIuYmVnaW4oKSwgY29sb25PZmZzZXQpOworICAgICAgICAgICAgKnBhc3N3b3Jk
ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UodXNlci5iZWdpbigpICsgY29sb25PZmZzZXQgKyAx
LCB1c2VyLmJlZ2luKCkgKyB1c2VyLmxlbmd0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIC8vIE5vIHNlcGFyYXRvciwgdHJlYXQgZXZlcnl0aGluZyBhcyB0aGUgdXNlcm5hbWUK
KyAgICAgICAgICAgICp1c2VybmFtZSA9IHVzZXI7CisgICAgICAgICAgICAqcGFzc3dvcmQgPSBV
UkxDb21wb25lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHBhcnNl
U2VydmVySW5mbyhjb25zdCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIHNlcnZlcklu
Zm8sIFVSTENvbXBvbmVudCogaG9zdCwgVVJMQ29tcG9uZW50KiBwb3J0KQorICAgIHsKKyAgICAg
ICAgaWYgKHNlcnZlckluZm8ubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gTm8gc2Vy
dmVyIGluZm8sIGhvc3QgbmFtZSBpcyBlbXB0eS4KKyAgICAgICAgICAgIGhvc3QtPnJlc2V0KCk7
CisgICAgICAgICAgICBwb3J0LT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGhvc3Qgc3RhcnRzIHdpdGggYSBsZWZ0LWJyYWNrZXQs
IGFzc3VtZSB0aGUgZW50aXJlIGhvc3QgaXMgYW4KKyAgICAgICAgLy8gSVB2NiBsaXRlcmFsLiAg
T3RoZXJ3aXNlLCBhc3N1bWUgbm9uZSBvZiB0aGUgaG9zdCBpcyBhbiBJUHY2IGxpdGVyYWwuCisg
ICAgICAgIC8vIFRoaXMgYXNzdW1wdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gaWYgd2UgZmluZCBh
IHJpZ2h0LWJyYWNrZXQuCisgICAgICAgIC8vCisgICAgICAgIC8vIE91ciBJUHY2IGFkZHJlc3Mg
Y2Fub25pY2FsaXphdGlvbiBjb2RlIHJlcXVpcmVzIGJvdGggYnJhY2tldHMgdG8gZXhpc3QsCisg
ICAgICAgIC8vIGJ1dCB0aGUgYWJpbGl0eSB0byBsb2NhdGUgYW4gaW5jb21wbGV0ZSBhZGRyZXNz
IGNhbiBzdGlsbCBiZSB1c2VmdWwuCisgICAgICAgIGludCBpcHY2VGVybWluYXRvciA9IHNwZWNb
c2VydmVySW5mby5iZWdpbigpXSA9PSAnWycgPyBzZXJ2ZXJJbmZvLmVuZCgpIDogLTE7CisgICAg
ICAgIGludCBjb2xvbiA9IC0xOworCisgICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgcmlnaHQtYnJh
Y2tldCwgYW5kIHRoZSBsYXN0IGNvbG9uLgorICAgICAgICBmb3IgKGludCBpID0gc2VydmVySW5m
by5iZWdpbigpOyBpIDwgc2VydmVySW5mby5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgICBzd2l0
Y2ggKHNwZWNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgJ10nOgorICAgICAgICAgICAgICAgIGlw
djZUZXJtaW5hdG9yID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNh
c2UgJzonOgorICAgICAgICAgICAgICAgIGNvbG9uID0gaTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29sb24gPiBpcHY2VGVybWluYXRvcikg
eworICAgICAgICAgICAgLy8gRm91bmQgYSBwb3J0IG51bWJlcjogPGhvc3RuYW1lPjo8cG9ydD4K
KyAgICAgICAgICAgICpob3N0ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2Uoc2VydmVySW5mby5i
ZWdpbigpLCBjb2xvbik7CisgICAgICAgICAgICBpZiAoaG9zdC0+bGVuZ3RoKCkgPT0gMCkKKyAg
ICAgICAgICAgICAgICBob3N0LT5yZXNldCgpOworICAgICAgICAgICAgKnBvcnQgPSBVUkxDb21w
b25lbnQ6OmZyb21SYW5nZShjb2xvbiArIDEsIHNlcnZlckluZm8uZW5kKCkpOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gcG9ydDogPGhvc3RuYW1lPgorICAgICAgICAgICAg
Kmhvc3QgPSBzZXJ2ZXJJbmZvOworICAgICAgICAgICAgcG9ydC0+cmVzZXQoKTsKKyAgICAgICAg
fQorICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gVVJMUGFyc2Vy
X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55173</attachid>
            <date>2010-05-05 16:45:47 -0700</date>
            <delta_ts>2010-05-05 18:27:24 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38572-20100505164545.patch</filename>
            <type>text/plain</type>
            <size>28253</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4ODQ0KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDkgQEAKKzIwMTAtMDUtMDUgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbV1RGVVJMXSBBZGQgY29yZSBVUkwgcGFyc2VyCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODU3MgorCisgICAgICAgIFRo
aXMgcGF0Y2ggYWRkcyB0aGUgY29yZSBvZiB0aGUgVVJMIHBhcnNlci4gIFRoZSBVUkwgcGFyc2Vy
IHVzZXMgYQorICAgICAgICB0ZW1wbGF0ZWQgbm90aW9uIG9mIGEgY2hhcmFjdGVyIHRvIHN1cHBv
cnQgZGlmZmVyZW50IGNoYXJhY3RlciB0eXBlcy4KKyAgICAgICAgTGF0ZXIgd2UnbGwgYWRkIHNv
bWUgbm9uLXRlbXBsYXRlZCBBUElzIHdpdGggY29uY3JldGUgdHlwZXMgdGhhdAorICAgICAgICBj
bGllbnRzIGNhbiB1c2UgbW9yZSBjb252ZW5pZW50bHkuCisKKyAgICAgICAgVGhlIFVSTFBhcnNl
ciBoYXMgYSBjb3VwbGUgY2FsbHMgdG8gQVNTRVJUKCksIHdoaWNoIEkndmUgY29tbWVudGVkIG91
dAorICAgICAgICBmb3Igbm93LiAgSSdtIG5vdCAxMDAlIHN1cmUgaG93IHRvIGhhbmRsZSB0aGUg
ZGVwZW5kZW5jeSBpc3N1ZXMgdGhlcmUKKyAgICAgICAgeWV0LCBzbyBJJ3ZlIHB1bnRlZCBvbiB0
aGUgaXNzdWUgZm9yIG5vdy4KKworICAgICAgICBBbHNvLCB0aGVyZSBhcmUgYSBudW1iZXIgb2Yg
bWV0aG9kcyB0aGF0IGFyZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhpcworICAgICAgICBwYXRjaCB0
aGF0IGFyZSBvbmx5IHVzZWQgYnkgdGhlIGNhbm9uaWNhbGl6ZXIuICBNeSBwbGFuIGlzIHRvIG1h
a2UKKyAgICAgICAgdGhvc2UgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgYW5kIG1ha2UgdGhlIGNhbm9u
aWNhbGl6ZXIgYSBmcmllbmQgb2YgdGhlCisgICAgICAgIHBhcnNlci4gIFRoZSBkZXRhaWxzIHdp
bGwgYmUgaW4gYSBsYXRlciBwYXRjaC4KKworICAgICAgICAqIHd0Zi91cmwvc3JjL1VSTENvbXBv
bmVudC5oOgorICAgICAgICAoV1RGOjpVUkxDb21wb25lbnQ6OmZyb21SYW5nZSk6CisgICAgICAg
ICogd3RmL3VybC9zcmMvVVJMUGFyc2VyLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpVUkxQYXJz
ZXI6Oik6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6aXNBdXRob3JpdHlUZXJtaW5hdG9yKToK
KyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZUF1dGhvcml0eSk6CisgICAgICAgIChXVEY6
OlVSTFBhcnNlcjo6ZXh0cmFjdFNjaGVtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFy
c2VBZnRlclNjaGVtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VTdGFuZGFyZFVS
TCk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VQYXRoKToKKyAgICAgICAgKFdURjo6
VVJMUGFyc2VyOjpwYXJzZVBhdGhVUkwpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnBhcnNl
TWFpbHRvVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZVBvcnQpOgorICAgICAg
ICAoV1RGOjpVUkxQYXJzZXI6OmV4dHJhY3RGaWxlTmFtZSk6CisgICAgICAgIChXVEY6OlVSTFBh
cnNlcjo6ZXh0cmFjdFF1ZXJ5S2V5VmFsdWUpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6Omlz
VVJMU2xhc2gpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnNob3VsZFRyaW1Gcm9tVVJMKToK
KyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjp0cmltVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFy
c2VyOjpjb25zZWN1dGl2ZVNsYXNoZXMpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OmlzUG9y
dERpZ2l0KToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpuZXh0QXV0aG9yaXR5VGVybWluYXRv
cik6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VVc2VySW5mbyk6CisgICAgICAgIChX
VEY6OlVSTFBhcnNlcjo6cGFyc2VTZXJ2ZXJJbmZvKToKKyAgICAgICAgKiB3dGYvdXJsL3d0ZnVy
bC5neXA6CisKIDIwMTAtMDUtMDUgIE9saXZlciBIdW50ICA8b2xpdmVyQGFwcGxlLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBHZW9mZnJleSBHYXJlbi4KSW5kZXg6IEphdmFTY3JpcHRDb3Jl
L3d0Zi91cmwvd3RmdXJsLmd5cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdXJs
L3d0ZnVybC5neXAJKHJldmlzaW9uIDU4ODQ0KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3VybC93
dGZ1cmwuZ3lwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAgICAgICBdLAogICAg
ICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICdzcmMvVVJMQ29tcG9uZW50LmgnLAorICAgICAgICAn
c3JjL1VSTFBhcnNlci5oJywKICAgICAgIF0sCiAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0
aW5ncyc6IHsKICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKSW5kZXg6IEphdmFTY3JpcHRDb3Jl
L3d0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L3d0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCShyZXZpc2lvbiA1ODg0NCkKKysrIEphdmFTY3Jp
cHRDb3JlL3d0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2
ICszNywxMyBAQCBwdWJsaWM6CiAgICAgVVJMQ29tcG9uZW50KCkgOiBtX2JlZ2luKDApLCBtX2xl
bmd0aCgtMSkgeyB9CiAgICAgVVJMQ29tcG9uZW50KGludCBiZWdpbiwgaW50IGxlbmd0aCkgOiBt
X2JlZ2luKGJlZ2luKSwgbV9sZW5ndGgobGVuZ3RoKSB7IH0KIAorICAgIC8vIEhlbHBlciB0aGF0
IHJldHVybnMgYSBjb21wb25lbnQgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBiZWdpbiBhbmQgZW5k
aW5nCisgICAgLy8gcG9pbnRzLiBUaGUgZW5kaW5nIHBvaW50IGlzIG5vbi1pbmNsdXNpdmUuCisg
ICAgc3RhdGljIGlubGluZSBVUkxDb21wb25lbnQgZnJvbVJhbmdlKGludCBiZWdpbiwgaW50IGVu
ZCkKKyAgICB7CisgICAgICAgIHJldHVybiBVUkxDb21wb25lbnQoYmVnaW4sIGVuZCAtIGJlZ2lu
KTsKKyAgICB9CisKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaXMgdmFs
aWQsIG1lYW5pbmcgdGhlIGxlbmd0aCBpcyBnaXZlbi4gRXZlbgogICAgIC8vIHZhbGlkIGNvbXBv
bmVudHMgbWF5IGJlIGVtcHR5IHRvIHJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZXkgZXhpc3QuCiAg
ICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGggIT0gLTE7IH0KSW5kZXg6
IEphdmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFBhcnNlci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEph
dmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFBhcnNlci5oCShyZXZpc2lvbiAwKQorKysgSmF2
YVNjcmlwdENvcmUvd3RmL3VybC9zcmMvVVJMUGFyc2VyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNjA0IEBACisvKiBCYXNlZCBvbiBuc1VSTFBhcnNlcnMuY2MgZnJvbSBNb3ppbGxhCisgKiAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgY29udGVudHMgb2Yg
dGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNp
b24KKyAqIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj
ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEg
Y29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisg
KgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0
ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKyAqIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs
IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorICogZm9yIHRoZSBz
cGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0
aGUKKyAqIExpY2Vuc2UuCisgKgorICogVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcg
Y29kZS4KKyAqCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUg
aXMKKyAqIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgorICogUG9ydGlvbnMg
Y3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAor
ICogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIENv
bnRyaWJ1dG9yKHMpOgorICogICBEYXJpbiBGaXNoZXIgKG9yaWdpbmFsIGF1dGhvcikKKyAqCisg
KiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVu
ZGVyIHRoZSB0ZXJtcyBvZgorICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCisgKiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwK
KyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBh
cmUgYXBwbGljYWJsZSBpbnN0ZWFkCisgKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8g
YWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQorICogdW5kZXIgdGhl
IHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90
aGVycyB0bworICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKKyAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBw
cm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisgKiBhbmQg
b3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3Ug
ZG8gbm90IGRlbGV0ZQorICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1
c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIGFueSBv
bmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KKyAqCisgKiAqKioqKiBFTkQgTElD
RU5TRSBCTE9DSyAqKioqKiAqLworCisjaWZuZGVmIFVSTFBhcnNlcl9oCisjZGVmaW5lIFVSTFBh
cnNlcl9oCisKKyNpbmNsdWRlICJVUkxDb21wb25lbnQuaCIKKyNpbmNsdWRlICJVUkxTZWdtZW50
cy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0
ZTx0eXBlbmFtZSBDSEFSPgorY2xhc3MgVVJMUGFyc2VyIHsKK3B1YmxpYzoKKyAgICBlbnVtIFNw
ZWNpYWxQb3J0IHsKKyAgICAgICAgVW5zcGVjaWZpZWRQb3J0ID0gLTEsCisgICAgICAgIEludmFs
aWRQb3J0ID0gLTIsCisgICAgfTsKKworICAgIC8vIFRoaXMgaGFuZGxlcyBldmVyeXRoaW5nIHRo
YXQgbWF5IGJlIGFuIGF1dGhvcml0eSB0ZXJtaW5hdG9yLCBpbmNsdWRpbmcKKyAgICAvLyBiYWNr
c2xhc2guIEZvciBzcGVjaWFsIGJhY2tzbGFzaCBoYW5kbGluZyBzZWUgcGFyc2VBZnRlclNjaGVt
ZS4KKyAgICBzdGF0aWMgYm9vbCBpc0F1dGhvcml0eVRlcm1pbmF0b3IoQ0hBUiBjaCkKKyAgICB7
CisgICAgICAgIHJldHVybiBVUkxQYXJzZXI6OmlzVVJMU2xhc2goY2gpIHx8IGNoID09ICc/JyB8
fCBjaCA9PSAnIycgfHwgY2ggPT0gJzsnOworICAgIH0KKworICAgIC8vIEdpdmVuIGFuIGFscmVh
ZHktaWRlbnRpZmllZCBhdXRoIHNlY3Rpb24sIGJyZWFrcyBpdCBpbnRvIGl0cyBjb25zaXR1ZW50
CisgICAgLy8gcGFydHMuIFRoZSBwb3J0IG51bWJlciB3aWxsIGJlIHBhcnNlZCBhbmQgdGhlIHJl
c3VsdGluZyBpbnRlZ2VyIHdpbGwgYmUKKyAgICAvLyBmaWxsZWQgaW50byB0aGUgZ2l2ZW4gKnBv
cnQgdmFyaWFibGUsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHBvcnQgbnVtYmVyIG9yIGl0CisgICAg
Ly8gaXMgaW52YWxpZC4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZUF1dGhvcml0eShjb25zdCBDSEFS
KiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIGF1dGgsIFVSTENvbXBvbmVudCogdXNlcm5hbWUs
IFVSTENvbXBvbmVudCogcGFzc3dvcmQsIFVSTENvbXBvbmVudCogaG9zdCwgVVJMQ29tcG9uZW50
KiBwb3J0KQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQoYXV0aC5pc1ZhbGlk
KCkpOyAvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhbiBhdXRob3JpdHkuCisgICAgICAgIGlmIChh
dXRoLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHVzZXJuYW1lLT5yZXNldCgpOworICAg
ICAgICAgICAgcGFzc3dvcmQtPnJlc2V0KCk7CisgICAgICAgICAgICBob3N0LT5yZXNldCgpOwor
ICAgICAgICAgICAgcG9ydC0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgZm9yIEAsIHdoaWNoIGlzIHRoZSBzZXBh
cmF0b3IgYmV0d2VlbiB0aGUgdXNlciBpbmZvIGFuZAorICAgICAgICAvLyB0aGUgc2VydmVyIGlu
Zm8uCisgICAgICAgIGludCBpID0gYXV0aC5iZWdpbigpICsgYXV0aC5sZW5ndGgoKSAtIDE7Cisg
ICAgICAgIHdoaWxlIChpID4gYXV0aC5iZWdpbigpICYmIHNwZWNbaV0gIT0gJ0AnKQorICAgICAg
ICAgICAgLS1pOworCisgICAgICAgIGlmIChzcGVjW2ldID09ICdAJykgeworICAgICAgICAgICAg
Ly8gRm91bmQgdXNlciBpbmZvOiA8dXNlci1pbmZvPkA8c2VydmVyLWluZm8+CisgICAgICAgICAg
ICBwYXJzZVVzZXJJbmZvKHNwZWMsIFVSTENvbXBvbmVudChhdXRoLmJlZ2luKCksIGkgLSBhdXRo
LmJlZ2luKCkpLAorICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAg
IHBhcnNlU2VydmVySW5mbyhzcGVjLCBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShpICsgMSwgYXV0
aC5iZWdpbigpICsgYXV0aC5sZW5ndGgoKSksCisgICAgICAgICAgICBob3N0LCBwb3J0KTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHVzZXIgaW5mbywgZXZlcnl0aGluZyBp
cyBzZXJ2ZXIgaW5mby4KKyAgICAgICAgICAgIHVzZXJuYW1lLT5yZXNldCgpOworICAgICAgICAg
ICAgcGFzc3dvcmQtPnJlc2V0KCk7CisgICAgICAgICAgICBwYXJzZVNlcnZlckluZm8oc3BlYywg
YXV0aCwgaG9zdCwgcG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBl
eHRyYWN0U2NoZW1lKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxDb21wb25l
bnQqIHNjaGVtZSkKKyAgICB7CisgICAgICAgIC8vIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGFu
ZCBjb250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIGludCBiZWdpbiA9IDA7CisgICAgICAgIHdo
aWxlIChiZWdpbiA8IHNwZWNMZW5ndGggJiYgVVJMUGFyc2VyOjpzaG91bGRUcmltRnJvbVVSTChz
cGVjW2JlZ2luXSkpCisgICAgICAgICAgICBiZWdpbisrOworICAgICAgICBpZiAoYmVnaW4gPT0g
c3BlY0xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gSW5wdXQgaXMgZW1wdHkg
b3IgYWxsIHdoaXRlc3BhY2UuCisKKyAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgY29sb24gY2hh
cmFjdGVyLgorICAgICAgICBmb3IgKGludCBpID0gYmVnaW47IGkgPCBzcGVjTGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgICAgIGlmIChzcGVjW2ldID09ICc6JykgeworICAgICAgICAgICAgICAgICpz
Y2hlbWUgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShiZWdpbiwgaSk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IGZhbHNlOyAvLyBObyBjb2xvbiBmb3VuZDogbm8gc2NoZW1lCisgICAgfQorCisgICAgLy8gRmls
bHMgaW4gYWxsIG1lbWJlcnMgb2YgdGhlIFVSTFNlZ21lbnRzIHN0cnVjdHVyZSBleGNlcHQgZm9y
IHRoZSBzY2hlbWUuCisgICAgLy8KKyAgICAvLyB8c3BlY3wgaXMgdGhlIGZ1bGwgc3BlYyBiZWlu
ZyBwYXJzZWQsIG9mIGxlbmd0aCB8c3BlY0xlbmd0aHwuCisgICAgLy8gfGFmdGVyU2NoZW1lfCBp
cyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgc2NoZW1lIChhZnRlciB0
aGUKKyAgICAvLyAgIGNvbG9uKSB3aGVyZSB3ZSdsbCBiZWdpbiBwYXJzaW5nLgorICAgIC8vCisg
ICAgLy8gQ29tcGF0YWJpbGl0eSBkYXRhIHBvaW50cy4gSSBsaXN0ICJob3N0IiwgInBhdGgiIGV4
dHJhY3RlZDoKKyAgICAvLyBJbnB1dCAgICAgICAgICAgICAgICBJRTYgICAgICAgICAgICAgRmly
ZWZveCAgICAgICAgICAgICAgICBVcworICAgIC8vIC0tLS0tICAgICAgICAgICAgICAgIC0tLS0t
LS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLSAgICAgICAgIC0tLS0tLS0tLS0tLS0tCisgICAgLy8g
aHR0cDovL2Zvby5jb20vICAgICAgImZvby5jb20iLCAiLyIgICJmb28uY29tIiwgIi8iICAgICAg
ICAgImZvby5jb20iLCAiLyIKKyAgICAvLyBodHRwOmZvby5jb20vICAgICAgICAiZm9vLmNvbSIs
ICIvIiAgImZvby5jb20iLCAiLyIgICAgICAgICAiZm9vLmNvbSIsICIvIgorICAgIC8vIGh0dHA6
L2Zvby5jb20vICAgICAgIGZhaWwoKikgICAgICAgICAiZm9vLmNvbSIsICIvIiAgICAgICAgICJm
b28uY29tIiwgIi8iCisgICAgLy8gaHR0cDpcZm9vLmNvbS8gICAgICAgZmFpbCgqKSAgICAgICAg
ICJcZm9vLmNvbSIsICIvIihmYWlsKSAgImZvby5jb20iLCAiLyIKKyAgICAvLyBodHRwOi8vLy9m
b28uY29tLyAgICAiZm9vLmNvbSIsICIvIiAgImZvby5jb20iLCAiLyIgICAgICAgICAiZm9vLmNv
bSIsICIvIgorICAgIC8vCisgICAgLy8gKCopIEludGVyZXN0aW5nbHksIGFsdGhvdWdoIElFIGZh
aWxzIHRvIGxvYWQgdGhlc2UgVVJMcywgaXRzIGhpc3RvcnkKKyAgICAvLyBjYW5vbmljYWxpemVy
IGhhbmRsZXMgdGhlbSwgbWVhbmluZyBpZiB5b3UndmUgYmVlbiB0byB0aGUgY29ycmVzcG9uZGlu
ZworICAgIC8vICJodHRwOi8vZm9vLmNvbS8iIGxpbmssIGl0IHdpbGwgYmUgY29sb3JlZC4KKyAg
ICBzdGF0aWMgdm9pZCBwYXJzZUFmdGVyU2NoZW1lKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVj
TGVuZ3RoLCBpbnQgYWZ0ZXJTY2hlbWUsIFVSTFNlZ21lbnRzKiBwYXJzZWQpCisgICAgeworICAg
ICAgICBpbnQgbnVtYmVyT2ZTbGFzaGVzID0gY29uc2VjdXRpdmVTbGFzaGVzKHNwZWMsIGFmdGVy
U2NoZW1lLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAgaW50IGFmdGVyU2xhc2hlcyA9IGFmdGVyU2No
ZW1lICsgbnVtYmVyT2ZTbGFzaGVzOworCisgICAgICAgIC8vIEZpcnN0IHNwbGl0IGludG8gdHdv
IG1haW4gcGFydHMsIHRoZSBhdXRob3JpdHkgKHVzZXJuYW1lLCBwYXNzd29yZCwgaG9zdCwKKyAg
ICAgICAgLy8gYW5kIHBvcnQpIGFuZCB0aGUgZnVsbCBwYXRoIChwYXRoLCBxdWVyeSwgYW5kIHJl
ZmVyZW5jZSkuCisgICAgICAgIFVSTENvbXBvbmVudCBhdXRob3JpdHk7CisgICAgICAgIFVSTENv
bXBvbmVudCBmdWxsUGF0aDsKKworICAgICAgICAvLyBGb3VuZCAiLy88c29tZSBkYXRhPiIsIGxv
b2tzIGxpa2UgYW4gYXV0aG9yaXR5IHNlY3Rpb24uIFRyZWF0IGV2ZXJ5dGhpbmcKKyAgICAgICAg
Ly8gZnJvbSB0aGVyZSB0byB0aGUgbmV4dCBzbGFzaCAob3IgZW5kIG9mIHNwZWMpIHRvIGJlIHRo
ZSBhdXRob3JpdHkuIE5vdGUKKyAgICAgICAgLy8gdGhhdCB3ZSBpZ25vcmUgdGhlIG51bWJlciBv
ZiBzbGFzaGVzIGFuZCB0cmVhdCBpdCBhcyB0aGUgYXV0aG9yaXR5LgorICAgICAgICBpbnQgYXV0
aEVuZCA9IG5leHRBdXRob3JpdHlUZXJtaW5hdG9yKHNwZWMsIGFmdGVyU2xhc2hlcywgc3BlY0xl
bmd0aCk7CisgICAgICAgIGF1dGhvcml0eSA9IFVSTENvbXBvbmVudChhZnRlclNsYXNoZXMsIGF1
dGhFbmQgLSBhZnRlclNsYXNoZXMpOworCisgICAgICAgIGlmIChhdXRoRW5kID09IHNwZWNMZW5n
dGgpIC8vIE5vIGJlZ2lubmluZyBvZiBwYXRoIGZvdW5kLgorICAgICAgICAgICAgZnVsbFBhdGgg
PSBVUkxDb21wb25lbnQoKTsKKyAgICAgICAgZWxzZSAvLyBFdmVyeXRoaW5nIHN0YXJ0aW5nIGZy
b20gdGhlIHNsYXNoIHRvIHRoZSBlbmQgaXMgdGhlIHBhdGguCisgICAgICAgICAgICBmdWxsUGF0
aCA9IFVSTENvbXBvbmVudChhdXRoRW5kLCBzcGVjTGVuZ3RoIC0gYXV0aEVuZCk7CisKKyAgICAg
ICAgLy8gTm93IHBhcnNlIHRob3NlIHR3byBzdWItcGFydHMuCisgICAgICAgIHBhcnNlQXV0aG9y
aXR5KHNwZWMsIGF1dGhvcml0eSwgJnBhcnNlZC0+dXNlcm5hbWUsICZwYXJzZWQtPnBhc3N3b3Jk
LCAmcGFyc2VkLT5ob3N0LCAmcGFyc2VkLT5wb3J0KTsKKyAgICAgICAgcGFyc2VQYXRoKHNwZWMs
IGZ1bGxQYXRoLCAmcGFyc2VkLT5wYXRoLCAmcGFyc2VkLT5xdWVyeSwgJnBhcnNlZC0+ZnJhZ21l
bnQpOworICAgIH0KKworICAgIC8vIFRoZSBtYWluIHBhcnNpbmcgZnVuY3Rpb24gZm9yIHN0YW5k
YXJkIFVSTHMuIFN0YW5kYXJkIFVSTHMgaGF2ZSBhIHNjaGVtZSwKKyAgICAvLyBob3N0LCBwYXRo
LCBldGMuCisgICAgc3RhdGljIHZvaWQgcGFyc2VTdGFuZGFyZFVSTChjb25zdCBDSEFSKiBzcGVj
LCBpbnQgc3BlY0xlbmd0aCwgVVJMU2VnbWVudHMqIHBhcnNlZCkKKyAgICB7CisgICAgICAgIC8v
IEZJWE1FOiBhZGQgQVNTRVJUKHNwZWNMZW5ndGggPj0gMCk7CisKKyAgICAgICAgLy8gU3RyaXAg
bGVhZGluZyAmIHRyYWlsaW5nIHNwYWNlcyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAg
ICBpbnQgYmVnaW4gPSAwOworICAgICAgICBVUkxQYXJzZXI6OnRyaW1VUkwoc3BlYywgJmJlZ2lu
LCAmc3BlY0xlbmd0aCk7CisKKyAgICAgICAgaW50IGFmdGVyU2NoZW1lOworICAgICAgICBpZiAo
ZXh0cmFjdFNjaGVtZShzcGVjLCBzcGVjTGVuZ3RoLCAmcGFyc2VkLT5zY2hlbWUpKQorICAgICAg
ICAgICAgYWZ0ZXJTY2hlbWUgPSBwYXJzZWQtPnNjaGVtZS5lbmQoKSArIDE7IC8vIFNraXAgcGFz
dCB0aGUgY29sb24uCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gU2F5IHRoZXJlJ3Mg
bm8gc2NoZW1lIHdoZW4gdGhlcmUgaXMgYSBjb2xvbi4gV2UgY291bGQgYWxzbyBzYXkgdGhhdAor
ICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyB0aGUgc2NoZW1lLiBCb3RoIHdvdWxkIHByb2R1
Y2UgYW4gaW52YWxpZCBVUkwsIGJ1dCB0aGlzIHdheQorICAgICAgICAgICAgLy8gc2VlbXMgbGVz
cyB3cm9uZyBpbiBtb3JlIGNhc2VzLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUucmVzZXQo
KTsKKyAgICAgICAgICAgIGFmdGVyU2NoZW1lID0gYmVnaW47CisgICAgICAgIH0KKyAgICAgICAg
cGFyc2VBZnRlclNjaGVtZShzcGVjLCBzcGVjTGVuZ3RoLCBhZnRlclNjaGVtZSwgcGFyc2VkKTsK
KyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwYXJzZVBhdGgoY29uc3QgQ0hBUiogc3BlYywgY29u
c3QgVVJMQ29tcG9uZW50JiBwYXRoLCBVUkxDb21wb25lbnQqIGZpbGVwYXRoLCBVUkxDb21wb25l
bnQqIHF1ZXJ5LCBVUkxDb21wb25lbnQqIGZyYWdtZW50KQorICAgIHsKKyAgICAgICAgLy8gcGF0
aCA9IFsvXTxzZWdtZW50MT4vPHNlZ21lbnQyPi88Li4uPi88c2VnbWVudE4+OzxwYXJhbT4/PHF1
ZXJ5PiM8ZnJhZ21lbnQ+CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZW4gdGhlcmUgaXMg
bm8gcGF0aC4KKyAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gLTEpIHsKKyAgICAgICAgICAg
IGZpbGVwYXRoLT5yZXNldCgpOworICAgICAgICAgICAgcXVlcnktPnJlc2V0KCk7CisgICAgICAg
ICAgICBmcmFnbWVudC0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICAvLyBGSVhNRTogYWRkIEFTU0VSVChwYXRoLmxlbmd0aCgpID4gMCk7IC8vIFdlIHNo
b3VsZCBuZXZlciBoYXZlIDAgbGVuZ3RoIHBhdGhzLgorCisgICAgICAgIC8vIFNlYXJjaCBmb3Ig
Zmlyc3Qgb2NjdXJyZW5jZSBvZiBlaXRoZXIgPyBvciAjLgorICAgICAgICBpbnQgcGF0aEVuZCA9
IHBhdGguYmVnaW4oKSArIHBhdGgubGVuZ3RoKCk7CisKKyAgICAgICAgaW50IHF1ZXJ5U2VwYXJh
dG9yID0gLTE7IC8vIEluZGV4IG9mIHRoZSAnPycKKyAgICAgICAgaW50IHJlZlNlcGFyYXRvciA9
IC0xOyAvLyBJbmRleCBvZiB0aGUgJyMnCisgICAgICAgIGZvciAoaW50IGkgPSBwYXRoLmJlZ2lu
KCk7IGkgPCBwYXRoRW5kOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3BlY1tpXSkgewor
ICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgLy8gT25seSBtYXRjaCB0aGUg
cXVlcnkgc3RyaW5nIGlmIGl0IHByZWNlZGVzIHRoZSByZWZlcmVuY2UgZnJhZ21lbnQKKyAgICAg
ICAgICAgICAgICAvLyBhbmQgd2hlbiB3ZSBoYXZlbid0IGZvdW5kIG9uZSBhbHJlYWR5LgorICAg
ICAgICAgICAgICAgIGlmIChyZWZTZXBhcmF0b3IgPCAwICYmIHF1ZXJ5U2VwYXJhdG9yIDwgMCkK
KyAgICAgICAgICAgICAgICAgICAgcXVlcnlTZXBhcmF0b3IgPSBpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgLy8gUmVjb3Jk
IHRoZSBmaXJzdCAjIHNpZ24gb25seS4KKyAgICAgICAgICAgICAgICBpZiAocmVmU2VwYXJhdG9y
IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmVmU2VwYXJhdG9yID0gaTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXJrZXJzIHBvaW50aW5n
IHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgZWFjaCBvZiB0aGVzZSBjb3JyZXNwb25kaW5nCisgICAg
ICAgIC8vIGNvbXBvbmVudHMuIFRoZSBjb2RlIGJlbG93IHdvcmRzIGZyb20gdGhlIGVuZCBiYWNr
IHRvIHRoZSBiZWdpbm5pbmcsCisgICAgICAgIC8vIGFuZCB3aWxsIHVwZGF0ZSB0aGVzZSBpbmRp
Y2VzIGFzIGl0IGZpbmRzIGNvbXBvbmVudHMgdGhhdCBleGlzdC4KKyAgICAgICAgaW50IGZpbGVF
bmQsIHF1ZXJ5RW5kOworCisgICAgICAgIC8vIEZyYWdtZW50OiBmcm9tIHRoZSAjIHRvIHRoZSBl
bmQgb2YgdGhlIHBhdGguCisgICAgICAgIGlmIChyZWZTZXBhcmF0b3IgPj0gMCkgeworICAgICAg
ICAgICAgZmlsZUVuZCA9IHJlZlNlcGFyYXRvcjsKKyAgICAgICAgICAgIHF1ZXJ5RW5kID0gcmVm
U2VwYXJhdG9yOworICAgICAgICAgICAgKmZyYWdtZW50ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFu
Z2UocmVmU2VwYXJhdG9yICsgMSwgcGF0aEVuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICBmaWxlRW5kID0gcGF0aEVuZDsKKyAgICAgICAgICAgIHF1ZXJ5RW5kID0gcGF0aEVuZDsK
KyAgICAgICAgICAgIGZyYWdtZW50LT5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8g
UXVlcnkgZnJhZ21lbnQ6IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgPyB0byB0aGUgbmV4dCBib3VuZGFy
eSAoZWl0aGVyIHRoZSBlbmQKKyAgICAgICAgLy8gb2YgdGhlIHBhdGggb3IgdGhlIGZyYWdtZW50
IGZyYWdtZW50KS4KKyAgICAgICAgaWYgKHF1ZXJ5U2VwYXJhdG9yID49IDApIHsKKyAgICAgICAg
ICAgIGZpbGVFbmQgPSBxdWVyeVNlcGFyYXRvcjsKKyAgICAgICAgICAgICpxdWVyeSA9IFVSTENv
bXBvbmVudDo6ZnJvbVJhbmdlKHF1ZXJ5U2VwYXJhdG9yICsgMSwgcXVlcnlFbmQpOworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIHF1ZXJ5LT5yZXNldCgpOworCisgICAgICAgIC8vIEZpbGUg
cGF0aDogdHJlYXQgYW4gZW1wdHkgZmlsZSBwYXRoIGFzIG5vIGZpbGUgcGF0aC4KKyAgICAgICAg
aWYgKGZpbGVFbmQgIT0gcGF0aC5iZWdpbigpKQorICAgICAgICAgICAgKmZpbGVwYXRoID0gVVJM
Q29tcG9uZW50Ojpmcm9tUmFuZ2UocGF0aC5iZWdpbigpLCBmaWxlRW5kKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgZmlsZXBhdGgtPnJlc2V0KCk7CisgICAgfQorCisgICAgLy8gSW5pdGlh
bGl6ZXMgYSBwYXRoIFVSTCB3aGljaCBpcyBtZXJlbHkgYSBzY2hlbWUgZm9sbG93ZWQgYnkgYSBw
YXRoLiBFeGFtcGxlcworICAgIC8vIGluY2x1ZGUgImFib3V0OmZvbyIgYW5kICJqYXZhc2NyaXB0
OmFsZXJ0KCdiYXInKTsiCisgICAgc3RhdGljIHZvaWQgcGFyc2VQYXRoVVJMKGNvbnN0IENIQVIq
IHNwZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxTZWdtZW50cyogcGFyc2VkKQorICAgIHsKKyAgICAg
ICAgLy8gR2V0IHRoZSBub24tcGF0aCBhbmQgbm9uLXNjaGVtZSBwYXJ0cyBvZiB0aGUgVVJMIG91
dCBvZiB0aGUgd2F5LCB3ZSBuZXZlcgorICAgICAgICAvLyB1c2UgdGhlbS4KKyAgICAgICAgcGFy
c2VkLT51c2VybmFtZS5yZXNldCgpOworICAgICAgICBwYXJzZWQtPnBhc3N3b3JkLnJlc2V0KCk7
CisgICAgICAgIHBhcnNlZC0+aG9zdC5yZXNldCgpOworICAgICAgICBwYXJzZWQtPnBvcnQucmVz
ZXQoKTsKKyAgICAgICAgcGFyc2VkLT5xdWVyeS5yZXNldCgpOworICAgICAgICBwYXJzZWQtPmZy
YWdtZW50LnJlc2V0KCk7CisKKyAgICAgICAgLy8gU3RyaXAgbGVhZGluZyAmIHRyYWlsaW5nIHNw
YWNlcyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAgICBpbnQgYmVnaW4gPSAwOworICAg
ICAgICBVUkxQYXJzZXI6OnRyaW1VUkwoc3BlYywgJmJlZ2luLCAmc3BlY0xlbmd0aCk7CisKKyAg
ICAgICAgLy8gSGFuZGxlIGVtcHR5IHNwZWNzIG9yIG9uZXMgdGhhdCBjb250YWluIG9ubHkgd2hp
dGVzcGFjZSBvciBjb250cm9sIGNoYXJzLgorICAgICAgICBpZiAoYmVnaW4gPT0gc3BlY0xlbmd0
aCkgeworICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAgICAgIHBh
cnNlZC0+cGF0aC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gRXh0cmFjdCB0aGUgc2NoZW1lLCB3aXRoIHRoZSBwYXRoIGJlaW5nIGV2ZXJ5dGhp
bmcgZm9sbG93aW5nLiBXZSBhbHNvCisgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0
aGVyZSBpcyBubyBzY2hlbWUuCisgICAgICAgIGlmIChleHRyYWN0U2NoZW1lKCZzcGVjW2JlZ2lu
XSwgc3BlY0xlbmd0aCAtIGJlZ2luLCAmcGFyc2VkLT5zY2hlbWUpKSB7CisgICAgICAgICAgICAv
LyBPZmZzZXQgdGhlIHJlc3VsdHMgc2luY2Ugd2UgZ2F2ZSBleHRyYWN0U2NoZW1lIGEgc3Vic3Ry
aW5nLgorICAgICAgICAgICAgcGFyc2VkLT5zY2hlbWUuc2V0QmVnaW4ocGFyc2VkLT5zY2hlbWUu
YmVnaW4oKSArIGJlZ2luKTsKKworICAgICAgICAgICAgLy8gRm9yIGNvbXBhdGFiaWxpdHkgd2l0
aCB0aGUgc3RhbmRhcmQgVVJMIHBhcnNlciwgd2UgdHJlYXQgbm8gcGF0aCBhcworICAgICAgICAg
ICAgLy8gLTEsIHJhdGhlciB0aGFuIGhhdmluZyBhIGxlbmd0aCBvZiAwICh3ZSBub3JtYWxseSB3
b3VsZG4ndCBjYXJlIHNvCisgICAgICAgICAgICAvLyBtdWNoIGZvciB0aGVzZSBub24tc3RhbmRh
cmQgVVJMcykuCisgICAgICAgICAgICBpZiAocGFyc2VkLT5zY2hlbWUuZW5kKCkgPT0gc3BlY0xl
bmd0aCAtIDEpCisgICAgICAgICAgICAgICAgcGFyc2VkLT5wYXRoLnJlc2V0KCk7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGFyc2VkLT5wYXRoID0gVVJMQ29tcG9uZW50Ojpm
cm9tUmFuZ2UocGFyc2VkLT5zY2hlbWUuZW5kKCkgKyAxLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHNjaGVtZSBmb3VuZCwganVzdCBwYXRoLgorICAg
ICAgICAgICAgcGFyc2VkLT5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAgICAgIHBhcnNlZC0+cGF0
aCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGJlZ2luLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHBhcnNlTWFpbHRvVVJMKGNvbnN0IENIQVIqIHNw
ZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxTZWdtZW50cyogcGFyc2VkKQorICAgIHsKKyAgICAgICAg
Ly8gRklYTUU6IGFkZCBBU1NFUlQoc3BlY0xlbmd0aCA+PSAwKTsKKworICAgICAgICAvLyBHZXQg
dGhlIG5vbi1wYXRoIGFuZCBub24tc2NoZW1lIHBhcnRzIG9mIHRoZSBVUkwgb3V0IG9mIHRoZSB3
YXksIHdlIG5ldmVyCisgICAgICAgIC8vIHVzZSB0aGVtLgorICAgICAgICBwYXJzZWQtPnVzZXJu
YW1lLnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+cGFzc3dvcmQucmVzZXQoKTsKKyAgICAgICAg
cGFyc2VkLT5ob3N0LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+cG9ydC5yZXNldCgpOworICAg
ICAgICBwYXJzZWQtPmZyYWdtZW50LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC0+cXVlcnkucmVz
ZXQoKTsgLy8gTWF5IHVzZSB0aGlzOyByZXNldCBmb3IgY29udmVuaWVuY2UuCisKKyAgICAgICAg
Ly8gU3RyaXAgbGVhZGluZyAmIHRyYWlsaW5nIHNwYWNlcyBhbmQgY29udHJvbCBjaGFyYWN0ZXJz
LgorICAgICAgICBpbnQgYmVnaW4gPSAwOworICAgICAgICBVUkxQYXJzZXI6OlVSTFBhcnNlcjo6
dHJpbVVSTChzcGVjLCAmYmVnaW4sICZzcGVjTGVuZ3RoKTsKKworICAgICAgICAvLyBIYW5kbGUg
ZW1wdHkgc3BlY3Mgb3Igb25lcyB0aGF0IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIG9yIGNvbnRy
b2wgY2hhcnMuCisgICAgICAgIGlmIChiZWdpbiA9PSBzcGVjTGVuZ3RoKSB7CisgICAgICAgICAg
ICBwYXJzZWQtPnNjaGVtZS5yZXNldCgpOworICAgICAgICAgICAgcGFyc2VkLT5wYXRoLnJlc2V0
KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgcGF0aEJl
Z2luID0gLTE7CisgICAgICAgIGludCBwYXRoRW5kID0gLTE7CisKKyAgICAgICAgLy8gRXh0cmFj
dCB0aGUgc2NoZW1lLCB3aXRoIHRoZSBwYXRoIGJlaW5nIGV2ZXJ5dGhpbmcgZm9sbG93aW5nLiBX
ZSBhbHNvCisgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBzY2hl
bWUuCisgICAgICAgIGlmIChleHRyYWN0U2NoZW1lKCZzcGVjW2JlZ2luXSwgc3BlY0xlbmd0aCAt
IGJlZ2luLCAmcGFyc2VkLT5zY2hlbWUpKSB7CisgICAgICAgICAgICAvLyBPZmZzZXQgdGhlIHJl
c3VsdHMgc2luY2Ugd2UgZ2F2ZSBleHRyYWN0U2NoZW1lIGEgc3Vic3RyaW5nLgorICAgICAgICAg
ICAgcGFyc2VkLT5zY2hlbWUuc2V0QmVnaW4ocGFyc2VkLT5zY2hlbWUuYmVnaW4oKSArIGJlZ2lu
KTsKKworICAgICAgICAgICAgaWYgKHBhcnNlZC0+c2NoZW1lLmVuZCgpICE9IHNwZWNMZW5ndGgg
LSAxKSB7CisgICAgICAgICAgICAgICAgcGF0aEJlZ2luID0gcGFyc2VkLT5zY2hlbWUuZW5kKCkg
KyAxOworICAgICAgICAgICAgICAgIHBhdGhFbmQgPSBzcGVjTGVuZ3RoOworICAgICAgICAgICAg
fQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gc2NoZW1lIGZvdW5kLCBqdXN0
IHBhdGguCisgICAgICAgICAgICBwYXJzZWQtPnNjaGVtZS5yZXNldCgpOworICAgICAgICAgICAg
cGF0aEJlZ2luID0gYmVnaW47CisgICAgICAgICAgICBwYXRoRW5kID0gc3BlY0xlbmd0aDsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIFNwbGl0IFtwYXRoQmVnaW4sIHBhdGhFbmQpIGludG8gYSBw
YXRoICsgcXVlcnkuCisgICAgICAgIGZvciAoaW50IGkgPSBwYXRoQmVnaW47IGkgPCBwYXRoRW5k
OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzcGVjW2ldID09ICc/JykgeworICAgICAgICAgICAg
ICAgIHBhcnNlZC0+cXVlcnkgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShpICsgMSwgcGF0aEVu
ZCk7CisgICAgICAgICAgICAgICAgcGF0aEVuZCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3IgY29tcGF0YWJpbGl0
eSB3aXRoIHRoZSBzdGFuZGFyZCBVUkwgcGFyc2VyLCB0cmVhdCBubyBwYXRoIGFzCisgICAgICAg
IC8vIC0xLCByYXRoZXIgdGhhbiBoYXZpbmcgYSBsZW5ndGggb2YgMAorICAgICAgICBpZiAocGF0
aEJlZ2luID09IHBhdGhFbmQpCisgICAgICAgICAgICBwYXJzZWQtPnBhdGgucmVzZXQoKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgcGFyc2VkLT5wYXRoID0gVVJMQ29tcG9uZW50Ojpmcm9t
UmFuZ2UocGF0aEJlZ2luLCBwYXRoRW5kKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0cyBhIHBv
cnQgbnVtYmVyIGluIGEgc3RyaW5nIHRvIGFuIGludGVnZXIuIFdlJ2QgbGlrZSB0byBqdXN0IGNh
bGwKKyAgICAvLyBzc2NhbmYgYnV0IG91ciBpbnB1dCBpcyBub3QgMC10ZXJtaW5hdGVkLCB3aGlj
aCBzc2NhbmYgcmVxdWlyZXMuIEluc3RlYWQsCisgICAgLy8gd2UgY29weSB0aGUgZGlnaXRzIHRv
IGEgc21hbGwgc3RhY2sgYnVmZmVyIChzaW5jZSB3ZSBrbm93IHRoZSBtYXhpbXVtIG51bWJlcgor
ICAgIC8vIG9mIGRpZ2l0cyBpbiBhIHZhbGlkIHBvcnQgbnVtYmVyKSB0aGF0IHdlIGNhbiAwIHRl
cm1pbmF0ZS4KKyAgICBzdGF0aWMgaW50IHBhcnNlUG9ydChjb25zdCBDSEFSKiBzcGVjLCBjb25z
dCBVUkxDb21wb25lbnQmIGNvbXBvbmVudCkKKyAgICB7CisgICAgICAgIC8vIEVhc3kgc3VjY2Vz
cyBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gcG9ydC4KKyAgICAgICAgY29uc3QgaW50IG1heERpZ2l0
cyA9IDU7CisgICAgICAgIGlmICghY29tcG9uZW50LmlzTm9uZW1wdHkoKSkKKyAgICAgICAgICAg
IHJldHVybiBVbnNwZWNpZmllZFBvcnQ7CisKKyAgICAgICAgLy8gU2tpcCBvdmVyIGFueSBsZWFk
aW5nIDBzLgorICAgICAgICBVUkxDb21wb25lbnQgbm9uWmVyb0RpZ2l0cyhjb21wb25lbnQuZW5k
KCksIDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5sZW5ndGgoKTsg
KytpKSB7CisgICAgICAgICAgICBpZiAoc3BlY1tjb21wb25lbnQuYmVnaW4oKSArIGldICE9ICcw
JykgeworICAgICAgICAgICAgICAgIG5vblplcm9EaWdpdHMgPSBVUkxDb21wb25lbnQ6OmZyb21S
YW5nZShjb21wb25lbnQuYmVnaW4oKSArIGksIGNvbXBvbmVudC5lbmQoKSk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vblpl
cm9EaWdpdHMubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBBbGwgZGln
aXRzIHdlcmUgMC4KKworICAgICAgICAvLyBWZXJpZnkgd2UgZG9uJ3QgaGF2ZSB0b28gbWFueSBk
aWdpdHMgKHdlJ2xsIGJlIGNvcHlpbmcgdG8gb3VyIGJ1ZmZlciBzbworICAgICAgICAvLyB3ZSBu
ZWVkIHRvIGRvdWJsZS1jaGVjaykuCisgICAgICAgIGlmIChub25aZXJvRGlnaXRzLmxlbmd0aCgp
ID4gbWF4RGlnaXRzKQorICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQb3J0OworCisgICAgICAg
IC8vIENvcHkgdmFsaWQgZGlnaXRzIHRvIHRoZSBidWZmZXIuCisgICAgICAgIGNoYXIgZGlnaXRz
W21heERpZ2l0cyArIDFdOyAvLyArMSBmb3IgbnVsbCB0ZXJtaW5hdG9yCisgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgbm9uWmVyb0RpZ2l0cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAg
ICBDSEFSIGNoID0gc3BlY1tub25aZXJvRGlnaXRzLmJlZ2luKCkgKyBpXTsKKyAgICAgICAgICAg
IGlmICghaXNQb3J0RGlnaXQoY2gpKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBwb3J0
IGRpZ2l0LCBmYWlsLgorICAgICAgICAgICAgICAgIHJldHVybiBJbnZhbGlkUG9ydDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGRpZ2l0c1tpXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIE51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcgYW5kIGNv
bnZlcnQgdG8gaW50ZWdlci4gU2luY2Ugd2UgZ3VhcmFudGVlCisgICAgICAgIC8vIG9ubHkgZGln
aXRzLCBhdG9pJ3MgbGFjayBvZiBlcnJvciBoYW5kbGluZyBpcyBPSy4KKyAgICAgICAgZGlnaXRz
W25vblplcm9EaWdpdHMubGVuZ3RoKCldID0gMDsKKyAgICAgICAgaW50IHBvcnQgPSBhdG9pKGRp
Z2l0cyk7CisgICAgICAgIGlmIChwb3J0ID4gNjU1MzUpCisgICAgICAgICAgICByZXR1cm4gSW52
YWxpZFBvcnQ7IC8vIE91dCBvZiByYW5nZS4KKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQor
CisgICAgc3RhdGljIHZvaWQgZXh0cmFjdEZpbGVOYW1lKGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0
IFVSTENvbXBvbmVudCYgcGF0aCwgVVJMQ29tcG9uZW50KiBmaWxlTmFtZSkKKyAgICB7CisgICAg
ICAgIC8vIEhhbmRsZSBlbXB0eSBwYXRoczogdGhleSBoYXZlIG5vIGZpbGUgbmFtZXMuCisgICAg
ICAgIGlmICghcGF0aC5pc05vbmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbGVOYW1lLT5yZXNl
dCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VhcmNo
IGJhY2t3YXJkcyBmb3IgYSBwYXJhbWV0ZXIsIHdoaWNoIGlzIGEgbm9ybWFsbHkgdW51c2VkIGZp
ZWxkIGluIGEKKyAgICAgICAgLy8gVVJMIGRlbGltaXRlZCBieSBhIHNlbWljb2xvbi4gV2UgcGFy
c2UgdGhlIHBhcmFtZXRlciBhcyBwYXJ0IG9mIHRoZQorICAgICAgICAvLyBwYXRoLCBidXQgaGVy
ZSwgd2UgZG9uJ3Qgd2FudCB0byBjb3VudCBpdC4gVGhlIGxhc3Qgc2VtaWNvbG9uIGlzIHRoZQor
ICAgICAgICAvLyBwYXJhbWV0ZXIuIFRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIGEgc2xhc2gs
IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sKKyAgICAgICAgLy8gdGhlIGZpcnN0IG9uZS4KKyAg
ICAgICAgaW50IGZpbGVFbmQgPSBwYXRoLmVuZCgpOworICAgICAgICBmb3IgKGludCBpID0gcGF0
aC5lbmQoKSAtIDE7IGkgPiBwYXRoLmJlZ2luKCk7IGktLSkgeworICAgICAgICAgICAgaWYgKHNw
ZWNbaV0gPT0gJzsnKSB7CisgICAgICAgICAgICAgICAgZmlsZUVuZCA9IGk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cg
c2VhcmNoIGJhY2t3YXJkcyBmcm9tIHRoZSBmaWxlbmFtZSBlbmQgdG8gdGhlIHByZXZpb3VzIHNs
YXNoCisgICAgICAgIC8vIHRvIGZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZW5hbWUuCisg
ICAgICAgIGZvciAoaW50IGkgPSBmaWxlRW5kIC0gMTsgaSA+PSBwYXRoLmJlZ2luKCk7IGktLSkg
eworICAgICAgICAgICAgaWYgKGlzVVJMU2xhc2goc3BlY1tpXSkpIHsKKyAgICAgICAgICAgICAg
ICAvLyBGaWxlIG5hbWUgaXMgZXZlcnl0aGluZyBmb2xsb3dpbmcgdGhpcyBjaGFyYWN0ZXIgdG8g
dGhlIGVuZAorICAgICAgICAgICAgICAgICpmaWxlTmFtZSA9IFVSTENvbXBvbmVudDo6ZnJvbVJh
bmdlKGkgKyAxLCBmaWxlRW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBzbGFzaCBmb3VuZCwgdGhpcyBtZWFucyB0
aGUgaW5wdXQgd2FzIGRlZ2VuZXJhdGUgKGdlbmVyYWxseSBwYXRocworICAgICAgICAvLyB3aWxs
IHN0YXJ0IHdpdGggYSBzbGFzaCkuIExldCdzIGNhbGwgZXZlcnl0aGluZyB0aGUgZmlsZSBuYW1l
LgorICAgICAgICAqZmlsZU5hbWUgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShwYXRoLmJlZ2lu
KCksIGZpbGVFbmQpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGV4dHJhY3RRdWVyeUtleVZh
bHVlKGNvbnN0IENIQVIqIHNwZWMsIFVSTENvbXBvbmVudCogcXVlcnksIFVSTENvbXBvbmVudCog
a2V5LCBVUkxDb21wb25lbnQqIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCFxdWVyeS0+aXNO
b25lbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGludCBzdGFy
dCA9IHF1ZXJ5LT5iZWdpbigpOworICAgICAgICBpbnQgY3VycmVudCA9IHN0YXJ0OworICAgICAg
ICBpbnQgZW5kID0gcXVlcnktPmVuZCgpOworCisgICAgICAgIC8vIFdlIGFzc3VtZSB0aGUgYmVn
aW5uaW5nIG9mIHRoZSBpbnB1dCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSAia2V5IiBhbmQgd2UK
KyAgICAgICAgLy8gc2tpcCB0byB0aGUgZW5kIG9mIGl0LgorICAgICAgICBrZXktPnNldEJlZ2lu
KGN1cnJlbnQpOworICAgICAgICB3aGlsZSAoY3VycmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRd
ICE9ICcmJyAmJiBzcGVjW2N1cnJlbnRdICE9ICc9JykKKyAgICAgICAgICAgICsrY3VycmVudDsK
KyAgICAgICAga2V5LT5zZXRMZW5ndGgoY3VycmVudCAtIGtleS0+YmVnaW4oKSk7CisKKyAgICAg
ICAgLy8gU2tpcCB0aGUgc2VwYXJhdG9yIGFmdGVyIHRoZSBrZXkgKGlmIGFueSkuCisgICAgICAg
IGlmIChjdXJyZW50IDwgZW5kICYmIHNwZWNbY3VycmVudF0gPT0gJz0nKQorICAgICAgICAgICAg
KytjdXJyZW50OworCisgICAgICAgIC8vIEZpbmQgdGhlIHZhbHVlIHBhcnQuCisgICAgICAgIHZh
bHVlLT5zZXRCZWdpbihjdXJyZW50KTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgPCBlbmQgJiYg
c3BlY1tjdXJyZW50XSAhPSAnJicpCisgICAgICAgICAgICArK2N1cnJlbnQ7CisgICAgICAgIHZh
bHVlLT5zZXRMZW5ndGgoY3VycmVudCAtIHZhbHVlLT5iZWdpbigpKTsKKworICAgICAgICAvLyBG
aW5hbGx5IHNraXAgdGhlIG5leHQgc2VwYXJhdG9yIGlmIGFueQorICAgICAgICBpZiAoY3VycmVu
dCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdID09ICcmJykKKyAgICAgICAgICAgICsrY3VycmVudDsK
KworICAgICAgICAvLyBTYXZlIHRoZSBuZXcgcXVlcnkKKyAgICAgICAgKnF1ZXJ5ID0gVVJMQ29t
cG9uZW50Ojpmcm9tUmFuZ2UoY3VycmVudCwgZW5kKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcHJvdGVjdGVkIG9yIHByaXZhdGUuCitw
dWJsaWM6CisgICAgLy8gV2UgdHJlYXQgc2xhc2hlcyBhbmQgYmFja3NsYXNoZXMgdGhlIHNhbWUg
Zm9yIElFIGNvbXBhdGFiaWxpdHkuCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVVJMU2xhc2go
Q0hBUiBjaCkKKyAgICB7CisgICAgICAgIHJldHVybiBjaCA9PSAnLycgfHwgY2ggPT0gJ1xcJzsK
KyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgd2Ugc2hvdWxkIHRyaW0gdGhpcyBjaGFy
YWN0ZXIgZnJvbSB0aGUgVVJMIGJlY2F1c2UgaXQgaXMgYQorICAgIC8vIHNwYWNlIG9yIGEgY29u
dHJvbCBjaGFyYWN0ZXIuCisgICAgc3RhdGljIGlubGluZSBib29sIHNob3VsZFRyaW1Gcm9tVVJM
KENIQVIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gY2ggPD0gJyAnOworICAgIH0KKworICAg
IC8vIEdpdmVuIGFuIGFscmVhZHktaW5pdGlhbGl6ZWQgYmVnaW4gaW5kZXggYW5kIGxlbmd0aCwg
dGhpcyBzaHJpbmtzIHRoZSByYW5nZQorICAgIC8vIHRvIGVsaW1pbmF0ZSAic2hvdWxkLWJlLXRy
aW1tZWQiIGNoYXJhY3RlcnMuIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIGRvZXMgKm5vdCoKKyAgICAv
LyBpbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHVudHJpbW1lZCBkYXRhIGZyb20gfCpiZWdpbnwsIGJ1
dCByYXRoZXIgdGhlIHBvc2l0aW9uCisgICAgLy8gaW4gdGhlIGlucHV0IHN0cmluZyAoc28gdGhl
IHN0cmluZyBzdGFydHMgYXQgY2hhcmFjdGVyIHwqYmVnaW58IGluIHRoZSBzcGVjLAorICAgIC8v
IGFuZCBnb2VzIHVudGlsIHwqbGVufCkuCisgICAgc3RhdGljIGlubGluZSB2b2lkIHRyaW1VUkwo
Y29uc3QgQ0hBUiogc3BlYywgaW50KiBiZWdpbiwgaW50KiBsZW5ndGgpCisgICAgeworICAgICAg
ICAvLyBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGNvbnRyb2wgY2hhcmFjdGVycy4KKyAg
ICAgICAgd2hpbGUgKCpiZWdpbiA8ICpsZW5ndGggJiYgc2hvdWxkVHJpbUZyb21VUkwoc3BlY1sq
YmVnaW5dKSkKKyAgICAgICAgICAgICgqYmVnaW4pKys7CisKKyAgICAgICAgLy8gU3RyaXAgdHJh
aWxpbmcgd2hpdGVzcGFjZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLiBXZSBuZWVkIHRoZSA+aSB0
ZXN0IGZvcgorICAgICAgICAvLyB3aGVuIHRoZSBpbnB1dCBzdHJpbmcgaXMgYWxsIGJsYW5rczsg
d2UgZG9uJ3Qgd2FudCB0byBiYWNrIHBhc3QgdGhlIGlucHV0LgorICAgICAgICB3aGlsZSAoKmxl
bmd0aCA+ICpiZWdpbiAmJiBzaG91bGRUcmltRnJvbVVSTChzcGVjWypsZW5ndGggLSAxXSkpCisg
ICAgICAgICAgICAoKmxlbmd0aCktLTsKKyAgICB9CisKKyAgICAvLyBDb3VudHMgdGhlIG51bWJl
ciBvZiBjb25zZWN1dGl2ZSBzbGFzaGVzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQKKyAg
ICAvLyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIHRoZSBnaXZlbiBsZW5ndGguCisgICAgc3RhdGlj
IGlubGluZSBpbnQgY29uc2VjdXRpdmVTbGFzaGVzKGNvbnN0IENIQVIgKnN0cmluZywgaW50IGJl
Z2luT2Zmc2V0LCBpbnQgc3RyaW5nTGVuZ3RoKQorICAgIHsKKyAgICAgICAgaW50IGNvdW50ID0g
MDsKKyAgICAgICAgd2hpbGUgKGJlZ2luT2Zmc2V0ICsgY291bnQgPCBzdHJpbmdMZW5ndGggJiYg
aXNVUkxTbGFzaChzdHJpbmdbYmVnaW5PZmZzZXQgKyBjb3VudF0pKQorICAgICAgICAgICAgKytj
b3VudDsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBV
UkxQYXJzZXIgY2Fubm90IGJlIGNvbnN0cnVjdGVkLgorICAgIFVSTFBhcnNlcigpOworCisgICAg
Ly8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBkaWdpdCB0
byB1c2UgaW4gYSBwb3J0LgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1BvcnREaWdpdChDSEFS
IGNoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOSc7CisgICAg
fQorCisgICAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGF1dGhvcml0eSB0ZXJt
aW5hdG9yIGluIHRoZSBpbnB1dCBzdGFydGluZworICAgIC8vIGZyb20gc3RhcnRPZmZzZXQuIElm
IG5vIHRlcm1pbmF0b3IgaXMgZm91bmQsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBlcXVhbAor
ICAgIC8vIHRvIHNwZWNMZW5ndGguCisgICAgc3RhdGljIGludCBuZXh0QXV0aG9yaXR5VGVybWlu
YXRvcihjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3RhcnRPZmZzZXQsIGludCBzcGVjTGVuZ3RoKQor
ICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0T2Zmc2V0OyBpIDwgc3BlY0xlbmd0aDsg
aSsrKSB7CisgICAgICAgICAgICBpZiAoaXNBdXRob3JpdHlUZXJtaW5hdG9yKHNwZWNbaV0pKQor
ICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcGVj
TGVuZ3RoOyAvLyBOb3QgZm91bmQuCisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcGFyc2VVc2Vy
SW5mbyhjb25zdCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIHVzZXIsIFVSTENvbXBv
bmVudCogdXNlcm5hbWUsIFVSTENvbXBvbmVudCogcGFzc3dvcmQpCisgICAgeworICAgICAgICAv
LyBGaW5kIHRoZSBmaXJzdCBjb2xvbiBpbiB0aGUgdXNlciBzZWN0aW9uLCB3aGljaCBzZXBhcmF0
ZXMgdGhlIHVzZXJuYW1lIGFuZAorICAgICAgICAvLyBwYXNzd29yZC4KKyAgICAgICAgaW50IGNv
bG9uT2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKGNvbG9uT2Zmc2V0IDwgdXNlci5sZW5ndGgo
KSAmJiBzcGVjW3VzZXIuYmVnaW4oKSArIGNvbG9uT2Zmc2V0XSAhPSAnOicpCisgICAgICAgICAg
ICBjb2xvbk9mZnNldCsrOworCisgICAgICAgIGlmIChjb2xvbk9mZnNldCA8IHVzZXIubGVuZ3Ro
KCkpIHsKKyAgICAgICAgICAgIC8vIEZvdW5kIHNlcGFyYXRvcjogPHVzZXJuYW1lPjo8cGFzc3dv
cmQ+CisgICAgICAgICAgICAqdXNlcm5hbWUgPSBVUkxDb21wb25lbnQodXNlci5iZWdpbigpLCBj
b2xvbk9mZnNldCk7CisgICAgICAgICAgICAqcGFzc3dvcmQgPSBVUkxDb21wb25lbnQ6OmZyb21S
YW5nZSh1c2VyLmJlZ2luKCkgKyBjb2xvbk9mZnNldCArIDEsIHVzZXIuYmVnaW4oKSArIHVzZXIu
bGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gc2VwYXJhdG9y
LCB0cmVhdCBldmVyeXRoaW5nIGFzIHRoZSB1c2VybmFtZQorICAgICAgICAgICAgKnVzZXJuYW1l
ID0gdXNlcjsKKyAgICAgICAgICAgICpwYXNzd29yZCA9IFVSTENvbXBvbmVudCgpOworICAgICAg
ICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcGFyc2VTZXJ2ZXJJbmZvKGNvbnN0IENIQVIq
IHNwZWMsIGNvbnN0IFVSTENvbXBvbmVudCYgc2VydmVySW5mbywgVVJMQ29tcG9uZW50KiBob3N0
LCBVUkxDb21wb25lbnQqIHBvcnQpCisgICAgeworICAgICAgICBpZiAoc2VydmVySW5mby5sZW5n
dGgoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBObyBzZXJ2ZXIgaW5mbywgaG9zdCBuYW1lIGlz
IGVtcHR5LgorICAgICAgICAgICAgaG9zdC0+cmVzZXQoKTsKKyAgICAgICAgICAgIHBvcnQtPnJl
c2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0
aGUgaG9zdCBzdGFydHMgd2l0aCBhIGxlZnQtYnJhY2tldCwgYXNzdW1lIHRoZSBlbnRpcmUgaG9z
dCBpcyBhbgorICAgICAgICAvLyBJUHY2IGxpdGVyYWwuICBPdGhlcndpc2UsIGFzc3VtZSBub25l
IG9mIHRoZSBob3N0IGlzIGFuIElQdjYgbGl0ZXJhbC4KKyAgICAgICAgLy8gVGhpcyBhc3N1bXB0
aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiB3ZSBmaW5kIGEgcmlnaHQtYnJhY2tldC4KKyAgICAg
ICAgLy8KKyAgICAgICAgLy8gT3VyIElQdjYgYWRkcmVzcyBjYW5vbmljYWxpemF0aW9uIGNvZGUg
cmVxdWlyZXMgYm90aCBicmFja2V0cyB0byBleGlzdCwKKyAgICAgICAgLy8gYnV0IHRoZSBhYmls
aXR5IHRvIGxvY2F0ZSBhbiBpbmNvbXBsZXRlIGFkZHJlc3MgY2FuIHN0aWxsIGJlIHVzZWZ1bC4K
KyAgICAgICAgaW50IGlwdjZUZXJtaW5hdG9yID0gc3BlY1tzZXJ2ZXJJbmZvLmJlZ2luKCldID09
ICdbJyA/IHNlcnZlckluZm8uZW5kKCkgOiAtMTsKKyAgICAgICAgaW50IGNvbG9uID0gLTE7CisK
KyAgICAgICAgLy8gRmluZCB0aGUgbGFzdCByaWdodC1icmFja2V0LCBhbmQgdGhlIGxhc3QgY29s
b24uCisgICAgICAgIGZvciAoaW50IGkgPSBzZXJ2ZXJJbmZvLmJlZ2luKCk7IGkgPCBzZXJ2ZXJJ
bmZvLmVuZCgpOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3BlY1tpXSkgeworICAgICAg
ICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICAgICAgaXB2NlRlcm1pbmF0b3IgPSBpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAg
ICAgY29sb24gPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgICAgIGlmIChjb2xvbiA+IGlwdjZUZXJtaW5hdG9yKSB7CisgICAgICAgICAgICAvLyBGb3Vu
ZCBhIHBvcnQgbnVtYmVyOiA8aG9zdG5hbWU+Ojxwb3J0PgorICAgICAgICAgICAgKmhvc3QgPSBV
UkxDb21wb25lbnQ6OmZyb21SYW5nZShzZXJ2ZXJJbmZvLmJlZ2luKCksIGNvbG9uKTsKKyAgICAg
ICAgICAgIGlmIChob3N0LT5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgIGhvc3QtPnJl
c2V0KCk7CisgICAgICAgICAgICAqcG9ydCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGNvbG9u
ICsgMSwgc2VydmVySW5mby5lbmQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAv
LyBObyBwb3J0OiA8aG9zdG5hbWU+CisgICAgICAgICAgICAqaG9zdCA9IHNlcnZlckluZm87Cisg
ICAgICAgICAgICBwb3J0LT5yZXNldCgpOworICAgICAgICB9CisgICAgfQorfTsKKworfSAvLyBu
YW1lc3BhY2UgV1RGCisKKyNlbmRpZiAvLyBVUkxQYXJzZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55188</attachid>
            <date>2010-05-05 18:27:30 -0700</date>
            <delta_ts>2010-05-07 00:43:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38572-20100505182729.patch</filename>
            <type>text/plain</type>
            <size>28258</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4ODQ3KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDkgQEAKKzIwMTAtMDUtMDUgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbV1RGVVJMXSBBZGQgY29yZSBVUkwgcGFyc2VyCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODU3MgorCisgICAgICAgIFRo
aXMgcGF0Y2ggYWRkcyB0aGUgY29yZSBvZiB0aGUgVVJMIHBhcnNlci4gIFRoZSBVUkwgcGFyc2Vy
IHVzZXMgYQorICAgICAgICB0ZW1wbGF0ZWQgbm90aW9uIG9mIGEgY29kZSB1bml0IHRvIHN1cHBv
cnQgZGlmZmVyZW50IHN0cmluZyB0eXBlcy4KKyAgICAgICAgTGF0ZXIgd2UnbGwgYWRkIHNvbWUg
bm9uLXRlbXBsYXRlZCBBUElzIHdpdGggY29uY3JldGUgdHlwZXMgdGhhdAorICAgICAgICBjbGll
bnRzIGNhbiB1c2UgbW9yZSBjb252ZW5pZW50bHkuCisKKyAgICAgICAgVGhlIFVSTFBhcnNlciBo
YXMgYSBjb3VwbGUgY2FsbHMgdG8gQVNTRVJUKCksIHdoaWNoIEkndmUgY29tbWVudGVkIG91dAor
ICAgICAgICBmb3Igbm93LiAgSSdtIG5vdCAxMDAlIHN1cmUgaG93IHRvIGhhbmRsZSB0aGUgZGVw
ZW5kZW5jeSBpc3N1ZXMgdGhlcmUKKyAgICAgICAgeWV0LCBzbyBJJ3ZlIHB1bnRlZCBvbiB0aGUg
aXNzdWUgZm9yIG5vdy4KKworICAgICAgICBBbHNvLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgbWV0
aG9kcyB0aGF0IGFyZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhpcworICAgICAgICBwYXRjaCB0aGF0
IGFyZSBvbmx5IHVzZWQgYnkgdGhlIGNhbm9uaWNhbGl6ZXIuICBNeSBwbGFuIGlzIHRvIG1ha2UK
KyAgICAgICAgdGhvc2UgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgYW5kIG1ha2UgdGhlIGNhbm9uaWNh
bGl6ZXIgYSBmcmllbmQgb2YgdGhlCisgICAgICAgIHBhcnNlci4gIFRoZSBkZXRhaWxzIHdpbGwg
YmUgaW4gYSBsYXRlciBwYXRjaC4KKworICAgICAgICAqIHd0Zi91cmwvc3JjL1VSTENvbXBvbmVu
dC5oOgorICAgICAgICAoV1RGOjpVUkxDb21wb25lbnQ6OmZyb21SYW5nZSk6CisgICAgICAgICog
d3RmL3VybC9zcmMvVVJMUGFyc2VyLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6
Oik6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6aXNBdXRob3JpdHlUZXJtaW5hdG9yKToKKyAg
ICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZUF1dGhvcml0eSk6CisgICAgICAgIChXVEY6OlVS
TFBhcnNlcjo6ZXh0cmFjdFNjaGVtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VB
ZnRlclNjaGVtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VTdGFuZGFyZFVSTCk6
CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VQYXRoKToKKyAgICAgICAgKFdURjo6VVJM
UGFyc2VyOjpwYXJzZVBhdGhVUkwpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnBhcnNlTWFp
bHRvVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZVBvcnQpOgorICAgICAgICAo
V1RGOjpVUkxQYXJzZXI6OmV4dHJhY3RGaWxlTmFtZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNl
cjo6ZXh0cmFjdFF1ZXJ5S2V5VmFsdWUpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OmlzVVJM
U2xhc2gpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnNob3VsZFRyaW1Gcm9tVVJMKToKKyAg
ICAgICAgKFdURjo6VVJMUGFyc2VyOjp0cmltVVJMKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2Vy
Ojpjb25zZWN1dGl2ZVNsYXNoZXMpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OmlzUG9ydERp
Z2l0KToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpuZXh0QXV0aG9yaXR5VGVybWluYXRvcik6
CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VVc2VySW5mbyk6CisgICAgICAgIChXVEY6
OlVSTFBhcnNlcjo6cGFyc2VTZXJ2ZXJJbmZvKToKKyAgICAgICAgKiB3dGYvdXJsL3d0ZnVybC5n
eXA6CisKIDIwMTAtMDUtMDUgIE9saXZlciBIdW50ICA8b2xpdmVyQGFwcGxlLmNvbT4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBHZW9mZnJleSBHYXJlbi4KSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0
Zi91cmwvd3RmdXJsLmd5cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3d0
ZnVybC5neXAJKHJldmlzaW9uIDU4ODQ3KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3VybC93dGZ1
cmwuZ3lwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAgICAgICBdLAogICAgICAg
J3NvdXJjZXMnOiBbCiAgICAgICAgICdzcmMvVVJMQ29tcG9uZW50LmgnLAorICAgICAgICAnc3Jj
L1VSTFBhcnNlci5oJywKICAgICAgIF0sCiAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5n
cyc6IHsKICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0
Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0
Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCShyZXZpc2lvbiA1ODg0NykKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi91cmwvc3JjL1VSTENvbXBvbmVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2ICsz
NywxMyBAQCBwdWJsaWM6CiAgICAgVVJMQ29tcG9uZW50KCkgOiBtX2JlZ2luKDApLCBtX2xlbmd0
aCgtMSkgeyB9CiAgICAgVVJMQ29tcG9uZW50KGludCBiZWdpbiwgaW50IGxlbmd0aCkgOiBtX2Jl
Z2luKGJlZ2luKSwgbV9sZW5ndGgobGVuZ3RoKSB7IH0KIAorICAgIC8vIEhlbHBlciB0aGF0IHJl
dHVybnMgYSBjb21wb25lbnQgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBiZWdpbiBhbmQgZW5kaW5n
CisgICAgLy8gcG9pbnRzLiBUaGUgZW5kaW5nIHBvaW50IGlzIG5vbi1pbmNsdXNpdmUuCisgICAg
c3RhdGljIGlubGluZSBVUkxDb21wb25lbnQgZnJvbVJhbmdlKGludCBiZWdpbiwgaW50IGVuZCkK
KyAgICB7CisgICAgICAgIHJldHVybiBVUkxDb21wb25lbnQoYmVnaW4sIGVuZCAtIGJlZ2luKTsK
KyAgICB9CisKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaXMgdmFsaWQs
IG1lYW5pbmcgdGhlIGxlbmd0aCBpcyBnaXZlbi4gRXZlbgogICAgIC8vIHZhbGlkIGNvbXBvbmVu
dHMgbWF5IGJlIGVtcHR5IHRvIHJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZXkgZXhpc3QuCiAgICAg
Ym9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGggIT0gLTE7IH0KSW5kZXg6IEph
dmFTY3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFBhcnNlci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi91cmwvc3JjL1VSTFBhcnNlci5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNj
cmlwdENvcmUvd3RmL3VybC9zcmMvVVJMUGFyc2VyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
NjAzIEBACisvKiBCYXNlZCBvbiBuc1VSTFBhcnNlcnMuY2MgZnJvbSBNb3ppbGxhCisgKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgg
TmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCisgKgorICogT3RoZXIgY29udHJp
YnV0b3JzOgorICogICBEYXJpbiBGaXNoZXIgKG9yaWdpbmFsIGF1dGhvcikKKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5
IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiBlaXRoZXIgdGhlIE1vemlsbGEgUHVibGlj
IExpY2Vuc2UgVmVyc2lvbiAxLjEsIGZvdW5kIGF0CisgKiBodHRwOi8vd3d3Lm1vemlsbGEub3Jn
L01QTC8gKHRoZSAiTVBMIikgb3IgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBW
ZXJzaW9uIDIuMCwgZm91bmQgYXQgaHR0cDovL3d3dy5mc2Yub3JnL2NvcHlsZWZ0L2dwbC5odG1s
CisgKiAodGhlICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTVBM
IG9yIHRoZSBHUEwgYXJlCisgKiBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuICBJ
ZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUg
b25seSB1bmRlciB0aGUgdGVybXMgb2Ygb25lIG9mIHRob3NlIHR3bworICogbGljZW5zZXMgKHRo
ZSBNUEwgb3IgdGhlIEdQTCkgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAq
IHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBMR1BMLCBpbmRpY2F0ZSB5b3VyIGRlY2lz
aW9uIGJ5CisgKiBkZWxldGluZ3RoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0g
d2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUg
TVBMIG9yIHRoZSBHUEwsIGFzIHRoZSBjYXNlIG1heSBiZS4KKyAqIElmIHlvdSBkbyBub3QgZGVs
ZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqIHZl
cnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGFueSBvZiB0aGUgTEdQTCwgdGhlIE1QTCBvciB0aGUg
R1BMLgorICovCisKKyNpZm5kZWYgVVJMUGFyc2VyX2gKKyNkZWZpbmUgVVJMUGFyc2VyX2gKKwor
I2luY2x1ZGUgIlVSTENvbXBvbmVudC5oIgorI2luY2x1ZGUgIlVSTFNlZ21lbnRzLmgiCisKKyNp
bmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlPHR5cGVuYW1l
IENIQVI+CitjbGFzcyBVUkxQYXJzZXIgeworcHVibGljOgorICAgIGVudW0gU3BlY2lhbFBvcnQg
eworICAgICAgICBVbnNwZWNpZmllZFBvcnQgPSAtMSwKKyAgICAgICAgSW52YWxpZFBvcnQgPSAt
MiwKKyAgICB9OworCisgICAgLy8gVGhpcyBoYW5kbGVzIGV2ZXJ5dGhpbmcgdGhhdCBtYXkgYmUg
YW4gYXV0aG9yaXR5IHRlcm1pbmF0b3IsIGluY2x1ZGluZworICAgIC8vIGJhY2tzbGFzaC4gRm9y
IHNwZWNpYWwgYmFja3NsYXNoIGhhbmRsaW5nIHNlZSBwYXJzZUFmdGVyU2NoZW1lLgorICAgIHN0
YXRpYyBib29sIGlzUG9zc2libGVBdXRob3JpdHlUZXJtaW5hdG9yKENIQVIgY2gpCisgICAgewor
ICAgICAgICByZXR1cm4gaXNVUkxTbGFzaChjaCkgfHwgY2ggPT0gJz8nIHx8IGNoID09ICcjJyB8
fCBjaCA9PSAnOyc7CisgICAgfQorCisgICAgLy8gR2l2ZW4gYW4gYWxyZWFkeS1pZGVudGlmaWVk
IGF1dGggc2VjdGlvbiwgYnJlYWtzIGl0IGludG8gaXRzIGNvbnN0aXR1ZW50CisgICAgLy8gcGFy
dHMuIFRoZSBwb3J0IG51bWJlciB3aWxsIGJlIHBhcnNlZCBhbmQgdGhlIHJlc3VsdGluZyBpbnRl
Z2VyIHdpbGwgYmUKKyAgICAvLyBmaWxsZWQgaW50byB0aGUgZ2l2ZW4gKnBvcnQgdmFyaWFibGUs
IG9yIC0xIGlmIHRoZXJlIGlzIG5vIHBvcnQgbnVtYmVyIG9yIGl0CisgICAgLy8gaXMgaW52YWxp
ZC4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZUF1dGhvcml0eShjb25zdCBDSEFSKiBzcGVjLCBjb25z
dCBVUkxDb21wb25lbnQmIGF1dGgsIFVSTENvbXBvbmVudCYgdXNlcm5hbWUsIFVSTENvbXBvbmVu
dCYgcGFzc3dvcmQsIFVSTENvbXBvbmVudCYgaG9zdCwgVVJMQ29tcG9uZW50JiBwb3J0KQorICAg
IHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQoYXV0aC5pc1ZhbGlkKCkpOyAvLyBXZSBz
aG91bGQgYWx3YXlzIGdldCBhbiBhdXRob3JpdHkuCisgICAgICAgIGlmICghYXV0aC5sZW5ndGgo
KSkgeworICAgICAgICAgICAgdXNlcm5hbWUucmVzZXQoKTsKKyAgICAgICAgICAgIHBhc3N3b3Jk
LnJlc2V0KCk7CisgICAgICAgICAgICBob3N0LnJlc2V0KCk7CisgICAgICAgICAgICBwb3J0LnJl
c2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWFy
Y2ggYmFja3dhcmRzIGZvciBALCB3aGljaCBpcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIHVz
ZXIgaW5mbyBhbmQKKyAgICAgICAgLy8gdGhlIHNlcnZlciBpbmZvLiAgUkZDIDM5ODYgZm9yYmlk
cyBAIGZyb20gb2NjdXJpbmcgaW4gYXV0aCwgYnV0IHNvbWVvbmUKKyAgICAgICAgLy8gbWlnaHQg
aW5jbHVkZSBpdCBpbiBhIHBhc3N3b3JkIHVuZXNjYXBlZC4KKyAgICAgICAgaW50IGkgPSBhdXRo
LmJlZ2luKCkgKyBhdXRoLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgd2hpbGUgKGkgPiBhdXRoLmJl
Z2luKCkgJiYgc3BlY1tpXSAhPSAnQCcpCisgICAgICAgICAgICAtLWk7CisKKyAgICAgICAgaWYg
KHNwZWNbaV0gPT0gJ0AnKSB7CisgICAgICAgICAgICAvLyBGb3VuZCB1c2VyIGluZm86IDx1c2Vy
LWluZm8+QDxzZXJ2ZXItaW5mbz4KKyAgICAgICAgICAgIHBhcnNlVXNlckluZm8oc3BlYywgVVJM
Q29tcG9uZW50KGF1dGguYmVnaW4oKSwgaSAtIGF1dGguYmVnaW4oKSksIHVzZXJuYW1lLCBwYXNz
d29yZCk7CisgICAgICAgICAgICBwYXJzZVNlcnZlckluZm8oc3BlYywgVVJMQ29tcG9uZW50Ojpm
cm9tUmFuZ2UoaSArIDEsIGF1dGguYmVnaW4oKSArIGF1dGgubGVuZ3RoKCkpLCBob3N0LCBwb3J0
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHVzZXIgaW5mbywgZXZlcnl0
aGluZyBpcyBzZXJ2ZXIgaW5mby4KKyAgICAgICAgICAgIHVzZXJuYW1lLnJlc2V0KCk7CisgICAg
ICAgICAgICBwYXNzd29yZC5yZXNldCgpOworICAgICAgICAgICAgcGFyc2VTZXJ2ZXJJbmZvKHNw
ZWMsIGF1dGgsIGhvc3QsIHBvcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGJv
b2wgZXh0cmFjdFNjaGVtZShjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMQ29t
cG9uZW50JiBzY2hlbWUpCisgICAgeworICAgICAgICAvLyBTa2lwIGxlYWRpbmcgd2hpdGVzcGFj
ZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAgICBpbnQgYmVnaW4gPSAwOworICAgICAg
ICB3aGlsZSAoYmVnaW4gPCBzcGVjTGVuZ3RoICYmIHNob3VsZFRyaW1Gcm9tVVJMKHNwZWNbYmVn
aW5dKSkKKyAgICAgICAgICAgIGJlZ2luKys7CisgICAgICAgIGlmIChiZWdpbiA9PSBzcGVjTGVu
Z3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJbnB1dCBpcyBlbXB0eSBvciBhbGwg
d2hpdGVzcGFjZS4KKworICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBjb2xvbiBjaGFyYWN0ZXIu
CisgICAgICAgIGZvciAoaW50IGkgPSBiZWdpbjsgaSA8IHNwZWNMZW5ndGg7IGkrKykgeworICAg
ICAgICAgICAgaWYgKHNwZWNbaV0gPT0gJzonKSB7CisgICAgICAgICAgICAgICAgc2NoZW1lID0g
VVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoYmVnaW4sIGkpOworICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsg
Ly8gTm8gY29sb24gZm91bmQ6IG5vIHNjaGVtZQorICAgIH0KKworICAgIC8vIEZpbGxzIGluIGFs
bCBtZW1iZXJzIG9mIHRoZSBVUkxTZWdtZW50cyBzdHJ1Y3R1cmUgZXhjZXB0IGZvciB0aGUgc2No
ZW1lLgorICAgIC8vCisgICAgLy8gfHNwZWN8IGlzIHRoZSBmdWxsIHNwZWMgYmVpbmcgcGFyc2Vk
LCBvZiBsZW5ndGggfHNwZWNMZW5ndGh8LgorICAgIC8vIHxhZnRlclNjaGVtZXwgaXMgdGhlIGNo
YXJhY3RlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHNjaGVtZSAoYWZ0ZXIgdGhlCisgICAg
Ly8gICBjb2xvbikgd2hlcmUgd2UnbGwgYmVnaW4gcGFyc2luZy4KKyAgICAvLworICAgIC8vIENv
bXBhdGFiaWxpdHkgZGF0YSBwb2ludHMuIEkgbGlzdCAiaG9zdCIsICJwYXRoIiBleHRyYWN0ZWQ6
CisgICAgLy8gSW5wdXQgICAgICAgICAgICAgICAgSUU2ICAgICAgICAgICAgIEZpcmVmb3ggICAg
ICAgICAgICAgICAgVXMKKyAgICAvLyAtLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0t
LSAgLS0tLS0tLS0tLS0tLS0gICAgICAgICAtLS0tLS0tLS0tLS0tLQorICAgIC8vIGh0dHA6Ly9m
b28uY29tLyAgICAgICJmb28uY29tIiwgIi8iICAiZm9vLmNvbSIsICIvIiAgICAgICAgICJmb28u
Y29tIiwgIi8iCisgICAgLy8gaHR0cDpmb28uY29tLyAgICAgICAgImZvby5jb20iLCAiLyIgICJm
b28uY29tIiwgIi8iICAgICAgICAgImZvby5jb20iLCAiLyIKKyAgICAvLyBodHRwOi9mb28uY29t
LyAgICAgICBmYWlsKCopICAgICAgICAgImZvby5jb20iLCAiLyIgICAgICAgICAiZm9vLmNvbSIs
ICIvIgorICAgIC8vIGh0dHA6XGZvby5jb20vICAgICAgIGZhaWwoKikgICAgICAgICAiXGZvby5j
b20iLCAiLyIoZmFpbCkgICJmb28uY29tIiwgIi8iCisgICAgLy8gaHR0cDovLy8vZm9vLmNvbS8g
ICAgImZvby5jb20iLCAiLyIgICJmb28uY29tIiwgIi8iICAgICAgICAgImZvby5jb20iLCAiLyIK
KyAgICAvLworICAgIC8vICgqKSBJbnRlcmVzdGluZ2x5LCBhbHRob3VnaCBJRSBmYWlscyB0byBs
b2FkIHRoZXNlIFVSTHMsIGl0cyBoaXN0b3J5CisgICAgLy8gY2Fub25pY2FsaXplciBoYW5kbGVz
IHRoZW0sIG1lYW5pbmcgaWYgeW91J3ZlIGJlZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAv
LyAiaHR0cDovL2Zvby5jb20vIiBsaW5rLCBpdCB3aWxsIGJlIGNvbG9yZWQuCisgICAgc3RhdGlj
IHZvaWQgcGFyc2VBZnRlclNjaGVtZShjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwg
aW50IGFmdGVyU2NoZW1lLCBVUkxTZWdtZW50cyYgcGFyc2VkKQorICAgIHsKKyAgICAgICAgaW50
IG51bWJlck9mU2xhc2hlcyA9IGNvbnNlY3V0aXZlU2xhc2hlcyhzcGVjLCBhZnRlclNjaGVtZSwg
c3BlY0xlbmd0aCk7CisgICAgICAgIGludCBhZnRlclNsYXNoZXMgPSBhZnRlclNjaGVtZSArIG51
bWJlck9mU2xhc2hlczsKKworICAgICAgICAvLyBGaXJzdCBzcGxpdCBpbnRvIHR3byBtYWluIHBh
cnRzLCB0aGUgYXV0aG9yaXR5ICh1c2VybmFtZSwgcGFzc3dvcmQsIGhvc3QsCisgICAgICAgIC8v
IGFuZCBwb3J0KSBhbmQgdGhlIGZ1bGwgcGF0aCAocGF0aCwgcXVlcnksIGFuZCByZWZlcmVuY2Up
LgorICAgICAgICBVUkxDb21wb25lbnQgYXV0aG9yaXR5OworICAgICAgICBVUkxDb21wb25lbnQg
ZnVsbFBhdGg7CisKKyAgICAgICAgLy8gRm91bmQgIi8vPHNvbWUgZGF0YT4iLCBsb29rcyBsaWtl
IGFuIGF1dGhvcml0eSBzZWN0aW9uLiBUcmVhdCBldmVyeXRoaW5nCisgICAgICAgIC8vIGZyb20g
dGhlcmUgdG8gdGhlIG5leHQgc2xhc2ggKG9yIGVuZCBvZiBzcGVjKSB0byBiZSB0aGUgYXV0aG9y
aXR5LiBOb3RlCisgICAgICAgIC8vIHRoYXQgd2UgaWdub3JlIHRoZSBudW1iZXIgb2Ygc2xhc2hl
cyBhbmQgdHJlYXQgaXQgYXMgdGhlIGF1dGhvcml0eS4KKyAgICAgICAgaW50IGF1dGhFbmQgPSBu
ZXh0QXV0aG9yaXR5VGVybWluYXRvcihzcGVjLCBhZnRlclNsYXNoZXMsIHNwZWNMZW5ndGgpOwor
ICAgICAgICBhdXRob3JpdHkgPSBVUkxDb21wb25lbnQoYWZ0ZXJTbGFzaGVzLCBhdXRoRW5kIC0g
YWZ0ZXJTbGFzaGVzKTsKKworICAgICAgICBpZiAoYXV0aEVuZCA9PSBzcGVjTGVuZ3RoKSAvLyBO
byBiZWdpbm5pbmcgb2YgcGF0aCBmb3VuZC4KKyAgICAgICAgICAgIGZ1bGxQYXRoID0gVVJMQ29t
cG9uZW50KCk7CisgICAgICAgIGVsc2UgLy8gRXZlcnl0aGluZyBzdGFydGluZyBmcm9tIHRoZSBz
bGFzaCB0byB0aGUgZW5kIGlzIHRoZSBwYXRoLgorICAgICAgICAgICAgZnVsbFBhdGggPSBVUkxD
b21wb25lbnQoYXV0aEVuZCwgc3BlY0xlbmd0aCAtIGF1dGhFbmQpOworCisgICAgICAgIC8vIE5v
dyBwYXJzZSB0aG9zZSB0d28gc3ViLXBhcnRzLgorICAgICAgICBwYXJzZUF1dGhvcml0eShzcGVj
LCBhdXRob3JpdHksIHBhcnNlZC51c2VybmFtZSwgcGFyc2VkLnBhc3N3b3JkLCBwYXJzZWQuaG9z
dCwgcGFyc2VkLnBvcnQpOworICAgICAgICBwYXJzZVBhdGgoc3BlYywgZnVsbFBhdGgsIHBhcnNl
ZC5wYXRoLCBwYXJzZWQucXVlcnksIHBhcnNlZC5mcmFnbWVudCk7CisgICAgfQorCisgICAgLy8g
VGhlIG1haW4gcGFyc2luZyBmdW5jdGlvbiBmb3Igc3RhbmRhcmQgVVJMcy4gU3RhbmRhcmQgVVJM
cyBoYXZlIGEgc2NoZW1lLAorICAgIC8vIGhvc3QsIHBhdGgsIGV0Yy4KKyAgICBzdGF0aWMgdm9p
ZCBwYXJzZVN0YW5kYXJkVVJMKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxT
ZWdtZW50cyYgcGFyc2VkKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQoc3Bl
Y0xlbmd0aCA+PSAwKTsKKworICAgICAgICAvLyBTdHJpcCBsZWFkaW5nICYgdHJhaWxpbmcgc3Bh
Y2VzIGFuZCBjb250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIGludCBiZWdpbiA9IDA7CisgICAg
ICAgIHRyaW1VUkwoc3BlYywgYmVnaW4sIHNwZWNMZW5ndGgpOworCisgICAgICAgIGludCBhZnRl
clNjaGVtZTsKKyAgICAgICAgaWYgKGV4dHJhY3RTY2hlbWUoc3BlYywgc3BlY0xlbmd0aCwgcGFy
c2VkLnNjaGVtZSkpCisgICAgICAgICAgICBhZnRlclNjaGVtZSA9IHBhcnNlZC5zY2hlbWUuZW5k
KCkgKyAxOyAvLyBTa2lwIHBhc3QgdGhlIGNvbG9uLgorICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgIC8vIFNheSB0aGVyZSdzIG5vIHNjaGVtZSB3aGVuIHRoZXJlIGlzIGEgY29sb24uIFdlIGNv
dWxkIGFsc28gc2F5IHRoYXQKKyAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgdGhlIHNjaGVt
ZS4gQm90aCB3b3VsZCBwcm9kdWNlIGFuIGludmFsaWQgVVJMLCBidXQgdGhpcyB3YXkKKyAgICAg
ICAgICAgIC8vIHNlZW1zIGxlc3Mgd3JvbmcgaW4gbW9yZSBjYXNlcy4KKyAgICAgICAgICAgIHBh
cnNlZC5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAgICAgIGFmdGVyU2NoZW1lID0gYmVnaW47Cisg
ICAgICAgIH0KKyAgICAgICAgcGFyc2VBZnRlclNjaGVtZShzcGVjLCBzcGVjTGVuZ3RoLCBhZnRl
clNjaGVtZSwgcGFyc2VkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwYXJzZVBhdGgoY29u
c3QgQ0hBUiogc3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBwYXRoLCBVUkxDb21wb25lbnQmIGZp
bGVwYXRoLCBVUkxDb21wb25lbnQmIHF1ZXJ5LCBVUkxDb21wb25lbnQmIGZyYWdtZW50KQorICAg
IHsKKyAgICAgICAgLy8gcGF0aCA9IFsvXTxzZWdtZW50MT4vPHNlZ21lbnQyPi88Li4uPi88c2Vn
bWVudE4+OzxwYXJhbT4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+CisKKyAgICAgICAgLy8gU3BlY2lhbCBj
YXNlIHdoZW4gdGhlcmUgaXMgbm8gcGF0aC4KKyAgICAgICAgaWYgKCFwYXRoLmlzVmFsaWQoKSkg
eworICAgICAgICAgICAgZmlsZXBhdGgucmVzZXQoKTsKKyAgICAgICAgICAgIHF1ZXJ5LnJlc2V0
KCk7CisgICAgICAgICAgICBmcmFnbWVudC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FOiBhZGQgQVNTRVJUKHBhdGgubGVuZ3RoKCkgPiAw
KTsgLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgMCBsZW5ndGggcGF0aHMuCisKKyAgICAgICAgLy8g
U2VhcmNoIGZvciBmaXJzdCBvY2N1cnJlbmNlIG9mIGVpdGhlciA/IG9yICMuCisgICAgICAgIGlu
dCBwYXRoRW5kID0gcGF0aC5iZWdpbigpICsgcGF0aC5sZW5ndGgoKTsKKworICAgICAgICBpbnQg
cXVlcnlTZXBhcmF0b3IgPSAtMTsgLy8gSW5kZXggb2YgdGhlICc/JworICAgICAgICBpbnQgcmVm
U2VwYXJhdG9yID0gLTE7IC8vIEluZGV4IG9mIHRoZSAnIycKKyAgICAgICAgZm9yIChpbnQgaSA9
IHBhdGguYmVnaW4oKTsgaSA8IHBhdGhFbmQ7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChz
cGVjW2ldKSB7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAvLyBPbmx5
IG1hdGNoIHRoZSBxdWVyeSBzdHJpbmcgaWYgaXQgcHJlY2VkZXMgdGhlIHJlZmVyZW5jZSBmcmFn
bWVudAorICAgICAgICAgICAgICAgIC8vIGFuZCB3aGVuIHdlIGhhdmVuJ3QgZm91bmQgb25lIGFs
cmVhZHkuCisgICAgICAgICAgICAgICAgaWYgKHJlZlNlcGFyYXRvciA8IDAgJiYgcXVlcnlTZXBh
cmF0b3IgPCAwKQorICAgICAgICAgICAgICAgICAgICBxdWVyeVNlcGFyYXRvciA9IGk7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAg
ICAvLyBSZWNvcmQgdGhlIGZpcnN0ICMgc2lnbiBvbmx5LgorICAgICAgICAgICAgICAgIGlmIChy
ZWZTZXBhcmF0b3IgPCAwKQorICAgICAgICAgICAgICAgICAgICByZWZTZXBhcmF0b3IgPSBpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1hcmtl
cnMgcG9pbnRpbmcgdG8gdGhlIGNoYXJhY3RlciBhZnRlciBlYWNoIG9mIHRoZXNlIGNvcnJlc3Bv
bmRpbmcKKyAgICAgICAgLy8gY29tcG9uZW50cy4gVGhlIGNvZGUgYmVsb3cgd29yZHMgZnJvbSB0
aGUgZW5kIGJhY2sgdG8gdGhlIGJlZ2lubmluZywKKyAgICAgICAgLy8gYW5kIHdpbGwgdXBkYXRl
IHRoZXNlIGluZGljZXMgYXMgaXQgZmluZHMgY29tcG9uZW50cyB0aGF0IGV4aXN0LgorICAgICAg
ICBpbnQgZmlsZUVuZCwgcXVlcnlFbmQ7CisKKyAgICAgICAgLy8gRnJhZ21lbnQ6IGZyb20gdGhl
ICMgdG8gdGhlIGVuZCBvZiB0aGUgcGF0aC4KKyAgICAgICAgaWYgKHJlZlNlcGFyYXRvciA+PSAw
KSB7CisgICAgICAgICAgICBmaWxlRW5kID0gcmVmU2VwYXJhdG9yOworICAgICAgICAgICAgcXVl
cnlFbmQgPSByZWZTZXBhcmF0b3I7CisgICAgICAgICAgICBmcmFnbWVudCA9IFVSTENvbXBvbmVu
dDo6ZnJvbVJhbmdlKHJlZlNlcGFyYXRvciArIDEsIHBhdGhFbmQpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgZmlsZUVuZCA9IHBhdGhFbmQ7CisgICAgICAgICAgICBxdWVyeUVuZCA9
IHBhdGhFbmQ7CisgICAgICAgICAgICBmcmFnbWVudC5yZXNldCgpOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gUXVlcnkgZnJhZ21lbnQ6IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgPyB0byB0aGUgbmV4
dCBib3VuZGFyeSAoZWl0aGVyIHRoZSBlbmQKKyAgICAgICAgLy8gb2YgdGhlIHBhdGggb3IgdGhl
IGZyYWdtZW50IGZyYWdtZW50KS4KKyAgICAgICAgaWYgKHF1ZXJ5U2VwYXJhdG9yID49IDApIHsK
KyAgICAgICAgICAgIGZpbGVFbmQgPSBxdWVyeVNlcGFyYXRvcjsKKyAgICAgICAgICAgIHF1ZXJ5
ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocXVlcnlTZXBhcmF0b3IgKyAxLCBxdWVyeUVuZCk7
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcXVlcnkucmVzZXQoKTsKKworICAgICAgICAv
LyBGaWxlIHBhdGg6IHRyZWF0IGFuIGVtcHR5IGZpbGUgcGF0aCBhcyBubyBmaWxlIHBhdGguCisg
ICAgICAgIGlmIChmaWxlRW5kICE9IHBhdGguYmVnaW4oKSkKKyAgICAgICAgICAgIGZpbGVwYXRo
ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocGF0aC5iZWdpbigpLCBmaWxlRW5kKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgZmlsZXBhdGgucmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBJ
bml0aWFsaXplcyBhIHBhdGggVVJMIHdoaWNoIGlzIG1lcmVseSBhIHNjaGVtZSBmb2xsb3dlZCBi
eSBhIHBhdGguIEV4YW1wbGVzCisgICAgLy8gaW5jbHVkZSAiYWJvdXQ6Zm9vIiBhbmQgImphdmFz
Y3JpcHQ6YWxlcnQoJ2JhcicpOyIKKyAgICBzdGF0aWMgdm9pZCBwYXJzZVBhdGhVUkwoY29uc3Qg
Q0hBUiogc3BlYywgaW50IHNwZWNMZW5ndGgsIFVSTFNlZ21lbnRzJiBwYXJzZWQpCisgICAgewor
ICAgICAgICAvLyBHZXQgdGhlIG5vbi1wYXRoIGFuZCBub24tc2NoZW1lIHBhcnRzIG9mIHRoZSBV
Ukwgb3V0IG9mIHRoZSB3YXksIHdlIG5ldmVyCisgICAgICAgIC8vIHVzZSB0aGVtLgorICAgICAg
ICBwYXJzZWQudXNlcm5hbWUucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLnBhc3N3b3JkLnJlc2V0
KCk7CisgICAgICAgIHBhcnNlZC5ob3N0LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC5wb3J0LnJl
c2V0KCk7CisgICAgICAgIHBhcnNlZC5xdWVyeS5yZXNldCgpOworICAgICAgICBwYXJzZWQuZnJh
Z21lbnQucmVzZXQoKTsKKworICAgICAgICAvLyBTdHJpcCBsZWFkaW5nICYgdHJhaWxpbmcgc3Bh
Y2VzIGFuZCBjb250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIGludCBiZWdpbiA9IDA7CisgICAg
ICAgIHRyaW1VUkwoc3BlYywgYmVnaW4sIHNwZWNMZW5ndGgpOworCisgICAgICAgIC8vIEhhbmRs
ZSBlbXB0eSBzcGVjcyBvciBvbmVzIHRoYXQgY29udGFpbiBvbmx5IHdoaXRlc3BhY2Ugb3IgY29u
dHJvbCBjaGFycy4KKyAgICAgICAgaWYgKGJlZ2luID09IHNwZWNMZW5ndGgpIHsKKyAgICAgICAg
ICAgIHBhcnNlZC5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAgICAgIHBhcnNlZC5wYXRoLnJlc2V0
KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRyYWN0
IHRoZSBzY2hlbWUsIHdpdGggdGhlIHBhdGggYmVpbmcgZXZlcnl0aGluZyBmb2xsb3dpbmcuIFdl
IGFsc28KKyAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIHNjaGVt
ZS4KKyAgICAgICAgaWYgKGV4dHJhY3RTY2hlbWUoJnNwZWNbYmVnaW5dLCBzcGVjTGVuZ3RoIC0g
YmVnaW4sIHBhcnNlZC5zY2hlbWUpKSB7CisgICAgICAgICAgICAvLyBPZmZzZXQgdGhlIHJlc3Vs
dHMgc2luY2Ugd2UgZ2F2ZSBleHRyYWN0U2NoZW1lIGEgc3Vic3RyaW5nLgorICAgICAgICAgICAg
cGFyc2VkLnNjaGVtZS5zZXRCZWdpbihwYXJzZWQuc2NoZW1lLmJlZ2luKCkgKyBiZWdpbik7CisK
KyAgICAgICAgICAgIC8vIEZvciBjb21wYXRhYmlsaXR5IHdpdGggdGhlIHN0YW5kYXJkIFVSTCBw
YXJzZXIsIHdlIHRyZWF0IG5vIHBhdGggYXMKKyAgICAgICAgICAgIC8vIC0xLCByYXRoZXIgdGhh
biBoYXZpbmcgYSBsZW5ndGggb2YgMCAod2Ugbm9ybWFsbHkgd291bGRuJ3QgY2FyZSBzbworICAg
ICAgICAgICAgLy8gbXVjaCBmb3IgdGhlc2Ugbm9uLXN0YW5kYXJkIFVSTHMpLgorICAgICAgICAg
ICAgaWYgKHBhcnNlZC5zY2hlbWUuZW5kKCkgPT0gc3BlY0xlbmd0aCAtIDEpCisgICAgICAgICAg
ICAgICAgcGFyc2VkLnBhdGgucmVzZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBwYXJzZWQucGF0aCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHBhcnNlZC5zY2hlbWUu
ZW5kKCkgKyAxLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8v
IE5vIHNjaGVtZSBmb3VuZCwganVzdCBwYXRoLgorICAgICAgICAgICAgcGFyc2VkLnNjaGVtZS5y
ZXNldCgpOworICAgICAgICAgICAgcGFyc2VkLnBhdGggPSBVUkxDb21wb25lbnQ6OmZyb21SYW5n
ZShiZWdpbiwgc3BlY0xlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9p
ZCBwYXJzZU1haWx0b1VSTChjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMU2Vn
bWVudHMmIHBhcnNlZCkKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBhZGQgQVNTRVJUKHNwZWNM
ZW5ndGggPj0gMCk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBub24tcGF0aCBhbmQgbm9uLXNjaGVt
ZSBwYXJ0cyBvZiB0aGUgVVJMIG91dCBvZiB0aGUgd2F5LCB3ZSBuZXZlcgorICAgICAgICAvLyB1
c2UgdGhlbS4KKyAgICAgICAgcGFyc2VkLnVzZXJuYW1lLnJlc2V0KCk7CisgICAgICAgIHBhcnNl
ZC5wYXNzd29yZC5yZXNldCgpOworICAgICAgICBwYXJzZWQuaG9zdC5yZXNldCgpOworICAgICAg
ICBwYXJzZWQucG9ydC5yZXNldCgpOworICAgICAgICBwYXJzZWQuZnJhZ21lbnQucmVzZXQoKTsK
KyAgICAgICAgcGFyc2VkLnF1ZXJ5LnJlc2V0KCk7IC8vIE1heSB1c2UgdGhpczsgcmVzZXQgZm9y
IGNvbnZlbmllbmNlLgorCisgICAgICAgIC8vIFN0cmlwIGxlYWRpbmcgJiB0cmFpbGluZyBzcGFj
ZXMgYW5kIGNvbnRyb2wgY2hhcmFjdGVycy4KKyAgICAgICAgaW50IGJlZ2luID0gMDsKKyAgICAg
ICAgdHJpbVVSTChzcGVjLCBiZWdpbiwgc3BlY0xlbmd0aCk7CisKKyAgICAgICAgLy8gSGFuZGxl
IGVtcHR5IHNwZWNzIG9yIG9uZXMgdGhhdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZSBvciBjb250
cm9sIGNoYXJzLgorICAgICAgICBpZiAoYmVnaW4gPT0gc3BlY0xlbmd0aCkgeworICAgICAgICAg
ICAgcGFyc2VkLnNjaGVtZS5yZXNldCgpOworICAgICAgICAgICAgcGFyc2VkLnBhdGgucmVzZXQo
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwYXRoQmVn
aW4gPSAtMTsKKyAgICAgICAgaW50IHBhdGhFbmQgPSAtMTsKKworICAgICAgICAvLyBFeHRyYWN0
IHRoZSBzY2hlbWUsIHdpdGggdGhlIHBhdGggYmVpbmcgZXZlcnl0aGluZyBmb2xsb3dpbmcuIFdl
IGFsc28KKyAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIHNjaGVt
ZS4KKyAgICAgICAgaWYgKGV4dHJhY3RTY2hlbWUoJnNwZWNbYmVnaW5dLCBzcGVjTGVuZ3RoIC0g
YmVnaW4sIHBhcnNlZC5zY2hlbWUpKSB7CisgICAgICAgICAgICAvLyBPZmZzZXQgdGhlIHJlc3Vs
dHMgc2luY2Ugd2UgZ2F2ZSBleHRyYWN0U2NoZW1lIGEgc3Vic3RyaW5nLgorICAgICAgICAgICAg
cGFyc2VkLnNjaGVtZS5zZXRCZWdpbihwYXJzZWQuc2NoZW1lLmJlZ2luKCkgKyBiZWdpbik7CisK
KyAgICAgICAgICAgIGlmIChwYXJzZWQuc2NoZW1lLmVuZCgpICE9IHNwZWNMZW5ndGggLSAxKSB7
CisgICAgICAgICAgICAgICAgcGF0aEJlZ2luID0gcGFyc2VkLnNjaGVtZS5lbmQoKSArIDE7Cisg
ICAgICAgICAgICAgICAgcGF0aEVuZCA9IHNwZWNMZW5ndGg7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBObyBzY2hlbWUgZm91bmQsIGp1c3QgcGF0aC4K
KyAgICAgICAgICAgIHBhcnNlZC5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAgICAgIHBhdGhCZWdp
biA9IGJlZ2luOworICAgICAgICAgICAgcGF0aEVuZCA9IHNwZWNMZW5ndGg7CisgICAgICAgIH0K
KworICAgICAgICAvLyBTcGxpdCBbcGF0aEJlZ2luLCBwYXRoRW5kKSBpbnRvIGEgcGF0aCArIHF1
ZXJ5LgorICAgICAgICBmb3IgKGludCBpID0gcGF0aEJlZ2luOyBpIDwgcGF0aEVuZDsgKytpKSB7
CisgICAgICAgICAgICBpZiAoc3BlY1tpXSA9PSAnPycpIHsKKyAgICAgICAgICAgICAgICBwYXJz
ZWQucXVlcnkgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShpICsgMSwgcGF0aEVuZCk7CisgICAg
ICAgICAgICAgICAgcGF0aEVuZCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3IgY29tcGF0YWJpbGl0eSB3aXRoIHRo
ZSBzdGFuZGFyZCBVUkwgcGFyc2VyLCB0cmVhdCBubyBwYXRoIGFzCisgICAgICAgIC8vIC0xLCBy
YXRoZXIgdGhhbiBoYXZpbmcgYSBsZW5ndGggb2YgMAorICAgICAgICBpZiAocGF0aEJlZ2luID09
IHBhdGhFbmQpCisgICAgICAgICAgICBwYXJzZWQucGF0aC5yZXNldCgpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBwYXJzZWQucGF0aCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHBhdGhC
ZWdpbiwgcGF0aEVuZCk7CisgICAgfQorCisgICAgLy8gQ29udmVydHMgYSBwb3J0IG51bWJlciBp
biBhIHN0cmluZyB0byBhbiBpbnRlZ2VyLiBXZSdkIGxpa2UgdG8ganVzdCBjYWxsCisgICAgLy8g
c3NjYW5mIGJ1dCBvdXIgaW5wdXQgaXMgbm90IDAtdGVybWluYXRlZCwgd2hpY2ggc3NjYW5mIHJl
cXVpcmVzLiBJbnN0ZWFkLAorICAgIC8vIHdlIGNvcHkgdGhlIGRpZ2l0cyB0byBhIHNtYWxsIHN0
YWNrIGJ1ZmZlciAoc2luY2Ugd2Uga25vdyB0aGUgbWF4aW11bSBudW1iZXIKKyAgICAvLyBvZiBk
aWdpdHMgaW4gYSB2YWxpZCBwb3J0IG51bWJlcikgdGhhdCB3ZSBjYW4gMCB0ZXJtaW5hdGUuCisg
ICAgc3RhdGljIGludCBwYXJzZVBvcnQoY29uc3QgQ0hBUiogc3BlYywgY29uc3QgVVJMQ29tcG9u
ZW50JiBjb21wb25lbnQpCisgICAgeworICAgICAgICAvLyBFYXN5IHN1Y2Nlc3MgY2FzZSB3aGVu
IHRoZXJlIGlzIG5vIHBvcnQuCisgICAgICAgIGNvbnN0IGludCBtYXhEaWdpdHMgPSA1OworICAg
ICAgICBpZiAoIWNvbXBvbmVudC5pc05vbmVtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gVW5z
cGVjaWZpZWRQb3J0OworCisgICAgICAgIC8vIFNraXAgb3ZlciBhbnkgbGVhZGluZyAwcy4KKyAg
ICAgICAgVVJMQ29tcG9uZW50IG5vblplcm9EaWdpdHMoY29tcG9uZW50LmVuZCgpLCAwKTsKKyAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnQubGVuZ3RoKCk7ICsraSkgeworICAg
ICAgICAgICAgaWYgKHNwZWNbY29tcG9uZW50LmJlZ2luKCkgKyBpXSAhPSAnMCcpIHsKKyAgICAg
ICAgICAgICAgICBub25aZXJvRGlnaXRzID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoY29tcG9u
ZW50LmJlZ2luKCkgKyBpLCBjb21wb25lbnQuZW5kKCkpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbm9uWmVyb0RpZ2l0cy5s
ZW5ndGgoKSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBBbGwgZGlnaXRzIHdlcmUgMC4KKwor
ICAgICAgICAvLyBWZXJpZnkgd2UgZG9uJ3QgaGF2ZSB0b28gbWFueSBkaWdpdHMgKHdlJ2xsIGJl
IGNvcHlpbmcgdG8gb3VyIGJ1ZmZlciBzbworICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvdWJsZS1j
aGVjaykuCisgICAgICAgIGlmIChub25aZXJvRGlnaXRzLmxlbmd0aCgpID4gbWF4RGlnaXRzKQor
ICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQb3J0OworCisgICAgICAgIC8vIENvcHkgdmFsaWQg
ZGlnaXRzIHRvIHRoZSBidWZmZXIuCisgICAgICAgIGNoYXIgZGlnaXRzW21heERpZ2l0cyArIDFd
OyAvLyArMSBmb3IgbnVsbCB0ZXJtaW5hdG9yCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bm9uWmVyb0RpZ2l0cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBDSEFSIGNoID0gc3Bl
Y1tub25aZXJvRGlnaXRzLmJlZ2luKCkgKyBpXTsKKyAgICAgICAgICAgIGlmICghaXNQb3J0RGln
aXQoY2gpKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBwb3J0IGRpZ2l0LCBmYWlsLgor
ICAgICAgICAgICAgICAgIHJldHVybiBJbnZhbGlkUG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGRpZ2l0c1tpXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIE51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcgYW5kIGNvbnZlcnQgdG8gaW50ZWdl
ci4gU2luY2Ugd2UgZ3VhcmFudGVlCisgICAgICAgIC8vIG9ubHkgZGlnaXRzLCBhdG9pJ3MgbGFj
ayBvZiBlcnJvciBoYW5kbGluZyBpcyBPSy4KKyAgICAgICAgZGlnaXRzW25vblplcm9EaWdpdHMu
bGVuZ3RoKCldID0gMDsKKyAgICAgICAgaW50IHBvcnQgPSBhdG9pKGRpZ2l0cyk7CisgICAgICAg
IGlmIChwb3J0ID4gNjU1MzUpCisgICAgICAgICAgICByZXR1cm4gSW52YWxpZFBvcnQ7IC8vIE91
dCBvZiByYW5nZS4KKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgc3RhdGljIHZv
aWQgZXh0cmFjdEZpbGVOYW1lKGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0IFVSTENvbXBvbmVudCYg
cGF0aCwgVVJMQ29tcG9uZW50JiBmaWxlTmFtZSkKKyAgICB7CisgICAgICAgIC8vIEhhbmRsZSBl
bXB0eSBwYXRoczogdGhleSBoYXZlIG5vIGZpbGUgbmFtZXMuCisgICAgICAgIGlmICghcGF0aC5p
c05vbmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbGVOYW1lLnJlc2V0KCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWFyY2ggYmFja3dhcmRzIGZvciBh
IHBhcmFtZXRlciwgd2hpY2ggaXMgYSBub3JtYWxseSB1bnVzZWQgZmllbGQgaW4gYQorICAgICAg
ICAvLyBVUkwgZGVsaW1pdGVkIGJ5IGEgc2VtaWNvbG9uLiBXZSBwYXJzZSB0aGUgcGFyYW1ldGVy
IGFzIHBhcnQgb2YgdGhlCisgICAgICAgIC8vIHBhdGgsIGJ1dCBoZXJlLCB3ZSBkb24ndCB3YW50
IHRvIGNvdW50IGl0LiBUaGUgbGFzdCBzZW1pY29sb24gaXMgdGhlCisgICAgICAgIC8vIHBhcmFt
ZXRlci4gVGhlIHBhdGggc2hvdWxkIHN0YXJ0IHdpdGggYSBzbGFzaCwgc28gd2UgZG9uJ3QgbmVl
ZCB0byBjaGVjaworICAgICAgICAvLyB0aGUgZmlyc3Qgb25lLgorICAgICAgICBpbnQgZmlsZUVu
ZCA9IHBhdGguZW5kKCk7CisgICAgICAgIGZvciAoaW50IGkgPSBwYXRoLmVuZCgpIC0gMTsgaSA+
IHBhdGguYmVnaW4oKTsgaS0tKSB7CisgICAgICAgICAgICBpZiAoc3BlY1tpXSA9PSAnOycpIHsK
KyAgICAgICAgICAgICAgICBmaWxlRW5kID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyBzZWFyY2ggYmFja3dhcmRz
IGZyb20gdGhlIGZpbGVuYW1lIGVuZCB0byB0aGUgcHJldmlvdXMgc2xhc2gKKyAgICAgICAgLy8g
dG8gZmluZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlbmFtZS4KKyAgICAgICAgZm9yIChpbnQg
aSA9IGZpbGVFbmQgLSAxOyBpID49IHBhdGguYmVnaW4oKTsgaS0tKSB7CisgICAgICAgICAgICBp
ZiAoaXNVUkxTbGFzaChzcGVjW2ldKSkgeworICAgICAgICAgICAgICAgIC8vIEZpbGUgbmFtZSBp
cyBldmVyeXRoaW5nIGZvbGxvd2luZyB0aGlzIGNoYXJhY3RlciB0byB0aGUgZW5kCisgICAgICAg
ICAgICAgICAgZmlsZU5hbWUgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShpICsgMSwgZmlsZUVu
ZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgLy8gTm8gc2xhc2ggZm91bmQsIHRoaXMgbWVhbnMgdGhlIGlucHV0IHdhcyBkZWdl
bmVyYXRlIChnZW5lcmFsbHkgcGF0aHMKKyAgICAgICAgLy8gd2lsbCBzdGFydCB3aXRoIGEgc2xh
c2gpLiBMZXQncyBjYWxsIGV2ZXJ5dGhpbmcgdGhlIGZpbGUgbmFtZS4KKyAgICAgICAgZmlsZU5h
bWUgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShwYXRoLmJlZ2luKCksIGZpbGVFbmQpOworICAg
IH0KKworICAgIHN0YXRpYyBib29sIGV4dHJhY3RRdWVyeUtleVZhbHVlKGNvbnN0IENIQVIqIHNw
ZWMsIFVSTENvbXBvbmVudCYgcXVlcnksIFVSTENvbXBvbmVudCYga2V5LCBVUkxDb21wb25lbnQm
IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCFxdWVyeS5pc05vbmVtcHR5KCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaW50IHN0YXJ0ID0gcXVlcnkuYmVnaW4oKTsK
KyAgICAgICAgaW50IGN1cnJlbnQgPSBzdGFydDsKKyAgICAgICAgaW50IGVuZCA9IHF1ZXJ5LmVu
ZCgpOworCisgICAgICAgIC8vIFdlIGFzc3VtZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBp
cyB0aGUgYmVnaW5uaW5nIG9mIHRoZSAia2V5IiBhbmQgd2UKKyAgICAgICAgLy8gc2tpcCB0byB0
aGUgZW5kIG9mIGl0LgorICAgICAgICBrZXkuc2V0QmVnaW4oY3VycmVudCk7CisgICAgICAgIHdo
aWxlIChjdXJyZW50IDwgZW5kICYmIHNwZWNbY3VycmVudF0gIT0gJyYnICYmIHNwZWNbY3VycmVu
dF0gIT0gJz0nKQorICAgICAgICAgICAgKytjdXJyZW50OworICAgICAgICBrZXkuc2V0TGVuZ3Ro
KGN1cnJlbnQgLSBrZXkuYmVnaW4oKSk7CisKKyAgICAgICAgLy8gU2tpcCB0aGUgc2VwYXJhdG9y
IGFmdGVyIHRoZSBrZXkgKGlmIGFueSkuCisgICAgICAgIGlmIChjdXJyZW50IDwgZW5kICYmIHNw
ZWNbY3VycmVudF0gPT0gJz0nKQorICAgICAgICAgICAgKytjdXJyZW50OworCisgICAgICAgIC8v
IEZpbmQgdGhlIHZhbHVlIHBhcnQuCisgICAgICAgIHZhbHVlLnNldEJlZ2luKGN1cnJlbnQpOwor
ICAgICAgICB3aGlsZSAoY3VycmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdICE9ICcmJykKKyAg
ICAgICAgICAgICsrY3VycmVudDsKKyAgICAgICAgdmFsdWUuc2V0TGVuZ3RoKGN1cnJlbnQgLSB2
YWx1ZS5iZWdpbigpKTsKKworICAgICAgICAvLyBGaW5hbGx5IHNraXAgdGhlIG5leHQgc2VwYXJh
dG9yIGlmIGFueQorICAgICAgICBpZiAoY3VycmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdID09
ICcmJykKKyAgICAgICAgICAgICsrY3VycmVudDsKKworICAgICAgICAvLyBTYXZlIHRoZSBuZXcg
cXVlcnkKKyAgICAgICAgcXVlcnkgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShjdXJyZW50LCBl
bmQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKy8vIEZJWE1FOiBUaGlzIHNob3Vs
ZCBiZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZS4KK3B1YmxpYzoKKyAgICAvLyBXZSB0cmVhdCBzbGFz
aGVzIGFuZCBiYWNrc2xhc2hlcyB0aGUgc2FtZSBmb3IgSUUgY29tcGF0YWJpbGl0eS4KKyAgICBz
dGF0aWMgaW5saW5lIGJvb2wgaXNVUkxTbGFzaChDSEFSIGNoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGNoID09ICcvJyB8fCBjaCA9PSAnXFwnOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1
ZSBpZiB3ZSBzaG91bGQgdHJpbSB0aGlzIGNoYXJhY3RlciBmcm9tIHRoZSBVUkwgYmVjYXVzZSBp
dCBpcyBhCisgICAgLy8gc3BhY2Ugb3IgYSBjb250cm9sIGNoYXJhY3Rlci4KKyAgICBzdGF0aWMg
aW5saW5lIGJvb2wgc2hvdWxkVHJpbUZyb21VUkwoQ0hBUiBjaCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBjaCA8PSAnICc7CisgICAgfQorCisgICAgLy8gR2l2ZW4gYW4gYWxyZWFkeS1pbml0aWFs
aXplZCBiZWdpbiBpbmRleCBhbmQgbGVuZ3RoLCB0aGlzIHNocmlua3MgdGhlIHJhbmdlCisgICAg
Ly8gdG8gZWxpbWluYXRlICJzaG91bGQtYmUtdHJpbW1lZCIgY2hhcmFjdGVycy4gTm90ZSB0aGF0
IHRoZSBsZW5ndGggZG9lcyAqbm90KgorICAgIC8vIGluZGljYXRlIHRoZSBsZW5ndGggb2YgdW50
cmltbWVkIGRhdGEgZnJvbSB8YmVnaW58LCBidXQgcmF0aGVyIHRoZSBwb3NpdGlvbgorICAgIC8v
IGluIHRoZSBpbnB1dCBzdHJpbmcgKHNvIHRoZSBzdHJpbmcgc3RhcnRzIGF0IGNoYXJhY3RlciB8
YmVnaW58IGluIHRoZSBzcGVjLAorICAgIC8vIGFuZCBnb2VzIHVudGlsIHxsZW5ndGh8KS4KKyAg
ICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpbVVSTChjb25zdCBDSEFSKiBzcGVjLCBpbnQmIGJlZ2lu
LCBpbnQmIGxlbmd0aCkKKyAgICB7CisgICAgICAgIC8vIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFj
ZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAgICB3aGlsZSAoYmVnaW4gPCBsZW5ndGgg
JiYgc2hvdWxkVHJpbUZyb21VUkwoc3BlY1tiZWdpbl0pKQorICAgICAgICAgICAgKytiZWdpbjsK
KworICAgICAgICAvLyBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBjb250cm9sIGNoYXJh
Y3RlcnMuIFdlIG5lZWQgdGhlID5pIHRlc3QgZm9yCisgICAgICAgIC8vIHdoZW4gdGhlIGlucHV0
IHN0cmluZyBpcyBhbGwgYmxhbmtzOyB3ZSBkb24ndCB3YW50IHRvIGJhY2sgcGFzdCB0aGUgaW5w
dXQuCisgICAgICAgIHdoaWxlIChsZW5ndGggPiBiZWdpbiAmJiBzaG91bGRUcmltRnJvbVVSTChz
cGVjW2xlbmd0aCAtIDFdKSkKKyAgICAgICAgICAgIC0tbGVuZ3RoOworICAgIH0KKworICAgIC8v
IENvdW50cyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHNsYXNoZXMgc3RhcnRpbmcgYXQgdGhl
IGdpdmVuIG9mZnNldAorICAgIC8vIGluIHRoZSBnaXZlbiBzdHJpbmcgb2YgdGhlIGdpdmVuIGxl
bmd0aC4KKyAgICBzdGF0aWMgaW5saW5lIGludCBjb25zZWN1dGl2ZVNsYXNoZXMoY29uc3QgQ0hB
UiAqc3RyaW5nLCBpbnQgYmVnaW5PZmZzZXQsIGludCBzdHJpbmdMZW5ndGgpCisgICAgeworICAg
ICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoYmVnaW5PZmZzZXQgKyBjb3VudCA8
IHN0cmluZ0xlbmd0aCAmJiBpc1VSTFNsYXNoKHN0cmluZ1tiZWdpbk9mZnNldCArIGNvdW50XSkp
CisgICAgICAgICAgICArK2NvdW50OworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCitw
cml2YXRlOgorICAgIC8vIFVSTFBhcnNlciBjYW5ub3QgYmUgY29uc3RydWN0ZWQuCisgICAgVVJM
UGFyc2VyKCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBp
cyBhIHZhbGlkIGRpZ2l0IHRvIHVzZSBpbiBhIHBvcnQuCisgICAgc3RhdGljIGlubGluZSBib29s
IGlzUG9ydERpZ2l0KENIQVIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gY2ggPj0gJzAnICYm
IGNoIDw9ICc5JzsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIG5l
eHQgYXV0aG9yaXR5IHRlcm1pbmF0b3IgaW4gdGhlIGlucHV0IHN0YXJ0aW5nCisgICAgLy8gZnJv
bSBzdGFydE9mZnNldC4gSWYgbm8gdGVybWluYXRvciBpcyBmb3VuZCwgdGhlIHJldHVybiB2YWx1
ZSB3aWxsIGJlIGVxdWFsCisgICAgLy8gdG8gc3BlY0xlbmd0aC4KKyAgICBzdGF0aWMgaW50IG5l
eHRBdXRob3JpdHlUZXJtaW5hdG9yKGNvbnN0IENIQVIqIHNwZWMsIGludCBzdGFydE9mZnNldCwg
aW50IHNwZWNMZW5ndGgpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnRPZmZzZXQ7
IGkgPCBzcGVjTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpc1Bvc3NpYmxlQXV0aG9y
aXR5VGVybWluYXRvcihzcGVjW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gc3BlY0xlbmd0aDsgLy8gTm90IGZvdW5kLgorICAgIH0KKwor
ICAgIHN0YXRpYyB2b2lkIHBhcnNlVXNlckluZm8oY29uc3QgQ0hBUiogc3BlYywgY29uc3QgVVJM
Q29tcG9uZW50JiB1c2VyLCBVUkxDb21wb25lbnQmIHVzZXJuYW1lLCBVUkxDb21wb25lbnQmIHBh
c3N3b3JkKQorICAgIHsKKyAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgY29sb24gaW4gdGhlIHVz
ZXIgc2VjdGlvbiwgd2hpY2ggc2VwYXJhdGVzIHRoZSB1c2VybmFtZSBhbmQKKyAgICAgICAgLy8g
cGFzc3dvcmQuCisgICAgICAgIGludCBjb2xvbk9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChj
b2xvbk9mZnNldCA8IHVzZXIubGVuZ3RoKCkgJiYgc3BlY1t1c2VyLmJlZ2luKCkgKyBjb2xvbk9m
ZnNldF0gIT0gJzonKQorICAgICAgICAgICAgKytjb2xvbk9mZnNldDsKKworICAgICAgICBpZiAo
Y29sb25PZmZzZXQgPCB1c2VyLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAvLyBGb3VuZCBzZXBh
cmF0b3I6IDx1c2VybmFtZT46PHBhc3N3b3JkPgorICAgICAgICAgICAgdXNlcm5hbWUgPSBVUkxD
b21wb25lbnQodXNlci5iZWdpbigpLCBjb2xvbk9mZnNldCk7CisgICAgICAgICAgICBwYXNzd29y
ZCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHVzZXIuYmVnaW4oKSArIGNvbG9uT2Zmc2V0ICsg
MSwgdXNlci5iZWdpbigpICsgdXNlci5sZW5ndGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAvLyBObyBzZXBhcmF0b3IsIHRyZWF0IGV2ZXJ5dGhpbmcgYXMgdGhlIHVzZXJuYW1l
CisgICAgICAgICAgICB1c2VybmFtZSA9IHVzZXI7CisgICAgICAgICAgICBwYXNzd29yZCA9IFVS
TENvbXBvbmVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcGFyc2VT
ZXJ2ZXJJbmZvKGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0IFVSTENvbXBvbmVudCYgc2VydmVySW5m
bywgVVJMQ29tcG9uZW50JiBob3N0LCBVUkxDb21wb25lbnQmIHBvcnQpCisgICAgeworICAgICAg
ICBpZiAoIXNlcnZlckluZm8ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIC8vIE5vIHNlcnZlciBp
bmZvLCBob3N0IG5hbWUgaXMgZW1wdHkuCisgICAgICAgICAgICBob3N0LnJlc2V0KCk7CisgICAg
ICAgICAgICBwb3J0LnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBJZiB0aGUgaG9zdCBzdGFydHMgd2l0aCBhIGxlZnQtYnJhY2tldCwgYXNzdW1l
IHRoZSBlbnRpcmUgaG9zdCBpcyBhbgorICAgICAgICAvLyBJUHY2IGxpdGVyYWwuICBPdGhlcndp
c2UsIGFzc3VtZSBub25lIG9mIHRoZSBob3N0IGlzIGFuIElQdjYgbGl0ZXJhbC4KKyAgICAgICAg
Ly8gVGhpcyBhc3N1bXB0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiB3ZSBmaW5kIGEgcmlnaHQt
YnJhY2tldC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT3VyIElQdjYgYWRkcmVzcyBjYW5vbmlj
YWxpemF0aW9uIGNvZGUgcmVxdWlyZXMgYm90aCBicmFja2V0cyB0byBleGlzdCwKKyAgICAgICAg
Ly8gYnV0IHRoZSBhYmlsaXR5IHRvIGxvY2F0ZSBhbiBpbmNvbXBsZXRlIGFkZHJlc3MgY2FuIHN0
aWxsIGJlIHVzZWZ1bC4KKyAgICAgICAgaW50IGlwdjZUZXJtaW5hdG9yID0gc3BlY1tzZXJ2ZXJJ
bmZvLmJlZ2luKCldID09ICdbJyA/IHNlcnZlckluZm8uZW5kKCkgOiAtMTsKKyAgICAgICAgaW50
IGNvbG9uID0gLTE7CisKKyAgICAgICAgLy8gRmluZCB0aGUgbGFzdCByaWdodC1icmFja2V0LCBh
bmQgdGhlIGxhc3QgY29sb24uCisgICAgICAgIGZvciAoaW50IGkgPSBzZXJ2ZXJJbmZvLmJlZ2lu
KCk7IGkgPCBzZXJ2ZXJJbmZvLmVuZCgpOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3Bl
Y1tpXSkgeworICAgICAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICAgICAgaXB2NlRlcm1p
bmF0b3IgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnOic6
CisgICAgICAgICAgICAgICAgY29sb24gPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvbiA+IGlwdjZUZXJtaW5hdG9yKSB7CisgICAg
ICAgICAgICAvLyBGb3VuZCBhIHBvcnQgbnVtYmVyOiA8aG9zdG5hbWU+Ojxwb3J0PgorICAgICAg
ICAgICAgaG9zdCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHNlcnZlckluZm8uYmVnaW4oKSwg
Y29sb24pOworICAgICAgICAgICAgaWYgKCFob3N0Lmxlbmd0aCgpKQorICAgICAgICAgICAgICAg
IGhvc3QucmVzZXQoKTsKKyAgICAgICAgICAgIHBvcnQgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5n
ZShjb2xvbiArIDEsIHNlcnZlckluZm8uZW5kKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgLy8gTm8gcG9ydDogPGhvc3RuYW1lPgorICAgICAgICAgICAgaG9zdCA9IHNlcnZlcklu
Zm87CisgICAgICAgICAgICBwb3J0LnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIFVSTFBhcnNlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55348</attachid>
            <date>2010-05-07 00:43:39 -0700</date>
            <delta_ts>2010-05-07 10:57:09 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38572-20100507004338.patch</filename>
            <type>text/plain</type>
            <size>26882</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4OTQxKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTAgQEAKKzIwMTAtMDUtMDcgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbV1RGVVJMXSBBZGQgY29yZSBVUkwgcGFyc2VyCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODU3MgorCisgICAgICAgIFRo
aXMgcGF0Y2ggYWRkcyB0aGUgY29yZSBvZiB0aGUgVVJMIHBhcnNlci4gIFRoZSBVUkwgcGFyc2Vy
IHVzZXMgYQorICAgICAgICB0ZW1wbGF0ZWQgbm90aW9uIG9mIGEgY29kZSB1bml0IHRvIHN1cHBv
cnQgZGlmZmVyZW50IHN0cmluZyB0eXBlcy4KKyAgICAgICAgTGF0ZXIgd2UnbGwgYWRkIHNvbWUg
bm9uLXRlbXBsYXRlZCBBUElzIHdpdGggY29uY3JldGUgdHlwZXMgdGhhdAorICAgICAgICBjbGll
bnRzIGNhbiB1c2UgbW9yZSBjb252ZW5pZW50bHkuCisKKyAgICAgICAgVGhlIFVSTFBhcnNlciBo
YXMgYSBjb3VwbGUgY2FsbHMgdG8gQVNTRVJUKCksIHdoaWNoIEkndmUgY29tbWVudGVkIG91dAor
ICAgICAgICBmb3Igbm93LiAgSSdtIG5vdCAxMDAlIHN1cmUgaG93IHRvIGhhbmRsZSB0aGUgZGVw
ZW5kZW5jeSBpc3N1ZXMgdGhlcmUKKyAgICAgICAgeWV0LCBzbyBJJ3ZlIHB1bnRlZCBvbiB0aGUg
aXNzdWUgZm9yIG5vdy4KKworICAgICAgICBBbHNvLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgbWV0
aG9kcyB0aGF0IGFyZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhpcworICAgICAgICBwYXRjaCB0aGF0
IGFyZSBvbmx5IHVzZWQgYnkgdGhlIGNhbm9uaWNhbGl6ZXIuICBNeSBwbGFuIGlzIHRvIG1ha2UK
KyAgICAgICAgdGhvc2UgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgYW5kIG1ha2UgdGhlIGNhbm9uaWNh
bGl6ZXIgYSBmcmllbmQgb2YgdGhlCisgICAgICAgIHBhcnNlci4gIFRoZSBkZXRhaWxzIHdpbGwg
YmUgaW4gYSBsYXRlciBwYXRjaC4KKworICAgICAgICAqIHd0Zi91cmwvc3JjL1VSTENvbXBvbmVu
dC5oOgorICAgICAgICAoV1RGOjpVUkxDb21wb25lbnQ6OmZyb21SYW5nZSk6CisgICAgICAgIChX
VEY6OlVSTENvbXBvbmVudDo6aXNOb25FbXB0eSk6CisgICAgICAgIChXVEY6OlVSTENvbXBvbmVu
dDo6aXNFbXB0eU9ySW52YWxpZCk6CisgICAgICAgICogd3RmL3VybC9zcmMvVVJMUGFyc2VyLmg6
IEFkZGVkLgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6Oik6CisgICAgICAgIChXVEY6OlVSTFBh
cnNlcjo6aXNQb3NzaWJsZUF1dGhvcml0eVRlcm1pbmF0b3IpOgorICAgICAgICAoV1RGOjpVUkxQ
YXJzZXI6OnBhcnNlQXV0aG9yaXR5KToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpleHRyYWN0
U2NoZW1lKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZUFmdGVyU2NoZW1lKToKKyAg
ICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZVN0YW5kYXJkVVJMKToKKyAgICAgICAgKFdURjo6
VVJMUGFyc2VyOjpwYXJzZVBhdGgpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnBhcnNlUGF0
aFVSTCk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VNYWlsdG9VUkwpOgorICAgICAg
ICAoV1RGOjpVUkxQYXJzZXI6OnBhcnNlUG9ydCk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6
ZXh0cmFjdEZpbGVOYW1lKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpleHRyYWN0UXVlcnlL
ZXlWYWx1ZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6aXNVUkxTbGFzaCk6CisgICAgICAg
IChXVEY6OlVSTFBhcnNlcjo6c2hvdWxkVHJpbUZyb21VUkwpOgorICAgICAgICAoV1RGOjpVUkxQ
YXJzZXI6OnRyaW1VUkwpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OmNvbnNlY3V0aXZlU2xh
c2hlcyk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6aXNQb3J0RGlnaXQpOgorICAgICAgICAo
V1RGOjpVUkxQYXJzZXI6Om5leHRBdXRob3JpdHlUZXJtaW5hdG9yKToKKyAgICAgICAgKFdURjo6
VVJMUGFyc2VyOjpwYXJzZVVzZXJJbmZvKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJz
ZVNlcnZlckluZm8pOgorCiAyMDEwLTA1LTA2ICBGdW1pdG9zaGkgVWthaSAgPHVrYWlAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFsZXhleSBQcm9za3VyeWFrb3YuCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAkocmV2aXNpb24gNTg5
NDApCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzcsMTMgKzM3LDE5IEBAIHB1YmxpYzoKICAgICBVUkxDb21wb25lbnQoKSA6
IG1fYmVnaW4oMCksIG1fbGVuZ3RoKC0xKSB7IH0KICAgICBVUkxDb21wb25lbnQoaW50IGJlZ2lu
LCBpbnQgbGVuZ3RoKSA6IG1fYmVnaW4oYmVnaW4pLCBtX2xlbmd0aChsZW5ndGgpIHsgfQogCisg
ICAgLy8gSGVscGVyIHRoYXQgcmV0dXJucyBhIGNvbXBvbmVudCBjcmVhdGVkIHdpdGggdGhlIGdp
dmVuIGJlZ2luIGFuZCBlbmRpbmcKKyAgICAvLyBwb2ludHMuIFRoZSBlbmRpbmcgcG9pbnQgaXMg
bm9uLWluY2x1c2l2ZS4KKyAgICBzdGF0aWMgaW5saW5lIFVSTENvbXBvbmVudCBmcm9tUmFuZ2Uo
aW50IGJlZ2luLCBpbnQgZW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFVSTENvbXBvbmVudChi
ZWdpbiwgZW5kIC0gYmVnaW4pOworICAgIH0KKwogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlz
IGNvbXBvbmVudCBpcyB2YWxpZCwgbWVhbmluZyB0aGUgbGVuZ3RoIGlzIGdpdmVuLiBFdmVuCiAg
ICAgLy8gdmFsaWQgY29tcG9uZW50cyBtYXkgYmUgZW1wdHkgdG8gcmVjb3JkIHRoZSBmYWN0IHRo
YXQgdGhleSBleGlzdC4KICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0
aCAhPSAtMTsgfQogCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb21wb25lbnQg
aXMgc3BlY2lmaWVkIG9uIGZhbHNlLCB0aGUgY29tcG9uZW50Ci0gICAgLy8gaXMgZWl0aGVyIGVt
cHR5IG9yIGludmFsaWQuCi0gICAgYm9vbCBpc05vbmVtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9s
ZW5ndGggPiAwOyB9CisgICAgYm9vbCBpc05vbkVtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9sZW5n
dGggPiAwOyB9CisgICAgYm9vbCBpc0VtcHR5T3JJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9s
ZW5ndGggPD0gMDsgfQogCiAgICAgdm9pZCByZXNldCgpCiAgICAgewpJbmRleDogSmF2YVNjcmlw
dENvcmUvd3RmL3VybC9zcmMvVVJMUGFyc2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvd3RmL3VybC9zcmMvVVJMUGFyc2VyLmgJKHJldmlzaW9uIDApCisrKyBKYXZhU2NyaXB0Q29y
ZS93dGYvdXJsL3NyYy9VUkxQYXJzZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NzkgQEAK
Ky8qIEJhc2VkIG9uIG5zVVJMUGFyc2Vycy5jYyBmcm9tIE1vemlsbGEKKyAqIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OCBOZXRzY2Fw
ZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqCisgKiBPdGhlciBjb250cmlidXRvcnM6
CisgKiAgIERhcmluIEZpc2hlciAob3JpZ2luYWwgYXV0aG9yKQorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
KgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNl
ZCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIGVpdGhlciB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5z
ZSBWZXJzaW9uIDEuMSwgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLyAo
dGhlICJNUEwiKSBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24g
Mi4wLCBmb3VuZCBhdCBodHRwOi8vd3d3LmZzZi5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqICh0
aGUgIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBNUEwgb3IgdGhl
IEdQTCBhcmUKKyAqIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdSB3
aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVu
ZGVyIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhvc2UgdHdvCisgKiBsaWNlbnNlcyAodGhlIE1QTCBv
ciB0aGUgR1BMKSBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lv
biBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIExHUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkK
KyAqIGRlbGV0aW5ndGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRo
ZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBNUEwgb3Ig
dGhlIEdQTCwgYXMgdGhlIGNhc2UgbWF5IGJlLgorICogSWYgeW91IGRvIG5vdCBkZWxldGUgdGhl
IHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogdmVyc2lvbiBv
ZiB0aGlzIGZpbGUgdW5kZXIgYW55IG9mIHRoZSBMR1BMLCB0aGUgTVBMIG9yIHRoZSBHUEwuCisg
Ki8KKworI2lmbmRlZiBVUkxQYXJzZXJfaAorI2RlZmluZSBVUkxQYXJzZXJfaAorCisjaW5jbHVk
ZSAiVVJMQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiVVJMU2VnbWVudHMuaCIKKworbmFtZXNwYWNl
IFdURiB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIENIQVI+CitjbGFzcyBVUkxQYXJzZXIgeworcHVi
bGljOgorICAgIGVudW0gU3BlY2lhbFBvcnQgeworICAgICAgICBVbnNwZWNpZmllZFBvcnQgPSAt
MSwKKyAgICAgICAgSW52YWxpZFBvcnQgPSAtMiwKKyAgICB9OworCisgICAgLy8gVGhpcyBoYW5k
bGVzIGV2ZXJ5dGhpbmcgdGhhdCBtYXkgYmUgYW4gYXV0aG9yaXR5IHRlcm1pbmF0b3IsIGluY2x1
ZGluZworICAgIC8vIGJhY2tzbGFzaC4gRm9yIHNwZWNpYWwgYmFja3NsYXNoIGhhbmRsaW5nIHNl
ZSBwYXJzZUFmdGVyU2NoZW1lLgorICAgIHN0YXRpYyBib29sIGlzUG9zc2libGVBdXRob3JpdHlU
ZXJtaW5hdG9yKENIQVIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gaXNVUkxTbGFzaChjaCkg
fHwgY2ggPT0gJz8nIHx8IGNoID09ICcjJyB8fCBjaCA9PSAnOyc7CisgICAgfQorCisgICAgLy8g
R2l2ZW4gYW4gYWxyZWFkeS1pZGVudGlmaWVkIGF1dGggc2VjdGlvbiwgYnJlYWtzIGl0IGludG8g
aXRzIGNvbnN0aXR1ZW50CisgICAgLy8gcGFydHMuIFRoZSBwb3J0IG51bWJlciB3aWxsIGJlIHBh
cnNlZCBhbmQgdGhlIHJlc3VsdGluZyBpbnRlZ2VyIHdpbGwgYmUKKyAgICAvLyBmaWxsZWQgaW50
byB0aGUgZ2l2ZW4gKnBvcnQgdmFyaWFibGUsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHBvcnQgbnVt
YmVyIG9yIGl0CisgICAgLy8gaXMgaW52YWxpZC4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZUF1dGhv
cml0eShjb25zdCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIGF1dGgsIFVSTENvbXBv
bmVudCYgdXNlcm5hbWUsIFVSTENvbXBvbmVudCYgcGFzc3dvcmQsIFVSTENvbXBvbmVudCYgaG9z
dCwgVVJMQ29tcG9uZW50JiBwb3J0KQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NF
UlQoYXV0aC5pc1ZhbGlkKCkpOyAvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhbiBhdXRob3JpdHku
CisgICAgICAgIGlmICghYXV0aC5sZW5ndGgoKSkgeworICAgICAgICAgICAgdXNlcm5hbWUucmVz
ZXQoKTsKKyAgICAgICAgICAgIHBhc3N3b3JkLnJlc2V0KCk7CisgICAgICAgICAgICBob3N0LnJl
c2V0KCk7CisgICAgICAgICAgICBwb3J0LnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBTZWFyY2ggYmFja3dhcmRzIGZvciBALCB3aGljaCBpcyB0
aGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIHVzZXIgaW5mbyBhbmQKKyAgICAgICAgLy8gdGhlIHNl
cnZlciBpbmZvLiAgUkZDIDM5ODYgZm9yYmlkcyBAIGZyb20gb2NjdXJpbmcgaW4gYXV0aCwgYnV0
IHNvbWVvbmUKKyAgICAgICAgLy8gbWlnaHQgaW5jbHVkZSBpdCBpbiBhIHBhc3N3b3JkIHVuZXNj
YXBlZC4KKyAgICAgICAgaW50IGkgPSBhdXRoLmJlZ2luKCkgKyBhdXRoLmxlbmd0aCgpIC0gMTsK
KyAgICAgICAgd2hpbGUgKGkgPiBhdXRoLmJlZ2luKCkgJiYgc3BlY1tpXSAhPSAnQCcpCisgICAg
ICAgICAgICAtLWk7CisKKyAgICAgICAgaWYgKHNwZWNbaV0gPT0gJ0AnKSB7CisgICAgICAgICAg
ICAvLyBGb3VuZCB1c2VyIGluZm86IDx1c2VyLWluZm8+QDxzZXJ2ZXItaW5mbz4KKyAgICAgICAg
ICAgIHBhcnNlVXNlckluZm8oc3BlYywgVVJMQ29tcG9uZW50KGF1dGguYmVnaW4oKSwgaSAtIGF1
dGguYmVnaW4oKSksIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICBwYXJzZVNlcnZl
ckluZm8oc3BlYywgVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoaSArIDEsIGF1dGguYmVnaW4oKSAr
IGF1dGgubGVuZ3RoKCkpLCBob3N0LCBwb3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIC8vIE5vIHVzZXIgaW5mbywgZXZlcnl0aGluZyBpcyBzZXJ2ZXIgaW5mby4KKyAgICAgICAg
ICAgIHVzZXJuYW1lLnJlc2V0KCk7CisgICAgICAgICAgICBwYXNzd29yZC5yZXNldCgpOworICAg
ICAgICAgICAgcGFyc2VTZXJ2ZXJJbmZvKHNwZWMsIGF1dGgsIGhvc3QsIHBvcnQpOworICAgICAg
ICB9CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgZXh0cmFjdFNjaGVtZShjb25zdCBDSEFSKiBz
cGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMQ29tcG9uZW50JiBzY2hlbWUpCisgICAgeworICAgICAg
ICAvLyBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAg
ICAgICBpbnQgYmVnaW4gPSAwOworICAgICAgICB3aGlsZSAoYmVnaW4gPCBzcGVjTGVuZ3RoICYm
IHNob3VsZFRyaW1Gcm9tVVJMKHNwZWNbYmVnaW5dKSkKKyAgICAgICAgICAgIGJlZ2luKys7Cisg
ICAgICAgIGlmIChiZWdpbiA9PSBzcGVjTGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OyAvLyBJbnB1dCBpcyBlbXB0eSBvciBhbGwgd2hpdGVzcGFjZS4KKworICAgICAgICAvLyBGaW5k
IHRoZSBmaXJzdCBjb2xvbiBjaGFyYWN0ZXIuCisgICAgICAgIGZvciAoaW50IGkgPSBiZWdpbjsg
aSA8IHNwZWNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNwZWNbaV0gPT0gJzonKSB7
CisgICAgICAgICAgICAgICAgc2NoZW1lID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoYmVnaW4s
IGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gY29sb24gZm91bmQ6IG5vIHNjaGVtZQor
ICAgIH0KKworICAgIC8vIEZpbGxzIGluIGFsbCBtZW1iZXJzIG9mIHRoZSBVUkxTZWdtZW50cyBz
dHJ1Y3R1cmUgKGV4Y2VwdCBmb3IgdGhlCisgICAgLy8gc2NoZW1lKSBmb3Igc3RhbmRhcmQgVVJM
cy4KKyAgICAvLworICAgIC8vIHxzcGVjfCBpcyB0aGUgZnVsbCBzcGVjIGJlaW5nIHBhcnNlZCwg
b2YgbGVuZ3RoIHxzcGVjTGVuZ3RofC4KKyAgICAvLyB8YWZ0ZXJTY2hlbWV8IGlzIHRoZSBjaGFy
YWN0ZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBzY2hlbWUgKGFmdGVyIHRoZQorICAgIC8v
ICAgY29sb24pIHdoZXJlIHdlJ2xsIGJlZ2luIHBhcnNpbmcuCisgICAgc3RhdGljIHZvaWQgcGFy
c2VBZnRlclNjaGVtZShjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgaW50IGFmdGVy
U2NoZW1lLCBVUkxTZWdtZW50cyYgcGFyc2VkKQorICAgIHsKKyAgICAgICAgaW50IG51bWJlck9m
U2xhc2hlcyA9IGNvbnNlY3V0aXZlU2xhc2hlcyhzcGVjLCBhZnRlclNjaGVtZSwgc3BlY0xlbmd0
aCk7CisgICAgICAgIGludCBhZnRlclNsYXNoZXMgPSBhZnRlclNjaGVtZSArIG51bWJlck9mU2xh
c2hlczsKKworICAgICAgICAvLyBGaXJzdCBzcGxpdCBpbnRvIHR3byBtYWluIHBhcnRzLCB0aGUg
YXV0aG9yaXR5ICh1c2VybmFtZSwgcGFzc3dvcmQsIGhvc3QsCisgICAgICAgIC8vIGFuZCBwb3J0
KSBhbmQgdGhlIGZ1bGwgcGF0aCAocGF0aCwgcXVlcnksIGFuZCByZWZlcmVuY2UpLgorICAgICAg
ICBVUkxDb21wb25lbnQgYXV0aG9yaXR5OworICAgICAgICBVUkxDb21wb25lbnQgZnVsbFBhdGg7
CisKKyAgICAgICAgLy8gRm91bmQgIi8vPHNvbWUgZGF0YT4iLCBsb29rcyBsaWtlIGFuIGF1dGhv
cml0eSBzZWN0aW9uLiBUcmVhdCBldmVyeXRoaW5nCisgICAgICAgIC8vIGZyb20gdGhlcmUgdG8g
dGhlIG5leHQgc2xhc2ggKG9yIGVuZCBvZiBzcGVjKSB0byBiZSB0aGUgYXV0aG9yaXR5LiBOb3Rl
CisgICAgICAgIC8vIHRoYXQgd2UgaWdub3JlIHRoZSBudW1iZXIgb2Ygc2xhc2hlcyBhbmQgdHJl
YXQgaXQgYXMgdGhlIGF1dGhvcml0eS4KKyAgICAgICAgaW50IGF1dGhFbmQgPSBuZXh0QXV0aG9y
aXR5VGVybWluYXRvcihzcGVjLCBhZnRlclNsYXNoZXMsIHNwZWNMZW5ndGgpOworICAgICAgICBh
dXRob3JpdHkgPSBVUkxDb21wb25lbnQoYWZ0ZXJTbGFzaGVzLCBhdXRoRW5kIC0gYWZ0ZXJTbGFz
aGVzKTsKKworICAgICAgICBpZiAoYXV0aEVuZCA9PSBzcGVjTGVuZ3RoKSAvLyBObyBiZWdpbm5p
bmcgb2YgcGF0aCBmb3VuZC4KKyAgICAgICAgICAgIGZ1bGxQYXRoID0gVVJMQ29tcG9uZW50KCk7
CisgICAgICAgIGVsc2UgLy8gRXZlcnl0aGluZyBzdGFydGluZyBmcm9tIHRoZSBzbGFzaCB0byB0
aGUgZW5kIGlzIHRoZSBwYXRoLgorICAgICAgICAgICAgZnVsbFBhdGggPSBVUkxDb21wb25lbnQo
YXV0aEVuZCwgc3BlY0xlbmd0aCAtIGF1dGhFbmQpOworCisgICAgICAgIC8vIE5vdyBwYXJzZSB0
aG9zZSB0d28gc3ViLXBhcnRzLgorICAgICAgICBwYXJzZUF1dGhvcml0eShzcGVjLCBhdXRob3Jp
dHksIHBhcnNlZC51c2VybmFtZSwgcGFyc2VkLnBhc3N3b3JkLCBwYXJzZWQuaG9zdCwgcGFyc2Vk
LnBvcnQpOworICAgICAgICBwYXJzZVBhdGgoc3BlYywgZnVsbFBhdGgsIHBhcnNlZC5wYXRoLCBw
YXJzZWQucXVlcnksIHBhcnNlZC5mcmFnbWVudCk7CisgICAgfQorCisgICAgLy8gVGhlIG1haW4g
cGFyc2luZyBmdW5jdGlvbiBmb3Igc3RhbmRhcmQgVVJMcy4gU3RhbmRhcmQgVVJMcyBoYXZlIGEg
c2NoZW1lLAorICAgIC8vIGhvc3QsIHBhdGgsIGV0Yy4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZVN0
YW5kYXJkVVJMKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxTZWdtZW50cyYg
cGFyc2VkKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQoc3BlY0xlbmd0aCA+
PSAwKTsKKworICAgICAgICAvLyBTdHJpcCBsZWFkaW5nICYgdHJhaWxpbmcgc3BhY2VzIGFuZCBj
b250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIGludCBiZWdpbiA9IDA7CisgICAgICAgIHRyaW1V
Ukwoc3BlYywgYmVnaW4sIHNwZWNMZW5ndGgpOworCisgICAgICAgIGludCBhZnRlclNjaGVtZTsK
KyAgICAgICAgaWYgKGV4dHJhY3RTY2hlbWUoc3BlYywgc3BlY0xlbmd0aCwgcGFyc2VkLnNjaGVt
ZSkpCisgICAgICAgICAgICBhZnRlclNjaGVtZSA9IHBhcnNlZC5zY2hlbWUuZW5kKCkgKyAxOyAv
LyBTa2lwIHBhc3QgdGhlIGNvbG9uLgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNh
eSB0aGVyZSdzIG5vIHNjaGVtZSB3aGVuIHRoZXJlIGlzIGEgY29sb24uIFdlIGNvdWxkIGFsc28g
c2F5IHRoYXQKKyAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgdGhlIHNjaGVtZS4gQm90aCB3
b3VsZCBwcm9kdWNlIGFuIGludmFsaWQgVVJMLCBidXQgdGhpcyB3YXkKKyAgICAgICAgICAgIC8v
IHNlZW1zIGxlc3Mgd3JvbmcgaW4gbW9yZSBjYXNlcy4KKyAgICAgICAgICAgIHBhcnNlZC5zY2hl
bWUucmVzZXQoKTsKKyAgICAgICAgICAgIGFmdGVyU2NoZW1lID0gYmVnaW47CisgICAgICAgIH0K
KyAgICAgICAgcGFyc2VBZnRlclNjaGVtZShzcGVjLCBzcGVjTGVuZ3RoLCBhZnRlclNjaGVtZSwg
cGFyc2VkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwYXJzZVBhdGgoY29uc3QgQ0hBUiog
c3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBwYXRoLCBVUkxDb21wb25lbnQmIGZpbGVwYXRoLCBV
UkxDb21wb25lbnQmIHF1ZXJ5LCBVUkxDb21wb25lbnQmIGZyYWdtZW50KQorICAgIHsKKyAgICAg
ICAgLy8gcGF0aCA9IFsvXTxzZWdtZW50MT4vPHNlZ21lbnQyPi88Li4uPi88c2VnbWVudE4+Ozxw
YXJhbT4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZW4g
dGhlcmUgaXMgbm8gcGF0aC4KKyAgICAgICAgaWYgKCFwYXRoLmlzVmFsaWQoKSkgeworICAgICAg
ICAgICAgZmlsZXBhdGgucmVzZXQoKTsKKyAgICAgICAgICAgIHF1ZXJ5LnJlc2V0KCk7CisgICAg
ICAgICAgICBmcmFnbWVudC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgICAgIC8vIEZJWE1FOiBhZGQgQVNTRVJUKHBhdGgubGVuZ3RoKCkgPiAwKTsgLy8gV2Ug
c2hvdWxkIG5ldmVyIGhhdmUgMCBsZW5ndGggcGF0aHMuCisKKyAgICAgICAgLy8gU2VhcmNoIGZv
ciBmaXJzdCBvY2N1cnJlbmNlIG9mIGVpdGhlciA/IG9yICMuCisgICAgICAgIGludCBwYXRoRW5k
ID0gcGF0aC5iZWdpbigpICsgcGF0aC5sZW5ndGgoKTsKKworICAgICAgICBpbnQgcXVlcnlTZXBh
cmF0b3IgPSAtMTsgLy8gSW5kZXggb2YgdGhlICc/JworICAgICAgICBpbnQgcmVmU2VwYXJhdG9y
ID0gLTE7IC8vIEluZGV4IG9mIHRoZSAnIycKKyAgICAgICAgZm9yIChpbnQgaSA9IHBhdGguYmVn
aW4oKTsgaSA8IHBhdGhFbmQ7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChzcGVjW2ldKSB7
CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAvLyBPbmx5IG1hdGNoIHRo
ZSBxdWVyeSBzdHJpbmcgaWYgaXQgcHJlY2VkZXMgdGhlIHJlZmVyZW5jZSBmcmFnbWVudAorICAg
ICAgICAgICAgICAgIC8vIGFuZCB3aGVuIHdlIGhhdmVuJ3QgZm91bmQgb25lIGFscmVhZHkuCisg
ICAgICAgICAgICAgICAgaWYgKHJlZlNlcGFyYXRvciA8IDAgJiYgcXVlcnlTZXBhcmF0b3IgPCAw
KQorICAgICAgICAgICAgICAgICAgICBxdWVyeVNlcGFyYXRvciA9IGk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICAvLyBSZWNv
cmQgdGhlIGZpcnN0ICMgc2lnbiBvbmx5LgorICAgICAgICAgICAgICAgIGlmIChyZWZTZXBhcmF0
b3IgPCAwKQorICAgICAgICAgICAgICAgICAgICByZWZTZXBhcmF0b3IgPSBpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1hcmtlcnMgcG9pbnRp
bmcgdG8gdGhlIGNoYXJhY3RlciBhZnRlciBlYWNoIG9mIHRoZXNlIGNvcnJlc3BvbmRpbmcKKyAg
ICAgICAgLy8gY29tcG9uZW50cy4gVGhlIGNvZGUgYmVsb3cgd29ya3MgZnJvbSB0aGUgZW5kIGJh
Y2sgdG8gdGhlIGJlZ2lubmluZywKKyAgICAgICAgLy8gYW5kIHdpbGwgdXBkYXRlIHRoZXNlIGlu
ZGljZXMgYXMgaXQgZmluZHMgY29tcG9uZW50cyB0aGF0IGV4aXN0LgorICAgICAgICBpbnQgZmls
ZUVuZCwgcXVlcnlFbmQ7CisKKyAgICAgICAgLy8gRnJhZ21lbnQ6IGZyb20gdGhlICMgdG8gdGhl
IGVuZCBvZiB0aGUgcGF0aC4KKyAgICAgICAgaWYgKHJlZlNlcGFyYXRvciA+PSAwKSB7CisgICAg
ICAgICAgICBmaWxlRW5kID0gcmVmU2VwYXJhdG9yOworICAgICAgICAgICAgcXVlcnlFbmQgPSBy
ZWZTZXBhcmF0b3I7CisgICAgICAgICAgICBmcmFnbWVudCA9IFVSTENvbXBvbmVudDo6ZnJvbVJh
bmdlKHJlZlNlcGFyYXRvciArIDEsIHBhdGhFbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgZmlsZUVuZCA9IHBhdGhFbmQ7CisgICAgICAgICAgICBxdWVyeUVuZCA9IHBhdGhFbmQ7
CisgICAgICAgICAgICBmcmFnbWVudC5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8g
UXVlcnkgZnJhZ21lbnQ6IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgPyB0byB0aGUgbmV4dCBib3VuZGFy
eSAoZWl0aGVyIHRoZSBlbmQKKyAgICAgICAgLy8gb2YgdGhlIHBhdGggb3IgdGhlIGZyYWdtZW50
IGZyYWdtZW50KS4KKyAgICAgICAgaWYgKHF1ZXJ5U2VwYXJhdG9yID49IDApIHsKKyAgICAgICAg
ICAgIGZpbGVFbmQgPSBxdWVyeVNlcGFyYXRvcjsKKyAgICAgICAgICAgIHF1ZXJ5ID0gVVJMQ29t
cG9uZW50Ojpmcm9tUmFuZ2UocXVlcnlTZXBhcmF0b3IgKyAxLCBxdWVyeUVuZCk7CisgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgcXVlcnkucmVzZXQoKTsKKworICAgICAgICAvLyBGaWxlIHBh
dGg6IHRyZWF0IGFuIGVtcHR5IGZpbGUgcGF0aCBhcyBubyBmaWxlIHBhdGguCisgICAgICAgIGlm
IChmaWxlRW5kICE9IHBhdGguYmVnaW4oKSkKKyAgICAgICAgICAgIGZpbGVwYXRoID0gVVJMQ29t
cG9uZW50Ojpmcm9tUmFuZ2UocGF0aC5iZWdpbigpLCBmaWxlRW5kKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgZmlsZXBhdGgucmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXpl
cyBhIHBhdGggVVJMIHdoaWNoIGlzIG1lcmVseSBhIHNjaGVtZSBmb2xsb3dlZCBieSBhIHBhdGgu
IEV4YW1wbGVzCisgICAgLy8gaW5jbHVkZSAiYWJvdXQ6Zm9vIiBhbmQgImphdmFzY3JpcHQ6YWxl
cnQoJ2JhcicpOyIKKyAgICBzdGF0aWMgdm9pZCBwYXJzZVBhdGhVUkwoY29uc3QgQ0hBUiogc3Bl
YywgaW50IHNwZWNMZW5ndGgsIFVSTFNlZ21lbnRzJiBwYXJzZWQpCisgICAgeworICAgICAgICAv
LyBHZXQgdGhlIG5vbi1wYXRoIGFuZCBub24tc2NoZW1lIHBhcnRzIG9mIHRoZSBVUkwgb3V0IG9m
IHRoZSB3YXksIHdlIG5ldmVyCisgICAgICAgIC8vIHVzZSB0aGVtLgorICAgICAgICBwYXJzZWQu
dXNlcm5hbWUucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLnBhc3N3b3JkLnJlc2V0KCk7CisgICAg
ICAgIHBhcnNlZC5ob3N0LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC5wb3J0LnJlc2V0KCk7Cisg
ICAgICAgIHBhcnNlZC5xdWVyeS5yZXNldCgpOworICAgICAgICBwYXJzZWQuZnJhZ21lbnQucmVz
ZXQoKTsKKworICAgICAgICAvLyBTdHJpcCBsZWFkaW5nICYgdHJhaWxpbmcgc3BhY2VzIGFuZCBj
b250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIC8vIEZJWE1FOiBQZXJoYXBzIHRoaXMgaXMgdW5u
ZWNlc3Nhcnk/CisgICAgICAgIGludCBiZWdpbiA9IDA7CisgICAgICAgIHRyaW1VUkwoc3BlYywg
YmVnaW4sIHNwZWNMZW5ndGgpOworCisgICAgICAgIC8vIEhhbmRsZSBlbXB0eSBzcGVjcyBvciBv
bmVzIHRoYXQgY29udGFpbiBvbmx5IHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFycy4KKyAgICAg
ICAgaWYgKGJlZ2luID09IHNwZWNMZW5ndGgpIHsKKyAgICAgICAgICAgIHBhcnNlZC5zY2hlbWUu
cmVzZXQoKTsKKyAgICAgICAgICAgIHBhcnNlZC5wYXRoLnJlc2V0KCk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBzY2hlbWUsIHdpdGgg
dGhlIHBhdGggYmVpbmcgZXZlcnl0aGluZyBmb2xsb3dpbmcuIFdlIGFsc28KKyAgICAgICAgLy8g
aGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIHNjaGVtZS4KKyAgICAgICAgaWYgKGV4
dHJhY3RTY2hlbWUoJnNwZWNbYmVnaW5dLCBzcGVjTGVuZ3RoIC0gYmVnaW4sIHBhcnNlZC5zY2hl
bWUpKSB7CisgICAgICAgICAgICAvLyBPZmZzZXQgdGhlIHJlc3VsdHMgc2luY2Ugd2UgZ2F2ZSBl
eHRyYWN0U2NoZW1lIGEgc3Vic3RyaW5nLgorICAgICAgICAgICAgcGFyc2VkLnNjaGVtZS5zZXRC
ZWdpbihwYXJzZWQuc2NoZW1lLmJlZ2luKCkgKyBiZWdpbik7CisKKyAgICAgICAgICAgIC8vIEZv
ciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHN0YW5kYXJkIFVSTCBwYXJzZXIsIHdlIHRyZWF0IG5v
IHBhdGggYXMKKyAgICAgICAgICAgIC8vIC0xLCByYXRoZXIgdGhhbiBoYXZpbmcgYSBsZW5ndGgg
b2YgMCAod2Ugbm9ybWFsbHkgd291bGRuJ3QgY2FyZSBzbworICAgICAgICAgICAgLy8gbXVjaCBm
b3IgdGhlc2Ugbm9uLXN0YW5kYXJkIFVSTHMpLgorICAgICAgICAgICAgaWYgKHBhcnNlZC5zY2hl
bWUuZW5kKCkgPT0gc3BlY0xlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgcGFyc2VkLnBhdGgu
cmVzZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwYXJzZWQucGF0aCA9
IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHBhcnNlZC5zY2hlbWUuZW5kKCkgKyAxLCBzcGVjTGVu
Z3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHNjaGVtZSBmb3VuZCwg
anVzdCBwYXRoLgorICAgICAgICAgICAgcGFyc2VkLnNjaGVtZS5yZXNldCgpOworICAgICAgICAg
ICAgcGFyc2VkLnBhdGggPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShiZWdpbiwgc3BlY0xlbmd0
aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwYXJzZU1haWx0b1VSTChj
b25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMU2VnbWVudHMmIHBhcnNlZCkKKyAg
ICB7CisgICAgICAgIC8vIEZJWE1FOiBhZGQgQVNTRVJUKHNwZWNMZW5ndGggPj0gMCk7CisKKyAg
ICAgICAgLy8gR2V0IHRoZSBub24tcGF0aCBhbmQgbm9uLXNjaGVtZSBwYXJ0cyBvZiB0aGUgVVJM
IG91dCBvZiB0aGUgd2F5LCB3ZSBuZXZlcgorICAgICAgICAvLyB1c2UgdGhlbS4KKyAgICAgICAg
cGFyc2VkLnVzZXJuYW1lLnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC5wYXNzd29yZC5yZXNldCgp
OworICAgICAgICBwYXJzZWQuaG9zdC5yZXNldCgpOworICAgICAgICBwYXJzZWQucG9ydC5yZXNl
dCgpOworICAgICAgICBwYXJzZWQuZnJhZ21lbnQucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLnF1
ZXJ5LnJlc2V0KCk7IC8vIE1heSB1c2UgdGhpczsgcmVzZXQgZm9yIGNvbnZlbmllbmNlLgorCisg
ICAgICAgIC8vIFN0cmlwIGxlYWRpbmcgJiB0cmFpbGluZyBzcGFjZXMgYW5kIGNvbnRyb2wgY2hh
cmFjdGVycy4KKyAgICAgICAgaW50IGJlZ2luID0gMDsKKyAgICAgICAgdHJpbVVSTChzcGVjLCBi
ZWdpbiwgc3BlY0xlbmd0aCk7CisKKyAgICAgICAgLy8gSGFuZGxlIGVtcHR5IHNwZWNzIG9yIG9u
ZXMgdGhhdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZSBvciBjb250cm9sIGNoYXJzLgorICAgICAg
ICBpZiAoYmVnaW4gPT0gc3BlY0xlbmd0aCkgeworICAgICAgICAgICAgcGFyc2VkLnNjaGVtZS5y
ZXNldCgpOworICAgICAgICAgICAgcGFyc2VkLnBhdGgucmVzZXQoKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwYXRoQmVnaW4gPSAtMTsKKyAgICAgICAg
aW50IHBhdGhFbmQgPSAtMTsKKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBzY2hlbWUsIHdpdGgg
dGhlIHBhdGggYmVpbmcgZXZlcnl0aGluZyBmb2xsb3dpbmcuIFdlIGFsc28KKyAgICAgICAgLy8g
aGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIHNjaGVtZS4KKyAgICAgICAgaWYgKGV4
dHJhY3RTY2hlbWUoJnNwZWNbYmVnaW5dLCBzcGVjTGVuZ3RoIC0gYmVnaW4sIHBhcnNlZC5zY2hl
bWUpKSB7CisgICAgICAgICAgICAvLyBPZmZzZXQgdGhlIHJlc3VsdHMgc2luY2Ugd2UgZ2F2ZSBl
eHRyYWN0U2NoZW1lIGEgc3Vic3RyaW5nLgorICAgICAgICAgICAgcGFyc2VkLnNjaGVtZS5zZXRC
ZWdpbihwYXJzZWQuc2NoZW1lLmJlZ2luKCkgKyBiZWdpbik7CisKKyAgICAgICAgICAgIGlmIChw
YXJzZWQuc2NoZW1lLmVuZCgpICE9IHNwZWNMZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICAg
cGF0aEJlZ2luID0gcGFyc2VkLnNjaGVtZS5lbmQoKSArIDE7CisgICAgICAgICAgICAgICAgcGF0
aEVuZCA9IHNwZWNMZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAvLyBObyBzY2hlbWUgZm91bmQsIGp1c3QgcGF0aC4KKyAgICAgICAgICAgIHBhcnNl
ZC5zY2hlbWUucmVzZXQoKTsKKyAgICAgICAgICAgIHBhdGhCZWdpbiA9IGJlZ2luOworICAgICAg
ICAgICAgcGF0aEVuZCA9IHNwZWNMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvLyBTcGxp
dCBbcGF0aEJlZ2luLCBwYXRoRW5kKSBpbnRvIGEgcGF0aCArIHF1ZXJ5LgorICAgICAgICBmb3Ig
KGludCBpID0gcGF0aEJlZ2luOyBpIDwgcGF0aEVuZDsgKytpKSB7CisgICAgICAgICAgICBpZiAo
c3BlY1tpXSA9PSAnPycpIHsKKyAgICAgICAgICAgICAgICBwYXJzZWQucXVlcnkgPSBVUkxDb21w
b25lbnQ6OmZyb21SYW5nZShpICsgMSwgcGF0aEVuZCk7CisgICAgICAgICAgICAgICAgcGF0aEVu
ZCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBzdGFuZGFyZCBVUkwgcGFy
c2VyLCB0cmVhdCBubyBwYXRoIGFzCisgICAgICAgIC8vIC0xLCByYXRoZXIgdGhhbiBoYXZpbmcg
YSBsZW5ndGggb2YgMAorICAgICAgICBpZiAocGF0aEJlZ2luID09IHBhdGhFbmQpCisgICAgICAg
ICAgICBwYXJzZWQucGF0aC5yZXNldCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJz
ZWQucGF0aCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHBhdGhCZWdpbiwgcGF0aEVuZCk7Cisg
ICAgfQorCisgICAgLy8gQ29udmVydHMgYSBwb3J0IG51bWJlciBpbiBhIHN0cmluZyB0byBhbiBp
bnRlZ2VyLiBXZSdkIGxpa2UgdG8ganVzdCBjYWxsCisgICAgLy8gc3NjYW5mIGJ1dCBvdXIgaW5w
dXQgaXMgbm90IDAtdGVybWluYXRlZCwgd2hpY2ggc3NjYW5mIHJlcXVpcmVzLiBJbnN0ZWFkLAor
ICAgIC8vIHdlIGNvcHkgdGhlIGRpZ2l0cyB0byBhIHNtYWxsIHN0YWNrIGJ1ZmZlciAoc2luY2Ug
d2Uga25vdyB0aGUgbWF4aW11bSBudW1iZXIKKyAgICAvLyBvZiBkaWdpdHMgaW4gYSB2YWxpZCBw
b3J0IG51bWJlcikgdGhhdCB3ZSBjYW4gMCB0ZXJtaW5hdGUuCisgICAgc3RhdGljIGludCBwYXJz
ZVBvcnQoY29uc3QgQ0hBUiogc3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBjb21wb25lbnQpCisg
ICAgeworICAgICAgICAvLyBFYXN5IHN1Y2Nlc3MgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIHBvcnQu
CisgICAgICAgIGNvbnN0IGludCBtYXhEaWdpdHMgPSA1OworICAgICAgICBpZiAoY29tcG9uZW50
LmlzRW1wdHlPckludmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBVbnNwZWNpZmllZFBvcnQ7
CisKKyAgICAgICAgVVJMQ29tcG9uZW50IG5vblplcm9EaWdpdHMoY29tcG9uZW50LmVuZCgpLCAw
KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnQubGVuZ3RoKCk7ICsraSkg
eworICAgICAgICAgICAgaWYgKHNwZWNbY29tcG9uZW50LmJlZ2luKCkgKyBpXSAhPSAnMCcpIHsK
KyAgICAgICAgICAgICAgICBub25aZXJvRGlnaXRzID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2Uo
Y29tcG9uZW50LmJlZ2luKCkgKyBpLCBjb21wb25lbnQuZW5kKCkpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbm9uWmVyb0Rp
Z2l0cy5sZW5ndGgoKSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBBbGwgZGlnaXRzIHdlcmUg
MC4KKworICAgICAgICBpZiAobm9uWmVyb0RpZ2l0cy5sZW5ndGgoKSA+IG1heERpZ2l0cykKKyAg
ICAgICAgICAgIHJldHVybiBJbnZhbGlkUG9ydDsKKworICAgICAgICBpbnQgcG9ydCA9IDA7Cisg
ICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uWmVyb0RpZ2l0cy5sZW5ndGgoKTsgKytpKSB7
CisgICAgICAgICAgICBDSEFSIGNoID0gc3BlY1tub25aZXJvRGlnaXRzLmJlZ2luKCkgKyBpXTsK
KyAgICAgICAgICAgIGlmICghaXNQb3J0RGlnaXQoY2gpKQorICAgICAgICAgICAgICAgIHJldHVy
biBJbnZhbGlkUG9ydDsKKyAgICAgICAgICAgIHBvcnQgKj0gMTA7CisgICAgICAgICAgICBwb3J0
ICs9IHN0YXRpY19jYXN0PGNoYXI+KGNoKSAtICcwJzsKKyAgICAgICAgfQorICAgICAgICBpZiAo
cG9ydCA+IDY1NTM1KQorICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQb3J0OworICAgICAgICBy
ZXR1cm4gcG9ydDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBleHRyYWN0RmlsZU5hbWUoY29u
c3QgQ0hBUiogc3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBwYXRoLCBVUkxDb21wb25lbnQmIGZp
bGVOYW1lKQorICAgIHsKKyAgICAgICAgLy8gSGFuZGxlIGVtcHR5IHBhdGhzOiB0aGV5IGhhdmUg
bm8gZmlsZSBuYW1lcy4KKyAgICAgICAgaWYgKHBhdGguaXNFbXB0eU9ySW52YWxpZCgpKSB7Cisg
ICAgICAgICAgICBmaWxlTmFtZS5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gU2VhcmNoIGJhY2t3YXJkcyBmb3IgYSBwYXJhbWV0ZXIsIHdoaWNo
IGlzIGEgbm9ybWFsbHkgdW51c2VkIGZpZWxkIGluIGEKKyAgICAgICAgLy8gVVJMIGRlbGltaXRl
ZCBieSBhIHNlbWljb2xvbi4gV2UgcGFyc2UgdGhlIHBhcmFtZXRlciBhcyBwYXJ0IG9mIHRoZQor
ICAgICAgICAvLyBwYXRoLCBidXQgaGVyZSwgd2UgZG9uJ3Qgd2FudCB0byBjb3VudCBpdC4gVGhl
IGxhc3Qgc2VtaWNvbG9uIGlzIHRoZQorICAgICAgICAvLyBwYXJhbWV0ZXIuCisgICAgICAgIGlu
dCBmaWxlRW5kID0gcGF0aC5lbmQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHBhdGguZW5kKCkg
LSAxOyBpID4gcGF0aC5iZWdpbigpOyAtLWkpIHsKKyAgICAgICAgICAgIGlmIChzcGVjW2ldID09
ICc7JykgeworICAgICAgICAgICAgICAgIGZpbGVFbmQgPSBpOworICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHNlYXJjaCBi
YWNrd2FyZHMgZnJvbSB0aGUgZmlsZW5hbWUgZW5kIHRvIHRoZSBwcmV2aW91cyBzbGFzaAorICAg
ICAgICAvLyB0byBmaW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGVuYW1lLgorICAgICAgICBm
b3IgKGludCBpID0gZmlsZUVuZCAtIDE7IGkgPj0gcGF0aC5iZWdpbigpOyAtLWkpIHsKKyAgICAg
ICAgICAgIGlmIChpc1VSTFNsYXNoKHNwZWNbaV0pKSB7CisgICAgICAgICAgICAgICAgLy8gRmls
ZSBuYW1lIGlzIGV2ZXJ5dGhpbmcgZm9sbG93aW5nIHRoaXMgY2hhcmFjdGVyIHRvIHRoZSBlbmQK
KyAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGkgKyAx
LCBmaWxlRW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICAvLyBObyBzbGFzaCBmb3VuZCwgdGhpcyBtZWFucyB0aGUgaW5wdXQg
d2FzIGRlZ2VuZXJhdGUgKGdlbmVyYWxseSBwYXRocworICAgICAgICAvLyB3aWxsIHN0YXJ0IHdp
dGggYSBzbGFzaCkuIExldCdzIGNhbGwgZXZlcnl0aGluZyB0aGUgZmlsZSBuYW1lLgorICAgICAg
ICBmaWxlTmFtZSA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHBhdGguYmVnaW4oKSwgZmlsZUVu
ZCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgZXh0cmFjdFF1ZXJ5S2V5VmFsdWUoY29uc3Qg
Q0hBUiogc3BlYywgVVJMQ29tcG9uZW50JiBxdWVyeSwgVVJMQ29tcG9uZW50JiBrZXksIFVSTENv
bXBvbmVudCYgdmFsdWUpCisgICAgeworICAgICAgICBpZiAocXVlcnkuaXNFbXB0eU9ySW52YWxp
ZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGludCBzdGFydCA9IHF1
ZXJ5LmJlZ2luKCk7CisgICAgICAgIGludCBjdXJyZW50ID0gc3RhcnQ7CisgICAgICAgIGludCBl
bmQgPSBxdWVyeS5lbmQoKTsKKworICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGJlZ2lubmluZyBv
ZiB0aGUgaW5wdXQgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgImtleSIgYW5kIHdlCisgICAgICAg
IC8vIHNraXAgdG8gdGhlIGVuZCBvZiBpdC4KKyAgICAgICAga2V5LnNldEJlZ2luKGN1cnJlbnQp
OworICAgICAgICB3aGlsZSAoY3VycmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdICE9ICcmJyAm
JiBzcGVjW2N1cnJlbnRdICE9ICc9JykKKyAgICAgICAgICAgICsrY3VycmVudDsKKyAgICAgICAg
a2V5LnNldExlbmd0aChjdXJyZW50IC0ga2V5LmJlZ2luKCkpOworCisgICAgICAgIC8vIFNraXAg
dGhlIHNlcGFyYXRvciBhZnRlciB0aGUga2V5IChpZiBhbnkpLgorICAgICAgICBpZiAoY3VycmVu
dCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdID09ICc9JykKKyAgICAgICAgICAgICsrY3VycmVudDsK
KworICAgICAgICAvLyBGaW5kIHRoZSB2YWx1ZSBwYXJ0LgorICAgICAgICB2YWx1ZS5zZXRCZWdp
bihjdXJyZW50KTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgPCBlbmQgJiYgc3BlY1tjdXJyZW50
XSAhPSAnJicpCisgICAgICAgICAgICArK2N1cnJlbnQ7CisgICAgICAgIHZhbHVlLnNldExlbmd0
aChjdXJyZW50IC0gdmFsdWUuYmVnaW4oKSk7CisKKyAgICAgICAgLy8gRmluYWxseSBza2lwIHRo
ZSBuZXh0IHNlcGFyYXRvciBpZiBhbnkKKyAgICAgICAgaWYgKGN1cnJlbnQgPCBlbmQgJiYgc3Bl
Y1tjdXJyZW50XSA9PSAnJicpCisgICAgICAgICAgICArK2N1cnJlbnQ7CisKKyAgICAgICAgLy8g
U2F2ZSB0aGUgbmV3IHF1ZXJ5CisgICAgICAgIHF1ZXJ5ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFu
Z2UoY3VycmVudCwgZW5kKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisvLyBGSVhN
RTogVGhpcyBzaG91bGQgYmUgcHJvdGVjdGVkIG9yIHByaXZhdGUuCitwdWJsaWM6CisgICAgLy8g
V2UgdHJlYXQgc2xhc2hlcyBhbmQgYmFja3NsYXNoZXMgdGhlIHNhbWUgZm9yIElFIGNvbXBhdGli
aWxpdHkuCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVVJMU2xhc2goQ0hBUiBjaCkKKyAgICB7
CisgICAgICAgIHJldHVybiBjaCA9PSAnLycgfHwgY2ggPT0gJ1xcJzsKKyAgICB9CisKKyAgICAv
LyBSZXR1cm5zIHRydWUgaWYgd2Ugc2hvdWxkIHRyaW0gdGhpcyBjaGFyYWN0ZXIgZnJvbSB0aGUg
VVJMIGJlY2F1c2UgaXQgaXMgYQorICAgIC8vIHNwYWNlIG9yIGEgY29udHJvbCBjaGFyYWN0ZXIu
CisgICAgc3RhdGljIGlubGluZSBib29sIHNob3VsZFRyaW1Gcm9tVVJMKENIQVIgY2gpCisgICAg
eworICAgICAgICByZXR1cm4gY2ggPD0gJyAnOworICAgIH0KKworICAgIC8vIEdpdmVuIGFuIGFs
cmVhZHktaW5pdGlhbGl6ZWQgYmVnaW4gaW5kZXggYW5kIHNwZWNMZW5ndGgsIHRoaXMgc2hyaW5r
cyB0aGUgcmFuZ2UKKyAgICAvLyB0byBlbGltaW5hdGUgInNob3VsZC1iZS10cmltbWVkIiBjaGFy
YWN0ZXJzLiBOb3RlIHRoYXQgdGhlIHNwZWNMZW5ndGggZG9lcyAqbm90KgorICAgIC8vIGluZGlj
YXRlIHRoZSBzcGVjTGVuZ3RoIG9mIHVudHJpbW1lZCBkYXRhIGZyb20gfGJlZ2lufCwgYnV0IHJh
dGhlciB0aGUgcG9zaXRpb24KKyAgICAvLyBpbiB0aGUgaW5wdXQgc3RyaW5nIChzbyB0aGUgc3Ry
aW5nIHN0YXJ0cyBhdCBjaGFyYWN0ZXIgfGJlZ2lufCBpbiB0aGUgc3BlYywKKyAgICAvLyBhbmQg
Z29lcyB1bnRpbCB8c3BlY0xlbmd0aHwpLgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmltVVJM
KGNvbnN0IENIQVIqIHNwZWMsIGludCYgYmVnaW4sIGludCYgc3BlY0xlbmd0aCkKKyAgICB7Cisg
ICAgICAgIC8vIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJz
LgorICAgICAgICB3aGlsZSAoYmVnaW4gPCBzcGVjTGVuZ3RoICYmIHNob3VsZFRyaW1Gcm9tVVJM
KHNwZWNbYmVnaW5dKSkKKyAgICAgICAgICAgICsrYmVnaW47CisKKyAgICAgICAgLy8gU3RyaXAg
dHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLiBXZSBuZWVkIHRoZSA+
aSB0ZXN0IGZvcgorICAgICAgICAvLyB3aGVuIHRoZSBpbnB1dCBzdHJpbmcgaXMgYWxsIGJsYW5r
czsgd2UgZG9uJ3Qgd2FudCB0byBiYWNrIHBhc3QgdGhlIGlucHV0LgorICAgICAgICB3aGlsZSAo
c3BlY0xlbmd0aCA+IGJlZ2luICYmIHNob3VsZFRyaW1Gcm9tVVJMKHNwZWNbc3BlY0xlbmd0aCAt
IDFdKSkKKyAgICAgICAgICAgIC0tc3BlY0xlbmd0aDsKKyAgICB9CisKKyAgICAvLyBDb3VudHMg
dGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBzbGFzaGVzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBv
ZmZzZXQKKyAgICAvLyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIHRoZSBnaXZlbiBsZW5ndGguCisg
ICAgc3RhdGljIGlubGluZSBpbnQgY29uc2VjdXRpdmVTbGFzaGVzKGNvbnN0IENIQVIgKnN0cmlu
ZywgaW50IGJlZ2luT2Zmc2V0LCBpbnQgc3RyaW5nTGVuZ3RoKQorICAgIHsKKyAgICAgICAgaW50
IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGJlZ2luT2Zmc2V0ICsgY291bnQgPCBzdHJpbmdM
ZW5ndGggJiYgaXNVUkxTbGFzaChzdHJpbmdbYmVnaW5PZmZzZXQgKyBjb3VudF0pKQorICAgICAg
ICAgICAgKytjb3VudDsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworcHJpdmF0ZToK
KyAgICAvLyBVUkxQYXJzZXIgY2Fubm90IGJlIGNvbnN0cnVjdGVkLgorICAgIFVSTFBhcnNlcigp
OworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxp
ZCBkaWdpdCB0byB1c2UgaW4gYSBwb3J0LgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1BvcnRE
aWdpdChDSEFSIGNoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAn
OSc7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGF1dGhv
cml0eSB0ZXJtaW5hdG9yIGluIHRoZSBpbnB1dCBzdGFydGluZworICAgIC8vIGZyb20gc3RhcnRP
ZmZzZXQuIElmIG5vIHRlcm1pbmF0b3IgaXMgZm91bmQsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBi
ZSBlcXVhbAorICAgIC8vIHRvIHNwZWNMZW5ndGguCisgICAgc3RhdGljIGludCBuZXh0QXV0aG9y
aXR5VGVybWluYXRvcihjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3RhcnRPZmZzZXQsIGludCBzcGVj
TGVuZ3RoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0T2Zmc2V0OyBpIDwgc3Bl
Y0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXNQb3NzaWJsZUF1dGhvcml0eVRlcm1p
bmF0b3Ioc3BlY1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHNwZWNMZW5ndGg7IC8vIE5vdCBmb3VuZC4KKyAgICB9CisKKyAgICBzdGF0
aWMgdm9pZCBwYXJzZVVzZXJJbmZvKGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0IFVSTENvbXBvbmVu
dCYgdXNlciwgVVJMQ29tcG9uZW50JiB1c2VybmFtZSwgVVJMQ29tcG9uZW50JiBwYXNzd29yZCkK
KyAgICB7CisgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGNvbG9uIGluIHRoZSB1c2VyIHNlY3Rp
b24sIHdoaWNoIHNlcGFyYXRlcyB0aGUgdXNlcm5hbWUgYW5kCisgICAgICAgIC8vIHBhc3N3b3Jk
LgorICAgICAgICBpbnQgY29sb25PZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAoY29sb25PZmZz
ZXQgPCB1c2VyLmxlbmd0aCgpICYmIHNwZWNbdXNlci5iZWdpbigpICsgY29sb25PZmZzZXRdICE9
ICc6JykKKyAgICAgICAgICAgICsrY29sb25PZmZzZXQ7CisKKyAgICAgICAgaWYgKGNvbG9uT2Zm
c2V0IDwgdXNlci5sZW5ndGgoKSkgeworICAgICAgICAgICAgLy8gRm91bmQgc2VwYXJhdG9yOiA8
dXNlcm5hbWU+OjxwYXNzd29yZD4KKyAgICAgICAgICAgIHVzZXJuYW1lID0gVVJMQ29tcG9uZW50
KHVzZXIuYmVnaW4oKSwgY29sb25PZmZzZXQpOworICAgICAgICAgICAgcGFzc3dvcmQgPSBVUkxD
b21wb25lbnQ6OmZyb21SYW5nZSh1c2VyLmJlZ2luKCkgKyBjb2xvbk9mZnNldCArIDEsIHVzZXIu
YmVnaW4oKSArIHVzZXIubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
Ly8gTm8gc2VwYXJhdG9yLCB0cmVhdCBldmVyeXRoaW5nIGFzIHRoZSB1c2VybmFtZQorICAgICAg
ICAgICAgdXNlcm5hbWUgPSB1c2VyOworICAgICAgICAgICAgcGFzc3dvcmQgPSBVUkxDb21wb25l
bnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHBhcnNlU2VydmVySW5m
byhjb25zdCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIHNlcnZlckluZm8sIFVSTENv
bXBvbmVudCYgaG9zdCwgVVJMQ29tcG9uZW50JiBwb3J0KQorICAgIHsKKyAgICAgICAgaWYgKCFz
ZXJ2ZXJJbmZvLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAvLyBObyBzZXJ2ZXIgaW5mbywgaG9z
dCBuYW1lIGlzIGVtcHR5LgorICAgICAgICAgICAgaG9zdC5yZXNldCgpOworICAgICAgICAgICAg
cG9ydC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gSWYgdGhlIGhvc3Qgc3RhcnRzIHdpdGggYSBsZWZ0LWJyYWNrZXQsIGFzc3VtZSB0aGUgZW50
aXJlIGhvc3QgaXMgYW4KKyAgICAgICAgLy8gSVB2NiBsaXRlcmFsLiAgT3RoZXJ3aXNlLCBhc3N1
bWUgbm9uZSBvZiB0aGUgaG9zdCBpcyBhbiBJUHY2IGxpdGVyYWwuCisgICAgICAgIC8vIFRoaXMg
YXNzdW1wdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gaWYgd2UgZmluZCBhIHJpZ2h0LWJyYWNrZXQu
CisgICAgICAgIC8vCisgICAgICAgIC8vIE91ciBJUHY2IGFkZHJlc3MgY2Fub25pY2FsaXphdGlv
biBjb2RlIHJlcXVpcmVzIGJvdGggYnJhY2tldHMgdG8gZXhpc3QsCisgICAgICAgIC8vIGJ1dCB0
aGUgYWJpbGl0eSB0byBsb2NhdGUgYW4gaW5jb21wbGV0ZSBhZGRyZXNzIGNhbiBzdGlsbCBiZSB1
c2VmdWwuCisgICAgICAgIGludCBpcHY2VGVybWluYXRvciA9IHNwZWNbc2VydmVySW5mby5iZWdp
bigpXSA9PSAnWycgPyBzZXJ2ZXJJbmZvLmVuZCgpIDogLTE7CisgICAgICAgIGludCBjb2xvbiA9
IC0xOworCisgICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgcmlnaHQtYnJhY2tldCwgYW5kIHRoZSBs
YXN0IGNvbG9uLgorICAgICAgICBmb3IgKGludCBpID0gc2VydmVySW5mby5iZWdpbigpOyBpIDwg
c2VydmVySW5mby5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHNwZWNbaV0pIHsK
KyAgICAgICAgICAgIGNhc2UgJ10nOgorICAgICAgICAgICAgICAgIGlwdjZUZXJtaW5hdG9yID0g
aTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzonOgorICAgICAg
ICAgICAgICAgIGNvbG9uID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBpZiAoY29sb24gPiBpcHY2VGVybWluYXRvcikgeworICAgICAgICAgICAg
Ly8gRm91bmQgYSBwb3J0IG51bWJlcjogPGhvc3RuYW1lPjo8cG9ydD4KKyAgICAgICAgICAgIGhv
c3QgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShzZXJ2ZXJJbmZvLmJlZ2luKCksIGNvbG9uKTsK
KyAgICAgICAgICAgIGlmICghaG9zdC5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBob3N0LnJl
c2V0KCk7CisgICAgICAgICAgICBwb3J0ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoY29sb24g
KyAxLCBzZXJ2ZXJJbmZvLmVuZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8v
IE5vIHBvcnQ6IDxob3N0bmFtZT4KKyAgICAgICAgICAgIGhvc3QgPSBzZXJ2ZXJJbmZvOworICAg
ICAgICAgICAgcG9ydC5yZXNldCgpOworICAgICAgICB9CisgICAgfQorfTsKKworfSAvLyBuYW1l
c3BhY2UgV1RGCisKKyNlbmRpZiAvLyBVUkxQYXJzZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>55396</attachid>
            <date>2010-05-07 10:57:14 -0700</date>
            <delta_ts>2010-05-07 11:55:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38572-20100507105713.patch</filename>
            <type>text/plain</type>
            <size>26449</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4OTQxKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTAgQEAKKzIwMTAtMDUtMDcgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBbV1RGVVJMXSBBZGQgY29yZSBVUkwgcGFyc2VyCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODU3MgorCisgICAgICAgIFRo
aXMgcGF0Y2ggYWRkcyB0aGUgY29yZSBvZiB0aGUgVVJMIHBhcnNlci4gIFRoZSBVUkwgcGFyc2Vy
IHVzZXMgYQorICAgICAgICB0ZW1wbGF0ZWQgbm90aW9uIG9mIGEgY29kZSB1bml0IHRvIHN1cHBv
cnQgZGlmZmVyZW50IHN0cmluZyB0eXBlcy4KKyAgICAgICAgTGF0ZXIgd2UnbGwgYWRkIHNvbWUg
bm9uLXRlbXBsYXRlZCBBUElzIHdpdGggY29uY3JldGUgdHlwZXMgdGhhdAorICAgICAgICBjbGll
bnRzIGNhbiB1c2UgbW9yZSBjb252ZW5pZW50bHkuCisKKyAgICAgICAgVGhlIFVSTFBhcnNlciBo
YXMgYSBjb3VwbGUgY2FsbHMgdG8gQVNTRVJUKCksIHdoaWNoIEkndmUgY29tbWVudGVkIG91dAor
ICAgICAgICBmb3Igbm93LiAgSSdtIG5vdCAxMDAlIHN1cmUgaG93IHRvIGhhbmRsZSB0aGUgZGVw
ZW5kZW5jeSBpc3N1ZXMgdGhlcmUKKyAgICAgICAgeWV0LCBzbyBJJ3ZlIHB1bnRlZCBvbiB0aGUg
aXNzdWUgZm9yIG5vdy4KKworICAgICAgICBBbHNvLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgbWV0
aG9kcyB0aGF0IGFyZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhpcworICAgICAgICBwYXRjaCB0aGF0
IGFyZSBvbmx5IHVzZWQgYnkgdGhlIGNhbm9uaWNhbGl6ZXIuICBNeSBwbGFuIGlzIHRvIG1ha2UK
KyAgICAgICAgdGhvc2UgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgYW5kIG1ha2UgdGhlIGNhbm9uaWNh
bGl6ZXIgYSBmcmllbmQgb2YgdGhlCisgICAgICAgIHBhcnNlci4gIFRoZSBkZXRhaWxzIHdpbGwg
YmUgaW4gYSBsYXRlciBwYXRjaC4KKworICAgICAgICAqIHd0Zi91cmwvc3JjL1VSTENvbXBvbmVu
dC5oOgorICAgICAgICAoV1RGOjpVUkxDb21wb25lbnQ6OmZyb21SYW5nZSk6CisgICAgICAgIChX
VEY6OlVSTENvbXBvbmVudDo6aXNOb25FbXB0eSk6CisgICAgICAgIChXVEY6OlVSTENvbXBvbmVu
dDo6aXNFbXB0eU9ySW52YWxpZCk6CisgICAgICAgICogd3RmL3VybC9zcmMvVVJMUGFyc2VyLmg6
IEFkZGVkLgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6Oik6CisgICAgICAgIChXVEY6OlVSTFBh
cnNlcjo6aXNQb3NzaWJsZUF1dGhvcml0eVRlcm1pbmF0b3IpOgorICAgICAgICAoV1RGOjpVUkxQ
YXJzZXI6OnBhcnNlQXV0aG9yaXR5KToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpleHRyYWN0
U2NoZW1lKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZUFmdGVyU2NoZW1lKToKKyAg
ICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJzZVN0YW5kYXJkVVJMKToKKyAgICAgICAgKFdURjo6
VVJMUGFyc2VyOjpwYXJzZVBhdGgpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OnBhcnNlUGF0
aFVSTCk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6cGFyc2VNYWlsdG9VUkwpOgorICAgICAg
ICAoV1RGOjpVUkxQYXJzZXI6OnBhcnNlUG9ydCk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6
ZXh0cmFjdEZpbGVOYW1lKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpleHRyYWN0UXVlcnlL
ZXlWYWx1ZSk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6aXNVUkxTbGFzaCk6CisgICAgICAg
IChXVEY6OlVSTFBhcnNlcjo6c2hvdWxkVHJpbUZyb21VUkwpOgorICAgICAgICAoV1RGOjpVUkxQ
YXJzZXI6OnRyaW1VUkwpOgorICAgICAgICAoV1RGOjpVUkxQYXJzZXI6OmNvbnNlY3V0aXZlU2xh
c2hlcyk6CisgICAgICAgIChXVEY6OlVSTFBhcnNlcjo6aXNQb3J0RGlnaXQpOgorICAgICAgICAo
V1RGOjpVUkxQYXJzZXI6Om5leHRBdXRob3JpdHlUZXJtaW5hdG9yKToKKyAgICAgICAgKFdURjo6
VVJMUGFyc2VyOjpwYXJzZVVzZXJJbmZvKToKKyAgICAgICAgKFdURjo6VVJMUGFyc2VyOjpwYXJz
ZVNlcnZlckluZm8pOgorCiAyMDEwLTA1LTA2ICBGdW1pdG9zaGkgVWthaSAgPHVrYWlAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFsZXhleSBQcm9za3VyeWFrb3YuCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAkocmV2aXNpb24gNTg5
NDApCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdXJsL3NyYy9VUkxDb21wb25lbnQuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzcsMTMgKzM3LDE5IEBAIHB1YmxpYzoKICAgICBVUkxDb21wb25lbnQoKSA6
IG1fYmVnaW4oMCksIG1fbGVuZ3RoKC0xKSB7IH0KICAgICBVUkxDb21wb25lbnQoaW50IGJlZ2lu
LCBpbnQgbGVuZ3RoKSA6IG1fYmVnaW4oYmVnaW4pLCBtX2xlbmd0aChsZW5ndGgpIHsgfQogCisg
ICAgLy8gSGVscGVyIHRoYXQgcmV0dXJucyBhIGNvbXBvbmVudCBjcmVhdGVkIHdpdGggdGhlIGdp
dmVuIGJlZ2luIGFuZCBlbmRpbmcKKyAgICAvLyBwb2ludHMuIFRoZSBlbmRpbmcgcG9pbnQgaXMg
bm9uLWluY2x1c2l2ZS4KKyAgICBzdGF0aWMgaW5saW5lIFVSTENvbXBvbmVudCBmcm9tUmFuZ2Uo
aW50IGJlZ2luLCBpbnQgZW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFVSTENvbXBvbmVudChi
ZWdpbiwgZW5kIC0gYmVnaW4pOworICAgIH0KKwogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlz
IGNvbXBvbmVudCBpcyB2YWxpZCwgbWVhbmluZyB0aGUgbGVuZ3RoIGlzIGdpdmVuLiBFdmVuCiAg
ICAgLy8gdmFsaWQgY29tcG9uZW50cyBtYXkgYmUgZW1wdHkgdG8gcmVjb3JkIHRoZSBmYWN0IHRo
YXQgdGhleSBleGlzdC4KICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0
aCAhPSAtMTsgfQogCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb21wb25lbnQg
aXMgc3BlY2lmaWVkIG9uIGZhbHNlLCB0aGUgY29tcG9uZW50Ci0gICAgLy8gaXMgZWl0aGVyIGVt
cHR5IG9yIGludmFsaWQuCi0gICAgYm9vbCBpc05vbmVtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9s
ZW5ndGggPiAwOyB9CisgICAgYm9vbCBpc05vbkVtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9sZW5n
dGggPiAwOyB9CisgICAgYm9vbCBpc0VtcHR5T3JJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9s
ZW5ndGggPD0gMDsgfQogCiAgICAgdm9pZCByZXNldCgpCiAgICAgewpJbmRleDogSmF2YVNjcmlw
dENvcmUvd3RmL3VybC9zcmMvVVJMUGFyc2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvd3RmL3VybC9zcmMvVVJMUGFyc2VyLmgJKHJldmlzaW9uIDApCisrKyBKYXZhU2NyaXB0Q29y
ZS93dGYvdXJsL3NyYy9VUkxQYXJzZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NzQgQEAK
Ky8qIEJhc2VkIG9uIG5zVVJMUGFyc2Vycy5jYyBmcm9tIE1vemlsbGEKKyAqIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OCBOZXRzY2Fw
ZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KKyAqCisgKiBPdGhlciBjb250cmlidXRvcnM6
CisgKiAgIERhcmluIEZpc2hlciAob3JpZ2luYWwgYXV0aG9yKQorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
KgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNl
ZCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIGVpdGhlciB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5z
ZSBWZXJzaW9uIDEuMSwgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLyAo
dGhlICJNUEwiKSBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24g
Mi4wLCBmb3VuZCBhdCBodHRwOi8vd3d3LmZzZi5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqICh0
aGUgIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBNUEwgb3IgdGhl
IEdQTCBhcmUKKyAqIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdSB3
aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVu
ZGVyIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhvc2UgdHdvCisgKiBsaWNlbnNlcyAodGhlIE1QTCBv
ciB0aGUgR1BMKSBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lv
biBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIExHUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkK
KyAqIGRlbGV0aW5ndGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRo
ZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBNUEwgb3Ig
dGhlIEdQTCwgYXMgdGhlIGNhc2UgbWF5IGJlLgorICogSWYgeW91IGRvIG5vdCBkZWxldGUgdGhl
IHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogdmVyc2lvbiBv
ZiB0aGlzIGZpbGUgdW5kZXIgYW55IG9mIHRoZSBMR1BMLCB0aGUgTVBMIG9yIHRoZSBHUEwuCisg
Ki8KKworI2lmbmRlZiBVUkxQYXJzZXJfaAorI2RlZmluZSBVUkxQYXJzZXJfaAorCisjaW5jbHVk
ZSAiVVJMQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiVVJMU2VnbWVudHMuaCIKKworbmFtZXNwYWNl
IFdURiB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIENIQVI+CitjbGFzcyBVUkxQYXJzZXIgeworcHVi
bGljOgorICAgIGVudW0gU3BlY2lhbFBvcnQgeworICAgICAgICBVbnNwZWNpZmllZFBvcnQgPSAt
MSwKKyAgICAgICAgSW52YWxpZFBvcnQgPSAtMiwKKyAgICB9OworCisgICAgLy8gVGhpcyBoYW5k
bGVzIGV2ZXJ5dGhpbmcgdGhhdCBtYXkgYmUgYW4gYXV0aG9yaXR5IHRlcm1pbmF0b3IsIGluY2x1
ZGluZworICAgIC8vIGJhY2tzbGFzaC4gRm9yIHNwZWNpYWwgYmFja3NsYXNoIGhhbmRsaW5nIHNl
ZSBwYXJzZUFmdGVyU2NoZW1lLgorICAgIHN0YXRpYyBib29sIGlzUG9zc2libGVBdXRob3JpdHlU
ZXJtaW5hdG9yKENIQVIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gaXNVUkxTbGFzaChjaCkg
fHwgY2ggPT0gJz8nIHx8IGNoID09ICcjJyB8fCBjaCA9PSAnOyc7CisgICAgfQorCisgICAgLy8g
R2l2ZW4gYW4gYWxyZWFkeS1pZGVudGlmaWVkIGF1dGggc2VjdGlvbiwgYnJlYWtzIGl0IGludG8g
aXRzIGNvbnN0aXR1ZW50CisgICAgLy8gcGFydHMuIFRoZSBwb3J0IG51bWJlciB3aWxsIGJlIHBh
cnNlZCBhbmQgdGhlIHJlc3VsdGluZyBpbnRlZ2VyIHdpbGwgYmUKKyAgICAvLyBmaWxsZWQgaW50
byB0aGUgZ2l2ZW4gKnBvcnQgdmFyaWFibGUsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHBvcnQgbnVt
YmVyIG9yIGl0CisgICAgLy8gaXMgaW52YWxpZC4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZUF1dGhv
cml0eShjb25zdCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25lbnQmIGF1dGgsIFVSTENvbXBv
bmVudCYgdXNlcm5hbWUsIFVSTENvbXBvbmVudCYgcGFzc3dvcmQsIFVSTENvbXBvbmVudCYgaG9z
dCwgVVJMQ29tcG9uZW50JiBwb3J0KQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NF
UlQoYXV0aC5pc1ZhbGlkKCkpOyAvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhbiBhdXRob3JpdHku
CisgICAgICAgIGlmICghYXV0aC5sZW5ndGgoKSkgeworICAgICAgICAgICAgdXNlcm5hbWUucmVz
ZXQoKTsKKyAgICAgICAgICAgIHBhc3N3b3JkLnJlc2V0KCk7CisgICAgICAgICAgICBob3N0LnJl
c2V0KCk7CisgICAgICAgICAgICBwb3J0LnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBTZWFyY2ggYmFja3dhcmRzIGZvciBALCB3aGljaCBpcyB0
aGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIHVzZXIgaW5mbyBhbmQKKyAgICAgICAgLy8gdGhlIHNl
cnZlciBpbmZvLiAgUkZDIDM5ODYgZm9yYmlkcyBAIGZyb20gb2NjdXJpbmcgaW4gYXV0aCwgYnV0
IHNvbWVvbmUKKyAgICAgICAgLy8gbWlnaHQgaW5jbHVkZSBpdCBpbiBhIHBhc3N3b3JkIHVuZXNj
YXBlZC4KKyAgICAgICAgaW50IGkgPSBhdXRoLmJlZ2luKCkgKyBhdXRoLmxlbmd0aCgpIC0gMTsK
KyAgICAgICAgd2hpbGUgKGkgPiBhdXRoLmJlZ2luKCkgJiYgc3BlY1tpXSAhPSAnQCcpCisgICAg
ICAgICAgICAtLWk7CisKKyAgICAgICAgaWYgKHNwZWNbaV0gPT0gJ0AnKSB7CisgICAgICAgICAg
ICAvLyBGb3VuZCB1c2VyIGluZm86IDx1c2VyLWluZm8+QDxzZXJ2ZXItaW5mbz4KKyAgICAgICAg
ICAgIHBhcnNlVXNlckluZm8oc3BlYywgVVJMQ29tcG9uZW50KGF1dGguYmVnaW4oKSwgaSAtIGF1
dGguYmVnaW4oKSksIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICBwYXJzZVNlcnZl
ckluZm8oc3BlYywgVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoaSArIDEsIGF1dGguYmVnaW4oKSAr
IGF1dGgubGVuZ3RoKCkpLCBob3N0LCBwb3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIC8vIE5vIHVzZXIgaW5mbywgZXZlcnl0aGluZyBpcyBzZXJ2ZXIgaW5mby4KKyAgICAgICAg
ICAgIHVzZXJuYW1lLnJlc2V0KCk7CisgICAgICAgICAgICBwYXNzd29yZC5yZXNldCgpOworICAg
ICAgICAgICAgcGFyc2VTZXJ2ZXJJbmZvKHNwZWMsIGF1dGgsIGhvc3QsIHBvcnQpOworICAgICAg
ICB9CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgZXh0cmFjdFNjaGVtZShjb25zdCBDSEFSKiBz
cGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMQ29tcG9uZW50JiBzY2hlbWUpCisgICAgeworICAgICAg
ICAvLyBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAg
ICAgICBpbnQgYmVnaW4gPSAwOworICAgICAgICB3aGlsZSAoYmVnaW4gPCBzcGVjTGVuZ3RoICYm
IHNob3VsZFRyaW1Gcm9tVVJMKHNwZWNbYmVnaW5dKSkKKyAgICAgICAgICAgIGJlZ2luKys7Cisg
ICAgICAgIGlmIChiZWdpbiA9PSBzcGVjTGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OyAvLyBJbnB1dCBpcyBlbXB0eSBvciBhbGwgd2hpdGVzcGFjZS4KKworICAgICAgICAvLyBGaW5k
IHRoZSBmaXJzdCBjb2xvbiBjaGFyYWN0ZXIuCisgICAgICAgIGZvciAoaW50IGkgPSBiZWdpbjsg
aSA8IHNwZWNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNwZWNbaV0gPT0gJzonKSB7
CisgICAgICAgICAgICAgICAgc2NoZW1lID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UoYmVnaW4s
IGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gY29sb24gZm91bmQ6IG5vIHNjaGVtZQor
ICAgIH0KKworICAgIC8vIEZpbGxzIGluIGFsbCBtZW1iZXJzIG9mIHRoZSBVUkxTZWdtZW50cyBz
dHJ1Y3R1cmUgKGV4Y2VwdCBmb3IgdGhlCisgICAgLy8gc2NoZW1lKSBmb3Igc3RhbmRhcmQgVVJM
cy4KKyAgICAvLworICAgIC8vIHxzcGVjfCBpcyB0aGUgZnVsbCBzcGVjIGJlaW5nIHBhcnNlZCwg
b2YgbGVuZ3RoIHxzcGVjTGVuZ3RofC4KKyAgICAvLyB8YWZ0ZXJTY2hlbWV8IGlzIHRoZSBjaGFy
YWN0ZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBzY2hlbWUgKGFmdGVyIHRoZQorICAgIC8v
ICAgY29sb24pIHdoZXJlIHdlJ2xsIGJlZ2luIHBhcnNpbmcuCisgICAgc3RhdGljIHZvaWQgcGFy
c2VBZnRlclNjaGVtZShjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgaW50IGFmdGVy
U2NoZW1lLCBVUkxTZWdtZW50cyYgcGFyc2VkKQorICAgIHsKKyAgICAgICAgaW50IG51bWJlck9m
U2xhc2hlcyA9IGNvbnNlY3V0aXZlU2xhc2hlcyhzcGVjLCBhZnRlclNjaGVtZSwgc3BlY0xlbmd0
aCk7CisgICAgICAgIGludCBhZnRlclNsYXNoZXMgPSBhZnRlclNjaGVtZSArIG51bWJlck9mU2xh
c2hlczsKKworICAgICAgICAvLyBGaXJzdCBzcGxpdCBpbnRvIHR3byBtYWluIHBhcnRzLCB0aGUg
YXV0aG9yaXR5ICh1c2VybmFtZSwgcGFzc3dvcmQsIGhvc3QsCisgICAgICAgIC8vIGFuZCBwb3J0
KSBhbmQgdGhlIGZ1bGwgcGF0aCAocGF0aCwgcXVlcnksIGFuZCByZWZlcmVuY2UpLgorICAgICAg
ICBVUkxDb21wb25lbnQgYXV0aG9yaXR5OworICAgICAgICBVUkxDb21wb25lbnQgZnVsbFBhdGg7
CisKKyAgICAgICAgLy8gRm91bmQgIi8vPHNvbWUgZGF0YT4iLCBsb29rcyBsaWtlIGFuIGF1dGhv
cml0eSBzZWN0aW9uLiBUcmVhdCBldmVyeXRoaW5nCisgICAgICAgIC8vIGZyb20gdGhlcmUgdG8g
dGhlIG5leHQgc2xhc2ggKG9yIGVuZCBvZiBzcGVjKSB0byBiZSB0aGUgYXV0aG9yaXR5LiBOb3Rl
CisgICAgICAgIC8vIHRoYXQgd2UgaWdub3JlIHRoZSBudW1iZXIgb2Ygc2xhc2hlcyBhbmQgdHJl
YXQgaXQgYXMgdGhlIGF1dGhvcml0eS4KKyAgICAgICAgaW50IGF1dGhFbmQgPSBuZXh0QXV0aG9y
aXR5VGVybWluYXRvcihzcGVjLCBhZnRlclNsYXNoZXMsIHNwZWNMZW5ndGgpOworICAgICAgICBh
dXRob3JpdHkgPSBVUkxDb21wb25lbnQoYWZ0ZXJTbGFzaGVzLCBhdXRoRW5kIC0gYWZ0ZXJTbGFz
aGVzKTsKKworICAgICAgICBpZiAoYXV0aEVuZCA9PSBzcGVjTGVuZ3RoKSAvLyBObyBiZWdpbm5p
bmcgb2YgcGF0aCBmb3VuZC4KKyAgICAgICAgICAgIGZ1bGxQYXRoID0gVVJMQ29tcG9uZW50KCk7
CisgICAgICAgIGVsc2UgLy8gRXZlcnl0aGluZyBzdGFydGluZyBmcm9tIHRoZSBzbGFzaCB0byB0
aGUgZW5kIGlzIHRoZSBwYXRoLgorICAgICAgICAgICAgZnVsbFBhdGggPSBVUkxDb21wb25lbnQo
YXV0aEVuZCwgc3BlY0xlbmd0aCAtIGF1dGhFbmQpOworCisgICAgICAgIC8vIE5vdyBwYXJzZSB0
aG9zZSB0d28gc3ViLXBhcnRzLgorICAgICAgICBwYXJzZUF1dGhvcml0eShzcGVjLCBhdXRob3Jp
dHksIHBhcnNlZC51c2VybmFtZSwgcGFyc2VkLnBhc3N3b3JkLCBwYXJzZWQuaG9zdCwgcGFyc2Vk
LnBvcnQpOworICAgICAgICBwYXJzZVBhdGgoc3BlYywgZnVsbFBhdGgsIHBhcnNlZC5wYXRoLCBw
YXJzZWQucXVlcnksIHBhcnNlZC5mcmFnbWVudCk7CisgICAgfQorCisgICAgLy8gVGhlIG1haW4g
cGFyc2luZyBmdW5jdGlvbiBmb3Igc3RhbmRhcmQgVVJMcy4gU3RhbmRhcmQgVVJMcyBoYXZlIGEg
c2NoZW1lLAorICAgIC8vIGhvc3QsIHBhdGgsIGV0Yy4KKyAgICBzdGF0aWMgdm9pZCBwYXJzZVN0
YW5kYXJkVVJMKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3RoLCBVUkxTZWdtZW50cyYg
cGFyc2VkKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NFUlQoc3BlY0xlbmd0aCA+
PSAwKTsKKworICAgICAgICAvLyBTdHJpcCBsZWFkaW5nICYgdHJhaWxpbmcgc3BhY2VzIGFuZCBj
b250cm9sIGNoYXJhY3RlcnMuCisgICAgICAgIGludCBiZWdpbiA9IDA7CisgICAgICAgIHRyaW1V
Ukwoc3BlYywgYmVnaW4sIHNwZWNMZW5ndGgpOworCisgICAgICAgIGludCBhZnRlclNjaGVtZTsK
KyAgICAgICAgaWYgKGV4dHJhY3RTY2hlbWUoc3BlYywgc3BlY0xlbmd0aCwgcGFyc2VkLnNjaGVt
ZSkpCisgICAgICAgICAgICBhZnRlclNjaGVtZSA9IHBhcnNlZC5zY2hlbWUuZW5kKCkgKyAxOyAv
LyBTa2lwIHBhc3QgdGhlIGNvbG9uLgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNh
eSB0aGVyZSdzIG5vIHNjaGVtZSB3aGVuIHRoZXJlIGlzIGEgY29sb24uIFdlIGNvdWxkIGFsc28g
c2F5IHRoYXQKKyAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgdGhlIHNjaGVtZS4gQm90aCB3
b3VsZCBwcm9kdWNlIGFuIGludmFsaWQgVVJMLCBidXQgdGhpcyB3YXkKKyAgICAgICAgICAgIC8v
IHNlZW1zIGxlc3Mgd3JvbmcgaW4gbW9yZSBjYXNlcy4KKyAgICAgICAgICAgIHBhcnNlZC5zY2hl
bWUucmVzZXQoKTsKKyAgICAgICAgICAgIGFmdGVyU2NoZW1lID0gYmVnaW47CisgICAgICAgIH0K
KyAgICAgICAgcGFyc2VBZnRlclNjaGVtZShzcGVjLCBzcGVjTGVuZ3RoLCBhZnRlclNjaGVtZSwg
cGFyc2VkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwYXJzZVBhdGgoY29uc3QgQ0hBUiog
c3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiBwYXRoLCBVUkxDb21wb25lbnQmIGZpbGVwYXRoLCBV
UkxDb21wb25lbnQmIHF1ZXJ5LCBVUkxDb21wb25lbnQmIGZyYWdtZW50KQorICAgIHsKKyAgICAg
ICAgLy8gcGF0aCA9IFsvXTxzZWdtZW50MT4vPHNlZ21lbnQyPi88Li4uPi88c2VnbWVudE4+Ozxw
YXJhbT4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZW4g
dGhlcmUgaXMgbm8gcGF0aC4KKyAgICAgICAgaWYgKCFwYXRoLmlzVmFsaWQoKSkgeworICAgICAg
ICAgICAgZmlsZXBhdGgucmVzZXQoKTsKKyAgICAgICAgICAgIHF1ZXJ5LnJlc2V0KCk7CisgICAg
ICAgICAgICBmcmFnbWVudC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgICAgIC8vIEZJWE1FOiBhZGQgQVNTRVJUKHBhdGgubGVuZ3RoKCkgPiAwKTsgLy8gV2Ug
c2hvdWxkIG5ldmVyIGhhdmUgMCBsZW5ndGggcGF0aHMuCisKKyAgICAgICAgLy8gU2VhcmNoIGZv
ciBmaXJzdCBvY2N1cnJlbmNlIG9mIGVpdGhlciA/IG9yICMuCisgICAgICAgIGludCBwYXRoRW5k
ID0gcGF0aC5iZWdpbigpICsgcGF0aC5sZW5ndGgoKTsKKworICAgICAgICBpbnQgcXVlcnlTZXBh
cmF0b3IgPSAtMTsgLy8gSW5kZXggb2YgdGhlICc/JworICAgICAgICBpbnQgcmVmU2VwYXJhdG9y
ID0gLTE7IC8vIEluZGV4IG9mIHRoZSAnIycKKyAgICAgICAgZm9yIChpbnQgaSA9IHBhdGguYmVn
aW4oKTsgaSA8IHBhdGhFbmQ7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChzcGVjW2ldKSB7
CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICBpZiAocXVlcnlTZXBhcmF0
b3IgPCAwKQorICAgICAgICAgICAgICAgICAgICBxdWVyeVNlcGFyYXRvciA9IGk7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICBy
ZWZTZXBhcmF0b3IgPSBpOworICAgICAgICAgICAgICAgIGkgPSBwYXRoRW5kOyAvLyBCcmVhayBv
dXQgb2YgdGhlIGxvb3AuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgLy8gTWFya2VycyBwb2ludGluZyB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIGVhY2gg
b2YgdGhlc2UgY29ycmVzcG9uZGluZworICAgICAgICAvLyBjb21wb25lbnRzLiBUaGUgY29kZSBi
ZWxvdyB3b3JrcyBmcm9tIHRoZSBlbmQgYmFjayB0byB0aGUgYmVnaW5uaW5nLAorICAgICAgICAv
LyBhbmQgd2lsbCB1cGRhdGUgdGhlc2UgaW5kaWNlcyBhcyBpdCBmaW5kcyBjb21wb25lbnRzIHRo
YXQgZXhpc3QuCisgICAgICAgIGludCBmaWxlRW5kLCBxdWVyeUVuZDsKKworICAgICAgICAvLyBG
cmFnbWVudDogZnJvbSB0aGUgIyB0byB0aGUgZW5kIG9mIHRoZSBwYXRoLgorICAgICAgICBpZiAo
cmVmU2VwYXJhdG9yID49IDApIHsKKyAgICAgICAgICAgIGZpbGVFbmQgPSByZWZTZXBhcmF0b3I7
CisgICAgICAgICAgICBxdWVyeUVuZCA9IHJlZlNlcGFyYXRvcjsKKyAgICAgICAgICAgIGZyYWdt
ZW50ID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocmVmU2VwYXJhdG9yICsgMSwgcGF0aEVuZCk7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlRW5kID0gcGF0aEVuZDsKKyAgICAg
ICAgICAgIHF1ZXJ5RW5kID0gcGF0aEVuZDsKKyAgICAgICAgICAgIGZyYWdtZW50LnJlc2V0KCk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBRdWVyeSBmcmFnbWVudDogZXZlcnl0aGluZyBmcm9t
IHRoZSA/IHRvIHRoZSBuZXh0IGJvdW5kYXJ5IChlaXRoZXIgdGhlIGVuZAorICAgICAgICAvLyBv
ZiB0aGUgcGF0aCBvciB0aGUgZnJhZ21lbnQgZnJhZ21lbnQpLgorICAgICAgICBpZiAocXVlcnlT
ZXBhcmF0b3IgPj0gMCkgeworICAgICAgICAgICAgZmlsZUVuZCA9IHF1ZXJ5U2VwYXJhdG9yOwor
ICAgICAgICAgICAgcXVlcnkgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShxdWVyeVNlcGFyYXRv
ciArIDEsIHF1ZXJ5RW5kKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBxdWVyeS5yZXNl
dCgpOworCisgICAgICAgIC8vIEZpbGUgcGF0aDogdHJlYXQgYW4gZW1wdHkgZmlsZSBwYXRoIGFz
IG5vIGZpbGUgcGF0aC4KKyAgICAgICAgaWYgKGZpbGVFbmQgIT0gcGF0aC5iZWdpbigpKQorICAg
ICAgICAgICAgZmlsZXBhdGggPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShwYXRoLmJlZ2luKCks
IGZpbGVFbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmaWxlcGF0aC5yZXNldCgpOwor
ICAgIH0KKworICAgIC8vIEluaXRpYWxpemVzIGEgcGF0aCBVUkwgd2hpY2ggaXMgbWVyZWx5IGEg
c2NoZW1lIGZvbGxvd2VkIGJ5IGEgcGF0aC4gRXhhbXBsZXMKKyAgICAvLyBpbmNsdWRlICJhYm91
dDpmb28iIGFuZCAiamF2YXNjcmlwdDphbGVydCgnYmFyJyk7IgorICAgIHN0YXRpYyB2b2lkIHBh
cnNlUGF0aFVSTChjb25zdCBDSEFSKiBzcGVjLCBpbnQgc3BlY0xlbmd0aCwgVVJMU2VnbWVudHMm
IHBhcnNlZCkKKyAgICB7CisgICAgICAgIC8vIEdldCB0aGUgbm9uLXBhdGggYW5kIG5vbi1zY2hl
bWUgcGFydHMgb2YgdGhlIFVSTCBvdXQgb2YgdGhlIHdheSwgd2UgbmV2ZXIKKyAgICAgICAgLy8g
dXNlIHRoZW0uCisgICAgICAgIHBhcnNlZC51c2VybmFtZS5yZXNldCgpOworICAgICAgICBwYXJz
ZWQucGFzc3dvcmQucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLmhvc3QucmVzZXQoKTsKKyAgICAg
ICAgcGFyc2VkLnBvcnQucmVzZXQoKTsKKyAgICAgICAgcGFyc2VkLnF1ZXJ5LnJlc2V0KCk7Cisg
ICAgICAgIHBhcnNlZC5mcmFnbWVudC5yZXNldCgpOworCisgICAgICAgIC8vIFN0cmlwIGxlYWRp
bmcgJiB0cmFpbGluZyBzcGFjZXMgYW5kIGNvbnRyb2wgY2hhcmFjdGVycy4KKyAgICAgICAgLy8g
RklYTUU6IFBlcmhhcHMgdGhpcyBpcyB1bm5lY2Vzc2FyeT8KKyAgICAgICAgaW50IGJlZ2luID0g
MDsKKyAgICAgICAgdHJpbVVSTChzcGVjLCBiZWdpbiwgc3BlY0xlbmd0aCk7CisKKyAgICAgICAg
Ly8gSGFuZGxlIGVtcHR5IHNwZWNzIG9yIG9uZXMgdGhhdCBjb250YWluIG9ubHkgd2hpdGVzcGFj
ZSBvciBjb250cm9sIGNoYXJzLgorICAgICAgICBpZiAoYmVnaW4gPT0gc3BlY0xlbmd0aCkgewor
ICAgICAgICAgICAgcGFyc2VkLnNjaGVtZS5yZXNldCgpOworICAgICAgICAgICAgcGFyc2VkLnBh
dGgucmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IEV4dHJhY3QgdGhlIHNjaGVtZSwgd2l0aCB0aGUgcGF0aCBiZWluZyBldmVyeXRoaW5nIGZvbGxv
d2luZy4gV2UgYWxzbworICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMg
bm8gc2NoZW1lLgorICAgICAgICBpZiAoZXh0cmFjdFNjaGVtZSgmc3BlY1tiZWdpbl0sIHNwZWNM
ZW5ndGggLSBiZWdpbiwgcGFyc2VkLnNjaGVtZSkpIHsKKyAgICAgICAgICAgIC8vIE9mZnNldCB0
aGUgcmVzdWx0cyBzaW5jZSB3ZSBnYXZlIGV4dHJhY3RTY2hlbWUgYSBzdWJzdHJpbmcuCisgICAg
ICAgICAgICBwYXJzZWQuc2NoZW1lLnNldEJlZ2luKHBhcnNlZC5zY2hlbWUuYmVnaW4oKSArIGJl
Z2luKTsKKworICAgICAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc3RhbmRh
cmQgVVJMIHBhcnNlciwgd2UgdHJlYXQgbm8gcGF0aCBhcworICAgICAgICAgICAgLy8gLTEsIHJh
dGhlciB0aGFuIGhhdmluZyBhIGxlbmd0aCBvZiAwICh3ZSBub3JtYWxseSB3b3VsZG4ndCBjYXJl
IHNvCisgICAgICAgICAgICAvLyBtdWNoIGZvciB0aGVzZSBub24tc3RhbmRhcmQgVVJMcykuCisg
ICAgICAgICAgICBpZiAocGFyc2VkLnNjaGVtZS5lbmQoKSA9PSBzcGVjTGVuZ3RoIC0gMSkKKyAg
ICAgICAgICAgICAgICBwYXJzZWQucGF0aC5yZXNldCgpOworICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgIHBhcnNlZC5wYXRoID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFuZ2UocGFyc2Vk
LnNjaGVtZS5lbmQoKSArIDEsIHNwZWNMZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgLy8gTm8gc2NoZW1lIGZvdW5kLCBqdXN0IHBhdGguCisgICAgICAgICAgICBwYXJzZWQu
c2NoZW1lLnJlc2V0KCk7CisgICAgICAgICAgICBwYXJzZWQucGF0aCA9IFVSTENvbXBvbmVudDo6
ZnJvbVJhbmdlKGJlZ2luLCBzcGVjTGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0
YXRpYyB2b2lkIHBhcnNlTWFpbHRvVVJMKGNvbnN0IENIQVIqIHNwZWMsIGludCBzcGVjTGVuZ3Ro
LCBVUkxTZWdtZW50cyYgcGFyc2VkKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IGFkZCBBU1NF
UlQoc3BlY0xlbmd0aCA+PSAwKTsKKworICAgICAgICAvLyBHZXQgdGhlIG5vbi1wYXRoIGFuZCBu
b24tc2NoZW1lIHBhcnRzIG9mIHRoZSBVUkwgb3V0IG9mIHRoZSB3YXksIHdlIG5ldmVyCisgICAg
ICAgIC8vIHVzZSB0aGVtLgorICAgICAgICBwYXJzZWQudXNlcm5hbWUucmVzZXQoKTsKKyAgICAg
ICAgcGFyc2VkLnBhc3N3b3JkLnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC5ob3N0LnJlc2V0KCk7
CisgICAgICAgIHBhcnNlZC5wb3J0LnJlc2V0KCk7CisgICAgICAgIHBhcnNlZC5mcmFnbWVudC5y
ZXNldCgpOworICAgICAgICBwYXJzZWQucXVlcnkucmVzZXQoKTsgLy8gTWF5IHVzZSB0aGlzOyBy
ZXNldCBmb3IgY29udmVuaWVuY2UuCisKKyAgICAgICAgLy8gU3RyaXAgbGVhZGluZyAmIHRyYWls
aW5nIHNwYWNlcyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAgICAgICBpbnQgYmVnaW4gPSAw
OworICAgICAgICB0cmltVVJMKHNwZWMsIGJlZ2luLCBzcGVjTGVuZ3RoKTsKKworICAgICAgICAv
LyBIYW5kbGUgZW1wdHkgc3BlY3Mgb3Igb25lcyB0aGF0IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNl
IG9yIGNvbnRyb2wgY2hhcnMuCisgICAgICAgIGlmIChiZWdpbiA9PSBzcGVjTGVuZ3RoKSB7Cisg
ICAgICAgICAgICBwYXJzZWQuc2NoZW1lLnJlc2V0KCk7CisgICAgICAgICAgICBwYXJzZWQucGF0
aC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50
IHBhdGhCZWdpbiA9IC0xOworICAgICAgICBpbnQgcGF0aEVuZCA9IC0xOworCisgICAgICAgIC8v
IEV4dHJhY3QgdGhlIHNjaGVtZSwgd2l0aCB0aGUgcGF0aCBiZWluZyBldmVyeXRoaW5nIGZvbGxv
d2luZy4gV2UgYWxzbworICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMg
bm8gc2NoZW1lLgorICAgICAgICBpZiAoZXh0cmFjdFNjaGVtZSgmc3BlY1tiZWdpbl0sIHNwZWNM
ZW5ndGggLSBiZWdpbiwgcGFyc2VkLnNjaGVtZSkpIHsKKyAgICAgICAgICAgIC8vIE9mZnNldCB0
aGUgcmVzdWx0cyBzaW5jZSB3ZSBnYXZlIGV4dHJhY3RTY2hlbWUgYSBzdWJzdHJpbmcuCisgICAg
ICAgICAgICBwYXJzZWQuc2NoZW1lLnNldEJlZ2luKHBhcnNlZC5zY2hlbWUuYmVnaW4oKSArIGJl
Z2luKTsKKworICAgICAgICAgICAgaWYgKHBhcnNlZC5zY2hlbWUuZW5kKCkgIT0gc3BlY0xlbmd0
aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBwYXRoQmVnaW4gPSBwYXJzZWQuc2NoZW1lLmVuZCgp
ICsgMTsKKyAgICAgICAgICAgICAgICBwYXRoRW5kID0gc3BlY0xlbmd0aDsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIHNjaGVtZSBmb3VuZCwganVz
dCBwYXRoLgorICAgICAgICAgICAgcGFyc2VkLnNjaGVtZS5yZXNldCgpOworICAgICAgICAgICAg
cGF0aEJlZ2luID0gYmVnaW47CisgICAgICAgICAgICBwYXRoRW5kID0gc3BlY0xlbmd0aDsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIFNwbGl0IFtwYXRoQmVnaW4sIHBhdGhFbmQpIGludG8gYSBw
YXRoICsgcXVlcnkuCisgICAgICAgIGZvciAoaW50IGkgPSBwYXRoQmVnaW47IGkgPCBwYXRoRW5k
OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzcGVjW2ldID09ICc/JykgeworICAgICAgICAgICAg
ICAgIHBhcnNlZC5xdWVyeSA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKGkgKyAxLCBwYXRoRW5k
KTsKKyAgICAgICAgICAgICAgICBwYXRoRW5kID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5
IHdpdGggdGhlIHN0YW5kYXJkIFVSTCBwYXJzZXIsIHRyZWF0IG5vIHBhdGggYXMKKyAgICAgICAg
Ly8gLTEsIHJhdGhlciB0aGFuIGhhdmluZyBhIGxlbmd0aCBvZiAwCisgICAgICAgIGlmIChwYXRo
QmVnaW4gPT0gcGF0aEVuZCkKKyAgICAgICAgICAgIHBhcnNlZC5wYXRoLnJlc2V0KCk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHBhcnNlZC5wYXRoID0gVVJMQ29tcG9uZW50Ojpmcm9tUmFu
Z2UocGF0aEJlZ2luLCBwYXRoRW5kKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0cyBhIHBvcnQg
bnVtYmVyIGluIGEgc3RyaW5nIHRvIGFuIGludGVnZXIuIFdlJ2QgbGlrZSB0byBqdXN0IGNhbGwK
KyAgICAvLyBzc2NhbmYgYnV0IG91ciBpbnB1dCBpcyBub3QgMC10ZXJtaW5hdGVkLCB3aGljaCBz
c2NhbmYgcmVxdWlyZXMuIEluc3RlYWQsCisgICAgLy8gd2UgY29weSB0aGUgZGlnaXRzIHRvIGEg
c21hbGwgc3RhY2sgYnVmZmVyIChzaW5jZSB3ZSBrbm93IHRoZSBtYXhpbXVtIG51bWJlcgorICAg
IC8vIG9mIGRpZ2l0cyBpbiBhIHZhbGlkIHBvcnQgbnVtYmVyKSB0aGF0IHdlIGNhbiAwIHRlcm1p
bmF0ZS4KKyAgICBzdGF0aWMgaW50IHBhcnNlUG9ydChjb25zdCBDSEFSKiBzcGVjLCBjb25zdCBV
UkxDb21wb25lbnQmIGNvbXBvbmVudCkKKyAgICB7CisgICAgICAgIC8vIEVhc3kgc3VjY2VzcyBj
YXNlIHdoZW4gdGhlcmUgaXMgbm8gcG9ydC4KKyAgICAgICAgY29uc3QgaW50IG1heERpZ2l0cyA9
IDU7CisgICAgICAgIGlmIChjb21wb25lbnQuaXNFbXB0eU9ySW52YWxpZCgpKQorICAgICAgICAg
ICAgcmV0dXJuIFVuc3BlY2lmaWVkUG9ydDsKKworICAgICAgICBVUkxDb21wb25lbnQgbm9uWmVy
b0RpZ2l0cyhjb21wb25lbnQuZW5kKCksIDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8
IGNvbXBvbmVudC5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3BlY1tjb21wb25l
bnQuYmVnaW4oKSArIGldICE9ICcwJykgeworICAgICAgICAgICAgICAgIG5vblplcm9EaWdpdHMg
PSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShjb21wb25lbnQuYmVnaW4oKSArIGksIGNvbXBvbmVu
dC5lbmQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgaWYgKCFub25aZXJvRGlnaXRzLmxlbmd0aCgpKQorICAgICAgICAgICAgcmV0
dXJuIDA7IC8vIEFsbCBkaWdpdHMgd2VyZSAwLgorCisgICAgICAgIGlmIChub25aZXJvRGlnaXRz
Lmxlbmd0aCgpID4gbWF4RGlnaXRzKQorICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQb3J0Owor
CisgICAgICAgIGludCBwb3J0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25a
ZXJvRGlnaXRzLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgIENIQVIgY2ggPSBzcGVjW25v
blplcm9EaWdpdHMuYmVnaW4oKSArIGldOworICAgICAgICAgICAgaWYgKCFpc1BvcnREaWdpdChj
aCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQb3J0OworICAgICAgICAgICAgcG9y
dCAqPSAxMDsKKyAgICAgICAgICAgIHBvcnQgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2gpIC0gJzAn
OworICAgICAgICB9CisgICAgICAgIGlmIChwb3J0ID4gNjU1MzUpCisgICAgICAgICAgICByZXR1
cm4gSW52YWxpZFBvcnQ7CisgICAgICAgIHJldHVybiBwb3J0OworICAgIH0KKworICAgIHN0YXRp
YyB2b2lkIGV4dHJhY3RGaWxlTmFtZShjb25zdCBDSEFSKiBzcGVjLCBjb25zdCBVUkxDb21wb25l
bnQmIHBhdGgsIFVSTENvbXBvbmVudCYgZmlsZU5hbWUpCisgICAgeworICAgICAgICAvLyBIYW5k
bGUgZW1wdHkgcGF0aHM6IHRoZXkgaGF2ZSBubyBmaWxlIG5hbWVzLgorICAgICAgICBpZiAocGF0
aC5pc0VtcHR5T3JJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIGZpbGVOYW1lLnJlc2V0KCk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWFyY2ggYmFja3dh
cmRzIGZvciBhIHBhcmFtZXRlciwgd2hpY2ggaXMgYSBub3JtYWxseSB1bnVzZWQgZmllbGQgaW4g
YQorICAgICAgICAvLyBVUkwgZGVsaW1pdGVkIGJ5IGEgc2VtaWNvbG9uLiBXZSBwYXJzZSB0aGUg
cGFyYW1ldGVyIGFzIHBhcnQgb2YgdGhlCisgICAgICAgIC8vIHBhdGgsIGJ1dCBoZXJlLCB3ZSBk
b24ndCB3YW50IHRvIGNvdW50IGl0LiBUaGUgbGFzdCBzZW1pY29sb24gaXMgdGhlCisgICAgICAg
IC8vIHBhcmFtZXRlci4KKyAgICAgICAgaW50IGZpbGVFbmQgPSBwYXRoLmVuZCgpOworICAgICAg
ICBmb3IgKGludCBpID0gcGF0aC5lbmQoKSAtIDE7IGkgPiBwYXRoLmJlZ2luKCk7IC0taSkgewor
ICAgICAgICAgICAgaWYgKHNwZWNbaV0gPT0gJzsnKSB7CisgICAgICAgICAgICAgICAgZmlsZUVu
ZCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICAvLyBOb3cgc2VhcmNoIGJhY2t3YXJkcyBmcm9tIHRoZSBmaWxlbmFtZSBlbmQg
dG8gdGhlIHByZXZpb3VzIHNsYXNoCisgICAgICAgIC8vIHRvIGZpbmQgdGhlIGJlZ2lubmluZyBv
ZiB0aGUgZmlsZW5hbWUuCisgICAgICAgIGZvciAoaW50IGkgPSBmaWxlRW5kIC0gMTsgaSA+PSBw
YXRoLmJlZ2luKCk7IC0taSkgeworICAgICAgICAgICAgaWYgKGlzVVJMU2xhc2goc3BlY1tpXSkp
IHsKKyAgICAgICAgICAgICAgICAvLyBGaWxlIG5hbWUgaXMgZXZlcnl0aGluZyBmb2xsb3dpbmcg
dGhpcyBjaGFyYWN0ZXIgdG8gdGhlIGVuZAorICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gVVJM
Q29tcG9uZW50Ojpmcm9tUmFuZ2UoaSArIDEsIGZpbGVFbmQpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIHNsYXNoIGZv
dW5kLCB0aGlzIG1lYW5zIHRoZSBpbnB1dCB3YXMgZGVnZW5lcmF0ZSAoZ2VuZXJhbGx5IHBhdGhz
CisgICAgICAgIC8vIHdpbGwgc3RhcnQgd2l0aCBhIHNsYXNoKS4gTGV0J3MgY2FsbCBldmVyeXRo
aW5nIHRoZSBmaWxlIG5hbWUuCisgICAgICAgIGZpbGVOYW1lID0gVVJMQ29tcG9uZW50Ojpmcm9t
UmFuZ2UocGF0aC5iZWdpbigpLCBmaWxlRW5kKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBl
eHRyYWN0UXVlcnlLZXlWYWx1ZShjb25zdCBDSEFSKiBzcGVjLCBVUkxDb21wb25lbnQmIHF1ZXJ5
LCBVUkxDb21wb25lbnQmIGtleSwgVVJMQ29tcG9uZW50JiB2YWx1ZSkKKyAgICB7CisgICAgICAg
IGlmIChxdWVyeS5pc0VtcHR5T3JJbnZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAgICAgaW50IHN0YXJ0ID0gcXVlcnkuYmVnaW4oKTsKKyAgICAgICAgaW50IGN1cnJl
bnQgPSBzdGFydDsKKyAgICAgICAgaW50IGVuZCA9IHF1ZXJ5LmVuZCgpOworCisgICAgICAgIC8v
IFdlIGFzc3VtZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBpcyB0aGUgYmVnaW5uaW5nIG9m
IHRoZSAia2V5IiBhbmQgd2UKKyAgICAgICAgLy8gc2tpcCB0byB0aGUgZW5kIG9mIGl0LgorICAg
ICAgICBrZXkuc2V0QmVnaW4oY3VycmVudCk7CisgICAgICAgIHdoaWxlIChjdXJyZW50IDwgZW5k
ICYmIHNwZWNbY3VycmVudF0gIT0gJyYnICYmIHNwZWNbY3VycmVudF0gIT0gJz0nKQorICAgICAg
ICAgICAgKytjdXJyZW50OworICAgICAgICBrZXkuc2V0TGVuZ3RoKGN1cnJlbnQgLSBrZXkuYmVn
aW4oKSk7CisKKyAgICAgICAgLy8gU2tpcCB0aGUgc2VwYXJhdG9yIGFmdGVyIHRoZSBrZXkgKGlm
IGFueSkuCisgICAgICAgIGlmIChjdXJyZW50IDwgZW5kICYmIHNwZWNbY3VycmVudF0gPT0gJz0n
KQorICAgICAgICAgICAgKytjdXJyZW50OworCisgICAgICAgIC8vIEZpbmQgdGhlIHZhbHVlIHBh
cnQuCisgICAgICAgIHZhbHVlLnNldEJlZ2luKGN1cnJlbnQpOworICAgICAgICB3aGlsZSAoY3Vy
cmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdICE9ICcmJykKKyAgICAgICAgICAgICsrY3VycmVu
dDsKKyAgICAgICAgdmFsdWUuc2V0TGVuZ3RoKGN1cnJlbnQgLSB2YWx1ZS5iZWdpbigpKTsKKwor
ICAgICAgICAvLyBGaW5hbGx5IHNraXAgdGhlIG5leHQgc2VwYXJhdG9yIGlmIGFueQorICAgICAg
ICBpZiAoY3VycmVudCA8IGVuZCAmJiBzcGVjW2N1cnJlbnRdID09ICcmJykKKyAgICAgICAgICAg
ICsrY3VycmVudDsKKworICAgICAgICAvLyBTYXZlIHRoZSBuZXcgcXVlcnkKKyAgICAgICAgcXVl
cnkgPSBVUkxDb21wb25lbnQ6OmZyb21SYW5nZShjdXJyZW50LCBlbmQpOworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBwcm90ZWN0ZWQgb3Ig
cHJpdmF0ZS4KK3B1YmxpYzoKKyAgICAvLyBXZSB0cmVhdCBzbGFzaGVzIGFuZCBiYWNrc2xhc2hl
cyB0aGUgc2FtZSBmb3IgSUUgY29tcGF0aWJpbGl0eS4KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wg
aXNVUkxTbGFzaChDSEFSIGNoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNoID09ICcvJyB8fCBj
aCA9PSAnXFwnOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgdHJp
bSB0aGlzIGNoYXJhY3RlciBmcm9tIHRoZSBVUkwgYmVjYXVzZSBpdCBpcyBhCisgICAgLy8gc3Bh
Y2Ugb3IgYSBjb250cm9sIGNoYXJhY3Rlci4KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxk
VHJpbUZyb21VUkwoQ0hBUiBjaCkKKyAgICB7CisgICAgICAgIHJldHVybiBjaCA8PSAnICc7Cisg
ICAgfQorCisgICAgLy8gR2l2ZW4gYW4gYWxyZWFkeS1pbml0aWFsaXplZCBiZWdpbiBpbmRleCBh
bmQgZW5kIGluZGV4ICh0aGUgaW5kZXggYWZ0ZXIKKyAgICAvLyB0aGUgLy8gbGFzdCBDSEFSIGlu
IHNwZWMpLCB0aGlzIHNocmlua3MgdGhlIHJhbmdlIHRvIGVsaW1pbmF0ZQorICAgIC8vICJzaG91
bGQtYmUtdHJpbW1lZCIgY2hhcmFjdGVycy4KKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpbVVS
TChjb25zdCBDSEFSKiBzcGVjLCBpbnQmIGJlZ2luLCBpbnQmIGVuZCkKKyAgICB7CisgICAgICAg
IC8vIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzLgorICAg
ICAgICB3aGlsZSAoYmVnaW4gPCBlbmQgJiYgc2hvdWxkVHJpbUZyb21VUkwoc3BlY1tiZWdpbl0p
KQorICAgICAgICAgICAgKytiZWdpbjsKKworICAgICAgICAvLyBTdHJpcCB0cmFpbGluZyB3aGl0
ZXNwYWNlIGFuZCBjb250cm9sIGNoYXJhY3RlcnMuIFdlIG5lZWQgdGhlID5pIHRlc3QgZm9yCisg
ICAgICAgIC8vIHdoZW4gdGhlIGlucHV0IHN0cmluZyBpcyBhbGwgYmxhbmtzOyB3ZSBkb24ndCB3
YW50IHRvIGJhY2sgcGFzdCB0aGUgaW5wdXQuCisgICAgICAgIHdoaWxlIChlbmQgPiBiZWdpbiAm
JiBzaG91bGRUcmltRnJvbVVSTChzcGVjW2VuZCAtIDFdKSkKKyAgICAgICAgICAgIC0tZW5kOwor
ICAgIH0KKworICAgIC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHNsYXNoZXMg
c3RhcnRpbmcgYXQgdGhlIGdpdmVuIG9mZnNldAorICAgIC8vIGluIHRoZSBnaXZlbiBzdHJpbmcg
b2YgdGhlIGdpdmVuIGxlbmd0aC4KKyAgICBzdGF0aWMgaW5saW5lIGludCBjb25zZWN1dGl2ZVNs
YXNoZXMoY29uc3QgQ0hBUiAqc3RyaW5nLCBpbnQgYmVnaW5PZmZzZXQsIGludCBzdHJpbmdMZW5n
dGgpCisgICAgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoYmVnaW5P
ZmZzZXQgKyBjb3VudCA8IHN0cmluZ0xlbmd0aCAmJiBpc1VSTFNsYXNoKHN0cmluZ1tiZWdpbk9m
ZnNldCArIGNvdW50XSkpCisgICAgICAgICAgICArK2NvdW50OworICAgICAgICByZXR1cm4gY291
bnQ7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIFVSTFBhcnNlciBjYW5ub3QgYmUgY29uc3Ry
dWN0ZWQuCisgICAgVVJMUGFyc2VyKCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdp
dmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIGRpZ2l0IHRvIHVzZSBpbiBhIHBvcnQuCisgICAgc3Rh
dGljIGlubGluZSBib29sIGlzUG9ydERpZ2l0KENIQVIgY2gpCisgICAgeworICAgICAgICByZXR1
cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JzsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBv
ZmZzZXQgb2YgdGhlIG5leHQgYXV0aG9yaXR5IHRlcm1pbmF0b3IgaW4gdGhlIGlucHV0IHN0YXJ0
aW5nCisgICAgLy8gZnJvbSBzdGFydE9mZnNldC4gSWYgbm8gdGVybWluYXRvciBpcyBmb3VuZCwg
dGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGVxdWFsCisgICAgLy8gdG8gc3BlY0xlbmd0aC4KKyAg
ICBzdGF0aWMgaW50IG5leHRBdXRob3JpdHlUZXJtaW5hdG9yKGNvbnN0IENIQVIqIHNwZWMsIGlu
dCBzdGFydE9mZnNldCwgaW50IHNwZWNMZW5ndGgpCisgICAgeworICAgICAgICBmb3IgKGludCBp
ID0gc3RhcnRPZmZzZXQ7IGkgPCBzcGVjTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChp
c1Bvc3NpYmxlQXV0aG9yaXR5VGVybWluYXRvcihzcGVjW2ldKSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3BlY0xlbmd0aDsgLy8gTm90IGZv
dW5kLgorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHBhcnNlVXNlckluZm8oY29uc3QgQ0hBUiog
c3BlYywgY29uc3QgVVJMQ29tcG9uZW50JiB1c2VyLCBVUkxDb21wb25lbnQmIHVzZXJuYW1lLCBV
UkxDb21wb25lbnQmIHBhc3N3b3JkKQorICAgIHsKKyAgICAgICAgLy8gRmluZCB0aGUgZmlyc3Qg
Y29sb24gaW4gdGhlIHVzZXIgc2VjdGlvbiwgd2hpY2ggc2VwYXJhdGVzIHRoZSB1c2VybmFtZSBh
bmQKKyAgICAgICAgLy8gcGFzc3dvcmQuCisgICAgICAgIGludCBjb2xvbk9mZnNldCA9IDA7Cisg
ICAgICAgIHdoaWxlIChjb2xvbk9mZnNldCA8IHVzZXIubGVuZ3RoKCkgJiYgc3BlY1t1c2VyLmJl
Z2luKCkgKyBjb2xvbk9mZnNldF0gIT0gJzonKQorICAgICAgICAgICAgKytjb2xvbk9mZnNldDsK
KworICAgICAgICBpZiAoY29sb25PZmZzZXQgPCB1c2VyLmxlbmd0aCgpKSB7CisgICAgICAgICAg
ICAvLyBGb3VuZCBzZXBhcmF0b3I6IDx1c2VybmFtZT46PHBhc3N3b3JkPgorICAgICAgICAgICAg
dXNlcm5hbWUgPSBVUkxDb21wb25lbnQodXNlci5iZWdpbigpLCBjb2xvbk9mZnNldCk7CisgICAg
ICAgICAgICBwYXNzd29yZCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHVzZXIuYmVnaW4oKSAr
IGNvbG9uT2Zmc2V0ICsgMSwgdXNlci5iZWdpbigpICsgdXNlci5sZW5ndGgoKSk7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBObyBzZXBhcmF0b3IsIHRyZWF0IGV2ZXJ5dGhpbmcg
YXMgdGhlIHVzZXJuYW1lCisgICAgICAgICAgICB1c2VybmFtZSA9IHVzZXI7CisgICAgICAgICAg
ICBwYXNzd29yZCA9IFVSTENvbXBvbmVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3Rh
dGljIHZvaWQgcGFyc2VTZXJ2ZXJJbmZvKGNvbnN0IENIQVIqIHNwZWMsIGNvbnN0IFVSTENvbXBv
bmVudCYgc2VydmVySW5mbywgVVJMQ29tcG9uZW50JiBob3N0LCBVUkxDb21wb25lbnQmIHBvcnQp
CisgICAgeworICAgICAgICBpZiAoIXNlcnZlckluZm8ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAg
IC8vIE5vIHNlcnZlciBpbmZvLCBob3N0IG5hbWUgaXMgZW1wdHkuCisgICAgICAgICAgICBob3N0
LnJlc2V0KCk7CisgICAgICAgICAgICBwb3J0LnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgaG9zdCBzdGFydHMgd2l0aCBhIGxlZnQt
YnJhY2tldCwgYXNzdW1lIHRoZSBlbnRpcmUgaG9zdCBpcyBhbgorICAgICAgICAvLyBJUHY2IGxp
dGVyYWwuICBPdGhlcndpc2UsIGFzc3VtZSBub25lIG9mIHRoZSBob3N0IGlzIGFuIElQdjYgbGl0
ZXJhbC4KKyAgICAgICAgLy8gVGhpcyBhc3N1bXB0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiB3
ZSBmaW5kIGEgcmlnaHQtYnJhY2tldC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT3VyIElQdjYg
YWRkcmVzcyBjYW5vbmljYWxpemF0aW9uIGNvZGUgcmVxdWlyZXMgYm90aCBicmFja2V0cyB0byBl
eGlzdCwKKyAgICAgICAgLy8gYnV0IHRoZSBhYmlsaXR5IHRvIGxvY2F0ZSBhbiBpbmNvbXBsZXRl
IGFkZHJlc3MgY2FuIHN0aWxsIGJlIHVzZWZ1bC4KKyAgICAgICAgaW50IGlwdjZUZXJtaW5hdG9y
ID0gc3BlY1tzZXJ2ZXJJbmZvLmJlZ2luKCldID09ICdbJyA/IHNlcnZlckluZm8uZW5kKCkgOiAt
MTsKKyAgICAgICAgaW50IGNvbG9uID0gLTE7CisKKyAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBy
aWdodC1icmFja2V0LCBhbmQgdGhlIGxhc3QgY29sb24uCisgICAgICAgIGZvciAoaW50IGkgPSBz
ZXJ2ZXJJbmZvLmJlZ2luKCk7IGkgPCBzZXJ2ZXJJbmZvLmVuZCgpOyBpKyspIHsKKyAgICAgICAg
ICAgIHN3aXRjaCAoc3BlY1tpXSkgeworICAgICAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAg
ICAgICAgaXB2NlRlcm1pbmF0b3IgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAgICAgY29sb24gPSBpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvbiA+IGlwdjZUZXJt
aW5hdG9yKSB7CisgICAgICAgICAgICAvLyBGb3VuZCBhIHBvcnQgbnVtYmVyOiA8aG9zdG5hbWU+
Ojxwb3J0PgorICAgICAgICAgICAgaG9zdCA9IFVSTENvbXBvbmVudDo6ZnJvbVJhbmdlKHNlcnZl
ckluZm8uYmVnaW4oKSwgY29sb24pOworICAgICAgICAgICAgaWYgKCFob3N0Lmxlbmd0aCgpKQor
ICAgICAgICAgICAgICAgIGhvc3QucmVzZXQoKTsKKyAgICAgICAgICAgIHBvcnQgPSBVUkxDb21w
b25lbnQ6OmZyb21SYW5nZShjb2xvbiArIDEsIHNlcnZlckluZm8uZW5kKCkpOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gcG9ydDogPGhvc3RuYW1lPgorICAgICAgICAgICAg
aG9zdCA9IHNlcnZlckluZm87CisgICAgICAgICAgICBwb3J0LnJlc2V0KCk7CisgICAgICAgIH0K
KyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIFVSTFBhcnNlcl9o
Cg==
</data>
<flag name="review"
          id="39568"
          type_id="1"
          status="+"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>