<?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>17870</bug_id>
          
          <creation_ts>2008-03-15 20:42:14 -0700</creation_ts>
          <short_desc>Web Inspector console should feel more like a terminal</short_desc>
          <delta_ts>2008-03-17 08:29:48 -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>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>14397</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Timothy Hatcher">timothy</reporter>
          <assigned_to name="Timothy Hatcher">timothy</assigned_to>
          <cc>aroben</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>73854</commentid>
    <comment_count>0</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2008-03-15 20:42:14 -0700</bug_when>
    <thetext>The console should feel more like an interactive terminal.

It should have tab completion and an input prompt that sits right below the last output line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>73858</commentid>
    <comment_count>1</comment_count>
      <attachid>19787</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2008-03-15 21:06:28 -0700</bug_when>
    <thetext>Created attachment 19787
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>73863</commentid>
    <comment_count>2</comment_count>
      <attachid>19787</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-03-15 22:00:49 -0700</bug_when>
    <thetext>Comment on attachment 19787
Patch

+        Bug 17870: Web Inspector console should fell more like a terminal

Typo: fell -&gt; feel

ChangeLog has a couple of tabs

+        function focusPromptSoon()
+        {
+            if (!this._caretInsidePrompt())
+                this._moveCaretToEndOfPrompt();
+        }

This function should just be called focusPrompt, since the function itself is synchronous.

A number of the new functions in this patch have their opening brace on the same line as the declaration. I don&apos;t really have a preference either way, but it&apos;s definitely more consistent with our existing Inspector code to put the brace on the next line.

+    clearAutoComplete: function(includeTimeout) {
+        if (includeTimeout &amp;&amp; &quot;completeTimeout&quot; in this) {
+            clearTimeout(this.completeTimeout);
+            delete this.completeTimeout;
+        }
+
+        if (this.autoCompleteElement) {
+            if (this.autoCompleteElement.parentNode)
+                this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);
+            delete this.autoCompleteElement;
+        }
+    },

You can return early if (!this.autoCompleteElement).

+        if (auto) {
+            if (!selection.isCollapsed)
+                return;
+
+            var node = selectionRange.startContainer;
+            if (node.nodeType === Node.TEXT_NODE &amp;&amp; selectionRange.startOffset &lt; node.nodeValue.length)
+                return;
+
+            var foundNextText = false;
+            while (node) {
+                if (node.nodeType === Node.TEXT_NODE &amp;&amp; node.nodeValue.length) {
+                    if (foundNextText)
+                        return;
+                    foundNextText = true;
+                }
+
+                node = node.traverseNextNode(this.promptElement);
+            }
+        }

It might be nice to put this in a named helper function to make it clearer what its purpose is. I also think you&apos;re missing an argument to traverseNextNode (I assume you meant for this.promptElement to be the stayWithin parameter, not the skipWhitespace parameter).

+            var currentText = fullWordRange.toString();
+            for (var i = (currentText.length - 1); i &gt; 0; --i)
+                if (currentText[i] !== &quot; &quot;)
+                    break;
+
+            currentText = currentText.substring(0, (i + 1));

Is this not the same as:

var currentText = fullWordRange.toString().trimTrailingWhitespace();

+        if (window.event &amp;&amp; window.event.altKey)
+            completionText += &quot; &quot;;

Do you have a specific use case for this in mind? (This won&apos;t work as-is on Windows because Alt-Tab is a system keyboard shortcut for the app/window switcher).

+        var expression = this._backwardsRange(&quot; =:({;&quot;, wordRange.startContainer, wordRange.startOffset, this.promptElement);

There are two calls to _backwardsRange in this patch, but they each pass a slightly different first parameter. Is that intentional? Should we just build in the first parameter to _backwardsRange, or make a wrapper function that builds it in?

+        var expressionString = expression.toString();
+        for (var i = (expressionString.length - 1); i &gt; 0; --i)
+            if (expressionString[i] !== &quot;.&quot;)
+                break;
+
+        expressionString = expressionString.substring(0, (i + 1));

I think this would be clearer as:

var expressionString = expression.toString().replace(/\.+$/, &quot;&quot;);

+            if (property.substring(0, prefix.length) !== prefix)

I think this is equivalent to:

if (property.indexOf(prefix) !== 0)

but maybe your version is faster?

+        if (selectionRange.startContainer !== this.promptElement &amp;&amp; !selectionRange.startContainer.isDescendant(this.promptElement))
+            return false;
+        return true;

You can change this to:

return selectionRange.startContainer === this.promptElement &amp;&amp; selectionRange.startContainer.isDescendant(this.promptElement);

+WebInspector.ConsoleCommand = function(command, result, formattedResultElement, level)
 {
-    this.input = input;
-    this.output = output;
+    this.command = command;
+    this.result = result;
+    this.formattedResultElement = formattedResultElement;
+    this.level = level;

Looks like this.result is never used. Maybe we should remove it.

Is this patch missing changes to inspector.css?

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>73868</commentid>
    <comment_count>3</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2008-03-15 23:34:52 -0700</bug_when>
    <thetext>Landed in r31079.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>73886</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-03-16 09:37:16 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 19787 [edit])
&gt; +        var expression = this._backwardsRange(&quot; =:({;&quot;,
&gt; wordRange.startContainer, wordRange.startOffset, this.promptElement);
&gt; 
&gt; There are two calls to _backwardsRange in this patch, but they each pass a
&gt; slightly different first parameter. Is that intentional? Should we just build
&gt; in the first parameter to _backwardsRange, or make a wrapper function that
&gt; builds it in?

So are the different first parameters correct? Should we add a comment about them?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>73945</commentid>
    <comment_count>5</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2008-03-16 12:38:03 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 19787 [edit])
&gt; 
&gt; +        if (window.event &amp;&amp; window.event.altKey)
&gt; +            completionText += &quot; &quot;;
&gt; 
&gt; Do you have a specific use case for this in mind? (This won&apos;t work as-is on
&gt; Windows because Alt-Tab is a system keyboard shortcut for the app/window
&gt; switcher).

I removed this there was no good reason to have it. 

&gt; +        var expression = this._backwardsRange(&quot; =:({;&quot;,
&gt; wordRange.startContainer, wordRange.startOffset, this.promptElement);
&gt; 
&gt; There are two calls to _backwardsRange in this patch, but they each pass a
&gt; slightly different first parameter. Is that intentional? Should we just build
&gt; in the first parameter to _backwardsRange, or make a wrapper function that
&gt; builds it in?

They are different for a reason. The first scan needs to stop sooner, so it will still when it encounters &quot;.&quot; or &quot;[&quot;. The next scan needs to read the whole expression, stopping only for &quot; &quot;, &quot;:&quot;, &quot;=&quot;, &quot;{&quot;, &quot;(&quot;. This is not a great set, and this logic should be improved. Since space could be encountered in an expression like &quot;test[&quot;tim hatcher&quot;].found&quot;. I will file a bug about this.

&gt; Is this patch missing changes to inspector.css?

I forgot to attach it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74103</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-03-17 08:29:48 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; +        var expression = this._backwardsRange(&quot; =:({;&quot;,
&gt; &gt; wordRange.startContainer, wordRange.startOffset, this.promptElement);
&gt; &gt; 
&gt; &gt; There are two calls to _backwardsRange in this patch, but they each pass a
&gt; &gt; slightly different first parameter. Is that intentional? Should we just build
&gt; &gt; in the first parameter to _backwardsRange, or make a wrapper function that
&gt; &gt; builds it in?
&gt; 
&gt; They are different for a reason. The first scan needs to stop sooner, so it
&gt; will still when it encounters &quot;.&quot; or &quot;[&quot;. The next scan needs to read the whole
&gt; expression, stopping only for &quot; &quot;, &quot;:&quot;, &quot;=&quot;, &quot;{&quot;, &quot;(&quot;. This is not a great set,
&gt; and this logic should be improved. Since space could be encountered in an
&gt; expression like &quot;test[&quot;tim hatcher&quot;].found&quot;. I will file a bug about this.

Maybe we could put these two strings in named variables that explained their function better. I don&apos;t know what the names should be since I still don&apos;t completely understand the differences. A guess at the names would be something like &quot;wordDelimiters&quot; and &quot;objectDelimiters&quot;, but really these are just guesses.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19787</attachid>
            <date>2008-03-15 21:06:28 -0700</date>
            <delta_ts>2008-03-15 22:00:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>console.patch</filename>
            <type>text/plain</type>
            <size>42111</size>
            <attacher name="Timothy Hatcher">timothy</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDMxMDc4
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTEgQEAKKzIwMDgtMDMt
MTUgIFRpbW90aHkgSGF0Y2hlciAgPHRpbW90aHlAYXBwbGUuY29tPgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEJ1ZyAxNzg3MDogV2ViIEluc3BlY3Rv
ciBjb25zb2xlIHNob3VsZCBmZWxsIG1vcmUgbGlrZSBhIHRlcm1pbmFsCisgICAgICAgIGh0dHA6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3ODcwCisKKyAgICAgICAgQnVnIDE0
MzkwOiBDb25zb2xlIGlucHV0IGFyZWEgc2hvdWxkIGJlIG1vcmUgbm90aWNlYWJsZQorICAgICAg
ICBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDM5MAorCisgICAgICAg
IEFkZHMgdGFiIGNvbXBsZXRpb24sIGF1dG8gY29tcGxldGlvbiBhbmQgYSBibGVuZGVkIGlucHV0
IHByb21wdC4KKyAgICAgICAgVGhlIHByb21wdCBpcyBhbHNvIGZvY3VzZWQgd2hlbiB0aGUgY29u
c29sZSBpcyBzaG93bi4KKyAgICAgICAJSW1wbGVtZW50cyBhIG5ldyBsb29rLCB0aGF0IHdpbGwg
YmUgcGFydCBvZiB0aGUgVUkgcmVmcmVzaC4KKworICAgICAgICAqIHBhZ2UvaW5zcGVjdG9yL0Nv
bnNvbGVQYW5lbC5qczogCisgICAgICAgIChXZWJJbnNwZWN0b3IuQ29uc29sZVBhbmVsKTogUmVu
YW1lZCBhIGZldyBwcm9wZXJ0aWVzLgorICAgICAgICAoV2ViSW5zcGVjdG9yLkNvbnNvbGVQYW5l
bC5nZXQvc2V0IHByb21wdFRleHQpOiBQcm9wZXJ0eSB0byBzZXQKKyAgICAgICAgYW5kIGdldCB0
aGUgY3VycmVudCBwcm9tcHQgdGV4dC4gRG9lcyBub3QgYWZmZWN0IGNvbW1hbmQgaGlzdG9yeS4K
KyAgICAgICAgKFdlYkluc3BlY3Rvci5Db25zb2xlUGFuZWwuc2hvdyk6IE1ha2UgdGhlIHByb21w
dCBmb2N1cyBvbiBzaG93LgorICAgICAgICAoV2ViSW5zcGVjdG9yLkNvbnNvbGVQYW5lbC5hY2Nl
cHRBdXRvQ29tcGxldGUpOiBBY2NlcHRzIGFueQorICAgICAgICBwZW5kaW5nIGF1dG8gY29tcGxl
dGUgdGV4dC4KKyAgICAgICAgKFdlYkluc3BlY3Rvci5Db25zb2xlUGFuZWwuY2xlYXJBdXRvQ29t
cGxldGUpOiBDYW5jZWxzIGFueSBwZW5kaW5nCisgICAgICAgIGF1dG8gY29tcGxldGUgdGV4dC4K
KyAgICAgICAgKFdlYkluc3BlY3Rvci5Db25zb2xlUGFuZWwuYXV0b0NvbXBsZXRlU29vbik6IFNl
dHMgYSB0aW1lb3V0IHRvIGF1dG8KKyAgICAgICAgY29tcGxldGUgaW4gMjUwIG1zLCBvbmx5IGlm
IHRoZXJlIGlzbid0IGEgcGVuZGluZyBhdXRvIGNvbXBsZXRlLgorICAgICAgICAoV2ViSW5zcGVj
dG9yLkNvbnNvbGVQYW5lbC5jb21wbGV0ZSk6IAorICAgICAgICAoV2ViSW5zcGVjdG9yLkNvbnNv
bGVQYW5lbC5jb21wbGV0aW9ucyk6IEdlbmVyYXRlIGEgbGlzdCBvZiBwb3NzaWJsZQorICAgICAg
ICBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgcHJlZml4IGFuZCB0aGUgcHJldmlvdXMgZXhwcmVz
c2lvbiByYW5nZXMuCisgICAgICAgIChXZWJJbnNwZWN0b3IuQ29uc29sZVBhbmVsLl9iYWNrd2Fy
ZHNSYW5nZSk6IEhlbHBlciB0byBzY2FuIGJhY2t3YXJkcworICAgICAgICBmcm9tIGEgbm9kZSBh
bmQgb2Zmc2V0IHRvIGZpbmQgYSBzdGFydCBub2RlIGFuZCBvZmZzZXQgb2YgdGhlIGZpcnN0Cisg
ICAgICAgIGNoYXJhY3RlciBmb3VuZCBpbiB0aGUgY2hhcmFjdGVycyBzdHJpbmcuCisgICAgICAg
IChXZWJJbnNwZWN0b3IuQ29uc29sZVBhbmVsLl9ldmFsSW5JbnNwZWN0ZWRXaW5kb3cpOiBIZWxw
ZXIgdG8gZXZhbCBpbiB0aGUKKyAgICAgICAgaW5zcGVjdGVkIHdpbmRvdy4KKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5Db25zb2xlUGFuZWwuX2NhcmV0SW5zaWRlUHJvbXB0KTogUmV0dXJucyB0cnVl
IGlmIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgaXMgY29sbGFwc2VkIGFuZCBpcyBpbnNpZGUgdGhl
IHByb21wdCBlbGVtZW50LgorICAgICAgICAoV2ViSW5zcGVjdG9yLkNvbnNvbGVQYW5lbC5fbW92
ZUNhcmV0VG9FbmRPZlByb21wdCk6IE1vdmVzIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgdG8gdGhl
IGVuZCBvZiB0aGUgcHJvbXB0LgorICAgICAgICAoV2ViSW5zcGVjdG9yLkNvbnNvbGVQYW5lbC5f
b25UYWJQcmVzc2VkKTogQ2FsbHMgY29tcGxldGUgb24KKyAgICAgICAgdGFiIHByZXNzLgorICAg
ICAgICAoV2ViSW5zcGVjdG9yLkNvbnNvbGVQYW5lbC5fb25FbnRlclByZXNzZWQpOiBDYWxsIGNs
ZWFyQXV0b0NvbXBsZXRlIHNvIHRoZQorICAgICAgICBhdXRvY29tcGxldGlvbiB0ZXh0IGlzIG5v
dCBldmFsdWF0ZWQuCisKKyAgICAgICAgKiBwYWdlL2luc3BlY3Rvci9JbWFnZXMvZXJyb3JJY29u
LnBuZzogTmV3IGltYWdlLgorICAgICAgICAqIHBhZ2UvaW5zcGVjdG9yL0ltYWdlcy91c2VySW5w
dXRJY29uLnBuZzogQWRkZWQuCisgICAgICAgICogcGFnZS9pbnNwZWN0b3IvSW1hZ2VzL3VzZXJJ
bnB1dFByZXZpb3VzSWNvbi5wbmc6IEFkZGVkLgorICAgICAgICAqIHBhZ2UvaW5zcGVjdG9yL0lt
YWdlcy93YXJuaW5nSWNvbi5wbmc6IE5ldyBpbWFnZS4KKyAgICAgICAgKiBwYWdlL2luc3BlY3Rv
ci9pbnNwZWN0b3IuY3NzOiBOZXcgcmVmcmVzaGVkIFVJLgorCiAyMDA4LTAzLTE1ICBNYXJrIE1l
bnRvdmFpICA8bWFya0Btb3hpZW5ldC5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYW5kIGxhbmRl
ZCBieSBEYXJpbi4KSW5kZXg6IHBhZ2UvaW5zcGVjdG9yL0NvbnNvbGVQYW5lbC5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBwYWdlL2luc3BlY3Rvci9Db25zb2xlUGFuZWwuanMJKHJldmlzaW9uIDMxMDcyKQor
KysgcGFnZS9pbnNwZWN0b3IvQ29uc29sZVBhbmVsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTM1LDQx
ICszNSw2NyBAQCBXZWJJbnNwZWN0b3IuQ29uc29sZVBhbmVsID0gZnVuY3Rpb24oKQogICAgIHRo
aXMuY29tbWFuZEhpc3RvcnkgPSBbXTsKICAgICB0aGlzLmNvbW1hbmRPZmZzZXQgPSAwOwogCi0g
ICAgdGhpcy5tZXNzYWdlTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9sIik7Ci0gICAg
dGhpcy5tZXNzYWdlTGlzdC5jbGFzc05hbWUgPSAiY29uc29sZS1tZXNzYWdlLWxpc3QiOwotICAg
IHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm1lc3NhZ2VMaXN0KTsKLQotICAgIHRoaXMu
bWVzc2FnZUxpc3QuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLm1lc3NhZ2VMaXN0Q2xp
Y2tlZC5iaW5kKHRoaXMpLCB0cnVlKTsKLQotICAgIHRoaXMuY29uc29sZVByb21wdCA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7Ci0gICAgdGhpcy5jb25zb2xlUHJvbXB0LmNs
YXNzTmFtZSA9ICJjb25zb2xlLXByb21wdCI7Ci0gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxk
KHRoaXMuY29uc29sZVByb21wdCk7Ci0KLSAgICB0aGlzLmNvbnNvbGVQcm9tcHQuYWRkRXZlbnRM
aXN0ZW5lcigia2V5ZG93biIsIHRoaXMucHJvbXB0S2V5RG93bi5iaW5kKHRoaXMpLCBmYWxzZSk7
Ci0KLSAgICB2YXIgY2xlYXJCdXR0b25UZXh0ID0gV2ViSW5zcGVjdG9yLlVJU3RyaW5nKCJDbGVh
ciIpOwotICAgIHRoaXMuY2xlYXJNZXNzYWdlc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJidXR0b24iKTsKLSAgICB0aGlzLmNsZWFyTWVzc2FnZXNFbGVtZW50LmFwcGVuZENoaWxk
KGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNsZWFyQnV0dG9uVGV4dCkpOwotICAgIHRoaXMuY2xl
YXJNZXNzYWdlc0VsZW1lbnQudGl0bGUgPSBjbGVhckJ1dHRvblRleHQ7Ci0gICAgdGhpcy5jbGVh
ck1lc3NhZ2VzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuY2xlYXJCdXR0
b25DbGlja2VkLmJpbmQodGhpcyksIGZhbHNlKTsKKyAgICB0aGlzLm1lc3NhZ2VzRWxlbWVudCA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMubWVzc2FnZXNFbGVtZW50
LmlkID0gImNvbnNvbGUtbWVzc2FnZXMiOworICAgIHRoaXMubWVzc2FnZXNFbGVtZW50LmFkZEV2
ZW50TGlzdGVuZXIoInNlbGVjdHN0YXJ0IiwgdGhpcy5tZXNzYWdlc1NlbGVjdFN0YXJ0LmJpbmQo
dGhpcyksIHRydWUpOworICAgIHRoaXMubWVzc2FnZXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIo
ImNsaWNrIiwgdGhpcy5tZXNzYWdlc0NsaWNrZWQuYmluZCh0aGlzKSwgdHJ1ZSk7CisgICAgdGhp
cy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMubWVzc2FnZXNFbGVtZW50KTsKKworICAgIHRoaXMu
cHJvbXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMu
cHJvbXB0RWxlbWVudC5pZCA9ICJjb25zb2xlLXByb21wdCI7CisgICAgdGhpcy5wcm9tcHRFbGVt
ZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLnByb21wdEtleURvd24uYmluZCh0
aGlzKSwgZmFsc2UpOworICAgIHRoaXMucHJvbXB0RWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCJiciIpKTsKKyAgICB0aGlzLm1lc3NhZ2VzRWxlbWVudC5hcHBlbmRD
aGlsZCh0aGlzLnByb21wdEVsZW1lbnQpOworCisgICAgdGhpcy5jbGVhckJ1dHRvbiA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOworICAgIHRoaXMuY2xlYXJCdXR0b24udGl0bGUg
PSBXZWJJbnNwZWN0b3IuVUlTdHJpbmcoIkNsZWFyIik7CisgICAgdGhpcy5jbGVhckJ1dHRvbi50
ZXh0Q29udGVudCA9IFdlYkluc3BlY3Rvci5VSVN0cmluZygiQ2xlYXIiKTsKKyAgICB0aGlzLmNs
ZWFyQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5jbGVhckJ1dHRvbkNsaWNr
ZWQuYmluZCh0aGlzKSwgZmFsc2UpOwogfQogCiBXZWJJbnNwZWN0b3IuQ29uc29sZVBhbmVsLnBy
b3RvdHlwZSA9IHsKKyAgICBnZXQgcHJvbXB0VGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5wcm9tcHRFbGVtZW50LnRleHRDb250ZW50OworICAgIH0sCisKKyAgICBzZXQgcHJvbXB0
VGV4dCh4KQorICAgIHsKKyAgICAgICAgaWYgKCF4KSB7CisgICAgICAgICAgICAvLyBBcHBlbmQg
YSBicmVhayBlbGVtZW50IGluc3RlYWQgb2Ygc2V0dGluZyB0ZXh0Q29udGVudCB0byBtYWtlIHN1
cmUgdGhlIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIHByb21wdC4KKyAgICAgICAgICAgIHRoaXMu
cHJvbXB0RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpOworICAgICAgICAgICAgdGhpcy5wcm9tcHRF
bGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpOworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIHRoaXMucHJvbXB0RWxlbWVudC50ZXh0Q29udGVudCA9IHg7
CisKKyAgICAgICAgdGhpcy5fbW92ZUNhcmV0VG9FbmRPZlByb21wdCgpOworICAgIH0sCisKICAg
ICBzaG93OiBmdW5jdGlvbigpCiAgICAgewogICAgICAgICBXZWJJbnNwZWN0b3IuUGFuZWwucHJv
dG90eXBlLnNob3cuY2FsbCh0aGlzKTsKICAgICAgICAgV2ViSW5zcGVjdG9yLmNvbnNvbGVMaXN0
SXRlbS5zZWxlY3QoKTsKIAotICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZXNFbGVtZW50LnJlbW92
ZVN0eWxlQ2xhc3MoImhpZGRlbiIpOwotICAgICAgICBpZiAoIXRoaXMuY2xlYXJNZXNzYWdlc0Vs
ZW1lbnQucGFyZW50Tm9kZSkKLSAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0
b29sYmFyQnV0dG9ucyIpLmFwcGVuZENoaWxkKHRoaXMuY2xlYXJNZXNzYWdlc0VsZW1lbnQpOwor
ICAgICAgICB0aGlzLmNsZWFyQnV0dG9uLnJlbW92ZVN0eWxlQ2xhc3MoImhpZGRlbiIpOworICAg
ICAgICBpZiAoIXRoaXMuY2xlYXJCdXR0b24ucGFyZW50Tm9kZSkKKyAgICAgICAgICAgIGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyQnV0dG9ucyIpLmFwcGVuZENoaWxkKHRoaXMuY2xl
YXJCdXR0b24pOworCisgICAgICAgIFdlYkluc3BlY3Rvci5jdXJyZW50Rm9jdXNFbGVtZW50ID0g
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW4iKTsKKworICAgICAgICBmdW5jdGlvbiBmb2N1
c1Byb21wdFNvb24oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2NhcmV0SW5z
aWRlUHJvbXB0KCkpCisgICAgICAgICAgICAgICAgdGhpcy5fbW92ZUNhcmV0VG9FbmRPZlByb21w
dCgpOworICAgICAgICB9CisKKyAgICAgICAgc2V0VGltZW91dChmb2N1c1Byb21wdFNvb24uYmlu
ZCh0aGlzKSwgMCk7CiAgICAgfSwKIAogICAgIGhpZGU6IGZ1bmN0aW9uKCkKICAgICB7CiAgICAg
ICAgIFdlYkluc3BlY3Rvci5QYW5lbC5wcm90b3R5cGUuaGlkZS5jYWxsKHRoaXMpOwogICAgICAg
ICBXZWJJbnNwZWN0b3IuY29uc29sZUxpc3RJdGVtLmRlc2VsZWN0KCk7Ci0gICAgICAgIHRoaXMu
Y2xlYXJNZXNzYWdlc0VsZW1lbnQuYWRkU3R5bGVDbGFzcygiaGlkZGVuIik7CisgICAgICAgIHRo
aXMuY2xlYXJCdXR0b24uYWRkU3R5bGVDbGFzcygiaGlkZGVuIik7CiAgICAgfSwKIAogICAgIGFk
ZE1lc3NhZ2U6IGZ1bmN0aW9uKG1zZykKQEAgLTg3LDEyICsxMTMsMTIgQEAgV2ViSW5zcGVjdG9y
LkNvbnNvbGVQYW5lbC5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwog
ICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKG1z
Zyk7CiAKLSAgICAgICAgdmFyIGl0ZW0gPSBtc2cudG9MaXN0SXRlbSgpOwotICAgICAgICBpdGVt
Lm1lc3NhZ2UgPSBtc2c7Ci0gICAgICAgIHRoaXMubWVzc2FnZUxpc3QuYXBwZW5kQ2hpbGQoaXRl
bSk7Ci0gICAgICAgIGl0ZW0uc2Nyb2xsSW50b1ZpZXcoZmFsc2UpOworICAgICAgICB2YXIgZWxl
bWVudCA9IG1zZy50b01lc3NhZ2VFbGVtZW50KCk7CisgICAgICAgIHRoaXMubWVzc2FnZXNFbGVt
ZW50Lmluc2VydEJlZm9yZShlbGVtZW50LCB0aGlzLnByb21wdEVsZW1lbnQpOworICAgICAgICB0
aGlzLnByb21wdEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpOwogICAgIH0sCiAKICAgICBj
bGVhck1lc3NhZ2VzOiBmdW5jdGlvbigpCkBAIC0xMDEsMTMgKzEyNywxOTYgQEAgV2ViSW5zcGVj
dG9yLkNvbnNvbGVQYW5lbC5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICB2YXIgcmVzb3VyY2Ug
PSB0aGlzLm1lc3NhZ2VzW2ldLnJlc291cmNlOwogICAgICAgICAgICAgaWYgKCFyZXNvdXJjZSkK
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQogICAgICAgICAgICAgcmVzb3VyY2UuZXJyb3Jz
ID0gMDsKICAgICAgICAgICAgIHJlc291cmNlLndhcm5pbmdzID0gMDsKICAgICAgICAgfQogCiAg
ICAgICAgIHRoaXMubWVzc2FnZXMgPSBbXTsKLSAgICAgICAgdGhpcy5tZXNzYWdlTGlzdC5yZW1v
dmVDaGlsZHJlbigpOworCisgICAgICAgIHdoaWxlICh0aGlzLm1lc3NhZ2VzRWxlbWVudC5maXJz
dENoaWxkICE9IHRoaXMucHJvbXB0RWxlbWVudCkKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZXNF
bGVtZW50LnJlbW92ZUNoaWxkKHRoaXMubWVzc2FnZXNFbGVtZW50LmZpcnN0Q2hpbGQpOworICAg
IH0sCisKKyAgICBhY2NlcHRBdXRvQ29tcGxldGU6IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAo
IXRoaXMuYXV0b0NvbXBsZXRlRWxlbWVudCB8fCAhdGhpcy5hdXRvQ29tcGxldGVFbGVtZW50LnBh
cmVudE5vZGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdmFyIHRleHQg
PSB0aGlzLmF1dG9Db21wbGV0ZUVsZW1lbnQudGV4dENvbnRlbnQ7CisgICAgICAgIHZhciB0ZXh0
Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpOworICAgICAgICB0aGlzLmF1dG9D
b21wbGV0ZUVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGV4dE5vZGUsIHRoaXMuYXV0
b0NvbXBsZXRlRWxlbWVudCk7CisgICAgICAgIGRlbGV0ZSB0aGlzLmF1dG9Db21wbGV0ZUVsZW1l
bnQ7CisKKyAgICAgICAgdmFyIGZpbmFsU2VsZWN0aW9uUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVS
YW5nZSgpOworICAgICAgICBmaW5hbFNlbGVjdGlvblJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCB0
ZXh0Lmxlbmd0aCk7CisgICAgICAgIGZpbmFsU2VsZWN0aW9uUmFuZ2Uuc2V0RW5kKHRleHROb2Rl
LCB0ZXh0Lmxlbmd0aCk7CisKKyAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxl
Y3Rpb24oKTsKKyAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOworICAgICAgICBz
ZWxlY3Rpb24uYWRkUmFuZ2UoZmluYWxTZWxlY3Rpb25SYW5nZSk7CisKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfSwKKworICAgIGNsZWFyQXV0b0NvbXBsZXRlOiBmdW5jdGlvbihpbmNsdWRl
VGltZW91dCkgeworICAgICAgICBpZiAoaW5jbHVkZVRpbWVvdXQgJiYgImNvbXBsZXRlVGltZW91
dCIgaW4gdGhpcykgeworICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29tcGxldGVUaW1l
b3V0KTsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBsZXRlVGltZW91dDsKKyAgICAgICAg
fQorCisgICAgICAgIGlmICh0aGlzLmF1dG9Db21wbGV0ZUVsZW1lbnQpIHsKKyAgICAgICAgICAg
IGlmICh0aGlzLmF1dG9Db21wbGV0ZUVsZW1lbnQucGFyZW50Tm9kZSkKKyAgICAgICAgICAgICAg
ICB0aGlzLmF1dG9Db21wbGV0ZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmF1
dG9Db21wbGV0ZUVsZW1lbnQpOworICAgICAgICAgICAgZGVsZXRlIHRoaXMuYXV0b0NvbXBsZXRl
RWxlbWVudDsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBhdXRvQ29tcGxldGVTb29uOiBmdW5j
dGlvbigpIHsKKyAgICAgICAgaWYgKCEoImNvbXBsZXRlVGltZW91dCIgaW4gdGhpcykpCisgICAg
ICAgICAgICB0aGlzLmNvbXBsZXRlVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jb21wbGV0ZS5i
aW5kKHRoaXMsIHRydWUpLCAyNTApOworICAgIH0sCisKKyAgICBjb21wbGV0ZTogZnVuY3Rpb24o
YXV0bykgeworICAgICAgICB0aGlzLmNsZWFyQXV0b0NvbXBsZXRlKHRydWUpOworCisgICAgICAg
IHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmICghc2Vs
ZWN0aW9uLnJhbmdlQ291bnQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIHNl
bGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CisgICAgICAgIGlmICghc2Vs
ZWN0aW9uUmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIuaXNEZXNjZW5kYW50KHRoaXMucHJv
bXB0RWxlbWVudCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGF1dG8pIHsK
KyAgICAgICAgICAgIGlmICghc2VsZWN0aW9uLmlzQ29sbGFwc2VkKQorICAgICAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICAgICAgdmFyIG5vZGUgPSBzZWxlY3Rpb25SYW5nZS5zdGFydENv
bnRhaW5lcjsKKyAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9E
RSAmJiBzZWxlY3Rpb25SYW5nZS5zdGFydE9mZnNldCA8IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkK
KyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciBmb3VuZE5leHRUZXh0
ID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgICAgIGlm
IChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZS5sZW5n
dGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kTmV4dFRleHQpCisgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIGZvdW5kTmV4dFRleHQg
PSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vZGUgPSBub2Rl
LnRyYXZlcnNlTmV4dE5vZGUodGhpcy5wcm9tcHRFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIHZhciB3b3JkUHJlZml4UmFuZ2UgPSB0aGlzLl9iYWNrd2FyZHNS
YW5nZSgiIC49OlsoezsiLCBzZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9u
UmFuZ2Uuc3RhcnRPZmZzZXQsIHRoaXMucHJvbXB0RWxlbWVudCk7CisKKyAgICAgICAgdmFyIGNv
bXBsZXRpb25zID0gdGhpcy5jb21wbGV0aW9ucyh3b3JkUHJlZml4UmFuZ2UsIGF1dG8pOworCisg
ICAgICAgIGlmICghY29tcGxldGlvbnMgfHwgIWNvbXBsZXRpb25zLmxlbmd0aCkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICB2YXIgZnVsbFdvcmRSYW5nZSA9IGRvY3VtZW50LmNyZWF0
ZVJhbmdlKCk7CisgICAgICAgIGZ1bGxXb3JkUmFuZ2Uuc2V0U3RhcnQod29yZFByZWZpeFJhbmdl
LnN0YXJ0Q29udGFpbmVyLCB3b3JkUHJlZml4UmFuZ2Uuc3RhcnRPZmZzZXQpOworICAgICAgICBm
dWxsV29yZFJhbmdlLnNldEVuZChzZWxlY3Rpb25SYW5nZS5lbmRDb250YWluZXIsIHNlbGVjdGlv
blJhbmdlLmVuZE9mZnNldCk7CisKKyAgICAgICAgaWYgKGNvbXBsZXRpb25zLmxlbmd0aCA9PT0g
MSB8fCBzZWxlY3Rpb24uaXNDb2xsYXBzZWQgfHwgYXV0bykgeworICAgICAgICAgICAgdmFyIGNv
bXBsZXRpb25UZXh0ID0gY29tcGxldGlvbnNbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICB2YXIgY3VycmVudFRleHQgPSBmdWxsV29yZFJhbmdlLnRvU3RyaW5nKCk7CisgICAgICAg
ICAgICBmb3IgKHZhciBpID0gKGN1cnJlbnRUZXh0Lmxlbmd0aCAtIDEpOyBpID4gMDsgLS1pKQor
ICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGV4dFtpXSAhPT0gIiAiKQorICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY3VycmVudFRleHQgPSBjdXJyZW50VGV4dC5z
dWJzdHJpbmcoMCwgKGkgKyAxKSk7CisKKyAgICAgICAgICAgIHZhciBmb3VuZEluZGV4ID0gbnVs
bDsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcGxldGlvbnMubGVuZ3RoOyAr
K2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGxldGlvbnNbaV0gPT09IGN1cnJlbnRUZXh0
KQorICAgICAgICAgICAgICAgICAgICBmb3VuZEluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IG51bGwgfHwgKGZvdW5kSW5kZXggKyAxKSA+
PSBjb21wbGV0aW9ucy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdmFyIGNvbXBsZXRpb25UZXh0
ID0gY29tcGxldGlvbnNbMF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFy
IGNvbXBsZXRpb25UZXh0ID0gY29tcGxldGlvbnNbZm91bmRJbmRleCArIDFdOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKHdpbmRvdy5ldmVudCAmJiB3aW5kb3cuZXZlbnQuYWx0S2V5KQorICAg
ICAgICAgICAgY29tcGxldGlvblRleHQgKz0gIiAiOworCisgICAgICAgIHZhciB3b3JkUHJlZml4
TGVuZ3RoID0gd29yZFByZWZpeFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoOworCisgICAgICAgIGZ1
bGxXb3JkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKKworICAgICAgICB2YXIgZmluYWxTZWxlY3Rp
b25SYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisKKyAgICAgICAgaWYgKGF1dG8pIHsK
KyAgICAgICAgICAgIHZhciBwcmVmaXhUZXh0ID0gY29tcGxldGlvblRleHQuc3Vic3RyaW5nKDAs
IHdvcmRQcmVmaXhMZW5ndGgpOworICAgICAgICAgICAgdmFyIHN1ZmZpeFRleHQgPSBjb21wbGV0
aW9uVGV4dC5zdWJzdHJpbmcod29yZFByZWZpeExlbmd0aCk7CisKKyAgICAgICAgICAgIHZhciBw
cmVmaXhUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHByZWZpeFRleHQpOworICAg
ICAgICAgICAgZnVsbFdvcmRSYW5nZS5pbnNlcnROb2RlKHByZWZpeFRleHROb2RlKTsgICAgICAg
ICAgIAorCisgICAgICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZUVsZW1lbnQgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJzcGFuIik7CisgICAgICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZUVsZW1l
bnQuY2xhc3NOYW1lID0gImF1dG8tY29tcGxldGUtdGV4dCI7CisgICAgICAgICAgICB0aGlzLmF1
dG9Db21wbGV0ZUVsZW1lbnQudGV4dENvbnRlbnQgPSBzdWZmaXhUZXh0OworCisgICAgICAgICAg
ICBwcmVmaXhUZXh0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmF1dG9Db21wbGV0
ZUVsZW1lbnQsIHByZWZpeFRleHROb2RlLm5leHRTaWJsaW5nKTsKKworICAgICAgICAgICAgZmlu
YWxTZWxlY3Rpb25SYW5nZS5zZXRTdGFydChwcmVmaXhUZXh0Tm9kZSwgd29yZFByZWZpeExlbmd0
aCk7CisgICAgICAgICAgICBmaW5hbFNlbGVjdGlvblJhbmdlLnNldEVuZChwcmVmaXhUZXh0Tm9k
ZSwgd29yZFByZWZpeExlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIg
Y29tcGxldGlvblRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29tcGxldGlvblRl
eHQpOworICAgICAgICAgICAgZnVsbFdvcmRSYW5nZS5pbnNlcnROb2RlKGNvbXBsZXRpb25UZXh0
Tm9kZSk7ICAgICAgICAgICAKKworICAgICAgICAgICAgaWYgKGNvbXBsZXRpb25zLmxlbmd0aCA+
IDEpCisgICAgICAgICAgICAgICAgZmluYWxTZWxlY3Rpb25SYW5nZS5zZXRTdGFydChjb21wbGV0
aW9uVGV4dE5vZGUsIHdvcmRQcmVmaXhMZW5ndGgpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIGZpbmFsU2VsZWN0aW9uUmFuZ2Uuc2V0U3RhcnQoY29tcGxldGlvblRleHROb2Rl
LCBjb21wbGV0aW9uVGV4dC5sZW5ndGgpOworCisgICAgICAgICAgICBmaW5hbFNlbGVjdGlvblJh
bmdlLnNldEVuZChjb21wbGV0aW9uVGV4dE5vZGUsIGNvbXBsZXRpb25UZXh0Lmxlbmd0aCk7Cisg
ICAgICAgIH0KKworICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CisgICAgICAg
IHNlbGVjdGlvbi5hZGRSYW5nZShmaW5hbFNlbGVjdGlvblJhbmdlKTsKKyAgICB9LAorCisgICAg
Y29tcGxldGlvbnM6IGZ1bmN0aW9uKHdvcmRSYW5nZSwgYmVzdE1hdGNoT25seSkgeworICAgICAg
ICB2YXIgcHJlZml4ID0gd29yZFJhbmdlLnRvU3RyaW5nKCk7CisKKyAgICAgICAgdmFyIGV4cHJl
c3Npb24gPSB0aGlzLl9iYWNrd2FyZHNSYW5nZSgiID06KHs7Iiwgd29yZFJhbmdlLnN0YXJ0Q29u
dGFpbmVyLCB3b3JkUmFuZ2Uuc3RhcnRPZmZzZXQsIHRoaXMucHJvbXB0RWxlbWVudCk7CisKKyAg
ICAgICAgdmFyIGV4cHJlc3Npb25TdHJpbmcgPSBleHByZXNzaW9uLnRvU3RyaW5nKCk7CisgICAg
ICAgIGZvciAodmFyIGkgPSAoZXhwcmVzc2lvblN0cmluZy5sZW5ndGggLSAxKTsgaSA+IDA7IC0t
aSkKKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uU3RyaW5nW2ldICE9PSAiLiIpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZXhwcmVzc2lvblN0cmluZyA9IGV4cHJlc3Npb25T
dHJpbmcuc3Vic3RyaW5nKDAsIChpICsgMSkpOworCisgICAgICAgIGlmICghZXhwcmVzc2lvblN0
cmluZyAmJiAhcHJlZml4KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHZhciByZXN1
bHQgPSB3aW5kb3c7CisgICAgICAgIGlmIChleHByZXNzaW9uU3RyaW5nKSB7CisgICAgICAgICAg
ICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2V2YWxJbkluc3BlY3RlZFdp
bmRvdyhleHByZXNzaW9uU3RyaW5nKTsKKyAgICAgICAgICAgIH0gY2F0Y2goZSkgeworICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZh
ciByZXN1bHRzID0gW107CisgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LnNvcnRlZFBy
b3BlcnRpZXMocmVzdWx0KTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVz
Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ld
OworICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCA8IHByZWZpeC5sZW5ndGgpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAocHJvcGVydHkuc3Vic3RyaW5n
KDAsIHByZWZpeC5sZW5ndGgpICE9PSBwcmVmaXgpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICByZXN1bHRzLnB1c2gocHJvcGVydHkpOworICAgICAgICAgICAgaWYgKGJl
c3RNYXRjaE9ubHkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gcmVzdWx0czsKICAgICB9LAogCiAgICAgY2xlYXJCdXR0b25DbGlja2VkOiBmdW5j
dGlvbigpCkBAIC0xMTUsNyArMzI0LDIzIEBAIFdlYkluc3BlY3Rvci5Db25zb2xlUGFuZWwucHJv
dG90eXBlID0gewogICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZXMoKTsKICAgICB9LAogCi0gICAg
bWVzc2FnZUxpc3RDbGlja2VkOiBmdW5jdGlvbihldmVudCkKKyAgICBtZXNzYWdlc1NlbGVjdFN0
YXJ0OiBmdW5jdGlvbihldmVudCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25U
aW1lb3V0KQorICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NlbGVjdGlvblRpbWVvdXQp
OworCisgICAgICAgIGZ1bmN0aW9uIG1vdmVCYWNrSWZPdXRzaWRlKCkKKyAgICAgICAgeworICAg
ICAgICAgICAgZGVsZXRlIHRoaXMuX3NlbGVjdGlvblRpbWVvdXQ7CisgICAgICAgICAgICBpZiAo
dGhpcy5fY2FyZXRJbnNpZGVQcm9tcHQoKSB8fCAhd2luZG93LmdldFNlbGVjdGlvbigpLmlzQ29s
bGFwc2VkKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHRoaXMuX21vdmVD
YXJldFRvRW5kT2ZQcm9tcHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3NlbGVjdGlv
blRpbWVvdXQgPSBzZXRUaW1lb3V0KG1vdmVCYWNrSWZPdXRzaWRlLmJpbmQodGhpcyksIDEwMCk7
CisgICAgfSwKKworICAgIG1lc3NhZ2VzQ2xpY2tlZDogZnVuY3Rpb24oZXZlbnQpCiAgICAgewog
ICAgICAgICB2YXIgbGluayA9IGV2ZW50LnRhcmdldC5maXJzdFBhcmVudE9yU2VsZldpdGhOb2Rl
TmFtZSgiYSIpOwogICAgICAgICBpZiAobGluayAmJiBsaW5rLnJlcHJlc2VudGVkTm9kZSkgewpA
QCAtMTIzLDExICszNDgsMTQgQEAgV2ViSW5zcGVjdG9yLkNvbnNvbGVQYW5lbC5wcm90b3R5cGUg
PSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICB2YXIgaXRlbSA9
IGV2ZW50LnRhcmdldC5maXJzdFBhcmVudE9yU2VsZldpdGhOb2RlTmFtZSgibGkiKTsKLSAgICAg
ICAgaWYgKCFpdGVtKQorICAgICAgICB2YXIgbWVzc2FnZUVsZW1lbnQgPSBldmVudC50YXJnZXQu
Zmlyc3RQYXJlbnRPclNlbGZXaXRoQ2xhc3MoImNvbnNvbGUtbWVzc2FnZSIpOworICAgICAgICBp
ZiAoIW1lc3NhZ2VFbGVtZW50KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHZhciBy
ZXNvdXJjZSA9IGl0ZW0ubWVzc2FnZS5yZXNvdXJjZTsKKyAgICAgICAgaWYgKCFtZXNzYWdlRWxl
bWVudC5tZXNzYWdlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHZhciByZXNvdXJj
ZSA9IG1lc3NhZ2VFbGVtZW50Lm1lc3NhZ2UucmVzb3VyY2U7CiAgICAgICAgIGlmICghcmVzb3Vy
Y2UpCiAgICAgICAgICAgICByZXR1cm47CiAKQEAgLTE1MiwzOCArMzgwLDEyNCBAQCBXZWJJbnNw
ZWN0b3IuQ29uc29sZVBhbmVsLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgIGNhc2UgIkRvd24i
OgogICAgICAgICAgICAgICAgIHRoaXMuX29uRG93blByZXNzZWQoZXZlbnQpOwogICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAiVSswMDA5IjogLy8gVGFiCisgICAgICAg
ICAgICAgICAgdGhpcy5fb25UYWJQcmVzc2VkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGNhc2UgIlJpZ2h0IjoKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMu
YWNjZXB0QXV0b0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b0NvbXBs
ZXRlU29vbigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgICAgICB0aGlzLmNsZWFyQXV0b0NvbXBsZXRlKCk7CisgICAgICAgICAgICAg
ICAgdGhpcy5hdXRvQ29tcGxldGVTb29uKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgIH0KICAgICB9LAogCisgICAgX2JhY2t3YXJkc1JhbmdlOiBmdW5jdGlvbihzdG9wQ2hhcmFj
dGVycywgZW5kTm9kZSwgZW5kT2Zmc2V0LCBzdGF5V2l0aGluRWxlbWVudCkKKyAgICB7CisgICAg
ICAgIHZhciBzdGFydE5vZGU7CisgICAgICAgIHZhciBzdGFydE9mZnNldCA9IDA7CisgICAgICAg
IHZhciBub2RlID0gZW5kTm9kZTsKKworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAg
ICAgaWYgKG5vZGUgPT09IHN0YXlXaXRoaW5FbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYg
KCFzdGFydE5vZGUpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXlXaXRoaW5F
bGVtZW50OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKKyAgICAgICAgICAg
ICAgICB2YXIgc3RhcnQgPSAobm9kZSA9PT0gZW5kTm9kZSA/IGVuZE9mZnNldCA6IG5vZGUubm9k
ZVZhbHVlLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IChzdGFydCAtIDEp
OyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcmFjdGVyID0gbm9k
ZS5ub2RlVmFsdWVbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wQ2hhcmFjdGVycy5p
bmRleE9mKGNoYXJhY3RlcikgIT09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFy
dE5vZGUgPSBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpICsg
MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3Rh
cnROb2RlKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBub2RlID0gbm9k
ZS50cmF2ZXJzZVByZXZpb3VzTm9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJlc3Vs
dCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAgICAgIHJlc3VsdC5zZXRTdGFydChzdGFy
dE5vZGUsIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgcmVzdWx0LnNldEVuZChlbmROb2RlLCBlbmRP
ZmZzZXQpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSwKKworICAgIF9ldmFsSW5J
bnNwZWN0ZWRXaW5kb3c6IGZ1bmN0aW9uKGV4cHJlc3Npb24pCisgICAgeworICAgICAgICAvLyBU
aGlzIHdpdGggYmxvY2sgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGh0dHA6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTExMzk5CisgICAgICAgIHdpdGggKEluc3BlY3RvckNvbnRy
b2xsZXIuaW5zcGVjdGVkV2luZG93KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBldmFsKGV4cHJl
c3Npb24pOworICAgICAgICB9CisgICAgfSwKKworICAgIF9jYXJldEluc2lkZVByb21wdDogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rp
b24oKTsKKyAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCB8fCAhc2VsZWN0aW9uLmlz
Q29sbGFwc2VkKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2YXIgc2VsZWN0
aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKKyAgICAgICAgaWYgKHNlbGVjdGlv
blJhbmdlLnN0YXJ0Q29udGFpbmVyICE9PSB0aGlzLnByb21wdEVsZW1lbnQgJiYgIXNlbGVjdGlv
blJhbmdlLnN0YXJ0Q29udGFpbmVyLmlzRGVzY2VuZGFudCh0aGlzLnByb21wdEVsZW1lbnQpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAor
CisgICAgX21vdmVDYXJldFRvRW5kT2ZQcm9tcHQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIHZhciBzZWxl
Y3Rpb25SYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisKKyAgICAgICAgdmFyIG9mZnNl
dCA9IHRoaXMucHJvbXB0RWxlbWVudC5maXJzdENoaWxkID8gMSA6IDA7CisgICAgICAgIHNlbGVj
dGlvblJhbmdlLnNldFN0YXJ0KHRoaXMucHJvbXB0RWxlbWVudCwgb2Zmc2V0KTsKKyAgICAgICAg
c2VsZWN0aW9uUmFuZ2Uuc2V0RW5kKHRoaXMucHJvbXB0RWxlbWVudCwgb2Zmc2V0KTsKKworICAg
ICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CisgICAgICAgIHNlbGVjdGlvbi5hZGRS
YW5nZShzZWxlY3Rpb25SYW5nZSk7CisgICAgfSwKKworICAgIF9vblRhYlByZXNzZWQ6IGZ1bmN0
aW9uKGV2ZW50KQorICAgIHsKKyAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAg
ICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgICAgIHRoaXMuY29tcGxldGUoKTsKKyAg
ICB9LAorCiAgICAgX29uRW50ZXJQcmVzc2VkOiBmdW5jdGlvbihldmVudCkKICAgICB7CiAgICAg
ICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlv
bigpOwogCi0gICAgICAgIHZhciBzdHIgPSB0aGlzLmNvbnNvbGVQcm9tcHQudmFsdWU7CisgICAg
ICAgIHRoaXMuY2xlYXJBdXRvQ29tcGxldGUodHJ1ZSk7CisKKyAgICAgICAgdmFyIHN0ciA9IHRo
aXMucHJvbXB0VGV4dDsKICAgICAgICAgaWYgKCFzdHIubGVuZ3RoKQogICAgICAgICAgICAgcmV0
dXJuOwogCiAgICAgICAgIHRoaXMuY29tbWFuZEhpc3RvcnkucHVzaChzdHIpOwogICAgICAgICB0
aGlzLmNvbW1hbmRPZmZzZXQgPSAwOwogCi0gICAgICAgIHRoaXMuY29uc29sZVByb21wdC52YWx1
ZSA9ICIiOworICAgICAgICB0aGlzLnByb21wdFRleHQgPSAiIjsKIAogICAgICAgICB2YXIgcmVz
dWx0OwogICAgICAgICB2YXIgZXhjZXB0aW9uID0gZmFsc2U7CiAgICAgICAgIHRyeSB7Ci0gICAg
ICAgICAgICAvLyBUaGlzIHdpdGggYmxvY2sgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGh0dHA6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExMzk5Ci0gICAgICAgICAgICB3aXRo
IChJbnNwZWN0b3JDb250cm9sbGVyLmluc3BlY3RlZFdpbmRvdygpKSB7Ci0gICAgICAgICAgICAg
ICAgcmVzdWx0ID0gZXZhbChzdHIpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0
ID0gdGhpcy5fZXZhbEluSW5zcGVjdGVkV2luZG93KHN0cik7CiAgICAgICAgIH0gY2F0Y2goZSkg
ewogICAgICAgICAgICAgcmVzdWx0ID0gZTsKICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHRydWU7
CiAgICAgICAgIH0KIAogICAgICAgICB2YXIgbGV2ZWwgPSBleGNlcHRpb24gPyBXZWJJbnNwZWN0
b3IuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yIDogV2ViSW5zcGVjdG9yLkNvbnNv
bGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5Mb2c7Ci0KLSAgICAgICAgdGhpcy5hZGRNZXNzYWdlKG5l
dyBXZWJJbnNwZWN0b3IuQ29uc29sZUNvbW1hbmQoc3RyLCB0aGlzLl9mb3JtYXQocmVzdWx0KSkp
OworICAgICAgICB0aGlzLmFkZE1lc3NhZ2UobmV3IFdlYkluc3BlY3Rvci5Db25zb2xlQ29tbWFu
ZChzdHIsIHJlc3VsdCwgdGhpcy5fZm9ybWF0KHJlc3VsdCksIGxldmVsKSk7CiAgICAgfSwKIAog
ICAgIF9vblVwUHJlc3NlZDogZnVuY3Rpb24oZXZlbnQpCkBAIC0xOTUsMTEgKzUwOSwxMCBAQCBX
ZWJJbnNwZWN0b3IuQ29uc29sZVBhbmVsLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgIHJldHVy
bjsKIAogICAgICAgICBpZiAodGhpcy5jb21tYW5kT2Zmc2V0ID09IDApCi0gICAgICAgICAgICB0
aGlzLnRlbXBTYXZlZENvbW1hbmQgPSB0aGlzLmNvbnNvbGVQcm9tcHQudmFsdWU7CisgICAgICAg
ICAgICB0aGlzLnRlbXBTYXZlZENvbW1hbmQgPSB0aGlzLnByb21wdFRleHQ7CiAKICAgICAgICAg
Kyt0aGlzLmNvbW1hbmRPZmZzZXQ7Ci0gICAgICAgIHRoaXMuY29uc29sZVByb21wdC52YWx1ZSA9
IHRoaXMuY29tbWFuZEhpc3RvcnlbdGhpcy5jb21tYW5kSGlzdG9yeS5sZW5ndGggLSB0aGlzLmNv
bW1hbmRPZmZzZXRdOwotICAgICAgICB0aGlzLmNvbnNvbGVQcm9tcHQubW92ZUN1cnNvclRvRW5k
KCk7CisgICAgICAgIHRoaXMucHJvbXB0VGV4dCA9IHRoaXMuY29tbWFuZEhpc3RvcnlbdGhpcy5j
b21tYW5kSGlzdG9yeS5sZW5ndGggLSB0aGlzLmNvbW1hbmRPZmZzZXRdOwogICAgIH0sCiAKICAg
ICBfb25Eb3duUHJlc3NlZDogZnVuY3Rpb24oZXZlbnQpCkBAIC0yMTMsMTQgKzUyNiwxMiBAQCBX
ZWJJbnNwZWN0b3IuQ29uc29sZVBhbmVsLnByb3RvdHlwZSA9IHsKICAgICAgICAgLS10aGlzLmNv
bW1hbmRPZmZzZXQ7CiAKICAgICAgICAgaWYgKHRoaXMuY29tbWFuZE9mZnNldCA9PSAwKSB7Ci0g
ICAgICAgICAgICB0aGlzLmNvbnNvbGVQcm9tcHQudmFsdWUgPSB0aGlzLnRlbXBTYXZlZENvbW1h
bmQ7Ci0gICAgICAgICAgICB0aGlzLmNvbnNvbGVQcm9tcHQubW92ZUN1cnNvclRvRW5kKCk7Cisg
ICAgICAgICAgICB0aGlzLnByb21wdFRleHQgPSB0aGlzLnRlbXBTYXZlZENvbW1hbmQ7CiAgICAg
ICAgICAgICBkZWxldGUgdGhpcy50ZW1wU2F2ZWRDb21tYW5kOwogICAgICAgICAgICAgcmV0dXJu
OwogICAgICAgICB9CiAKLSAgICAgICAgdGhpcy5jb25zb2xlUHJvbXB0LnZhbHVlID0gdGhpcy5j
b21tYW5kSGlzdG9yeVt0aGlzLmNvbW1hbmRIaXN0b3J5Lmxlbmd0aCAtIHRoaXMuY29tbWFuZE9m
ZnNldF07Ci0gICAgICAgIHRoaXMuY29uc29sZVByb21wdC5tb3ZlQ3Vyc29yVG9FbmQoKTsKKyAg
ICAgICAgdGhpcy5wcm9tcHRUZXh0ID0gdGhpcy5jb21tYW5kSGlzdG9yeVt0aGlzLmNvbW1hbmRI
aXN0b3J5Lmxlbmd0aCAtIHRoaXMuY29tbWFuZE9mZnNldF07CiAgICAgfSwKIAogICAgIF9mb3Jt
YXQ6IGZ1bmN0aW9uKG91dHB1dCkKQEAgLTMxOSw0NiArNjMwLDUwIEBAIFdlYkluc3BlY3Rvci5D
b25zb2xlTWVzc2FnZS5wcm90b3R5cGUgPSAKICAgICAgICAgcmV0dXJuIHRoaXMudXJsOwogICAg
IH0sCiAKLSAgICB0b0xpc3RJdGVtOiBmdW5jdGlvbigpCisgICAgdG9NZXNzYWdlRWxlbWVudDog
ZnVuY3Rpb24oKQogICAgIHsKLSAgICAgICAgdmFyIGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJsaSIpOwotICAgICAgICBpdGVtLmNsYXNzTmFtZSA9ICJjb25zb2xlLW1lc3NhZ2UiOwor
ICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAg
ICAgICBlbGVtZW50Lm1lc3NhZ2UgPSB0aGlzOworICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9
ICJjb25zb2xlLW1lc3NhZ2UiOworCiAgICAgICAgIHN3aXRjaCAodGhpcy5zb3VyY2UpIHsKICAg
ICAgICAgICAgIGNhc2UgV2ViSW5zcGVjdG9yLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2Uu
SFRNTDoKLSAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTmFtZSArPSAiIGNvbnNvbGUtaHRtbC1z
b3VyY2UiOworICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkU3R5bGVDbGFzcygiY29uc29sZS1o
dG1sLXNvdXJjZSIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBX
ZWJJbnNwZWN0b3IuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5YTUw6Ci0gICAgICAgICAg
ICAgICAgaXRlbS5jbGFzc05hbWUgKz0gIiBjb25zb2xlLXhtbC1zb3VyY2UiOworICAgICAgICAg
ICAgICAgIGVsZW1lbnQuYWRkU3R5bGVDbGFzcygiY29uc29sZS14bWwtc291cmNlIik7CiAgICAg
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdlYkluc3BlY3Rvci5Db25zb2xl
TWVzc2FnZS5NZXNzYWdlU291cmNlLkpTOgotICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NOYW1l
ICs9ICIgY29uc29sZS1qcy1zb3VyY2UiOworICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkU3R5
bGVDbGFzcygiY29uc29sZS1qcy1zb3VyY2UiKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAg
ICAgICAgICAgIGNhc2UgV2ViSW5zcGVjdG9yLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2Uu
Q1NTOgotICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NOYW1lICs9ICIgY29uc29sZS1jc3Mtc291
cmNlIjsKKyAgICAgICAgICAgICAgICBlbGVtZW50LmFkZFN0eWxlQ2xhc3MoImNvbnNvbGUtY3Nz
LXNvdXJjZSIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBXZWJJ
bnNwZWN0b3IuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5PdGhlcjoKLSAgICAgICAgICAg
ICAgICBpdGVtLmNsYXNzTmFtZSArPSAiIGNvbnNvbGUtb3RoZXItc291cmNlIjsKKyAgICAgICAg
ICAgICAgICBlbGVtZW50LmFkZFN0eWxlQ2xhc3MoImNvbnNvbGUtb3RoZXItc291cmNlIik7CiAg
ICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKHRoaXMu
bGV2ZWwpIHsKICAgICAgICAgICAgIGNhc2UgV2ViSW5zcGVjdG9yLkNvbnNvbGVNZXNzYWdlLk1l
c3NhZ2VMZXZlbC5UaXA6Ci0gICAgICAgICAgICAgICAgaXRlbS5jbGFzc05hbWUgKz0gIiBjb25z
b2xlLXRpcC1sZXZlbCI7CisgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRTdHlsZUNsYXNzKCJj
b25zb2xlLXRpcC1sZXZlbCIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg
Y2FzZSBXZWJJbnNwZWN0b3IuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkxvZzoKLSAgICAg
ICAgICAgICAgICBpdGVtLmNsYXNzTmFtZSArPSAiIGNvbnNvbGUtbG9nLWxldmVsIjsKKyAgICAg
ICAgICAgICAgICBlbGVtZW50LmFkZFN0eWxlQ2xhc3MoImNvbnNvbGUtbG9nLWxldmVsIik7CiAg
ICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdlYkluc3BlY3Rvci5Db25z
b2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuV2FybmluZzoKLSAgICAgICAgICAgICAgICBpdGVtLmNs
YXNzTmFtZSArPSAiIGNvbnNvbGUtd2FybmluZy1sZXZlbCI7CisgICAgICAgICAgICAgICAgZWxl
bWVudC5hZGRTdHlsZUNsYXNzKCJjb25zb2xlLXdhcm5pbmctbGV2ZWwiKTsKICAgICAgICAgICAg
ICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgV2ViSW5zcGVjdG9yLkNvbnNvbGVNZXNzYWdl
Lk1lc3NhZ2VMZXZlbC5FcnJvcjoKLSAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTmFtZSArPSAi
IGNvbnNvbGUtZXJyb3ItbGV2ZWwiOworICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkU3R5bGVD
bGFzcygiY29uc29sZS1lcnJvci1sZXZlbCIpOwogICAgICAgICB9CiAKLSAgICAgICAgdmFyIG1l
c3NhZ2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgICAgbWVzc2Fn
ZURpdi5jbGFzc05hbWUgPSAiY29uc29sZS1tZXNzYWdlLW1lc3NhZ2UiOwotICAgICAgICBtZXNz
YWdlRGl2LnRleHRDb250ZW50ID0gdGhpcy5tZXNzYWdlOwotICAgICAgICBpdGVtLmFwcGVuZENo
aWxkKG1lc3NhZ2VEaXYpOworICAgICAgICB2YXIgbWVzc2FnZVRleHRFbGVtZW50ID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworICAgICAgICBtZXNzYWdlVGV4dEVsZW1lbnQuY2xh
c3NOYW1lID0gImNvbnNvbGUtbWVzc2FnZS10ZXh0IjsKKyAgICAgICAgbWVzc2FnZVRleHRFbGVt
ZW50LnRleHRDb250ZW50ID0gdGhpcy5tZXNzYWdlOworICAgICAgICBlbGVtZW50LmFwcGVuZENo
aWxkKG1lc3NhZ2VUZXh0RWxlbWVudCk7CisKKyAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChk
b2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKIAogICAgICAgICBpZiAodGhpcy51cmwgJiYg
dGhpcy51cmwgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICB2YXIgdXJsRWxlbWVudCA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKQEAgLTM2OSwxMCArNjg0LDEwIEBAIFdlYklu
c3BlY3Rvci5Db25zb2xlTWVzc2FnZS5wcm90b3R5cGUgPSAKICAgICAgICAgICAgIGVsc2UKICAg
ICAgICAgICAgICAgICB1cmxFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy51cmw7CiAKLSAgICAg
ICAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQodXJsRWxlbWVudCk7CisgICAgICAgICAgICBlbGVtZW50
LmFwcGVuZENoaWxkKHVybEVsZW1lbnQpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGl0
ZW07CisgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgIH0sCiAKICAgICB0b1N0cmluZzogZnVu
Y3Rpb24oKQpAQCAtNDIzLDM3ICs3MzgsNTUgQEAgV2ViSW5zcGVjdG9yLkNvbnNvbGVNZXNzYWdl
Lk1lc3NhZ2VTb3VyYwogICAgIEpTOiAyLAogICAgIENTUzogMywKICAgICBPdGhlcjogNCwKLX07
Cit9CiAKIFdlYkluc3BlY3Rvci5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgPSB7CiAgICAg
VGlwOiAwLAogICAgIExvZzogMSwKICAgICBXYXJuaW5nOiAyLAotICAgIEVycm9yOiAzLAotfTsK
KyAgICBFcnJvcjogMworfQogCi1XZWJJbnNwZWN0b3IuQ29uc29sZUNvbW1hbmQgPSBmdW5jdGlv
bihpbnB1dCwgb3V0cHV0KQorV2ViSW5zcGVjdG9yLkNvbnNvbGVDb21tYW5kID0gZnVuY3Rpb24o
Y29tbWFuZCwgcmVzdWx0LCBmb3JtYXR0ZWRSZXN1bHRFbGVtZW50LCBsZXZlbCkKIHsKLSAgICB0
aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7CisgICAgdGhpcy5j
b21tYW5kID0gY29tbWFuZDsKKyAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKyAgICB0aGlzLmZv
cm1hdHRlZFJlc3VsdEVsZW1lbnQgPSBmb3JtYXR0ZWRSZXN1bHRFbGVtZW50OworICAgIHRoaXMu
bGV2ZWwgPSBsZXZlbDsKIH0KIAogV2ViSW5zcGVjdG9yLkNvbnNvbGVDb21tYW5kLnByb3RvdHlw
ZSA9IHsKLSAgICB0b0xpc3RJdGVtOiBmdW5jdGlvbigpCisgICAgdG9NZXNzYWdlRWxlbWVudDog
ZnVuY3Rpb24oKQogICAgIHsKLSAgICAgICAgdmFyIGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJsaSIpOwotICAgICAgICBpdGVtLmNsYXNzTmFtZSA9ICJjb25zb2xlLWNvbW1hbmQiOwor
ICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAg
ICAgICBlbGVtZW50LmNvbW1hbmQgPSB0aGlzOworICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9
ICJjb25zb2xlLXVzZXItY29tbWFuZCI7CisKKyAgICAgICAgdmFyIGNvbW1hbmRUZXh0RWxlbWVu
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKyAgICAgICAgY29tbWFuZFRleHRF
bGVtZW50LmNsYXNzTmFtZSA9ICJjb25zb2xlLW1lc3NhZ2UtdGV4dCI7CisgICAgICAgIGNvbW1h
bmRUZXh0RWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuY29tbWFuZDsKKyAgICAgICAgZWxlbWVu
dC5hcHBlbmRDaGlsZChjb21tYW5kVGV4dEVsZW1lbnQpOworCisgICAgICAgIHZhciByZXN1bHRF
bGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgIHJlc3VsdEVs
ZW1lbnQuY2xhc3NOYW1lID0gImNvbnNvbGUtbWVzc2FnZSI7CisgICAgICAgIGVsZW1lbnQuYXBw
ZW5kQ2hpbGQocmVzdWx0RWxlbWVudCk7CisKKyAgICAgICAgc3dpdGNoICh0aGlzLmxldmVsKSB7
CisgICAgICAgICAgICBjYXNlIFdlYkluc3BlY3Rvci5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2
ZWwuTG9nOgorICAgICAgICAgICAgICAgIHJlc3VsdEVsZW1lbnQuYWRkU3R5bGVDbGFzcygiY29u
c29sZS1sb2ctbGV2ZWwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNh
c2UgV2ViSW5zcGVjdG9yLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5XYXJuaW5nOgorICAg
ICAgICAgICAgICAgIHJlc3VsdEVsZW1lbnQuYWRkU3R5bGVDbGFzcygiY29uc29sZS13YXJuaW5n
LWxldmVsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdlYklu
c3BlY3Rvci5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuRXJyb3I6CisgICAgICAgICAgICAg
ICAgcmVzdWx0RWxlbWVudC5hZGRTdHlsZUNsYXNzKCJjb25zb2xlLWVycm9yLWxldmVsIik7Cisg
ICAgICAgIH0KIAotICAgICAgICB2YXIgaW5wdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJkaXYiKTsKLSAgICAgICAgaW5wdXREaXYuY2xhc3NOYW1lID0gImNvbnNvbGUtY29tbWFuZC1p
bnB1dCI7Ci0gICAgICAgIGlucHV0RGl2LnRleHRDb250ZW50ID0gdGhpcy5pbnB1dDsKLSAgICAg
ICAgaXRlbS5hcHBlbmRDaGlsZChpbnB1dERpdik7Ci0KLSAgICAgICAgdmFyIG91dHB1dERpdiA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgICAgICBvdXRwdXREaXYuY2xhc3NO
YW1lID0gImNvbnNvbGUtY29tbWFuZC1vdXRwdXQiOwotICAgICAgICBvdXRwdXREaXYuYXBwZW5k
Q2hpbGQodGhpcy5vdXRwdXQpOwotICAgICAgICBpdGVtLmFwcGVuZENoaWxkKG91dHB1dERpdik7
CisgICAgICAgIHZhciByZXN1bHRUZXh0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
InNwYW4iKTsKKyAgICAgICAgcmVzdWx0VGV4dEVsZW1lbnQuY2xhc3NOYW1lID0gImNvbnNvbGUt
bWVzc2FnZS10ZXh0IjsKKyAgICAgICAgcmVzdWx0VGV4dEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhp
cy5mb3JtYXR0ZWRSZXN1bHRFbGVtZW50KTsKKyAgICAgICAgcmVzdWx0RWxlbWVudC5hcHBlbmRD
aGlsZChyZXN1bHRUZXh0RWxlbWVudCk7CiAKLSAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAg
IHJldHVybiBlbGVtZW50OwogICAgIH0KIH0KSW5kZXg6IHBhZ2UvaW5zcGVjdG9yL0ltYWdlcy9l
cnJvckljb24ucG5nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEg
YmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5cGUgPSBpbWFnZS9wbmcKCmlWQk9SdzBLR2dvQUFBQU5T
VWhFVWdBQUFBb0FBQUFLQ0FZQUFBQ05Ncys5QUFBUFMybERRMUJKUTBNZ1VISnZabWxzWlFBQWVK
eVYKVjNrMDFkM1gzOTk3cjN1TjF6eFAxeEFSSlpuSERGY3l6eUxodXVhNWU4MGg4YVRNUXpUSWtL
bVFJaW1KQ2tsU3hqUklvcEpVeUJPWgp3bjMvb0o1M3ZjLzZyZDk2OXg5bmZjN243SDMyNSt4ejFq
cHJBN0FMa1VKREExRUFFQlFjUnJFNW9FODQ1T1JNd0wwR05EQUJKeENBCmlVU21odXBaV1puQmY3
U2xsNEFBQUR5WEo0V0dCaHFiZEFsL0NNRGxMQnU1Y015Zkh6YjR6M0VBQUlDbkhISnlCa0RrQUlE
TFp3dnYKQndBdWp5MXNCd0Jja1dHaFlRQ0lMd0J3a1gxSm5nQklMQURJVWV4c0RBQ1FLZ0RBKzJ6
aE93Q0E5OWpDM1FDQWp5RDdoQUVncndHdwpITUdlZnNFQXVCa0FySTZuRjVVTWdKY0RBRTlQS2pr
SUFKOE5nTklKQ2dyeEJHQWJBSUNkNUZCS0dBRGJDZ0JJSG5KeUpteEpkbzhGClVHY0dvR3Y5aHd1
aEFOUzdBUWlsL01OSlRRUHcxQUhVai8vRExkZ0FBZ0FJVHovVmU1OGlBQUFnelBvQWRPOW90QVVw
QUZ3dXdFWU8KamZhcmpFYmJLQWRBdndWb0N5U0hVeUsyNjRVZ3ZRRC9iYjUxNW0xREl3QW9BQkFC
UDNpRHVDSHJxQUgwS0IwQis1eitPWk1XSHNOVwp3aW5LSGN4YnlsOGlHQ2VzS3pKQm9JclJKR0ls
ZjBtRlMwL0oyTXQyeU1uSVorOWVWZkRZKzN5ZnNWSzdpcXBxc2RxR2hvUG1aYTE1CkhXWGRpUDFO
ZW1zRzJvWkp4RTZqRldQeGc2WW0vcVluelFyTjZ5MDZMVWVzNW0yWWJHWHNiT3hqSFdvZFI1MFlu
WlVQTzdsUWp5UzQKbm5STGNLZVNjajFheWQrOGhMM3RmRTc3ZHZpdEJld0o5QWpLQ3E0Sk9SUHFj
OVNRc29zcUVNWWV6aDdCR3lrYXRUTjZUNHpTTWExWQpnN2dEOFViSDlSUFVUc2dtQ2lZeEo2My9O
WGZ5US9MTFUwOU9ONmRjVHMxT2kwNG5aWmhtcW1YdHpCYk1ZY3VseTEwOE01N1huVjk3Ck51dGMw
SG5UQzdzS21Bdm1MNzRxdkY5VVhCeFJZbnBKNU5KY2FVdFpjcmxOaFdqRlhHWGI1ZHdyWVZXSHE0
azFlNjhLMStKcTU2NE4KWHI5YUYxdFB2TUY1NDN2RDI1dDlqZTIzN3Q2dWE2cThVOUNjZHZkWWky
ZXI3ajI2ZTgzM3FRK1VIcXkzUFcwdjcwaDQ2TjZwOTBpOApDOTMxOFhGWGQvbVQyQjdycHhKUGZ6
eHI3VTN1cytqbjZYODNVRG5vTXlROTlQbDUrYkRyQzRFWEwxN212Yko3emZ0NmJLVDhEWGxVCmJQ
VGQyL3d4ODNlWWR5M2pZUk1LRTkvZk4zeWdmbFQ4K0gzeThpZm5LZWFwdTU5OXAzbW1PNytFZjVY
K092YXRjTVp1RmoxYk1MZGoKcnZRNzMvZms3NnZ6aFg5Ny9DQXVNQzlrTGJJdnB2OWsvSm0vSkx2
MGNybDY1ZnJxNXJvN2pRWUF2R0FGVnhCK3BCYmxoM2JDeE5PTgo0bElZNHBqdTRBWFppamtGdVlO
NFUvbVBDeG9Jallob2l1WVFQb3ByU1Z5UVhKZHlrbTZWa1pMTjJMVWc3N3k3WFdISDNyOFVKNVIw
CmxITlVQcW9wcVVkcHRHZ3Vhc3ZwSE5aTjI5K2s5ODRBWTBnZzdqZHlPT0J2SEhNdzJTVEw5THha
aVhtRlJaVmx0ZFZWNndhYlI3WmoKZGo4Y3NJNThoM1k2N1hQV09YekF4ZktJZzZ1ckc5azltQlRo
Y1lLYzdWbmlWZWY5MEtmUDk3RmZvMzlKUUVwZ1dKQkhzRldJVHFqOApVUkVLR3hWTlhRNmJDNStL
R0k5OEUvVTYrbFhNOExIZTJKYTRvdmlZNDg0SjJpY2tFcGtTRjVQRy8zcDJzam01OGxUVzZaZ1Vu
MVRMCk5OVjBvWFJheGtSbVcxWnhkbXBPY0s3REdjMDgwWHpJSHo5Nzc5ejU4MGN2R0JlSUZDeGNm
RlNZWCtSZHJGeUNLdW0vVkZKNnRNeSsKWEx0aVJ5VytjdW55MkpXSFZWWFY2VFdoVisxcTFhNEpY
bHUvL3E3dVFYM1pqY1FHejV2RVJvbkd0VnRQYjE5b0NyeWoyOHpaL09WdQplMHRSYTh3OXAvc2FE
MFRhMEcxZjJuczc3andzN2p6OWlOcmwvRmk5bTdYNzQ1T21uak5QUTU2Wjk4cjFzZlROOVE4TTFB
MW1EUGs4CjF4bm1HSjU4VWZjeThwWG1xL1hYSFNQWDNoU01ubnA3ZE16eG5lYTR3UGppUlAvNzhn
L1VqN3FUREpORG44NU9PWDBXK2p3MlhmVEYKNWF2WTE4VnZUMlp5WngzbkJPWmVmYytidC93Yjkz
Zm5qeE1MZW91WXhhR2ZOVXRaeThrcithdFBmbGxzQk5Gb0FJQUhCU0RERlZoRgp5TWhiMUVtMEt5
YUtiaENYd1JESXBNRThoMDlsWTJFUDVHamgzT0NXNFRIakRlQTd4cDhva0N5WUlYUld1RXprbW1n
ejRhSFlVL0YrCmlVSEpuaDJ0VWpYUytUdGpaVWl5eEYyeWN1eHl2K1EvN3g3ZWMxK2haRyswb3ZV
KzhYMXpTazNLeDFXTVZKbFVoOVZLMUlNMWlKcGkKV2lpdFQ5cmRPalc2cC9hNzZ5bm9MZXZmTVRo
bWFFTlVOUkk1UUg5Z3dYajg0RE9UTzZhWHpKTE5mU3dNTGI1WVpsanRzM3B2ZmRiRwp5cGJMZHRT
dXdqN1lRZFVSSEo4ZEtuRHlkbFp3WGpwODErWFlFZTBqbTY3dGJpZmR6VWljcEJHUElyS3JwNURu
aU5kWmJ4c2ZEcDloCjMzTitSL3dKL3VNQmhZR09RYXhCWGNIeElhb2hQMExyang2bHFGQldxTGZE
UXNNbHcxOUZKRWNxUm81Rm5ZNVdpdjRRazN1TUdJdU4KN1krN0dPOS9YRE9CS1dIa1JIbWlkNUpZ
MHF1L1VrNDZKU3VjWWprMWM3b3Y1VVpxWGxwVXVtT0djaVpyNXV1c2pHeko3SHM1cnJtNAozTVl6
L25tU2VlL3pMNTExT3lkNmJ2Sjg3UVZxZ1dyQjZzWG13c2dpNWFMRjRzYVM4RXZxbHpaTEg1V2xs
VnRYOEZTTVZwWmU5cnVpClVvV3RlbFBkVUpONTFiL1c4SnJJdGVYcnordnE2N052UkRWNDNuUnN0
THhsZkZ1bmFlOGRRak5qOC96ZDRaYmJyWVgzRXU3N1BMQnAKMDJ0WDYxQjZxTlNwOGtpOVMrT3hX
cmZpRTZrZXJwNjFweE85OG4zVkE4WkQrR0dXbCtRUm5yZStFNmMvZGMxOFhvNmowUUMyL2o0QQpB
S3dLd0xrdkFJZXRBT3d1QW1RNkFFaFhBSEM3QTFpeEFOaXBBOHBsSjZERURnQkNGUG56ZndpQUd0
aUFIeHlISENpSFJ1aUU1L0FCCjVtRVRZVVlFRVRsRUM3RkEzSkV3NURSU2pEUWl6NUFwRkFvbGl0
SkJ1YUVTVVZXb2Z0UUtXaHh0aVk1RlgwV1BZbGd3ZXBnSVRDMW0Ka2s2RXpva3VqMjRReTRvMXg2
WmhlM0FNT0JOY09tNlFucCtlVEY5SHY4bGd5VkRPc01wb3pYaVZpWTZKeEhTZldaQTVobm1NeFlp
bApBVS9BbjJGbFlFMWtwYkhGc1cyd3gzTUF4d2xPTk9jSkxvUXJnUnU0RTNub2VOSjUrWGlyK2ZU
NVB2Q25DbWdMdkJEMEUxd1h5aFFXCkU3NHBZaXd5S2hwS3dCRkt4YlRGeHNRVEpDd2sxWFlJN0Zp
VWVpeWR2OU5WUmtwbVRyWnAxMGs1ZTNsSithWGR2WHVxRmRMMmhpbDYKN0xOVk1sTFdWTm10S3Fr
bXFNNm5JYUFwcmlXdnJhbHpVTmR1djZ1ZWozNndRWnhoUHZHRzBVdGpPTGpYeE12MHZGbVArWnFs
akpXWApkWjB0MkRuYnR6cEtIY3AyV2p2czd0TGx5dTNtNmw1Sm1pR3JlSjd5R3ZjeDllMzJkd2tZ
RHBJTGpnOFpPQ3BFQ2FhMmhmTkVoRVcrCmpDYkdqTVkyeDZjbEVFL01KU1dmNUVrdU82MlEwcFpt
bC80cE15bDdWODc0bVpMOHdITTZGN2dMNWd2N2k5c3ZOWlcxVkR5ODNGODEKVlBPOHR1ZDZaLzF3
dyt3dDNpYUQ1b2lXUy9mYUg0eTByM1JLZC9sMnR6NlY2RTN2WHh0eUc3NzdjbW5FN2EzR2VOdkgy
MVArMDFaZgpQV2FmL0UxWnZMWHNza3I5eGI1TzJwRGZXTmxNcFdGcFNUUWFBSWlEUGh5QkNNaUFj
bWlDSGhpRE9RUVFka1FjVVVLSWlDUGloOFFpCldVZ0Ywb3dNSUY5UWFKUW9TaHZsaWtwRVZhTmVv
YkZvTlhRQXVoZzloTUZodERCaG1Gck1wKzJiSDhLeVlTMngyZGdoSEEvT0JWZU8KKzBhdlFwOUVQ
OGdneGhETzBNTW96aGpQT01xa3hWVE1qR0wyWng1bTJjL1NnSmZBRjdCeXNtYXpzYkhsc1F1d2wz
SHM1bWpoTk9lYwo0QXJueG5Cbjg0ankzT0FsOG83eWhmTno4amNJMkF1c0NaWUtIUlQ2S1Z3aVlp
NnlKbnFGWUM5R0ozWlRuQ3doTHZGRHNtdEhzVlNrCnRPVk9HUm1zekVmWnRsMGxjdkh5cnJ1MTk0
anNvU21NNzMyZ1dMYnZ0RkswY3J4S3V1bzV0VEwxYW8yYm1xMWFEN1Y3ZGQ3b2Z0dS8Kb1k4M2tE
VWtFbjJOc2crMEduODNZVFBWTnZNeFAyL1JhOFZvZmRBbXgzYk1Yc0VoMlhIU3lkajV1b3ZBa1F6
WERYYy8waTB5bmFlZAoxeFh2ZFY4SHY4WUE3c0RJb0xFUXc5QWJGRkZxVGpnNklpWnlQam9nWmlF
MksxN3hlTitKd0NTR3Y4cVQxVTg5UzNGTm5VMlB5Y1JsClhjZ1J5MjNNMDgvdk8rZDdRYmhnckxD
azJQb1NYV2xUdVgrbHdPWGVxdVFhWWkzYnRjbTZqaHNOTjYvZGV0RFUxVXhwa1dvZHZWL1UKUnU1
UTdlUi90UGw0OGNucU02WSt5UUdMb1dQRDlTOW5SK1JHTmNhSTR4SHZHeWJwcGx5bUgzMlRuSTMv
UHZRRHM4aTd4TGc4dUJxeQpOcjdPczRIZEdOc3NvbG5RYUFDZ0RrR1FCNDB3QUY4UlFIZ1FPY1FB
Y1VFaWtUUElEV1FJK1lrU1FobWhxS2h5MUdzMEc5b0VuWUx1CnhYQmpYREhWbUo5MEJuUm42RDVo
TmJDNTJGbWNLYTZlbnAvK0ZQMHFRd2pERjBZdnhnOU03a3pqek83TW4xbWk4SGg4TGFzMTZ3YmIK
TlhZU0J6ZEhEMmMwbHhUWElIYzhqenpQQjk1aVBpOStkUUVoZ2MrQ1Y0UjhoS1dGcDBXdWlvWVEx
TVZ3WW0vRjcwaDgzc0V0cFNSdAp2Tk5hNXBDczZ5NS91U2o1eE4wNWU2NG9kTzJkM2NlblJGU21x
aFNyOXFxRGhvNW1rbGFmanJDdTcvNEd2VFVEWThQTFJvd0hJbzJuClRaeE5INXNyV09SWklkYUp0
cXgyTlE2MmgxQk9EWWRkajZCZEU5M1dTTUVlN3owUGU3MzFvZnFKK244S0RBaWFDTEVPdlUrUm94
YUUKTTBZa1JTSFI2Y2U4NHlxUHQ1MjRuMVJ4TXU2VWRZcDA2bHI2Zzh5MGJGS3VYcDdzV1o3emNP
SHJ4ZjZpK3BMODByanl3RXFuSy9yVgpoSnJsMnM3cjZmVjJEWkkzbDI5MU41MXJKclVJdHc3Y2oy
NFRhdTk0R1BwSXFtdTZ1N0VuOVpsbm44WUExK0RuNTdkZlJML2E4M3JpClRkWmJ6YkV2NHlYdkQz
K1VuRnlkK2pBOS90WGdXK3hNNld6elhNZjNCL05WZjZmOXNGL2dXK2hialBncCtyTnVTWDJwYzNu
L2N0MksKNkVybXlzS3F5V3JaNnVxYTFWckYydVF2eVY5ZXZ5cC9UYTFMclh1djU2emZXNS9lNE56
UTNmRGZ5TjlvMzVqWjVOczAzankrZVh0egpoaVpCYzZibDBMcHBOSUN0ZmdrQUFCZ05RZ0pES0FR
ekE4UC8wdHo5Znkwb01QeDNEZzRBWUE3MnNMRGN4dE9oWVZaMkFNQURBR3ZVCkNGc2lBTEFCSUd6
ZWZrWUh0ekhCazJSb0NnQkNBSWhDaksrQkJRQXdBeUJtM2hRam02MTlrRVArSkJNckFNQURJUDVl
d2ZhMjIzeFUKYUtDVjJUWk9EUTNUdHdFQVBnQ2swSXRLL08zVEdPTnI1N2dkMjBVSnQ3RUhBRWtB
WkRnZ3hOUm1POWVLcDVmaHRqWVVKampRd214TApNNHJMTCt5Z0hRQndBYUJrd1FoSVFBRWY4QUo1
TUFNRE1Od2VDVUFDQWhoQUNGREFDNmhnQkpOQUFaOC9YZzR3Q1JUdyt6OVI4dUFOCkpLQkFCSGdC
RlFKZ0NpZ1E1T2FYU0FIQ3RzY1RJQU1GU0JEOG0xRzRxdkJGWWYzUHVnR0VRQ0NFd0Q4UnB2OWlm
aXY4eDljUFBDSGsKRDAvK3pidjVKVktDR3J3anpvZEVhemo0WXFRd2loaGxqRDVHRzZPRFVRY0No
Z2NqQVBJWUpZd2FSZytqaTlIRUtHUFUrMmFhWnY3awoyYXFOeDU4em1rSWdlRUU0VU1BTGd2OVZM
L0wvVWdOYnZUc0FBSllOb0RBSkFLQ0RIZit2ZHhibUZSVUdBR0FRRWhwTjhmUHhEU1BvCmhZWUdl
c2tSRGdhVGQ4c1JGQlVVMU9CL0FQT21jeFJJY2FQb0FBQUJZVWxFUVZRWWxUWFFQMHNiWVJ6QThl
L3YvcG5Ma3FXSElsZEkKYVllQ3MzVXkrQTRDZFE2bGk2dERRRVIzeVdLaHEwdGZnWU43QjFHS1hO
MWNCR2xwSktVb3BjaWw2VDMzeE9lZVg0ZlNWL0NCandBbwp5T2RlYnl2MGZralRQRW9RZ0dyc291
ancxZG5aa1lBS3dLZTF0WDZXcHNkUFdxMVFrd1JFRUd2NWFVeHpYOWVidmFJNGtZOHJLMjhXCjQv
akRzNDBOY1dtS3Y3d0VJRmhkSlRLR2I2ZW5lbzkvRy95dTYvM01XcG1WSmZGZ1FKWG5WSGxPUEJn
d0swc3lhMlU2cS9Zam8ycGQKdTQwN1AyZGFsdVFIQndCODM5c2p1Ym9pN0hTd0R3ODIrdE0wT0ZW
cVZmNlpBUUFlcUZWcHFWSTFEZEhjK3dWbkRMSyt6dkx1TGpjNwpPd0E4SDQzNE1ScmhpZ0lyc2hD
K3pyS3BuYy83aTB0TDh1dmlBbGNVNk4wZHM4bUVsclZjajIvVkpjbFFBTjYvNlBhZk9vNWZwbW1v
CmFSdEVDU3JEdFRITmhHaHplL3psUlA2SHYrdDJ0NnE1SFdvUVBpb2VQSEVuU1ErM3gxK1BCUFF2
VDE2cUV2ZHBzcGdBQUFBQVNVVk8KUks1Q1lJST0KCkluZGV4OiBwYWdlL2luc3BlY3Rvci9JbWFn
ZXMvdXNlcklucHV0SWNvbi5wbmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJr
ZWQgYXMgYSBiaW5hcnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0
cmVhbQoKUHJvcGVydHkgY2hhbmdlcyBvbjogcGFnZS9pbnNwZWN0b3IvSW1hZ2VzL3VzZXJJbnB1
dEljb24ucG5nCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX18KTmFtZTogc3ZuOm1pbWUtdHlwZQogICArIGFwcGxpY2F0aW9u
L29jdGV0LXN0cmVhbQoKCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFLQ0FZQUFBQ05N
cys5QUFBQ0ttbERRMUJKUTBNZ1VISnZabWxzWlFBQWVKeWQKa2o5b0UzRVV4ejkzVVZ1eHhCcGlY
U3plSUZVa1NtZ0cyNldrVFZxSktUV2tLVzJ5WGUrdXllbmQ1ZWZkSlZwUmNPenM1S0NES09pZwo0
Q2hkV3B5SzRDQ0NScHpjM0F0RnNHMGN6cnNNVWdvKytNSG5QZDd2L2ZuK2ZoRGJWWVd3Wk1CMmZM
ZDhiVXBacXRhVXZnNHhUaEJuCmtINVY4OFJrcVRUTGdiYnpCUW5nODJWVkNLc3pzZmI0NjZtZDkx
c3ZFOGZQakYvNmNmQTlBT0x1VXJVR1VncEkxZ1BPQXNubGdDdEEKOG80dmZKQWFRRkpycURwSTk0
R1VXeW5uUUhvRnhPc0J2d1BpeXdGdkFmRzJWdmRCNmdCcFJ6Y2RrUHVCTWQzd05KQ3pnS2w3bWcz
eQphNUNPMkhaVGg5aGI0S0ltWEI5aUhlRDhVcldtQkNPM3o4SEVCWkRYZXJHYUMyODI0UFJ1THph
U2grUlZXSC9XaTIwUElRSFMwQWR2CkpUTUtnRFRnd3RGZjNlNzJNUFN0dzU3YjdmNSsydTN1dllE
WU45aThyYlhjOWwrOUpPa2pIT1lIT3djK2ZQSkRPb2dEWFFCSXcvTk4KV0FTS0QrRkpGa1lXSWZF
ZFNrQWxpNXpKaENmUUVJQ1RPZE14YkZYSm01NncxTlZEWHYwL3pMWmFZYThFTU9Bc3o5MEF6Z0kv
aFYrcQpoT3kxNTZkRFhqRm5DaUhyYXI0WThyMUdiaTdLY1dmS0lkOVVyNWRDTnB5RithaStWWnJ0
OVpxSzhnMXZlcjVYczdJWXN0c3FMNFI4CnExbU04blVqSDgzbVdITlJUZE12UlBPVHc4VEJ3RVpG
SVkrSmg4QkNaVFg0bXdESEJ1SFJzTHdmZTdEUk4vNlBWcjV4MXdmSU5jV3EKYTlZYnZqSXBoR1dr
bElLalhVa3BvK24wR0g4QXNJaXpyTjNhVDNFQUFBQ2FTVVJCVkJpVlkyQWdCeVJOKy9BL2Nkckgv
OWprbUpBNQovLzR6TUp5Ky80OGhlZnBuRE1XTTZBS0pVei85di9pTWdjRlVnWVZoWmlvWFhKNEpY
ZUg4YkQ1R1V6bG1odXN2V0JoS2wvMkdtOHlDCnpUMi8vLzltK1BlUGtlSFBINFNGR0NiR1RucjMv
OHBqUmdZdDhUOE0vWEdjMksyT252RDYvOFhIREF6YUV2OFlabVh3b2JnZlJTRXoKNDM4R2ZabC9E
UE56QlRFOFNUUUFBQWphTWE2VUFSaEhBQUFBQUVsRlRrU3VRbUNDCgpJbmRleDogcGFnZS9pbnNw
ZWN0b3IvSW1hZ2VzL3VzZXJJbnB1dFByZXZpb3VzSWNvbi5wbmcKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpDYW5ub3Qg
ZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFw
cGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKUHJvcGVydHkgY2hhbmdlcyBvbjogcGFnZS9pbnNwZWN0
b3IvSW1hZ2VzL3VzZXJJbnB1dFByZXZpb3VzSWNvbi5wbmcKX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOYW1lOiBzdm46
bWltZS10eXBlCiAgICsgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCgoKaVZCT1J3MEtHZ29BQUFB
TlNVaEVVZ0FBQUFvQUFBQUtDQVlBQUFDTk1zKzlBQUFDS21sRFExQkpRME1nVUhKdlptbHNaUUFB
ZUp5ZAprajlvRTNFVXh6OTNVVnV4eEJwaVhTemVJRlVrU21nRzI2V2tUVnFKS1RXa0tXMnlYZSt1
eWVuZDVlZmRKVnBSY096czVLQ0RLT2lnCjRDaGRXcHlLNENDQ1JwemMzQXRGc0cwY3pyc01VZ28r
K01IblBkN3YvZm4rZmhEYlZZV3daTUIyZkxkOGJVcFpxdGFVdmc0eFRoQm4Ka0g1Vjg4UmtxVFRM
Z2JiekJRbmc4MlZWQ0tzenNmYjQ2Nm1kOTFzdkU4ZlBqRi82Y2ZBOUFPTHVVclVHVWdwSTFnUE9B
c25sZ0N0QQo4bzR2ZkpBYVFGSnJxRHBJOTRHVVd5bm5RSG9GeE9zQnZ3UGl5d0Z2QWZHMlZ2ZEI2
Z0JwUnpjZGtQdUJNZDN3TkpDemdLbDdtZzN5CmE1Q08ySFpUaDloYjRLSW1YQjlpSGVEOFVyV21C
Q08zejhIRUJaRFhlckdhQzI4MjRQUnVMemFTaCtSVldIL1dpMjBQSVFIUzBBZHYKSlRNS2dEVGd3
dEZmM2U3Mk1QU3R3NTdiN2Y1KzJ1M3V2WURZTjlpOHJiWGM5bCs5Sk9rakhPWUhPd2MrZlBKRE9v
Z0RYUUJJdy9OTgpXQVNLRCtGSkZrWVdJZkVkU2tBbGk1ekpoQ2ZRRUlDVE9kTXhiRlhKbTU2dzFO
VkRYdjAvekxaYVlhOEVNT0FzejkwQXpnSS9oVitxCmhPeTE1NmREWGpGbkNpSHJhcjRZOHIxR2Jp
N0tjV2ZLSWQ5VXI1ZENOcHlGK2FpK1ZacnQ5WnFLOGcxdmVyNVhzN0lZc3RzcUw0UjgKcTFtTThu
VWpIODNtV0hOUlRkTXZSUE9UdzhUQndFWkZJWStKaDhCQ1pUWDRtd0RIQnVIUnNMd2ZlN0RSTi82
UFZyNXgxd2ZJTmNXcQphOVlidmpJcGhHV2tsSUtqWFVrcG8rbjBHSDhBc0lpenJOM2FUM0VBQUFD
T1NVUkJWQmlWblk0eENzUWdFRVgvN0NFaXBCQzhsMFU2CndTSkhFVUdENTdPSVdIZ0VrOWxxWWJO
eFlkblh6Y3lEZWNBL3hCZzV4c2lqMitOOVlHYmtuTEZ0MjAybXowVUlnV3V0a0ZMQ0dFTmYKUlFC
SUtYRnJEVW9wYUszcDl2ckZlWjQ0amdPOTkzRWpBSGp2dVpTQ2FacXdMQXNOUmVjYzcvc09JUVNz
dFplc2kwaEVtT2NaNjdvTwoyMy9pQ1JqTU5BSVppSUxkQUFBQUFFbEZUa1N1UW1DQwoKSW5kZXg6
IHBhZ2UvaW5zcGVjdG9yL0ltYWdlcy93YXJuaW5nSWNvbi5wbmcKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpDYW5ub3Qg
ZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGlt
YWdlL3BuZwoKaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUtDQVlBQUFDTk1zKzlBQUFQ
UzJsRFExQkpRME1nVUhKdlptbHNaUUFBZUp5VgpWM2swMWQzWDM5OTdyM3VOMXp4UDF4QVJKWm5I
REZjeXp5TGh1dWE1ZTgwaDhhVE1RelRJa0ttUUlpbUpDa2xTeGpSSW9wSlV5Qk9aCnduMy9vSjUz
dmMvNnJkOTY5eDluZmM3bjdIMzI1K3h6MWpwckE3QUxrVUpEQTFFQUVCUWNSckU1b0U4NDVPUk13
TDBHTkRBQkp4Q0EKaVVTbWh1cFpXWm5CZjdTbGw0QUFBRHlYSjRXR0JocWJkQWwvQ01EbExCdTVj
TXlmSHpiNHozRUFBSUNuSEhKeUJrRGtBSURMWnd2dgpCd0F1ankxc0J3QmNrV0doWVFDSUx3Qndr
WDFKbmdCSUxBRElVZXhzREFDUUtnREErMnpoT3dDQTk5akMzUUNBanlEN2hBRWdyd0d3CkhNR2Vm
c0VBdUJrQXJJNm5GNVVNZ0pjREFFOVBLamtJQUo4TmdOSUpDZ3J4QkdBYkFJQ2Q1RkJLR0FEYkNn
QklIbkp5Sm14SmRvOEYKVUdjR29Hdjlod3VoQU5TN0FRaWwvTU5KVFFQdzFBSFVqLy9ETGRnQUFn
QUlUei9WZTU4aUFBQWd6UG9BZE85b3RBVXBBRnd1d0VZTwpqZmFyakViYktBZEF2d1ZvQ3lTSFV5
SzI2NFVndlFEL2JiNTE1bTFESXdBb0FCQUJQM2lEdUNIcnFBSDBLQjBCKzV6K09aTVdIc05XCndp
bktIY3hieWw4aUdDZXNLekpCb0lyUkpHSWxmMG1GUzAvSjJNdDJ5TW5JWis5ZVZmRFkrM3lmc1ZL
N2lxcHFzZHFHaG9QbVphMTUKSFdYZGlQMU5lbXNHMm9aSnhFNmpGV1B4ZzZZbS9xWW56UXJONnkw
NkxVZXM1bTJZYkdYc2JPeGpIV29kUjUwWW5aVVBPN2xRanlTNApublJMY0tlU2NqMWF5ZCs4aEwz
dGZFNzdkdml0QmV3SjlBaktDcTRKT1JQcWM5U1Fzb3NxRU1ZZXpoN0JHeWthdFRONlQ0elNNYTFZ
Cmc3Z0Q4VWJIOVJQVVRzZ21DaVl4SjYzL05YZnlRL0xMVTA5T042ZGNUczFPaTA0blpaaG1xbVh0
ekJiTVljdWx5MTA4TTU3WG5WOTcKTnV0YzBIblRDN3NLbUF2bUw3NHF2RjlVWEJ4UllucEo1Tkpj
YVV0WmNybE5oV2pGWEdYYjVkd3JZVldIcTRrMWU2OEsxK0pxNTY0TgpYcjlhRjF0UHZNRjU0M3ZE
MjV0OWplMjM3dDZ1YTZxOFU5Q2NkdmRZaTJlcjdqMjZlODMzcVErVUhxeTNQVzB2NzBoNDZONnA5
MGk4CkM5MzE4WEZYZC9tVDJCN3JweEpQZnp4cjdVM3VzK2puNlg4M1VEbm9NeVE5OVBsNStiRHJD
NEVYTDE3bXZiSjd6ZnQ2YktUOERYbFUKYlBUZDIvd3g4M2VZZHkzallSTUtFOS9mTjN5Z2ZsVDgr
SDN5OGlmbktlYXB1NTk5cDNtbU83K0VmNVgrT3ZhdGNNWnVGajFiTUxkagpydlE3My9mazc2dnpo
WDk3L0NBdU1DOWtMYkl2cHY5ay9KbS9KTHYwY3JsNjVmcnE1cm83alFZQXZHQUZWeEIrcEJibGgz
YkN4Tk9OCjRsSVk0cGp1NEFYWmlqa0Z1WU40VS9tUEN4b0lqWWhvaXVZUVBvcHJTVnlRWEpkeWtt
NlZrWkxOMkxVZzc3eTdYV0hIM3I4VUo1UjAKbEhOVVBxb3BxVWRwdEdndWFzdnBITlpOMjkrazk4
NEFZMGdnN2pkeU9PQnZISE13MlNUTDlMeFppWG1GUlpWbHRkVlY2d2FiUjdaagpkajhjc0k1OGgz
WTY3WFBXT1h6QXhmS0lnNnVyRzlrOW1CVGhjWUtjN1ZuaVZlZjkwS2ZQOTdGZm8zOUpRRXBnV0pC
SHNGV0lUcWo4ClVSRUtHeFZOWFE2YkM1K0tHSTk4RS9VNitsWE04TEhlMkphNG92aVk0ODRKMmlj
a0Vwa1NGNVBHLzNwMnNqbTU4bFRXNlpnVW4xVEwKTk5WMG9YUmF4a1JtVzFaeGRtcE9jSzdER2Mw
ODBYeklIejk3Nzl6NTgwY3ZHQmVJRkN4Y2ZGU1lYK1JkckZ5Q0t1bS9WRko2dE15KwpYTHRpUnlX
K2N1bnkySldIVlZYVjZUV2hWKzFxMWE0SlhsdS8vcTd1UVgzWmpjUUd6NXZFUm9uR3RWdFBiMTlv
Q3J5ajI4elovT1Z1CmUwdFJhOHc5cC9zYUQwVGEwRzFmMm5zNzdqd3M3ano5aU5ybC9GaTltN1g3
NDVPbW5qTlBRNTZaOThyMXNmVE45UThNMUExbURQazgKMXhubUdKNThVZmN5OHBYbXEvWFhIU1BY
M2hTTW5ucDdkTXp4bmVhNHdQamlSUC83OGcvVWo3cVRESk5Ebjg1T09YMFcrancyWGZURgo1YXZZ
MThWdlQyWnlaeDNuQk9aZWZjK2J0L3diOTNmbmp4TUxlb3VZeGFHZk5VdFp5OGtyK2F0UGZsbHNC
TkZvQUlBSEJTRERGVmhGCnlNaGIxRW0wS3lhS2JoQ1h3UkRJcE1FOGgwOWxZMkVQNUdqaDNPQ1c0
VEhqRGVBN3hwOG9rQ3lZSVhSV3VFemttbWd6NGFIWVUvRisKaVVISm5oMnRValhTK1R0alpVaXl4
RjJ5Y3V4eXYrUS83eDdlYzEraFpHKzBvdlUrOFgxelNrM0t4MVdNVkpsVWg5VksxSU0xaUpwaQpX
aWl0VDlyZE9qVzZwL2E3Nnlub0xldmZNVGhtYUVOVU5SSTVRSDlnd1hqODRET1RPNmFYekpMTmZT
d01MYjVZWmxqdHMzcHZmZGJHCnlwYkxkdFN1d2o3WVFkVVJISjhkS25EeWRsWndYanA4MStYWUVl
MGptNjd0YmlmZHpVaWNwQkdQSXJLcnA1RG5pTmRaYnhzZkRwOWgKMzNOK1Ivd0ovdU1CaFlHT1Fh
eEJYY0h4SWFvaFAwTHJqeDZscUZCV3FMZkRRc01sdzE5RkpFY3FSbzVGblk1V2l2NFFrM3VNR0l1
Tgo3WSs3R085L1hET0JLV0hrUkhtaWQ1SlkwcXUvVWs0NkpTdWNZamsxYzdvdjVVWnFYbHBVdW1P
R2NpWnI1dXVzakd6SjdIczVycm00CjNNWXovbm1TZWUvekw1MTFPeWQ2YnZKODdRVnFnV3JCNnNY
bXdzZ2k1YUxGNHNhUzhFdnFselpMSDVXbGxWdFg4RlNNVnBaZTlydWkKVW9XdGVsUGRVSk41MWIv
VzhKckl0ZVhyeit2cTY3TnZSRFY0M25Sc3RMeGxmRnVuYWU4ZFFqTmo4L3pkNFpiYnJZWDNFdTc3
UExCcAowMnRYNjFCNnFOU3A4a2k5UytPeFdyZmlFNmtlcnA2MXB4Tzk4bjNWQThaRCtHR1dsK1FS
bnJlK0U2Yy9kYzE4WG82ajBRQzIvajRBCkFLd0t3TGt2QUlldEFPd3VBbVE2QUVoWEFIQzdBMWl4
QU5pcEE4cGxKNkRFRGdCQ0ZQbnpmd2lBR3RpQUh4eUhIQ2lIUnVpRTUvQUIKNW1FVFlVWUVFVGxF
QzdGQTNKRXc1RFJTakRRaXo1QXBGQW9saXRKQnVhRVNVVldvZnRRS1doeHRpWTVGWDBXUFlsZ3dl
cGdJVEMxbQprazZFem9rdWoyNFF5NG8xeDZaaGUzQU1PQk5jT202UW5wK2VURjlIdjhsZ3lWRE9z
TXBvelhpVmlZNkp4SFNmV1pBNWhubU14WWlsCkFVL0FuMkZsWUUxa3BiSEZzVzJ3eDNNQXh3bE9O
T2NKTG9RcmdSdTRFM25vZU5KNStYaXIrZlQ1UHZDbkNtZ0x2QkQwRTF3WHloUVcKRTc0cFlpd3lL
aHBLd0JGS3hiVEZ4c1FUSkN3azFYWUk3RmlVZWl5ZHY5TlZSa3BtVHJacDEwazVlM2xKK2FYZHZY
dXFGZEwyaGlsNgo3TE5WTWxMV1ZObXRLcWttcU02bklhQXByaVd2cmFselVOZHV2NnVlajM2d1Fa
eGhQdkdHMFV0ak9Malh4TXYwdkZtUCtacWxqSldYCmRaMHQyRG5idHpwS0hjcDJXanZzN3RMbHl1
M202bDVKbWlHcmVKN3lHdmN4OWUzMmR3a1lEcElMamc4Wk9DcEVDYWEyaGZORWhFVysKakNiR2pN
WTJ4NmNsRUUvTUpTV2Y1RWt1TzYyUTBwWm1sLzRwTXlsN1Y4NzRtWkw4d0hNNkY3Z0w1Z3Y3aTlz
dk5aVzFWRHk4M0Y4MQpWUE84dHVkNlovMXd3K3d0M2lhRDVvaVdTL2ZhSDR5MHIzUktkL2wydHo2
VjZFM3ZYeHR5Rzc3N2NtbkU3YTNHZU52SDIxUCswMVpmClBXYWYvRTFadkxYc3Nrcjl4YjVPMnBE
ZldObE1wV0ZwU1RRYUFJaURQaHlCQ01pQWNtaUNIaGlET1FRUWRrUWNVVUtJaUNQaWg4UWkKV1Vn
RjBvd01JRjlRYUpRb1Nodmxpa3BFVmFOZW9iRm9OWFFBdWhnOWhNRmh0REJobUZyTXArMmJIOEt5
WVMyeDJkZ2hIQS9PQlZlTworMGF2UXA5RVA4Z2d4aERPME1Nb3poalBPTXFreFZUTWpHTDJaeDVt
MmMvU2dKZkFGN0J5c21henNiSGxzUXV3bDNIczVtamhOT2VjCjRBcm54bkJuODRqeTNPQWw4bzd5
aGZOejhqY0kyQXVzQ1pZS0hSVDZLVndpWWk2eUpucUZZQzlHSjNaVG5Dd2hMdkZEc210SHNWU2sK
dE9WT0dSbXN6RWZadGwwbGN2SHlycnUxOTRqc29TbU03MzJnV0xidnRGSzBjcnhLdXVvNXRUTDFh
bzJibXExYUQ3VjdkZDdvZnR1LwpvWTgza0RVa0VuMk5zZyswR244M1lUUFZOdk14UDIvUmE4Vm9m
ZEFteDNiTVhzRWgyWEhTeWRqNXVvdkFrUXpYRFhjLzBpMHluYWVkCjF4WHZkVjhIdjhZQTdzRElv
TEVRdzlBYkZGRnFUamc2SWlaeVBqb2daaUUySzE3eGVOK0p3Q1NHdjhxVDFVODlTM0ZOblUyUHlj
UmwKWGNnUnkyM00wOC92TytkN1FiaGdyTENrMlBvU1hXbFR1WCtsd09YZXF1UWFZaTNidGNtNmpo
c05ONi9kZXREVTFVeHBrV29kdlYvVQpSdTVRN2VSL3RQbDQ4Y25xTTZZK3lRR0xvV1BEOVM5blIr
UkdOY2FJNHhIdkd5YnBwbHltSDMyVG5JMy9QdlFEczhpN3hMZzh1QnF5Ck5yN09zNEhkR05zc29s
blFhQUNnRGtHUUI0MHdBRjhSUUhnUU9jUUFjVUVpa1RQSURXUUkrWWtTUWhtaHFLaHkxR3MwRzlv
RW5ZTHUKeFhCalhESFZtSjkwQm5SbjZENWhOYkM1MkZtY0thNmVucC8rRlAwcVF3akRGMFl2eGc5
TTdremp6TzdNbjFtaThIaDhMYXMxNndiYgpOWFlTQnpkSEQyYzBseFRYSUhjOGp6elBCOTVpUGk5
K2RRRWhnYytDVjRSOGhLV0ZwMFd1aW9ZUTFNVndZbS9GNzBoODNzRXRwU1J0CnZOTmE1cENzNnk1
L3VTajV4TjA1ZTY0b2RPMmQzY2VuUkZTbXFoU3I5cXFEaG81bWtsYWZqckN1Ny80R3ZUVURZOFBM
Um93SElvMm4KVFp4Tkg1c3JXT1JaSWRhSnRxeDJOUTYyaDFCT0RZZGRqNkJkRTkzV1NNRWU3ejBQ
ZTczMW9mcUorbjhLREFpYUNMRU92VStSb3hhRQpNMFlrUlNIUjZjZTg0eXFQdDUyNG4xUnhNdTZV
ZFlwMDZscjZnOHkwYkZLdVhwN3NXWjd6Y09IcnhmNmkrcEw4MHJqeXdFcW5LL3JWCmhKcmwyczdy
NmZWMkRaSTNsMjkxTjUxckpyVUl0dzdjajI0VGF1OTRHUHBJcW11NnU3RW45WmxubjhZQTErRG41
N2RmUkwvYTgzcmkKVGRaYnpiRXY0eVh2RDMrVW5GeWQrakE5L3RYZ1creE02V3p6WE1mM0IvTlZm
NmY5c0YvZ1craGJqUGdwK3JOdVNYMnBjM24vY3QySwo2RXJteXNLcXlXclo2dXFhMVZyRjJ1UXZ5
VjlldnlwL1RhMUxyWHV2NTZ6Zlc1L2U0TnpRM2ZEZnlOOW8zNWpaNU5zMDNqeStlWHR6CmhpWkJj
NmJsMExwcE5JQ3RmZ2tBQUJnTlFnSkRLQVF6QThQLzB0ejlmeTBvTVB4M0RnNEFZQTcyc0xEY3h0
T2hZVloyQU1BREFHdlUKQ0ZzaUFMQUJJR3plZmtZSHR6SEJrMlJvQ2dCQ0FJaENqSytCQlFBd0F5
Qm0zaFFqbTYxOWtFUCtKQk1yQU1BRElQNWV3ZmEyMjN4VQphS0NWMlRaT0RRM1R0d0VBUGdDazBJ
dEsvTzNUR09OcjU3Z2QyMFVKdDdFSEFFa0FaRGdneE5SbU85ZUtwNWZodGpZVUpqalF3bXhMCk00
ckxMK3lnSFFCd0FhQmt3UWhJUUFFZjhBSjVNQU1ETU53ZUNVQUNBaGhBQ0ZEQUM2aGdCSk5BQVo4
L1hnNHdDUlR3K3o5Ujh1QU4KSktCQUJIZ0JGUUpnQ2lnUTVPYVhTQUhDdHNjVElBTUZTQkQ4bTFH
NHF2QkZZZjNQdWdHRVFDQ0V3RDhScHY5aWZpdjh4OWNQUENIawpEMC8remJ2NUpWS0NHcndqem9k
RWF6ajRZcVF3aWhobGpENUdHNk9EVVFjQ2hnY2pBUElZSll3YVJnK2ppOUhFS0dQVSsyYWFadjdr
CjJhcU54NTh6bWtJZ2VFRTRVTUFMZ3Y5VkwvTC9VZ05idlRzQUFKWU5vREFKQUtDREhmK3ZkeGJt
RlJVR0FHQVFFaHBOOGZQeERTUG8KaFlZR2Vza1JEZ2FUZDhzUkZCVVUxT0IvQVBPbWN4UkljYVBv
QUFBQkJFbEVRVlFZbFdXUU1VN0NjQmpGZnkwdGJXTEYwalpTa0lIVQp3VVhqQlZpNEFhc0hZR1Qw
QW5BTEx1RHM2bElPd0lBSHNGTUp4ZGdLMmdFaDdkK2hzU254VFYvZWUzbnY1Wk9vUVBnNFVjSXJn
R3R4Ckx3MzQrTlBrcWpFL01IRnRPcTVOSno4d3FXcFNKVTNmdkxOdU5URUJOcDlzVzVlMHBRSDcw
OFNVOGZjT2szNEEvWUN2TFNZcDQzL1YKcXoyUFRRMUlRMGhETEwzZ1RveGl6c2hxNE5SeklCZVFn
NmFBM2NBUmMwYmx4dkNKdDZzMjNqR0VIOHNDUUVzUzFDNnMxZ1RkQjY1bAo0VE04MCtoUmh5d0d3
NXRoZURPeUdLaURjVTVQK0F5VktHSHEyc1VFWFFXY0c4b2J1RENRbzVpcDh2ekNNanR5Vy81cmNa
Y0JDS2l4CktMaWF5dklYODdKUjlJTXY2U0lBQUFBQVNVVk9SSzVDWUlJPQoK
</data>
<flag name="review"
          id="8661"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
      

    </bug>

</bugzilla>