<?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>201778</bug_id>
          
          <creation_ts>2019-09-13 15:35:29 -0700</creation_ts>
          <short_desc>[results.webkit.org] Test library for js library</short_desc>
          <delta_ts>2019-09-24 10:49:22 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>Safari Technology Preview</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Zhifei Fang">zhifei_fang</reporter>
          <assigned_to name="Zhifei Fang">zhifei_fang</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>jbedard</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zhifei_fang</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1570723</commentid>
    <comment_count>0</comment_count>
    <who name="Zhifei Fang">zhifei_fang</who>
    <bug_when>2019-09-13 15:35:29 -0700</bug_when>
    <thetext>We will need to add some tests for the JS library I wrote. It is getting more and more complex.

In this bug, I will introduce a test framework with some fundamental test cases for Ref.js

In the meanwhile, the Test.js can be reused for any other application that use Ref.js. 

Also, a test app is included, people can directly run the tests by open the test/index.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570726</commentid>
    <comment_count>1</comment_count>
      <attachid>378756</attachid>
    <who name="Zhifei Fang">zhifei_fang</who>
    <bug_when>2019-09-13 15:54:38 -0700</bug_when>
    <thetext>Created attachment 378756
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1571342</commentid>
    <comment_count>2</comment_count>
      <attachid>378756</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2019-09-16 17:12:08 -0700</bug_when>
    <thetext>Comment on attachment 378756
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=378756&amp;action=review

&gt; Tools/ChangeLog:3
&gt; +        Add a test library and some fundamental test for Ref.js.

Would just say &apos;Add tests for Ref.js&apos;

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Ref.js:220
&gt; +    if (diff === undefined)

This seems like a stand-alone change. Can we bring it out into a different bug and just relate to this one?

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:3
&gt; +class AssertFailedError extends Error {

Any reason we need a specific error class? In my experience, such generic base classes are rarely helpful.

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:13
&gt; +class Expect {

I haven&apos;t seen this style of assert before. Is it based off of something you&apos;ve seen and is there a reason you picked it? I&apos;m more familiar with the assert&lt;condition&gt;(valueA, valueB) model, like Python uses. Not necessarily opposed to this, but I feel like it does require justification.

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:131
&gt; +    for (let method of testObjMethods) {

We aren&apos;t actually checking if the methods are &apos;test&apos; methods, but you&apos;ve named all of you tests that way.

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:228
&gt; +            haveErrsor = await this.runTest(testClassName, testFnName);

Typo

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/components/TestComponents.js:31
&gt; +    return (

Why the parenthesis?

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/test/index.html:18
&gt; +                // Test file list: Root Path will be Test.js&apos;s folder

Comment is not needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1571971</commentid>
    <comment_count>3</comment_count>
    <who name="Zhifei Fang">zhifei_fang</who>
    <bug_when>2019-09-18 11:36:26 -0700</bug_when>
    <thetext>(In reply to Jonathan Bedard from comment #2)
&gt; Comment on attachment 378756 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=378756&amp;action=review
&gt; 
&gt; &gt; Tools/ChangeLog:3
&gt; &gt; +        Add a test library and some fundamental test for Ref.js.
&gt; 
&gt; Would just say &apos;Add tests for Ref.js&apos;
&gt; 
&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Ref.js:220
&gt; &gt; +    if (diff === undefined)
&gt; 
&gt; This seems like a stand-alone change. Can we bring it out into a different
&gt; bug and just relate to this one?

This will fix a test failure.

&gt; 
&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:3
&gt; &gt; +class AssertFailedError extends Error {
&gt; 
&gt; Any reason we need a specific error class? In my experience, such generic
&gt; base classes are rarely helpful.

This will help us to identify if the test is really failed or there are some other issue in the test code, it could throw an error which is not &quot;AssertFailedError&quot;
&gt; 
&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:13
&gt; &gt; +class Expect {
&gt; 
&gt; I haven&apos;t seen this style of assert before. Is it based off of something
&gt; you&apos;ve seen and is there a reason you picked it? I&apos;m more familiar with the
&gt; assert&lt;condition&gt;(valueA, valueB) model, like Python uses. Not necessarily
&gt; opposed to this, but I feel like it does require justification.
&gt; 
See it here,
https://github.com/Automattic/expect.js

This is BDD assertion style. 

&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:131
&gt; &gt; +    for (let method of testObjMethods) {
&gt; 
&gt; We aren&apos;t actually checking if the methods are &apos;test&apos; methods, but you&apos;ve
&gt; named all of you tests that way.
Line 128 will gathering all base class method name, line 132 will filter all those functions, all other user defined method will be treated as test method
&gt; 
&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:228
&gt; &gt; +            haveErrsor = await this.runTest(testClassName, testFnName);
&gt; 
&gt; Typo
&gt; 
&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/components/TestComponents.js:31
&gt; &gt; +    return (
&gt; 
&gt; Why the parenthesis?

Js won&apos;t allow you return \n something
&gt; 
&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/test/index.html:18
&gt; &gt; +                // Test file list: Root Path will be Test.js&apos;s folder
&gt; 
&gt; Comment is not needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1571982</commentid>
    <comment_count>4</comment_count>
    <who name="Zhifei Fang">zhifei_fang</who>
    <bug_when>2019-09-18 11:43:30 -0700</bug_when>
    <thetext>&gt; 
&gt; &gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/test/index.html:18
&gt; &gt; +                // Test file list: Root Path will be Test.js&apos;s folder
&gt; 
&gt; Comment is not needed.

I think this is still needed, please be advise that index.html and Test.js in different directory, as we dynamically import a file, the relative path will be resolved using Test.js&apos;s root folder.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1571983</commentid>
    <comment_count>5</comment_count>
      <attachid>379053</attachid>
    <who name="Zhifei Fang">zhifei_fang</who>
    <bug_when>2019-09-18 11:44:14 -0700</bug_when>
    <thetext>Created attachment 379053
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1572789</commentid>
    <comment_count>6</comment_count>
      <attachid>379053</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2019-09-20 11:34:24 -0700</bug_when>
    <thetext>Comment on attachment 379053
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=379053&amp;action=review

&gt; Tools/ChangeLog:9
&gt; +        (applyStateDiff): For singal value, null, 0, false those are still valid state

Change to: &apos;null, 0 and false are all valid state values.&apos;

&gt; Tools/ChangeLog:13
&gt; +        (Expect): Expect class help user perform a expectation assertion

Change to: Perform assertions during unit tests.

&gt; Tools/ChangeLog:22
&gt; +        (Test): Common Test class for user to extend. 

Base class for test suite. (Also, should this be named suite? A test is a specific function, this class is a collection of tests, no?)

&gt; Tools/ChangeLog:23
&gt; +        (Test.prototype.expect): This expect method will help the test perform expectation assertions

I think this comment might make things more confusing.

&gt; Tools/ChangeLog:24
&gt; +        (Test.prototype.sleep): Test will sleep for certain ms

Don&apos;t abbreviate milliseconds here

&gt; Tools/ChangeLog:26
&gt; +        (Test.prototype.waitForRefMounted): Wait until we revice ref&apos;s onElementMount signal with timeout

By &apos;ref&apos;, do you mean the Ref object? Probably need to clarify.

&gt; Tools/ChangeLog:29
&gt; +        (Test.prototype.async.setup): Common interface for setup a test class

Might turn into &apos;Setup test suite&apos; if the classname changes.

&gt; Tools/ChangeLog:30
&gt; +        (Test.prototype.async.clearUp): Common interface for clearup a test class

&apos;cleanUp&apos; would be the traditional name for this.

&gt; Tools/ChangeLog:31
&gt; +        (getTestFucntionNames): Collect all the test method of a test instance.

&apos;...all test methods of a...&apos;

&gt; Tools/ChangeLog:34
&gt; +        (async.getTestResult): This will run the test and generate a TestResult object

Run the test and generate a TestResult object.

&gt; Tools/ChangeLog:35
&gt; +        (TestController): Control how the test running

I think this comment makes things more confusing.

&gt; Tools/ChangeLog:36
&gt; +        (TestController.prototype.addResultHandler): Result handler should be hook with a component or something else to render the test result

Could make this shorter...a result handler just needs to return renderable html, right? Not sure you need to call out components specifically

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:88
&gt; +    sleep(ms) {

Don&apos;t abbreviate milliseconds here

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:121
&gt; +    /*Common interface*/

Not needed

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/Test.js:190
&gt; +        if ( testName in this.allTests) {

Extra space after (

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/components/TestComponents.js:3
&gt; +

Let&apos;s be consistent, you&apos;re using one space everywhere else

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/components/TestComponents.js:12
&gt; +            ${TestRenderArea(testController)}

Let&apos;s be consistent on the tabs.

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/components/TestComponents.js:32
&gt; +        `

Why the newline?

&gt; Tools/resultsdbpy/resultsdbpy/view/static/library/js/test/index.html:5
&gt; +        &lt;link rel=&quot;stylesheet&quot; href=&quot;https://results.safari.apple.com/library/css/webkit.css&quot;&gt;&lt;/link&gt;

Shouldn&apos;t this be a relative local path?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1572805</commentid>
    <comment_count>7</comment_count>
      <attachid>379053</attachid>
    <who name="Zhifei Fang">zhifei_fang</who>
    <bug_when>2019-09-20 12:11:27 -0700</bug_when>
    <thetext>Comment on attachment 379053
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=379053&amp;action=review

&gt;&gt; Tools/ChangeLog:22
&gt;&gt; +        (Test): Common Test class for user to extend. 
&gt; 
&gt; Base class for test suite. (Also, should this be named suite? A test is a specific function, this class is a collection of tests, no?)

Good idea

&gt;&gt; Tools/ChangeLog:26
&gt;&gt; +        (Test.prototype.waitForRefMounted): Wait until we revice ref&apos;s onElementMount signal with timeout
&gt; 
&gt; By &apos;ref&apos;, do you mean the Ref object? Probably need to clarify.

Yes

&gt;&gt; Tools/ChangeLog:36
&gt;&gt; +        (TestController.prototype.addResultHandler): Result handler should be hook with a component or something else to render the test result
&gt; 
&gt; Could make this shorter...a result handler just needs to return renderable html, right? Not sure you need to call out components specifically

This is where the view will receive the test result notification, it can be a html based, or CLI based if running in node.js</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1572862</commentid>
    <comment_count>8</comment_count>
      <attachid>379265</attachid>
    <who name="Zhifei Fang">zhifei_fang</who>
    <bug_when>2019-09-20 13:38:31 -0700</bug_when>
    <thetext>Created attachment 379265
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1573702</commentid>
    <comment_count>9</comment_count>
      <attachid>379265</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-09-24 10:48:27 -0700</bug_when>
    <thetext>Comment on attachment 379265
Patch

Clearing flags on attachment: 379265

Committed r250307: &lt;https://trac.webkit.org/changeset/250307&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1573703</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-09-24 10:48:29 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1573704</commentid>
    <comment_count>11</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-09-24 10:49:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/55668433&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>378756</attachid>
            <date>2019-09-13 15:54:38 -0700</date>
            <delta_ts>2019-09-18 11:44:13 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-201778-20190913155437.patch</filename>
            <type>text/plain</type>
            <size>29909</size>
            <attacher name="Zhifei Fang">zhifei_fang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjQ5NTkyCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYWYwNGM1ZWVjNDc0NTQ2OGIwYWM5M2EwMjY3MWYzYWVm
NjIxNzM0Zi4uMTYxMzRkZmM0MjlmN2E0YWQ5OTRiNDdlMGZlZDk1ZjdkOGFiNWZhYSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ5
IEBACisyMDE5LTA5LTEzICBaaGlmZWkgRmFuZyAgPHpoaWZlaV9mYW5nQGFwcGxlLmNvbT4KKwor
ICAgICAgICBBZGQgYSB0ZXN0IGxpYnJhcnkgYW5kIHNvbWUgZnVuZGFtZW50YWwgdGVzdCBmb3Ig
UmVmLmpzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjAxNzc4LgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
ICogcmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9SZWYuanM6
CisgICAgICAgIChhcHBseVN0YXRlRGlmZik6IEZvciBzaW5nYWwgdmFsdWUsIG51bGwsIDAsIGZh
bHNlIHRob3NlIGFyZSBzdGlsbCB2YWxpZCBzdGF0ZQorICAgICAgICAoUmVmLnByb3RvdHlwZS5z
ZXRTdGF0ZSk6IFdlIHNob3VsZCBkbyBub3RoaW5nIGZvciB1bmRlZmluZWQgc3RhdGVEaWZmCisg
ICAgICAgICogcmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9U
ZXN0LmpzOiBBZGRlZC4KKyAgICAgICAgKEFzc2VydEZhaWxlZEVycm9yKToKKyAgICAgICAgKEV4
cGVjdCk6IEV4cGVjdCBjbGFzcyBoZWxwIHVzZXIgcGVyZm9ybSBhIGV4cGVjdGF0aW9uIGFzc2Vy
dGlvbgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5pc1R5cGUpOgorICAgICAgICAoRXhwZWN0
LnByb3RvdHlwZS5lcXVhbFRvVmFsdWUpOgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5lcXVh
bFRvSHRtbFdpdGhvdXRSZWYpOgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5ub3RFcXVhbFRv
VmFsdWUpOgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5ncmVhdGVyVGhhbik6CisgICAgICAg
IChFeHBlY3QucHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbFRvKToKKyAgICAgICAgKEV4cGVj
dC5wcm90b3R5cGUubGVzc1RoYW4pOgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5sZXNzVGhh
bk9yRXF1YWxUbyk6CisgICAgICAgIChUZXN0KTogQ29tbW9uIFRlc3QgY2xhc3MgZm9yIHVzZXIg
dG8gZXh0ZW5kIAorICAgICAgICAoVGVzdC5wcm90b3R5cGUuZXhwZWN0KTogVGhpcyBleHBlY3Qg
bWV0aG9kIHdpbGwgaGVscCB0aGUgdGVzdCBwZXJmb3JtIGV4cGVjdGF0aW9uIGFzc2VydGlvbnMK
KyAgICAgICAgKFRlc3QucHJvdG90eXBlLnNsZWVwKTogVGVzdCB3aWxsIHNsZWVwIGZvciBjZXJ0
YWluIG1zCisgICAgICAgIChUZXN0LnByb3RvdHlwZS53YWl0Rm9yU2lnbmFsKTogV2FpdCB1bnRp
bCB3ZSByZWNlaXZlIGEgY2VydGFpbiBzaWduYWwgd2l0aCB0aW1lb3V0CisgICAgICAgIChUZXN0
LnByb3RvdHlwZS53YWl0Rm9yUmVmTW91bnRlZCk6IFdhaXQgdW50aWwgd2UgcmV2aWNlIHJlZidz
IG9uRWxlbWVudE1vdW50IHNpZ25hbCB3aXRoIHRpbWVvdXQKKyAgICAgICAgKFRlc3QucHJvdG90
eXBlLndhaXRGb3JSZWZVbm1vdW50ZWQpOiBXYWl0IHVudGlsIHdlIHJldmljZSByZWYncyBvbkVs
ZW1lbnRVbm1vdW50IHNpZ25hbCB3aXRoIHRpbWVvdXQKKyAgICAgICAgKFRlc3QucHJvdG90eXBl
LndhaXRGb3JTdGF0ZVVwZGF0ZWQpOldhaXQgdW50aWwgd2UgcmV2aWNlIHJlZidzIG9uU3RhdGVV
cGRhdGUgc2lnbmFsIHdpdGggdGltZW91dAorICAgICAgICAoVGVzdC5wcm90b3R5cGUuYXN5bmMu
c2V0dXApOiBDb21tb24gaW50ZXJmYWNlIGZvciBzZXR1cCBhIHRlc3QgY2xhc3MKKyAgICAgICAg
KFRlc3QucHJvdG90eXBlLmFzeW5jLmNsZWFyVXApOiBDb21tb24gaW50ZXJmYWNlIGZvciBjbGVh
cnVwIGEgdGVzdCBjbGFzcworICAgICAgICAoZ2V0VGVzdEZ1Y250aW9uTmFtZXMpOiBDb2xsZWN0
IGFsbCB0aGUgdGVzdCBtZXRob2Qgb2YgYSB0ZXN0IGluc3RhbmNlLgorICAgICAgICAoVGVzdFJl
c3VsdCk6CisgICAgICAgIChUZXN0UmVzdWx0LnByb3RvdHlwZS5jYXRjaEV4Y2VwdGlvbik6Cisg
ICAgICAgIChhc3luYy5nZXRUZXN0UmVzdWx0KTogVGhpcyB3aWxsIHJ1biB0aGUgdGVzdCBhbmQg
Z2VuZXJhdGUgYSBUZXN0UmVzdWx0IG9iamVjdAorICAgICAgICAoVGVzdENvbnRyb2xsZXIpOiBD
b250cm9sIGhvdyB0aGUgdGVzdCBydW5uaW5nCisgICAgICAgIChUZXN0Q29udHJvbGxlci5wcm90
b3R5cGUuYWRkUmVzdWx0SGFuZGxlcik6IFJlc3VsdCBoYW5kbGVyIHNob3VsZCBiZSBob29rIHdp
dGggYSBjb21wb25lbnQgb3Igc29tZXRoaW5nIGVsc2UgdG8gcmVuZGVyIHRoZSB0ZXN0IHJlc3Vs
dAorICAgICAgICAoVGVzdENvbnRyb2xsZXIucHJvdG90eXBlLmFkZFNldHVwQXJncyk6IFRoaXMg
Z2l2ZXMgc29tZSBhZGRpdGlvbmFsIGFyZ3MgZm9yIHRoZSBjb21tb24gc2V0dXAgbWV0aG9kIGZv
ciBlYWNoIHRlc3QgY2xhc3MsIAorICAgICAgICBpdCBpcyB0aGUgYmVzdCBwbGFjZSB0byBzZXR1
cCBzb21ldGhpbmcgbGlrZSBhIHJvb3QgZWxlbWVudCwgYSBmYWtlIGRhdGEgc291cmNlLCBldGMK
KyAgICAgICAgKFRlc3RDb250cm9sbGVyLnByb3RvdHlwZS5jb2xsZWN0KTogVGhpcyBtZXRob2Qg
dXNlZCBmb3IgY29sbGVjdCB0aGUgdGVzdCBjbGFzc2VzLgorICAgICAgICAoVGVzdENvbnRyb2xs
ZXIucHJvdG90eXBlLmFzeW5jLmNvbGxlY3RGaWxlKTogSXQgd2lsbCBpbXBvcnQgdGhlIGZpbGUg
YXMgYSBtb2R1bGUgZHluYW1pY2x5IGFuZCBjb2xsZWN0IGFsbCB0aGUgdGVzdCBjbGFzc2VzIHRo
YXQgbW9kdWxlIGV4cG9ydAorICAgICAgICAoVGVzdENvbnRyb2xsZXIucHJvdG90eXBlLmFzeW5j
LnJ1blRlc3QpOiBJdCB3aWxsIHJ1biBhIHRlc3QgbWV0aG9kIG9mIGEgdGVzdCBjbGFzcworICAg
ICAgICAoVGVzdENvbnRyb2xsZXIucHJvdG90eXBlLmFzeW5jLnJ1bik6IEl0IHdpbGwgcnVuIGFs
bCB0ZXN0IG9yIGEgdGVzdCBjbGFzcyBvciBhIHRlc3QgbWV0aG9kCisgICAgICAgICogcmVzdWx0
c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9jb21wb25lbnRzL1Rlc3RD
b21wb25lbnRzLmpzOiBjb21wb25lbnRzIGZvciB0ZXN0IGFwcC4KKyAgICAgICAgKiByZXN1bHRz
ZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvUmVmVGVzdC5qczog
UmVmLmpzIHRlc3QgY2FzZXMuCisgICAgICAgICogcmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmll
dy9zdGF0aWMvbGlicmFyeS9qcy90ZXN0L2luZGV4Lmh0bWw6IFRlc3QgYXBwIGVudHJ5LgorCiAy
MDE5LTA5LTA2ICBBbGV4IENocmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CiAK
ICAgICAgICAgRGVwcmVjYXRlIGFsbCBXS0Nvb2tpZU1hbmFnZXJSZWYgZnVuY3Rpb25zCmRpZmYg
LS1naXQgYS9Ub29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5
L2pzL1JlZi5qcyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xp
YnJhcnkvanMvUmVmLmpzCmluZGV4IGM5MTRkNWI4MDM0YjQ0MWYwOTY3ZWFkNDk2MWMxNWRlNjRl
MmZhM2YuLmYwZjBiMDM5YTdiZGNkNDVkNzg1NjA4NDc1OTA3MzNiYzk0ODA4MmYgMTAwNjQ0Ci0t
LSBhL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMv
UmVmLmpzCisrKyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xp
YnJhcnkvanMvUmVmLmpzCkBAIC0yMTcsNyArMjE3LDcgQEAgZnVuY3Rpb24gaXNNZXJnZWFibGVT
dGF0ZShzdGF0ZSkgewogfQogCiBmdW5jdGlvbiBhcHBseVN0YXRlRGlmZihzdGF0ZSwgZGlmZikg
ewotICAgIGlmICghZGlmZikKKyAgICBpZiAoZGlmZiA9PT0gdW5kZWZpbmVkKQogICAgICAgICBy
ZXR1cm4gc3RhdGU7CiAgICAgaWYgKCFpc01lcmdlYWJsZVN0YXRlKGRpZmYpKQogICAgICAgICBy
ZXR1cm4gZGlmZjsKQEAgLTI3NSw2ICsyNzUsOCBAQCBjbGFzcyBSZWYgewogICAgICAgICByZXR1
cm4gdGhpcy5rZXk7CiAgICAgfQogICAgIHNldFN0YXRlKHN0YXRlRGlmZikgeworICAgICAgICBp
ZiAoc3RhdGVEaWZmID09PSB1bmRlZmluZWQpCisgICAgICAgICAgICByZXR1cm47CiAgICAgICAg
IGlmIChUUkFDRV9TVEFURSkKICAgICAgICAgICAgIHRoaXMuc3RhdGVUcmFjZXIucHVzaChzdGF0
ZURpZmYpOwogICAgICAgICBlbHNlCmRpZmYgLS1naXQgYS9Ub29scy9yZXN1bHRzZGJweS9yZXN1
bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL1Rlc3QuanMgYi9Ub29scy9yZXN1bHRzZGJw
eS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL1Rlc3QuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
NjdlZGRmMmY5YTMxMTNjNmRmOGY1MTM3M2RiNzFkOGNiOWZmNzE3MAotLS0gL2Rldi9udWxsCisr
KyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMv
VGVzdC5qcwpAQCAtMCwwICsxLDI0MiBAQAoraW1wb3J0IHtFdmVudFN0cmVhbX0gZnJvbSAnLi9S
ZWYuanMnOworCitjbGFzcyBBc3NlcnRGYWlsZWRFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBj
b25zdHJ1Y3Rvcihtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKQorICAgIH0KK30KKworZnVuY3Rp
b24gc3RyaXBSZWYoaHRtbCkgeworICAgIHJldHVybiBodG1sLnJlcGxhY2UoL3JlZj0iW1x3XGRc
LV0rIi9nLCAiIikKK30KKworY2xhc3MgRXhwZWN0IHsKKyAgICBjb25zdHJ1Y3Rvcih2YWx1ZUEp
IHsKKyAgICAgICAgdGhpcy52YWx1ZUEgPSB2YWx1ZUE7CisgICAgICAgIHRoaXMudmFsdWVCID0g
bnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgaXNUeXBlKHR5cGUpIHsK
KyAgICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnZhbHVl
QSAhPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3Io
YCR7dGhpcy52YWx1ZUF9IHNob3VsZCBiZSBudWxsYCk7CisgICAgICAgIH0gZWxzZSBpZiAoTnVt
YmVyLmlzTmFOKHR5cGUpIHx8IHR5cGUgPT09ICJOYU4iKSB7CisgICAgICAgICAgICBpZiAoIU51
bWJlci5pc05hTih0aGlzLnZhbHVlQSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2Vy
dEZhaWxlZEVycm9yKGAke3RoaXMudmFsdWVBfSBzaG91bGQgYmUgTmFOYCk7ICAgIAorICAgICAg
ICB9IGVsc2UgaWYgKHR5cGUgPT09ICJBcnJheSIgfHwgdHlwZSA9PT0gImFycmF5IiB8fCB0eXBl
ID09PSBBcnJheSkgeworICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmFsdWVB
KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3IoYCR7dGhpcy52
YWx1ZUF9IHNob3VsZCBiZSBhbiBBcnJheWApOworICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0
aGlzLnZhbHVlQSAhPT0gdHlwZSAmJiBmYWxzZSA9PT0gdGhpcy52YWx1ZUEgaW5zdGFuY2VvZiB0
eXBlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEZhaWxlZEVycm9yKGAke3RoaXMudmFs
dWVBfSBzaG91bGQgYmUgdHlwZSAke3R5cGV9YCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAg
IH0KKworICAgIGVxdWFsVG9WYWx1ZSh2YWx1ZUIpIHsKKyAgICAgICAgaWYgKHRoaXMudmFsdWVB
ICE9PSB2YWx1ZUIpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3IoYCR7
dGhpcy52YWx1ZUF9IHNob3VsZCBlcXVhbCB0byAke3ZhbHVlQn1gKTsKKyAgICB9CisKKyAgICBl
cXVhbFRvSHRtbFdpdGhvdXRSZWYoaHRtbCkgeworICAgICAgICByZXR1cm4gdGhpcy5lcXVhbFRv
VmFsdWUoc3RyaXBSZWYodGhpcy52YWx1ZUEpLCBzdHJpcFJlZihodG1sKSk7CisgICAgfQorCisg
ICAgZXF1YWxUb0FycmF5KGFycmF5LCBjb21wYXJlID0gKHgsIHkpID0+IGV4cGVjdCh4KS5lcXVh
bFRvVmFsdWUoeSkpIHsKKyAgICAgICAgZXhwZWN0KHRoaXMudmFsdWVBKS5pc1R5cGUoIkFycmF5
Iik7CisgICAgICAgIGV4cGVjdChhcnJheSkuaXNUeXBlKCJBcnJheSIpOworICAgICAgICBleHBl
Y3QodGhpcy52YWx1ZUEubGVuZ3RoKS5lcXVhbFRvVmFsdWUoYXJyYXkubGVuZ3RoKTsKKyAgICAg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlQS5sZW5ndGg7IGkrKykgeworICAgICAg
ICAgICAgY29tcGFyZSh0aGlzLnZhbHVlQVtpXSwgYXJyYXlbaV0pOworICAgICAgICB9CisgICAg
fQorCisgICAgbm90RXF1YWxUb1ZhbHVlKHZhbHVlQikgeworICAgICAgICBpZiAodGhpcy52YWx1
ZUEgPT09IHZhbHVlQikKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRGYWlsZWRFcnJvcihg
JHt0aGlzLnZhbHVlQX0gc2hvdWxkIG5vdCBlcXVhbCB0byAke3ZhbHVlQn1gKTsKKyAgICB9CisK
KyAgICBncmVhdGVyVGhhbih2YWx1ZUIpIHsKKyAgICAgICAgaWYgKHRoaXMudmFsdWVBIDw9IHZh
bHVlQikKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRGYWlsZWRFcnJvcihgJHt0aGlzLnZh
bHVlQX0gc2hvdWxkIGdyZWF0ZXIgdGhhbiAke3ZhbHVlQn1gKTsKKyAgICB9CisKKyAgICBncmVh
dGVyVGhhbk9yRXF1YWxUbyh2YWx1ZUIpIHsKKyAgICAgICAgaWYgKHRoaXMudmFsdWVBIDwgdmFs
dWVCKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEZhaWxlZEVycm9yKGAke3RoaXMudmFs
dWVBfSBzaG91bGQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7dmFsdWVCfWApOworICAgIH0K
KworICAgIGxlc3NUaGFuKHZhbHVlQikgeworICAgICAgICBpZiAodGhpcy52YWx1ZUEgPj0gdmFs
dWVCKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEZhaWxlZEVycm9yKGAke3RoaXMudmFs
dWVBfSBzaG91bGQgbGVzcyB0aGFuICR7dmFsdWVCfWApOworICAgIH0KKworICAgIGxlc3NUaGFu
T3JFcXVhbFRvKHZhbHVlQikgeworICAgICAgICBpZiAodGhpcy52YWx1ZUEgPiB2YWx1ZUIpCisg
ICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNo
b3VsZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHt2YWx1ZUJ9YCk7CisgICAgfQorfQorCitmdW5j
dGlvbiBleHBlY3QodmFsdWUpIHsKKyAgICByZXR1cm4gbmV3IEV4cGVjdCh2YWx1ZSk7Cit9CisK
K2NsYXNzIFRlc3QgeworICAgIGV4cGVjdCh2YWx1ZSkgeworICAgICAgICByZXR1cm4gZXhwZWN0
KHZhbHVlKTsKKyAgICB9CisKKyAgICBzbGVlcChtcykgeworICAgICAgICByZXR1cm4gbmV3IFBy
b21pc2UoKHJlc29sdmUpID0+IHsKKyAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMp
OworICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgd2FpdEZvclNpZ25hbChzaW5nYWwsIG5h
bWUsIHRpbWVvdXQ9MTAwMCkgeworICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUs
IHJlamVjdCkgPT4geworICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKKyAgICAg
ICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZXIpOworICAgICAgICAgICAgICAg
IHJlc29sdmUoKTsKKyAgICAgICAgICAgICAgICBzaW5nYWwucmVtb3ZlTGlzdGVuZXIoaGFuZGxl
cik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY29uc3QgdGltZW91dEhhbmRsZXIgPSBz
ZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgICAgICAgICAgICBzaW5nYWwucmVtb3ZlTGlzdGVuZXIo
aGFuZGxlcik7CisgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBBc3NlcnRGYWlsZWRFcnJvcihg
Q2Fubm90IGdldCB0aGUgJHtuYW1lfSBzaWduYWwgYWZ0ZXIgJHt0aW1lb3V0fSBtc2ApKTsKKyAg
ICAgICAgICAgIH0sIHRpbWVvdXQpOworICAgICAgICAgICAgc2luZ2FsLmFkZExpc3RlbmVyKGhh
bmRsZXIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB3YWl0Rm9yUmVmTW91bnRlZChyZWYs
IHRpbWVvdXQ9MTAwMCkgeworICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yU2lnbmFsKHJlZi5v
bkVsZW1lbnRNb3VudCwgIm1vdW50IiwgdGltZW91dCk7CisgICAgfQorCisgICAgd2FpdEZvclJl
ZlVubW91bnRlZChyZWYsIHRpbWVvdXQ9MTAwMCkgeworICAgICAgICByZXR1cm4gdGhpcy53YWl0
Rm9yU2lnbmFsKHJlZi5vbkVsZW1lbnRVbm1vdW50LCAidW5tb3VudCIsIHRpbWVvdXQpOworICAg
IH0KKworICAgIHdhaXRGb3JTdGF0ZVVwZGF0ZWQocmVmLCB0aW1lb3V0PTEwMDApIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMud2FpdEZvclNpZ25hbChyZWYub25TdGF0ZVVwZGF0ZSwgInN0YXRlIHVw
ZGF0ZSIsIHRpbWVvdXQpOworICAgIH0KKworICAgIC8qQ29tbW9uIGludGVyZmFjZSovCisgICAg
YXN5bmMgc2V0dXAoKSB7fQorICAgIGFzeW5jIGNsZWFyVXAoKSB7fQorfQorCisKK2Z1bmN0aW9u
IGdldFRlc3RGdWNudGlvbk5hbWVzKHRlc3RPYmopIHsKKyAgICBjb25zdCBmaXhlZE1ldGhvZHMg
PSBuZXcgU2V0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFRlc3QucHJvdG90eXBlKSk7Cisg
ICAgY29uc3QgdGVzdE9iak1ldGhvZHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0
T2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7CisgICAgY29uc3QgdGVzdE1ldGhvZHMgPSBbXTsK
KyAgICBmb3IgKGxldCBtZXRob2Qgb2YgdGVzdE9iak1ldGhvZHMpIHsKKyAgICAgICAgaWYgKCFm
aXhlZE1ldGhvZHMuaGFzKG1ldGhvZCkpCisgICAgICAgICAgICB0ZXN0TWV0aG9kcy5wdXNoKG1l
dGhvZCk7CisgICAgfQorICAgIHJldHVybiB0ZXN0TWV0aG9kczsKK30KKworY29uc3QgVEVTVF9S
RVNVTFRfVFlQRSA9IE9iamVjdC5mcmVlemUoeworICAgIFN1Y2Nlc3M6IFN5bWJvbCgiU3VjY2Vz
cyIpLAorICAgIEVycm9yOiBTeW1ib2woIkVycm9yIiksCisgICAgRmFpbGVkOiBTeW1ib2woIkZh
aWxlZCIpLAorfSk7CisKK2NsYXNzIFRlc3RSZXN1bHQgeworICAgIGNvbnN0cnVjdG9yKGNsYXNz
TmFtZSwgZm5OYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAg
ICAgICB0aGlzLmZuTmFtZSA9IGZuTmFtZTsKKyAgICAgICAgdGhpcy5leGNlcHRpb24gPSBudWxs
OworICAgICAgICB0aGlzLnR5cGUgPSBURVNUX1JFU1VMVF9UWVBFLlN1Y2Nlc3M7CisgICAgfQor
ICAgIAorICAgIGNhdGNoRXhjZXB0aW9uKGUpIHsKKyAgICAgICAgdGhpcy5leGNlcHRpb24gPSBl
OworICAgICAgICBjb25zb2xlLmVycm9yKGUpOworICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEFz
c2VydEZhaWxlZEVycm9yKQorICAgICAgICAgICAgdGhpcy50eXBlID0gVEVTVF9SRVNVTFRfVFlQ
RS5GYWlsZWQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IFRFU1RfUkVT
VUxUX1RZUEUuRXJyb3I7CisgICAgfQorfQorCithc3luYyBmdW5jdGlvbiBnZXRUZXN0UmVzdWx0
KG9iaiwgZm5OYW1lLCBhcmdzID0gW10pIHsKKyAgICBjb25zdCByZXN1bHQgPSBuZXcgVGVzdFJl
c3VsdChvYmouY29uc3RydWN0b3IubmFtZSwgZm5OYW1lKTsKKyAgICB0cnkgeworICAgICAgICBh
d2FpdCBvYmpbZm5OYW1lXSguLi5hcmdzKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIHJl
c3VsdC5jYXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwor
Y2xhc3MgVGVzdENvbnRyb2xsZXIgeworICAgIGNvbnN0cnVjdG9yKHNldHVwQXJncykgeworICAg
ICAgICB0aGlzLmFsbFRlc3RzID0ge30KKyAgICAgICAgdGhpcy5yZXN1bHRzRXMgPSBuZXcgRXZl
bnRTdHJlYW0oKTsKKyAgICAgICAgdGhpcy5zZXR1cEFyZ3MgPSBBcnJheS5pc0FycmF5KHNldHVw
QXJncykgPyBzZXR1cEFyZ3MgOiBbXTsKKyAgICB9CisgICAgCisgICAgYWRkUmVzdWx0SGFuZGxl
cihoYW5kbGVyKSB7CisgICAgICAgIHRoaXMucmVzdWx0c0VzLmFjdGlvbihoYW5kbGVyKTsKKyAg
ICB9CisgICAgCisgICAgYWRkU2V0dXBBcmdzKGFyZ3MpIHsKKyAgICAgICAgdGhpcy5zZXR1cEFy
Z3MgPSB0aGlzLnNldHVwQXJncy5jb25jYXQoYXJncyk7CisgICAgfQorCisgICAgY29sbGVjdCh0
ZXN0Q2xhc3MpIHsKKyAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gbmV3IHRlc3RDbGFzcygp
OworICAgICAgICBjb25zdCB0ZXN0TmFtZSA9IHRlc3RJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1l
OworICAgICAgICBpZiAoIHRlc3ROYW1lIGluIHRoaXMuYWxsVGVzdHMpIHsKKyAgICAgICAgICAg
IHRocm93IG5ldyBFcnJvcihgJHt0ZXN0TmFtZX0gaGFzIGFscmVhZHkgYmVlbiBjb2xsZWN0ZWRg
KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFsbFRlc3RzW3Rlc3ROYW1lXSA9IHRlc3RJbnN0
YW5jZTsKKyAgICB9CisgICAgCisgICAgYXN5bmMgY29sbGVjdEZpbGUoZmlsZVBhdGgpIHsKKyAg
ICAgICAgY29uc3QgdGVzdE1vZHVsZSA9IGF3YWl0IGltcG9ydChmaWxlUGF0aCk7CisgICAgICAg
IE9iamVjdC5rZXlzKHRlc3RNb2R1bGUpLmZvckVhY2goY2xhc3NOYW1lID0+IHRoaXMuY29sbGVj
dCh0ZXN0TW9kdWxlW2NsYXNzTmFtZV0pKTsKKyAgICB9CisKKyAgICBhc3luYyBydW5UZXN0KHRl
c3ROYW1lLCBmbk5hbWUpIHsKKyAgICAgICAgbGV0IGhhdmVFcnJvciA9IGZhbHNlOworICAgICAg
ICBjb25zdCB0ZXN0SW5zdGFuY2UgPSB0aGlzLmFsbFRlc3RzW3Rlc3ROYW1lXTsKKyAgICAgICAg
Y29uc3QgdGVzdE1ldGhvZHMgPSBnZXRUZXN0RnVjbnRpb25OYW1lcyh0ZXN0SW5zdGFuY2UpOwor
ICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZ2V0VGVzdFJlc3VsdCh0ZXN0SW5zdGFuY2UsICJz
ZXR1cCIsIHRoaXMuc2V0dXBBcmdzKTsKKyAgICAgICAgdGhpcy5yZXN1bHRzRXMuYWRkKHJlc3Vs
dCk7CisgICAgICAgIGlmIChyZXN1bHQudHlwZSA9PT0gVEVTVF9SRVNVTFRfVFlQRS5TdWNjZXNz
KSB7CisgICAgICAgICAgICBmb3IgKGxldCB0ZXN0TWV0aG9kTmFtZSBvZiB0ZXN0TWV0aG9kcykg
eworICAgICAgICAgICAgICAgIGlmIChmbk5hbWUgJiYgZm5OYW1lICE9PSB0ZXN0TWV0aG9kTmFt
ZSkgCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXN1bHQg
PSBhd2FpdCBnZXRUZXN0UmVzdWx0KHRlc3RJbnN0YW5jZSwgdGVzdE1ldGhvZE5hbWUpOworICAg
ICAgICAgICAgICAgIHRoaXMucmVzdWx0c0VzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgICAg
IGlmIChyZXN1bHQudHlwZSAhPT0gVEVTVF9SRVNVTFRfVFlQRS5TdWNjZXNzKQorICAgICAgICAg
ICAgICAgICAgICBoYXZlRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVs
c2UgCisgICAgICAgICAgICBoYXZlRXJyb3IgPSB0cnVlOworICAgICAgICByZXN1bHQgPSBhd2Fp
dCBnZXRUZXN0UmVzdWx0KHRlc3RJbnN0YW5jZSwgImNsZWFyVXAiKTsKKyAgICAgICAgdGhpcy5y
ZXN1bHRzRXMuYWRkKHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQudHlwZSAhPT0gVEVTVF9S
RVNVTFRfVFlQRS5TdWNjZXNzKQorICAgICAgICAgICAgaGF2ZUVycm9yID0gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuIGhhdmVFcnJvcjsKKyAgICB9CisKKyAgICBhc3luYyBydW4odGVzdENsYXNzTmFt
ZSwgdGVzdEZuTmFtZSkgeworICAgICAgICBsZXQgaGF2ZUVycm9yID0gZmFsc2U7CisgICAgICAg
IGlmICh0ZXN0Q2xhc3NOYW1lKQorICAgICAgICAgICAgaGF2ZUVycnNvciA9IGF3YWl0IHRoaXMu
cnVuVGVzdCh0ZXN0Q2xhc3NOYW1lLCB0ZXN0Rm5OYW1lKTsKKyAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICBmb3IobGV0IHRlc3RDbGFzc05hbWUgb2YgT2JqZWN0LmtleXModGhpcy5hbGxUZXN0
cykpCisgICAgICAgICAgICAgICAgaGF2ZUVycm9yIHw9IGF3YWl0IHRoaXMucnVuVGVzdCh0ZXN0
Q2xhc3NOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmaW5hbFJlc3VsdCA9IG5ldyBU
ZXN0UmVzdWx0KCIiLCAiIik7CisgICAgICAgIGlmICghaGF2ZUVycm9yKQorICAgICAgICAgICAg
ZmluYWxSZXN1bHQudHlwZSA9IFRFU1RfUkVTVUxUX1RZUEUuU3VjY2VzczsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgZmluYWxSZXN1bHQudHlwZSA9IFRFU1RfUkVTVUxUX1RZUEUuRmFpbGVk
OworICAgICAgICB0aGlzLnJlc3VsdHNFcy5hZGQoZmluYWxSZXN1bHQpOworICAgIH0KK30KKwor
ZXhwb3J0IHtUZXN0LCBUZXN0Q29udHJvbGxlciwgVEVTVF9SRVNVTFRfVFlQRX0KZGlmZiAtLWdp
dCBhL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMv
Y29tcG9uZW50cy9UZXN0Q29tcG9uZW50cy5qcyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNk
YnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvY29tcG9uZW50cy9UZXN0Q29tcG9uZW50cy5qcwpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi45NzcxMTc5MTVhNmUyYzAyMjUxZjI3ZjYwNDIxZjdmOTc5NWExODMyCi0tLSAv
ZGV2L251bGwKKysrIGIvVG9vbHMvcmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMv
bGlicmFyeS9qcy9jb21wb25lbnRzL1Rlc3RDb21wb25lbnRzLmpzCkBAIC0wLDAgKzEsODcgQEAK
K2ltcG9ydCB7RE9NLCBSRUZ9IGZyb20gIi4uL1JlZi5qcyIKK2ltcG9ydCB7VGVzdENvbnRyb2xs
ZXIsIFRFU1RfUkVTVUxUX1RZUEV9IGZyb20gIi4uL1Rlc3QuanMiCisKKworZnVuY3Rpb24gVGVz
dEFwcCh0ZXN0Q29udHJvbGxlcikgeworICAgIHJldHVybiAoCisgICAgICAgIGA8ZGl2IGNsYXNz
PSJyb3cgY29udGVudCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtNiI+CisgICAgICAg
ICAgICAgICAgJHtUZXN0UmVzdWx0Q29uc29sZSh0ZXN0Q29udHJvbGxlcil9CisgICAgICAgICAg
ICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC02Ij4KKyAgICAgICAgICAgICR7
VGVzdFJlbmRlckFyZWEodGVzdENvbnRyb2xsZXIpfQorICAgICAgICAgICAgPC9kaXY+CisgICAg
ICAgIDwvZGl2PmAKKyAgICApOworfQorCitmdW5jdGlvbiBUZXN0UmVzdWx0KHRlc3RSZXN1bHQp
IHsKKyAgICBsZXQgc3RhdHVzQ2xhc3MgPSAic3VjY2VzcyI7CisgICAgbGV0IGRlc2NyaXB0aW9u
ID0gdGVzdFJlc3VsdC5jbGFzc05hbWUgPyAiUEFTUyIgOiAiQUxMIFBBU1MiOworICAgIHN3aXRj
aCAodGVzdFJlc3VsdC50eXBlKSB7CisgICAgICAgIGNhc2UgVEVTVF9SRVNVTFRfVFlQRS5GYWls
ZWQ6CisgICAgICAgICAgICBzdGF0dXNDbGFzcyA9ICJmYWlsZWQiOworICAgICAgICAgICAgZGVz
Y3JpcHRpb24gPSAiZmFpbGVkIgorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURVNUX1JF
U1VMVF9UWVBFLkVycm9yOgorICAgICAgICAgICAgc3RhdHVzQ2xhc3MgPSAiZXJyb3IiOworICAg
ICAgICAgICAgZGVzY3JpcHRpb24gPSAicmFpc2UgYW4gZXJyb3IiOworICAgICAgICBicmVhazsK
KyAgICB9CisgICAgcmV0dXJuICgKKyAgICAgICAgYAorICAgICAgICAgPGRpdiBjbGFzcz0idGV4
dCI+CisgICAgICAgICAke3Rlc3RSZXN1bHQuY2xhc3NOYW1lID8gIiIgOiAiPGhyPiJ9CisgICAg
ICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0IGJsb2NrIj4KKyAgICAgICAgICAgICAgICA8YSBocmVm
PSI/Y2xhc3NOYW1lPSR7dGVzdFJlc3VsdC5jbGFzc05hbWV9Ij4ke3Rlc3RSZXN1bHQuY2xhc3NO
YW1lfTwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4
dCBibG9jayI+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iP2NsYXNzTmFtZT0ke3Rlc3RSZXN1
bHQuY2xhc3NOYW1lfSZmbk5hbWU9JHt0ZXN0UmVzdWx0LmZuTmFtZX0iPiR7dGVzdFJlc3VsdC5m
bk5hbWV9PC9hPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0
ZXh0IGJsb2NrICR7c3RhdHVzQ2xhc3N9Ij4KKyAgICAgICAgICAgICAgICAke2Rlc2NyaXB0aW9u
fQorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAke3Rlc3RSZXN1bHQuZXhjZXB0aW9u
ID8gYAorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQgJHtzdGF0dXNDbGFzc30iPgor
ICAgICAgICAgICAgICAgICAgICA8cHJlPiR7dGVzdFJlc3VsdC5leGNlcHRpb24ubWVzc2FnZX1c
biR7dGVzdFJlc3VsdC5leGNlcHRpb24uc3RhY2t9PC9wcmU+CisgICAgICAgICAgICAgICAgPC9k
aXY+YCA6ICIifQorICAgICAgICA8L2Rpdj5gCisgICAgKTsKK30KKworZnVuY3Rpb24gVGVzdFJl
c3VsdENvbnNvbGUodGVzdENvbnRyb2xsZXIpIHsKKyAgICBjb25zdCByZWYgPSBSRUYuY3JlYXRl
UmVmKHsKKyAgICAgICAgb25TdGF0ZVVwZGF0ZTogKGVsZW1lbnQsIHN0YXRlRGlmZikgPT4gewor
ICAgICAgICAgICAgaWYgKHN0YXRlRGlmZi5hZGRUZXN0UmVzdWx0KSB7CisgICAgICAgICAgICAg
ICAgRE9NLmFwcGVuZChlbGVtZW50LCBUZXN0UmVzdWx0KHN0YXRlRGlmZi5hZGRUZXN0UmVzdWx0
KSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZURpZmYuYWRkVGVzdFJlc3VsdC5jbGFzc05h
bWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsX3JlcyA9ICJBTEwgUEFTUyI7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZURpZmYuYWRkVGVzdFJlc3VsdC50eXBlICE9PSBU
RVNUX1JFU1VMVF9UWVBFLlN1Y2Nlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9y
ZXMgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBgJHtm
aW5hbF9yZXN9YDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9KTsKKyAgICB0ZXN0Q29udHJvbGxlci5hZGRSZXN1bHRIYW5kbGVyKHRlc3RSZXN1bHQg
PT4gcmVmLnNldFN0YXRlKHthZGRUZXN0UmVzdWx0OiB0ZXN0UmVzdWx0fSkpOworICAgIHJldHVy
biBgPGRpdiByZWY9IiR7cmVmfSI+PC9kaXY+YDsKK30KKworCitmdW5jdGlvbiBUZXN0UmVuZGVy
QXJlYSh0ZXN0Q29udHJvbGxlcikgeworICAgIGNvbnN0IHJlZiA9IFJFRi5jcmVhdGVSZWYoewor
ICAgICAgICBvbkVsZW1lbnRNb3VudDogKGVsZW1lbnQpID0+IHsKKyAgICAgICAgICAgIHRlc3RD
b250cm9sbGVyLmFkZFNldHVwQXJncyhbZWxlbWVudF0pOworICAgICAgICAgICAgY29uc3QgdXJs
ID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24pOworICAgICAgICAgICAgY29uc3Qgc2VhcmNoUGFy
YW0gPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpOworICAgICAgICAgICAgY29uc3Qg
Y2xhc3NOYW1lID0gc2VhcmNoUGFyYW0uZ2V0KCJjbGFzc05hbWUiKTsKKyAgICAgICAgICAgIGlm
IChjbGFzc05hbWUpCisgICAgICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBjbGFzc05hbWU7
CisgICAgICAgICAgICBjb25zdCBmbk5hbWUgPSBzZWFyY2hQYXJhbS5nZXQoImZuTmFtZSIpOwor
ICAgICAgICAgICAgdGVzdENvbnRyb2xsZXIucnVuKGNsYXNzTmFtZSwgZm5OYW1lKQorICAgICAg
ICB9IAorICAgIH0pOworICAgIHJldHVybiBgPGRpdiByZWY9IiR7cmVmfSI+PC9kaXY+YDsKK30K
KworZXhwb3J0IHtUZXN0QXBwfTsKZGlmZiAtLWdpdCBhL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3Vs
dHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvdGVzdC9SZWZUZXN0LmpzIGIvVG9vbHMvcmVz
dWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy90ZXN0L1JlZlRlc3Qu
anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uYTk2MGY0ZmIwY2ZjODc2ZDczMzVkNmFjMTdhZDc4ZGQ2MGEwN2Q1NAot
LS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3Rh
dGljL2xpYnJhcnkvanMvdGVzdC9SZWZUZXN0LmpzCkBAIC0wLDAgKzEsMzAyIEBACitpbXBvcnQg
e1Rlc3R9IGZyb20gJy4uL1Rlc3QuanMnOworaW1wb3J0IHtSRUYsIERPTSwgZGlmZiwgRlAsIEV2
ZW50U3RyZWFtfSBmcm9tICcuLi9SZWYuanMnOworCitjbGFzcyBEaWZmVGVzdCBleHRlbmRzIFRl
c3QgeworICAgIHRlc3RBcnJheURpZmYoKSB7CisgICAgICAgIGxldCByZW1vdmVkID0gW107Cisg
ICAgICAgIGxldCBuZXdBcnJheSA9IFtdOworICAgICAgICBkaWZmKFsxLCAyLCAzXSwgWzQsIDUs
IDZdLCBpdGVtID0+IHJlbW92ZWQucHVzaChpdGVtKSwgaXRlbSA9PiBuZXdBcnJheS5wdXNoKGl0
ZW0pKTsKKyAgICAgICAgdGhpcy5leHBlY3QocmVtb3ZlZCkuZXF1YWxUb0FycmF5KFsxLCAyLCAz
XSk7CisgICAgICAgIHRoaXMuZXhwZWN0KG5ld0FycmF5KS5lcXVhbFRvQXJyYXkoWzQsIDUsIDZd
KTsKKworICAgICAgICByZW1vdmVkID0gW107CisgICAgICAgIG5ld0FycmF5ID0gW107CisgICAg
ICAgIGRpZmYoWzEsIDIsIDNdLCBbMiwgMywgNF0sIGl0ZW0gPT4gcmVtb3ZlZC5wdXNoKGl0ZW0p
LCBpdGVtID0+IG5ld0FycmF5LnB1c2goaXRlbSkpOworICAgICAgICB0aGlzLmV4cGVjdChyZW1v
dmVkKS5lcXVhbFRvQXJyYXkoWzFdKTsKKyAgICAgICAgdGhpcy5leHBlY3QobmV3QXJyYXkpLmVx
dWFsVG9BcnJheShbMiwgMywgNF0pOworCisgICAgICAgIHJlbW92ZWQgPSBbXTsKKyAgICAgICAg
bmV3QXJyYXkgPSBbXTsKKyAgICAgICAgZGlmZihbMl0sIFsyLCAzLCA0XSwgaXRlbSA9PiByZW1v
dmVkLnB1c2goaXRlbSksIGl0ZW0gPT4gbmV3QXJyYXkucHVzaChpdGVtKSk7CisgICAgICAgIHRo
aXMuZXhwZWN0KHJlbW92ZWQpLmVxdWFsVG9BcnJheShbXSk7CisgICAgICAgIHRoaXMuZXhwZWN0
KG5ld0FycmF5KS5lcXVhbFRvQXJyYXkoWzIsIDMsIDRdKTsKKworICAgICAgICByZW1vdmVkID0g
W107CisgICAgICAgIG5ld0FycmF5ID0gW107CisgICAgICAgIGRpZmYoW10sIFsyLCAzLCA0XSwg
aXRlbSA9PiByZW1vdmVkLnB1c2goaXRlbSksIGl0ZW0gPT4gbmV3QXJyYXkucHVzaChpdGVtKSk7
CisgICAgICAgIHRoaXMuZXhwZWN0KHJlbW92ZWQpLmVxdWFsVG9BcnJheShbXSk7CisgICAgICAg
IHRoaXMuZXhwZWN0KG5ld0FycmF5KS5lcXVhbFRvQXJyYXkoWzIsIDMsIDRdKTsKKyAgICAgICAg
CisgICAgICAgIHJlbW92ZWQgPSBbXTsKKyAgICAgICAgbmV3QXJyYXkgPSBbXTsKKyAgICAgICAg
ZGlmZihbNCwgMywgMl0sIFsyLCAzLCA0XSwgaXRlbSA9PiByZW1vdmVkLnB1c2goaXRlbSksIGl0
ZW0gPT4gbmV3QXJyYXkucHVzaChpdGVtKSk7CisgICAgICAgIHRoaXMuZXhwZWN0KHJlbW92ZWQp
LmVxdWFsVG9BcnJheShbXSk7CisgICAgICAgIHRoaXMuZXhwZWN0KG5ld0FycmF5KS5lcXVhbFRv
QXJyYXkoWzIsIDMsIDRdKTsKKyAgICAgICAgCisgICAgICAgIHJlbW92ZWQgPSBbXTsKKyAgICAg
ICAgbmV3QXJyYXkgPSBbXTsKKyAgICAgICAgZGlmZihbNCwgMywgMiwgNSwgNl0sIFsyLCAzLCA0
XSwgaXRlbSA9PiByZW1vdmVkLnB1c2goaXRlbSksIGl0ZW0gPT4gbmV3QXJyYXkucHVzaChpdGVt
KSk7CisgICAgICAgIHRoaXMuZXhwZWN0KHJlbW92ZWQpLmVxdWFsVG9BcnJheShbNSwgNl0pOwor
ICAgICAgICB0aGlzLmV4cGVjdChuZXdBcnJheSkuZXF1YWxUb0FycmF5KFsyLCAzLCA0XSk7Cisg
ICAgICAgIAorICAgICAgICByZW1vdmVkID0gW107CisgICAgICAgIG5ld0FycmF5ID0gW107Cisg
ICAgICAgIGRpZmYoW10sIFtdLCBpdGVtID0+IHJlbW92ZWQucHVzaChpdGVtKSwgaXRlbSA9PiBu
ZXdBcnJheS5wdXNoKGl0ZW0pKTsKKyAgICAgICAgdGhpcy5leHBlY3QocmVtb3ZlZCkuZXF1YWxU
b0FycmF5KFtdKTsKKyAgICAgICAgdGhpcy5leHBlY3QobmV3QXJyYXkpLmVxdWFsVG9BcnJheShb
XSk7CisgICAgfQorfQorCitjbGFzcyBEb21UZXN0IGV4dGVuZHMgVGVzdCB7CisgICAgc2V0dXAo
cm9vdEVsZW1lbnQpIHsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50Owor
ICAgIH0KKworICAgIHRlc3RJbmplY3QoKSB7CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaW5u
ZXJIVE1MID0gIiI7CisgICAgICAgIGNvbnN0IGluamVjdG9yID0gYDxkaXYgaWQ9IiR7TWF0aC5y
YW5kb20oKX0iPjwvZGl2PmA7CisgICAgICAgIERPTS5pbmplY3QodGhpcy5yb290RWxlbWVudCwg
aW5qZWN0b3IpOworICAgICAgICB0aGlzLmV4cGVjdCh0aGlzLnJvb3RFbGVtZW50LmlubmVySFRN
TCkuZXF1YWxUb1ZhbHVlKGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5l
ckhUTUwgPSAiIjsKKyAgICB9CisKKyAgICB0ZXN0QmVmb3JlKCkgeworICAgICAgICBsZXQgaW5p
dGlhbCA9ICc8ZGl2IGlkPSIxIj48L2Rpdj48ZGl2IGlkPSIyIj48L2Rpdj48ZGl2IGlkPSIzIj48
L2Rpdj4nOyAKKyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0aWFsOwor
ICAgICAgICBsZXQgaW5qZWN0b3IgPSBgPGRpdiBpZD0iJHtNYXRoLnJhbmRvbSgpfSI+PC9kaXY+
YDsKKyAgICAgICAgRE9NLmJlZm9yZSh0aGlzLnJvb3RFbGVtZW50LmNoaWxkcmVuWzBdLCBpbmpl
Y3Rvcik7CisgICAgICAgIHRoaXMuZXhwZWN0KHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MKS5l
cXVhbFRvVmFsdWUoYCR7aW5qZWN0b3J9JHtpbml0aWFsfWApOworICAgICAgICB0aGlzLnJvb3RF
bGVtZW50LmlubmVySFRNTCA9IGluaXRpYWw7CisgICAgICAgIERPTS5iZWZvcmUodGhpcy5yb290
RWxlbWVudC5jaGlsZHJlblsxXSwgaW5qZWN0b3IpOworICAgICAgICB0aGlzLmV4cGVjdCh0aGlz
LnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGA8ZGl2IGlkPSIxIj48L2Rpdj4k
e2luamVjdG9yfTxkaXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2PmApOworICAgICAg
ICB0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCA9IGluaXRpYWw7CisgICAgICAgIERPTS5iZWZv
cmUodGhpcy5yb290RWxlbWVudC5jaGlsZHJlblsyXSwgaW5qZWN0b3IpOworICAgICAgICB0aGlz
LmV4cGVjdCh0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGA8ZGl2IGlk
PSIxIj48L2Rpdj48ZGl2IGlkPSIyIj48L2Rpdj4ke2luamVjdG9yfTxkaXYgaWQ9IjMiPjwvZGl2
PmApOworICAgIH0KKworICAgIHRlc3RBZnRlcigpIHsKKyAgICAgICAgbGV0IGluaXRpYWwgPSAn
PGRpdiBpZD0iMSI+PC9kaXY+PGRpdiBpZD0iMiI+PC9kaXY+PGRpdiBpZD0iMyI+PC9kaXY+Jzsg
CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gaW5pdGlhbDsKKyAgICAgICAg
bGV0IGluamVjdG9yID0gYDxkaXYgaWQ9IiR7TWF0aC5yYW5kb20oKX0iPjwvZGl2PmA7CisgICAg
ICAgIERPTS5hZnRlcih0aGlzLnJvb3RFbGVtZW50LmNoaWxkcmVuWzBdLCBpbmplY3Rvcik7Cisg
ICAgICAgIHRoaXMuZXhwZWN0KHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MKS5lcXVhbFRvVmFs
dWUoYDxkaXYgaWQ9IjEiPjwvZGl2PiR7aW5qZWN0b3J9PGRpdiBpZD0iMiI+PC9kaXY+PGRpdiBp
ZD0iMyI+PC9kaXY+YCk7CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gaW5p
dGlhbDsKKyAgICAgICAgRE9NLmFmdGVyKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMV0sIGlu
amVjdG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwp
LmVxdWFsVG9WYWx1ZShgPGRpdiBpZD0iMSI+PC9kaXY+PGRpdiBpZD0iMiI+PC9kaXY+JHtpbmpl
Y3Rvcn08ZGl2IGlkPSIzIj48L2Rpdj5gKTsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5l
ckhUTUwgPSBpbml0aWFsOworICAgICAgICBET00uYWZ0ZXIodGhpcy5yb290RWxlbWVudC5jaGls
ZHJlblsyXSwgaW5qZWN0b3IpOworICAgICAgICB0aGlzLmV4cGVjdCh0aGlzLnJvb3RFbGVtZW50
LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGAke2luaXRpYWx9JHtpbmplY3Rvcn1gKTsKKyAgICB9
CisKKyAgICB0ZXN0UHJlcGVuZCgpIHsKKyAgICAgICAgbGV0IGluaXRpYWwgPSAnPGRpdiBpZD0i
MSI+PC9kaXY+PGRpdiBpZD0iMiI+PC9kaXY+PGRpdiBpZD0iMyI+PC9kaXY+JzsgCisgICAgICAg
IHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gaW5pdGlhbDsKKyAgICAgICAgbGV0IGluamVj
dG9yID0gYDxkaXYgaWQ9IiR7TWF0aC5yYW5kb20oKX0iPjwvZGl2PmA7CisgICAgICAgIERPTS5w
cmVwZW5kKHRoaXMucm9vdEVsZW1lbnQsIGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3Qo
dGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwpLmVxdWFsVG9WYWx1ZShgJHtpbmplY3Rvcn0ke2lu
aXRpYWx9YCk7CisgICAgfQorCisgICAgdGVzdEFwcGVuZCgpIHsKKyAgICAgICAgbGV0IGluaXRp
YWwgPSAnPGRpdiBpZD0iMSI+PC9kaXY+PGRpdiBpZD0iMiI+PC9kaXY+PGRpdiBpZD0iMyI+PC9k
aXY+JzsgCisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gaW5pdGlhbDsKKyAg
ICAgICAgbGV0IGluamVjdG9yID0gYDxkaXYgaWQ9IiR7TWF0aC5yYW5kb20oKX0iPjwvZGl2PmA7
CisgICAgICAgIERPTS5hcHBlbmQodGhpcy5yb290RWxlbWVudCwgaW5qZWN0b3IpOworICAgICAg
ICB0aGlzLmV4cGVjdCh0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGAk
e2luaXRpYWx9JHtpbmplY3Rvcn1gKTsKKyAgICB9CisgICAgCisgICAgdGVzdFJlcGxhY2UoKSB7
CisgICAgICAgIGxldCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2PjxkaXYgaWQ9IjIiPjwv
ZGl2PjxkaXYgaWQ9IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmlubmVy
SFRNTCA9IGluaXRpYWw7CisgICAgICAgIGxldCBpbmplY3RvciA9IGA8ZGl2IGlkPSIke01hdGgu
cmFuZG9tKCl9Ij48L2Rpdj5gOworICAgICAgICBET00ucmVwbGFjZSh0aGlzLnJvb3RFbGVtZW50
LmNoaWxkcmVuWzBdLCBpbmplY3Rvcik7CisgICAgICAgIHRoaXMuZXhwZWN0KHRoaXMucm9vdEVs
ZW1lbnQuaW5uZXJIVE1MKS5lcXVhbFRvVmFsdWUoYCR7aW5qZWN0b3J9PGRpdiBpZD0iMiI+PC9k
aXY+PGRpdiBpZD0iMyI+PC9kaXY+YCk7CisgICAgfQorICAgIAorICAgIHRlc3RSZW1vdmUoKSB7
CisgICAgICAgIGxldCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2PjxkaXYgaWQ9IjIiPjwv
ZGl2PjxkaXYgaWQ9IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmlubmVy
SFRNTCA9IGluaXRpYWw7CisgICAgICAgIERPTS5yZW1vdmUodGhpcy5yb290RWxlbWVudC5jaGls
ZHJlblswXSk7CisgICAgICAgIHRoaXMuZXhwZWN0KHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1M
KS5lcXVhbFRvVmFsdWUoYDxkaXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2PmApOwor
ICAgIH0KK30KKworY2xhc3MgUmVmVGVzdCBleHRlbmRzIFRlc3QgeworICAgIHNldHVwKHJvb3RF
bGVtZW50KSB7CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSByb290RWxlbWVudDsKKyAgICB9
CisKKyAgICBhc3luYyB0ZXN0T25FbGVtZW50TW91bnQoKSB7CisgICAgICAgIGxldCB0cmlnZ2Vy
ZWQgPSBmYWxzZTsKKyAgICAgICAgbGV0IGN1cnJlbnRSZWYgPSBudWxsOworICAgICAgICBjb25z
dCBjcmVhdEFDb21wb25lbnQgPSAoKSA9PiB7CisgICAgICAgICAgICBsZXQgcmVmID0gUkVGLmNy
ZWF0ZVJlZih7CisgICAgICAgICAgICAgICAgb25FbGVtZW50TW91bnQ6IChlbGVtZW50KSA9PiB7
CisgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjdXJyZW50UmVmID0gcmVmOworICAgICAg
ICAgICAgcmV0dXJuIGA8ZGl2IHJlZj0iJHtyZWZ9Ij48L2Rpdj5gOworICAgICAgICB9OworICAg
ICAgICAgICAgCisgICAgICAgIGNvbnN0IGZpcnN0Q29tcCA9IGNyZWF0QUNvbXBvbmVudCgpOwor
ICAgICAgICBET00uaW5qZWN0KHRoaXMucm9vdEVsZW1lbnQsIGZpcnN0Q29tcCk7CisgICAgICAg
IGF3YWl0IHRoaXMud2FpdEZvclJlZk1vdW50ZWQoY3VycmVudFJlZik7CisgICAgICAgIHRoaXMu
ZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKHRydWUpOworICAgICAgICB0aGlzLmV4cGVj
dChjdXJyZW50UmVmLmVsZW1lbnQub3V0ZXJIVE1MKS5lcXVhbFRvVmFsdWUoZmlyc3RDb21wKTsK
KworICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgY29uc3Qgc2Vjb25kQ29tcCA9
IGNyZWF0QUNvbXBvbmVudCgpOworICAgICAgICBET00ucmVwbGFjZSh0aGlzLnJvb3RFbGVtZW50
LmNoaWxkcmVuWzBdLCBzZWNvbmRDb21wKTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yUmVm
TW91bnRlZChjdXJyZW50UmVmKTsKKyAgICAgICAgdGhpcy5leHBlY3QodHJpZ2dlcmVkKS5lcXVh
bFRvVmFsdWUodHJ1ZSk7CisgICAgICAgIHRoaXMuZXhwZWN0KGN1cnJlbnRSZWYuZWxlbWVudC5v
dXRlckhUTUwpLmVxdWFsVG9WYWx1ZShzZWNvbmRDb21wKTsKKyAgICB9CisKKyAgICBhc3luYyB0
ZXN0T25FbGVtZW50VW5tb3VudCgpIHsKKyAgICAgICAgbGV0IHRyaWdnZXJlZCA9IGZhbHNlOwor
ICAgICAgICBsZXQgY3VycmVudFJlZiA9IG51bGw7CisgICAgICAgIGNvbnN0IGNyZWF0QUNvbXBv
bmVudCA9ICgpID0+IHsKKyAgICAgICAgICAgIGxldCByZWYgPSBSRUYuY3JlYXRlUmVmKHsKKyAg
ICAgICAgICAgICAgICBvbkVsZW1lbnRVbm1vdW50OiAoZWxlbWVudCkgPT4geworICAgICAgICAg
ICAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0pOworICAgICAgICAgICAgY3VycmVudFJlZiA9IHJlZjsKKyAgICAgICAgICAgIHJldHVy
biBgPGRpdiByZWY9IiR7cmVmfSI+PC9kaXY+YDsKKyAgICAgICAgfTsKKworICAgICAgICBjb25z
dCBmaXJzdENvbXAgPSBjcmVhdEFDb21wb25lbnQoKTsKKyAgICAgICAgRE9NLmluamVjdCh0aGlz
LnJvb3RFbGVtZW50LCBmaXJzdENvbXApOworICAgICAgICBET00ucmVwbGFjZSh0aGlzLnJvb3RF
bGVtZW50LmNoaWxkcmVuWzBdLCAiPGRpdj48L2Rpdj4iKTsKKyAgICAgICAgYXdhaXQgdGhpcy53
YWl0Rm9yUmVmVW5tb3VudGVkKGN1cnJlbnRSZWYpOworICAgICAgICB0aGlzLmV4cGVjdCh0cmln
Z2VyZWQpLmVxdWFsVG9WYWx1ZSh0cnVlKTsKKyAgICAgICAgdGhpcy5leHBlY3QoY3VycmVudFJl
Zi5lbGVtZW50LnBhcmVudEVsZW1lbnQpLmVxdWFsVG9WYWx1ZShudWxsKTsKKworICAgICAgICB0
cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgRE9NLmluamVjdCh0aGlzLnJvb3RFbGVtZW50LCBm
aXJzdENvbXApOworICAgICAgICBET00ucmVtb3ZlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5b
MF0pOworICAgICAgICBsZXQgZXhwZWN0ZWRFID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAg
ICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlZlVubW91bnRlZChjdXJyZW50UmVmKTsKKyAgICAg
ICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgLy8gZGVzdG9yaWVkIHJlZiB3b24ndCBiZSB0
cmlnZ2VyZWQKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVl
KGZhbHNlKTsKKyAgICAgICAgICAgIGV4cGVjdGVkRSA9IGU7CisgICAgICAgIH0KKyAgICAgICAg
dGhpcy5leHBlY3QoZXhwZWN0ZWRFKS5ub3RFcXVhbFRvVmFsdWUobnVsbCk7CisgICAgICAgIAor
ICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgY29uc3Qgc2Vjb25kQ29tcCA9IGNy
ZWF0QUNvbXBvbmVudCgpOworICAgICAgICBET00uaW5qZWN0KHRoaXMucm9vdEVsZW1lbnQsIHNl
Y29uZENvbXApOworICAgICAgICBET00ucmVtb3ZlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5b
MF0pOworICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JSZWZVbm1vdW50ZWQoY3VycmVudFJlZik7
CisgICAgICAgIHRoaXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKHRydWUpOworICAg
ICAgICB0aGlzLmV4cGVjdChjdXJyZW50UmVmLmVsZW1lbnQucGFyZW50RWxlbWVudCkuZXF1YWxU
b1ZhbHVlKG51bGwpOworICAgIH0KKyAgICAKKyAgICBhc3luYyB0ZXN0T25Db21wbGV4U3RhdGVV
cGRhdGUoKSB7CisgICAgICAgIGxldCB2ZXJpZmllciA9IG51bGw7CisgICAgICAgIGxldCB0cmln
Z2VyZWQgPSBmYWxzZTsKKyAgICAgICAgbGV0IGV4cGVjdGVkRSA9IG51bGw7CisgICAgICAgIGxl
dCBpbml0aWFsU3RhdGUgPSB7CisgICAgICAgICAgICBpbml0aWFsU3RhdGU6IE1hdGgucmFuZG9t
KCkKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHJlZiA9IFJFRi5jcmVhdGVSZWYoeworICAgICAg
ICAgICAgb25TdGF0ZVVwZGF0ZTooZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0ZSkgPT4geworICAg
ICAgICAgICAgICAgIGlmICh2ZXJpZmllcikgdmVyaWZpZXIoZWxlbWVudCwgc3RhdGVEaWZmLCBz
dGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZWYuc2V0U3RhdGUo
aW5pdGlhbFN0YXRlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF3YWl0IHRoaXMud2Fp
dEZvclN0YXRlVXBkYXRlZChyZWYpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAg
ICBleHBlY3RlZEUgPSBlOworICAgICAgICB9CisgICAgICAgIC8vIGJlZm9yZSBlbGVtZW50IG1v
dW50LCB3ZSBkb24ndCB0cmlnZ2VyIHN0YXRlIHVwZGF0ZSBjYWxsYmFjaywgd2UganVzdCBzYXZl
IHRoZSBzdGF0ZQorICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZShm
YWxzZSk7CisgICAgICAgIHRoaXMuZXhwZWN0KGV4cGVjdGVkRSkubm90RXF1YWxUb1ZhbHVlKG51
bGwpOworICAgICAgICB0aGlzLmV4cGVjdChyZWYuc3RhdGUuaW5pdGlhbFN0YXRlKS5lcXVhbFRv
VmFsdWUoaW5pdGlhbFN0YXRlLmluaXRpYWxTdGF0ZSk7CisgICAgICAgIC8vIEVhY2ggdGltZSBp
dCB3aWxsIGNyZWF0ZSBhIG5ldyBzdGF0ZSBvYmplY3QKKyAgICAgICAgdGhpcy5leHBlY3QocmVm
LnN0YXRlKS5ub3RFcXVhbFRvVmFsdWUoaW5pdGlhbFN0YXRlKTsKKyAgICAgICAgCisgICAgICAg
IERPTS5pbmplY3QodGhpcy5yb290RWxlbWVudCwgYDxkaXYgcmVmPSIke3JlZn0iPjwvZGl2PmAp
OworICAgICAgICB2ZXJpZmllciA9IChlbGVtZW50LCBzdGF0ZURpZmYsIHN0YXRlKSA9PiB7Cisg
ICAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5leHBlY3Qoc3Rh
dGVEaWZmLmluaXRpYWxTdGF0ZSkuZXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0ZS5pbml0aWFsU3Rh
dGUpOworICAgICAgICAgICAgdGhpcy5leHBlY3Qoc3RhdGUuZmFrZVN0YXRlKS5lcXVhbFRvVmFs
dWUodW5kZWZpbmVkKTsKKyAgICAgICAgfTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yU3Rh
dGVVcGRhdGVkKHJlZik7CisgICAgICAgIHRoaXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1Zh
bHVlKHRydWUpOworICAgICAgICAKKyAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAg
IGxldCBmYWtlU3RhdGUgPSB7CisgICAgICAgICAgICBmYWtlU3RhdGU6IE1hdGgucmFuZG9tKCkK
KyAgICAgICAgfTsKKyAgICAgICAgdmVyaWZpZXIgPSAoZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0
ZSkgPT4geworICAgICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMu
ZXhwZWN0KHN0YXRlRGlmZi5mYWtlU3RhdGUpLmVxdWFsVG9WYWx1ZShmYWtlU3RhdGUuZmFrZVN0
YXRlKTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlLmZha2VTdGF0ZSkuZXF1YWxUb1Zh
bHVlKHVuZGVmaW5lZCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0
YXRlLmluaXRpYWxTdGF0ZSkuZXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0ZS5pbml0aWFsU3RhdGUp
OworICAgICAgICAgICAgdGhpcy5leHBlY3Qoc3RhdGVEaWZmLmluaXRpYWxTdGF0ZSkuZXF1YWxU
b1ZhbHVlKHVuZGVmaW5lZCk7CisgICAgICAgIH07CisgICAgICAgIHJlZi5zZXRTdGF0ZShmYWtl
U3RhdGUpOworICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGF0ZVVwZGF0ZWQocmVmKTsKKyAg
ICAgICAgdGhpcy5leHBlY3QocmVmLnN0YXRlLmZha2VTdGF0ZSkuZXF1YWxUb1ZhbHVlKGZha2VT
dGF0ZS5mYWtlU3RhdGUpOworICAgICAgICB0aGlzLmV4cGVjdChyZWYuc3RhdGUuaW5pdGlhbFN0
YXRlKS5lcXVhbFRvVmFsdWUoaW5pdGlhbFN0YXRlLmluaXRpYWxTdGF0ZSk7CisgICAgICAgIHRo
aXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKHRydWUpOworICAgIH0KKyAgICAKKyAg
ICBhc3luYyB0ZXN0T25WYWx1ZVN0YXRlVXBkYXRlKCkgeworICAgICAgICBsZXQgdHJpZ2dlcmVk
ID0gZmFsc2U7CisgICAgICAgIGxldCB2ZXJpZmllciA9IG51bGw7CisgICAgICAgIGNvbnN0IGlu
aXRpYWxTdGF0ZSA9IE1hdGgucmFuZG9tKCk7CisgICAgICAgIGNvbnN0IHJlZiA9IFJFRi5jcmVh
dGVSZWYoeworICAgICAgICAgICAgc3RhdGU6IGluaXRpYWxTdGF0ZSwKKyAgICAgICAgICAgIG9u
U3RhdGVVcGRhdGU6KGVsZW1lbnQsIHN0YXRlRGlmZiwgc3RhdGUpID0+IHsKKyAgICAgICAgICAg
ICAgICBpZiAodmVyaWZpZXIpIHZlcmlmaWVyKGVsZW1lbnQsIHN0YXRlRGlmZiwgc3RhdGUpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdmVyaWZpZXIgPSAoZWxlbWVudCwg
c3RhdGVEaWZmLCBzdGF0ZSkgPT4geworICAgICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTsKKyAg
ICAgICAgICAgIHRoaXMuZXhwZWN0KGVsZW1lbnQpLm5vdEVxdWFsVG9WYWx1ZShudWxsKTsKKyAg
ICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlRGlmZikuZXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0
ZSk7CisgICAgICAgIH0KKyAgICAgICAgRE9NLmluamVjdCh0aGlzLnJvb3RFbGVtZW50LCBgPGRp
diByZWY9IiR7cmVmfSI+PC9kaXY+YCk7CisgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXRl
VXBkYXRlZChyZWYpOworICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1
ZSh0cnVlKTsKKworICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IG51bGw7CisgICAgICAgIHRyaWdn
ZXJlZCA9IGZhbHNlOworICAgICAgICB2ZXJpZmllciA9IChlbGVtZW50LCBzdGF0ZURpZmYsIHN0
YXRlKSA9PiB7CisgICAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlOworICAgICAgICAgICAgdGhp
cy5leHBlY3Qoc3RhdGVEaWZmKS5lcXVhbFRvVmFsdWUobmV3U3RhdGUpOworICAgICAgICAgICAg
dGhpcy5leHBlY3Qoc3RhdGUpLmVxdWFsVG9WYWx1ZShpbml0aWFsU3RhdGUpOworICAgICAgICB9
CisgICAgICAgIHJlZi5zZXRTdGF0ZShuZXdTdGF0ZSk7CisgICAgICAgIGF3YWl0IHRoaXMud2Fp
dEZvclN0YXRlVXBkYXRlZChyZWYpOworICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVx
dWFsVG9WYWx1ZSh0cnVlKTsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IG5ld1N0YXRlMSA9IDA7
CisgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICB2ZXJpZmllciA9IChlbGVtZW50
LCBzdGF0ZURpZmYsIHN0YXRlKSA9PiB7CisgICAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlOwor
ICAgICAgICAgICAgdGhpcy5leHBlY3Qoc3RhdGVEaWZmKS5lcXVhbFRvVmFsdWUobmV3U3RhdGUx
KTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlKS5lcXVhbFRvVmFsdWUobmV3U3RhdGUp
OworICAgICAgICB9CisgICAgICAgIHJlZi5zZXRTdGF0ZShuZXdTdGF0ZTEpOworICAgICAgICBh
d2FpdCB0aGlzLndhaXRGb3JTdGF0ZVVwZGF0ZWQocmVmKTsKKyAgICAgICAgdGhpcy5leHBlY3Qo
dHJpZ2dlcmVkKS5lcXVhbFRvVmFsdWUodHJ1ZSk7CisgICAgICAgIAorICAgICAgICBjb25zdCBu
ZXdTdGF0ZTIgPSB1bmRlZmluZWQ7CisgICAgICAgIGxldCBleHBlY3RlZEUgPSBudWxsOworICAg
ICAgICByZWYuc2V0U3RhdGUobmV3U3RhdGUxKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAg
IGF3YWl0IHRoaXMud2FpdEZvclN0YXRlVXBkYXRlZChyZWYpOworICAgICAgICB9IGNhdGNoKGUp
IHsKKyAgICAgICAgICAgIGV4cGVjdGVkRSA9IGU7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5l
eHBlY3QoZXhwZWN0ZWRFKS5ub3RFcXVhbFRvVmFsdWUobnVsbCk7CisgICAgfQorfQorZXhwb3J0
IHtEaWZmVGVzdCwgRG9tVGVzdCwgUmVmVGVzdH07CmRpZmYgLS1naXQgYS9Ub29scy9yZXN1bHRz
ZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvaW5kZXguaHRtbCBi
L1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvdGVz
dC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjE0OTYxOGNlNDVmYmUwZjUxYTllMzU2ZjkyNjdkNjU2
MjY1MzJjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJw
eS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvaW5kZXguaHRtbApAQCAtMCwwICsxLDI1IEBA
Cis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+VGVz
dDwvdGl0bGU+CisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9y
ZXN1bHRzLnNhZmFyaS5hcHBsZS5jb20vbGlicmFyeS9jc3Mvd2Via2l0LmNzcyI+PC9saW5rPgor
ICAgICAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHNpemVzPSIzMngzMiIgdHlwZT0iaW1h
Z2UveC1pY29uIiBocmVmPSJodHRwczovL3dlYmtpdC5vcmcvZmF2aWNvbi5pY28iPgorICAgICAg
ICA8bWV0YSBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgdmll
d3BvcnQtZml0PWNvdmVyIiBuYW1lPSJ2aWV3cG9ydCI+CisgICAgICAgIDxtZXRhIGNoYXJzZXQ9
IlVURi04Ij4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgICAgIDxkaXYgaWQ9ImFwcCI+
PC9kaXY+CisgICAgICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIj4KKyAgICAgICAgICAgIGltcG9y
dCB7RE9NfSBmcm9tICIuLi9SZWYuanMiOworICAgICAgICAgICAgaW1wb3J0IHtUZXN0Q29udHJv
bGxlcn0gZnJvbSAiLi4vVGVzdC5qcyI7CisgICAgICAgICAgICBpbXBvcnQge1Rlc3RBcHB9IGZy
b20gIi4uL2NvbXBvbmVudHMvVGVzdENvbXBvbmVudHMuanMiOworICAgICAgICAgICAgY29uc3Qg
dGVzdENvbnRyb2xsZXIgPSBuZXcgVGVzdENvbnRyb2xsZXIoKTsKKyAgICAgICAgICAgIGFzeW5j
IGZ1bmN0aW9uIG1haW4oKSB7CisgICAgICAgICAgICAgICAgLy8gVGVzdCBmaWxlIGxpc3Q6IFJv
b3QgUGF0aCB3aWxsIGJlIFRlc3QuanMncyBmb2xkZXIKKyAgICAgICAgICAgICAgICBhd2FpdCB0
ZXN0Q29udHJvbGxlci5jb2xsZWN0RmlsZSgiLi90ZXN0L1JlZlRlc3QuanMiKTsKKyAgICAgICAg
ICAgICAgICBET00uaW5qZWN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhcHAiKSwgVGVzdEFw
cCh0ZXN0Q29udHJvbGxlcikpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1haW4oKTsK
KyAgICAgICAgPC9zY3JpcHQ+CisgICAgPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>379053</attachid>
            <date>2019-09-18 11:44:14 -0700</date>
            <delta_ts>2019-09-20 13:38:30 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-201778-20190918114413.patch</filename>
            <type>text/plain</type>
            <size>29874</size>
            <attacher name="Zhifei Fang">zhifei_fang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjQ5NTkyCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYWYwNGM1ZWVjNDc0NTQ2OGIwYWM5M2EwMjY3MWYzYWVm
NjIxNzM0Zi4uMDU5ZmM3NzU1NTVkMGRhZTI4ODg2OWIxOWU3MmUzOGQyNTgwNDMyNSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ5
IEBACisyMDE5LTA5LTEzICBaaGlmZWkgRmFuZyAgPHpoaWZlaV9mYW5nQGFwcGxlLmNvbT4KKwor
ICAgICAgICBBZGQgdGVzdHMgZm9yIFJlZi5qcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMTc3OC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHJlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3Rh
dGljL2xpYnJhcnkvanMvUmVmLmpzOgorICAgICAgICAoYXBwbHlTdGF0ZURpZmYpOiBGb3Igc2lu
Z2FsIHZhbHVlLCBudWxsLCAwLCBmYWxzZSB0aG9zZSBhcmUgc3RpbGwgdmFsaWQgc3RhdGUKKyAg
ICAgICAgKFJlZi5wcm90b3R5cGUuc2V0U3RhdGUpOiBXZSBzaG91bGQgZG8gbm90aGluZyBmb3Ig
dW5kZWZpbmVkIHN0YXRlRGlmZgorICAgICAgICAqIHJlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3Zp
ZXcvc3RhdGljL2xpYnJhcnkvanMvVGVzdC5qczogQWRkZWQuCisgICAgICAgIChBc3NlcnRGYWls
ZWRFcnJvcik6CisgICAgICAgIChFeHBlY3QpOiBFeHBlY3QgY2xhc3MgaGVscCB1c2VyIHBlcmZv
cm0gYSBleHBlY3RhdGlvbiBhc3NlcnRpb24KKyAgICAgICAgKEV4cGVjdC5wcm90b3R5cGUuaXNU
eXBlKToKKyAgICAgICAgKEV4cGVjdC5wcm90b3R5cGUuZXF1YWxUb1ZhbHVlKToKKyAgICAgICAg
KEV4cGVjdC5wcm90b3R5cGUuZXF1YWxUb0h0bWxXaXRob3V0UmVmKToKKyAgICAgICAgKEV4cGVj
dC5wcm90b3R5cGUubm90RXF1YWxUb1ZhbHVlKToKKyAgICAgICAgKEV4cGVjdC5wcm90b3R5cGUu
Z3JlYXRlclRoYW4pOgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1
YWxUbyk6CisgICAgICAgIChFeHBlY3QucHJvdG90eXBlLmxlc3NUaGFuKToKKyAgICAgICAgKEV4
cGVjdC5wcm90b3R5cGUubGVzc1RoYW5PckVxdWFsVG8pOgorICAgICAgICAoVGVzdCk6IENvbW1v
biBUZXN0IGNsYXNzIGZvciB1c2VyIHRvIGV4dGVuZC4gCisgICAgICAgIChUZXN0LnByb3RvdHlw
ZS5leHBlY3QpOiBUaGlzIGV4cGVjdCBtZXRob2Qgd2lsbCBoZWxwIHRoZSB0ZXN0IHBlcmZvcm0g
ZXhwZWN0YXRpb24gYXNzZXJ0aW9ucworICAgICAgICAoVGVzdC5wcm90b3R5cGUuc2xlZXApOiBU
ZXN0IHdpbGwgc2xlZXAgZm9yIGNlcnRhaW4gbXMKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLndh
aXRGb3JTaWduYWwpOiBXYWl0IHVudGlsIHdlIHJlY2VpdmUgYSBjZXJ0YWluIHNpZ25hbCB3aXRo
IHRpbWVvdXQKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLndhaXRGb3JSZWZNb3VudGVkKTogV2Fp
dCB1bnRpbCB3ZSByZXZpY2UgcmVmJ3Mgb25FbGVtZW50TW91bnQgc2lnbmFsIHdpdGggdGltZW91
dAorICAgICAgICAoVGVzdC5wcm90b3R5cGUud2FpdEZvclJlZlVubW91bnRlZCk6IFdhaXQgdW50
aWwgd2UgcmV2aWNlIHJlZidzIG9uRWxlbWVudFVubW91bnQgc2lnbmFsIHdpdGggdGltZW91dAor
ICAgICAgICAoVGVzdC5wcm90b3R5cGUud2FpdEZvclN0YXRlVXBkYXRlZCk6V2FpdCB1bnRpbCB3
ZSByZXZpY2UgcmVmJ3Mgb25TdGF0ZVVwZGF0ZSBzaWduYWwgd2l0aCB0aW1lb3V0CisgICAgICAg
IChUZXN0LnByb3RvdHlwZS5hc3luYy5zZXR1cCk6IENvbW1vbiBpbnRlcmZhY2UgZm9yIHNldHVw
IGEgdGVzdCBjbGFzcworICAgICAgICAoVGVzdC5wcm90b3R5cGUuYXN5bmMuY2xlYXJVcCk6IENv
bW1vbiBpbnRlcmZhY2UgZm9yIGNsZWFydXAgYSB0ZXN0IGNsYXNzCisgICAgICAgIChnZXRUZXN0
RnVjbnRpb25OYW1lcyk6IENvbGxlY3QgYWxsIHRoZSB0ZXN0IG1ldGhvZCBvZiBhIHRlc3QgaW5z
dGFuY2UuCisgICAgICAgIChUZXN0UmVzdWx0KToKKyAgICAgICAgKFRlc3RSZXN1bHQucHJvdG90
eXBlLmNhdGNoRXhjZXB0aW9uKToKKyAgICAgICAgKGFzeW5jLmdldFRlc3RSZXN1bHQpOiBUaGlz
IHdpbGwgcnVuIHRoZSB0ZXN0IGFuZCBnZW5lcmF0ZSBhIFRlc3RSZXN1bHQgb2JqZWN0CisgICAg
ICAgIChUZXN0Q29udHJvbGxlcik6IENvbnRyb2wgaG93IHRoZSB0ZXN0IHJ1bm5pbmcKKyAgICAg
ICAgKFRlc3RDb250cm9sbGVyLnByb3RvdHlwZS5hZGRSZXN1bHRIYW5kbGVyKTogUmVzdWx0IGhh
bmRsZXIgc2hvdWxkIGJlIGhvb2sgd2l0aCBhIGNvbXBvbmVudCBvciBzb21ldGhpbmcgZWxzZSB0
byByZW5kZXIgdGhlIHRlc3QgcmVzdWx0CisgICAgICAgIChUZXN0Q29udHJvbGxlci5wcm90b3R5
cGUuYWRkU2V0dXBBcmdzKTogVGhpcyBnaXZlcyBzb21lIGFkZGl0aW9uYWwgYXJncyBmb3IgdGhl
IGNvbW1vbiBzZXR1cCBtZXRob2QgZm9yIGVhY2ggdGVzdCBjbGFzcywgCisgICAgICAgIGl0IGlz
IHRoZSBiZXN0IHBsYWNlIHRvIHNldHVwIHNvbWV0aGluZyBsaWtlIGEgcm9vdCBlbGVtZW50LCBh
IGZha2UgZGF0YSBzb3VyY2UsIGV0YworICAgICAgICAoVGVzdENvbnRyb2xsZXIucHJvdG90eXBl
LmNvbGxlY3QpOiBUaGlzIG1ldGhvZCB1c2VkIGZvciBjb2xsZWN0IHRoZSB0ZXN0IGNsYXNzZXMu
CisgICAgICAgIChUZXN0Q29udHJvbGxlci5wcm90b3R5cGUuYXN5bmMuY29sbGVjdEZpbGUpOiBJ
dCB3aWxsIGltcG9ydCB0aGUgZmlsZSBhcyBhIG1vZHVsZSBkeW5hbWljbHkgYW5kIGNvbGxlY3Qg
YWxsIHRoZSB0ZXN0IGNsYXNzZXMgdGhhdCBtb2R1bGUgZXhwb3J0CisgICAgICAgIChUZXN0Q29u
dHJvbGxlci5wcm90b3R5cGUuYXN5bmMucnVuVGVzdCk6IEl0IHdpbGwgcnVuIGEgdGVzdCBtZXRo
b2Qgb2YgYSB0ZXN0IGNsYXNzCisgICAgICAgIChUZXN0Q29udHJvbGxlci5wcm90b3R5cGUuYXN5
bmMucnVuKTogSXQgd2lsbCBydW4gYWxsIHRlc3Qgb3IgYSB0ZXN0IGNsYXNzIG9yIGEgdGVzdCBt
ZXRob2QKKyAgICAgICAgKiByZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJy
YXJ5L2pzL2NvbXBvbmVudHMvVGVzdENvbXBvbmVudHMuanM6IGNvbXBvbmVudHMgZm9yIHRlc3Qg
YXBwLgorICAgICAgICAqIHJlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJh
cnkvanMvdGVzdC9SZWZUZXN0LmpzOiBSZWYuanMgdGVzdCBjYXNlcy4KKyAgICAgICAgKiByZXN1
bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvaW5kZXguaHRt
bDogVGVzdCBhcHAgZW50cnkuCisKIDIwMTktMDktMDYgIEFsZXggQ2hyaXN0ZW5zZW4gIDxhY2hy
aXN0ZW5zZW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICBEZXByZWNhdGUgYWxsIFdLQ29va2llTWFu
YWdlclJlZiBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNk
YnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvUmVmLmpzIGIvVG9vbHMvcmVzdWx0c2RicHkvcmVz
dWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9SZWYuanMKaW5kZXggYzkxNGQ1YjgwMzRi
NDQxZjA5NjdlYWQ0OTYxYzE1ZGU2NGUyZmEzZi4uZjBmMGIwMzlhN2JkY2Q0NWQ3ODU2MDg0NzU5
MDczM2JjOTQ4MDgyZiAxMDA2NDQKLS0tIGEvVG9vbHMvcmVzdWx0c2RicHkvcmVzdWx0c2RicHkv
dmlldy9zdGF0aWMvbGlicmFyeS9qcy9SZWYuanMKKysrIGIvVG9vbHMvcmVzdWx0c2RicHkvcmVz
dWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9SZWYuanMKQEAgLTIxNyw3ICsyMTcsNyBA
QCBmdW5jdGlvbiBpc01lcmdlYWJsZVN0YXRlKHN0YXRlKSB7CiB9CiAKIGZ1bmN0aW9uIGFwcGx5
U3RhdGVEaWZmKHN0YXRlLCBkaWZmKSB7Ci0gICAgaWYgKCFkaWZmKQorICAgIGlmIChkaWZmID09
PSB1bmRlZmluZWQpCiAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICBpZiAoIWlzTWVyZ2VhYmxl
U3RhdGUoZGlmZikpCiAgICAgICAgIHJldHVybiBkaWZmOwpAQCAtMjc1LDYgKzI3NSw4IEBAIGNs
YXNzIFJlZiB7CiAgICAgICAgIHJldHVybiB0aGlzLmtleTsKICAgICB9CiAgICAgc2V0U3RhdGUo
c3RhdGVEaWZmKSB7CisgICAgICAgIGlmIChzdGF0ZURpZmYgPT09IHVuZGVmaW5lZCkKKyAgICAg
ICAgICAgIHJldHVybjsKICAgICAgICAgaWYgKFRSQUNFX1NUQVRFKQogICAgICAgICAgICAgdGhp
cy5zdGF0ZVRyYWNlci5wdXNoKHN0YXRlRGlmZik7CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBh
L1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvVGVz
dC5qcyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkv
anMvVGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mMTg4M2VlN2I2MGY0YTM1YTI2NWRkNDE1ZDFkMmMzZmYy
NGQ0ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcmVzdWx0c2RicHkvcmVzdWx0c2RicHkv
dmlldy9zdGF0aWMvbGlicmFyeS9qcy9UZXN0LmpzCkBAIC0wLDAgKzEsMjQyIEBACitpbXBvcnQg
e0V2ZW50U3RyZWFtfSBmcm9tICcuL1JlZi5qcyc7CisKK2NsYXNzIEFzc2VydEZhaWxlZEVycm9y
IGV4dGVuZHMgRXJyb3IgeworICAgIGNvbnN0cnVjdG9yKG1zZykgeworICAgICAgICBzdXBlciht
c2cpCisgICAgfQorfQorCitmdW5jdGlvbiBzdHJpcFJlZihodG1sKSB7CisgICAgcmV0dXJuIGh0
bWwucmVwbGFjZSgvcmVmPSJbXHdcZFwtXSsiL2csICIiKQorfQorCitjbGFzcyBFeHBlY3Qgewor
ICAgIGNvbnN0cnVjdG9yKHZhbHVlQSkgeworICAgICAgICB0aGlzLnZhbHVlQSA9IHZhbHVlQTsK
KyAgICAgICAgdGhpcy52YWx1ZUIgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9
CisKKyAgICBpc1R5cGUodHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCkgeworICAg
ICAgICAgICAgaWYgKHRoaXMudmFsdWVBICE9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93
IG5ldyBBc3NlcnRGYWlsZWRFcnJvcihgJHt0aGlzLnZhbHVlQX0gc2hvdWxkIGJlIG51bGxgKTsK
KyAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4odHlwZSkgfHwgdHlwZSA9PT0gIk5hTiIp
IHsKKyAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHRoaXMudmFsdWVBKSkKKyAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNob3Vs
ZCBiZSBOYU5gKTsgICAgCisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gIkFycmF5IiB8fCB0
eXBlID09PSAiYXJyYXkiIHx8IHR5cGUgPT09IEFycmF5KSB7CisgICAgICAgICAgICBpZiAoIUFy
cmF5LmlzQXJyYXkodGhpcy52YWx1ZUEpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3Nl
cnRGYWlsZWRFcnJvcihgJHt0aGlzLnZhbHVlQX0gc2hvdWxkIGJlIGFuIEFycmF5YCk7CisgICAg
ICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWVBICE9PSB0eXBlICYmIGZhbHNlID09PSB0
aGlzLnZhbHVlQSBpbnN0YW5jZW9mIHR5cGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0
RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNob3VsZCBiZSB0eXBlICR7dHlwZX1gKTsKKyAg
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgZXF1YWxUb1ZhbHVlKHZhbHVlQikgewor
ICAgICAgICBpZiAodGhpcy52YWx1ZUEgIT09IHZhbHVlQikKKyAgICAgICAgICAgIHRocm93IG5l
dyBBc3NlcnRGYWlsZWRFcnJvcihgJHt0aGlzLnZhbHVlQX0gc2hvdWxkIGVxdWFsIHRvICR7dmFs
dWVCfWApOworICAgIH0KKworICAgIGVxdWFsVG9IdG1sV2l0aG91dFJlZihodG1sKSB7CisgICAg
ICAgIHJldHVybiB0aGlzLmVxdWFsVG9WYWx1ZShzdHJpcFJlZih0aGlzLnZhbHVlQSksIHN0cmlw
UmVmKGh0bWwpKTsKKyAgICB9CisKKyAgICBlcXVhbFRvQXJyYXkoYXJyYXksIGNvbXBhcmUgPSAo
eCwgeSkgPT4gZXhwZWN0KHgpLmVxdWFsVG9WYWx1ZSh5KSkgeworICAgICAgICBleHBlY3QodGhp
cy52YWx1ZUEpLmlzVHlwZSgiQXJyYXkiKTsKKyAgICAgICAgZXhwZWN0KGFycmF5KS5pc1R5cGUo
IkFycmF5Iik7CisgICAgICAgIGV4cGVjdCh0aGlzLnZhbHVlQS5sZW5ndGgpLmVxdWFsVG9WYWx1
ZShhcnJheS5sZW5ndGgpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWVB
Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb21wYXJlKHRoaXMudmFsdWVBW2ldLCBhcnJh
eVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBub3RFcXVhbFRvVmFsdWUodmFsdWVCKSB7
CisgICAgICAgIGlmICh0aGlzLnZhbHVlQSA9PT0gdmFsdWVCKQorICAgICAgICAgICAgdGhyb3cg
bmV3IEFzc2VydEZhaWxlZEVycm9yKGAke3RoaXMudmFsdWVBfSBzaG91bGQgbm90IGVxdWFsIHRv
ICR7dmFsdWVCfWApOworICAgIH0KKworICAgIGdyZWF0ZXJUaGFuKHZhbHVlQikgeworICAgICAg
ICBpZiAodGhpcy52YWx1ZUEgPD0gdmFsdWVCKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2Vy
dEZhaWxlZEVycm9yKGAke3RoaXMudmFsdWVBfSBzaG91bGQgZ3JlYXRlciB0aGFuICR7dmFsdWVC
fWApOworICAgIH0KKworICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlQikgeworICAgICAg
ICBpZiAodGhpcy52YWx1ZUEgPCB2YWx1ZUIpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0
RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNob3VsZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwg
dG8gJHt2YWx1ZUJ9YCk7CisgICAgfQorCisgICAgbGVzc1RoYW4odmFsdWVCKSB7CisgICAgICAg
IGlmICh0aGlzLnZhbHVlQSA+PSB2YWx1ZUIpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0
RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNob3VsZCBsZXNzIHRoYW4gJHt2YWx1ZUJ9YCk7
CisgICAgfQorCisgICAgbGVzc1RoYW5PckVxdWFsVG8odmFsdWVCKSB7CisgICAgICAgIGlmICh0
aGlzLnZhbHVlQSA+IHZhbHVlQikKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRGYWlsZWRF
cnJvcihgJHt0aGlzLnZhbHVlQX0gc2hvdWxkIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke3ZhbHVl
Qn1gKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIGV4cGVjdCh2YWx1ZSkgeworICAgIHJldHVybiBu
ZXcgRXhwZWN0KHZhbHVlKTsKK30KKworY2xhc3MgVGVzdCB7CisgICAgZXhwZWN0KHZhbHVlKSB7
CisgICAgICAgIHJldHVybiBleHBlY3QodmFsdWUpOworICAgIH0KKworICAgIHNsZWVwKG1zKSB7
CisgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geworICAgICAgICAgICAg
c2V0VGltZW91dChyZXNvbHZlLCBtcyk7CisgICAgICAgIH0pOworICAgIH0KKyAgICAKKyAgICB3
YWl0Rm9yU2lnbmFsKHNpbmdhbCwgbmFtZSwgdGltZW91dD0xMDAwKSB7CisgICAgICAgIHJldHVy
biBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgICAgICAgICBjb25zdCBo
YW5kbGVyID0gKCkgPT4geworICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFu
ZGxlcik7CisgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOworICAgICAgICAgICAgICAgIHNpbmdh
bC5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBj
b25zdCB0aW1lb3V0SGFuZGxlciA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICAgICAgICAg
IHNpbmdhbC5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICByZWplY3Qo
bmV3IEFzc2VydEZhaWxlZEVycm9yKGBDYW5ub3QgZ2V0IHRoZSAke25hbWV9IHNpZ25hbCBhZnRl
ciAke3RpbWVvdXR9IG1zYCkpOworICAgICAgICAgICAgfSwgdGltZW91dCk7CisgICAgICAgICAg
ICBzaW5nYWwuYWRkTGlzdGVuZXIoaGFuZGxlcik7CisgICAgICAgIH0pOworICAgIH0KKworICAg
IHdhaXRGb3JSZWZNb3VudGVkKHJlZiwgdGltZW91dD0xMDAwKSB7CisgICAgICAgIHJldHVybiB0
aGlzLndhaXRGb3JTaWduYWwocmVmLm9uRWxlbWVudE1vdW50LCAibW91bnQiLCB0aW1lb3V0KTsK
KyAgICB9CisKKyAgICB3YWl0Rm9yUmVmVW5tb3VudGVkKHJlZiwgdGltZW91dD0xMDAwKSB7Cisg
ICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JTaWduYWwocmVmLm9uRWxlbWVudFVubW91bnQsICJ1
bm1vdW50IiwgdGltZW91dCk7CisgICAgfQorCisgICAgd2FpdEZvclN0YXRlVXBkYXRlZChyZWYs
IHRpbWVvdXQ9MTAwMCkgeworICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yU2lnbmFsKHJlZi5v
blN0YXRlVXBkYXRlLCAic3RhdGUgdXBkYXRlIiwgdGltZW91dCk7CisgICAgfQorCisgICAgLypD
b21tb24gaW50ZXJmYWNlKi8KKyAgICBhc3luYyBzZXR1cCgpIHt9CisgICAgYXN5bmMgY2xlYXJV
cCgpIHt9Cit9CisKKworZnVuY3Rpb24gZ2V0VGVzdEZ1Y250aW9uTmFtZXModGVzdE9iaikgewor
ICAgIGNvbnN0IGZpeGVkTWV0aG9kcyA9IG5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFt
ZXMoVGVzdC5wcm90b3R5cGUpKTsKKyAgICBjb25zdCB0ZXN0T2JqTWV0aG9kcyA9IE9iamVjdC5n
ZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3RPYmouY29uc3RydWN0b3IucHJvdG90eXBlKTsKKyAgICBj
b25zdCB0ZXN0TWV0aG9kcyA9IFtdOworICAgIGZvciAobGV0IG1ldGhvZCBvZiB0ZXN0T2JqTWV0
aG9kcykgeworICAgICAgICBpZiAoIWZpeGVkTWV0aG9kcy5oYXMobWV0aG9kKSkKKyAgICAgICAg
ICAgIHRlc3RNZXRob2RzLnB1c2gobWV0aG9kKTsKKyAgICB9CisgICAgcmV0dXJuIHRlc3RNZXRo
b2RzOworfQorCitjb25zdCBURVNUX1JFU1VMVF9UWVBFID0gT2JqZWN0LmZyZWV6ZSh7CisgICAg
U3VjY2VzczogU3ltYm9sKCJTdWNjZXNzIiksCisgICAgRXJyb3I6IFN5bWJvbCgiRXJyb3IiKSwK
KyAgICBGYWlsZWQ6IFN5bWJvbCgiRmFpbGVkIiksCit9KTsKKworY2xhc3MgVGVzdFJlc3VsdCB7
CisgICAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBmbk5hbWUpIHsKKyAgICAgICAgdGhpcy5jbGFz
c05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIHRoaXMuZm5OYW1lID0gZm5OYW1lOworICAgICAg
ICB0aGlzLmV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRoaXMudHlwZSA9IFRFU1RfUkVTVUxU
X1RZUEUuU3VjY2VzczsKKyAgICB9CisgICAgCisgICAgY2F0Y2hFeGNlcHRpb24oZSkgeworICAg
ICAgICB0aGlzLmV4Y2VwdGlvbiA9IGU7CisgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CisgICAg
ICAgIGlmIChlIGluc3RhbmNlb2YgQXNzZXJ0RmFpbGVkRXJyb3IpCisgICAgICAgICAgICB0aGlz
LnR5cGUgPSBURVNUX1JFU1VMVF9UWVBFLkZhaWxlZDsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgdGhpcy50eXBlID0gVEVTVF9SRVNVTFRfVFlQRS5FcnJvcjsKKyAgICB9Cit9CisKK2FzeW5j
IGZ1bmN0aW9uIGdldFRlc3RSZXN1bHQob2JqLCBmbk5hbWUsIGFyZ3MgPSBbXSkgeworICAgIGNv
bnN0IHJlc3VsdCA9IG5ldyBUZXN0UmVzdWx0KG9iai5jb25zdHJ1Y3Rvci5uYW1lLCBmbk5hbWUp
OworICAgIHRyeSB7CisgICAgICAgIGF3YWl0IG9ialtmbk5hbWVdKC4uLmFyZ3MpOworICAgIH0g
Y2F0Y2ggKGUpIHsKKyAgICAgICAgcmVzdWx0LmNhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAg
ICByZXR1cm4gcmVzdWx0OworfQorCitjbGFzcyBUZXN0Q29udHJvbGxlciB7CisgICAgY29uc3Ry
dWN0b3Ioc2V0dXBBcmdzKSB7CisgICAgICAgIHRoaXMuYWxsVGVzdHMgPSB7fQorICAgICAgICB0
aGlzLnJlc3VsdHNFcyA9IG5ldyBFdmVudFN0cmVhbSgpOworICAgICAgICB0aGlzLnNldHVwQXJn
cyA9IEFycmF5LmlzQXJyYXkoc2V0dXBBcmdzKSA/IHNldHVwQXJncyA6IFtdOworICAgIH0KKyAg
ICAKKyAgICBhZGRSZXN1bHRIYW5kbGVyKGhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5yZXN1bHRz
RXMuYWN0aW9uKGhhbmRsZXIpOworICAgIH0KKyAgICAKKyAgICBhZGRTZXR1cEFyZ3MoYXJncykg
eworICAgICAgICB0aGlzLnNldHVwQXJncyA9IHRoaXMuc2V0dXBBcmdzLmNvbmNhdChhcmdzKTsK
KyAgICB9CisKKyAgICBjb2xsZWN0KHRlc3RDbGFzcykgeworICAgICAgICBjb25zdCB0ZXN0SW5z
dGFuY2UgPSBuZXcgdGVzdENsYXNzKCk7CisgICAgICAgIGNvbnN0IHRlc3ROYW1lID0gdGVzdElu
c3RhbmNlLmNvbnN0cnVjdG9yLm5hbWU7CisgICAgICAgIGlmICggdGVzdE5hbWUgaW4gdGhpcy5h
bGxUZXN0cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Rlc3ROYW1lfSBoYXMg
YWxyZWFkeSBiZWVuIGNvbGxlY3RlZGApOworICAgICAgICB9CisgICAgICAgIHRoaXMuYWxsVGVz
dHNbdGVzdE5hbWVdID0gdGVzdEluc3RhbmNlOworICAgIH0KKyAgICAKKyAgICBhc3luYyBjb2xs
ZWN0RmlsZShmaWxlUGF0aCkgeworICAgICAgICBjb25zdCB0ZXN0TW9kdWxlID0gYXdhaXQgaW1w
b3J0KGZpbGVQYXRoKTsKKyAgICAgICAgT2JqZWN0LmtleXModGVzdE1vZHVsZSkuZm9yRWFjaChj
bGFzc05hbWUgPT4gdGhpcy5jb2xsZWN0KHRlc3RNb2R1bGVbY2xhc3NOYW1lXSkpOworICAgIH0K
KworICAgIGFzeW5jIHJ1blRlc3QodGVzdE5hbWUsIGZuTmFtZSkgeworICAgICAgICBsZXQgaGF2
ZUVycm9yID0gZmFsc2U7CisgICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IHRoaXMuYWxsVGVz
dHNbdGVzdE5hbWVdOworICAgICAgICBjb25zdCB0ZXN0TWV0aG9kcyA9IGdldFRlc3RGdWNudGlv
bk5hbWVzKHRlc3RJbnN0YW5jZSk7CisgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBnZXRUZXN0
UmVzdWx0KHRlc3RJbnN0YW5jZSwgInNldHVwIiwgdGhpcy5zZXR1cEFyZ3MpOworICAgICAgICB0
aGlzLnJlc3VsdHNFcy5hZGQocmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdC50eXBlID09PSBU
RVNUX1JFU1VMVF9UWVBFLlN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIGZvciAobGV0IHRlc3RNZXRo
b2ROYW1lIG9mIHRlc3RNZXRob2RzKSB7CisgICAgICAgICAgICAgICAgaWYgKGZuTmFtZSAmJiBm
bk5hbWUgIT09IHRlc3RNZXRob2ROYW1lKSAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdldFRlc3RSZXN1bHQodGVzdEluc3RhbmNl
LCB0ZXN0TWV0aG9kTmFtZSk7CisgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRXMuYWRkKHJl
c3VsdCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlICE9PSBURVNUX1JFU1VMVF9U
WVBFLlN1Y2Nlc3MpCisgICAgICAgICAgICAgICAgICAgIGhhdmVFcnJvciA9IHRydWU7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZSAKKyAgICAgICAgICAgIGhhdmVFcnJvciA9IHRydWU7
CisgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdldFRlc3RSZXN1bHQodGVzdEluc3RhbmNlLCAiY2xl
YXJVcCIpOworICAgICAgICB0aGlzLnJlc3VsdHNFcy5hZGQocmVzdWx0KTsKKyAgICAgICAgaWYg
KHJlc3VsdC50eXBlICE9PSBURVNUX1JFU1VMVF9UWVBFLlN1Y2Nlc3MpCisgICAgICAgICAgICBo
YXZlRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gaGF2ZUVycm9yOworICAgIH0KKworICAg
IGFzeW5jIHJ1bih0ZXN0Q2xhc3NOYW1lLCB0ZXN0Rm5OYW1lKSB7CisgICAgICAgIGxldCBoYXZl
RXJyb3IgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRlc3RDbGFzc05hbWUpCisgICAgICAgICAgICBo
YXZlRXJyb3IgPSBhd2FpdCB0aGlzLnJ1blRlc3QodGVzdENsYXNzTmFtZSwgdGVzdEZuTmFtZSk7
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yKGxldCB0ZXN0Q2xhc3NOYW1lIG9mIE9i
amVjdC5rZXlzKHRoaXMuYWxsVGVzdHMpKQorICAgICAgICAgICAgICAgIGhhdmVFcnJvciB8PSBh
d2FpdCB0aGlzLnJ1blRlc3QodGVzdENsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY29u
c3QgZmluYWxSZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgiIiwgIiIpOworICAgICAgICBpZiAoIWhh
dmVFcnJvcikKKyAgICAgICAgICAgIGZpbmFsUmVzdWx0LnR5cGUgPSBURVNUX1JFU1VMVF9UWVBF
LlN1Y2Nlc3M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbmFsUmVzdWx0LnR5cGUgPSBU
RVNUX1JFU1VMVF9UWVBFLkZhaWxlZDsKKyAgICAgICAgdGhpcy5yZXN1bHRzRXMuYWRkKGZpbmFs
UmVzdWx0KTsKKyAgICB9Cit9CisKK2V4cG9ydCB7VGVzdCwgVGVzdENvbnRyb2xsZXIsIFRFU1Rf
UkVTVUxUX1RZUEV9CmRpZmYgLS1naXQgYS9Ub29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92
aWV3L3N0YXRpYy9saWJyYXJ5L2pzL2NvbXBvbmVudHMvVGVzdENvbXBvbmVudHMuanMgYi9Ub29s
cy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL2NvbXBvbmVu
dHMvVGVzdENvbXBvbmVudHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTc3MTE3OTE1YTZlMmMwMjI1MWYyN2Y2
MDQyMWY3Zjk3OTVhMTgzMgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jl
c3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvY29tcG9uZW50cy9UZXN0Q29tcG9uZW50
cy5qcwpAQCAtMCwwICsxLDg3IEBACitpbXBvcnQge0RPTSwgUkVGfSBmcm9tICIuLi9SZWYuanMi
CitpbXBvcnQge1Rlc3RDb250cm9sbGVyLCBURVNUX1JFU1VMVF9UWVBFfSBmcm9tICIuLi9UZXN0
LmpzIgorCisKK2Z1bmN0aW9uIFRlc3RBcHAodGVzdENvbnRyb2xsZXIpIHsKKyAgICByZXR1cm4g
KAorICAgICAgICBgPGRpdiBjbGFzcz0icm93IGNvbnRlbnQiPgorICAgICAgICAgICAgPGRpdiBj
bGFzcz0iY29sLTYiPgorICAgICAgICAgICAgICAgICR7VGVzdFJlc3VsdENvbnNvbGUodGVzdENv
bnRyb2xsZXIpfQorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJj
b2wtNiI+CisgICAgICAgICAgICAke1Rlc3RSZW5kZXJBcmVhKHRlc3RDb250cm9sbGVyKX0KKyAg
ICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj5gCisgICAgKTsKK30KKworZnVuY3Rpb24g
VGVzdFJlc3VsdCh0ZXN0UmVzdWx0KSB7CisgICAgbGV0IHN0YXR1c0NsYXNzID0gInN1Y2Nlc3Mi
OworICAgIGxldCBkZXNjcmlwdGlvbiA9IHRlc3RSZXN1bHQuY2xhc3NOYW1lID8gIlBBU1MiIDog
IkFMTCBQQVNTIjsKKyAgICBzd2l0Y2ggKHRlc3RSZXN1bHQudHlwZSkgeworICAgICAgICBjYXNl
IFRFU1RfUkVTVUxUX1RZUEUuRmFpbGVkOgorICAgICAgICAgICAgc3RhdHVzQ2xhc3MgPSAiZmFp
bGVkIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gImZhaWxlZCIKKyAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgVEVTVF9SRVNVTFRfVFlQRS5FcnJvcjoKKyAgICAgICAgICAgIHN0YXR1
c0NsYXNzID0gImVycm9yIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gInJhaXNlIGFuIGVy
cm9yIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAoCisgICAgICAgIGAKKyAg
ICAgICAgIDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgJHt0ZXN0UmVzdWx0LmNsYXNzTmFt
ZSA/ICIiIDogIjxocj4ifQorICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCBibG9jayI+Cisg
ICAgICAgICAgICAgICAgPGEgaHJlZj0iP2NsYXNzTmFtZT0ke3Rlc3RSZXN1bHQuY2xhc3NOYW1l
fSI+JHt0ZXN0UmVzdWx0LmNsYXNzTmFtZX08L2E+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAg
ICAgICAgIDxkaXYgY2xhc3M9InRleHQgYmxvY2siPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9
Ij9jbGFzc05hbWU9JHt0ZXN0UmVzdWx0LmNsYXNzTmFtZX0mZm5OYW1lPSR7dGVzdFJlc3VsdC5m
bk5hbWV9Ij4ke3Rlc3RSZXN1bHQuZm5OYW1lfTwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAg
ICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCBibG9jayAke3N0YXR1c0NsYXNzfSI+CisgICAgICAg
ICAgICAgICAgJHtkZXNjcmlwdGlvbn0KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAg
JHt0ZXN0UmVzdWx0LmV4Y2VwdGlvbiA/IGAKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0
ZXh0ICR7c3RhdHVzQ2xhc3N9Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByZT4ke3Rlc3RSZXN1
bHQuZXhjZXB0aW9uLm1lc3NhZ2V9XG4ke3Rlc3RSZXN1bHQuZXhjZXB0aW9uLnN0YWNrfTwvcHJl
PgorICAgICAgICAgICAgICAgIDwvZGl2PmAgOiAiIn0KKyAgICAgICAgPC9kaXY+YAorICAgICk7
Cit9CisKK2Z1bmN0aW9uIFRlc3RSZXN1bHRDb25zb2xlKHRlc3RDb250cm9sbGVyKSB7CisgICAg
Y29uc3QgcmVmID0gUkVGLmNyZWF0ZVJlZih7CisgICAgICAgIG9uU3RhdGVVcGRhdGU6IChlbGVt
ZW50LCBzdGF0ZURpZmYpID0+IHsKKyAgICAgICAgICAgIGlmIChzdGF0ZURpZmYuYWRkVGVzdFJl
c3VsdCkgeworICAgICAgICAgICAgICAgIERPTS5hcHBlbmQoZWxlbWVudCwgVGVzdFJlc3VsdChz
dGF0ZURpZmYuYWRkVGVzdFJlc3VsdCkpOworICAgICAgICAgICAgICAgIGlmICghc3RhdGVEaWZm
LmFkZFRlc3RSZXN1bHQuY2xhc3NOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmaW5h
bF9yZXMgPSAiQUxMIFBBU1MiOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVEaWZmLmFk
ZFRlc3RSZXN1bHQudHlwZSAhPT0gVEVTVF9SRVNVTFRfVFlQRS5TdWNjZXNzKQorICAgICAgICAg
ICAgICAgICAgICAgICAgZmluYWxfcmVzID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAg
IGRvY3VtZW50LnRpdGxlID0gYCR7ZmluYWxfcmVzfWA7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7CisgICAgdGVzdENvbnRyb2xsZXIuYWRkUmVz
dWx0SGFuZGxlcih0ZXN0UmVzdWx0ID0+IHJlZi5zZXRTdGF0ZSh7YWRkVGVzdFJlc3VsdDogdGVz
dFJlc3VsdH0pKTsKKyAgICByZXR1cm4gYDxkaXYgcmVmPSIke3JlZn0iPjwvZGl2PmA7Cit9CisK
KworZnVuY3Rpb24gVGVzdFJlbmRlckFyZWEodGVzdENvbnRyb2xsZXIpIHsKKyAgICBjb25zdCBy
ZWYgPSBSRUYuY3JlYXRlUmVmKHsKKyAgICAgICAgb25FbGVtZW50TW91bnQ6IChlbGVtZW50KSA9
PiB7CisgICAgICAgICAgICB0ZXN0Q29udHJvbGxlci5hZGRTZXR1cEFyZ3MoW2VsZW1lbnRdKTsK
KyAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uKTsKKyAgICAg
ICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNo
KTsKKyAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHNlYXJjaFBhcmFtLmdldCgiY2xhc3NO
YW1lIik7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lKQorICAgICAgICAgICAgICAgIGRvY3Vt
ZW50LnRpdGxlID0gY2xhc3NOYW1lOworICAgICAgICAgICAgY29uc3QgZm5OYW1lID0gc2VhcmNo
UGFyYW0uZ2V0KCJmbk5hbWUiKTsKKyAgICAgICAgICAgIHRlc3RDb250cm9sbGVyLnJ1bihjbGFz
c05hbWUsIGZuTmFtZSkKKyAgICAgICAgfSAKKyAgICB9KTsKKyAgICByZXR1cm4gYDxkaXYgcmVm
PSIke3JlZn0iPjwvZGl2PmA7Cit9CisKK2V4cG9ydCB7VGVzdEFwcH07CmRpZmYgLS1naXQgYS9U
b29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3Qv
UmVmVGVzdC5qcyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xp
YnJhcnkvanMvdGVzdC9SZWZUZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE5NjBmNGZiMGNmYzg3NmQ3MzM1
ZDZhYzE3YWQ3OGRkNjBhMDdkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9yZXN1bHRzZGJw
eS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvUmVmVGVzdC5qcwpAQCAt
MCwwICsxLDMwMiBAQAoraW1wb3J0IHtUZXN0fSBmcm9tICcuLi9UZXN0LmpzJzsKK2ltcG9ydCB7
UkVGLCBET00sIGRpZmYsIEZQLCBFdmVudFN0cmVhbX0gZnJvbSAnLi4vUmVmLmpzJzsKKworY2xh
c3MgRGlmZlRlc3QgZXh0ZW5kcyBUZXN0IHsKKyAgICB0ZXN0QXJyYXlEaWZmKCkgeworICAgICAg
ICBsZXQgcmVtb3ZlZCA9IFtdOworICAgICAgICBsZXQgbmV3QXJyYXkgPSBbXTsKKyAgICAgICAg
ZGlmZihbMSwgMiwgM10sIFs0LCA1LCA2XSwgaXRlbSA9PiByZW1vdmVkLnB1c2goaXRlbSksIGl0
ZW0gPT4gbmV3QXJyYXkucHVzaChpdGVtKSk7CisgICAgICAgIHRoaXMuZXhwZWN0KHJlbW92ZWQp
LmVxdWFsVG9BcnJheShbMSwgMiwgM10pOworICAgICAgICB0aGlzLmV4cGVjdChuZXdBcnJheSku
ZXF1YWxUb0FycmF5KFs0LCA1LCA2XSk7CisKKyAgICAgICAgcmVtb3ZlZCA9IFtdOworICAgICAg
ICBuZXdBcnJheSA9IFtdOworICAgICAgICBkaWZmKFsxLCAyLCAzXSwgWzIsIDMsIDRdLCBpdGVt
ID0+IHJlbW92ZWQucHVzaChpdGVtKSwgaXRlbSA9PiBuZXdBcnJheS5wdXNoKGl0ZW0pKTsKKyAg
ICAgICAgdGhpcy5leHBlY3QocmVtb3ZlZCkuZXF1YWxUb0FycmF5KFsxXSk7CisgICAgICAgIHRo
aXMuZXhwZWN0KG5ld0FycmF5KS5lcXVhbFRvQXJyYXkoWzIsIDMsIDRdKTsKKworICAgICAgICBy
ZW1vdmVkID0gW107CisgICAgICAgIG5ld0FycmF5ID0gW107CisgICAgICAgIGRpZmYoWzJdLCBb
MiwgMywgNF0sIGl0ZW0gPT4gcmVtb3ZlZC5wdXNoKGl0ZW0pLCBpdGVtID0+IG5ld0FycmF5LnB1
c2goaXRlbSkpOworICAgICAgICB0aGlzLmV4cGVjdChyZW1vdmVkKS5lcXVhbFRvQXJyYXkoW10p
OworICAgICAgICB0aGlzLmV4cGVjdChuZXdBcnJheSkuZXF1YWxUb0FycmF5KFsyLCAzLCA0XSk7
CisKKyAgICAgICAgcmVtb3ZlZCA9IFtdOworICAgICAgICBuZXdBcnJheSA9IFtdOworICAgICAg
ICBkaWZmKFtdLCBbMiwgMywgNF0sIGl0ZW0gPT4gcmVtb3ZlZC5wdXNoKGl0ZW0pLCBpdGVtID0+
IG5ld0FycmF5LnB1c2goaXRlbSkpOworICAgICAgICB0aGlzLmV4cGVjdChyZW1vdmVkKS5lcXVh
bFRvQXJyYXkoW10pOworICAgICAgICB0aGlzLmV4cGVjdChuZXdBcnJheSkuZXF1YWxUb0FycmF5
KFsyLCAzLCA0XSk7CisgICAgICAgIAorICAgICAgICByZW1vdmVkID0gW107CisgICAgICAgIG5l
d0FycmF5ID0gW107CisgICAgICAgIGRpZmYoWzQsIDMsIDJdLCBbMiwgMywgNF0sIGl0ZW0gPT4g
cmVtb3ZlZC5wdXNoKGl0ZW0pLCBpdGVtID0+IG5ld0FycmF5LnB1c2goaXRlbSkpOworICAgICAg
ICB0aGlzLmV4cGVjdChyZW1vdmVkKS5lcXVhbFRvQXJyYXkoW10pOworICAgICAgICB0aGlzLmV4
cGVjdChuZXdBcnJheSkuZXF1YWxUb0FycmF5KFsyLCAzLCA0XSk7CisgICAgICAgIAorICAgICAg
ICByZW1vdmVkID0gW107CisgICAgICAgIG5ld0FycmF5ID0gW107CisgICAgICAgIGRpZmYoWzQs
IDMsIDIsIDUsIDZdLCBbMiwgMywgNF0sIGl0ZW0gPT4gcmVtb3ZlZC5wdXNoKGl0ZW0pLCBpdGVt
ID0+IG5ld0FycmF5LnB1c2goaXRlbSkpOworICAgICAgICB0aGlzLmV4cGVjdChyZW1vdmVkKS5l
cXVhbFRvQXJyYXkoWzUsIDZdKTsKKyAgICAgICAgdGhpcy5leHBlY3QobmV3QXJyYXkpLmVxdWFs
VG9BcnJheShbMiwgMywgNF0pOworICAgICAgICAKKyAgICAgICAgcmVtb3ZlZCA9IFtdOworICAg
ICAgICBuZXdBcnJheSA9IFtdOworICAgICAgICBkaWZmKFtdLCBbXSwgaXRlbSA9PiByZW1vdmVk
LnB1c2goaXRlbSksIGl0ZW0gPT4gbmV3QXJyYXkucHVzaChpdGVtKSk7CisgICAgICAgIHRoaXMu
ZXhwZWN0KHJlbW92ZWQpLmVxdWFsVG9BcnJheShbXSk7CisgICAgICAgIHRoaXMuZXhwZWN0KG5l
d0FycmF5KS5lcXVhbFRvQXJyYXkoW10pOworICAgIH0KK30KKworY2xhc3MgRG9tVGVzdCBleHRl
bmRzIFRlc3QgeworICAgIHNldHVwKHJvb3RFbGVtZW50KSB7CisgICAgICAgIHRoaXMucm9vdEVs
ZW1lbnQgPSByb290RWxlbWVudDsKKyAgICB9CisKKyAgICB0ZXN0SW5qZWN0KCkgeworICAgICAg
ICB0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCA9ICIiOworICAgICAgICBjb25zdCBpbmplY3Rv
ciA9IGA8ZGl2IGlkPSIke01hdGgucmFuZG9tKCl9Ij48L2Rpdj5gOworICAgICAgICBET00uaW5q
ZWN0KHRoaXMucm9vdEVsZW1lbnQsIGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3QodGhp
cy5yb290RWxlbWVudC5pbm5lckhUTUwpLmVxdWFsVG9WYWx1ZShpbmplY3Rvcik7CisgICAgICAg
IHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gIiI7CisgICAgfQorCisgICAgdGVzdEJlZm9y
ZSgpIHsKKyAgICAgICAgbGV0IGluaXRpYWwgPSAnPGRpdiBpZD0iMSI+PC9kaXY+PGRpdiBpZD0i
MiI+PC9kaXY+PGRpdiBpZD0iMyI+PC9kaXY+JzsgCisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQu
aW5uZXJIVE1MID0gaW5pdGlhbDsKKyAgICAgICAgbGV0IGluamVjdG9yID0gYDxkaXYgaWQ9IiR7
TWF0aC5yYW5kb20oKX0iPjwvZGl2PmA7CisgICAgICAgIERPTS5iZWZvcmUodGhpcy5yb290RWxl
bWVudC5jaGlsZHJlblswXSwgaW5qZWN0b3IpOworICAgICAgICB0aGlzLmV4cGVjdCh0aGlzLnJv
b3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGAke2luamVjdG9yfSR7aW5pdGlhbH1g
KTsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0aWFsOworICAgICAg
ICBET00uYmVmb3JlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMV0sIGluamVjdG9yKTsKKyAg
ICAgICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwpLmVxdWFsVG9WYWx1
ZShgPGRpdiBpZD0iMSI+PC9kaXY+JHtpbmplY3Rvcn08ZGl2IGlkPSIyIj48L2Rpdj48ZGl2IGlk
PSIzIj48L2Rpdj5gKTsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0
aWFsOworICAgICAgICBET00uYmVmb3JlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMl0sIGlu
amVjdG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwp
LmVxdWFsVG9WYWx1ZShgPGRpdiBpZD0iMSI+PC9kaXY+PGRpdiBpZD0iMiI+PC9kaXY+JHtpbmpl
Y3Rvcn08ZGl2IGlkPSIzIj48L2Rpdj5gKTsKKyAgICB9CisKKyAgICB0ZXN0QWZ0ZXIoKSB7Cisg
ICAgICAgIGxldCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2PjxkaXYgaWQ9IjIiPjwvZGl2
PjxkaXYgaWQ9IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmlubmVySFRN
TCA9IGluaXRpYWw7CisgICAgICAgIGxldCBpbmplY3RvciA9IGA8ZGl2IGlkPSIke01hdGgucmFu
ZG9tKCl9Ij48L2Rpdj5gOworICAgICAgICBET00uYWZ0ZXIodGhpcy5yb290RWxlbWVudC5jaGls
ZHJlblswXSwgaW5qZWN0b3IpOworICAgICAgICB0aGlzLmV4cGVjdCh0aGlzLnJvb3RFbGVtZW50
LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGA8ZGl2IGlkPSIxIj48L2Rpdj4ke2luamVjdG9yfTxk
aXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2PmApOworICAgICAgICB0aGlzLnJvb3RF
bGVtZW50LmlubmVySFRNTCA9IGluaXRpYWw7CisgICAgICAgIERPTS5hZnRlcih0aGlzLnJvb3RF
bGVtZW50LmNoaWxkcmVuWzFdLCBpbmplY3Rvcik7CisgICAgICAgIHRoaXMuZXhwZWN0KHRoaXMu
cm9vdEVsZW1lbnQuaW5uZXJIVE1MKS5lcXVhbFRvVmFsdWUoYDxkaXYgaWQ9IjEiPjwvZGl2Pjxk
aXYgaWQ9IjIiPjwvZGl2PiR7aW5qZWN0b3J9PGRpdiBpZD0iMyI+PC9kaXY+YCk7CisgICAgICAg
IHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gaW5pdGlhbDsKKyAgICAgICAgRE9NLmFmdGVy
KHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMl0sIGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5l
eHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwpLmVxdWFsVG9WYWx1ZShgJHtpbml0aWFs
fSR7aW5qZWN0b3J9YCk7CisgICAgfQorCisgICAgdGVzdFByZXBlbmQoKSB7CisgICAgICAgIGxl
dCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2PjxkaXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9
IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCA9IGluaXRp
YWw7CisgICAgICAgIGxldCBpbmplY3RvciA9IGA8ZGl2IGlkPSIke01hdGgucmFuZG9tKCl9Ij48
L2Rpdj5gOworICAgICAgICBET00ucHJlcGVuZCh0aGlzLnJvb3RFbGVtZW50LCBpbmplY3Rvcik7
CisgICAgICAgIHRoaXMuZXhwZWN0KHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MKS5lcXVhbFRv
VmFsdWUoYCR7aW5qZWN0b3J9JHtpbml0aWFsfWApOworICAgIH0KKworICAgIHRlc3RBcHBlbmQo
KSB7CisgICAgICAgIGxldCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2PjxkaXYgaWQ9IjIi
PjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RFbGVtZW50Lmlu
bmVySFRNTCA9IGluaXRpYWw7CisgICAgICAgIGxldCBpbmplY3RvciA9IGA8ZGl2IGlkPSIke01h
dGgucmFuZG9tKCl9Ij48L2Rpdj5gOworICAgICAgICBET00uYXBwZW5kKHRoaXMucm9vdEVsZW1l
bnQsIGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5l
ckhUTUwpLmVxdWFsVG9WYWx1ZShgJHtpbml0aWFsfSR7aW5qZWN0b3J9YCk7CisgICAgfQorICAg
IAorICAgIHRlc3RSZXBsYWNlKCkgeworICAgICAgICBsZXQgaW5pdGlhbCA9ICc8ZGl2IGlkPSIx
Ij48L2Rpdj48ZGl2IGlkPSIyIj48L2Rpdj48ZGl2IGlkPSIzIj48L2Rpdj4nOyAKKyAgICAgICAg
dGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0aWFsOworICAgICAgICBsZXQgaW5qZWN0
b3IgPSBgPGRpdiBpZD0iJHtNYXRoLnJhbmRvbSgpfSI+PC9kaXY+YDsKKyAgICAgICAgRE9NLnJl
cGxhY2UodGhpcy5yb290RWxlbWVudC5jaGlsZHJlblswXSwgaW5qZWN0b3IpOworICAgICAgICB0
aGlzLmV4cGVjdCh0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGAke2lu
amVjdG9yfTxkaXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2PmApOworICAgIH0KKyAg
ICAKKyAgICB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBsZXQgaW5pdGlhbCA9ICc8ZGl2IGlkPSIx
Ij48L2Rpdj48ZGl2IGlkPSIyIj48L2Rpdj48ZGl2IGlkPSIzIj48L2Rpdj4nOyAKKyAgICAgICAg
dGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0aWFsOworICAgICAgICBET00ucmVtb3Zl
KHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMF0pOworICAgICAgICB0aGlzLmV4cGVjdCh0aGlz
LnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGA8ZGl2IGlkPSIyIj48L2Rpdj48
ZGl2IGlkPSIzIj48L2Rpdj5gKTsKKyAgICB9Cit9CisKK2NsYXNzIFJlZlRlc3QgZXh0ZW5kcyBU
ZXN0IHsKKyAgICBzZXR1cChyb290RWxlbWVudCkgeworICAgICAgICB0aGlzLnJvb3RFbGVtZW50
ID0gcm9vdEVsZW1lbnQ7CisgICAgfQorCisgICAgYXN5bmMgdGVzdE9uRWxlbWVudE1vdW50KCkg
eworICAgICAgICBsZXQgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIGxldCBjdXJyZW50UmVm
ID0gbnVsbDsKKyAgICAgICAgY29uc3QgY3JlYXRBQ29tcG9uZW50ID0gKCkgPT4geworICAgICAg
ICAgICAgbGV0IHJlZiA9IFJFRi5jcmVhdGVSZWYoeworICAgICAgICAgICAgICAgIG9uRWxlbWVu
dE1vdW50OiAoZWxlbWVudCkgPT4geworICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQgPSB0
cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgY3Vy
cmVudFJlZiA9IHJlZjsKKyAgICAgICAgICAgIHJldHVybiBgPGRpdiByZWY9IiR7cmVmfSI+PC9k
aXY+YDsKKyAgICAgICAgfTsKKyAgICAgICAgICAgIAorICAgICAgICBjb25zdCBmaXJzdENvbXAg
PSBjcmVhdEFDb21wb25lbnQoKTsKKyAgICAgICAgRE9NLmluamVjdCh0aGlzLnJvb3RFbGVtZW50
LCBmaXJzdENvbXApOworICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JSZWZNb3VudGVkKGN1cnJl
bnRSZWYpOworICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZSh0cnVl
KTsKKyAgICAgICAgdGhpcy5leHBlY3QoY3VycmVudFJlZi5lbGVtZW50Lm91dGVySFRNTCkuZXF1
YWxUb1ZhbHVlKGZpcnN0Q29tcCk7CisKKyAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAg
ICAgIGNvbnN0IHNlY29uZENvbXAgPSBjcmVhdEFDb21wb25lbnQoKTsKKyAgICAgICAgRE9NLnJl
cGxhY2UodGhpcy5yb290RWxlbWVudC5jaGlsZHJlblswXSwgc2Vjb25kQ29tcCk7CisgICAgICAg
IGF3YWl0IHRoaXMud2FpdEZvclJlZk1vdW50ZWQoY3VycmVudFJlZik7CisgICAgICAgIHRoaXMu
ZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKHRydWUpOworICAgICAgICB0aGlzLmV4cGVj
dChjdXJyZW50UmVmLmVsZW1lbnQub3V0ZXJIVE1MKS5lcXVhbFRvVmFsdWUoc2Vjb25kQ29tcCk7
CisgICAgfQorCisgICAgYXN5bmMgdGVzdE9uRWxlbWVudFVubW91bnQoKSB7CisgICAgICAgIGxl
dCB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgbGV0IGN1cnJlbnRSZWYgPSBudWxsOworICAg
ICAgICBjb25zdCBjcmVhdEFDb21wb25lbnQgPSAoKSA9PiB7CisgICAgICAgICAgICBsZXQgcmVm
ID0gUkVGLmNyZWF0ZVJlZih7CisgICAgICAgICAgICAgICAgb25FbGVtZW50VW5tb3VudDogKGVs
ZW1lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGN1cnJlbnRSZWYgPSBy
ZWY7CisgICAgICAgICAgICByZXR1cm4gYDxkaXYgcmVmPSIke3JlZn0iPjwvZGl2PmA7CisgICAg
ICAgIH07CisKKyAgICAgICAgY29uc3QgZmlyc3RDb21wID0gY3JlYXRBQ29tcG9uZW50KCk7Cisg
ICAgICAgIERPTS5pbmplY3QodGhpcy5yb290RWxlbWVudCwgZmlyc3RDb21wKTsKKyAgICAgICAg
RE9NLnJlcGxhY2UodGhpcy5yb290RWxlbWVudC5jaGlsZHJlblswXSwgIjxkaXY+PC9kaXY+Iik7
CisgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlZlVubW91bnRlZChjdXJyZW50UmVmKTsKKyAg
ICAgICAgdGhpcy5leHBlY3QodHJpZ2dlcmVkKS5lcXVhbFRvVmFsdWUodHJ1ZSk7CisgICAgICAg
IHRoaXMuZXhwZWN0KGN1cnJlbnRSZWYuZWxlbWVudC5wYXJlbnRFbGVtZW50KS5lcXVhbFRvVmFs
dWUobnVsbCk7CisKKyAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIERPTS5pbmpl
Y3QodGhpcy5yb290RWxlbWVudCwgZmlyc3RDb21wKTsKKyAgICAgICAgRE9NLnJlbW92ZSh0aGlz
LnJvb3RFbGVtZW50LmNoaWxkcmVuWzBdKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkRSA9IG51bGw7
CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JSZWZVbm1vdW50
ZWQoY3VycmVudFJlZik7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIC8vIGRl
c3RvcmllZCByZWYgd29uJ3QgYmUgdHJpZ2dlcmVkCisgICAgICAgICAgICB0aGlzLmV4cGVjdCh0
cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZShmYWxzZSk7CisgICAgICAgICAgICBleHBlY3RlZEUgPSBl
OworICAgICAgICB9CisgICAgICAgIHRoaXMuZXhwZWN0KGV4cGVjdGVkRSkubm90RXF1YWxUb1Zh
bHVlKG51bGwpOworICAgICAgICAKKyAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAg
IGNvbnN0IHNlY29uZENvbXAgPSBjcmVhdEFDb21wb25lbnQoKTsKKyAgICAgICAgRE9NLmluamVj
dCh0aGlzLnJvb3RFbGVtZW50LCBzZWNvbmRDb21wKTsKKyAgICAgICAgRE9NLnJlbW92ZSh0aGlz
LnJvb3RFbGVtZW50LmNoaWxkcmVuWzBdKTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yUmVm
VW5tb3VudGVkKGN1cnJlbnRSZWYpOworICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVx
dWFsVG9WYWx1ZSh0cnVlKTsKKyAgICAgICAgdGhpcy5leHBlY3QoY3VycmVudFJlZi5lbGVtZW50
LnBhcmVudEVsZW1lbnQpLmVxdWFsVG9WYWx1ZShudWxsKTsKKyAgICB9CisgICAgCisgICAgYXN5
bmMgdGVzdE9uQ29tcGxleFN0YXRlVXBkYXRlKCkgeworICAgICAgICBsZXQgdmVyaWZpZXIgPSBu
dWxsOworICAgICAgICBsZXQgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIGxldCBleHBlY3Rl
ZEUgPSBudWxsOworICAgICAgICBsZXQgaW5pdGlhbFN0YXRlID0geworICAgICAgICAgICAgaW5p
dGlhbFN0YXRlOiBNYXRoLnJhbmRvbSgpCisgICAgICAgIH07CisgICAgICAgIGxldCByZWYgPSBS
RUYuY3JlYXRlUmVmKHsKKyAgICAgICAgICAgIG9uU3RhdGVVcGRhdGU6KGVsZW1lbnQsIHN0YXRl
RGlmZiwgc3RhdGUpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodmVyaWZpZXIpIHZlcmlmaWVy
KGVsZW1lbnQsIHN0YXRlRGlmZiwgc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsK
KyAgICAgICAgcmVmLnNldFN0YXRlKGluaXRpYWxTdGF0ZSk7CisgICAgICAgIHRyeSB7CisgICAg
ICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGF0ZVVwZGF0ZWQocmVmKTsKKyAgICAgICAgfSBj
YXRjaCAoZSkgeworICAgICAgICAgICAgZXhwZWN0ZWRFID0gZTsKKyAgICAgICAgfQorICAgICAg
ICAvLyBiZWZvcmUgZWxlbWVudCBtb3VudCwgd2UgZG9uJ3QgdHJpZ2dlciBzdGF0ZSB1cGRhdGUg
Y2FsbGJhY2ssIHdlIGp1c3Qgc2F2ZSB0aGUgc3RhdGUKKyAgICAgICAgdGhpcy5leHBlY3QodHJp
Z2dlcmVkKS5lcXVhbFRvVmFsdWUoZmFsc2UpOworICAgICAgICB0aGlzLmV4cGVjdChleHBlY3Rl
ZEUpLm5vdEVxdWFsVG9WYWx1ZShudWxsKTsKKyAgICAgICAgdGhpcy5leHBlY3QocmVmLnN0YXRl
LmluaXRpYWxTdGF0ZSkuZXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0ZS5pbml0aWFsU3RhdGUpOwor
ICAgICAgICAvLyBFYWNoIHRpbWUgaXQgd2lsbCBjcmVhdGUgYSBuZXcgc3RhdGUgb2JqZWN0Cisg
ICAgICAgIHRoaXMuZXhwZWN0KHJlZi5zdGF0ZSkubm90RXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0
ZSk7CisgICAgICAgIAorICAgICAgICBET00uaW5qZWN0KHRoaXMucm9vdEVsZW1lbnQsIGA8ZGl2
IHJlZj0iJHtyZWZ9Ij48L2Rpdj5gKTsKKyAgICAgICAgdmVyaWZpZXIgPSAoZWxlbWVudCwgc3Rh
dGVEaWZmLCBzdGF0ZSkgPT4geworICAgICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlRGlmZi5pbml0aWFsU3RhdGUpLmVxdWFsVG9WYWx1ZShp
bml0aWFsU3RhdGUuaW5pdGlhbFN0YXRlKTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRl
LmZha2VTdGF0ZSkuZXF1YWxUb1ZhbHVlKHVuZGVmaW5lZCk7CisgICAgICAgIH07CisgICAgICAg
IGF3YWl0IHRoaXMud2FpdEZvclN0YXRlVXBkYXRlZChyZWYpOworICAgICAgICB0aGlzLmV4cGVj
dCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZSh0cnVlKTsKKyAgICAgICAgCisgICAgICAgIHRyaWdn
ZXJlZCA9IGZhbHNlOworICAgICAgICBsZXQgZmFrZVN0YXRlID0geworICAgICAgICAgICAgZmFr
ZVN0YXRlOiBNYXRoLnJhbmRvbSgpCisgICAgICAgIH07CisgICAgICAgIHZlcmlmaWVyID0gKGVs
ZW1lbnQsIHN0YXRlRGlmZiwgc3RhdGUpID0+IHsKKyAgICAgICAgICAgIHRyaWdnZXJlZCA9IHRy
dWU7CisgICAgICAgICAgICB0aGlzLmV4cGVjdChzdGF0ZURpZmYuZmFrZVN0YXRlKS5lcXVhbFRv
VmFsdWUoZmFrZVN0YXRlLmZha2VTdGF0ZSk7CisgICAgICAgICAgICB0aGlzLmV4cGVjdChzdGF0
ZS5mYWtlU3RhdGUpLmVxdWFsVG9WYWx1ZSh1bmRlZmluZWQpOworICAgICAgICAgICAgCisgICAg
ICAgICAgICB0aGlzLmV4cGVjdChzdGF0ZS5pbml0aWFsU3RhdGUpLmVxdWFsVG9WYWx1ZShpbml0
aWFsU3RhdGUuaW5pdGlhbFN0YXRlKTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlRGlm
Zi5pbml0aWFsU3RhdGUpLmVxdWFsVG9WYWx1ZSh1bmRlZmluZWQpOworICAgICAgICB9OworICAg
ICAgICByZWYuc2V0U3RhdGUoZmFrZVN0YXRlKTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9y
U3RhdGVVcGRhdGVkKHJlZik7CisgICAgICAgIHRoaXMuZXhwZWN0KHJlZi5zdGF0ZS5mYWtlU3Rh
dGUpLmVxdWFsVG9WYWx1ZShmYWtlU3RhdGUuZmFrZVN0YXRlKTsKKyAgICAgICAgdGhpcy5leHBl
Y3QocmVmLnN0YXRlLmluaXRpYWxTdGF0ZSkuZXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0ZS5pbml0
aWFsU3RhdGUpOworICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZSh0
cnVlKTsKKyAgICB9CisgICAgCisgICAgYXN5bmMgdGVzdE9uVmFsdWVTdGF0ZVVwZGF0ZSgpIHsK
KyAgICAgICAgbGV0IHRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICBsZXQgdmVyaWZpZXIgPSBu
dWxsOworICAgICAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBNYXRoLnJhbmRvbSgpOworICAgICAg
ICBjb25zdCByZWYgPSBSRUYuY3JlYXRlUmVmKHsKKyAgICAgICAgICAgIHN0YXRlOiBpbml0aWFs
U3RhdGUsCisgICAgICAgICAgICBvblN0YXRlVXBkYXRlOihlbGVtZW50LCBzdGF0ZURpZmYsIHN0
YXRlKSA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHZlcmlmaWVyKSB2ZXJpZmllcihlbGVtZW50
LCBzdGF0ZURpZmYsIHN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAg
IHZlcmlmaWVyID0gKGVsZW1lbnQsIHN0YXRlRGlmZiwgc3RhdGUpID0+IHsKKyAgICAgICAgICAg
IHRyaWdnZXJlZCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmV4cGVjdChlbGVtZW50KS5ub3RF
cXVhbFRvVmFsdWUobnVsbCk7CisgICAgICAgICAgICB0aGlzLmV4cGVjdChzdGF0ZURpZmYpLmVx
dWFsVG9WYWx1ZShpbml0aWFsU3RhdGUpOworICAgICAgICB9CisgICAgICAgIERPTS5pbmplY3Qo
dGhpcy5yb290RWxlbWVudCwgYDxkaXYgcmVmPSIke3JlZn0iPjwvZGl2PmApOworICAgICAgICBh
d2FpdCB0aGlzLndhaXRGb3JTdGF0ZVVwZGF0ZWQocmVmKTsKKyAgICAgICAgdGhpcy5leHBlY3Qo
dHJpZ2dlcmVkKS5lcXVhbFRvVmFsdWUodHJ1ZSk7CisKKyAgICAgICAgY29uc3QgbmV3U3RhdGUg
PSBudWxsOworICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgdmVyaWZpZXIgPSAo
ZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0ZSkgPT4geworICAgICAgICAgICAgdHJpZ2dlcmVkID0g
dHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlRGlmZikuZXF1YWxUb1ZhbHVlKG5l
d1N0YXRlKTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlKS5lcXVhbFRvVmFsdWUoaW5p
dGlhbFN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICByZWYuc2V0U3RhdGUobmV3U3RhdGUpOwor
ICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGF0ZVVwZGF0ZWQocmVmKTsKKyAgICAgICAgdGhp
cy5leHBlY3QodHJpZ2dlcmVkKS5lcXVhbFRvVmFsdWUodHJ1ZSk7CisgICAgICAgIAorICAgICAg
ICBjb25zdCBuZXdTdGF0ZTEgPSAwOworICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAg
ICAgdmVyaWZpZXIgPSAoZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0ZSkgPT4geworICAgICAgICAg
ICAgdHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlRGlmZiku
ZXF1YWxUb1ZhbHVlKG5ld1N0YXRlMSk7CisgICAgICAgICAgICB0aGlzLmV4cGVjdChzdGF0ZSku
ZXF1YWxUb1ZhbHVlKG5ld1N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICByZWYuc2V0U3RhdGUo
bmV3U3RhdGUxKTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yU3RhdGVVcGRhdGVkKHJlZik7
CisgICAgICAgIHRoaXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKHRydWUpOworICAg
ICAgICAKKyAgICAgICAgY29uc3QgbmV3U3RhdGUyID0gdW5kZWZpbmVkOworICAgICAgICBsZXQg
ZXhwZWN0ZWRFID0gbnVsbDsKKyAgICAgICAgcmVmLnNldFN0YXRlKG5ld1N0YXRlMSk7CisgICAg
ICAgIHRyeSB7CisgICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGF0ZVVwZGF0ZWQocmVm
KTsKKyAgICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgICAgICBleHBlY3RlZEUgPSBlOworICAg
ICAgICB9CisgICAgICAgIHRoaXMuZXhwZWN0KGV4cGVjdGVkRSkubm90RXF1YWxUb1ZhbHVlKG51
bGwpOworICAgIH0KK30KK2V4cG9ydCB7RGlmZlRlc3QsIERvbVRlc3QsIFJlZlRlc3R9OwpkaWZm
IC0tZ2l0IGEvVG9vbHMvcmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFy
eS9qcy90ZXN0L2luZGV4Lmh0bWwgYi9Ub29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3
L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xNDk2MThjZTQ1
ZmJlMGY1MWE5ZTM1NmY5MjY3ZDY1NjI2NTMyY2JkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMv
cmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy90ZXN0L2luZGV4
Lmh0bWwKQEAgLTAsMCArMSwyNSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgICA8aGVh
ZD4KKyAgICAgICAgPHRpdGxlPlRlc3Q8L3RpdGxlPgorICAgICAgICA8bGluayByZWw9InN0eWxl
c2hlZXQiIGhyZWY9Imh0dHBzOi8vcmVzdWx0cy5zYWZhcmkuYXBwbGUuY29tL2xpYnJhcnkvY3Nz
L3dlYmtpdC5jc3MiPjwvbGluaz4KKyAgICAgICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBz
aXplcz0iMzJ4MzIiIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iaHR0cHM6Ly93ZWJraXQub3Jn
L2Zhdmljb24uaWNvIj4KKyAgICAgICAgPG1ldGEgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRo
LCBpbml0aWFsLXNjYWxlPTEsIHZpZXdwb3J0LWZpdD1jb3ZlciIgbmFtZT0idmlld3BvcnQiPgor
ICAgICAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CisgICAgPC9oZWFkPgorICAgIDxib2R5Pgor
ICAgICAgICA8ZGl2IGlkPSJhcHAiPjwvZGl2PgorICAgICAgICA8c2NyaXB0IHR5cGU9Im1vZHVs
ZSI+CisgICAgICAgICAgICBpbXBvcnQge0RPTX0gZnJvbSAiLi4vUmVmLmpzIjsKKyAgICAgICAg
ICAgIGltcG9ydCB7VGVzdENvbnRyb2xsZXJ9IGZyb20gIi4uL1Rlc3QuanMiOworICAgICAgICAg
ICAgaW1wb3J0IHtUZXN0QXBwfSBmcm9tICIuLi9jb21wb25lbnRzL1Rlc3RDb21wb25lbnRzLmpz
IjsKKyAgICAgICAgICAgIGNvbnN0IHRlc3RDb250cm9sbGVyID0gbmV3IFRlc3RDb250cm9sbGVy
KCk7CisgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBtYWluKCkgeworICAgICAgICAgICAgICAg
IC8vIFRlc3QgZmlsZSBsaXN0OiBSb290IFBhdGggd2lsbCBiZSBUZXN0LmpzJ3MgZm9sZGVyCisg
ICAgICAgICAgICAgICAgYXdhaXQgdGVzdENvbnRyb2xsZXIuY29sbGVjdEZpbGUoIi4vdGVzdC9S
ZWZUZXN0LmpzIik7CisgICAgICAgICAgICAgICAgRE9NLmluamVjdChkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgiYXBwIiksIFRlc3RBcHAodGVzdENvbnRyb2xsZXIpKTsKKyAgICAgICAgICAgIH07
CisgICAgICAgICAgICBtYWluKCk7CisgICAgICAgIDwvc2NyaXB0PgorICAgIDwvYm9keT4KKzwv
aHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>379265</attachid>
            <date>2019-09-20 13:38:31 -0700</date>
            <delta_ts>2019-09-24 10:48:27 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-201778-20190920133830.patch</filename>
            <type>text/plain</type>
            <size>29796</size>
            <attacher name="Zhifei Fang">zhifei_fang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjQ5NTkyCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYWYwNGM1ZWVjNDc0NTQ2OGIwYWM5M2EwMjY3MWYzYWVm
NjIxNzM0Zi4uMmIzZWI1NTU5ZTM0MTBiODUzYzU4ZTI4MmQ1MTk1OWVkZjhmNDgxMyAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ5
IEBACisyMDE5LTA5LTEzICBaaGlmZWkgRmFuZyAgPHpoaWZlaV9mYW5nQGFwcGxlLmNvbT4KKwor
ICAgICAgICBBZGQgdGVzdHMgZm9yIFJlZi5qcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMTc3OC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHJlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3Rh
dGljL2xpYnJhcnkvanMvUmVmLmpzOgorICAgICAgICAoYXBwbHlTdGF0ZURpZmYpOiBudWxsLCAw
LCBmYWxzZSBhcmUgYWxsIHZhbGlkIHN0YXRlCisgICAgICAgIChSZWYucHJvdG90eXBlLnNldFN0
YXRlKTogV2Ugc2hvdWxkIGRvIG5vdGhpbmcgZm9yIHVuZGVmaW5lZCBzdGF0ZURpZmYKKyAgICAg
ICAgKiByZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL1Rlc3Qu
anM6IEFkZGVkLgorICAgICAgICAoQXNzZXJ0RmFpbGVkRXJyb3IpOgorICAgICAgICAoRXhwZWN0
KTogUGVyZm9ybSBhc3NlcnRpb25zIGR1cmluZyB1bml0IHRlc3RzLgorICAgICAgICAoRXhwZWN0
LnByb3RvdHlwZS5pc1R5cGUpOgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5lcXVhbFRvVmFs
dWUpOgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5lcXVhbFRvSHRtbFdpdGhvdXRSZWYpOgor
ICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5ub3RFcXVhbFRvVmFsdWUpOgorICAgICAgICAoRXhw
ZWN0LnByb3RvdHlwZS5ncmVhdGVyVGhhbik6CisgICAgICAgIChFeHBlY3QucHJvdG90eXBlLmdy
ZWF0ZXJUaGFuT3JFcXVhbFRvKToKKyAgICAgICAgKEV4cGVjdC5wcm90b3R5cGUubGVzc1RoYW4p
OgorICAgICAgICAoRXhwZWN0LnByb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWxUbyk6CisgICAgICAg
IChUZXN0U3VpdGUpOiBDb21tb24gVGVzdFN1aXRlIGNsYXNzIGZvciB1c2VyIHRvIGV4dGVuZC4g
CisgICAgICAgIChUZXN0U3VpdGUucHJvdG90eXBlLmV4cGVjdCk6CisgICAgICAgIChUZXN0U3Vp
dGUucHJvdG90eXBlLnNsZWVwKTogVGVzdCB3aWxsIHNsZWVwIGZvciBjZXJ0YWluIG1zCisgICAg
ICAgIChUZXN0U3VpdGUucHJvdG90eXBlLndhaXRGb3JTaWduYWwpOiBXYWl0IHVudGlsIHdlIHJl
Y2VpdmUgYSBjZXJ0YWluIHNpZ25hbCB3aXRoIHRpbWVvdXQKKyAgICAgICAgKFRlc3RTdWl0ZS5w
cm90b3R5cGUud2FpdEZvclJlZk1vdW50ZWQpOiBXYWl0IHVudGlsIHdlIHJlY2VpdmUgcmVmIG9i
amVjdCdzIG9uRWxlbWVudE1vdW50IHNpZ25hbCB3aXRoIHRpbWVvdXQKKyAgICAgICAgKFRlc3RT
dWl0ZS5wcm90b3R5cGUud2FpdEZvclJlZlVubW91bnRlZCk6IFdhaXQgdW50aWwgd2UgcmVjZWl2
ZSByZWYgb2JqZWN0J3Mgb25FbGVtZW50VW5tb3VudCBzaWduYWwgd2l0aCB0aW1lb3V0CisgICAg
ICAgIChUZXN0U3VpdGUucHJvdG90eXBlLndhaXRGb3JTdGF0ZVVwZGF0ZWQpOldhaXQgdW50aWwg
d2UgcmVjZWl2ZSByZWYgb2JqZWN0J3Mgb25TdGF0ZVVwZGF0ZSBzaWduYWwgd2l0aCB0aW1lb3V0
CisgICAgICAgIChUZXN0U3VpdGUucHJvdG90eXBlLmFzeW5jLnNldHVwKTogQ29tbW9uIGludGVy
ZmFjZSBmb3Igc2V0dXAgYSB0ZXN0IHN1aXRlCisgICAgICAgIChUZXN0U3VpdGUucHJvdG90eXBl
LmFzeW5jLmNsZWFyVXApOiBDb21tb24gaW50ZXJmYWNlIGZvciBjbGVhciB1cCBhIHRlc3Qgc3Vp
dGUKKyAgICAgICAgKGdldFRlc3RGdWNudGlvbk5hbWVzKTogQ29sbGVjdCBhbGwgdGhlIHRlc3Qg
bWV0aG9kIG9mIGEgdGVzdCBpbnN0YW5jZS4KKyAgICAgICAgKFRlc3RSZXN1bHQpOgorICAgICAg
ICAoVGVzdFJlc3VsdC5wcm90b3R5cGUuY2F0Y2hFeGNlcHRpb24pOgorICAgICAgICAoYXN5bmMu
Z2V0VGVzdFJlc3VsdCk6IFJ1biB0aGUgdGVzdCBhbmQgZ2VuZXJhdGUgYSBUZXN0UmVzdWx0IG9i
amVjdAorICAgICAgICAoVGVzdENvbnRyb2xsZXIpOgorICAgICAgICAoVGVzdENvbnRyb2xsZXIu
cHJvdG90eXBlLmFkZFJlc3VsdEhhbmRsZXIpOiBUZXN0IGNvbnRyb2xsZXIgd2lsbCBzZW5kIG5v
dGlmaWNhdGlvbiBvZiBhIHRlc3QgcmVzdWx0IHRvIHJlc3VsdCBoYW5kbGVyCisgICAgICAgIChU
ZXN0Q29udHJvbGxlci5wcm90b3R5cGUuYWRkU2V0dXBBcmdzKTogVGhpcyBnaXZlcyBzb21lIGFk
ZGl0aW9uYWwgYXJncyBmb3IgdGhlIGNvbW1vbiBzZXR1cCBtZXRob2QgZm9yIGVhY2ggdGVzdCBj
bGFzcywgCisgICAgICAgIGl0IGlzIHRoZSBiZXN0IHBsYWNlIHRvIHNldHVwIHNvbWV0aGluZyBs
aWtlIGEgcm9vdCBlbGVtZW50LCBhIGZha2UgZGF0YSBzb3VyY2UsIGV0YworICAgICAgICAoVGVz
dENvbnRyb2xsZXIucHJvdG90eXBlLmNvbGxlY3QpOiBUaGlzIG1ldGhvZCB1c2VkIGZvciBjb2xs
ZWN0IHRoZSB0ZXN0IGNsYXNzZXMuCisgICAgICAgIChUZXN0Q29udHJvbGxlci5wcm90b3R5cGUu
YXN5bmMuY29sbGVjdEZpbGUpOiBJdCB3aWxsIGltcG9ydCB0aGUgZmlsZSBhcyBhIG1vZHVsZSBk
eW5hbWljbHkgYW5kIGNvbGxlY3QgYWxsIHRoZSB0ZXN0IGNsYXNzZXMgdGhhdCBtb2R1bGUgZXhw
b3J0CisgICAgICAgIChUZXN0Q29udHJvbGxlci5wcm90b3R5cGUuYXN5bmMucnVuVGVzdCk6IEl0
IHdpbGwgcnVuIGEgdGVzdCBtZXRob2Qgb2YgYSB0ZXN0IGNsYXNzCisgICAgICAgIChUZXN0Q29u
dHJvbGxlci5wcm90b3R5cGUuYXN5bmMucnVuKTogSXQgd2lsbCBydW4gYWxsIHRlc3Qgb3IgYSB0
ZXN0IGNsYXNzIG9yIGEgdGVzdCBtZXRob2QKKyAgICAgICAgKiByZXN1bHRzZGJweS9yZXN1bHRz
ZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL2NvbXBvbmVudHMvVGVzdENvbXBvbmVudHMuanM6
IGNvbXBvbmVudHMgZm9yIHRlc3QgYXBwLgorICAgICAgICAqIHJlc3VsdHNkYnB5L3Jlc3VsdHNk
YnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvdGVzdC9SZWZUZXN0LmpzOiBSZWYuanMgdGVzdCBj
YXNlcy4KKyAgICAgICAgKiByZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJy
YXJ5L2pzL3Rlc3QvaW5kZXguaHRtbDogVGVzdCBhcHAgZW50cnkuCisKIDIwMTktMDktMDYgIEFs
ZXggQ2hyaXN0ZW5zZW4gIDxhY2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICBEZXBy
ZWNhdGUgYWxsIFdLQ29va2llTWFuYWdlclJlZiBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL1Rvb2xz
L3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvUmVmLmpzIGIv
VG9vbHMvcmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9SZWYu
anMKaW5kZXggYzkxNGQ1YjgwMzRiNDQxZjA5NjdlYWQ0OTYxYzE1ZGU2NGUyZmEzZi4uZjBmMGIw
MzlhN2JkY2Q0NWQ3ODU2MDg0NzU5MDczM2JjOTQ4MDgyZiAxMDA2NDQKLS0tIGEvVG9vbHMvcmVz
dWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9SZWYuanMKKysrIGIv
VG9vbHMvcmVzdWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9SZWYu
anMKQEAgLTIxNyw3ICsyMTcsNyBAQCBmdW5jdGlvbiBpc01lcmdlYWJsZVN0YXRlKHN0YXRlKSB7
CiB9CiAKIGZ1bmN0aW9uIGFwcGx5U3RhdGVEaWZmKHN0YXRlLCBkaWZmKSB7Ci0gICAgaWYgKCFk
aWZmKQorICAgIGlmIChkaWZmID09PSB1bmRlZmluZWQpCiAgICAgICAgIHJldHVybiBzdGF0ZTsK
ICAgICBpZiAoIWlzTWVyZ2VhYmxlU3RhdGUoZGlmZikpCiAgICAgICAgIHJldHVybiBkaWZmOwpA
QCAtMjc1LDYgKzI3NSw4IEBAIGNsYXNzIFJlZiB7CiAgICAgICAgIHJldHVybiB0aGlzLmtleTsK
ICAgICB9CiAgICAgc2V0U3RhdGUoc3RhdGVEaWZmKSB7CisgICAgICAgIGlmIChzdGF0ZURpZmYg
PT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgaWYgKFRSQUNFX1NU
QVRFKQogICAgICAgICAgICAgdGhpcy5zdGF0ZVRyYWNlci5wdXNoKHN0YXRlRGlmZik7CiAgICAg
ICAgIGVsc2UKZGlmZiAtLWdpdCBhL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcv
c3RhdGljL2xpYnJhcnkvanMvVGVzdC5qcyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5
L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvVGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yNzZkMTIwNTRjOTIw
NzYxZjQ2MzEzMDcwNmVkNjhhYzllY2Y5ZmExCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcmVz
dWx0c2RicHkvcmVzdWx0c2RicHkvdmlldy9zdGF0aWMvbGlicmFyeS9qcy9UZXN0LmpzCkBAIC0w
LDAgKzEsMjQxIEBACitpbXBvcnQge0V2ZW50U3RyZWFtfSBmcm9tICcuL1JlZi5qcyc7CisKK2Ns
YXNzIEFzc2VydEZhaWxlZEVycm9yIGV4dGVuZHMgRXJyb3IgeworICAgIGNvbnN0cnVjdG9yKG1z
ZykgeworICAgICAgICBzdXBlcihtc2cpCisgICAgfQorfQorCitmdW5jdGlvbiBzdHJpcFJlZiho
dG1sKSB7CisgICAgcmV0dXJuIGh0bWwucmVwbGFjZSgvcmVmPSJbXHdcZFwtXSsiL2csICIiKQor
fQorCitjbGFzcyBFeHBlY3QgeworICAgIGNvbnN0cnVjdG9yKHZhbHVlQSkgeworICAgICAgICB0
aGlzLnZhbHVlQSA9IHZhbHVlQTsKKyAgICAgICAgdGhpcy52YWx1ZUIgPSBudWxsOworICAgICAg
ICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBpc1R5cGUodHlwZSkgeworICAgICAgICBpZiAo
dHlwZSA9PT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVBICE9PSBudWxsKQor
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRGYWlsZWRFcnJvcihgJHt0aGlzLnZhbHVl
QX0gc2hvdWxkIGJlIG51bGxgKTsKKyAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4odHlw
ZSkgfHwgdHlwZSA9PT0gIk5hTiIpIHsKKyAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHRo
aXMudmFsdWVBKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3Io
YCR7dGhpcy52YWx1ZUF9IHNob3VsZCBiZSBOYU5gKTsgICAgCisgICAgICAgIH0gZWxzZSBpZiAo
dHlwZSA9PT0gIkFycmF5IiB8fCB0eXBlID09PSAiYXJyYXkiIHx8IHR5cGUgPT09IEFycmF5KSB7
CisgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy52YWx1ZUEpKQorICAgICAgICAg
ICAgICAgIHRocm93IG5ldyBBc3NlcnRGYWlsZWRFcnJvcihgJHt0aGlzLnZhbHVlQX0gc2hvdWxk
IGJlIGFuIEFycmF5YCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWVBICE9
PSB0eXBlICYmIGZhbHNlID09PSB0aGlzLnZhbHVlQSBpbnN0YW5jZW9mIHR5cGUpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNob3VsZCBi
ZSB0eXBlICR7dHlwZX1gKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgZXF1
YWxUb1ZhbHVlKHZhbHVlQikgeworICAgICAgICBpZiAodGhpcy52YWx1ZUEgIT09IHZhbHVlQikK
KyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRGYWlsZWRFcnJvcihgJHt0aGlzLnZhbHVlQX0g
c2hvdWxkIGVxdWFsIHRvICR7dmFsdWVCfWApOworICAgIH0KKworICAgIGVxdWFsVG9IdG1sV2l0
aG91dFJlZihodG1sKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVxdWFsVG9WYWx1ZShzdHJpcFJl
Zih0aGlzLnZhbHVlQSksIHN0cmlwUmVmKGh0bWwpKTsKKyAgICB9CisKKyAgICBlcXVhbFRvQXJy
YXkoYXJyYXksIGNvbXBhcmUgPSAoeCwgeSkgPT4gZXhwZWN0KHgpLmVxdWFsVG9WYWx1ZSh5KSkg
eworICAgICAgICBleHBlY3QodGhpcy52YWx1ZUEpLmlzVHlwZSgiQXJyYXkiKTsKKyAgICAgICAg
ZXhwZWN0KGFycmF5KS5pc1R5cGUoIkFycmF5Iik7CisgICAgICAgIGV4cGVjdCh0aGlzLnZhbHVl
QS5sZW5ndGgpLmVxdWFsVG9WYWx1ZShhcnJheS5sZW5ndGgpOworICAgICAgICBmb3IgKGxldCBp
ID0gMDsgaSA8IHRoaXMudmFsdWVBLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb21wYXJl
KHRoaXMudmFsdWVBW2ldLCBhcnJheVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBub3RF
cXVhbFRvVmFsdWUodmFsdWVCKSB7CisgICAgICAgIGlmICh0aGlzLnZhbHVlQSA9PT0gdmFsdWVC
KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEZhaWxlZEVycm9yKGAke3RoaXMudmFsdWVB
fSBzaG91bGQgbm90IGVxdWFsIHRvICR7dmFsdWVCfWApOworICAgIH0KKworICAgIGdyZWF0ZXJU
aGFuKHZhbHVlQikgeworICAgICAgICBpZiAodGhpcy52YWx1ZUEgPD0gdmFsdWVCKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEFzc2VydEZhaWxlZEVycm9yKGAke3RoaXMudmFsdWVBfSBzaG91bGQg
Z3JlYXRlciB0aGFuICR7dmFsdWVCfWApOworICAgIH0KKworICAgIGdyZWF0ZXJUaGFuT3JFcXVh
bFRvKHZhbHVlQikgeworICAgICAgICBpZiAodGhpcy52YWx1ZUEgPCB2YWx1ZUIpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNob3VsZCBn
cmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHt2YWx1ZUJ9YCk7CisgICAgfQorCisgICAgbGVzc1Ro
YW4odmFsdWVCKSB7CisgICAgICAgIGlmICh0aGlzLnZhbHVlQSA+PSB2YWx1ZUIpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgQXNzZXJ0RmFpbGVkRXJyb3IoYCR7dGhpcy52YWx1ZUF9IHNob3VsZCBs
ZXNzIHRoYW4gJHt2YWx1ZUJ9YCk7CisgICAgfQorCisgICAgbGVzc1RoYW5PckVxdWFsVG8odmFs
dWVCKSB7CisgICAgICAgIGlmICh0aGlzLnZhbHVlQSA+IHZhbHVlQikKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBc3NlcnRGYWlsZWRFcnJvcihgJHt0aGlzLnZhbHVlQX0gc2hvdWxkIGxlc3MgdGhh
biBvciBlcXVhbCB0byAke3ZhbHVlQn1gKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIGV4cGVjdCh2
YWx1ZSkgeworICAgIHJldHVybiBuZXcgRXhwZWN0KHZhbHVlKTsKK30KKworY2xhc3MgVGVzdFN1
aXRlIHsKKyAgICBleHBlY3QodmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGV4cGVjdCh2YWx1ZSk7
CisgICAgfQorCisgICAgc2xlZXAobWlsbGlzZWNvbmRzKSB7CisgICAgICAgIHJldHVybiBuZXcg
UHJvbWlzZSgocmVzb2x2ZSkgPT4geworICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBt
aWxsaXNlY29uZHMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB3YWl0Rm9yU2lnbmFsKHNp
bmdhbCwgbmFtZSwgdGltZW91dD0xMDAwKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgo
cmVzb2x2ZSwgcmVqZWN0KSA9PiB7CisgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4g
eworICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlcik7CisgICAgICAg
ICAgICAgICAgcmVzb2x2ZSgpOworICAgICAgICAgICAgICAgIHNpbmdhbC5yZW1vdmVMaXN0ZW5l
cihoYW5kbGVyKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb25zdCB0aW1lb3V0SGFu
ZGxlciA9IHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICAgICAgICAgIHNpbmdhbC5yZW1vdmVM
aXN0ZW5lcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICByZWplY3QobmV3IEFzc2VydEZhaWxl
ZEVycm9yKGBDYW5ub3QgZ2V0IHRoZSAke25hbWV9IHNpZ25hbCBhZnRlciAke3RpbWVvdXR9IG1z
YCkpOworICAgICAgICAgICAgfSwgdGltZW91dCk7CisgICAgICAgICAgICBzaW5nYWwuYWRkTGlz
dGVuZXIoaGFuZGxlcik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHdhaXRGb3JSZWZNb3Vu
dGVkKHJlZiwgdGltZW91dD0xMDAwKSB7CisgICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JTaWdu
YWwocmVmLm9uRWxlbWVudE1vdW50LCAibW91bnQiLCB0aW1lb3V0KTsKKyAgICB9CisKKyAgICB3
YWl0Rm9yUmVmVW5tb3VudGVkKHJlZiwgdGltZW91dD0xMDAwKSB7CisgICAgICAgIHJldHVybiB0
aGlzLndhaXRGb3JTaWduYWwocmVmLm9uRWxlbWVudFVubW91bnQsICJ1bm1vdW50IiwgdGltZW91
dCk7CisgICAgfQorCisgICAgd2FpdEZvclN0YXRlVXBkYXRlZChyZWYsIHRpbWVvdXQ9MTAwMCkg
eworICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yU2lnbmFsKHJlZi5vblN0YXRlVXBkYXRlLCAi
c3RhdGUgdXBkYXRlIiwgdGltZW91dCk7CisgICAgfQorCisgICAgYXN5bmMgc2V0dXAoKSB7fQor
ICAgIGFzeW5jIGNsZWFyVXAoKSB7fQorfQorCisKK2Z1bmN0aW9uIGdldFRlc3RGdWNudGlvbk5h
bWVzKHRlc3RPYmopIHsKKyAgICBjb25zdCBmaXhlZE1ldGhvZHMgPSBuZXcgU2V0KE9iamVjdC5n
ZXRPd25Qcm9wZXJ0eU5hbWVzKFRlc3RTdWl0ZS5wcm90b3R5cGUpKTsKKyAgICBjb25zdCB0ZXN0
T2JqTWV0aG9kcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3RPYmouY29uc3RydWN0
b3IucHJvdG90eXBlKTsKKyAgICBjb25zdCB0ZXN0TWV0aG9kcyA9IFtdOworICAgIGZvciAobGV0
IG1ldGhvZCBvZiB0ZXN0T2JqTWV0aG9kcykgeworICAgICAgICBpZiAoIWZpeGVkTWV0aG9kcy5o
YXMobWV0aG9kKSkKKyAgICAgICAgICAgIHRlc3RNZXRob2RzLnB1c2gobWV0aG9kKTsKKyAgICB9
CisgICAgcmV0dXJuIHRlc3RNZXRob2RzOworfQorCitjb25zdCBURVNUX1JFU1VMVF9UWVBFID0g
T2JqZWN0LmZyZWV6ZSh7CisgICAgU3VjY2VzczogU3ltYm9sKCJTdWNjZXNzIiksCisgICAgRXJy
b3I6IFN5bWJvbCgiRXJyb3IiKSwKKyAgICBGYWlsZWQ6IFN5bWJvbCgiRmFpbGVkIiksCit9KTsK
KworY2xhc3MgVGVzdFJlc3VsdCB7CisgICAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBmbk5hbWUp
IHsKKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIHRoaXMuZm5O
YW1lID0gZm5OYW1lOworICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRo
aXMudHlwZSA9IFRFU1RfUkVTVUxUX1RZUEUuU3VjY2VzczsKKyAgICB9CisgICAgCisgICAgY2F0
Y2hFeGNlcHRpb24oZSkgeworICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGU7CisgICAgICAgIGNv
bnNvbGUuZXJyb3IoZSk7CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXNzZXJ0RmFpbGVkRXJy
b3IpCisgICAgICAgICAgICB0aGlzLnR5cGUgPSBURVNUX1JFU1VMVF9UWVBFLkZhaWxlZDsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy50eXBlID0gVEVTVF9SRVNVTFRfVFlQRS5FcnJv
cjsKKyAgICB9Cit9CisKK2FzeW5jIGZ1bmN0aW9uIGdldFRlc3RSZXN1bHQob2JqLCBmbk5hbWUs
IGFyZ3MgPSBbXSkgeworICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXN0UmVzdWx0KG9iai5jb25z
dHJ1Y3Rvci5uYW1lLCBmbk5hbWUpOworICAgIHRyeSB7CisgICAgICAgIGF3YWl0IG9ialtmbk5h
bWVdKC4uLmFyZ3MpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgcmVzdWx0LmNhdGNoRXhj
ZXB0aW9uKGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjbGFzcyBUZXN0Q29u
dHJvbGxlciB7CisgICAgY29uc3RydWN0b3Ioc2V0dXBBcmdzKSB7CisgICAgICAgIHRoaXMuYWxs
VGVzdHMgPSB7fQorICAgICAgICB0aGlzLnJlc3VsdHNFcyA9IG5ldyBFdmVudFN0cmVhbSgpOwor
ICAgICAgICB0aGlzLnNldHVwQXJncyA9IEFycmF5LmlzQXJyYXkoc2V0dXBBcmdzKSA/IHNldHVw
QXJncyA6IFtdOworICAgIH0KKyAgICAKKyAgICBhZGRSZXN1bHRIYW5kbGVyKGhhbmRsZXIpIHsK
KyAgICAgICAgdGhpcy5yZXN1bHRzRXMuYWN0aW9uKGhhbmRsZXIpOworICAgIH0KKyAgICAKKyAg
ICBhZGRTZXR1cEFyZ3MoYXJncykgeworICAgICAgICB0aGlzLnNldHVwQXJncyA9IHRoaXMuc2V0
dXBBcmdzLmNvbmNhdChhcmdzKTsKKyAgICB9CisKKyAgICBjb2xsZWN0KHRlc3RTdWl0ZUNsYXNz
KSB7CisgICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IG5ldyB0ZXN0U3VpdGVDbGFzcygpOwor
ICAgICAgICBjb25zdCB0ZXN0TmFtZSA9IHRlc3RJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lOwor
ICAgICAgICBpZiAodGVzdE5hbWUgaW4gdGhpcy5hbGxUZXN0cykgeworICAgICAgICAgICAgdGhy
b3cgbmV3IEVycm9yKGAke3Rlc3ROYW1lfSBoYXMgYWxyZWFkeSBiZWVuIGNvbGxlY3RlZGApOwor
ICAgICAgICB9CisgICAgICAgIHRoaXMuYWxsVGVzdHNbdGVzdE5hbWVdID0gdGVzdEluc3RhbmNl
OworICAgIH0KKyAgICAKKyAgICBhc3luYyBjb2xsZWN0RmlsZShmaWxlUGF0aCkgeworICAgICAg
ICBjb25zdCB0ZXN0TW9kdWxlID0gYXdhaXQgaW1wb3J0KGZpbGVQYXRoKTsKKyAgICAgICAgT2Jq
ZWN0LmtleXModGVzdE1vZHVsZSkuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5jb2xsZWN0KHRl
c3RNb2R1bGVbY2xhc3NOYW1lXSkpOworICAgIH0KKworICAgIGFzeW5jIHJ1blRlc3QodGVzdE5h
bWUsIGZuTmFtZSkgeworICAgICAgICBsZXQgaGF2ZUVycm9yID0gZmFsc2U7CisgICAgICAgIGNv
bnN0IHRlc3RJbnN0YW5jZSA9IHRoaXMuYWxsVGVzdHNbdGVzdE5hbWVdOworICAgICAgICBjb25z
dCB0ZXN0TWV0aG9kcyA9IGdldFRlc3RGdWNudGlvbk5hbWVzKHRlc3RJbnN0YW5jZSk7CisgICAg
ICAgIGxldCByZXN1bHQgPSBhd2FpdCBnZXRUZXN0UmVzdWx0KHRlc3RJbnN0YW5jZSwgInNldHVw
IiwgdGhpcy5zZXR1cEFyZ3MpOworICAgICAgICB0aGlzLnJlc3VsdHNFcy5hZGQocmVzdWx0KTsK
KyAgICAgICAgaWYgKHJlc3VsdC50eXBlID09PSBURVNUX1JFU1VMVF9UWVBFLlN1Y2Nlc3MpIHsK
KyAgICAgICAgICAgIGZvciAobGV0IHRlc3RNZXRob2ROYW1lIG9mIHRlc3RNZXRob2RzKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKGZuTmFtZSAmJiBmbk5hbWUgIT09IHRlc3RNZXRob2ROYW1lKSAK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3
YWl0IGdldFRlc3RSZXN1bHQodGVzdEluc3RhbmNlLCB0ZXN0TWV0aG9kTmFtZSk7CisgICAgICAg
ICAgICAgICAgdGhpcy5yZXN1bHRzRXMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgaWYg
KHJlc3VsdC50eXBlICE9PSBURVNUX1JFU1VMVF9UWVBFLlN1Y2Nlc3MpCisgICAgICAgICAgICAg
ICAgICAgIGhhdmVFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAK
KyAgICAgICAgICAgIGhhdmVFcnJvciA9IHRydWU7CisgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdl
dFRlc3RSZXN1bHQodGVzdEluc3RhbmNlLCAiY2xlYXJVcCIpOworICAgICAgICB0aGlzLnJlc3Vs
dHNFcy5hZGQocmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdC50eXBlICE9PSBURVNUX1JFU1VM
VF9UWVBFLlN1Y2Nlc3MpCisgICAgICAgICAgICBoYXZlRXJyb3IgPSB0cnVlOworICAgICAgICBy
ZXR1cm4gaGF2ZUVycm9yOworICAgIH0KKworICAgIGFzeW5jIHJ1bih0ZXN0U3VpdGVDbGFzc05h
bWUsIHRlc3RGbk5hbWUpIHsKKyAgICAgICAgbGV0IGhhdmVFcnJvciA9IGZhbHNlOworICAgICAg
ICBpZiAodGVzdFN1aXRlQ2xhc3NOYW1lKQorICAgICAgICAgICAgaGF2ZUVycm9yID0gYXdhaXQg
dGhpcy5ydW5UZXN0KHRlc3RTdWl0ZUNsYXNzTmFtZSwgdGVzdEZuTmFtZSk7CisgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgZm9yKGxldCB0ZXN0U3VpdGVDbGFzc05hbWUgb2YgT2JqZWN0Lmtl
eXModGhpcy5hbGxUZXN0cykpCisgICAgICAgICAgICAgICAgaGF2ZUVycm9yIHw9IGF3YWl0IHRo
aXMucnVuVGVzdCh0ZXN0U3VpdGVDbGFzc05hbWUpOworICAgICAgICB9CisgICAgICAgIGNvbnN0
IGZpbmFsUmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoIiIsICIiKTsKKyAgICAgICAgaWYgKCFoYXZl
RXJyb3IpCisgICAgICAgICAgICBmaW5hbFJlc3VsdC50eXBlID0gVEVTVF9SRVNVTFRfVFlQRS5T
dWNjZXNzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmaW5hbFJlc3VsdC50eXBlID0gVEVT
VF9SRVNVTFRfVFlQRS5GYWlsZWQ7CisgICAgICAgIHRoaXMucmVzdWx0c0VzLmFkZChmaW5hbFJl
c3VsdCk7CisgICAgfQorfQorCitleHBvcnQge1Rlc3RTdWl0ZSwgVGVzdENvbnRyb2xsZXIsIFRF
U1RfUkVTVUxUX1RZUEV9CmRpZmYgLS1naXQgYS9Ub29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJw
eS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL2NvbXBvbmVudHMvVGVzdENvbXBvbmVudHMuanMgYi9U
b29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL2NvbXBv
bmVudHMvVGVzdENvbXBvbmVudHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNmFmNTljM2M5ZTNmYjA5MWEwZDU3
YjdmYzA1YjM0ODliM2MyNzViYQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3Jlc3VsdHNkYnB5
L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvY29tcG9uZW50cy9UZXN0Q29tcG9u
ZW50cy5qcwpAQCAtMCwwICsxLDg1IEBACitpbXBvcnQge0RPTSwgUkVGfSBmcm9tICIuLi9SZWYu
anMiCitpbXBvcnQge1Rlc3RDb250cm9sbGVyLCBURVNUX1JFU1VMVF9UWVBFfSBmcm9tICIuLi9U
ZXN0LmpzIgorCitmdW5jdGlvbiBUZXN0QXBwKHRlc3RDb250cm9sbGVyKSB7CisgICAgcmV0dXJu
ICgKKyAgICAgICAgYDxkaXYgY2xhc3M9InJvdyBjb250ZW50Ij4KKyAgICAgICAgICAgIDxkaXYg
Y2xhc3M9ImNvbC02Ij4KKyAgICAgICAgICAgICAgICAke1Rlc3RSZXN1bHRDb25zb2xlKHRlc3RD
b250cm9sbGVyKX0KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0i
Y29sLTYiPgorICAgICAgICAgICAgICAgICR7VGVzdFJlbmRlckFyZWEodGVzdENvbnRyb2xsZXIp
fQorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PmAKKyAgICApOworfQorCitmdW5j
dGlvbiBUZXN0UmVzdWx0KHRlc3RSZXN1bHQpIHsKKyAgICBsZXQgc3RhdHVzQ2xhc3MgPSAic3Vj
Y2VzcyI7CisgICAgbGV0IGRlc2NyaXB0aW9uID0gdGVzdFJlc3VsdC5jbGFzc05hbWUgPyAiUEFT
UyIgOiAiQUxMIFBBU1MiOworICAgIHN3aXRjaCAodGVzdFJlc3VsdC50eXBlKSB7CisgICAgICAg
IGNhc2UgVEVTVF9SRVNVTFRfVFlQRS5GYWlsZWQ6CisgICAgICAgICAgICBzdGF0dXNDbGFzcyA9
ICJmYWlsZWQiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiZmFpbGVkIgorICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBURVNUX1JFU1VMVF9UWVBFLkVycm9yOgorICAgICAgICAgICAg
c3RhdHVzQ2xhc3MgPSAiZXJyb3IiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAicmFpc2Ug
YW4gZXJyb3IiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICgKKyAgICAgICAg
YDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgJHt0ZXN0UmVzdWx0LmNsYXNzTmFtZSA/ICIi
IDogIjxocj4ifQorICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCBibG9jayI+CisgICAgICAg
ICAgICAgICAgPGEgaHJlZj0iP2NsYXNzTmFtZT0ke3Rlc3RSZXN1bHQuY2xhc3NOYW1lfSI+JHt0
ZXN0UmVzdWx0LmNsYXNzTmFtZX08L2E+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAg
IDxkaXYgY2xhc3M9InRleHQgYmxvY2siPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9jbGFz
c05hbWU9JHt0ZXN0UmVzdWx0LmNsYXNzTmFtZX0mZm5OYW1lPSR7dGVzdFJlc3VsdC5mbk5hbWV9
Ij4ke3Rlc3RSZXN1bHQuZm5OYW1lfTwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAg
ICAgPGRpdiBjbGFzcz0idGV4dCBibG9jayAke3N0YXR1c0NsYXNzfSI+CisgICAgICAgICAgICAg
ICAgJHtkZXNjcmlwdGlvbn0KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgJHt0ZXN0
UmVzdWx0LmV4Y2VwdGlvbiA/IGAKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0ICR7
c3RhdHVzQ2xhc3N9Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByZT4ke3Rlc3RSZXN1bHQuZXhj
ZXB0aW9uLm1lc3NhZ2V9XG4ke3Rlc3RSZXN1bHQuZXhjZXB0aW9uLnN0YWNrfTwvcHJlPgorICAg
ICAgICAgICAgICAgIDwvZGl2PmAgOiAiIn0KKyAgICAgICAgPC9kaXY+YAorICAgICk7Cit9CisK
K2Z1bmN0aW9uIFRlc3RSZXN1bHRDb25zb2xlKHRlc3RDb250cm9sbGVyKSB7CisgICAgY29uc3Qg
cmVmID0gUkVGLmNyZWF0ZVJlZih7CisgICAgICAgIG9uU3RhdGVVcGRhdGU6IChlbGVtZW50LCBz
dGF0ZURpZmYpID0+IHsKKyAgICAgICAgICAgIGlmIChzdGF0ZURpZmYuYWRkVGVzdFJlc3VsdCkg
eworICAgICAgICAgICAgICAgIERPTS5hcHBlbmQoZWxlbWVudCwgVGVzdFJlc3VsdChzdGF0ZURp
ZmYuYWRkVGVzdFJlc3VsdCkpOworICAgICAgICAgICAgICAgIGlmICghc3RhdGVEaWZmLmFkZFRl
c3RSZXN1bHQuY2xhc3NOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbF9yZXMg
PSAiQUxMIFBBU1MiOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVEaWZmLmFkZFRlc3RS
ZXN1bHQudHlwZSAhPT0gVEVTVF9SRVNVTFRfVFlQRS5TdWNjZXNzKQorICAgICAgICAgICAgICAg
ICAgICAgICAgZmluYWxfcmVzID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgIGRvY3Vt
ZW50LnRpdGxlID0gYCR7ZmluYWxfcmVzfWA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfSk7CisgICAgdGVzdENvbnRyb2xsZXIuYWRkUmVzdWx0SGFu
ZGxlcih0ZXN0UmVzdWx0ID0+IHJlZi5zZXRTdGF0ZSh7YWRkVGVzdFJlc3VsdDogdGVzdFJlc3Vs
dH0pKTsKKyAgICByZXR1cm4gYDxkaXYgcmVmPSIke3JlZn0iPjwvZGl2PmA7Cit9CisKKworZnVu
Y3Rpb24gVGVzdFJlbmRlckFyZWEodGVzdENvbnRyb2xsZXIpIHsKKyAgICBjb25zdCByZWYgPSBS
RUYuY3JlYXRlUmVmKHsKKyAgICAgICAgb25FbGVtZW50TW91bnQ6IChlbGVtZW50KSA9PiB7Cisg
ICAgICAgICAgICB0ZXN0Q29udHJvbGxlci5hZGRTZXR1cEFyZ3MoW2VsZW1lbnRdKTsKKyAgICAg
ICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uKTsKKyAgICAgICAgICAg
IGNvbnN0IHNlYXJjaFBhcmFtID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTsKKyAg
ICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHNlYXJjaFBhcmFtLmdldCgiY2xhc3NOYW1lIik7
CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lKQorICAgICAgICAgICAgICAgIGRvY3VtZW50LnRp
dGxlID0gY2xhc3NOYW1lOworICAgICAgICAgICAgY29uc3QgZm5OYW1lID0gc2VhcmNoUGFyYW0u
Z2V0KCJmbk5hbWUiKTsKKyAgICAgICAgICAgIHRlc3RDb250cm9sbGVyLnJ1bihjbGFzc05hbWUs
IGZuTmFtZSkKKyAgICAgICAgfSAKKyAgICB9KTsKKyAgICByZXR1cm4gYDxkaXYgcmVmPSIke3Jl
Zn0iPjwvZGl2PmA7Cit9CisKK2V4cG9ydCB7VGVzdEFwcH07CmRpZmYgLS1naXQgYS9Ub29scy9y
ZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvUmVmVGVz
dC5qcyBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jlc3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkv
anMvdGVzdC9SZWZUZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjAwY2M0YzgzYTZiOThmNDVjNzMyMTZlY2M5
OTNkMGI1OWE3MjVmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9yZXN1bHRzZGJweS9yZXN1
bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvUmVmVGVzdC5qcwpAQCAtMCwwICsx
LDMwMiBAQAoraW1wb3J0IHtUZXN0U3VpdGV9IGZyb20gJy4uL1Rlc3QuanMnOworaW1wb3J0IHtS
RUYsIERPTSwgZGlmZiwgRlAsIEV2ZW50U3RyZWFtfSBmcm9tICcuLi9SZWYuanMnOworCitjbGFz
cyBEaWZmVGVzdCBleHRlbmRzIFRlc3RTdWl0ZSB7CisgICAgdGVzdEFycmF5RGlmZigpIHsKKyAg
ICAgICAgbGV0IHJlbW92ZWQgPSBbXTsKKyAgICAgICAgbGV0IG5ld0FycmF5ID0gW107CisgICAg
ICAgIGRpZmYoWzEsIDIsIDNdLCBbNCwgNSwgNl0sIGl0ZW0gPT4gcmVtb3ZlZC5wdXNoKGl0ZW0p
LCBpdGVtID0+IG5ld0FycmF5LnB1c2goaXRlbSkpOworICAgICAgICB0aGlzLmV4cGVjdChyZW1v
dmVkKS5lcXVhbFRvQXJyYXkoWzEsIDIsIDNdKTsKKyAgICAgICAgdGhpcy5leHBlY3QobmV3QXJy
YXkpLmVxdWFsVG9BcnJheShbNCwgNSwgNl0pOworCisgICAgICAgIHJlbW92ZWQgPSBbXTsKKyAg
ICAgICAgbmV3QXJyYXkgPSBbXTsKKyAgICAgICAgZGlmZihbMSwgMiwgM10sIFsyLCAzLCA0XSwg
aXRlbSA9PiByZW1vdmVkLnB1c2goaXRlbSksIGl0ZW0gPT4gbmV3QXJyYXkucHVzaChpdGVtKSk7
CisgICAgICAgIHRoaXMuZXhwZWN0KHJlbW92ZWQpLmVxdWFsVG9BcnJheShbMV0pOworICAgICAg
ICB0aGlzLmV4cGVjdChuZXdBcnJheSkuZXF1YWxUb0FycmF5KFsyLCAzLCA0XSk7CisKKyAgICAg
ICAgcmVtb3ZlZCA9IFtdOworICAgICAgICBuZXdBcnJheSA9IFtdOworICAgICAgICBkaWZmKFsy
XSwgWzIsIDMsIDRdLCBpdGVtID0+IHJlbW92ZWQucHVzaChpdGVtKSwgaXRlbSA9PiBuZXdBcnJh
eS5wdXNoKGl0ZW0pKTsKKyAgICAgICAgdGhpcy5leHBlY3QocmVtb3ZlZCkuZXF1YWxUb0FycmF5
KFtdKTsKKyAgICAgICAgdGhpcy5leHBlY3QobmV3QXJyYXkpLmVxdWFsVG9BcnJheShbMiwgMywg
NF0pOworCisgICAgICAgIHJlbW92ZWQgPSBbXTsKKyAgICAgICAgbmV3QXJyYXkgPSBbXTsKKyAg
ICAgICAgZGlmZihbXSwgWzIsIDMsIDRdLCBpdGVtID0+IHJlbW92ZWQucHVzaChpdGVtKSwgaXRl
bSA9PiBuZXdBcnJheS5wdXNoKGl0ZW0pKTsKKyAgICAgICAgdGhpcy5leHBlY3QocmVtb3ZlZCku
ZXF1YWxUb0FycmF5KFtdKTsKKyAgICAgICAgdGhpcy5leHBlY3QobmV3QXJyYXkpLmVxdWFsVG9B
cnJheShbMiwgMywgNF0pOworICAgICAgICAKKyAgICAgICAgcmVtb3ZlZCA9IFtdOworICAgICAg
ICBuZXdBcnJheSA9IFtdOworICAgICAgICBkaWZmKFs0LCAzLCAyXSwgWzIsIDMsIDRdLCBpdGVt
ID0+IHJlbW92ZWQucHVzaChpdGVtKSwgaXRlbSA9PiBuZXdBcnJheS5wdXNoKGl0ZW0pKTsKKyAg
ICAgICAgdGhpcy5leHBlY3QocmVtb3ZlZCkuZXF1YWxUb0FycmF5KFtdKTsKKyAgICAgICAgdGhp
cy5leHBlY3QobmV3QXJyYXkpLmVxdWFsVG9BcnJheShbMiwgMywgNF0pOworICAgICAgICAKKyAg
ICAgICAgcmVtb3ZlZCA9IFtdOworICAgICAgICBuZXdBcnJheSA9IFtdOworICAgICAgICBkaWZm
KFs0LCAzLCAyLCA1LCA2XSwgWzIsIDMsIDRdLCBpdGVtID0+IHJlbW92ZWQucHVzaChpdGVtKSwg
aXRlbSA9PiBuZXdBcnJheS5wdXNoKGl0ZW0pKTsKKyAgICAgICAgdGhpcy5leHBlY3QocmVtb3Zl
ZCkuZXF1YWxUb0FycmF5KFs1LCA2XSk7CisgICAgICAgIHRoaXMuZXhwZWN0KG5ld0FycmF5KS5l
cXVhbFRvQXJyYXkoWzIsIDMsIDRdKTsKKyAgICAgICAgCisgICAgICAgIHJlbW92ZWQgPSBbXTsK
KyAgICAgICAgbmV3QXJyYXkgPSBbXTsKKyAgICAgICAgZGlmZihbXSwgW10sIGl0ZW0gPT4gcmVt
b3ZlZC5wdXNoKGl0ZW0pLCBpdGVtID0+IG5ld0FycmF5LnB1c2goaXRlbSkpOworICAgICAgICB0
aGlzLmV4cGVjdChyZW1vdmVkKS5lcXVhbFRvQXJyYXkoW10pOworICAgICAgICB0aGlzLmV4cGVj
dChuZXdBcnJheSkuZXF1YWxUb0FycmF5KFtdKTsKKyAgICB9Cit9CisKK2NsYXNzIERvbVRlc3Qg
ZXh0ZW5kcyBUZXN0U3VpdGUgeworICAgIHNldHVwKHJvb3RFbGVtZW50KSB7CisgICAgICAgIHRo
aXMucm9vdEVsZW1lbnQgPSByb290RWxlbWVudDsKKyAgICB9CisKKyAgICB0ZXN0SW5qZWN0KCkg
eworICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCA9ICIiOworICAgICAgICBjb25z
dCBpbmplY3RvciA9IGA8ZGl2IGlkPSIke01hdGgucmFuZG9tKCl9Ij48L2Rpdj5gOworICAgICAg
ICBET00uaW5qZWN0KHRoaXMucm9vdEVsZW1lbnQsIGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5l
eHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwpLmVxdWFsVG9WYWx1ZShpbmplY3Rvcik7
CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gIiI7CisgICAgfQorCisgICAg
dGVzdEJlZm9yZSgpIHsKKyAgICAgICAgbGV0IGluaXRpYWwgPSAnPGRpdiBpZD0iMSI+PC9kaXY+
PGRpdiBpZD0iMiI+PC9kaXY+PGRpdiBpZD0iMyI+PC9kaXY+JzsgCisgICAgICAgIHRoaXMucm9v
dEVsZW1lbnQuaW5uZXJIVE1MID0gaW5pdGlhbDsKKyAgICAgICAgbGV0IGluamVjdG9yID0gYDxk
aXYgaWQ9IiR7TWF0aC5yYW5kb20oKX0iPjwvZGl2PmA7CisgICAgICAgIERPTS5iZWZvcmUodGhp
cy5yb290RWxlbWVudC5jaGlsZHJlblswXSwgaW5qZWN0b3IpOworICAgICAgICB0aGlzLmV4cGVj
dCh0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGAke2luamVjdG9yfSR7
aW5pdGlhbH1gKTsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0aWFs
OworICAgICAgICBET00uYmVmb3JlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMV0sIGluamVj
dG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwpLmVx
dWFsVG9WYWx1ZShgPGRpdiBpZD0iMSI+PC9kaXY+JHtpbmplY3Rvcn08ZGl2IGlkPSIyIj48L2Rp
dj48ZGl2IGlkPSIzIj48L2Rpdj5gKTsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5lckhU
TUwgPSBpbml0aWFsOworICAgICAgICBET00uYmVmb3JlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRy
ZW5bMl0sIGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxlbWVudC5p
bm5lckhUTUwpLmVxdWFsVG9WYWx1ZShgPGRpdiBpZD0iMSI+PC9kaXY+PGRpdiBpZD0iMiI+PC9k
aXY+JHtpbmplY3Rvcn08ZGl2IGlkPSIzIj48L2Rpdj5gKTsKKyAgICB9CisKKyAgICB0ZXN0QWZ0
ZXIoKSB7CisgICAgICAgIGxldCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2PjxkaXYgaWQ9
IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RFbGVtZW50
LmlubmVySFRNTCA9IGluaXRpYWw7CisgICAgICAgIGxldCBpbmplY3RvciA9IGA8ZGl2IGlkPSIk
e01hdGgucmFuZG9tKCl9Ij48L2Rpdj5gOworICAgICAgICBET00uYWZ0ZXIodGhpcy5yb290RWxl
bWVudC5jaGlsZHJlblswXSwgaW5qZWN0b3IpOworICAgICAgICB0aGlzLmV4cGVjdCh0aGlzLnJv
b3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGA8ZGl2IGlkPSIxIj48L2Rpdj4ke2lu
amVjdG9yfTxkaXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2PmApOworICAgICAgICB0
aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCA9IGluaXRpYWw7CisgICAgICAgIERPTS5hZnRlcih0
aGlzLnJvb3RFbGVtZW50LmNoaWxkcmVuWzFdLCBpbmplY3Rvcik7CisgICAgICAgIHRoaXMuZXhw
ZWN0KHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MKS5lcXVhbFRvVmFsdWUoYDxkaXYgaWQ9IjEi
PjwvZGl2PjxkaXYgaWQ9IjIiPjwvZGl2PiR7aW5qZWN0b3J9PGRpdiBpZD0iMyI+PC9kaXY+YCk7
CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1MID0gaW5pdGlhbDsKKyAgICAgICAg
RE9NLmFmdGVyKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMl0sIGluamVjdG9yKTsKKyAgICAg
ICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwpLmVxdWFsVG9WYWx1ZShg
JHtpbml0aWFsfSR7aW5qZWN0b3J9YCk7CisgICAgfQorCisgICAgdGVzdFByZXBlbmQoKSB7Cisg
ICAgICAgIGxldCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2PjxkaXYgaWQ9IjIiPjwvZGl2
PjxkaXYgaWQ9IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmlubmVySFRN
TCA9IGluaXRpYWw7CisgICAgICAgIGxldCBpbmplY3RvciA9IGA8ZGl2IGlkPSIke01hdGgucmFu
ZG9tKCl9Ij48L2Rpdj5gOworICAgICAgICBET00ucHJlcGVuZCh0aGlzLnJvb3RFbGVtZW50LCBp
bmplY3Rvcik7CisgICAgICAgIHRoaXMuZXhwZWN0KHRoaXMucm9vdEVsZW1lbnQuaW5uZXJIVE1M
KS5lcXVhbFRvVmFsdWUoYCR7aW5qZWN0b3J9JHtpbml0aWFsfWApOworICAgIH0KKworICAgIHRl
c3RBcHBlbmQoKSB7CisgICAgICAgIGxldCBpbml0aWFsID0gJzxkaXYgaWQ9IjEiPjwvZGl2Pjxk
aXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2Pic7IAorICAgICAgICB0aGlzLnJvb3RF
bGVtZW50LmlubmVySFRNTCA9IGluaXRpYWw7CisgICAgICAgIGxldCBpbmplY3RvciA9IGA8ZGl2
IGlkPSIke01hdGgucmFuZG9tKCl9Ij48L2Rpdj5gOworICAgICAgICBET00uYXBwZW5kKHRoaXMu
cm9vdEVsZW1lbnQsIGluamVjdG9yKTsKKyAgICAgICAgdGhpcy5leHBlY3QodGhpcy5yb290RWxl
bWVudC5pbm5lckhUTUwpLmVxdWFsVG9WYWx1ZShgJHtpbml0aWFsfSR7aW5qZWN0b3J9YCk7Cisg
ICAgfQorICAgIAorICAgIHRlc3RSZXBsYWNlKCkgeworICAgICAgICBsZXQgaW5pdGlhbCA9ICc8
ZGl2IGlkPSIxIj48L2Rpdj48ZGl2IGlkPSIyIj48L2Rpdj48ZGl2IGlkPSIzIj48L2Rpdj4nOyAK
KyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0aWFsOworICAgICAgICBs
ZXQgaW5qZWN0b3IgPSBgPGRpdiBpZD0iJHtNYXRoLnJhbmRvbSgpfSI+PC9kaXY+YDsKKyAgICAg
ICAgRE9NLnJlcGxhY2UodGhpcy5yb290RWxlbWVudC5jaGlsZHJlblswXSwgaW5qZWN0b3IpOwor
ICAgICAgICB0aGlzLmV4cGVjdCh0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1Zh
bHVlKGAke2luamVjdG9yfTxkaXYgaWQ9IjIiPjwvZGl2PjxkaXYgaWQ9IjMiPjwvZGl2PmApOwor
ICAgIH0KKyAgICAKKyAgICB0ZXN0UmVtb3ZlKCkgeworICAgICAgICBsZXQgaW5pdGlhbCA9ICc8
ZGl2IGlkPSIxIj48L2Rpdj48ZGl2IGlkPSIyIj48L2Rpdj48ZGl2IGlkPSIzIj48L2Rpdj4nOyAK
KyAgICAgICAgdGhpcy5yb290RWxlbWVudC5pbm5lckhUTUwgPSBpbml0aWFsOworICAgICAgICBE
T00ucmVtb3ZlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMF0pOworICAgICAgICB0aGlzLmV4
cGVjdCh0aGlzLnJvb3RFbGVtZW50LmlubmVySFRNTCkuZXF1YWxUb1ZhbHVlKGA8ZGl2IGlkPSIy
Ij48L2Rpdj48ZGl2IGlkPSIzIj48L2Rpdj5gKTsKKyAgICB9Cit9CisKK2NsYXNzIFJlZlRlc3Qg
ZXh0ZW5kcyBUZXN0U3VpdGUgeworICAgIHNldHVwKHJvb3RFbGVtZW50KSB7CisgICAgICAgIHRo
aXMucm9vdEVsZW1lbnQgPSByb290RWxlbWVudDsKKyAgICB9CisKKyAgICBhc3luYyB0ZXN0T25F
bGVtZW50TW91bnQoKSB7CisgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAg
bGV0IGN1cnJlbnRSZWYgPSBudWxsOworICAgICAgICBjb25zdCBjcmVhdEFDb21wb25lbnQgPSAo
KSA9PiB7CisgICAgICAgICAgICBsZXQgcmVmID0gUkVGLmNyZWF0ZVJlZih7CisgICAgICAgICAg
ICAgICAgb25FbGVtZW50TW91bnQ6IChlbGVtZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAg
IHRyaWdnZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICBjdXJyZW50UmVmID0gcmVmOworICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IHJl
Zj0iJHtyZWZ9Ij48L2Rpdj5gOworICAgICAgICB9OworICAgICAgICAgICAgCisgICAgICAgIGNv
bnN0IGZpcnN0Q29tcCA9IGNyZWF0QUNvbXBvbmVudCgpOworICAgICAgICBET00uaW5qZWN0KHRo
aXMucm9vdEVsZW1lbnQsIGZpcnN0Q29tcCk7CisgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJl
Zk1vdW50ZWQoY3VycmVudFJlZik7CisgICAgICAgIHRoaXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1
YWxUb1ZhbHVlKHRydWUpOworICAgICAgICB0aGlzLmV4cGVjdChjdXJyZW50UmVmLmVsZW1lbnQu
b3V0ZXJIVE1MKS5lcXVhbFRvVmFsdWUoZmlyc3RDb21wKTsKKworICAgICAgICB0cmlnZ2VyZWQg
PSBmYWxzZTsKKyAgICAgICAgY29uc3Qgc2Vjb25kQ29tcCA9IGNyZWF0QUNvbXBvbmVudCgpOwor
ICAgICAgICBET00ucmVwbGFjZSh0aGlzLnJvb3RFbGVtZW50LmNoaWxkcmVuWzBdLCBzZWNvbmRD
b21wKTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yUmVmTW91bnRlZChjdXJyZW50UmVmKTsK
KyAgICAgICAgdGhpcy5leHBlY3QodHJpZ2dlcmVkKS5lcXVhbFRvVmFsdWUodHJ1ZSk7CisgICAg
ICAgIHRoaXMuZXhwZWN0KGN1cnJlbnRSZWYuZWxlbWVudC5vdXRlckhUTUwpLmVxdWFsVG9WYWx1
ZShzZWNvbmRDb21wKTsKKyAgICB9CisKKyAgICBhc3luYyB0ZXN0T25FbGVtZW50VW5tb3VudCgp
IHsKKyAgICAgICAgbGV0IHRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICBsZXQgY3VycmVudFJl
ZiA9IG51bGw7CisgICAgICAgIGNvbnN0IGNyZWF0QUNvbXBvbmVudCA9ICgpID0+IHsKKyAgICAg
ICAgICAgIGxldCByZWYgPSBSRUYuY3JlYXRlUmVmKHsKKyAgICAgICAgICAgICAgICBvbkVsZW1l
bnRVbm1vdW50OiAoZWxlbWVudCkgPT4geworICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQg
PSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAg
Y3VycmVudFJlZiA9IHJlZjsKKyAgICAgICAgICAgIHJldHVybiBgPGRpdiByZWY9IiR7cmVmfSI+
PC9kaXY+YDsKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBmaXJzdENvbXAgPSBjcmVhdEFD
b21wb25lbnQoKTsKKyAgICAgICAgRE9NLmluamVjdCh0aGlzLnJvb3RFbGVtZW50LCBmaXJzdENv
bXApOworICAgICAgICBET00ucmVwbGFjZSh0aGlzLnJvb3RFbGVtZW50LmNoaWxkcmVuWzBdLCAi
PGRpdj48L2Rpdj4iKTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yUmVmVW5tb3VudGVkKGN1
cnJlbnRSZWYpOworICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZSh0
cnVlKTsKKyAgICAgICAgdGhpcy5leHBlY3QoY3VycmVudFJlZi5lbGVtZW50LnBhcmVudEVsZW1l
bnQpLmVxdWFsVG9WYWx1ZShudWxsKTsKKworICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAg
ICAgICAgRE9NLmluamVjdCh0aGlzLnJvb3RFbGVtZW50LCBmaXJzdENvbXApOworICAgICAgICBE
T00ucmVtb3ZlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMF0pOworICAgICAgICBsZXQgZXhw
ZWN0ZWRFID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF3YWl0IHRoaXMud2Fp
dEZvclJlZlVubW91bnRlZChjdXJyZW50UmVmKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAg
ICAgICAgICAgLy8gZGVzdG9yaWVkIHJlZiB3b24ndCBiZSB0cmlnZ2VyZWQKKyAgICAgICAgICAg
IHRoaXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKGZhbHNlKTsKKyAgICAgICAgICAg
IGV4cGVjdGVkRSA9IGU7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5leHBlY3QoZXhwZWN0ZWRF
KS5ub3RFcXVhbFRvVmFsdWUobnVsbCk7CisgICAgICAgIAorICAgICAgICB0cmlnZ2VyZWQgPSBm
YWxzZTsKKyAgICAgICAgY29uc3Qgc2Vjb25kQ29tcCA9IGNyZWF0QUNvbXBvbmVudCgpOworICAg
ICAgICBET00uaW5qZWN0KHRoaXMucm9vdEVsZW1lbnQsIHNlY29uZENvbXApOworICAgICAgICBE
T00ucmVtb3ZlKHRoaXMucm9vdEVsZW1lbnQuY2hpbGRyZW5bMF0pOworICAgICAgICBhd2FpdCB0
aGlzLndhaXRGb3JSZWZVbm1vdW50ZWQoY3VycmVudFJlZik7CisgICAgICAgIHRoaXMuZXhwZWN0
KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKHRydWUpOworICAgICAgICB0aGlzLmV4cGVjdChjdXJy
ZW50UmVmLmVsZW1lbnQucGFyZW50RWxlbWVudCkuZXF1YWxUb1ZhbHVlKG51bGwpOworICAgIH0K
KyAgICAKKyAgICBhc3luYyB0ZXN0T25Db21wbGV4U3RhdGVVcGRhdGUoKSB7CisgICAgICAgIGxl
dCB2ZXJpZmllciA9IG51bGw7CisgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAg
ICAgbGV0IGV4cGVjdGVkRSA9IG51bGw7CisgICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSB7Cisg
ICAgICAgICAgICBpbml0aWFsU3RhdGU6IE1hdGgucmFuZG9tKCkKKyAgICAgICAgfTsKKyAgICAg
ICAgbGV0IHJlZiA9IFJFRi5jcmVhdGVSZWYoeworICAgICAgICAgICAgb25TdGF0ZVVwZGF0ZToo
ZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0ZSkgPT4geworICAgICAgICAgICAgICAgIGlmICh2ZXJp
ZmllcikgdmVyaWZpZXIoZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0ZSk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0pOworICAgICAgICByZWYuc2V0U3RhdGUoaW5pdGlhbFN0YXRlKTsKKyAgICAg
ICAgdHJ5IHsKKyAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXRlVXBkYXRlZChyZWYp
OworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBleHBlY3RlZEUgPSBlOworICAg
ICAgICB9CisgICAgICAgIC8vIGJlZm9yZSBlbGVtZW50IG1vdW50LCB3ZSBkb24ndCB0cmlnZ2Vy
IHN0YXRlIHVwZGF0ZSBjYWxsYmFjaywgd2UganVzdCBzYXZlIHRoZSBzdGF0ZQorICAgICAgICB0
aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZShmYWxzZSk7CisgICAgICAgIHRoaXMu
ZXhwZWN0KGV4cGVjdGVkRSkubm90RXF1YWxUb1ZhbHVlKG51bGwpOworICAgICAgICB0aGlzLmV4
cGVjdChyZWYuc3RhdGUuaW5pdGlhbFN0YXRlKS5lcXVhbFRvVmFsdWUoaW5pdGlhbFN0YXRlLmlu
aXRpYWxTdGF0ZSk7CisgICAgICAgIC8vIEVhY2ggdGltZSBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBz
dGF0ZSBvYmplY3QKKyAgICAgICAgdGhpcy5leHBlY3QocmVmLnN0YXRlKS5ub3RFcXVhbFRvVmFs
dWUoaW5pdGlhbFN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIERPTS5pbmplY3QodGhpcy5yb290
RWxlbWVudCwgYDxkaXYgcmVmPSIke3JlZn0iPjwvZGl2PmApOworICAgICAgICB2ZXJpZmllciA9
IChlbGVtZW50LCBzdGF0ZURpZmYsIHN0YXRlKSA9PiB7CisgICAgICAgICAgICB0cmlnZ2VyZWQg
PSB0cnVlOworICAgICAgICAgICAgdGhpcy5leHBlY3Qoc3RhdGVEaWZmLmluaXRpYWxTdGF0ZSku
ZXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0ZS5pbml0aWFsU3RhdGUpOworICAgICAgICAgICAgdGhp
cy5leHBlY3Qoc3RhdGUuZmFrZVN0YXRlKS5lcXVhbFRvVmFsdWUodW5kZWZpbmVkKTsKKyAgICAg
ICAgfTsKKyAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yU3RhdGVVcGRhdGVkKHJlZik7CisgICAg
ICAgIHRoaXMuZXhwZWN0KHRyaWdnZXJlZCkuZXF1YWxUb1ZhbHVlKHRydWUpOworICAgICAgICAK
KyAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIGxldCBmYWtlU3RhdGUgPSB7Cisg
ICAgICAgICAgICBmYWtlU3RhdGU6IE1hdGgucmFuZG9tKCkKKyAgICAgICAgfTsKKyAgICAgICAg
dmVyaWZpZXIgPSAoZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0ZSkgPT4geworICAgICAgICAgICAg
dHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlRGlmZi5mYWtl
U3RhdGUpLmVxdWFsVG9WYWx1ZShmYWtlU3RhdGUuZmFrZVN0YXRlKTsKKyAgICAgICAgICAgIHRo
aXMuZXhwZWN0KHN0YXRlLmZha2VTdGF0ZSkuZXF1YWxUb1ZhbHVlKHVuZGVmaW5lZCk7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0KHN0YXRlLmluaXRpYWxTdGF0ZSkuZXF1
YWxUb1ZhbHVlKGluaXRpYWxTdGF0ZS5pbml0aWFsU3RhdGUpOworICAgICAgICAgICAgdGhpcy5l
eHBlY3Qoc3RhdGVEaWZmLmluaXRpYWxTdGF0ZSkuZXF1YWxUb1ZhbHVlKHVuZGVmaW5lZCk7Cisg
ICAgICAgIH07CisgICAgICAgIHJlZi5zZXRTdGF0ZShmYWtlU3RhdGUpOworICAgICAgICBhd2Fp
dCB0aGlzLndhaXRGb3JTdGF0ZVVwZGF0ZWQocmVmKTsKKyAgICAgICAgdGhpcy5leHBlY3QocmVm
LnN0YXRlLmZha2VTdGF0ZSkuZXF1YWxUb1ZhbHVlKGZha2VTdGF0ZS5mYWtlU3RhdGUpOworICAg
ICAgICB0aGlzLmV4cGVjdChyZWYuc3RhdGUuaW5pdGlhbFN0YXRlKS5lcXVhbFRvVmFsdWUoaW5p
dGlhbFN0YXRlLmluaXRpYWxTdGF0ZSk7CisgICAgICAgIHRoaXMuZXhwZWN0KHRyaWdnZXJlZCku
ZXF1YWxUb1ZhbHVlKHRydWUpOworICAgIH0KKyAgICAKKyAgICBhc3luYyB0ZXN0T25WYWx1ZVN0
YXRlVXBkYXRlKCkgeworICAgICAgICBsZXQgdHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIGxl
dCB2ZXJpZmllciA9IG51bGw7CisgICAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IE1hdGgucmFu
ZG9tKCk7CisgICAgICAgIGNvbnN0IHJlZiA9IFJFRi5jcmVhdGVSZWYoeworICAgICAgICAgICAg
c3RhdGU6IGluaXRpYWxTdGF0ZSwKKyAgICAgICAgICAgIG9uU3RhdGVVcGRhdGU6KGVsZW1lbnQs
IHN0YXRlRGlmZiwgc3RhdGUpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodmVyaWZpZXIpIHZl
cmlmaWVyKGVsZW1lbnQsIHN0YXRlRGlmZiwgc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAg
ICB9KTsKKyAgICAgICAgdmVyaWZpZXIgPSAoZWxlbWVudCwgc3RhdGVEaWZmLCBzdGF0ZSkgPT4g
eworICAgICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0
KGVsZW1lbnQpLm5vdEVxdWFsVG9WYWx1ZShudWxsKTsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0
KHN0YXRlRGlmZikuZXF1YWxUb1ZhbHVlKGluaXRpYWxTdGF0ZSk7CisgICAgICAgIH0KKyAgICAg
ICAgRE9NLmluamVjdCh0aGlzLnJvb3RFbGVtZW50LCBgPGRpdiByZWY9IiR7cmVmfSI+PC9kaXY+
YCk7CisgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXRlVXBkYXRlZChyZWYpOworICAgICAg
ICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZSh0cnVlKTsKKworICAgICAgICBj
b25zdCBuZXdTdGF0ZSA9IG51bGw7CisgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlOworICAgICAg
ICB2ZXJpZmllciA9IChlbGVtZW50LCBzdGF0ZURpZmYsIHN0YXRlKSA9PiB7CisgICAgICAgICAg
ICB0cmlnZ2VyZWQgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5leHBlY3Qoc3RhdGVEaWZmKS5l
cXVhbFRvVmFsdWUobmV3U3RhdGUpOworICAgICAgICAgICAgdGhpcy5leHBlY3Qoc3RhdGUpLmVx
dWFsVG9WYWx1ZShpbml0aWFsU3RhdGUpOworICAgICAgICB9CisgICAgICAgIHJlZi5zZXRTdGF0
ZShuZXdTdGF0ZSk7CisgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXRlVXBkYXRlZChyZWYp
OworICAgICAgICB0aGlzLmV4cGVjdCh0cmlnZ2VyZWQpLmVxdWFsVG9WYWx1ZSh0cnVlKTsKKyAg
ICAgICAgCisgICAgICAgIGNvbnN0IG5ld1N0YXRlMSA9IDA7CisgICAgICAgIHRyaWdnZXJlZCA9
IGZhbHNlOworICAgICAgICB2ZXJpZmllciA9IChlbGVtZW50LCBzdGF0ZURpZmYsIHN0YXRlKSA9
PiB7CisgICAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5leHBl
Y3Qoc3RhdGVEaWZmKS5lcXVhbFRvVmFsdWUobmV3U3RhdGUxKTsKKyAgICAgICAgICAgIHRoaXMu
ZXhwZWN0KHN0YXRlKS5lcXVhbFRvVmFsdWUobmV3U3RhdGUpOworICAgICAgICB9CisgICAgICAg
IHJlZi5zZXRTdGF0ZShuZXdTdGF0ZTEpOworICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGF0
ZVVwZGF0ZWQocmVmKTsKKyAgICAgICAgdGhpcy5leHBlY3QodHJpZ2dlcmVkKS5lcXVhbFRvVmFs
dWUodHJ1ZSk7CisgICAgICAgIAorICAgICAgICBjb25zdCBuZXdTdGF0ZTIgPSB1bmRlZmluZWQ7
CisgICAgICAgIGxldCBleHBlY3RlZEUgPSBudWxsOworICAgICAgICByZWYuc2V0U3RhdGUobmV3
U3RhdGUxKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclN0
YXRlVXBkYXRlZChyZWYpOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIGV4cGVj
dGVkRSA9IGU7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5leHBlY3QoZXhwZWN0ZWRFKS5ub3RF
cXVhbFRvVmFsdWUobnVsbCk7CisgICAgfQorfQorZXhwb3J0IHtEaWZmVGVzdCwgRG9tVGVzdCwg
UmVmVGVzdH07CmRpZmYgLS1naXQgYS9Ub29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3
L3N0YXRpYy9saWJyYXJ5L2pzL3Rlc3QvaW5kZXguaHRtbCBiL1Rvb2xzL3Jlc3VsdHNkYnB5L3Jl
c3VsdHNkYnB5L3ZpZXcvc3RhdGljL2xpYnJhcnkvanMvdGVzdC9pbmRleC5odG1sCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmFlZTYwY2Q3OTE3YThjZjAwZDRjNGIxNWEwZWNhYjIzODg4MTgxNGUKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9yZXN1bHRzZGJweS9yZXN1bHRzZGJweS92aWV3L3N0YXRpYy9saWJyYXJ5
L2pzL3Rlc3QvaW5kZXguaHRtbApAQCAtMCwwICsxLDI1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxo
dG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+VGVzdDwvdGl0bGU+CisgICAgICAgIDxs
aW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vY3NzL3dlYmtpdC5jc3MiPjwvbGluaz4K
KyAgICAgICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBzaXplcz0iMzJ4MzIiIHR5cGU9Imlt
YWdlL3gtaWNvbiIgaHJlZj0iaHR0cHM6Ly93ZWJraXQub3JnL2Zhdmljb24uaWNvIj4KKyAgICAg
ICAgPG1ldGEgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIHZp
ZXdwb3J0LWZpdD1jb3ZlciIgbmFtZT0idmlld3BvcnQiPgorICAgICAgICA8bWV0YSBjaGFyc2V0
PSJVVEYtOCI+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorICAgICAgICA8ZGl2IGlkPSJhcHAi
PjwvZGl2PgorICAgICAgICA8c2NyaXB0IHR5cGU9Im1vZHVsZSI+CisgICAgICAgICAgICBpbXBv
cnQge0RPTX0gZnJvbSAiLi4vUmVmLmpzIjsKKyAgICAgICAgICAgIGltcG9ydCB7VGVzdENvbnRy
b2xsZXJ9IGZyb20gIi4uL1Rlc3QuanMiOworICAgICAgICAgICAgaW1wb3J0IHtUZXN0QXBwfSBm
cm9tICIuLi9jb21wb25lbnRzL1Rlc3RDb21wb25lbnRzLmpzIjsKKyAgICAgICAgICAgIGNvbnN0
IHRlc3RDb250cm9sbGVyID0gbmV3IFRlc3RDb250cm9sbGVyKCk7CisgICAgICAgICAgICBhc3lu
YyBmdW5jdGlvbiBtYWluKCkgeworICAgICAgICAgICAgICAgIC8vIFRlc3QgZmlsZSBsaXN0OiBS
b290IFBhdGggd2lsbCBiZSBUZXN0LmpzJ3MgZm9sZGVyCisgICAgICAgICAgICAgICAgYXdhaXQg
dGVzdENvbnRyb2xsZXIuY29sbGVjdEZpbGUoIi4vdGVzdC9SZWZUZXN0LmpzIik7CisgICAgICAg
ICAgICAgICAgRE9NLmluamVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXBwIiksIFRlc3RB
cHAodGVzdENvbnRyb2xsZXIpKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtYWluKCk7
CisgICAgICAgIDwvc2NyaXB0PgorICAgIDwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>