<?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>56328</bug_id>
          
          <creation_ts>2011-03-14 13:38:25 -0700</creation_ts>
          <short_desc>LayoutTests exercising filesystem: URIs should run over HTTP to avoid weirdness related to file: URLs</short_desc>
          <delta_ts>2011-03-16 17:58:17 -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>WebCore Misc.</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>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Adam Klein">adamk</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>ericu</cc>
    
    <cc>eric</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>367185</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-14 13:38:25 -0700</bug_when>
    <thetext>Reported by ericu.

Test output in Chromium:
--------------------------------
Tests using resolveLocalFileSystemURI to obtain an Entry from a URI

On success, you will see a series of &quot;PASS&quot; messages, followed by
&quot;TEST COMPLETE&quot;.


* Resolving a generated URI.
PASS expectedPath is actualPath
PASS isFile is true
* Resolving test file by hand
PASS expectedPath is actualPath
PASS isFile is true
* Resolving a completely bogus URI.
PASS
* Resolving a URI with the wrong protocol
PASS
* Resolving a URI with no slash between type and file
PASS
* Resolving a URI with no slash between protocol and type
PASS
* Resolve a path using backslashes
PASS expectedPath is actualPath
PASS isFile is true
* Resolve a directory
PASS expectedPath is actualPath
PASS isDirectory is true
* Resolve a path using a trailing slash
Error occurred: 2
FAIL Bailing out early
PASS successfullyParsed is true

TEST COMPLETE
---------------------------------------

Here&apos;s the failing call stack.  canRequest is returning false because
targetOrigin-&gt;isUnique() returns true.  It&apos;s trying to prevent file
URLs from mixing with other urls, I think.  I&apos;m guessing we need a
special case here, as with the Blob protocol, but I don&apos;t know what
the minimal hole to open is.

       chrome.dll!WebCore::SecurityOrigin::canRequest(const WebCore::KURL &amp; url={...})  Line 262       C++
       chrome.dll!WebCore::DOMWindow::resolveLocalFileSystemURI(const
WTF::String &amp; uri={...}, WTF::PassRefPtr&lt;WebCore::EntryCallback&gt;
successCallback={...}, WTF::PassRefPtr&lt;WebCore::ErrorCallback&gt;
errorCallback={...})  Line 766 + 0x27 bytes     C++
       chrome.dll!WebCore::DOMWindowInternal::resolveLocalFileSystemURICallback(const
v8::Arguments &amp; args={...})  Line 3046 + 0x30 bytes     C++
       chrome.dll!v8::internal::HandleApiCallHelper&lt;0&gt;(v8::internal::`anonymous-namespace&apos;::BuiltinArguments&lt;1&gt;
args={...})  Line 1069 + 0x13 bytes     C++
       chrome.dll!v8::internal::Builtin_Impl_HandleApiCall(v8::internal::`anonymous-namespace&apos;::BuiltinArguments&lt;1&gt;
args={...})  Line 1086 + 0xd bytes      C++
       chrome.dll!v8::internal::Builtin_HandleApiCall(v8::internal::`anonymous-namespace&apos;::BuiltinArguments&lt;1&gt;
args={...})  Line 1085 + 0x18 bytes     C++
       0ff702ae()
       chrome.dll!v8::internal::Invoke(bool construct=false,
v8::internal::Handle&lt;v8::internal::JSFunction&gt; func={...},
v8::internal::Handle&lt;v8::internal::Object&gt; receiver={...}, int argc=1,
v8::internal::Object * * * args=0x001ae734, bool *
has_pending_exception=0x001ae61b)  Line 97 + 0x19 bytes C++
       chrome.dll!v8::internal::Execution::Call(v8::internal::Handle&lt;v8::internal::JSFunction&gt;
func={...}, v8::internal::Handle&lt;v8::internal::Object&gt; receiver={...},
int argc=1, v8::internal::Object * * * args=0x001ae734, bool *
pending_exception=0x001ae61b)  Line 128 + 0x1f bytes    C++
       chrome.dll!v8::Function::Call(v8::Handle&lt;v8::Object&gt; recv={...}, int
argc=1, v8::Handle&lt;v8::Value&gt; * argv=0x001ae734)  Line 2928 + 0x1d
bytes   C++
       chrome.dll!WebCore::invokeCallback(v8::Persistent&lt;v8::Object&gt;
callback={...}, int argc=1, v8::Handle&lt;v8::Value&gt; * argv=0x001ae734,
bool &amp; callbackReturnValue=false, WebCore::ScriptExecutionContext *
scriptExecutionContext=0x015b7038)  Line 86 + 0x1f bytes        C++
       chrome.dll!WebCore::V8EntryCallback::handleEvent(WebCore::Entry *
entry=0x026a1460)  Line 76 + 0x22 bytes C++
       chrome.dll!WebCore::EntryCallbacks::didSucceed()  Line 132 + 0x47 bytes C++
       chrome.dll!WebKit::WebFileSystemCallbacksImpl::didSucceed()  Line 65
+ 0x1c bytes    C++
       chrome.dll!WebFileSystemCallbackDispatcher::DidSucceed()  Line 32 +
0x16 bytes      C++
       chrome.dll!FileSystemDispatcher::OnDidSucceed(int request_id=182)
Line 233 + 0xf bytes    C++
       chrome.dll!DispatchToMethod&lt;FileSystemDispatcher,void (__thiscall
FileSystemDispatcher::*)(int),int&gt;(FileSystemDispatcher *
obj=0x015135a0, void (int)* method=0x5d2cf0a0, const Tuple1&lt;int&gt; &amp;
arg={...})  Line 551 + 0xe bytes        C++
       chrome.dll!IPC::MessageWithTuple&lt;Tuple1&lt;int&gt;
&gt;::Dispatch&lt;FileSystemDispatcher,FileSystemDispatcher,void (__thiscall
FileSystemDispatcher::*)(int)&gt;(const IPC::Message * msg=0x014f5da8,
FileSystemDispatcher * obj=0x015135a0, FileSystemDispatcher *
sender=0x015135a0, void (int)* func=0x5d2cf0a0)  Line 945 + 0x11
bytes   C++
       chrome.dll!FileSystemDispatcher::OnMessageReceived(const
IPC::Message &amp; msg={...})  Line 30 + 0x16 bytes C++
       chrome.dll!ChildThread::OnMessageReceived(const IPC::Message &amp;
msg={...})  Line 147 + 0x2d bytes       C++
       chrome.dll!IPC::ChannelProxy::Context::OnDispatchMessage(const
IPC::Message &amp; message={...})  Line 255 + 0x19 bytes    C++
       chrome.dll!DispatchToMethod&lt;IPC::ChannelProxy::Context,void
(__thiscall IPC::ChannelProxy::Context::*)(IPC::Message const
&amp;),IPC::Message&gt;(IPC::ChannelProxy::Context * obj=0x015341e0, void
(const IPC::Message &amp;)* method=0x5d294820, const Tuple1&lt;IPC::Message&gt;
&amp; arg={...})  Line 551 + 0xf bytes      C++
       chrome.dll!RunnableMethod&lt;IPC::ChannelProxy::Context,void
(__thiscall IPC::ChannelProxy::Context::*)(IPC::Message const
&amp;),Tuple1&lt;IPC::Message&gt; &gt;::Run()  Line 331 + 0x1e bytes C++
       chrome.dll!MessageLoop::RunTask(Task * task=0x014f5d80)  Line 367 +
0xf bytes       C++
       chrome.dll!MessageLoop::DeferOrRunPendingTask(const
MessageLoop::PendingTask &amp; pending_task={...})  Line 379        C++
       chrome.dll!MessageLoop::DoWork()  Line 569 + 0xc bytes  C++
       chrome.dll!base::MessagePumpDefault::Run(base::MessagePump::Delegate
* delegate=0x001af0bc)  Line 23 + 0xf bytes     C++
       chrome.dll!MessageLoop::RunInternal()  Line 342 + 0x2a bytes    C++
       chrome.dll!MessageLoop::RunHandler()  Line 316  C++
       chrome.dll!MessageLoop::Run()  Line 240 C++
       chrome.dll!RendererMain(const MainFunctionParams &amp; parameters={...})
 Line 315       C++
       chrome.dll!`anonymous namespace&apos;::RunNamedProcessTypeMain(const
std::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;char&gt; &gt; &amp;
process_type=&quot;renderer&quot;, const MainFunctionParams &amp;
main_function_params={...})  Line 453 + 0x12 bytes      C++
       chrome.dll!ChromeMain(HINSTANCE__ * instance=0x009b0000,
sandbox::SandboxInterfaceInfo * sandbox_info=0x001afa10, wchar_t *
command_line_unused=0x0051345a)  Line 766 + 0x13 bytes  C++
       chrome.exe!MainDllLoader::Launch(HINSTANCE__ * instance=0x009b0000,
sandbox::SandboxInterfaceInfo * sbox_info=0x001afa10)  Line 280 + 0x1d
bytes   C++
       chrome.exe!wWinMain(HINSTANCE__ * instance=0x009b0000, HINSTANCE__ *
__formal=0x00000000, HINSTANCE__ * __formal=0x00000000, HINSTANCE__ *
__formal=0x00000000)  Line 46 + 0x10 bytes      C++
       chrome.exe!__tmainCRTStartup()  Line 263 + 0x2c bytes   C
       chrome.exe!wWinMainCRTStartup()  Line 182       C
       kernel32.dll!75d9e4a5()
       [Frames below may be incorrect and/or missing, no symbols loaded for
kernel32.dll]
       ntdll.dll!777acfed()
       ntdll.dll!777ad1ff()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367201</commentid>
    <comment_count>1</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-14 13:59:24 -0700</bug_when>
    <thetext>When running under DumpRenderTree, SecurityOrigin::canRequest gets short-circuited at

    if (m_universalAccess)
        return true;

LayoutTestController seems to provide access to this boolean, but my first attempt to simply make it false at the start of the test didn&apos;t have the expected effect.  Digging more.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367209</commentid>
    <comment_count>2</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-14 14:09:40 -0700</bug_when>
    <thetext>Tracing this up the chain, m_universalAccess is true because of this snippet from Tools/DumpRenderTree/chromium/WebPreferences.cpp:

    // Allow those layout tests running as local files, i.e. under
    // LayoutTests/http/tests/local, to access http server.
    allowUniversalAccessFromFileURLs = true;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367264</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-14 14:51:02 -0700</bug_when>
    <thetext>What&apos;s needed to get this test operating appropriately in DumpRenderTree is to somehow run the test inside a new document: the layoutTestController method has no effect on the current document.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367284</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-14 15:23:25 -0700</bug_when>
    <thetext>And finally, the culprit, in SecurityOrigin&apos;s constructor:

101     // By default, only local SecurityOrigins can load local resources.
102     m_canLoadLocalResources = isLocal();
103     if (m_canLoadLocalResources) {
104         // Directories should never be readable.
105         if (!url.hasPath() || url.path().endsWith(&quot;/&quot;))
106             m_isUnique = true;
107         // Store the path in case we are doing per-file origin checking.
108         m_filePath = url.path();
109     }

Note the url.path().endsWith(&quot;/&quot;) check.  Not sure the best way to work around this, will need to think about this.  CCing Adam Barth (though I suspect I&apos;ll need to chat with him to provide sufficient context).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367290</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-03-14 15:29:01 -0700</bug_when>
    <thetext>Yeah, sorry about enabling universal access for file URLs during testing.  We have that set that way because tons of tests expect it.

Is there an actual bug here, or just that the tests don&apos;t run correctly outside of DRT?  Many, many non-HTTP tests don&apos;t run correctly outside of DRT for this reason.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367296</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-14 15:38:47 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Yeah, sorry about enabling universal access for file URLs during testing.  We have that set that way because tons of tests expect it.
&gt; 
&gt; Is there an actual bug here, or just that the tests don&apos;t run correctly outside of DRT?  Many, many non-HTTP tests don&apos;t run correctly outside of DRT for this reason.

There is an actual bug here (the title of this bug is vague because I didn&apos;t know what the problem was, but wanted somewhere to post my findings).

The issue is that when we call SecurityOrigin::canRequest() in requestLocalFileSystemURI, URIs with trailing slashes are rejected.  This is due to SecurityOrigin::isLocal() being true for filesystem: URIs, combined with the rule that local directories should never be requestable (see the code snippet in my previous post). 

Now, it may or may not be a bug that directories aren&apos;t fetchable with, say, an iframe (there&apos;s been some discussion of this within the team).  But we certainly want to be able to _resolve_ directories, since that&apos;ll just return a DirectoryEntry which JS definitely can make use of.  I think the easiest fix here is to not check SecurityOrigin::canRequest, but instead do a simpler check for &quot;resolvability&quot;, which I think should just be SecurityOrigin::isSameSchemeHostPort(SecurityOrigin::create(fileSystemURL)).  Does the latter seem reasonable?

That still won&apos;t let directory listings be requested via iframe or XMLHTTPRequest, so perhaps that needs a separate bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367305</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-03-14 15:49:14 -0700</bug_when>
    <thetext>&gt; The issue is that when we call SecurityOrigin::canRequest() in requestLocalFileSystemURI, URIs with trailing slashes are rejected.  This is due to SecurityOrigin::isLocal() being true for filesystem: URIs, 

^^^  That&apos;s the bug.  SecurityOrigin::isLocal() should not be true for filesystem: URIs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367309</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-14 15:57:52 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; The issue is that when we call SecurityOrigin::canRequest() in requestLocalFileSystemURI, URIs with trailing slashes are rejected.  This is due to SecurityOrigin::isLocal() being true for filesystem: URIs, 
&gt; 
&gt; ^^^  That&apos;s the bug.  SecurityOrigin::isLocal() should not be true for filesystem: URIs.

Okay, so sounds like the right thing to do is move all these tests under LayoutTests/http to make them behave like they do in the &quot;real world&quot; (that is, in Chrome without the --allow-file-access-from-files flag).  Retitling appropriately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367861</commentid>
    <comment_count>9</comment_count>
      <attachid>85843</attachid>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-15 12:40:51 -0700</bug_when>
    <thetext>Created attachment 85843
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367863</commentid>
    <comment_count>10</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-15 12:42:16 -0700</bug_when>
    <thetext>Note that this patch depends on http://codereview.chromium.org/6695030/, and should not be committed before that both lands and rolls into WebKit&apos;s Chromium DEPS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>367867</commentid>
    <comment_count>11</comment_count>
      <attachid>85843</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-03-15 12:50:27 -0700</bug_when>
    <thetext>Comment on attachment 85843
Patch

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>368463</commentid>
    <comment_count>12</comment_count>
      <attachid>85956</attachid>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-16 12:43:04 -0700</bug_when>
    <thetext>Created attachment 85956
Includes DEPs roll</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>368483</commentid>
    <comment_count>13</comment_count>
    <who name="Adam Klein">adamk</who>
    <bug_when>2011-03-16 13:18:51 -0700</bug_when>
    <thetext>svn-apply doesn&apos;t seem to like my patches.  Is this going to pose a problem for the commit-queue?  Am I doing something wrong wrt moving/modifying files?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>368487</commentid>
    <comment_count>14</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2011-03-16 13:26:16 -0700</bug_when>
    <thetext>Hmm...I also had problems with a move+modify CL.  Commit queue failed, and wouldn&apos;t ever tell me why.  I eventually had to land it by hand.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>368664</commentid>
    <comment_count>15</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-03-16 17:15:54 -0700</bug_when>
    <thetext>Committed r81297: &lt;http://trac.webkit.org/changeset/81297&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>368667</commentid>
    <comment_count>16</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-03-16 17:19:54 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; Hmm...I also had problems with a move+modify CL.  Commit queue failed, and wouldn&apos;t ever tell me why.  I eventually had to land it by hand.

Yeah, for some reason svn-apply doesn&apos;t handle these cases correctly.  If you&apos;re interested in improving the tools, the code that needs fixing is likely in http://trac.webkit.org/browser/trunk/Tools/Scripts/VCSUtils.pm.

In any case, I&apos;ve landed this patch manually.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>368695</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-03-16 17:58:17 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/81297 might have broken SnowLeopard Intel Release (Tests)
The following tests are not passing:
http/tests/filesystem/resolve-uri.html</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>85843</attachid>
            <date>2011-03-15 12:40:51 -0700</date>
            <delta_ts>2011-03-16 12:43:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-56328-20110315124050.patch</filename>
            <type>text/plain</type>
            <size>30119</size>
            <attacher name="Adam Klein">adamk</attacher>
            
              <data encoding="base64">SW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDgxMTY0KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTEtMDMtMTUgIEFkYW0gS2xlaW4gIDxhZGFt
a0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgTGF5b3V0VGVzdHMgZXhlcmNpc2luZyBmaWxlc3lzdGVtOiBVUklzIHNob3VsZCBy
dW4gb3ZlciBIVFRQIHRvIGF2b2lkIHdlaXJkbmVzcyByZWxhdGVkIHRvIGZpbGU6IFVSTHMKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU2MzI4CisKKyAg
ICAgICAgTW92ZXMgdGhlIHRlc3QgZm9yIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkgaW50byBu
ZXcgImZpbGVzeXN0ZW0iCisgICAgICAgIGRpcmVjdG9yeSB1bmRlciBodHRwL3Rlc3RzLywgYW5k
IGFkanVzdHMgZmlsZSBwYXRocyBhcHByb3ByaWF0ZWx5LgorCisgICAgICAgICogZmFzdC9maWxl
c3lzdGVtL3Jlc29sdmUtdXJpLWV4cGVjdGVkLnR4dDogUmVtb3ZlZC4KKyAgICAgICAgKiBmYXN0
L2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbDogUmVtb3ZlZC4KKyAgICAgICAgKiBmYXN0L2Zp
bGVzeXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzOiBSZW1vdmVkLgorICAgICAgICAq
IGh0dHAvdGVzdHMvZmlsZXN5c3RlbTogQWRkZWQuCisgICAgICAgICogaHR0cC90ZXN0cy9maWxl
c3lzdGVtL3Jlc29sdmUtdXJpLWV4cGVjdGVkLnR4dDogQ29waWVkIGZyb20gTGF5b3V0VGVzdHMv
ZmFzdC9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLWV4cGVjdGVkLnR4dC4KKyAgICAgICAgKiBodHRw
L3Rlc3RzL2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbDogQ29waWVkIGZyb20gTGF5b3V0VGVz
dHMvZmFzdC9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWwuCisgICAgICAgICogaHR0cC90ZXN0
cy9maWxlc3lzdGVtL3Jlc291cmNlczogQWRkZWQuCisgICAgICAgICogaHR0cC90ZXN0cy9maWxl
c3lzdGVtL3Jlc291cmNlcy9mcy10ZXN0LXV0aWwuanM6IENvcGllZCBmcm9tIExheW91dFRlc3Rz
L2Zhc3QvZmlsZXN5c3RlbS9yZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzLgorICAgICAgICAqIGh0
dHAvdGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHM6IEFkZGVkLgorICAgICAgICAqIGh0dHAv
dGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvVEVNUExBVEUuaHRtbDogQ29waWVkIGZyb20g
TGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9URU1QTEFURS5odG1sLgor
ICAgICAgICAqIGh0dHAvdGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvcmVzb2x2ZS11cmku
anM6IENvcGllZCBmcm9tIExheW91dFRlc3RzL2Zhc3QvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMv
cmVzb2x2ZS11cmkuanMuCisgICAgICAgICogcGxhdGZvcm0vZ3RrL1NraXBwZWQ6CisgICAgICAg
ICogcGxhdGZvcm0vbWFjL1NraXBwZWQ6CisgICAgICAgICogcGxhdGZvcm0vcXQvU2tpcHBlZDoK
KyAgICAgICAgKiBwbGF0Zm9ybS93aW4vU2tpcHBlZDoKKyAgICAgICAgQWRkZWQgbmV3IGh0dHAv
dGVzdHMvZmlsZXN5c3RlbSBkaXJlY3RvcnkgdG8gc2tpcCBsaXN0cyBzaW5jZQorICAgICAgICB0
aGV5IGRvbid0IHN1cHBvciB0aGUgZmlsZXN5c3RlbSBBUEkuCisKIDIwMTEtMDMtMTUgIEFuZGVy
cyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBT
YW0gV2VpbmlnLgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3Jlc29sdmUtdXJp
LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2ZpbGVzeXN0ZW0v
cmVzb2x2ZS11cmktZXhwZWN0ZWQudHh0CShyZXZpc2lvbiA4MTA4OCkKKysrIExheW91dFRlc3Rz
L2Zhc3QvZmlsZXN5c3RlbS9yZXNvbHZlLXVyaS1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkK
QEAgLTEsMzYgKzAsMCBAQAotVGVzdHMgdXNpbmcgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSB0
byBvYnRhaW4gYW4gRW50cnkgZnJvbSBhIFVSSQotCi1PbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUg
YSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIu
Ci0KLQotKiBSZXNvbHZpbmcgYSBnZW5lcmF0ZWQgVVJJLgotUEFTUyBleHBlY3RlZFBhdGggaXMg
YWN0dWFsUGF0aAotUEFTUyBpc0ZpbGUgaXMgdHJ1ZQotKiBSZXNvbHZpbmcgdGVzdCBmaWxlIGJ5
IGhhbmQKLVBBU1MgZXhwZWN0ZWRQYXRoIGlzIGFjdHVhbFBhdGgKLVBBU1MgaXNGaWxlIGlzIHRy
dWUKLSogUmVzb2x2aW5nIGEgY29tcGxldGVseSBib2d1cyBVUkkuCi1QQVNTIAotKiBSZXNvbHZp
bmcgYSBVUkkgd2l0aCB0aGUgd3JvbmcgcHJvdG9jb2wKLVBBU1MgCi0qIFJlc29sdmluZyBhIFVS
SSB3aXRoIG5vIHNsYXNoIGJldHdlZW4gdHlwZSBhbmQgZmlsZQotUEFTUyAKLSogUmVzb2x2aW5n
IGEgVVJJIHdpdGggbm8gc2xhc2ggYmV0d2VlbiBwcm90b2NvbCBhbmQgdHlwZQotUEFTUyAKLSog
UmVzb2x2ZSBhIHBhdGggdXNpbmcgYmFja3NsYXNoZXMKLVBBU1MgZXhwZWN0ZWRQYXRoIGlzIGFj
dHVhbFBhdGgKLVBBU1MgaXNGaWxlIGlzIHRydWUKLSogUmVzb2x2ZSBhIGRpcmVjdG9yeQotUEFT
UyBleHBlY3RlZFBhdGggaXMgYWN0dWFsUGF0aAotUEFTUyBpc0RpcmVjdG9yeSBpcyB0cnVlCi0q
IFJlc29sdmUgYSBwYXRoIHVzaW5nIGEgdHJhaWxpbmcgc2xhc2gKLVBBU1MgZXhwZWN0ZWRQYXRo
IGlzIGFjdHVhbFBhdGgKLVBBU1MgaXNEaXJlY3RvcnkgaXMgdHJ1ZQotKiBSZXNvbHZpbmcgYSBw
ZXJzaXN0ZW50IFVSSS4KLVBBU1MgZXhwZWN0ZWRQYXRoIGlzIGFjdHVhbFBhdGgKLVBBU1MgaXNE
aXJlY3RvcnkgaXMgdHJ1ZQotRmluaXNoZWQgcnVubmluZyB0ZXN0cy4KLVBBU1Mgc3VjY2Vzc2Z1
bGx5UGFyc2VkIGlzIHRydWUKLQotVEVTVCBDT01QTEVURQotCkluZGV4OiBMYXlvdXRUZXN0cy9m
YXN0L2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy9mYXN0L2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbAkocmV2aXNpb24gODEwODgpCisrKyBM
YXlvdXRUZXN0cy9mYXN0L2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbAkod29ya2luZyBjb3B5
KQpAQCAtMSwxMyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0
IiBocmVmPSIuLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5jc3MiPgotPHNjcmlwdCBzcmM9
Ii4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IHNyYz0i
cmVzb3VyY2VzL2ZzLXRlc3QtdXRpbC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTxw
IGlkPSJkZXNjcmlwdGlvbiI+PC9wPgotPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+Ci08c2NyaXB0
IHNyYz0ic2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgc3Jj
PSIuLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KLTwvYm9keT4KLTwv
aHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvcmVz
b2x2ZS11cmkuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3Nj
cmlwdC10ZXN0cy9yZXNvbHZlLXVyaS5qcwkocmV2aXNpb24gODEwODgpCisrKyBMYXlvdXRUZXN0
cy9mYXN0L2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDE3MiArMCwwIEBACi1kZXNjcmlwdGlvbigiVGVzdHMgdXNpbmcgcmVzb2x2ZUxv
Y2FsRmlsZVN5c3RlbVVSSSB0byBvYnRhaW4gYW4gRW50cnkgZnJvbSBhIFVSSSIpOwotCi12YXIg
dGVzdEZpbGVOYW1lID0gJy90ZXN0RmlsZSc7Ci12YXIgZmlsZVN5c3RlbSA9IG51bGw7Ci12YXIg
ZXhwZWN0ZWRBbmRSdW5OZXh0ID0gZnVuY3Rpb24oKSB7IHRlc3RQYXNzZWQoIiIpOyBjbGVhbnVw
QW5kUnVuTmV4dCgpOyB9OwotCi12YXIgZXhwZWN0ZWRQYXRoID0gbnVsbDsKLXZhciBhY3R1YWxQ
YXRoID0gbnVsbDsKLQotZnVuY3Rpb24gZXJyb3JDYWxsYmFjayhlcnJvcikgewotICAgIGlmIChl
cnJvciAmJiBlcnJvci5jb2RlKQotICAgICAgICBkZWJ1ZygiRXJyb3Igb2NjdXJyZWQ6ICIgKyBl
cnJvci5jb2RlKTsKLSAgICB0ZXN0RmFpbGVkKCJCYWlsaW5nIG91dCBlYXJseSIpOwotICAgIGZp
bmlzaEpTVGVzdCgpOwotfQotCi1mdW5jdGlvbiBjcmVhdGVUZXN0RmlsZShjYWxsYmFjaykgewot
ICAgIGZpbGVTeXN0ZW0ucm9vdC5nZXRGaWxlKHRlc3RGaWxlTmFtZSwge2NyZWF0ZTp0cnVlfSwg
Y2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwotfQotCi1mdW5jdGlvbiBhc3NlcnRQYXRoc01hdGNo
KGV4cGVjdGVkLCBhY3R1YWwpIHsKLSAgICBleHBlY3RlZFBhdGggPSBleHBlY3RlZDsKLSAgICBh
Y3R1YWxQYXRoID0gYWN0dWFsOwotICAgIHNob3VsZEJlKCJleHBlY3RlZFBhdGgiLCAiYWN0dWFs
UGF0aCIpOwotfQotCi12YXIgaXNEaXJlY3RvcnkgPSBmYWxzZTsKLWZ1bmN0aW9uIGFzc2VydElz
RGlyZWN0b3J5KGVudHJ5KSB7Ci0gICAgaXNEaXJlY3RvcnkgPSBlbnRyeS5pc0RpcmVjdG9yeTsK
LSAgICBzaG91bGRCZVRydWUoImlzRGlyZWN0b3J5Iik7Ci19Ci0KLXZhciBpc0ZpbGUgPSBmYWxz
ZTsKLWZ1bmN0aW9uIGFzc2VydElzRmlsZShlbnRyeSkgewotICAgIGlzRmlsZSA9IGVudHJ5Lmlz
RmlsZTsKLSAgICBzaG91bGRCZVRydWUoImlzRmlsZSIpOwotfQotCi0vLyBUZXN0IGJvZHkgZnVu
Y3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotZnVuY3Rpb24gcnVuQmFzaWNUZXN0KCkgewotICAgIGRlYnVnKCIqIFJlc29sdmluZyBh
IGdlbmVyYXRlZCBVUkkuIik7Ci0gICAgY3JlYXRlVGVzdEZpbGUoZnVuY3Rpb24oZW50cnkpIHsK
LSAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSShlbnRyeS50b1VSSSgpLCBmdW5jdGlv
bihlKSB7Ci0gICAgICAgICAgICBhc3NlcnRQYXRoc01hdGNoKGVudHJ5LmZ1bGxQYXRoLCBlLmZ1
bGxQYXRoKTsKLSAgICAgICAgICAgIGFzc2VydElzRmlsZShlKTsKLSAgICAgICAgICAgIGNsZWFu
dXBBbmRSdW5OZXh0KCk7Ci0gICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwotICAgIH0pOwotfQot
Ci1mdW5jdGlvbiBydW5IYW5kbWFkZVVSSSgpIHsKLSAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgdGVz
dCBmaWxlIGJ5IGhhbmQiKTsKLSAgICBjcmVhdGVUZXN0RmlsZShmdW5jdGlvbihlbnRyeSkgewot
ICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVt
cG9yYXJ5L3Rlc3RGaWxlIiwgZnVuY3Rpb24oZSkgewotICAgICAgICAgICAgYXNzZXJ0UGF0aHNN
YXRjaCh0ZXN0RmlsZU5hbWUsIGUuZnVsbFBhdGgpOwotICAgICAgICAgICAgYXNzZXJ0SXNGaWxl
KGUpOwotICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKLSAgICAgICAgfSwgZXJyb3JD
YWxsYmFjayk7Ci0gICAgfSk7Ci19Ci0KLWZ1bmN0aW9uIHJ1bkJvZ3VzVVJJKCkgewotICAgIGRl
YnVnKCIqIFJlc29sdmluZyBhIGNvbXBsZXRlbHkgYm9ndXMgVVJJLiIpOwotICAgIHJlc29sdmVM
b2NhbEZpbGVTeXN0ZW1VUkkoImZvbyIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVkQW5kUnVuTmV4
dCk7Ci19Ci0KLWZ1bmN0aW9uIHJ1bldyb25nUHJvdG9jb2woKSB7Ci0gICAgZGVidWcoIiogUmVz
b2x2aW5nIGEgVVJJIHdpdGggdGhlIHdyb25nIHByb3RvY29sIik7Ci0gICAgcmVzb2x2ZUxvY2Fs
RmlsZVN5c3RlbVVSSSgiZmlsZTovLy9mb28vYmFyL2JheiIsIGVycm9yQ2FsbGJhY2ssIGV4cGVj
dGVkQW5kUnVuTmV4dCk7Ci19Ci0KLWZ1bmN0aW9uIHJ1bk5vdEVub3VnaFNsYXNoZXMoKSB7Ci0g
ICAgZGVidWcoIiogUmVzb2x2aW5nIGEgVVJJIHdpdGggbm8gc2xhc2ggYmV0d2VlbiB0eXBlIGFu
ZCBmaWxlIik7Ci0gICAgY3JlYXRlVGVzdEZpbGUoZnVuY3Rpb24oZW50cnkpIHsKLSAgICAgICAg
cmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiZmlsZXN5c3RlbTpmaWxlOi8vL3RlbXBvcmFyeXRl
c3RGaWxlIiwgZXJyb3JDYWxsYmFjaywgZXhwZWN0ZWRBbmRSdW5OZXh0KTsKLSAgICB9KTsKLX0K
LQotZnVuY3Rpb24gcnVuTm90RW5vdWdoU2xhc2hlczIoKSB7Ci0gICAgZGVidWcoIiogUmVzb2x2
aW5nIGEgVVJJIHdpdGggbm8gc2xhc2ggYmV0d2VlbiBwcm90b2NvbCBhbmQgdHlwZSIpOwotICAg
IGNyZWF0ZVRlc3RGaWxlKGZ1bmN0aW9uKGVudHJ5KSB7Ci0gICAgICAgIHJlc29sdmVMb2NhbEZp
bGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovL3RlbXBvcmFyeS90ZXN0RmlsZSIsIGVycm9y
Q2FsbGJhY2ssIGV4cGVjdGVkQW5kUnVuTmV4dCk7Ci0gICAgfSk7Ci19Ci0KLWZ1bmN0aW9uIHJ1
blVzZUJhY2tTbGFzaGVzKCkgewotICAgIGRlYnVnKCIqIFJlc29sdmUgYSBwYXRoIHVzaW5nIGJh
Y2tzbGFzaGVzIik7Ci0gICAgZmlsZVN5c3RlbS5yb290LmdldERpcmVjdG9yeSgiZm9vIiwge2Ny
ZWF0ZTp0cnVlfSwgZnVuY3Rpb24oZW50cnkpIHsKLSAgICAgICAgZW50cnkuZ2V0RmlsZSgidGVz
dEZpbGUiLCB7Y3JlYXRlOnRydWV9LCBmdW5jdGlvbihmKSB7Ci0gICAgICAgICAgICByZXNvbHZl
TG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9yYXJ5L2Zvb1xcdGVz
dEZpbGUiLCBmdW5jdGlvbihlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0UGF0aHNNYXRjaCgi
L2Zvby90ZXN0RmlsZSIsIGUuZnVsbFBhdGgpOwotICAgICAgICAgICAgICAgIGFzc2VydElzRmls
ZShlKTsKLSAgICAgICAgICAgICAgICBjbGVhbnVwQW5kUnVuTmV4dCgpOwotICAgICAgICAgICAg
fSwgZXJyb3JDYWxsYmFjayk7Ci0gICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwotICAgIH0sIGVy
cm9yQ2FsbGJhY2spOwotfQotCi1mdW5jdGlvbiBydW5EaXJlY3RvcnkoKSB7Ci0gICAgZGVidWco
IiogUmVzb2x2ZSBhIGRpcmVjdG9yeSIpOwotICAgIGZpbGVTeXN0ZW0ucm9vdC5nZXREaXJlY3Rv
cnkoImZvbyIsIHtjcmVhdGU6dHJ1ZX0sIGZ1bmN0aW9uKGVudHJ5KSB7Ci0gICAgICAgIHJlc29s
dmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovLy90ZW1wb3JhcnkvZm9vIiwg
ZnVuY3Rpb24oZSkgewotICAgICAgICAgICAgYXNzZXJ0UGF0aHNNYXRjaCgiL2ZvbyIsIGUuZnVs
bFBhdGgpOwotICAgICAgICAgICAgYXNzZXJ0SXNEaXJlY3RvcnkoZSk7Ci0gICAgICAgICAgICBj
bGVhbnVwQW5kUnVuTmV4dCgpOwotICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKLSAgICB9LCBl
cnJvckNhbGxiYWNrKTsKLX0KLQotZnVuY3Rpb24gcnVuV2l0aFRyYWlsaW5nU2xhc2goKSB7Ci0g
ICAgZGVidWcoIiogUmVzb2x2ZSBhIHBhdGggdXNpbmcgYSB0cmFpbGluZyBzbGFzaCIpOwotICAg
IGZpbGVTeXN0ZW0ucm9vdC5nZXREaXJlY3RvcnkoImZvbyIsIHtjcmVhdGU6dHJ1ZX0sIGZ1bmN0
aW9uKGVudHJ5KSB7Ci0gICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVzeXN0
ZW06ZmlsZTovLy90ZW1wb3JhcnkvZm9vLyIsIGZ1bmN0aW9uKGUpIHsKLSAgICAgICAgICAgIGFz
c2VydFBhdGhzTWF0Y2goIi9mb28iLCBlLmZ1bGxQYXRoKTsKLSAgICAgICAgICAgIGFzc2VydElz
RGlyZWN0b3J5KGUpOwotICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKLSAgICAgICAg
fSwgZXJyb3JDYWxsYmFjayk7Ci0gICAgfSwgZXJyb3JDYWxsYmFjayk7Ci19Ci0KLWZ1bmN0aW9u
IHJ1blBlcnNpc3RlbnRUZXN0KCkgewotICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIHBlcnNpc3Rl
bnQgVVJJLiIpOwotICAgIHJlcXVlc3RGaWxlU3lzdGVtKFBFUlNJU1RFTlQsIDEwMCwgZnVuY3Rp
b24oZnMpIHsKLSAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSShmcy5yb290LnRvVVJJ
KCksIGZ1bmN0aW9uKGVudHJ5KSB7Ci0gICAgICAgICAgICBhc3NlcnRQYXRoc01hdGNoKCIvIiwg
ZW50cnkuZnVsbFBhdGgpOwotICAgICAgICAgICAgYXNzZXJ0SXNEaXJlY3RvcnkoZW50cnkpOwot
ICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKLSAgICAgICAgfSwgZXJyb3JDYWxsYmFj
ayk7Ci0gICAgfSk7Ci19Ci0KLS8vIEVuZCBvZiB0ZXN0IGJvZHkgZnVuY3Rpb25zIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12YXIgdGVzdHNMaXN0ID0g
WwotICAgIHJ1bkJhc2ljVGVzdCwKLSAgICBydW5IYW5kbWFkZVVSSSwKLSAgICBydW5Cb2d1c1VS
SSwKLSAgICBydW5Xcm9uZ1Byb3RvY29sLAotICAgIHJ1bk5vdEVub3VnaFNsYXNoZXMsCi0gICAg
cnVuTm90RW5vdWdoU2xhc2hlczIsCi0gICAgcnVuVXNlQmFja1NsYXNoZXMsCi0gICAgcnVuRGly
ZWN0b3J5LAotICAgIHJ1bldpdGhUcmFpbGluZ1NsYXNoLAotICAgIHJ1blBlcnNpc3RlbnRUZXN0
LAotXTsKLXZhciB0ZXN0Q291bnRlciA9IDA7Ci0KLWZ1bmN0aW9uIHJ1bk5leHRUZXN0KCkgewot
ICAgIGlmICh0ZXN0Q291bnRlciA9PSB0ZXN0c0xpc3QubGVuZ3RoKSB7Ci0gICAgICAgIGRlYnVn
KCJGaW5pc2hlZCBydW5uaW5nIHRlc3RzLiIpOwotICAgICAgICBmaW5pc2hKU1Rlc3QoKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgdGVzdHNMaXN0W3Rlc3RDb3VudGVyKytdKCk7Ci19Ci0KLWZ1bmN0
aW9uIGNsZWFudXBBbmRSdW5OZXh0KCkgewotICAgIHJlbW92ZUFsbEluRGlyZWN0b3J5KGZpbGVT
eXN0ZW0ucm9vdCwgcnVuTmV4dFRlc3QsIHJ1bk5leHRUZXN0KTsKLX0KLQotZnVuY3Rpb24gZmls
ZVN5c3RlbUNhbGxiYWNrKGZzKSB7Ci0gICAgZmlsZVN5c3RlbSA9IGZzOwotICAgIGNsZWFudXBB
bmRSdW5OZXh0KCk7Ci19Ci0KLWlmICh3aW5kb3cucmVxdWVzdEZpbGVTeXN0ZW0pIHsKLSAgICB3
aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7Ci0gICAgcmVxdWVzdEZpbGVTeXN0ZW0od2luZG93
LlRFTVBPUkFSWSwgMTAwLCBmaWxlU3lzdGVtQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOwotfSBl
bHNlCi0gICAgZGVidWcoIlRoaXMgdGVzdCByZXF1aXJlcyBGaWxlU3lzdGVtIEFQSSBzdXBwb3J0
LiIpOwotCi13aW5kb3cuc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKSW5kZXg6IExheW91dFRl
c3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9yZXNvbHZlLXVyaS1leHBlY3RlZC50eHQKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gODEwODgpCShmcm9tIExheW91dFRlc3RzL2Zhc3QvZmlsZXN5
c3RlbS9yZXNvbHZlLXVyaS1leHBlY3RlZC50eHQ6ODEwODgpCisrKyBMYXlvdXRUZXN0cy9odHRw
L3Rlc3RzL2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmktZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMzYgQEAKK1Rlc3RzIHVzaW5nIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkg
dG8gb2J0YWluIGFuIEVudHJ5IGZyb20gYSBVUkkKKworT24gc3VjY2VzcywgeW91IHdpbGwgc2Vl
IGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUi
LgorCisKKyogUmVzb2x2aW5nIGEgZ2VuZXJhdGVkIFVSSS4KK1BBU1MgZXhwZWN0ZWRQYXRoIGlz
IGFjdHVhbFBhdGgKK1BBU1MgaXNGaWxlIGlzIHRydWUKKyogUmVzb2x2aW5nIHRlc3QgZmlsZSBi
eSBoYW5kCitQQVNTIGV4cGVjdGVkUGF0aCBpcyBhY3R1YWxQYXRoCitQQVNTIGlzRmlsZSBpcyB0
cnVlCisqIFJlc29sdmluZyBhIGNvbXBsZXRlbHkgYm9ndXMgVVJJLgorUEFTUyAKKyogUmVzb2x2
aW5nIGEgVVJJIHdpdGggdGhlIHdyb25nIHByb3RvY29sCitQQVNTIAorKiBSZXNvbHZpbmcgYSBV
Ukkgd2l0aCBubyBzbGFzaCBiZXR3ZWVuIHR5cGUgYW5kIGZpbGUKK1BBU1MgCisqIFJlc29sdmlu
ZyBhIFVSSSB3aXRoIG5vIHNsYXNoIGJldHdlZW4gcHJvdG9jb2wgYW5kIHR5cGUKK1BBU1MgCisq
IFJlc29sdmUgYSBwYXRoIHVzaW5nIGJhY2tzbGFzaGVzCitQQVNTIGV4cGVjdGVkUGF0aCBpcyBh
Y3R1YWxQYXRoCitQQVNTIGlzRmlsZSBpcyB0cnVlCisqIFJlc29sdmUgYSBkaXJlY3RvcnkKK1BB
U1MgZXhwZWN0ZWRQYXRoIGlzIGFjdHVhbFBhdGgKK1BBU1MgaXNEaXJlY3RvcnkgaXMgdHJ1ZQor
KiBSZXNvbHZlIGEgcGF0aCB1c2luZyBhIHRyYWlsaW5nIHNsYXNoCitQQVNTIGV4cGVjdGVkUGF0
aCBpcyBhY3R1YWxQYXRoCitQQVNTIGlzRGlyZWN0b3J5IGlzIHRydWUKKyogUmVzb2x2aW5nIGEg
cGVyc2lzdGVudCBVUkkuCitQQVNTIGV4cGVjdGVkUGF0aCBpcyBhY3R1YWxQYXRoCitQQVNTIGlz
RGlyZWN0b3J5IGlzIHRydWUKK0ZpbmlzaGVkIHJ1bm5pbmcgdGVzdHMuCitQQVNTIHN1Y2Nlc3Nm
dWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMv
aHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWwKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWwJKHJldmlzaW9u
IDgxMDg4KQkoZnJvbSBMYXlvdXRUZXN0cy9mYXN0L2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRt
bDo4MTA4OCkKKysrIExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9yZXNvbHZlLXVy
aS5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMgQEAKKzxodG1sPgorPGhlYWQ+Cis8
bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXN0eWxl
LmNzcyI+Cis8c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Nj
cmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzIj48L3NjcmlwdD4K
KzwvaGVhZD4KKzxib2R5PgorPHAgaWQ9ImRlc2NyaXB0aW9uIj48L3A+Cis8ZGl2IGlkPSJjb25z
b2xlIj48L2Rpdj4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvcmVzb2x2ZS11cmkuanMiPjwv
c2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwv
c2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9m
aWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaHR0
cC90ZXN0cy9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlv
dXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbAkod29ya2luZyBj
b3B5KQpAQCAtMSwxMyArMSwxMyBAQAogPGh0bWw+CiA8aGVhZD4KLTxsaW5rIHJlbD0ic3R5bGVz
aGVldCIgaHJlZj0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIj4KLTxzY3JpcHQg
c3JjPSIuLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPGxpbmsgcmVs
PSJzdHlsZXNoZWV0IiBocmVmPSIvanMtdGVzdC1yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5jc3Mi
PgorPHNjcmlwdCBzcmM9Ii9qcy10ZXN0LXJlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3Jp
cHQ+CiA8c2NyaXB0IHNyYz0icmVzb3VyY2VzL2ZzLXRlc3QtdXRpbC5qcyI+PC9zY3JpcHQ+CiA8
L2hlYWQ+CiA8Ym9keT4KIDxwIGlkPSJkZXNjcmlwdGlvbiI+PC9wPgogPGRpdiBpZD0iY29uc29s
ZSI+PC9kaXY+CiA8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzIj48L3Nj
cmlwdD4KLTxzY3JpcHQgc3JjPSIuLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3Nj
cmlwdD4KKzxzY3JpcHQgc3JjPSIvanMtdGVzdC1yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48
L3NjcmlwdD4KIDwvYm9keT4KIDwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMv
ZmlsZXN5c3RlbS9yZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9yZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzCShy
ZXZpc2lvbiA4MTA4OCkJKGZyb20gTGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3Jlc291cmNl
cy9mcy10ZXN0LXV0aWwuanM6ODEwODgpCisrKyBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVz
eXN0ZW0vcmVzb3VyY2VzL2ZzLXRlc3QtdXRpbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDg4IEBACitmdW5jdGlvbiBiaW5kQ2FsbGJhY2sob2JqLCBjYWxsYmFjaywgYXJnMSwgYXJnMiwg
YXJnMykKK3sKKyAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7CisgICAgICAgIGlmIChhcmcgPT0g
dW5kZWZpbmVkKQorICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkob2JqLCBbYXJnMSwgYXJnMiwg
YXJnM10pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjYWxsYmFjay5hcHBseShvYmosIFth
cmcsIGFyZzEsIGFyZzIsIGFyZzNdKTsKKyAgICB9OworfQorCisvLyBVc2FnZToKKy8vICAgdmFy
IGhlbHBlciA9IG5ldyBKb2luSGVscGVyOworLy8KKy8vICAgaGVscGVyLnJ1bihmdW5jdGlvbigp
IHsgLyogZG8gc29tZXRoaW5nIHRoYXQgZXZlbnR1YWxseSBjYWxscyBoZWxwZXIuZG9uZSgpOyAq
LyB9KTsKKy8vICAgaGVscGVyLnJ1bihmdW5jdGlvbigpIHsgLyogZG8gc29tZXRoaW5nIHRoYXQg
ZXZlbnR1YWxseSBjYWxscyBoZWxwZXIuZG9uZSgpOyAqLyB9KTsKKy8vICAgLi4uCisvLyAgIGhl
bHBlci5qb2luKGpvaW5DYWxsYmFjayk7CisvLwordmFyIEpvaW5IZWxwZXIgPSBmdW5jdGlvbigp
Cit7CisgICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9ucyA9IFtdOworICAgIHRoaXMucGVuZGluZ09w
ZXJhdGlvbkNvdW50ID0gMDsKKyAgICB0aGlzLmpvaW5DYWxsYmFjayA9IG51bGw7CisKKyAgICB0
aGlzLnJ1biA9IGZ1bmN0aW9uKG9wZXJhdGlvbikKKyAgICB7CisgICAgICAgIHRoaXMucGVuZGlu
Z09wZXJhdGlvbkNvdW50Kys7CisgICAgICAgIG9wZXJhdGlvbigpOworICAgIH07CisKKyAgICAv
LyBDYWxsIHRoaXMgd2hlbiBhbiBvcGVyYXRpb24gaXMgZG9uZS4KKyAgICB0aGlzLmRvbmUgPSBm
dW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25Db3VudC0tOwor
ICAgICAgICBpZiAodGhpcy5wZW5kaW5nT3BlcmF0aW9uQ291bnQgPT0gMCAmJiB0aGlzLmpvaW5D
YWxsYmFjaykKKyAgICAgICAgICAgIHRoaXMuam9pbkNhbGxiYWNrKCk7CisgICAgfTsKKworICAg
IC8vIFRoaXMgZXZlbnR1YWxseSBjYWxscyB0aGUgam9pbkNhbGxiYWNrIHdoZW4gaGVscGVyLmRv
bmUoKSBpcyBjYWxsZWQgYXMgbWFueSB0aW1lcyBhcyBoZWxwZXIucnVuKCkgaXMgY2FsbGVkLgor
ICAgIHRoaXMuam9pbiA9IGZ1bmN0aW9uKGpvaW5DYWxsYmFjaykKKyAgICB7CisgICAgICAgIGlm
ICh0aGlzLnBlbmRpbmdPcGVyYXRpb25Db3VudCA9PSAwKQorICAgICAgICAgICAgam9pbkNhbGxi
YWNrKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuam9pbkNhbGxiYWNrID0gam9p
bkNhbGxiYWNrOworICAgIH07Cit9OworCisvLyBSZW1vdmUgZXZlcnl0aGluZyBpbiB0aGUgZ2l2
ZW4gZGlyZWN0b3J5LgorZnVuY3Rpb24gcmVtb3ZlQWxsSW5EaXJlY3RvcnkoZGlyZWN0b3J5LCBz
dWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHsKKyAgICB2YXIgUmVtb3ZlQWxsSW5EaXJl
Y3RvcnlIZWxwZXIgPSBmdW5jdGlvbihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHsK
KyAgICAgICAgdGhpcy5lbnRyaWVzQ291bnQgPSAwOworICAgICAgICB0aGlzLnJlYWRlciA9IG51
bGw7CisgICAgICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gc3VjY2Vzc0NhbGxiYWNrOworICAg
ICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrOworCisgICAgICAgIHRoaXMu
ZW50cnlSZW1vdmVkQ2FsbGJhY2sgPSBiaW5kQ2FsbGJhY2sodGhpcywgZnVuY3Rpb24oZW50cnkp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgtLXRoaXMuZW50cmllc0NvdW50ID09IDAgJiYg
dGhpcy5zdWNjZXNzQ2FsbGJhY2spCisgICAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzQ2FsbGJh
Y2soKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5lbnRyaWVzQ2FsbGJhY2sgPSBiaW5k
Q2FsbGJhY2sodGhpcywgZnVuY3Rpb24oZW50cmllcykKKyAgICAgICAgeworICAgICAgICAgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAg
ICAgdGhpcy5lbnRyaWVzQ291bnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoZW50cmllc1tpXS5p
c0RpcmVjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc1tpXS5yZW1vdmVSZWN1cnNp
dmVseSh0aGlzLmVudHJ5UmVtb3ZlZENhbGxiYWNrLCB0aGlzLmVycm9yQ2FsbGJhY2spOworICAg
ICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnRyaWVzW2ldLnJlbW92
ZSh0aGlzLmVudHJ5UmVtb3ZlZENhbGxiYWNrLCB0aGlzLmVycm9yQ2FsbGJhY2spOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0
aCkKKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRlci5yZWFkRW50cmllcyh0aGlzLmVudHJpZXND
YWxsYmFjaywgdGhpcy5lcnJvckNhbGxiYWNrKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMu
ZW50cmllc0NvdW50ID09IDAgJiYgdGhpcy5zdWNjZXNzQ2FsbGJhY2spCisgICAgICAgICAgICAg
ICAgdGhpcy5zdWNjZXNzQ2FsbGJhY2soKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5y
ZW1vdmVBbGxJbkRpcmVjdG9yeSA9IGZ1bmN0aW9uKGRpcmVjdG9yeSkKKyAgICAgICAgeworICAg
ICAgICAgICAgdGhpcy5yZWFkZXIgPSBkaXJlY3RvcnkuY3JlYXRlUmVhZGVyKCk7CisgICAgICAg
ICAgICB0aGlzLnJlYWRlci5yZWFkRW50cmllcyh0aGlzLmVudHJpZXNDYWxsYmFjaywgdGhpcy5l
cnJvckNhbGxiYWNrKTsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAgdmFyIGhlbHBlciA9IG5l
dyBSZW1vdmVBbGxJbkRpcmVjdG9yeUhlbHBlcihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJh
Y2spOworICAgIGhlbHBlci5yZW1vdmVBbGxJbkRpcmVjdG9yeShkaXJlY3RvcnkpOworfQpJbmRl
eDogTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jlc291cmNlcy9mcy10ZXN0LXV0
aWwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jl
c291cmNlcy9mcy10ZXN0LXV0aWwuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9odHRw
L3Rlc3RzL2ZpbGVzeXN0ZW0vcmVzb3VyY2VzL2ZzLXRlc3QtdXRpbC5qcwkod29ya2luZyBjb3B5
KQpAQCAtOCw0NCArOCw2IEBAIGZ1bmN0aW9uIGJpbmRDYWxsYmFjayhvYmosIGNhbGxiYWNrLCBh
cmcKICAgICB9OwogfQogCi0vLyBVc2FnZToKLS8vICAgdmFyIGhlbHBlciA9IG5ldyBKb2luSGVs
cGVyOwotLy8KLS8vICAgaGVscGVyLnJ1bihmdW5jdGlvbigpIHsgLyogZG8gc29tZXRoaW5nIHRo
YXQgZXZlbnR1YWxseSBjYWxscyBoZWxwZXIuZG9uZSgpOyAqLyB9KTsKLS8vICAgaGVscGVyLnJ1
bihmdW5jdGlvbigpIHsgLyogZG8gc29tZXRoaW5nIHRoYXQgZXZlbnR1YWxseSBjYWxscyBoZWxw
ZXIuZG9uZSgpOyAqLyB9KTsKLS8vICAgLi4uCi0vLyAgIGhlbHBlci5qb2luKGpvaW5DYWxsYmFj
ayk7Ci0vLwotdmFyIEpvaW5IZWxwZXIgPSBmdW5jdGlvbigpCi17Ci0gICAgdGhpcy5wZW5kaW5n
T3BlcmF0aW9ucyA9IFtdOwotICAgIHRoaXMucGVuZGluZ09wZXJhdGlvbkNvdW50ID0gMDsKLSAg
ICB0aGlzLmpvaW5DYWxsYmFjayA9IG51bGw7Ci0KLSAgICB0aGlzLnJ1biA9IGZ1bmN0aW9uKG9w
ZXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVuZGluZ09wZXJhdGlvbkNvdW50Kys7Ci0g
ICAgICAgIG9wZXJhdGlvbigpOwotICAgIH07Ci0KLSAgICAvLyBDYWxsIHRoaXMgd2hlbiBhbiBv
cGVyYXRpb24gaXMgZG9uZS4KLSAgICB0aGlzLmRvbmUgPSBmdW5jdGlvbigpCi0gICAgewotICAg
ICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25Db3VudC0tOwotICAgICAgICBpZiAodGhpcy5wZW5k
aW5nT3BlcmF0aW9uQ291bnQgPT0gMCAmJiB0aGlzLmpvaW5DYWxsYmFjaykKLSAgICAgICAgICAg
IHRoaXMuam9pbkNhbGxiYWNrKCk7Ci0gICAgfTsKLQotICAgIC8vIFRoaXMgZXZlbnR1YWxseSBj
YWxscyB0aGUgam9pbkNhbGxiYWNrIHdoZW4gaGVscGVyLmRvbmUoKSBpcyBjYWxsZWQgYXMgbWFu
eSB0aW1lcyBhcyBoZWxwZXIucnVuKCkgaXMgY2FsbGVkLgotICAgIHRoaXMuam9pbiA9IGZ1bmN0
aW9uKGpvaW5DYWxsYmFjaykKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnBlbmRpbmdPcGVyYXRp
b25Db3VudCA9PSAwKQotICAgICAgICAgICAgam9pbkNhbGxiYWNrKCk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIHRoaXMuam9pbkNhbGxiYWNrID0gam9pbkNhbGxiYWNrOwotICAgIH07Ci19
OwotCiAvLyBSZW1vdmUgZXZlcnl0aGluZyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogZnVuY3Rp
b24gcmVtb3ZlQWxsSW5EaXJlY3RvcnkoZGlyZWN0b3J5LCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9y
Q2FsbGJhY2spIHsKICAgICB2YXIgUmVtb3ZlQWxsSW5EaXJlY3RvcnlIZWxwZXIgPSBmdW5jdGlv
bihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHsKSW5kZXg6IExheW91dFRlc3RzL2h0
dHAvdGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvVEVNUExBVEUuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL1RFTVBM
QVRFLmh0bWwJKHJldmlzaW9uIDgxMDg4KQkoZnJvbSBMYXlvdXRUZXN0cy9mYXN0L2ZpbGVzeXN0
ZW0vc2NyaXB0LXRlc3RzL1RFTVBMQVRFLmh0bWw6ODEwODgpCisrKyBMYXlvdXRUZXN0cy9odHRw
L3Rlc3RzL2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL1RFTVBMQVRFLmh0bWwJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVl
dCIgaHJlZj0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIj4KKzxzY3JpcHQgc3Jj
PSIuLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9
InJlc291cmNlcy9mcy10ZXN0LXV0aWwuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8
cCBpZD0iZGVzY3JpcHRpb24iPjwvcD4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorPHNjcmlw
dCBzcmM9IllPVVJfSlNfRklMRV9IRVJFIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi9qcy9y
ZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5k
ZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvVEVNUExB
VEUuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0v
c2NyaXB0LXRlc3RzL1RFTVBMQVRFLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9o
dHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL1RFTVBMQVRFLmh0bWwJKHdvcmtpbmcg
Y29weSkKQEAgLTEsMTMgKzEsMTMgQEAKIDxodG1sPgogPGhlYWQ+Ci08bGluayByZWw9InN0eWxl
c2hlZXQiIGhyZWY9Ii4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXN0eWxlLmNzcyI+Ci08c2NyaXB0
IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzxsaW5rIHJl
bD0ic3R5bGVzaGVldCIgaHJlZj0iL2pzLXRlc3QtcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3Nz
Ij4KKzxzY3JpcHQgc3JjPSIvanMtdGVzdC1yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2Ny
aXB0PgogPHNjcmlwdCBzcmM9InJlc291cmNlcy9mcy10ZXN0LXV0aWwuanMiPjwvc2NyaXB0Pgog
PC9oZWFkPgogPGJvZHk+CiA8cCBpZD0iZGVzY3JpcHRpb24iPjwvcD4KIDxkaXYgaWQ9ImNvbnNv
bGUiPjwvZGl2PgogPHNjcmlwdCBzcmM9IllPVVJfSlNfRklMRV9IRVJFIj48L3NjcmlwdD4KLTxz
Y3JpcHQgc3JjPSIuLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzxz
Y3JpcHQgc3JjPSIvanMtdGVzdC1yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4K
IDwvYm9keT4KIDwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3Rl
bS9zY3JpcHQtdGVzdHMvcmVzb2x2ZS11cmkuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
aHR0cC90ZXN0cy9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9yZXNvbHZlLXVyaS5qcwkocmV2aXNp
b24gODEwODgpCShmcm9tIExheW91dFRlc3RzL2Zhc3QvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMv
cmVzb2x2ZS11cmkuanM6ODEwODgpCisrKyBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0
ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTcyIEBACitkZXNjcmlwdGlvbigiVGVzdHMgdXNpbmcgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVS
SSB0byBvYnRhaW4gYW4gRW50cnkgZnJvbSBhIFVSSSIpOworCit2YXIgdGVzdEZpbGVOYW1lID0g
Jy90ZXN0RmlsZSc7Cit2YXIgZmlsZVN5c3RlbSA9IG51bGw7Cit2YXIgZXhwZWN0ZWRBbmRSdW5O
ZXh0ID0gZnVuY3Rpb24oKSB7IHRlc3RQYXNzZWQoIiIpOyBjbGVhbnVwQW5kUnVuTmV4dCgpOyB9
OworCit2YXIgZXhwZWN0ZWRQYXRoID0gbnVsbDsKK3ZhciBhY3R1YWxQYXRoID0gbnVsbDsKKwor
ZnVuY3Rpb24gZXJyb3JDYWxsYmFjayhlcnJvcikgeworICAgIGlmIChlcnJvciAmJiBlcnJvci5j
b2RlKQorICAgICAgICBkZWJ1ZygiRXJyb3Igb2NjdXJyZWQ6ICIgKyBlcnJvci5jb2RlKTsKKyAg
ICB0ZXN0RmFpbGVkKCJCYWlsaW5nIG91dCBlYXJseSIpOworICAgIGZpbmlzaEpTVGVzdCgpOwor
fQorCitmdW5jdGlvbiBjcmVhdGVUZXN0RmlsZShjYWxsYmFjaykgeworICAgIGZpbGVTeXN0ZW0u
cm9vdC5nZXRGaWxlKHRlc3RGaWxlTmFtZSwge2NyZWF0ZTp0cnVlfSwgY2FsbGJhY2ssIGVycm9y
Q2FsbGJhY2spOworfQorCitmdW5jdGlvbiBhc3NlcnRQYXRoc01hdGNoKGV4cGVjdGVkLCBhY3R1
YWwpIHsKKyAgICBleHBlY3RlZFBhdGggPSBleHBlY3RlZDsKKyAgICBhY3R1YWxQYXRoID0gYWN0
dWFsOworICAgIHNob3VsZEJlKCJleHBlY3RlZFBhdGgiLCAiYWN0dWFsUGF0aCIpOworfQorCit2
YXIgaXNEaXJlY3RvcnkgPSBmYWxzZTsKK2Z1bmN0aW9uIGFzc2VydElzRGlyZWN0b3J5KGVudHJ5
KSB7CisgICAgaXNEaXJlY3RvcnkgPSBlbnRyeS5pc0RpcmVjdG9yeTsKKyAgICBzaG91bGRCZVRy
dWUoImlzRGlyZWN0b3J5Iik7Cit9CisKK3ZhciBpc0ZpbGUgPSBmYWxzZTsKK2Z1bmN0aW9uIGFz
c2VydElzRmlsZShlbnRyeSkgeworICAgIGlzRmlsZSA9IGVudHJ5LmlzRmlsZTsKKyAgICBzaG91
bGRCZVRydWUoImlzRmlsZSIpOworfQorCisvLyBUZXN0IGJvZHkgZnVuY3Rpb25zIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZnVuY3Rpb24g
cnVuQmFzaWNUZXN0KCkgeworICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIGdlbmVyYXRlZCBVUkku
Iik7CisgICAgY3JlYXRlVGVzdEZpbGUoZnVuY3Rpb24oZW50cnkpIHsKKyAgICAgICAgcmVzb2x2
ZUxvY2FsRmlsZVN5c3RlbVVSSShlbnRyeS50b1VSSSgpLCBmdW5jdGlvbihlKSB7CisgICAgICAg
ICAgICBhc3NlcnRQYXRoc01hdGNoKGVudHJ5LmZ1bGxQYXRoLCBlLmZ1bGxQYXRoKTsKKyAgICAg
ICAgICAgIGFzc2VydElzRmlsZShlKTsKKyAgICAgICAgICAgIGNsZWFudXBBbmRSdW5OZXh0KCk7
CisgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOworICAgIH0pOworfQorCitmdW5jdGlvbiBydW5I
YW5kbWFkZVVSSSgpIHsKKyAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgdGVzdCBmaWxlIGJ5IGhhbmQi
KTsKKyAgICBjcmVhdGVUZXN0RmlsZShmdW5jdGlvbihlbnRyeSkgeworICAgICAgICByZXNvbHZl
TG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9yYXJ5L3Rlc3RGaWxl
IiwgZnVuY3Rpb24oZSkgeworICAgICAgICAgICAgYXNzZXJ0UGF0aHNNYXRjaCh0ZXN0RmlsZU5h
bWUsIGUuZnVsbFBhdGgpOworICAgICAgICAgICAgYXNzZXJ0SXNGaWxlKGUpOworICAgICAgICAg
ICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKKyAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CisgICAg
fSk7Cit9CisKK2Z1bmN0aW9uIHJ1bkJvZ3VzVVJJKCkgeworICAgIGRlYnVnKCIqIFJlc29sdmlu
ZyBhIGNvbXBsZXRlbHkgYm9ndXMgVVJJLiIpOworICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1V
UkkoImZvbyIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVkQW5kUnVuTmV4dCk7Cit9CisKK2Z1bmN0
aW9uIHJ1bldyb25nUHJvdG9jb2woKSB7CisgICAgZGVidWcoIiogUmVzb2x2aW5nIGEgVVJJIHdp
dGggdGhlIHdyb25nIHByb3RvY29sIik7CisgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgi
ZmlsZTovLy9mb28vYmFyL2JheiIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVkQW5kUnVuTmV4dCk7
Cit9CisKK2Z1bmN0aW9uIHJ1bk5vdEVub3VnaFNsYXNoZXMoKSB7CisgICAgZGVidWcoIiogUmVz
b2x2aW5nIGEgVVJJIHdpdGggbm8gc2xhc2ggYmV0d2VlbiB0eXBlIGFuZCBmaWxlIik7CisgICAg
Y3JlYXRlVGVzdEZpbGUoZnVuY3Rpb24oZW50cnkpIHsKKyAgICAgICAgcmVzb2x2ZUxvY2FsRmls
ZVN5c3RlbVVSSSgiZmlsZXN5c3RlbTpmaWxlOi8vL3RlbXBvcmFyeXRlc3RGaWxlIiwgZXJyb3JD
YWxsYmFjaywgZXhwZWN0ZWRBbmRSdW5OZXh0KTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gcnVu
Tm90RW5vdWdoU2xhc2hlczIoKSB7CisgICAgZGVidWcoIiogUmVzb2x2aW5nIGEgVVJJIHdpdGgg
bm8gc2xhc2ggYmV0d2VlbiBwcm90b2NvbCBhbmQgdHlwZSIpOworICAgIGNyZWF0ZVRlc3RGaWxl
KGZ1bmN0aW9uKGVudHJ5KSB7CisgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZp
bGVzeXN0ZW06ZmlsZTovL3RlbXBvcmFyeS90ZXN0RmlsZSIsIGVycm9yQ2FsbGJhY2ssIGV4cGVj
dGVkQW5kUnVuTmV4dCk7CisgICAgfSk7Cit9CisKK2Z1bmN0aW9uIHJ1blVzZUJhY2tTbGFzaGVz
KCkgeworICAgIGRlYnVnKCIqIFJlc29sdmUgYSBwYXRoIHVzaW5nIGJhY2tzbGFzaGVzIik7Cisg
ICAgZmlsZVN5c3RlbS5yb290LmdldERpcmVjdG9yeSgiZm9vIiwge2NyZWF0ZTp0cnVlfSwgZnVu
Y3Rpb24oZW50cnkpIHsKKyAgICAgICAgZW50cnkuZ2V0RmlsZSgidGVzdEZpbGUiLCB7Y3JlYXRl
OnRydWV9LCBmdW5jdGlvbihmKSB7CisgICAgICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVt
VVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9yYXJ5L2Zvb1xcdGVzdEZpbGUiLCBmdW5jdGlv
bihlKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0UGF0aHNNYXRjaCgiL2Zvby90ZXN0RmlsZSIs
IGUuZnVsbFBhdGgpOworICAgICAgICAgICAgICAgIGFzc2VydElzRmlsZShlKTsKKyAgICAgICAg
ICAgICAgICBjbGVhbnVwQW5kUnVuTmV4dCgpOworICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFj
ayk7CisgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOworICAgIH0sIGVycm9yQ2FsbGJhY2spOwor
fQorCitmdW5jdGlvbiBydW5EaXJlY3RvcnkoKSB7CisgICAgZGVidWcoIiogUmVzb2x2ZSBhIGRp
cmVjdG9yeSIpOworICAgIGZpbGVTeXN0ZW0ucm9vdC5nZXREaXJlY3RvcnkoImZvbyIsIHtjcmVh
dGU6dHJ1ZX0sIGZ1bmN0aW9uKGVudHJ5KSB7CisgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0
ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovLy90ZW1wb3JhcnkvZm9vIiwgZnVuY3Rpb24oZSkgewor
ICAgICAgICAgICAgYXNzZXJ0UGF0aHNNYXRjaCgiL2ZvbyIsIGUuZnVsbFBhdGgpOworICAgICAg
ICAgICAgYXNzZXJ0SXNEaXJlY3RvcnkoZSk7CisgICAgICAgICAgICBjbGVhbnVwQW5kUnVuTmV4
dCgpOworICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKKyAgICB9LCBlcnJvckNhbGxiYWNrKTsK
K30KKworZnVuY3Rpb24gcnVuV2l0aFRyYWlsaW5nU2xhc2goKSB7CisgICAgZGVidWcoIiogUmVz
b2x2ZSBhIHBhdGggdXNpbmcgYSB0cmFpbGluZyBzbGFzaCIpOworICAgIGZpbGVTeXN0ZW0ucm9v
dC5nZXREaXJlY3RvcnkoImZvbyIsIHtjcmVhdGU6dHJ1ZX0sIGZ1bmN0aW9uKGVudHJ5KSB7Cisg
ICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovLy90ZW1w
b3JhcnkvZm9vLyIsIGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgIGFzc2VydFBhdGhzTWF0Y2go
Ii9mb28iLCBlLmZ1bGxQYXRoKTsKKyAgICAgICAgICAgIGFzc2VydElzRGlyZWN0b3J5KGUpOwor
ICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKKyAgICAgICAgfSwgZXJyb3JDYWxsYmFj
ayk7CisgICAgfSwgZXJyb3JDYWxsYmFjayk7Cit9CisKK2Z1bmN0aW9uIHJ1blBlcnNpc3RlbnRU
ZXN0KCkgeworICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIHBlcnNpc3RlbnQgVVJJLiIpOworICAg
IHJlcXVlc3RGaWxlU3lzdGVtKFBFUlNJU1RFTlQsIDEwMCwgZnVuY3Rpb24oZnMpIHsKKyAgICAg
ICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSShmcy5yb290LnRvVVJJKCksIGZ1bmN0aW9uKGVu
dHJ5KSB7CisgICAgICAgICAgICBhc3NlcnRQYXRoc01hdGNoKCIvIiwgZW50cnkuZnVsbFBhdGgp
OworICAgICAgICAgICAgYXNzZXJ0SXNEaXJlY3RvcnkoZW50cnkpOworICAgICAgICAgICAgY2xl
YW51cEFuZFJ1bk5leHQoKTsKKyAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7CisgICAgfSk7Cit9
CisKKy8vIEVuZCBvZiB0ZXN0IGJvZHkgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2YXIgdGVzdHNMaXN0ID0gWworICAgIHJ1bkJhc2lj
VGVzdCwKKyAgICBydW5IYW5kbWFkZVVSSSwKKyAgICBydW5Cb2d1c1VSSSwKKyAgICBydW5Xcm9u
Z1Byb3RvY29sLAorICAgIHJ1bk5vdEVub3VnaFNsYXNoZXMsCisgICAgcnVuTm90RW5vdWdoU2xh
c2hlczIsCisgICAgcnVuVXNlQmFja1NsYXNoZXMsCisgICAgcnVuRGlyZWN0b3J5LAorICAgIHJ1
bldpdGhUcmFpbGluZ1NsYXNoLAorICAgIHJ1blBlcnNpc3RlbnRUZXN0LAorXTsKK3ZhciB0ZXN0
Q291bnRlciA9IDA7CisKK2Z1bmN0aW9uIHJ1bk5leHRUZXN0KCkgeworICAgIGlmICh0ZXN0Q291
bnRlciA9PSB0ZXN0c0xpc3QubGVuZ3RoKSB7CisgICAgICAgIGRlYnVnKCJGaW5pc2hlZCBydW5u
aW5nIHRlc3RzLiIpOworICAgICAgICBmaW5pc2hKU1Rlc3QoKTsKKyAgICB9IGVsc2UKKyAgICAg
ICAgdGVzdHNMaXN0W3Rlc3RDb3VudGVyKytdKCk7Cit9CisKK2Z1bmN0aW9uIGNsZWFudXBBbmRS
dW5OZXh0KCkgeworICAgIHJlbW92ZUFsbEluRGlyZWN0b3J5KGZpbGVTeXN0ZW0ucm9vdCwgcnVu
TmV4dFRlc3QsIHJ1bk5leHRUZXN0KTsKK30KKworZnVuY3Rpb24gZmlsZVN5c3RlbUNhbGxiYWNr
KGZzKSB7CisgICAgZmlsZVN5c3RlbSA9IGZzOworICAgIGNsZWFudXBBbmRSdW5OZXh0KCk7Cit9
CisKK2lmICh3aW5kb3cucmVxdWVzdEZpbGVTeXN0ZW0pIHsKKyAgICB3aW5kb3cuanNUZXN0SXNB
c3luYyA9IHRydWU7CisgICAgcmVxdWVzdEZpbGVTeXN0ZW0od2luZG93LlRFTVBPUkFSWSwgMTAw
LCBmaWxlU3lzdGVtQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spOworfSBlbHNlCisgICAgZGVidWco
IlRoaXMgdGVzdCByZXF1aXJlcyBGaWxlU3lzdGVtIEFQSSBzdXBwb3J0LiIpOworCit3aW5kb3cu
c3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKSW5kZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMv
ZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvcmVzb2x2ZS11cmkuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9yZXNvbHZlLXVyaS5q
cwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9zY3Jp
cHQtdGVzdHMvcmVzb2x2ZS11cmkuanMJKHdvcmtpbmcgY29weSkKQEAgLTUyLDcgKzUyLDcgQEAg
ZnVuY3Rpb24gcnVuQmFzaWNUZXN0KCkgewogZnVuY3Rpb24gcnVuSGFuZG1hZGVVUkkoKSB7CiAg
ICAgZGVidWcoIiogUmVzb2x2aW5nIHRlc3QgZmlsZSBieSBoYW5kIik7CiAgICAgY3JlYXRlVGVz
dEZpbGUoZnVuY3Rpb24oZW50cnkpIHsKLSAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVS
SSgiZmlsZXN5c3RlbTpmaWxlOi8vL3RlbXBvcmFyeS90ZXN0RmlsZSIsIGZ1bmN0aW9uKGUpIHsK
KyAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiZmlsZXN5c3RlbTpodHRwOi8vMTI3
LjAuMC4xOjgwMDAvdGVtcG9yYXJ5L3Rlc3RGaWxlIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAg
ICAgYXNzZXJ0UGF0aHNNYXRjaCh0ZXN0RmlsZU5hbWUsIGUuZnVsbFBhdGgpOwogICAgICAgICAg
ICAgYXNzZXJ0SXNGaWxlKGUpOwogICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKQEAg
LTY3LDIwICs2NywyMCBAQCBmdW5jdGlvbiBydW5Cb2d1c1VSSSgpIHsKIAogZnVuY3Rpb24gcnVu
V3JvbmdQcm90b2NvbCgpIHsKICAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgYSBVUkkgd2l0aCB0aGUg
d3JvbmcgcHJvdG9jb2wiKTsKLSAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlOi8v
L2Zvby9iYXIvYmF6IiwgZXJyb3JDYWxsYmFjaywgZXhwZWN0ZWRBbmRSdW5OZXh0KTsKKyAgICBy
ZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJodHRwOi8vL2Zvby9iYXIvYmF6IiwgZXJyb3JDYWxs
YmFjaywgZXhwZWN0ZWRBbmRSdW5OZXh0KTsKIH0KIAogZnVuY3Rpb24gcnVuTm90RW5vdWdoU2xh
c2hlcygpIHsKICAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgYSBVUkkgd2l0aCBubyBzbGFzaCBiZXR3
ZWVuIHR5cGUgYW5kIGZpbGUiKTsKICAgICBjcmVhdGVUZXN0RmlsZShmdW5jdGlvbihlbnRyeSkg
ewotICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8v
dGVtcG9yYXJ5dGVzdEZpbGUiLCBlcnJvckNhbGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOwor
ICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmh0dHA6Ly8xMjcu
MC4wLjE6ODAwMC90ZW1wb3Jhcnl0ZXN0RmlsZSIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVkQW5k
UnVuTmV4dCk7CiAgICAgfSk7CiB9CiAKIGZ1bmN0aW9uIHJ1bk5vdEVub3VnaFNsYXNoZXMyKCkg
ewogICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIFVSSSB3aXRoIG5vIHNsYXNoIGJldHdlZW4gcHJv
dG9jb2wgYW5kIHR5cGUiKTsKICAgICBjcmVhdGVUZXN0RmlsZShmdW5jdGlvbihlbnRyeSkgewot
ICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly90ZW1w
b3JhcnkvdGVzdEZpbGUiLCBlcnJvckNhbGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOworICAg
ICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmh0dHA6Ly8xMjcuMC4w
LjE6ODAwMHRlbXBvcmFyeS90ZXN0RmlsZSIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVkQW5kUnVu
TmV4dCk7CiAgICAgfSk7CiB9CiAKQEAgLTg4LDcgKzg4LDcgQEAgZnVuY3Rpb24gcnVuVXNlQmFj
a1NsYXNoZXMoKSB7CiAgICAgZGVidWcoIiogUmVzb2x2ZSBhIHBhdGggdXNpbmcgYmFja3NsYXNo
ZXMiKTsKICAgICBmaWxlU3lzdGVtLnJvb3QuZ2V0RGlyZWN0b3J5KCJmb28iLCB7Y3JlYXRlOnRy
dWV9LCBmdW5jdGlvbihlbnRyeSkgewogICAgICAgICBlbnRyeS5nZXRGaWxlKCJ0ZXN0RmlsZSIs
IHtjcmVhdGU6dHJ1ZX0sIGZ1bmN0aW9uKGYpIHsKLSAgICAgICAgICAgIHJlc29sdmVMb2NhbEZp
bGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovLy90ZW1wb3JhcnkvZm9vXFx0ZXN0RmlsZSIs
IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZp
bGVzeXN0ZW06aHR0cDovLzEyNy4wLjAuMTo4MDAwL3RlbXBvcmFyeS9mb29cXHRlc3RGaWxlIiwg
ZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgIGFzc2VydFBhdGhzTWF0Y2goIi9mb28vdGVz
dEZpbGUiLCBlLmZ1bGxQYXRoKTsKICAgICAgICAgICAgICAgICBhc3NlcnRJc0ZpbGUoZSk7CiAg
ICAgICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKQEAgLTEwMCw3ICsxMDAsNyBAQCBm
dW5jdGlvbiBydW5Vc2VCYWNrU2xhc2hlcygpIHsKIGZ1bmN0aW9uIHJ1bkRpcmVjdG9yeSgpIHsK
ICAgICBkZWJ1ZygiKiBSZXNvbHZlIGEgZGlyZWN0b3J5Iik7CiAgICAgZmlsZVN5c3RlbS5yb290
LmdldERpcmVjdG9yeSgiZm9vIiwge2NyZWF0ZTp0cnVlfSwgZnVuY3Rpb24oZW50cnkpIHsKLSAg
ICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiZmlsZXN5c3RlbTpmaWxlOi8vL3RlbXBv
cmFyeS9mb28iLCBmdW5jdGlvbihlKSB7CisgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1V
UkkoImZpbGVzeXN0ZW06aHR0cDovLzEyNy4wLjAuMTo4MDAwL3RlbXBvcmFyeS9mb28iLCBmdW5j
dGlvbihlKSB7CiAgICAgICAgICAgICBhc3NlcnRQYXRoc01hdGNoKCIvZm9vIiwgZS5mdWxsUGF0
aCk7CiAgICAgICAgICAgICBhc3NlcnRJc0RpcmVjdG9yeShlKTsKICAgICAgICAgICAgIGNsZWFu
dXBBbmRSdW5OZXh0KCk7CkBAIC0xMTEsNyArMTExLDcgQEAgZnVuY3Rpb24gcnVuRGlyZWN0b3J5
KCkgewogZnVuY3Rpb24gcnVuV2l0aFRyYWlsaW5nU2xhc2goKSB7CiAgICAgZGVidWcoIiogUmVz
b2x2ZSBhIHBhdGggdXNpbmcgYSB0cmFpbGluZyBzbGFzaCIpOwogICAgIGZpbGVTeXN0ZW0ucm9v
dC5nZXREaXJlY3RvcnkoImZvbyIsIHtjcmVhdGU6dHJ1ZX0sIGZ1bmN0aW9uKGVudHJ5KSB7Ci0g
ICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovLy90ZW1w
b3JhcnkvZm9vLyIsIGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3Rl
bVVSSSgiZmlsZXN5c3RlbTpodHRwOi8vMTI3LjAuMC4xOjgwMDAvdGVtcG9yYXJ5L2Zvby8iLCBm
dW5jdGlvbihlKSB7CiAgICAgICAgICAgICBhc3NlcnRQYXRoc01hdGNoKCIvZm9vIiwgZS5mdWxs
UGF0aCk7CiAgICAgICAgICAgICBhc3NlcnRJc0RpcmVjdG9yeShlKTsKICAgICAgICAgICAgIGNs
ZWFudXBBbmRSdW5OZXh0KCk7CkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBl
ZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZAkocmV2aXNp
b24gODEwODgpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9ndGsvU2tpcHBlZAkod29ya2luZyBj
b3B5KQpAQCAtMjg0LDYgKzI4NCw3IEBAIGh0dHAvdGVzdHMvbWlzYy93ZWJ0aW1pbmctdHdvLXJl
ZGlyZWN0cy4KIAogIyBGaWxlU3lzdGVtIEFQSSBpcyBub3Qgc3VwcG9ydGVkLgogZmFzdC9maWxl
c3lzdGVtCitodHRwL3Rlc3RzL2ZpbGVzeXN0ZW0KIGh0dHAvdGVzdHMvbG9jYWwvZmlsZWFwaQog
aHR0cC90ZXN0cy9zZWN1cml0eS9maWxlc3lzdGVtLWlmcmFtZS1mcm9tLXJlbW90ZS5odG1sCiAK
SW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVkCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVkCShyZXZpc2lvbiA4MTA4OCkKKysrIExheW91
dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVkCSh3b3JraW5nIGNvcHkpCkBAIC0yNjIsNiArMjYy
LDcgQEAgaHR0cC90ZXN0cy9tZWRpYS92aWRlby1idWZmZXJlZC5odG1sCiAKICMgRmlsZVN5c3Rl
bSBBUEkgaXMgbm90IHN1cHBvcnRlZC4KIGZhc3QvZmlsZXN5c3RlbQoraHR0cC90ZXN0cy9maWxl
c3lzdGVtCiBodHRwL3Rlc3RzL3NlY3VyaXR5L2ZpbGVzeXN0ZW0taWZyYW1lLWZyb20tcmVtb3Rl
Lmh0bWwKIAogIyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDYyMjMK
SW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL3F0L1NraXBwZWQKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvcGxhdGZvcm0vcXQvU2tpcHBlZAkocmV2aXNpb24gODEwODgpCisrKyBMYXlvdXRU
ZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVkCSh3b3JraW5nIGNvcHkpCkBAIC0zMDQ4LDYgKzMwNDgs
NyBAQCBmYXN0L3BhcnNlci9wcmUtaHRtbDUtcGFyc2VyLXF1aXJrcy5odG1sCiAKICMgRmlsZVN5
c3RlbSBBUEkgaXMgbm90IHN1cHBvcnRlZC4KIGZhc3QvZmlsZXN5c3RlbQoraHR0cC90ZXN0cy9m
aWxlc3lzdGVtCiBodHRwL3Rlc3RzL3NlY3VyaXR5L2ZpbGVzeXN0ZW0taWZyYW1lLWZyb20tcmVt
b3RlLmh0bWwKIAogIyBJdCBmYWlscywgYmVjYXVzZSAzRCBjYW52YXMgaXMgZGlzYWJsZWQgYnkg
ZGVmYXVsdC4KSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9Ta2lwcGVkCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9Ta2lwcGVkCShyZXZpc2lvbiA4MTA4OCkK
KysrIExheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9Ta2lwcGVkCSh3b3JraW5nIGNvcHkpCkBAIC0x
MTE3LDYgKzExMTcsNyBAQCBmYXN0L3BhcnNlci9wcmUtaHRtbDUtcGFyc2VyLXF1aXJrcy5odG1s
CiAKICMgRmlsZVN5c3RlbSBBUEkgaXMgbm90IHN1cHBvcnRlZC4KIGZhc3QvZmlsZXN5c3RlbQor
aHR0cC90ZXN0cy9maWxlc3lzdGVtCiBodHRwL3Rlc3RzL3NlY3VyaXR5L2ZpbGVzeXN0ZW0taWZy
YW1lLWZyb20tcmVtb3RlLmh0bWwKIAogIyBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bm9kZXNGcm9t
UmVjdCBpcyBub3Qgc3VwcG9ydGVkLgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>85956</attachid>
            <date>2011-03-16 12:43:04 -0700</date>
            <delta_ts>2011-03-16 16:10:09 -0700</delta_ts>
            <desc>Includes DEPs roll</desc>
            <filename>bug-56328-20110316124303.patch</filename>
            <type>text/plain</type>
            <size>29342</size>
            <attacher name="Adam Klein">adamk</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiA4MTI2NykKKysrIFNvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQg
QEAKKzIwMTEtMDMtMTYgIEFkYW0gS2xlaW4gIDxhZGFta0BjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkKKworICAgICAgICBMYXlvdXRUZXN0cyBleGVy
Y2lzaW5nIGZpbGVzeXN0ZW06IFVSSXMgc2hvdWxkIHJ1biBvdmVyIEhUVFAgdG8gYXZvaWQgd2Vp
cmRuZXNzIHJlbGF0ZWQgdG8gZmlsZTogVVJMcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTYzMjgKKworICAgICAgICBSb2xsIGNocm9taXVtX3JldiB0
byBwaWNrIHVwIHVubGltaXRlZCBxdW90YSBpbiBTaW1wbGVGaWxlU3lzdGVtLgorCisgICAgICAg
ICogREVQUzoKKwogMjAxMS0wMy0xNSAgSWx5YSBTaGVybWFuICA8aXNoZXJtYW5AY2hyb21pdW0u
b3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEZpc2hlci4KSW5kZXg6IFNvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vREVQUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVt
L0RFUFMJKHJldmlzaW9uIDgxMjY1KQorKysgU291cmNlL1dlYktpdC9jaHJvbWl1bS9ERVBTCSh3
b3JraW5nIGNvcHkpCkBAIC0zMiw3ICszMiw3IEBACiAKIHZhcnMgPSB7CiAgICdjaHJvbWl1bV9z
dm4nOiAnaHR0cDovL3NyYy5jaHJvbWl1bS5vcmcvc3ZuL3RydW5rL3NyYycsCi0gICdjaHJvbWl1
bV9yZXYnOiAnNzgxOTQnCisgICdjaHJvbWl1bV9yZXYnOiAnNzgyNzYnCiB9CiAKIGRlcHMgPSB7
CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCShyZXZpc2lvbiA4MTI2NSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29y
a2luZyBjb3B5KQpAQCAtMSwzICsxLDMxIEBACisyMDExLTAzLTE2ICBBZGFtIEtsZWluICA8YWRh
bWtAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCisKKyAg
ICAgICAgTGF5b3V0VGVzdHMgZXhlcmNpc2luZyBmaWxlc3lzdGVtOiBVUklzIHNob3VsZCBydW4g
b3ZlciBIVFRQIHRvIGF2b2lkIHdlaXJkbmVzcyByZWxhdGVkIHRvIGZpbGU6IFVSTHMKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU2MzI4CisKKyAgICAg
ICAgTW92ZXMgdGhlIHRlc3QgZm9yIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkgaW50byBuZXcg
ImZpbGVzeXN0ZW0iCisgICAgICAgIGRpcmVjdG9yeSB1bmRlciBodHRwL3Rlc3RzLywgYW5kIGFk
anVzdHMgZmlsZSBwYXRocyBhcHByb3ByaWF0ZWx5LgorCisgICAgICAgICogZmFzdC9maWxlc3lz
dGVtL3Jlc29sdmUtdXJpLWV4cGVjdGVkLnR4dDogUmVtb3ZlZC4KKyAgICAgICAgKiBmYXN0L2Zp
bGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbDogUmVtb3ZlZC4KKyAgICAgICAgKiBmYXN0L2ZpbGVz
eXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzOiBSZW1vdmVkLgorICAgICAgICAqIGh0
dHAvdGVzdHMvZmlsZXN5c3RlbTogQWRkZWQuCisgICAgICAgICogaHR0cC90ZXN0cy9maWxlc3lz
dGVtL3Jlc29sdmUtdXJpLWV4cGVjdGVkLnR4dDogQ29waWVkIGZyb20gTGF5b3V0VGVzdHMvZmFz
dC9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLWV4cGVjdGVkLnR4dC4KKyAgICAgICAgKiBodHRwL3Rl
c3RzL2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbDogQ29waWVkIGZyb20gTGF5b3V0VGVzdHMv
ZmFzdC9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWwuCisgICAgICAgICogaHR0cC90ZXN0cy9m
aWxlc3lzdGVtL3Jlc291cmNlczogQWRkZWQuCisgICAgICAgICogaHR0cC90ZXN0cy9maWxlc3lz
dGVtL3Jlc291cmNlcy9mcy10ZXN0LXV0aWwuanM6IENvcGllZCBmcm9tIExheW91dFRlc3RzL2Zh
c3QvZmlsZXN5c3RlbS9yZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzLgorICAgICAgICAqIGh0dHAv
dGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHM6IEFkZGVkLgorICAgICAgICAqIGh0dHAvdGVz
dHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvVEVNUExBVEUuaHRtbDogQ29waWVkIGZyb20gTGF5
b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9URU1QTEFURS5odG1sLgorICAg
ICAgICAqIGh0dHAvdGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvcmVzb2x2ZS11cmkuanM6
IENvcGllZCBmcm9tIExheW91dFRlc3RzL2Zhc3QvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvcmVz
b2x2ZS11cmkuanMuCisgICAgICAgICogcGxhdGZvcm0vZ3RrL1NraXBwZWQ6CisgICAgICAgICog
cGxhdGZvcm0vbWFjL1NraXBwZWQ6CisgICAgICAgICogcGxhdGZvcm0vcXQvU2tpcHBlZDoKKyAg
ICAgICAgKiBwbGF0Zm9ybS93aW4vU2tpcHBlZDoKKyAgICAgICAgQWRkZWQgbmV3IGh0dHAvdGVz
dHMvZmlsZXN5c3RlbSBkaXJlY3RvcnkgdG8gc2tpcCBsaXN0cyBzaW5jZQorICAgICAgICB0aGV5
IGRvbid0IHN1cHBvciB0aGUgZmlsZXN5c3RlbSBBUEkuCisKIDIwMTEtMDMtMTYgIFNhbSBXZWlu
aWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBTa2lwIHRlc3QgZmFzdC9mb3Jtcy9pbnB1
dC1hdXRvZmlsbGVkLmh0bWwgaW4gbWFjLXdrMiBzaW5jZSAKSW5kZXg6IExheW91dFRlc3RzL2Zh
c3QvZmlsZXN5c3RlbS9yZXNvbHZlLXVyaS1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gODEyNjUpCisrKyBMYXlvdXRUZXN0cy9mYXN0L2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmktZXhw
ZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xLDM2ICswLDAgQEAKLVRlc3RzIHVzaW5nIHJl
c29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkgdG8gb2J0YWluIGFuIEVudHJ5IGZyb20gYSBVUkkKLQot
T24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9s
bG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgotCi0KLSogUmVzb2x2aW5nIGEgZ2VuZXJhdGVkIFVS
SS4KLVBBU1MgZXhwZWN0ZWRQYXRoIGlzIGFjdHVhbFBhdGgKLVBBU1MgaXNGaWxlIGlzIHRydWUK
LSogUmVzb2x2aW5nIHRlc3QgZmlsZSBieSBoYW5kCi1QQVNTIGV4cGVjdGVkUGF0aCBpcyBhY3R1
YWxQYXRoCi1QQVNTIGlzRmlsZSBpcyB0cnVlCi0qIFJlc29sdmluZyBhIGNvbXBsZXRlbHkgYm9n
dXMgVVJJLgotUEFTUyAKLSogUmVzb2x2aW5nIGEgVVJJIHdpdGggdGhlIHdyb25nIHByb3RvY29s
Ci1QQVNTIAotKiBSZXNvbHZpbmcgYSBVUkkgd2l0aCBubyBzbGFzaCBiZXR3ZWVuIHR5cGUgYW5k
IGZpbGUKLVBBU1MgCi0qIFJlc29sdmluZyBhIFVSSSB3aXRoIG5vIHNsYXNoIGJldHdlZW4gcHJv
dG9jb2wgYW5kIHR5cGUKLVBBU1MgCi0qIFJlc29sdmUgYSBwYXRoIHVzaW5nIGJhY2tzbGFzaGVz
Ci1QQVNTIGV4cGVjdGVkUGF0aCBpcyBhY3R1YWxQYXRoCi1QQVNTIGlzRmlsZSBpcyB0cnVlCi0q
IFJlc29sdmUgYSBkaXJlY3RvcnkKLVBBU1MgZXhwZWN0ZWRQYXRoIGlzIGFjdHVhbFBhdGgKLVBB
U1MgaXNEaXJlY3RvcnkgaXMgdHJ1ZQotKiBSZXNvbHZlIGEgcGF0aCB1c2luZyBhIHRyYWlsaW5n
IHNsYXNoCi1QQVNTIGV4cGVjdGVkUGF0aCBpcyBhY3R1YWxQYXRoCi1QQVNTIGlzRGlyZWN0b3J5
IGlzIHRydWUKLSogUmVzb2x2aW5nIGEgcGVyc2lzdGVudCBVUkkuCi1QQVNTIGV4cGVjdGVkUGF0
aCBpcyBhY3R1YWxQYXRoCi1QQVNTIGlzRGlyZWN0b3J5IGlzIHRydWUKLUZpbmlzaGVkIHJ1bm5p
bmcgdGVzdHMuCi1QQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCi0KLVRFU1QgQ09NUExF
VEUKLQpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0
bWwJKHJldmlzaW9uIDgxMjY1KQorKysgTGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3Jlc29s
dmUtdXJpLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTEsMTMgKzAsMCBAQAotPGh0bWw+Ci08aGVh
ZD4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qt
c3R5bGUuY3NzIj4KLTxzY3JpcHQgc3JjPSIuLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMi
Pjwvc2NyaXB0PgotPHNjcmlwdCBzcmM9InJlc291cmNlcy9mcy10ZXN0LXV0aWwuanMiPjwvc2Ny
aXB0PgotPC9oZWFkPgotPGJvZHk+Ci08cCBpZD0iZGVzY3JpcHRpb24iPjwvcD4KLTxkaXYgaWQ9
ImNvbnNvbGUiPjwvZGl2PgotPHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0cy9yZXNvbHZlLXVyaS5q
cyI+PC9zY3JpcHQ+Ci08c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5q
cyI+PC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2Zp
bGVzeXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2Zhc3QvZmlsZXN5c3RlbS9zY3JpcHQtdGVzdHMvcmVzb2x2ZS11cmkuanMJKHJldmlz
aW9uIDgxMjY1KQorKysgTGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9y
ZXNvbHZlLXVyaS5qcwkod29ya2luZyBjb3B5KQpAQCAtMSwxNzIgKzAsMCBAQAotZGVzY3JpcHRp
b24oIlRlc3RzIHVzaW5nIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkgdG8gb2J0YWluIGFuIEVu
dHJ5IGZyb20gYSBVUkkiKTsKLQotdmFyIHRlc3RGaWxlTmFtZSA9ICcvdGVzdEZpbGUnOwotdmFy
IGZpbGVTeXN0ZW0gPSBudWxsOwotdmFyIGV4cGVjdGVkQW5kUnVuTmV4dCA9IGZ1bmN0aW9uKCkg
eyB0ZXN0UGFzc2VkKCIiKTsgY2xlYW51cEFuZFJ1bk5leHQoKTsgfTsKLQotdmFyIGV4cGVjdGVk
UGF0aCA9IG51bGw7Ci12YXIgYWN0dWFsUGF0aCA9IG51bGw7Ci0KLWZ1bmN0aW9uIGVycm9yQ2Fs
bGJhY2soZXJyb3IpIHsKLSAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSkKLSAgICAgICAgZGVi
dWcoIkVycm9yIG9jY3VycmVkOiAiICsgZXJyb3IuY29kZSk7Ci0gICAgdGVzdEZhaWxlZCgiQmFp
bGluZyBvdXQgZWFybHkiKTsKLSAgICBmaW5pc2hKU1Rlc3QoKTsKLX0KLQotZnVuY3Rpb24gY3Jl
YXRlVGVzdEZpbGUoY2FsbGJhY2spIHsKLSAgICBmaWxlU3lzdGVtLnJvb3QuZ2V0RmlsZSh0ZXN0
RmlsZU5hbWUsIHtjcmVhdGU6dHJ1ZX0sIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKLX0KLQot
ZnVuY3Rpb24gYXNzZXJ0UGF0aHNNYXRjaChleHBlY3RlZCwgYWN0dWFsKSB7Ci0gICAgZXhwZWN0
ZWRQYXRoID0gZXhwZWN0ZWQ7Ci0gICAgYWN0dWFsUGF0aCA9IGFjdHVhbDsKLSAgICBzaG91bGRC
ZSgiZXhwZWN0ZWRQYXRoIiwgImFjdHVhbFBhdGgiKTsKLX0KLQotdmFyIGlzRGlyZWN0b3J5ID0g
ZmFsc2U7Ci1mdW5jdGlvbiBhc3NlcnRJc0RpcmVjdG9yeShlbnRyeSkgewotICAgIGlzRGlyZWN0
b3J5ID0gZW50cnkuaXNEaXJlY3Rvcnk7Ci0gICAgc2hvdWxkQmVUcnVlKCJpc0RpcmVjdG9yeSIp
OwotfQotCi12YXIgaXNGaWxlID0gZmFsc2U7Ci1mdW5jdGlvbiBhc3NlcnRJc0ZpbGUoZW50cnkp
IHsKLSAgICBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGU7Ci0gICAgc2hvdWxkQmVUcnVlKCJpc0ZpbGUi
KTsKLX0KLQotLy8gVGVzdCBib2R5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWZ1bmN0aW9uIHJ1bkJhc2ljVGVzdCgpIHsK
LSAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgYSBnZW5lcmF0ZWQgVVJJLiIpOwotICAgIGNyZWF0ZVRl
c3RGaWxlKGZ1bmN0aW9uKGVudHJ5KSB7Ci0gICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1V
UkkoZW50cnkudG9VUkkoKSwgZnVuY3Rpb24oZSkgewotICAgICAgICAgICAgYXNzZXJ0UGF0aHNN
YXRjaChlbnRyeS5mdWxsUGF0aCwgZS5mdWxsUGF0aCk7Ci0gICAgICAgICAgICBhc3NlcnRJc0Zp
bGUoZSk7Ci0gICAgICAgICAgICBjbGVhbnVwQW5kUnVuTmV4dCgpOwotICAgICAgICB9LCBlcnJv
ckNhbGxiYWNrKTsKLSAgICB9KTsKLX0KLQotZnVuY3Rpb24gcnVuSGFuZG1hZGVVUkkoKSB7Ci0g
ICAgZGVidWcoIiogUmVzb2x2aW5nIHRlc3QgZmlsZSBieSBoYW5kIik7Ci0gICAgY3JlYXRlVGVz
dEZpbGUoZnVuY3Rpb24oZW50cnkpIHsKLSAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVS
SSgiZmlsZXN5c3RlbTpmaWxlOi8vL3RlbXBvcmFyeS90ZXN0RmlsZSIsIGZ1bmN0aW9uKGUpIHsK
LSAgICAgICAgICAgIGFzc2VydFBhdGhzTWF0Y2godGVzdEZpbGVOYW1lLCBlLmZ1bGxQYXRoKTsK
LSAgICAgICAgICAgIGFzc2VydElzRmlsZShlKTsKLSAgICAgICAgICAgIGNsZWFudXBBbmRSdW5O
ZXh0KCk7Ci0gICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwotICAgIH0pOwotfQotCi1mdW5jdGlv
biBydW5Cb2d1c1VSSSgpIHsKLSAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgYSBjb21wbGV0ZWx5IGJv
Z3VzIFVSSS4iKTsKLSAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmb28iLCBlcnJvckNh
bGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOwotfQotCi1mdW5jdGlvbiBydW5Xcm9uZ1Byb3Rv
Y29sKCkgewotICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIFVSSSB3aXRoIHRoZSB3cm9uZyBwcm90
b2NvbCIpOwotICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGU6Ly8vZm9vL2Jhci9i
YXoiLCBlcnJvckNhbGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOwotfQotCi1mdW5jdGlvbiBy
dW5Ob3RFbm91Z2hTbGFzaGVzKCkgewotICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIFVSSSB3aXRo
IG5vIHNsYXNoIGJldHdlZW4gdHlwZSBhbmQgZmlsZSIpOwotICAgIGNyZWF0ZVRlc3RGaWxlKGZ1
bmN0aW9uKGVudHJ5KSB7Ci0gICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVz
eXN0ZW06ZmlsZTovLy90ZW1wb3Jhcnl0ZXN0RmlsZSIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVk
QW5kUnVuTmV4dCk7Ci0gICAgfSk7Ci19Ci0KLWZ1bmN0aW9uIHJ1bk5vdEVub3VnaFNsYXNoZXMy
KCkgewotICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIFVSSSB3aXRoIG5vIHNsYXNoIGJldHdlZW4g
cHJvdG9jb2wgYW5kIHR5cGUiKTsKLSAgICBjcmVhdGVUZXN0RmlsZShmdW5jdGlvbihlbnRyeSkg
ewotICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly90
ZW1wb3JhcnkvdGVzdEZpbGUiLCBlcnJvckNhbGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOwot
ICAgIH0pOwotfQotCi1mdW5jdGlvbiBydW5Vc2VCYWNrU2xhc2hlcygpIHsKLSAgICBkZWJ1Zygi
KiBSZXNvbHZlIGEgcGF0aCB1c2luZyBiYWNrc2xhc2hlcyIpOwotICAgIGZpbGVTeXN0ZW0ucm9v
dC5nZXREaXJlY3RvcnkoImZvbyIsIHtjcmVhdGU6dHJ1ZX0sIGZ1bmN0aW9uKGVudHJ5KSB7Ci0g
ICAgICAgIGVudHJ5LmdldEZpbGUoInRlc3RGaWxlIiwge2NyZWF0ZTp0cnVlfSwgZnVuY3Rpb24o
ZikgewotICAgICAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiZmlsZXN5c3RlbTpm
aWxlOi8vL3RlbXBvcmFyeS9mb29cXHRlc3RGaWxlIiwgZnVuY3Rpb24oZSkgewotICAgICAgICAg
ICAgICAgIGFzc2VydFBhdGhzTWF0Y2goIi9mb28vdGVzdEZpbGUiLCBlLmZ1bGxQYXRoKTsKLSAg
ICAgICAgICAgICAgICBhc3NlcnRJc0ZpbGUoZSk7Ci0gICAgICAgICAgICAgICAgY2xlYW51cEFu
ZFJ1bk5leHQoKTsKLSAgICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwotICAgICAgICB9LCBl
cnJvckNhbGxiYWNrKTsKLSAgICB9LCBlcnJvckNhbGxiYWNrKTsKLX0KLQotZnVuY3Rpb24gcnVu
RGlyZWN0b3J5KCkgewotICAgIGRlYnVnKCIqIFJlc29sdmUgYSBkaXJlY3RvcnkiKTsKLSAgICBm
aWxlU3lzdGVtLnJvb3QuZ2V0RGlyZWN0b3J5KCJmb28iLCB7Y3JlYXRlOnRydWV9LCBmdW5jdGlv
bihlbnRyeSkgewotICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVt
OmZpbGU6Ly8vdGVtcG9yYXJ5L2ZvbyIsIGZ1bmN0aW9uKGUpIHsKLSAgICAgICAgICAgIGFzc2Vy
dFBhdGhzTWF0Y2goIi9mb28iLCBlLmZ1bGxQYXRoKTsKLSAgICAgICAgICAgIGFzc2VydElzRGly
ZWN0b3J5KGUpOwotICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKLSAgICAgICAgfSwg
ZXJyb3JDYWxsYmFjayk7Ci0gICAgfSwgZXJyb3JDYWxsYmFjayk7Ci19Ci0KLWZ1bmN0aW9uIHJ1
bldpdGhUcmFpbGluZ1NsYXNoKCkgewotICAgIGRlYnVnKCIqIFJlc29sdmUgYSBwYXRoIHVzaW5n
IGEgdHJhaWxpbmcgc2xhc2giKTsKLSAgICBmaWxlU3lzdGVtLnJvb3QuZ2V0RGlyZWN0b3J5KCJm
b28iLCB7Y3JlYXRlOnRydWV9LCBmdW5jdGlvbihlbnRyeSkgewotICAgICAgICByZXNvbHZlTG9j
YWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9yYXJ5L2Zvby8iLCBmdW5j
dGlvbihlKSB7Ci0gICAgICAgICAgICBhc3NlcnRQYXRoc01hdGNoKCIvZm9vIiwgZS5mdWxsUGF0
aCk7Ci0gICAgICAgICAgICBhc3NlcnRJc0RpcmVjdG9yeShlKTsKLSAgICAgICAgICAgIGNsZWFu
dXBBbmRSdW5OZXh0KCk7Ci0gICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwotICAgIH0sIGVycm9y
Q2FsbGJhY2spOwotfQotCi1mdW5jdGlvbiBydW5QZXJzaXN0ZW50VGVzdCgpIHsKLSAgICBkZWJ1
ZygiKiBSZXNvbHZpbmcgYSBwZXJzaXN0ZW50IFVSSS4iKTsKLSAgICByZXF1ZXN0RmlsZVN5c3Rl
bShQRVJTSVNURU5ULCAxMDAsIGZ1bmN0aW9uKGZzKSB7Ci0gICAgICAgIHJlc29sdmVMb2NhbEZp
bGVTeXN0ZW1VUkkoZnMucm9vdC50b1VSSSgpLCBmdW5jdGlvbihlbnRyeSkgewotICAgICAgICAg
ICAgYXNzZXJ0UGF0aHNNYXRjaCgiLyIsIGVudHJ5LmZ1bGxQYXRoKTsKLSAgICAgICAgICAgIGFz
c2VydElzRGlyZWN0b3J5KGVudHJ5KTsKLSAgICAgICAgICAgIGNsZWFudXBBbmRSdW5OZXh0KCk7
Ci0gICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOwotICAgIH0pOwotfQotCi0vLyBFbmQgb2YgdGVz
dCBib2R5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotdmFyIHRlc3RzTGlzdCA9IFsKLSAgICBydW5CYXNpY1Rlc3QsCi0gICAgcnVuSGFu
ZG1hZGVVUkksCi0gICAgcnVuQm9ndXNVUkksCi0gICAgcnVuV3JvbmdQcm90b2NvbCwKLSAgICBy
dW5Ob3RFbm91Z2hTbGFzaGVzLAotICAgIHJ1bk5vdEVub3VnaFNsYXNoZXMyLAotICAgIHJ1blVz
ZUJhY2tTbGFzaGVzLAotICAgIHJ1bkRpcmVjdG9yeSwKLSAgICBydW5XaXRoVHJhaWxpbmdTbGFz
aCwKLSAgICBydW5QZXJzaXN0ZW50VGVzdCwKLV07Ci12YXIgdGVzdENvdW50ZXIgPSAwOwotCi1m
dW5jdGlvbiBydW5OZXh0VGVzdCgpIHsKLSAgICBpZiAodGVzdENvdW50ZXIgPT0gdGVzdHNMaXN0
Lmxlbmd0aCkgewotICAgICAgICBkZWJ1ZygiRmluaXNoZWQgcnVubmluZyB0ZXN0cy4iKTsKLSAg
ICAgICAgZmluaXNoSlNUZXN0KCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHRlc3RzTGlzdFt0ZXN0
Q291bnRlcisrXSgpOwotfQotCi1mdW5jdGlvbiBjbGVhbnVwQW5kUnVuTmV4dCgpIHsKLSAgICBy
ZW1vdmVBbGxJbkRpcmVjdG9yeShmaWxlU3lzdGVtLnJvb3QsIHJ1bk5leHRUZXN0LCBydW5OZXh0
VGVzdCk7Ci19Ci0KLWZ1bmN0aW9uIGZpbGVTeXN0ZW1DYWxsYmFjayhmcykgewotICAgIGZpbGVT
eXN0ZW0gPSBmczsKLSAgICBjbGVhbnVwQW5kUnVuTmV4dCgpOwotfQotCi1pZiAod2luZG93LnJl
cXVlc3RGaWxlU3lzdGVtKSB7Ci0gICAgd2luZG93LmpzVGVzdElzQXN5bmMgPSB0cnVlOwotICAg
IHJlcXVlc3RGaWxlU3lzdGVtKHdpbmRvdy5URU1QT1JBUlksIDEwMCwgZmlsZVN5c3RlbUNhbGxi
YWNrLCBlcnJvckNhbGxiYWNrKTsKLX0gZWxzZQotICAgIGRlYnVnKCJUaGlzIHRlc3QgcmVxdWly
ZXMgRmlsZVN5c3RlbSBBUEkgc3VwcG9ydC4iKTsKLQotd2luZG93LnN1Y2Nlc3NmdWxseVBhcnNl
ZCA9IHRydWU7CkluZGV4OiBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vcmVzb2x2
ZS11cmktZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMv
ZmlsZXN5c3RlbS9yZXNvbHZlLXVyaS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDgxMjYzKQkoZnJv
bSBMYXlvdXRUZXN0cy9mYXN0L2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmktZXhwZWN0ZWQudHh0Ojgx
MjYzKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jlc29sdmUtdXJpLWV4
cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM2IEBACitUZXN0cyB1c2luZyBy
ZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJIHRvIG9idGFpbiBhbiBFbnRyeSBmcm9tIGEgVVJJCisK
K09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZv
bGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCisqIFJlc29sdmluZyBhIGdlbmVyYXRlZCBV
UkkuCitQQVNTIGV4cGVjdGVkUGF0aCBpcyBhY3R1YWxQYXRoCitQQVNTIGlzRmlsZSBpcyB0cnVl
CisqIFJlc29sdmluZyB0ZXN0IGZpbGUgYnkgaGFuZAorUEFTUyBleHBlY3RlZFBhdGggaXMgYWN0
dWFsUGF0aAorUEFTUyBpc0ZpbGUgaXMgdHJ1ZQorKiBSZXNvbHZpbmcgYSBjb21wbGV0ZWx5IGJv
Z3VzIFVSSS4KK1BBU1MgCisqIFJlc29sdmluZyBhIFVSSSB3aXRoIHRoZSB3cm9uZyBwcm90b2Nv
bAorUEFTUyAKKyogUmVzb2x2aW5nIGEgVVJJIHdpdGggbm8gc2xhc2ggYmV0d2VlbiB0eXBlIGFu
ZCBmaWxlCitQQVNTIAorKiBSZXNvbHZpbmcgYSBVUkkgd2l0aCBubyBzbGFzaCBiZXR3ZWVuIHBy
b3RvY29sIGFuZCB0eXBlCitQQVNTIAorKiBSZXNvbHZlIGEgcGF0aCB1c2luZyBiYWNrc2xhc2hl
cworUEFTUyBleHBlY3RlZFBhdGggaXMgYWN0dWFsUGF0aAorUEFTUyBpc0ZpbGUgaXMgdHJ1ZQor
KiBSZXNvbHZlIGEgZGlyZWN0b3J5CitQQVNTIGV4cGVjdGVkUGF0aCBpcyBhY3R1YWxQYXRoCitQ
QVNTIGlzRGlyZWN0b3J5IGlzIHRydWUKKyogUmVzb2x2ZSBhIHBhdGggdXNpbmcgYSB0cmFpbGlu
ZyBzbGFzaAorUEFTUyBleHBlY3RlZFBhdGggaXMgYWN0dWFsUGF0aAorUEFTUyBpc0RpcmVjdG9y
eSBpcyB0cnVlCisqIFJlc29sdmluZyBhIHBlcnNpc3RlbnQgVVJJLgorUEFTUyBleHBlY3RlZFBh
dGggaXMgYWN0dWFsUGF0aAorUEFTUyBpc0RpcmVjdG9yeSBpcyB0cnVlCitGaW5pc2hlZCBydW5u
aW5nIHRlc3RzLgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBM
RVRFCisKSW5kZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9yZXNvbHZlLXVy
aS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9y
ZXNvbHZlLXVyaS5odG1sCShyZXZpc2lvbiA4MTI2MykJKGZyb20gTGF5b3V0VGVzdHMvZmFzdC9m
aWxlc3lzdGVtL3Jlc29sdmUtdXJpLmh0bWw6ODEyNjMpCisrKyBMYXlvdXRUZXN0cy9odHRwL3Rl
c3RzL2ZpbGVzeXN0ZW0vcmVzb2x2ZS11cmkuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEzIEBACis8aHRtbD4KKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9q
cy9yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5jc3MiPgorPHNjcmlwdCBzcmM9Ii4uL2pzL3Jlc291
cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL2Zz
LXRlc3QtdXRpbC5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwIGlkPSJkZXNjcmlw
dGlvbiI+PC9wPgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+Cis8c2NyaXB0IHNyYz0ic2NyaXB0
LXRlc3RzL3Jlc29sdmUtdXJpLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi9qcy9yZXNv
dXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6
IExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9yZXNvbHZlLXVyaS5odG1sCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9yZXNvbHZlLXVyaS5o
dG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jl
c29sdmUtdXJpLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTEsMTMgKzEsMTMgQEAKIDxodG1sPgog
PGhlYWQ+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2pzL3Jlc291cmNlcy9qcy10
ZXN0LXN0eWxlLmNzcyI+Ci08c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJl
LmpzIj48L3NjcmlwdD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2pzLXRlc3QtcmVz
b3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIj4KKzxzY3JpcHQgc3JjPSIvanMtdGVzdC1yZXNvdXJj
ZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgogPHNjcmlwdCBzcmM9InJlc291cmNlcy9mcy10
ZXN0LXV0aWwuanMiPjwvc2NyaXB0PgogPC9oZWFkPgogPGJvZHk+CiA8cCBpZD0iZGVzY3JpcHRp
b24iPjwvcD4KIDxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgogPHNjcmlwdCBzcmM9InNjcmlwdC10
ZXN0cy9yZXNvbHZlLXVyaS5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IHNyYz0iLi4vanMvcmVzb3Vy
Y2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzLXRlc3QtcmVz
b3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+CiA8L2JvZHk+CiA8L2h0bWw+CkluZGV4
OiBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vcmVzb3VyY2VzL2ZzLXRlc3QtdXRp
bC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vcmVz
b3VyY2VzL2ZzLXRlc3QtdXRpbC5qcwkocmV2aXNpb24gODEyNjMpCShmcm9tIExheW91dFRlc3Rz
L2Zhc3QvZmlsZXN5c3RlbS9yZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzOjgxMjYzKQorKysgTGF5
b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jlc291cmNlcy9mcy10ZXN0LXV0aWwuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4OCBAQAorZnVuY3Rpb24gYmluZENhbGxiYWNrKG9i
aiwgY2FsbGJhY2ssIGFyZzEsIGFyZzIsIGFyZzMpCit7CisgICAgcmV0dXJuIGZ1bmN0aW9uKGFy
ZykgeworICAgICAgICBpZiAoYXJnID09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgIGNhbGxiYWNr
LmFwcGx5KG9iaiwgW2FyZzEsIGFyZzIsIGFyZzNdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgY2FsbGJhY2suYXBwbHkob2JqLCBbYXJnLCBhcmcxLCBhcmcyLCBhcmczXSk7CisgICAgfTsK
K30KKworLy8gVXNhZ2U6CisvLyAgIHZhciBoZWxwZXIgPSBuZXcgSm9pbkhlbHBlcjsKKy8vCisv
LyAgIGhlbHBlci5ydW4oZnVuY3Rpb24oKSB7IC8qIGRvIHNvbWV0aGluZyB0aGF0IGV2ZW50dWFs
bHkgY2FsbHMgaGVscGVyLmRvbmUoKTsgKi8gfSk7CisvLyAgIGhlbHBlci5ydW4oZnVuY3Rpb24o
KSB7IC8qIGRvIHNvbWV0aGluZyB0aGF0IGV2ZW50dWFsbHkgY2FsbHMgaGVscGVyLmRvbmUoKTsg
Ki8gfSk7CisvLyAgIC4uLgorLy8gICBoZWxwZXIuam9pbihqb2luQ2FsbGJhY2spOworLy8KK3Zh
ciBKb2luSGVscGVyID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMucGVuZGluZ09wZXJhdGlvbnMg
PSBbXTsKKyAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25Db3VudCA9IDA7CisgICAgdGhpcy5qb2lu
Q2FsbGJhY2sgPSBudWxsOworCisgICAgdGhpcy5ydW4gPSBmdW5jdGlvbihvcGVyYXRpb24pCisg
ICAgeworICAgICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25Db3VudCsrOworICAgICAgICBvcGVy
YXRpb24oKTsKKyAgICB9OworCisgICAgLy8gQ2FsbCB0aGlzIHdoZW4gYW4gb3BlcmF0aW9uIGlz
IGRvbmUuCisgICAgdGhpcy5kb25lID0gZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5w
ZW5kaW5nT3BlcmF0aW9uQ291bnQtLTsKKyAgICAgICAgaWYgKHRoaXMucGVuZGluZ09wZXJhdGlv
bkNvdW50ID09IDAgJiYgdGhpcy5qb2luQ2FsbGJhY2spCisgICAgICAgICAgICB0aGlzLmpvaW5D
YWxsYmFjaygpOworICAgIH07CisKKyAgICAvLyBUaGlzIGV2ZW50dWFsbHkgY2FsbHMgdGhlIGpv
aW5DYWxsYmFjayB3aGVuIGhlbHBlci5kb25lKCkgaXMgY2FsbGVkIGFzIG1hbnkgdGltZXMgYXMg
aGVscGVyLnJ1bigpIGlzIGNhbGxlZC4KKyAgICB0aGlzLmpvaW4gPSBmdW5jdGlvbihqb2luQ2Fs
bGJhY2spCisgICAgeworICAgICAgICBpZiAodGhpcy5wZW5kaW5nT3BlcmF0aW9uQ291bnQgPT0g
MCkKKyAgICAgICAgICAgIGpvaW5DYWxsYmFjaygpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICB0aGlzLmpvaW5DYWxsYmFjayA9IGpvaW5DYWxsYmFjazsKKyAgICB9OworfTsKKworLy8gUmVt
b3ZlIGV2ZXJ5dGhpbmcgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KK2Z1bmN0aW9uIHJlbW92ZUFs
bEluRGlyZWN0b3J5KGRpcmVjdG9yeSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7
CisgICAgdmFyIFJlbW92ZUFsbEluRGlyZWN0b3J5SGVscGVyID0gZnVuY3Rpb24oc3VjY2Vzc0Nh
bGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7CisgICAgICAgIHRoaXMuZW50cmllc0NvdW50ID0gMDsK
KyAgICAgICAgdGhpcy5yZWFkZXIgPSBudWxsOworICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFj
ayA9IHN1Y2Nlc3NDYWxsYmFjazsKKyAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JD
YWxsYmFjazsKKworICAgICAgICB0aGlzLmVudHJ5UmVtb3ZlZENhbGxiYWNrID0gYmluZENhbGxi
YWNrKHRoaXMsIGZ1bmN0aW9uKGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoLS10
aGlzLmVudHJpZXNDb3VudCA9PSAwICYmIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKQorICAgICAgICAg
ICAgICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKCk7CisgICAgICAgIH0pOworCisgICAgICAgIHRo
aXMuZW50cmllc0NhbGxiYWNrID0gYmluZENhbGxiYWNrKHRoaXMsIGZ1bmN0aW9uKGVudHJpZXMp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5n
dGg7ICsraSkgeworICAgICAgICAgICAgICAgIHRoaXMuZW50cmllc0NvdW50Kys7CisgICAgICAg
ICAgICAgICAgaWYgKGVudHJpZXNbaV0uaXNEaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgICAg
IGVudHJpZXNbaV0ucmVtb3ZlUmVjdXJzaXZlbHkodGhpcy5lbnRyeVJlbW92ZWRDYWxsYmFjaywg
dGhpcy5lcnJvckNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICAgICAgZW50cmllc1tpXS5yZW1vdmUodGhpcy5lbnRyeVJlbW92ZWRDYWxsYmFjaywgdGhp
cy5lcnJvckNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoZW50cmllcy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIu
cmVhZEVudHJpZXModGhpcy5lbnRyaWVzQ2FsbGJhY2ssIHRoaXMuZXJyb3JDYWxsYmFjayk7Cisg
ICAgICAgICAgICBlbHNlIGlmICh0aGlzLmVudHJpZXNDb3VudCA9PSAwICYmIHRoaXMuc3VjY2Vz
c0NhbGxiYWNrKQorICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKCk7CisgICAg
ICAgIH0pOworCisgICAgICAgIHRoaXMucmVtb3ZlQWxsSW5EaXJlY3RvcnkgPSBmdW5jdGlvbihk
aXJlY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucmVhZGVyID0gZGlyZWN0b3J5
LmNyZWF0ZVJlYWRlcigpOworICAgICAgICAgICAgdGhpcy5yZWFkZXIucmVhZEVudHJpZXModGhp
cy5lbnRyaWVzQ2FsbGJhY2ssIHRoaXMuZXJyb3JDYWxsYmFjayk7CisgICAgICAgIH07CisgICAg
fTsKKworICAgIHZhciBoZWxwZXIgPSBuZXcgUmVtb3ZlQWxsSW5EaXJlY3RvcnlIZWxwZXIoc3Vj
Y2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKKyAgICBoZWxwZXIucmVtb3ZlQWxsSW5EaXJl
Y3RvcnkoZGlyZWN0b3J5KTsKK30KSW5kZXg6IExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5
c3RlbS9yZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3Rz
L2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9yZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzCShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3Jlc291cmNlcy9mcy10
ZXN0LXV0aWwuanMJKHdvcmtpbmcgY29weSkKQEAgLTgsNDQgKzgsNiBAQCBmdW5jdGlvbiBiaW5k
Q2FsbGJhY2sob2JqLCBjYWxsYmFjaywgYXJnCiAgICAgfTsKIH0KIAotLy8gVXNhZ2U6Ci0vLyAg
IHZhciBoZWxwZXIgPSBuZXcgSm9pbkhlbHBlcjsKLS8vCi0vLyAgIGhlbHBlci5ydW4oZnVuY3Rp
b24oKSB7IC8qIGRvIHNvbWV0aGluZyB0aGF0IGV2ZW50dWFsbHkgY2FsbHMgaGVscGVyLmRvbmUo
KTsgKi8gfSk7Ci0vLyAgIGhlbHBlci5ydW4oZnVuY3Rpb24oKSB7IC8qIGRvIHNvbWV0aGluZyB0
aGF0IGV2ZW50dWFsbHkgY2FsbHMgaGVscGVyLmRvbmUoKTsgKi8gfSk7Ci0vLyAgIC4uLgotLy8g
ICBoZWxwZXIuam9pbihqb2luQ2FsbGJhY2spOwotLy8KLXZhciBKb2luSGVscGVyID0gZnVuY3Rp
b24oKQotewotICAgIHRoaXMucGVuZGluZ09wZXJhdGlvbnMgPSBbXTsKLSAgICB0aGlzLnBlbmRp
bmdPcGVyYXRpb25Db3VudCA9IDA7Ci0gICAgdGhpcy5qb2luQ2FsbGJhY2sgPSBudWxsOwotCi0g
ICAgdGhpcy5ydW4gPSBmdW5jdGlvbihvcGVyYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLnBl
bmRpbmdPcGVyYXRpb25Db3VudCsrOwotICAgICAgICBvcGVyYXRpb24oKTsKLSAgICB9OwotCi0g
ICAgLy8gQ2FsbCB0aGlzIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGRvbmUuCi0gICAgdGhpcy5kb25l
ID0gZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9uQ291bnQt
LTsKLSAgICAgICAgaWYgKHRoaXMucGVuZGluZ09wZXJhdGlvbkNvdW50ID09IDAgJiYgdGhpcy5q
b2luQ2FsbGJhY2spCi0gICAgICAgICAgICB0aGlzLmpvaW5DYWxsYmFjaygpOwotICAgIH07Ci0K
LSAgICAvLyBUaGlzIGV2ZW50dWFsbHkgY2FsbHMgdGhlIGpvaW5DYWxsYmFjayB3aGVuIGhlbHBl
ci5kb25lKCkgaXMgY2FsbGVkIGFzIG1hbnkgdGltZXMgYXMgaGVscGVyLnJ1bigpIGlzIGNhbGxl
ZC4KLSAgICB0aGlzLmpvaW4gPSBmdW5jdGlvbihqb2luQ2FsbGJhY2spCi0gICAgewotICAgICAg
ICBpZiAodGhpcy5wZW5kaW5nT3BlcmF0aW9uQ291bnQgPT0gMCkKLSAgICAgICAgICAgIGpvaW5D
YWxsYmFjaygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aGlzLmpvaW5DYWxsYmFjayA9
IGpvaW5DYWxsYmFjazsKLSAgICB9OwotfTsKLQogLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgaW4gdGhl
IGdpdmVuIGRpcmVjdG9yeS4KIGZ1bmN0aW9uIHJlbW92ZUFsbEluRGlyZWN0b3J5KGRpcmVjdG9y
eSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7CiAgICAgdmFyIFJlbW92ZUFsbElu
RGlyZWN0b3J5SGVscGVyID0gZnVuY3Rpb24oc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNr
KSB7CkluZGV4OiBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3Rz
L1RFTVBMQVRFLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxl
c3lzdGVtL3NjcmlwdC10ZXN0cy9URU1QTEFURS5odG1sCShyZXZpc2lvbiA4MTI2MykJKGZyb20g
TGF5b3V0VGVzdHMvZmFzdC9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9URU1QTEFURS5odG1sOjgx
MjYzKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9U
RU1QTEFURS5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMgQEAKKzxodG1sPgorPGhl
YWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2pzL3Jlc291cmNlcy9qcy10ZXN0
LXN0eWxlLmNzcyI+Cis8c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpz
Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvZnMtdGVzdC11dGlsLmpzIj48L3Nj
cmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHAgaWQ9ImRlc2NyaXB0aW9uIj48L3A+Cis8ZGl2IGlk
PSJjb25zb2xlIj48L2Rpdj4KKzxzY3JpcHQgc3JjPSJZT1VSX0pTX0ZJTEVfSEVSRSI+PC9zY3Jp
cHQ+Cis8c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3Jp
cHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVz
eXN0ZW0vc2NyaXB0LXRlc3RzL1RFTVBMQVRFLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVz
dHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9URU1QTEFURS5odG1sCShyZXZp
c2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3NjcmlwdC10ZXN0
cy9URU1QTEFURS5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0xLDEzICsxLDEzIEBACiA8aHRtbD4K
IDxoZWFkPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9qcy9yZXNvdXJjZXMvanMt
dGVzdC1zdHlsZS5jc3MiPgotPHNjcmlwdCBzcmM9Ii4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXBy
ZS5qcyI+PC9zY3JpcHQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9qcy10ZXN0LXJl
c291cmNlcy9qcy10ZXN0LXN0eWxlLmNzcyI+Cis8c2NyaXB0IHNyYz0iL2pzLXRlc3QtcmVzb3Vy
Y2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvZnMt
dGVzdC11dGlsLmpzIj48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgogPHAgaWQ9ImRlc2NyaXB0
aW9uIj48L3A+CiA8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KIDxzY3JpcHQgc3JjPSJZT1VSX0pT
X0ZJTEVfSEVSRSI+PC9zY3JpcHQ+Ci08c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRl
c3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzLXRlc3QtcmVzb3VyY2VzL2pz
LXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+CiA8L2JvZHk+CiA8L2h0bWw+CkluZGV4OiBMYXlvdXRU
ZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9zY3JpcHQtdGVz
dHMvcmVzb2x2ZS11cmkuanMJKHJldmlzaW9uIDgxMjYzKQkoZnJvbSBMYXlvdXRUZXN0cy9mYXN0
L2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzOjgxMjYzKQorKysgTGF5b3V0
VGVzdHMvaHR0cC90ZXN0cy9maWxlc3lzdGVtL3NjcmlwdC10ZXN0cy9yZXNvbHZlLXVyaS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE3MiBAQAorZGVzY3JpcHRpb24oIlRlc3RzIHVzaW5n
IHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkgdG8gb2J0YWluIGFuIEVudHJ5IGZyb20gYSBVUkki
KTsKKwordmFyIHRlc3RGaWxlTmFtZSA9ICcvdGVzdEZpbGUnOwordmFyIGZpbGVTeXN0ZW0gPSBu
dWxsOwordmFyIGV4cGVjdGVkQW5kUnVuTmV4dCA9IGZ1bmN0aW9uKCkgeyB0ZXN0UGFzc2VkKCIi
KTsgY2xlYW51cEFuZFJ1bk5leHQoKTsgfTsKKwordmFyIGV4cGVjdGVkUGF0aCA9IG51bGw7Cit2
YXIgYWN0dWFsUGF0aCA9IG51bGw7CisKK2Z1bmN0aW9uIGVycm9yQ2FsbGJhY2soZXJyb3IpIHsK
KyAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSkKKyAgICAgICAgZGVidWcoIkVycm9yIG9jY3Vy
cmVkOiAiICsgZXJyb3IuY29kZSk7CisgICAgdGVzdEZhaWxlZCgiQmFpbGluZyBvdXQgZWFybHki
KTsKKyAgICBmaW5pc2hKU1Rlc3QoKTsKK30KKworZnVuY3Rpb24gY3JlYXRlVGVzdEZpbGUoY2Fs
bGJhY2spIHsKKyAgICBmaWxlU3lzdGVtLnJvb3QuZ2V0RmlsZSh0ZXN0RmlsZU5hbWUsIHtjcmVh
dGU6dHJ1ZX0sIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKK30KKworZnVuY3Rpb24gYXNzZXJ0
UGF0aHNNYXRjaChleHBlY3RlZCwgYWN0dWFsKSB7CisgICAgZXhwZWN0ZWRQYXRoID0gZXhwZWN0
ZWQ7CisgICAgYWN0dWFsUGF0aCA9IGFjdHVhbDsKKyAgICBzaG91bGRCZSgiZXhwZWN0ZWRQYXRo
IiwgImFjdHVhbFBhdGgiKTsKK30KKwordmFyIGlzRGlyZWN0b3J5ID0gZmFsc2U7CitmdW5jdGlv
biBhc3NlcnRJc0RpcmVjdG9yeShlbnRyeSkgeworICAgIGlzRGlyZWN0b3J5ID0gZW50cnkuaXNE
aXJlY3Rvcnk7CisgICAgc2hvdWxkQmVUcnVlKCJpc0RpcmVjdG9yeSIpOworfQorCit2YXIgaXNG
aWxlID0gZmFsc2U7CitmdW5jdGlvbiBhc3NlcnRJc0ZpbGUoZW50cnkpIHsKKyAgICBpc0ZpbGUg
PSBlbnRyeS5pc0ZpbGU7CisgICAgc2hvdWxkQmVUcnVlKCJpc0ZpbGUiKTsKK30KKworLy8gVGVz
dCBib2R5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCisKK2Z1bmN0aW9uIHJ1bkJhc2ljVGVzdCgpIHsKKyAgICBkZWJ1ZygiKiBS
ZXNvbHZpbmcgYSBnZW5lcmF0ZWQgVVJJLiIpOworICAgIGNyZWF0ZVRlc3RGaWxlKGZ1bmN0aW9u
KGVudHJ5KSB7CisgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoZW50cnkudG9VUkko
KSwgZnVuY3Rpb24oZSkgeworICAgICAgICAgICAgYXNzZXJ0UGF0aHNNYXRjaChlbnRyeS5mdWxs
UGF0aCwgZS5mdWxsUGF0aCk7CisgICAgICAgICAgICBhc3NlcnRJc0ZpbGUoZSk7CisgICAgICAg
ICAgICBjbGVhbnVwQW5kUnVuTmV4dCgpOworICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsKKyAg
ICB9KTsKK30KKworZnVuY3Rpb24gcnVuSGFuZG1hZGVVUkkoKSB7CisgICAgZGVidWcoIiogUmVz
b2x2aW5nIHRlc3QgZmlsZSBieSBoYW5kIik7CisgICAgY3JlYXRlVGVzdEZpbGUoZnVuY3Rpb24o
ZW50cnkpIHsKKyAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiZmlsZXN5c3RlbTpm
aWxlOi8vL3RlbXBvcmFyeS90ZXN0RmlsZSIsIGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgIGFz
c2VydFBhdGhzTWF0Y2godGVzdEZpbGVOYW1lLCBlLmZ1bGxQYXRoKTsKKyAgICAgICAgICAgIGFz
c2VydElzRmlsZShlKTsKKyAgICAgICAgICAgIGNsZWFudXBBbmRSdW5OZXh0KCk7CisgICAgICAg
IH0sIGVycm9yQ2FsbGJhY2spOworICAgIH0pOworfQorCitmdW5jdGlvbiBydW5Cb2d1c1VSSSgp
IHsKKyAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgYSBjb21wbGV0ZWx5IGJvZ3VzIFVSSS4iKTsKKyAg
ICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmb28iLCBlcnJvckNhbGxiYWNrLCBleHBlY3Rl
ZEFuZFJ1bk5leHQpOworfQorCitmdW5jdGlvbiBydW5Xcm9uZ1Byb3RvY29sKCkgeworICAgIGRl
YnVnKCIqIFJlc29sdmluZyBhIFVSSSB3aXRoIHRoZSB3cm9uZyBwcm90b2NvbCIpOworICAgIHJl
c29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGU6Ly8vZm9vL2Jhci9iYXoiLCBlcnJvckNhbGxi
YWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOworfQorCitmdW5jdGlvbiBydW5Ob3RFbm91Z2hTbGFz
aGVzKCkgeworICAgIGRlYnVnKCIqIFJlc29sdmluZyBhIFVSSSB3aXRoIG5vIHNsYXNoIGJldHdl
ZW4gdHlwZSBhbmQgZmlsZSIpOworICAgIGNyZWF0ZVRlc3RGaWxlKGZ1bmN0aW9uKGVudHJ5KSB7
CisgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovLy90
ZW1wb3Jhcnl0ZXN0RmlsZSIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVkQW5kUnVuTmV4dCk7Cisg
ICAgfSk7Cit9CisKK2Z1bmN0aW9uIHJ1bk5vdEVub3VnaFNsYXNoZXMyKCkgeworICAgIGRlYnVn
KCIqIFJlc29sdmluZyBhIFVSSSB3aXRoIG5vIHNsYXNoIGJldHdlZW4gcHJvdG9jb2wgYW5kIHR5
cGUiKTsKKyAgICBjcmVhdGVUZXN0RmlsZShmdW5jdGlvbihlbnRyeSkgeworICAgICAgICByZXNv
bHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly90ZW1wb3JhcnkvdGVzdEZp
bGUiLCBlcnJvckNhbGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOworICAgIH0pOworfQorCitm
dW5jdGlvbiBydW5Vc2VCYWNrU2xhc2hlcygpIHsKKyAgICBkZWJ1ZygiKiBSZXNvbHZlIGEgcGF0
aCB1c2luZyBiYWNrc2xhc2hlcyIpOworICAgIGZpbGVTeXN0ZW0ucm9vdC5nZXREaXJlY3Rvcnko
ImZvbyIsIHtjcmVhdGU6dHJ1ZX0sIGZ1bmN0aW9uKGVudHJ5KSB7CisgICAgICAgIGVudHJ5Lmdl
dEZpbGUoInRlc3RGaWxlIiwge2NyZWF0ZTp0cnVlfSwgZnVuY3Rpb24oZikgeworICAgICAgICAg
ICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiZmlsZXN5c3RlbTpmaWxlOi8vL3RlbXBvcmFy
eS9mb29cXHRlc3RGaWxlIiwgZnVuY3Rpb24oZSkgeworICAgICAgICAgICAgICAgIGFzc2VydFBh
dGhzTWF0Y2goIi9mb28vdGVzdEZpbGUiLCBlLmZ1bGxQYXRoKTsKKyAgICAgICAgICAgICAgICBh
c3NlcnRJc0ZpbGUoZSk7CisgICAgICAgICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKKyAg
ICAgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOworICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTsK
KyAgICB9LCBlcnJvckNhbGxiYWNrKTsKK30KKworZnVuY3Rpb24gcnVuRGlyZWN0b3J5KCkgewor
ICAgIGRlYnVnKCIqIFJlc29sdmUgYSBkaXJlY3RvcnkiKTsKKyAgICBmaWxlU3lzdGVtLnJvb3Qu
Z2V0RGlyZWN0b3J5KCJmb28iLCB7Y3JlYXRlOnRydWV9LCBmdW5jdGlvbihlbnRyeSkgeworICAg
ICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9y
YXJ5L2ZvbyIsIGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgIGFzc2VydFBhdGhzTWF0Y2goIi9m
b28iLCBlLmZ1bGxQYXRoKTsKKyAgICAgICAgICAgIGFzc2VydElzRGlyZWN0b3J5KGUpOworICAg
ICAgICAgICAgY2xlYW51cEFuZFJ1bk5leHQoKTsKKyAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7
CisgICAgfSwgZXJyb3JDYWxsYmFjayk7Cit9CisKK2Z1bmN0aW9uIHJ1bldpdGhUcmFpbGluZ1Ns
YXNoKCkgeworICAgIGRlYnVnKCIqIFJlc29sdmUgYSBwYXRoIHVzaW5nIGEgdHJhaWxpbmcgc2xh
c2giKTsKKyAgICBmaWxlU3lzdGVtLnJvb3QuZ2V0RGlyZWN0b3J5KCJmb28iLCB7Y3JlYXRlOnRy
dWV9LCBmdW5jdGlvbihlbnRyeSkgeworICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJ
KCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9yYXJ5L2Zvby8iLCBmdW5jdGlvbihlKSB7CisgICAg
ICAgICAgICBhc3NlcnRQYXRoc01hdGNoKCIvZm9vIiwgZS5mdWxsUGF0aCk7CisgICAgICAgICAg
ICBhc3NlcnRJc0RpcmVjdG9yeShlKTsKKyAgICAgICAgICAgIGNsZWFudXBBbmRSdW5OZXh0KCk7
CisgICAgICAgIH0sIGVycm9yQ2FsbGJhY2spOworICAgIH0sIGVycm9yQ2FsbGJhY2spOworfQor
CitmdW5jdGlvbiBydW5QZXJzaXN0ZW50VGVzdCgpIHsKKyAgICBkZWJ1ZygiKiBSZXNvbHZpbmcg
YSBwZXJzaXN0ZW50IFVSSS4iKTsKKyAgICByZXF1ZXN0RmlsZVN5c3RlbShQRVJTSVNURU5ULCAx
MDAsIGZ1bmN0aW9uKGZzKSB7CisgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoZnMu
cm9vdC50b1VSSSgpLCBmdW5jdGlvbihlbnRyeSkgeworICAgICAgICAgICAgYXNzZXJ0UGF0aHNN
YXRjaCgiLyIsIGVudHJ5LmZ1bGxQYXRoKTsKKyAgICAgICAgICAgIGFzc2VydElzRGlyZWN0b3J5
KGVudHJ5KTsKKyAgICAgICAgICAgIGNsZWFudXBBbmRSdW5OZXh0KCk7CisgICAgICAgIH0sIGVy
cm9yQ2FsbGJhY2spOworICAgIH0pOworfQorCisvLyBFbmQgb2YgdGVzdCBib2R5IGZ1bmN0aW9u
cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordmFyIHRl
c3RzTGlzdCA9IFsKKyAgICBydW5CYXNpY1Rlc3QsCisgICAgcnVuSGFuZG1hZGVVUkksCisgICAg
cnVuQm9ndXNVUkksCisgICAgcnVuV3JvbmdQcm90b2NvbCwKKyAgICBydW5Ob3RFbm91Z2hTbGFz
aGVzLAorICAgIHJ1bk5vdEVub3VnaFNsYXNoZXMyLAorICAgIHJ1blVzZUJhY2tTbGFzaGVzLAor
ICAgIHJ1bkRpcmVjdG9yeSwKKyAgICBydW5XaXRoVHJhaWxpbmdTbGFzaCwKKyAgICBydW5QZXJz
aXN0ZW50VGVzdCwKK107Cit2YXIgdGVzdENvdW50ZXIgPSAwOworCitmdW5jdGlvbiBydW5OZXh0
VGVzdCgpIHsKKyAgICBpZiAodGVzdENvdW50ZXIgPT0gdGVzdHNMaXN0Lmxlbmd0aCkgeworICAg
ICAgICBkZWJ1ZygiRmluaXNoZWQgcnVubmluZyB0ZXN0cy4iKTsKKyAgICAgICAgZmluaXNoSlNU
ZXN0KCk7CisgICAgfSBlbHNlCisgICAgICAgIHRlc3RzTGlzdFt0ZXN0Q291bnRlcisrXSgpOwor
fQorCitmdW5jdGlvbiBjbGVhbnVwQW5kUnVuTmV4dCgpIHsKKyAgICByZW1vdmVBbGxJbkRpcmVj
dG9yeShmaWxlU3lzdGVtLnJvb3QsIHJ1bk5leHRUZXN0LCBydW5OZXh0VGVzdCk7Cit9CisKK2Z1
bmN0aW9uIGZpbGVTeXN0ZW1DYWxsYmFjayhmcykgeworICAgIGZpbGVTeXN0ZW0gPSBmczsKKyAg
ICBjbGVhbnVwQW5kUnVuTmV4dCgpOworfQorCitpZiAod2luZG93LnJlcXVlc3RGaWxlU3lzdGVt
KSB7CisgICAgd2luZG93LmpzVGVzdElzQXN5bmMgPSB0cnVlOworICAgIHJlcXVlc3RGaWxlU3lz
dGVtKHdpbmRvdy5URU1QT1JBUlksIDEwMCwgZmlsZVN5c3RlbUNhbGxiYWNrLCBlcnJvckNhbGxi
YWNrKTsKK30gZWxzZQorICAgIGRlYnVnKCJUaGlzIHRlc3QgcmVxdWlyZXMgRmlsZVN5c3RlbSBB
UEkgc3VwcG9ydC4iKTsKKword2luZG93LnN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRydWU7CkluZGV4
OiBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUt
dXJpLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVzdHMvZmlsZXN5c3RlbS9z
Y3JpcHQtdGVzdHMvcmVzb2x2ZS11cmkuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9o
dHRwL3Rlc3RzL2ZpbGVzeXN0ZW0vc2NyaXB0LXRlc3RzL3Jlc29sdmUtdXJpLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC01Miw3ICs1Miw3IEBAIGZ1bmN0aW9uIHJ1bkJhc2ljVGVzdCgpIHsKIGZ1bmN0
aW9uIHJ1bkhhbmRtYWRlVVJJKCkgewogICAgIGRlYnVnKCIqIFJlc29sdmluZyB0ZXN0IGZpbGUg
YnkgaGFuZCIpOwogICAgIGNyZWF0ZVRlc3RGaWxlKGZ1bmN0aW9uKGVudHJ5KSB7Ci0gICAgICAg
IHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06ZmlsZTovLy90ZW1wb3Jhcnkv
dGVzdEZpbGUiLCBmdW5jdGlvbihlKSB7CisgICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1V
UkkoImZpbGVzeXN0ZW06aHR0cDovLzEyNy4wLjAuMTo4MDAwL3RlbXBvcmFyeS90ZXN0RmlsZSIs
IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgIGFzc2VydFBhdGhzTWF0Y2godGVzdEZpbGVOYW1l
LCBlLmZ1bGxQYXRoKTsKICAgICAgICAgICAgIGFzc2VydElzRmlsZShlKTsKICAgICAgICAgICAg
IGNsZWFudXBBbmRSdW5OZXh0KCk7CkBAIC02NywyMCArNjcsMjAgQEAgZnVuY3Rpb24gcnVuQm9n
dXNVUkkoKSB7CiAKIGZ1bmN0aW9uIHJ1bldyb25nUHJvdG9jb2woKSB7CiAgICAgZGVidWcoIiog
UmVzb2x2aW5nIGEgVVJJIHdpdGggdGhlIHdyb25nIHByb3RvY29sIik7Ci0gICAgcmVzb2x2ZUxv
Y2FsRmlsZVN5c3RlbVVSSSgiZmlsZTovLy9mb28vYmFyL2JheiIsIGVycm9yQ2FsbGJhY2ssIGV4
cGVjdGVkQW5kUnVuTmV4dCk7CisgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgiaHR0cDov
Ly9mb28vYmFyL2JheiIsIGVycm9yQ2FsbGJhY2ssIGV4cGVjdGVkQW5kUnVuTmV4dCk7CiB9CiAK
IGZ1bmN0aW9uIHJ1bk5vdEVub3VnaFNsYXNoZXMoKSB7CiAgICAgZGVidWcoIiogUmVzb2x2aW5n
IGEgVVJJIHdpdGggbm8gc2xhc2ggYmV0d2VlbiB0eXBlIGFuZCBmaWxlIik7CiAgICAgY3JlYXRl
VGVzdEZpbGUoZnVuY3Rpb24oZW50cnkpIHsKLSAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3Rl
bVVSSSgiZmlsZXN5c3RlbTpmaWxlOi8vL3RlbXBvcmFyeXRlc3RGaWxlIiwgZXJyb3JDYWxsYmFj
aywgZXhwZWN0ZWRBbmRSdW5OZXh0KTsKKyAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVS
SSgiZmlsZXN5c3RlbTpodHRwOi8vMTI3LjAuMC4xOjgwMDAvdGVtcG9yYXJ5dGVzdEZpbGUiLCBl
cnJvckNhbGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOwogICAgIH0pOwogfQogCiBmdW5jdGlv
biBydW5Ob3RFbm91Z2hTbGFzaGVzMigpIHsKICAgICBkZWJ1ZygiKiBSZXNvbHZpbmcgYSBVUkkg
d2l0aCBubyBzbGFzaCBiZXR3ZWVuIHByb3RvY29sIGFuZCB0eXBlIik7CiAgICAgY3JlYXRlVGVz
dEZpbGUoZnVuY3Rpb24oZW50cnkpIHsKLSAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVS
SSgiZmlsZXN5c3RlbTpmaWxlOi8vdGVtcG9yYXJ5L3Rlc3RGaWxlIiwgZXJyb3JDYWxsYmFjaywg
ZXhwZWN0ZWRBbmRSdW5OZXh0KTsKKyAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSSSgi
ZmlsZXN5c3RlbTpodHRwOi8vMTI3LjAuMC4xOjgwMDB0ZW1wb3JhcnkvdGVzdEZpbGUiLCBlcnJv
ckNhbGxiYWNrLCBleHBlY3RlZEFuZFJ1bk5leHQpOwogICAgIH0pOwogfQogCkBAIC04OCw3ICs4
OCw3IEBAIGZ1bmN0aW9uIHJ1blVzZUJhY2tTbGFzaGVzKCkgewogICAgIGRlYnVnKCIqIFJlc29s
dmUgYSBwYXRoIHVzaW5nIGJhY2tzbGFzaGVzIik7CiAgICAgZmlsZVN5c3RlbS5yb290LmdldERp
cmVjdG9yeSgiZm9vIiwge2NyZWF0ZTp0cnVlfSwgZnVuY3Rpb24oZW50cnkpIHsKICAgICAgICAg
ZW50cnkuZ2V0RmlsZSgidGVzdEZpbGUiLCB7Y3JlYXRlOnRydWV9LCBmdW5jdGlvbihmKSB7Ci0g
ICAgICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmZpbGU6Ly8v
dGVtcG9yYXJ5L2Zvb1xcdGVzdEZpbGUiLCBmdW5jdGlvbihlKSB7CisgICAgICAgICAgICByZXNv
bHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmh0dHA6Ly8xMjcuMC4wLjE6ODAwMC90
ZW1wb3JhcnkvZm9vXFx0ZXN0RmlsZSIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICBh
c3NlcnRQYXRoc01hdGNoKCIvZm9vL3Rlc3RGaWxlIiwgZS5mdWxsUGF0aCk7CiAgICAgICAgICAg
ICAgICAgYXNzZXJ0SXNGaWxlKGUpOwogICAgICAgICAgICAgICAgIGNsZWFudXBBbmRSdW5OZXh0
KCk7CkBAIC0xMDAsNyArMTAwLDcgQEAgZnVuY3Rpb24gcnVuVXNlQmFja1NsYXNoZXMoKSB7CiBm
dW5jdGlvbiBydW5EaXJlY3RvcnkoKSB7CiAgICAgZGVidWcoIiogUmVzb2x2ZSBhIGRpcmVjdG9y
eSIpOwogICAgIGZpbGVTeXN0ZW0ucm9vdC5nZXREaXJlY3RvcnkoImZvbyIsIHtjcmVhdGU6dHJ1
ZX0sIGZ1bmN0aW9uKGVudHJ5KSB7Ci0gICAgICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkko
ImZpbGVzeXN0ZW06ZmlsZTovLy90ZW1wb3JhcnkvZm9vIiwgZnVuY3Rpb24oZSkgeworICAgICAg
ICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJKCJmaWxlc3lzdGVtOmh0dHA6Ly8xMjcuMC4wLjE6
ODAwMC90ZW1wb3JhcnkvZm9vIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgYXNzZXJ0UGF0
aHNNYXRjaCgiL2ZvbyIsIGUuZnVsbFBhdGgpOwogICAgICAgICAgICAgYXNzZXJ0SXNEaXJlY3Rv
cnkoZSk7CiAgICAgICAgICAgICBjbGVhbnVwQW5kUnVuTmV4dCgpOwpAQCAtMTExLDcgKzExMSw3
IEBAIGZ1bmN0aW9uIHJ1bkRpcmVjdG9yeSgpIHsKIGZ1bmN0aW9uIHJ1bldpdGhUcmFpbGluZ1Ns
YXNoKCkgewogICAgIGRlYnVnKCIqIFJlc29sdmUgYSBwYXRoIHVzaW5nIGEgdHJhaWxpbmcgc2xh
c2giKTsKICAgICBmaWxlU3lzdGVtLnJvb3QuZ2V0RGlyZWN0b3J5KCJmb28iLCB7Y3JlYXRlOnRy
dWV9LCBmdW5jdGlvbihlbnRyeSkgewotICAgICAgICByZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJJ
KCJmaWxlc3lzdGVtOmZpbGU6Ly8vdGVtcG9yYXJ5L2Zvby8iLCBmdW5jdGlvbihlKSB7CisgICAg
ICAgIHJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkkoImZpbGVzeXN0ZW06aHR0cDovLzEyNy4wLjAu
MTo4MDAwL3RlbXBvcmFyeS9mb28vIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgYXNzZXJ0
UGF0aHNNYXRjaCgiL2ZvbyIsIGUuZnVsbFBhdGgpOwogICAgICAgICAgICAgYXNzZXJ0SXNEaXJl
Y3RvcnkoZSk7CiAgICAgICAgICAgICBjbGVhbnVwQW5kUnVuTmV4dCgpOwo=
</data>
<flag name="review"
          id="78159"
          type_id="1"
          status="+"
          setter="abarth"
    />
          </attachment>
      

    </bug>

</bugzilla>