<?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>154063</bug_id>
          
          <creation_ts>2016-02-10 00:42:49 -0800</creation_ts>
          <short_desc>Add new benchmark tests</short_desc>
          <delta_ts>2016-02-10 23:42:25 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>WebKit Nightly Build</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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jon Lee">jonlee</reporter>
          <assigned_to name="Jon Lee">jonlee</assigned_to>
          <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>rniwa</cc>
    
    <cc>sabouhallawa</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1163424</commentid>
    <comment_count>0</comment_count>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2016-02-10 00:42:49 -0800</bug_when>
    <thetext>Add new benchmark tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163428</commentid>
    <comment_count>1</comment_count>
      <attachid>270982</attachid>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2016-02-10 01:07:06 -0800</bug_when>
    <thetext>Created attachment 270982
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163559</commentid>
    <comment_count>2</comment_count>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2016-02-10 12:24:22 -0800</bug_when>
    <thetext>submitted 196372</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163560</commentid>
    <comment_count>3</comment_count>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2016-02-10 12:26:10 -0800</bug_when>
    <thetext>oops, wrong bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163661</commentid>
    <comment_count>4</comment_count>
      <attachid>270982</attachid>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2016-02-10 16:20:55 -0800</bug_when>
    <thetext>Comment on attachment 270982
Patch

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

&gt; PerformanceTests/Animometer/tests/master/focus.html:21
&gt; +    }

#center-text is already added to stage.css by this patch with the same set of style rules. I think deleting this one here should not affect the appearance of the test.

&gt; PerformanceTests/Animometer/tests/master/multiply.html:39
&gt; +    }

It took me awhile to figure out where these styles rules are used. Maybe it was my problem not noticing the string concatenation in the js file to compose the class name. So I think it is fine to have them without a comment.

&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:37
&gt; +        this._centerElement.style.zIndex = Math.round(10 * this.centerObjectDepth);

Should not these settings be moved to the &lt;style&gt; section of focus.html?

&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:40
&gt; +        this._setPrefixedStyles(this._centerElement, &apos;filter&apos;, &apos;blur(&apos; + blur + &apos;px)&apos;);

You can now use Utilities.setElementPrefixedProperty(this._centerElement, &apos;filter&apos;, &apos;blur(&apos; + blur + &apos;px)&apos;);

&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:72
&gt; +    _createTestElement: function()

The parent of the element can be passed and this function becomes responsible of connecting the new child to its parent.

&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:103
&gt; +            }

If we create a separate class for the particle object, this code can be moved in the class constructor.

&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:124
&gt; +            obj.element.style.transform = &apos;translateX(&apos; + left + &apos;%) translateY(&apos; + top + &apos;%)&apos;;

Should not we create a separate class for the obj and have this animation code live inside the class animate() function?

&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:147
&gt; +    },

You do not need this function if you use Utilities.setElementPrefixedProperty()

&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:159
&gt; +    }

Should not this function be moved to Utilities class in extensions.js?

&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:36
&gt; +        }.bind(this));

Can&apos;t we load the image in a hidden element in the html file like what we do in bouncing-canvas-images.html?

&lt;img class=&quot;hidden&quot; src=&quot;../resources/yin-yang.png&quot;&gt;

&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:83
&gt; +        };

I do not think we have to create a separate object wrapping this element since all it contains is the element and the 2d context which can be retrieved at painting time. If we do that we get rid of this.testElements also and have all the elements stored stored in the children list of the stage element.

&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:116
&gt; +                didDraw = true;

I think we can delete this flag and replace the if-statemnet below by:

if (!dataLen)

&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:124
&gt; +                obj.context.drawImage(this.testImage, 0, 0, this.testImageWidth, this.testImageHeight)

Should not this if-statemnet be moved before the loop above and continue after it redraws.

&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:147
&gt; +    },

Should not the whole function be moved to Utilities in main.js?

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:31
&gt; +                nextIndex += Math.floor(spiralCounter / 2);

Can&apos;t we use:

nextIndex += spiralCounter &gt;&gt; 1;

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:43
&gt; +        centerSpiralCount = maxSide * Math.round(maxSide / 2) * 2;

I do not understand why we do this math to get the smallest even digit &gt;= maxSide. But I think this can be written like also this this:

centerSpiralCount = maxSide * (maxSide + (maxSide &amp; 1));

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:58
&gt; +        tile.className = &apos;div-&apos; + Stage.randomInt(0,6);

var tile = Utilities.createElement(&quot;div&quot;, { class: &apos;div-&apos; + Stage.randomInt(0,6) }, this.element);

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:64
&gt; +        var distance = 1.5 / tileSize * Math.sqrt(Math.pow(this.size.height / 2 - y - halfTileSize, 2) + Math.pow(this.size.width / 2 - x - halfTileSize, 2));

var distance = 1.5 / tileSize * this.size.mutiply(0.5).subtract(new Point(x - halfTileSize, y - halfTileSize)).length();

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:70
&gt; +            distance: distance,

step and distance seems to be the same for all tiles. So why do we have to repeat them with each tile?

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:88
&gt; +        var time = Date.now();

This variable is not used.

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:91
&gt; +        var progress = this._benchmark.timestamp % 10000 / 10000;

Why do we use 10000 here? Do we want to repeat the animation every 10 seconds? Or are we assuming the test time is only 10 seconds?

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:110
&gt; +        }

This loop can be written like this:

for (var i = 0; i &lt; this._offsetIndex; ++i) {
    var tile = this.tiles[i];
    tile.active = true;
    tile.rotate += tile.step;
    tile.element.style.transform = &quot;rotate(&quot; + tile.rotate + &quot;deg)&quot;;

    var influence = 1 - (tile.distance * distanceFactor);
    tile.element.style.backgroundColor = hslPrefix + l * Math.tan(influence / 1.25) + &quot;%,&quot; + influence + &quot;)&quot;;
}

for (var i = this._offsetIndex; i &lt; this.tiles.length &amp;&amp; this.tiles[i].active; ++i) {
    this.tiles[i].active = false;
    this.tiles[i].element.style.backgroundColor = &quot;&quot;;
}

&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:116
&gt; +    }

This function is also defined in focus.js.

&gt; PerformanceTests/Animometer/tests/master/resources/stage.css:29
&gt; +    font-weight: 200;

I think the css rules in this file should be generic. So for #center-text I think it is fine to include only the properties that makes the text center. But I think properties like color, font-size and font-weight should be moved to the specific tests rules.  For example I may write a new test and add these in the html file:

&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/stage.css&quot;&gt;
#center-text {
    color: red;
    font-size: 6em;
    font-weight: 400;
}

And if the test does not include rules for #center-text, then the #centerr-text will get the default values.

&gt; PerformanceTests/Animometer/tests/resources/main.js:886
&gt; +        var stage = window.getComputedStyle(document.getElementById(&quot;stage&quot;));

Should not this variable be renamed &quot;style&quot; or &quot;stageStyle&quot; instead of &quot;stage&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163663</commentid>
    <comment_count>5</comment_count>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2016-02-10 16:29:45 -0800</bug_when>
    <thetext>Unofficial r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163692</commentid>
    <comment_count>6</comment_count>
      <attachid>270982</attachid>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2016-02-10 21:28:05 -0800</bug_when>
    <thetext>Comment on attachment 270982
Patch

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

&gt;&gt; PerformanceTests/Animometer/tests/master/focus.html:21
&gt;&gt; +    }
&gt; 
&gt; #center-text is already added to stage.css by this patch with the same set of style rules. I think deleting this one here should not affect the appearance of the test.

whoops. removed.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:37
&gt;&gt; +        this._centerElement.style.zIndex = Math.round(10 * this.centerObjectDepth);
&gt; 
&gt; Should not these settings be moved to the &lt;style&gt; section of focus.html?

No. They are used throughout the test and affect the visuals so I think we should keep them in script in case we want to tweak later.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:40
&gt;&gt; +        this._setPrefixedStyles(this._centerElement, &apos;filter&apos;, &apos;blur(&apos; + blur + &apos;px)&apos;);
&gt; 
&gt; You can now use Utilities.setElementPrefixedProperty(this._centerElement, &apos;filter&apos;, &apos;blur(&apos; + blur + &apos;px)&apos;);

yes, i&apos;ll update.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:72
&gt;&gt; +    _createTestElement: function()
&gt; 
&gt; The parent of the element can be passed and this function becomes responsible of connecting the new child to its parent.

But then the addition and removal of the element are located in two separate functions, making it harder to understand how the class works.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:103
&gt;&gt; +            }
&gt; 
&gt; If we create a separate class for the particle object, this code can be moved in the class constructor.

ok

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:124
&gt;&gt; +            obj.element.style.transform = &apos;translateX(&apos; + left + &apos;%) translateY(&apos; + top + &apos;%)&apos;;
&gt; 
&gt; Should not we create a separate class for the obj and have this animation code live inside the class animate() function?

ok.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:147
&gt;&gt; +    },
&gt; 
&gt; You do not need this function if you use Utilities.setElementPrefixedProperty()

done.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/focus.js:159
&gt;&gt; +    }
&gt; 
&gt; Should not this function be moved to Utilities class in extensions.js?

this and _getprogress probably could.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:36
&gt;&gt; +        }.bind(this));
&gt; 
&gt; Can&apos;t we load the image in a hidden element in the html file like what we do in bouncing-canvas-images.html?
&gt; 
&gt; &lt;img class=&quot;hidden&quot; src=&quot;../resources/yin-yang.png&quot;&gt;

I think this guarantees we receive the load event because we hook to it before we set the image source.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:83
&gt;&gt; +        };
&gt; 
&gt; I do not think we have to create a separate object wrapping this element since all it contains is the element and the 2d context which can be retrieved at painting time. If we do that we get rid of this.testElements also and have all the elements stored stored in the children list of the stage element.

sure.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:116
&gt;&gt; +                didDraw = true;
&gt; 
&gt; I think we can delete this flag and replace the if-statemnet below by:
&gt; 
&gt; if (!dataLen)

when is dataLen == 0? this flag is only set if at least one pixel in the canvas is opaque.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:124
&gt;&gt; +                obj.context.drawImage(this.testImage, 0, 0, this.testImageWidth, this.testImageHeight)
&gt; 
&gt; Should not this if-statemnet be moved before the loop above and continue after it redraws.

no. depending on the length of the animation we might have cleared out the entire canvas, and we need to repopulate the pixels.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/image-data.js:147
&gt;&gt; +    },
&gt; 
&gt; Should not the whole function be moved to Utilities in main.js?

This contributes to the visual effect specific to this test, so I think this doesn&apos;t need to move out.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:31
&gt;&gt; +                nextIndex += Math.floor(spiralCounter / 2);
&gt; 
&gt; Can&apos;t we use:
&gt; 
&gt; nextIndex += spiralCounter &gt;&gt; 1;

sure

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:43
&gt;&gt; +        centerSpiralCount = maxSide * Math.round(maxSide / 2) * 2;
&gt; 
&gt; I do not understand why we do this math to get the smallest even digit &gt;= maxSide. But I think this can be written like also this this:
&gt; 
&gt; centerSpiralCount = maxSide * (maxSide + (maxSide &amp; 1));

This create a spiral of tiles from the center. The stage is much wider than its height, so we can&apos;t continue spiraling. instead we fill in the columns on either side of the square spiral.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:58
&gt;&gt; +        tile.className = &apos;div-&apos; + Stage.randomInt(0,6);
&gt; 
&gt; var tile = Utilities.createElement(&quot;div&quot;, { class: &apos;div-&apos; + Stage.randomInt(0,6) }, this.element);

ok

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:64
&gt;&gt; +        var distance = 1.5 / tileSize * Math.sqrt(Math.pow(this.size.height / 2 - y - halfTileSize, 2) + Math.pow(this.size.width / 2 - x - halfTileSize, 2));
&gt; 
&gt; var distance = 1.5 / tileSize * this.size.mutiply(0.5).subtract(new Point(x - halfTileSize, y - halfTileSize)).length();

x + halfTimeSize, but sure.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:70
&gt;&gt; +            distance: distance,
&gt; 
&gt; step and distance seems to be the same for all tiles. So why do we have to repeat them with each tile?

x and y are not the same per tile.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:88
&gt;&gt; +        var time = Date.now();
&gt; 
&gt; This variable is not used.

removed.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:91
&gt;&gt; +        var progress = this._benchmark.timestamp % 10000 / 10000;
&gt; 
&gt; Why do we use 10000 here? Do we want to repeat the animation every 10 seconds? Or are we assuming the test time is only 10 seconds?

yes, repeat the animation. this just alters the color.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:110
&gt;&gt; +        }
&gt; 
&gt; This loop can be written like this:
&gt; 
&gt; for (var i = 0; i &lt; this._offsetIndex; ++i) {
&gt;     var tile = this.tiles[i];
&gt;     tile.active = true;
&gt;     tile.rotate += tile.step;
&gt;     tile.element.style.transform = &quot;rotate(&quot; + tile.rotate + &quot;deg)&quot;;
&gt; 
&gt;     var influence = 1 - (tile.distance * distanceFactor);
&gt;     tile.element.style.backgroundColor = hslPrefix + l * Math.tan(influence / 1.25) + &quot;%,&quot; + influence + &quot;)&quot;;
&gt; }
&gt; 
&gt; for (var i = this._offsetIndex; i &lt; this.tiles.length &amp;&amp; this.tiles[i].active; ++i) {
&gt;     this.tiles[i].active = false;
&gt;     this.tiles[i].element.style.backgroundColor = &quot;&quot;;
&gt; }

nice.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/multiply.js:116
&gt;&gt; +    }
&gt; 
&gt; This function is also defined in focus.js.

yup, will refactor out.

&gt;&gt; PerformanceTests/Animometer/tests/master/resources/stage.css:29
&gt;&gt; +    font-weight: 200;
&gt; 
&gt; I think the css rules in this file should be generic. So for #center-text I think it is fine to include only the properties that makes the text center. But I think properties like color, font-size and font-weight should be moved to the specific tests rules.  For example I may write a new test and add these in the html file:
&gt; 
&gt; &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/stage.css&quot;&gt;
&gt; #center-text {
&gt;     color: red;
&gt;     font-size: 6em;
&gt;     font-weight: 400;
&gt; }
&gt; 
&gt; And if the test does not include rules for #center-text, then the #centerr-text will get the default values.

sure. i&apos;ll move it.

&gt;&gt; PerformanceTests/Animometer/tests/resources/main.js:886
&gt;&gt; +        var stage = window.getComputedStyle(document.getElementById(&quot;stage&quot;));
&gt; 
&gt; Should not this variable be renamed &quot;style&quot; or &quot;stageStyle&quot; instead of &quot;stage&quot;?

yes you&apos;re right.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163705</commentid>
    <comment_count>7</comment_count>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2016-02-10 23:42:25 -0800</bug_when>
    <thetext>committed r196415</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>270982</attachid>
            <date>2016-02-10 01:07:06 -0800</date>
            <delta_ts>2016-02-10 12:24:34 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-154063-20160210010644.patch</filename>
            <type>text/plain</type>
            <size>26894</size>
            <attacher name="Jon Lee">jonlee</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk2MzA0CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L0FuaW1vbWV0ZXIvcmVzb3VyY2VzL3J1bm5lci9iZW5jaG1hcmstcnVubmVyLmpzIGIvUGVyZm9y
bWFuY2VUZXN0cy9Bbmltb21ldGVyL3Jlc291cmNlcy9ydW5uZXIvYmVuY2htYXJrLXJ1bm5lci5q
cwppbmRleCBiNmE4MmJlYTYzYmE3OWUwZWZjNjA4OWNjODY2MGQ0NjYyMjAwOTg1Li5hMmFjN2Iy
YjBiZDZlNzI1ZTY5ZmY3N2NiNDhhZTRmZTVmNmQ0N2M4IDEwMDY0NAotLS0gYS9QZXJmb3JtYW5j
ZVRlc3RzL0FuaW1vbWV0ZXIvcmVzb3VyY2VzL3J1bm5lci9iZW5jaG1hcmstcnVubmVyLmpzCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRlci9yZXNvdXJjZXMvcnVubmVyL2JlbmNobWFy
ay1ydW5uZXIuanMKQEAgLTk0LDYgKzk0LDcgQEAgQmVuY2htYXJrUnVubmVyID0gVXRpbGl0aWVz
LmNyZWF0ZUNsYXNzKAogICAgICAgICBVdGlsaXRpZXMuZXh0ZW5kT2JqZWN0KG9wdGlvbnMsIGNv
bnRlbnRXaW5kb3cuVXRpbGl0aWVzLnBhcnNlUGFyYW1ldGVycygpKTsKIAogICAgICAgICB2YXIg
YmVuY2htYXJrID0gbmV3IGNvbnRlbnRXaW5kb3cuYmVuY2htYXJrQ2xhc3Mob3B0aW9ucyk7Cisg
ICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmVuY2htYXJrLmJh
Y2tncm91bmRDb2xvcigpOwogICAgICAgICBiZW5jaG1hcmsucnVuKCkudGhlbihmdW5jdGlvbihy
ZXN1bHRzKSB7CiAgICAgICAgICAgICB2YXIgc3VpdGVSZXN1bHRzID0gc2VsZi5fc3VpdGVzUmVz
dWx0c1tzdWl0ZS5uYW1lXSB8fCB7fTsKICAgICAgICAgICAgIHN1aXRlUmVzdWx0c1t0ZXN0Lm5h
bWVdID0gcmVzdWx0czsKQEAgLTE1Myw4ICsxNTQsMTAgQEAgQmVuY2htYXJrUnVubmVyID0gVXRp
bGl0aWVzLmNyZWF0ZUNsYXNzKAogICAgICAgICAgICAgY3VycmVudEl0ZXJhdGlvbisrOwogICAg
ICAgICAgICAgaWYgKGN1cnJlbnRJdGVyYXRpb24gPCBzZWxmLl9jbGllbnQuaXRlcmF0aW9uQ291
bnQpCiAgICAgICAgICAgICAgICAgc2VsZi5ydW5BbGxTdGVwcygpOwotICAgICAgICAgICAgZWxz
ZSBpZiAodGhpcy5fY2xpZW50ICYmIHRoaXMuX2NsaWVudC5kaWRGaW5pc2hMYXN0SXRlcmF0aW9u
KQorICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fY2xpZW50ICYmIHRoaXMuX2NsaWVudC5kaWRG
aW5pc2hMYXN0SXRlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHls
ZS5iYWNrZ3JvdW5kQ29sb3IgPSAiIjsKICAgICAgICAgICAgICAgICBzZWxmLl9jbGllbnQuZGlk
RmluaXNoTGFzdEl0ZXJhdGlvbigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAg
ICAgaWYgKHRoaXMuX2NsaWVudCAmJiB0aGlzLl9jbGllbnQud2lsbFN0YXJ0Rmlyc3RJdGVyYXRp
b24pCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL0FuaW1vbWV0ZXIvcmVzb3VyY2VzL3J1
bm5lci90ZXN0cy5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRlci9yZXNvdXJjZXMvcnVu
bmVyL3Rlc3RzLmpzCmluZGV4IDEwNDBjMGFhNzBlZGY1ZDY5OGUwYmUzMzIwNDVkOTZkNTVhZTJi
YTQuLmNjODViOWEzZDRiOGQzZjQ0YTkwNmE5NDljZGUwOTUyNzBhNWQ5N2IgMTAwNjQ0Ci0tLSBh
L1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRlci9yZXNvdXJjZXMvcnVubmVyL3Rlc3RzLmpzCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRlci9yZXNvdXJjZXMvcnVubmVyL3Rlc3RzLmpz
CkBAIC0xMyw2ICsxMywxMCBAQCB2YXIgU3VpdGVzID0gW107CiBTdWl0ZXMucHVzaChuZXcgU3Vp
dGUoIkFuaW1vbWV0ZXIiLAogICAgIFsKICAgICAgICAgeworICAgICAgICAgICAgdXJsOiAibWFz
dGVyL211bHRpcGx5Lmh0bWwiLAorICAgICAgICAgICAgbmFtZTogIk11bHRpcGx5IgorICAgICAg
ICB9LAorICAgICAgICB7CiAgICAgICAgICAgICB1cmw6ICJtYXN0ZXIvY2FudmFzLXN0YWdlLmh0
bWw/cGF0aFR5cGU9YXJjcyIsCiAgICAgICAgICAgICBuYW1lOiAiQ2FudmFzIGFyY3MiCiAgICAg
ICAgIH0sCkBAIC0yNSw2ICsyOSwxNCBAQCBTdWl0ZXMucHVzaChuZXcgU3VpdGUoIkFuaW1vbWV0
ZXIiLAogICAgICAgICAgICAgbmFtZTogIkNhbnZhcyBsaW5lIHNlZ21lbnRzIgogICAgICAgICB9
LAogICAgICAgICB7CisgICAgICAgICAgICB1cmw6ICJtYXN0ZXIvZm9jdXMuaHRtbCIsCisgICAg
ICAgICAgICBuYW1lOiAiRm9jdXMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAg
IHVybDogIm1hc3Rlci9pbWFnZS1kYXRhLmh0bWwiLAorICAgICAgICAgICAgbmFtZTogIkltYWdl
cyIKKyAgICAgICAgfSwKKyAgICAgICAgewogICAgICAgICAgICAgdXJsOiAibWFzdGVyL3BhcnRp
Y2xlcy5odG1sIiwKICAgICAgICAgICAgIG5hbWU6ICJET00gcGFydGljbGVzLCBTVkcgbWFza3Mi
CiAgICAgICAgIH0sCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL0FuaW1vbWV0ZXIvdGVz
dHMvbWFzdGVyL2ZvY3VzLmh0bWwgYi9QZXJmb3JtYW5jZVRlc3RzL0FuaW1vbWV0ZXIvdGVzdHMv
bWFzdGVyL2ZvY3VzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzVkNjQ3OTUyOTQ0NDRmMDBhYzM2NzA5ZDcz
N2M2Yzc4ZmVhZDMyNgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9t
ZXRlci90ZXN0cy9tYXN0ZXIvZm9jdXMuaHRtbApAQCAtMCwwICsxLDQ2IEBACis8IURPQ1RZUEUg
aHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0
ZXh0L2NzcyIgaHJlZj0icmVzb3VyY2VzL3N0YWdlLmNzcyI+CisgICAgPHN0eWxlIHR5cGU9InRl
eHQvY3NzIj4KKworICAgICNzdGFnZSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMDFB
MUY7CisgICAgfQorCisgICAgI3N0YWdlIGRpdiB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0
ZTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0RFREFERDsKKyAgICAgICAgYm9yZGVyLXJh
ZGl1czogNTAlOworICAgIH0KKworICAgICNjZW50ZXItdGV4dCB7CisgICAgICAgIHRvcDogNTAl
OworICAgICAgICBsZWZ0OiA1MCU7CisgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAl
KSB0cmFuc2xhdGVZKC01MCUpOworICAgIH0KKworICAgICNjZW50ZXItdGV4dCBzcGFuIHsKKyAg
ICAgICAgY29sb3I6ICMyMDFBMUY7CisgICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CisgICAgICAg
IHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiA1MCU7CisgICAgICAgIGxlZnQ6IDUw
JTsKKyAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7
CisgICAgfQorCisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxkaXYgaWQ9InN0
YWdlIj4KKyAgICAgICAgPGRpdiBpZD0iY2VudGVyLXRleHQiPjxzcGFuPmZvY3VzPC9zcGFuPjwv
ZGl2PgorICAgIDwvZGl2PgorICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvc3RyaW5n
cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9leHRlbnNp
b25zLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL2FsZ29yaXRo
bS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9zYW1wbGVyLmpz
Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL21hdGguanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMvbWFpbi5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy9mb2N1cy5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8
L2h0bWw+CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL0FuaW1vbWV0ZXIvdGVzdHMvbWFz
dGVyL2ltYWdlLWRhdGEuaHRtbCBiL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRlci90ZXN0cy9t
YXN0ZXIvaW1hZ2UtZGF0YS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmJjOTJlNjViODE0NThlYTI1MzRiMzJm
ZjNmN2NiYmRjMDI5MTZmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL0Fu
aW1vbWV0ZXIvdGVzdHMvbWFzdGVyL2ltYWdlLWRhdGEuaHRtbApAQCAtMCwwICsxLDI3IEBACis8
IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0
IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vcmVzb3VyY2VzL3N0YWdlLmNzcyI+CisgICAgPHN0
eWxlIHR5cGU9InRleHQvY3NzIj4KKworICAgICNzdGFnZSB7CisgICAgICAgIGJhY2tncm91bmQt
Y29sb3I6ICMwMDA7CisgICAgfQorCisgICAgI3N0YWdlIGRpdiB7CisgICAgICAgIHBvc2l0aW9u
OiBhYnNvbHV0ZTsKKyAgICB9CisKKyAgICA8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAg
PGRpdiBpZD0ic3RhZ2UiPjwvZGl2PgorICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMv
c3RyaW5ncy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9l
eHRlbnNpb25zLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL2Fs
Z29yaXRobS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9zYW1w
bGVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL21hdGguanMi
Pjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMvbWFpbi5qcyI+PC9zY3Jp
cHQ+CisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy9pbWFnZS1kYXRhLmpzIj48L3NjcmlwdD4K
KzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRl
ci90ZXN0cy9tYXN0ZXIvbXVsdGlwbHkuaHRtbCBiL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRl
ci90ZXN0cy9tYXN0ZXIvbXVsdGlwbHkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMzkwYzgxOTEzNzEzZTVk
YjBjNTdiMDYwMGJiMTY5ZjliMGU5OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VU
ZXN0cy9Bbmltb21ldGVyL3Rlc3RzL21hc3Rlci9tdWx0aXBseS5odG1sCkBAIC0wLDAgKzEsNTQg
QEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bGluayByZWw9InN0eWxl
c2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJyZXNvdXJjZXMvc3RhZ2UuY3NzIj4KKyAgICA8
c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorCisgICAgI3N0YWdlIHsKKyAgICAgICAgYmFja2dyb3Vu
ZC1jb2xvcjogIzAwMDsKKyAgICB9CisKKyAgICAjc3RhZ2UgZGl2IHsKKyAgICAgICAgcG9zaXRp
b246IGFic29sdXRlOworICAgIH0KKworICAgICNzdGFnZSAuZGl2LTAgeworICAgICAgICBib3Jk
ZXItdG9wLXJpZ2h0LXJhZGl1czogMTAwJTsKKyAgICB9CisKKyAgICAjc3RhZ2UgLmRpdi0xIHsK
KyAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTAwJTsKKyAgICB9CisKKyAgICAjc3Rh
Z2UgLmRpdi0yIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTAwJTsKKyAg
ICB9CisKKyAgICAjc3RhZ2UgLmRpdi0zIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1y
YWRpdXM6IDEwMCU7CisgICAgfQorCisgICAgI3N0YWdlIC5kaXYtNCB7CisgICAgICAgIGJvcmRl
ci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwMCU7CisgICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFk
aXVzOiAxMDAlOworICAgIH0KKworICAgICNzdGFnZSAuZGl2LTUgeworICAgICAgICBib3JkZXIt
Ym90dG9tLXJpZ2h0LXJhZGl1czogMTAwJTsKKyAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1
czogMTAwJTsKKyAgICB9CisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxkaXYg
aWQ9InN0YWdlIj4KKyAgICAgICAgPHNwYW4gaWQ9ImNlbnRlci10ZXh0Ij5tdWx0aXBseTwvc3Bh
bj4KKyAgICA8L2Rpdj4KKyAgICA8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3N0cmluZ3Mu
anMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvZXh0ZW5zaW9u
cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9hbGdvcml0aG0u
anMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMvc2FtcGxlci5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9tYXRoLmpzIj48L3Njcmlw
dD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL21haW4uanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvbXVsdGlwbHkuanMiPjwvc2NyaXB0PgorPC9ib2R5Pgor
PC9odG1sPgpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9Bbmltb21ldGVyL3Rlc3RzL21h
c3Rlci9yZXNvdXJjZXMvZm9jdXMuanMgYi9QZXJmb3JtYW5jZVRlc3RzL0FuaW1vbWV0ZXIvdGVz
dHMvbWFzdGVyL3Jlc291cmNlcy9mb2N1cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iOTI5MWM0MGVhZjFhNWY2
MzQ5MzY0N2JmZTk4MGNiNDI2NTI3MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VU
ZXN0cy9Bbmltb21ldGVyL3Rlc3RzL21hc3Rlci9yZXNvdXJjZXMvZm9jdXMuanMKQEAgLTAsMCAr
MSwxNzEgQEAKKyhmdW5jdGlvbigpIHsKKwordmFyIEZvY3VzU3RhZ2UgPSBVdGlsaXRpZXMuY3Jl
YXRlU3ViY2xhc3MoU3RhZ2UsCisgICAgZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgU3RhZ2Uu
Y2FsbCh0aGlzKTsKKyAgICB9LCB7CisKKyAgICBtb3ZlbWVudER1cmF0aW9uOiAyNTAwLAorICAg
IGZvY3VzRHVyYXRpb246IDEwMDAsCisgICAgcmFkaXVzOiAyMCwKKworICAgIHRyYXZlbERpc3Rh
bmNlOiA3MCwKKyAgICBzaXplVmFyaWFuY2U6IDUwLAorCisgICAgY2VudGVyT2JqZWN0RGVwdGg6
IDAuMCwKKyAgICBtaW5PYmplY3REZXB0aDogMC4yLAorICAgIG1heE9iamVjdERlcHRoOiAxLjAs
CisKKyAgICBtaW5CbHVyVmFsdWU6IDEuNSwKKyAgICBtYXhCbHVyVmFsdWU6IDE1LAorICAgIG1h
eENlbnRlck9iamVjdEJsdXJWYWx1ZTogNSwKKworICAgIG9wYWNpdHlNdWx0aXBsaWVyOiA0MCwK
KworICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGJlbmNobWFyaywgb3B0aW9ucykKKyAgICB7Cisg
ICAgICAgIFN0YWdlLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgYmVuY2htYXJrLCBv
cHRpb25zKTsKKyAgICAgICAgLy8gY3JlYXRlIG9uZSBlbGVtZW50IHRvIHN0YXJ0IHdpdGgKKyAg
ICAgICAgdGhpcy50ZXN0RWxlbWVudHMgPSBbXTsKKworICAgICAgICB0aGlzLl9mb2NhbFBvaW50
ID0gMC41OworCisgICAgICAgIHRoaXMuX2NlbnRlckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgiY2VudGVyLXRleHQiKTsKKyAgICAgICAgdGhpcy5fY2VudGVyRWxlbWVudC5zdHls
ZS53aWR0aCA9ICh0aGlzLnJhZGl1cyAqIDUpICsgJ3B4JzsKKyAgICAgICAgdGhpcy5fY2VudGVy
RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAodGhpcy5yYWRpdXMgKiA1KSArICdweCc7CisgICAgICAg
IHRoaXMuX2NlbnRlckVsZW1lbnQuc3R5bGUuekluZGV4ID0gTWF0aC5yb3VuZCgxMCAqIHRoaXMu
Y2VudGVyT2JqZWN0RGVwdGgpOworCisgICAgICAgIHZhciBibHVyID0gdGhpcy5fZ2V0Qmx1clZh
bHVlKHRoaXMuY2VudGVyT2JqZWN0RGVwdGgpOworICAgICAgICB0aGlzLl9zZXRQcmVmaXhlZFN0
eWxlcyh0aGlzLl9jZW50ZXJFbGVtZW50LCAnZmlsdGVyJywgJ2JsdXIoJyArIGJsdXIgKyAncHgp
Jyk7CisgICAgfSwKKworICAgIGNvbXBsZXhpdHk6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IHJldHVybiAxICsgdGhpcy50ZXN0RWxlbWVudHMubGVuZ3RoOworICAgIH0sCisKKyAgICB0dW5l
OiBmdW5jdGlvbihjb3VudCkKKyAgICB7CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgIGZv
ciAodmFyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHZhciBvYmog
PSB0aGlzLl9jcmVhdGVUZXN0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIHRoaXMudGVzdEVs
ZW1lbnRzLnB1c2gob2JqKTsKKyAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hp
bGQob2JqLmVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisKKyAgICAgICAgd2hpbGUgKGNvdW50IDwgMCkgeworICAgICAgICAgICAgdmFyIG9i
aiA9IHRoaXMudGVzdEVsZW1lbnRzLnNoaWZ0KCk7CisgICAgICAgICAgICBpZiAoIW9iaikKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVD
aGlsZChvYmouZWxlbWVudCk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAg
fSwKKworICAgIF9jcmVhdGVUZXN0RWxlbWVudDogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAg
dmFyIHRvcE9mZnNldCA9IHRoaXMubWF4VmVydGljYWxPZmZzZXQgKiBTdGFnZS5yYW5kb21TaWdu
KCk7CisgICAgICAgIHZhciB0b3AgPSBTdGFnZS5yYW5kb20oMiAqIHRoaXMucmFkaXVzLCB0aGlz
LnNpemUuaGVpZ2h0IC0gNCAqIHRoaXMucmFkaXVzKSAvIHRoaXMuc2l6ZS5oZWlnaHQgKiAxMDA7
CisgICAgICAgIHZhciBsZWZ0ID0gU3RhZ2UucmFuZG9tKDIgKiB0aGlzLnJhZGl1cywgdGhpcy5z
aXplLndpZHRoIC0gNCAqIHRoaXMucmFkaXVzKSAvIHRoaXMuc2l6ZS53aWR0aCAqIDEwMDsKKwor
ICAgICAgICAvLyBzaXplIGFuZCBibHVycmluZyBhcmUgYSBmdW5jdGlvbiBvZiBkZXB0aAorICAg
ICAgICB2YXIgZGVwdGggPSB0aGlzLl9sZXJwKDEgLSBNYXRoLnBvdyhNYXRoLnJhbmRvbSgpLCAy
KSwgdGhpcy5taW5PYmplY3REZXB0aCwgdGhpcy5tYXhPYmplY3REZXB0aCk7CisgICAgICAgIHZh
ciBkZXB0aE11bHRpcGxpZXIgPSB0aGlzLl9sZXJwKDEgLSBkZXB0aCwgMC44LCAxKTsKKyAgICAg
ICAgdmFyIGRpc3RhbmNlID0gdGhpcy5fbGVycChkZXB0aCwgMSwgdGhpcy5zaXplVmFyaWFuY2Up
OworICAgICAgICB2YXIgc2l6ZSA9ICh0aGlzLnJhZGl1cyAqIDIpICsgKHRoaXMuc2l6ZVZhcmlh
bmNlIC0gZGlzdGFuY2UpOworICAgICAgICB2YXIgb3BhY2l0eSA9IHRoaXMuX2dldE9wYWNpdHlW
YWx1ZShkZXB0aCk7CisKKyAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCdkaXYnKTsKKyAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUgKyAncHgnOwor
ICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHNpemUgKyAncHgnOworICAgICAgICBlbGVt
ZW50LnN0eWxlLnRvcCA9IHRvcCArICclJzsKKyAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0g
bGVmdCArICclJzsKKyAgICAgICAgZWxlbWVudC5zdHlsZS56SW5kZXggPSBNYXRoLnJvdW5kKCgx
IC0gZGVwdGgpICogMTApOworCisgICAgICAgIHRoaXMuX3NldFByZWZpeGVkU3R5bGVzKGVsZW1l
bnQsICdmaWx0ZXInLCAnYmx1cignICsgdGhpcy5fZ2V0Qmx1clZhbHVlKGRlcHRoKSArICdweCkg
b3BhY2l0eSgnICsgdGhpcy5fZ2V0T3BhY2l0eVZhbHVlKGRlcHRoKSArICclKScpOworCisgICAg
ICAgIHJldHVybiB7CisgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LAorICAgICAgICAgICAg
ZGVwdGg6IGRlcHRoLAorICAgICAgICAgICAgc2luTXVsdGlwbGllcjogTWF0aC5yYW5kb20oKSAq
IFN0YWdlLnJhbmRvbVNpZ24oKSAqIGRlcHRoTXVsdGlwbGllciwKKyAgICAgICAgICAgIGNvc011
bHRpcGxpZXI6IE1hdGgucmFuZG9tKCkgKiBTdGFnZS5yYW5kb21TaWduKCkgKiBkZXB0aE11bHRp
cGxpZXIsCisgICAgICAgICAgICBzdHlsZXM6IHsKKyAgICAgICAgICAgICAgICBzaXplOiBzaXpl
LAorICAgICAgICAgICAgICAgIHRvcDogdG9wLAorICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9LAorCisgICAgYW5pbWF0ZTogZnVuY3Rp
b24oKQorICAgIHsKKyAgICAgICAgdmFyIHRpbWUgPSB0aGlzLl9iZW5jaG1hcmsudGltZXN0YW1w
OworICAgICAgICB2YXIgc2luVGltZSA9IE1hdGguc2luKHRpbWUgLyB0aGlzLm1vdmVtZW50RHVy
YXRpb24pOworICAgICAgICB2YXIgY29zVGltZSA9IE1hdGguY29zKHRpbWUgLyB0aGlzLm1vdmVt
ZW50RHVyYXRpb24pOworCisgICAgICAgIHZhciBmb2N1c1Byb2dyZXNzID0gdGhpcy5fZ2V0UHJv
Z3Jlc3MoTWF0aC5zaW4odGltZSAvIHRoaXMuZm9jdXNEdXJhdGlvbiksIC0xLCAxKTsKKyAgICAg
ICAgdGhpcy5fZm9jYWxQb2ludCA9IGZvY3VzUHJvZ3Jlc3M7CisKKyAgICAgICAgLy8gdXBkYXRl
IGNlbnRlciBlbGVtZW50IGJlZm9yZSBsb29wCisgICAgICAgIHRoaXMuX3NldFByZWZpeGVkU3R5
bGVzKHRoaXMuX2NlbnRlckVsZW1lbnQsICdmaWx0ZXInLCAnYmx1cignICsgdGhpcy5fZ2V0Qmx1
clZhbHVlKHRoaXMuY2VudGVyT2JqZWN0RGVwdGgsIHRydWUpICsgJ3B4KScpOworCisgICAgICAg
IHRoaXMudGVzdEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24ob2JqKSB7CisgICAgICAgICAgICB2
YXIgdG9wID0gb2JqLnN0eWxlcy50b3AgKyBzaW5UaW1lICogb2JqLnNpbk11bHRpcGxpZXIgKiB0
aGlzLnRyYXZlbERpc3RhbmNlOworICAgICAgICAgICAgdmFyIGxlZnQgPSBvYmouc3R5bGVzLmxl
ZnQgKyBjb3NUaW1lICogb2JqLmNvc011bHRpcGxpZXIgKiB0aGlzLnRyYXZlbERpc3RhbmNlOwor
CisgICAgICAgICAgICB0aGlzLl9zZXRQcmVmaXhlZFN0eWxlcyhvYmouZWxlbWVudCwgJ2ZpbHRl
cicsICdibHVyKCcgKyB0aGlzLl9nZXRCbHVyVmFsdWUob2JqLmRlcHRoKSArICdweCkgb3BhY2l0
eSgnICsgdGhpcy5fZ2V0T3BhY2l0eVZhbHVlKG9iai5kZXB0aCkgKyAnJSknKTsKKyAgICAgICAg
ICAgIG9iai5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKCcgKyBsZWZ0ICsg
JyUpIHRyYW5zbGF0ZVkoJyArIHRvcCArICclKSc7CisgICAgICAgIH0sIHRoaXMpOworICAgIH0s
CisKKyAgICBfZ2V0Qmx1clZhbHVlOiBmdW5jdGlvbihkZXB0aCwgaXNDZW50ZXIpCisgICAgewor
ICAgICAgICB2YXIgdmFsdWUgPSBNYXRoLmFicyhkZXB0aCAtIHRoaXMuX2ZvY2FsUG9pbnQpOwor
CisgICAgICAgIGlmIChpc0NlbnRlcikKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm1heENlbnRl
ck9iamVjdEJsdXJWYWx1ZSAqIHZhbHVlOworCisgICAgICAgIHJldHVybiB0aGlzLl9sZXJwKHZh
bHVlLCB0aGlzLm1pbkJsdXJWYWx1ZSwgdGhpcy5tYXhCbHVyVmFsdWUpOworICAgIH0sCisKKyAg
ICBfc2V0UHJlZml4ZWRTdHlsZXM6IGZ1bmN0aW9uKGVsLCBwcm9wLCB2YWx1ZSkKKyAgICB7Cisg
ICAgICAgIHZhciBwcmVmaXhlcyA9IFsgJycsICctd2Via2l0LScsICctbW96LScsICctbXMtJywg
Jy1vLScgXTsKKworICAgICAgICB2YXIgaSwKKyAgICAgICAgICAgIGxlbiA9IHByZWZpeGVzLmxl
bmd0aDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBl
bC5zdHlsZVsgcHJlZml4ZXNbIGkgXSArIHByb3AgXSA9IHZhbHVlOworICAgICAgICB9CisgICAg
fSwKKworICAgIF9nZXRPcGFjaXR5VmFsdWU6IGZ1bmN0aW9uKGRlcHRoKSB7CisgICAgICAgIHJl
dHVybiB0aGlzLm9wYWNpdHlNdWx0aXBsaWVyICogKDEgLSBNYXRoLmFicyhkZXB0aCAtIHRoaXMu
X2ZvY2FsUG9pbnQpKTsKKyAgICB9LAorCisgICAgX2dldFByb2dyZXNzOiBmdW5jdGlvbih2YWx1
ZSwgbWluLCBtYXgpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSAtIG1pbikgLyAobWF4IC0gbWlu
KTsKKyAgICB9LAorCisgICAgX2xlcnA6IGZ1bmN0aW9uKHZhbHVlLCBtaW4sIG1heCkgeworICAg
ICAgICByZXR1cm4gbWluICsgKG1heCAtIG1pbikgKiB2YWx1ZTsKKyAgICB9Cit9KTsKKwordmFy
IEZvY3VzQmVuY2htYXJrID0gVXRpbGl0aWVzLmNyZWF0ZVN1YmNsYXNzKEJlbmNobWFyaywKKyAg
ICBmdW5jdGlvbihvcHRpb25zKQorICAgIHsKKyAgICAgICAgQmVuY2htYXJrLmNhbGwodGhpcywg
bmV3IEZvY3VzU3RhZ2UoKSwgb3B0aW9ucyk7CisgICAgfQorKTsKKword2luZG93LmJlbmNobWFy
a0NsYXNzID0gRm9jdXNCZW5jaG1hcms7CisKK30oKSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5j
ZVRlc3RzL0FuaW1vbWV0ZXIvdGVzdHMvbWFzdGVyL3Jlc291cmNlcy9pbWFnZS1kYXRhLmpzIGIv
UGVyZm9ybWFuY2VUZXN0cy9Bbmltb21ldGVyL3Rlc3RzL21hc3Rlci9yZXNvdXJjZXMvaW1hZ2Ut
ZGF0YS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4zNDM1Nzk3MGEyMDVkZDc5YmFkMmE4ZjM3NzdlNTE1ZmQ1ZjBl
NGI5Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9Bbmltb21ldGVyL3Rlc3Rz
L21hc3Rlci9yZXNvdXJjZXMvaW1hZ2UtZGF0YS5qcwpAQCAtMCwwICsxLDE2OSBAQAorKGZ1bmN0
aW9uKCkgeworCit2YXIgSW1hZ2VEYXRhU3RhZ2UgPSBVdGlsaXRpZXMuY3JlYXRlU3ViY2xhc3Mo
U3RhZ2UsCisgICAgZnVuY3Rpb24oKSB7CisgICAgICAgIFN0YWdlLmNhbGwodGhpcyk7CisKKyAg
ICAgICAgdGhpcy50ZXN0RWxlbWVudHMgPSBbXTsKKyAgICAgICAgdGhpcy5fb2Zmc2V0SW5kZXgg
PSAwOworICAgIH0sIHsKKworICAgIHRlc3RJbWFnZVNyYzogJy4vLi4vcmVzb3VyY2VzL3lpbi15
YW5nLnBuZycsCisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbihiZW5jaG1hcmspCisgICAgewor
ICAgICAgICBTdGFnZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGJlbmNobWFyayk7
CisKKyAgICAgICAgdmFyIHdhaXRGb3JMb2FkID0gbmV3IFNpbXBsZVByb21pc2U7CisgICAgICAg
IHZhciBpbWcgPSBuZXcgSW1hZ2U7CisKKyAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xv
YWQnLCBmdW5jdGlvbiBvbkltYWdlTG9hZChlKSB7CisgICAgICAgICAgICBpbWcucmVtb3ZlRXZl
bnRMaXN0ZW5lcignbG9hZCcsIG9uSW1hZ2VMb2FkKTsKKyAgICAgICAgICAgIHdhaXRGb3JMb2Fk
LnJlc29sdmUoaW1nKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaW1nLnNyYyA9IHRoaXMudGVz
dEltYWdlU3JjOworCisgICAgICAgIHdhaXRGb3JMb2FkLnRoZW4oZnVuY3Rpb24oaW1nKSB7Cisg
ICAgICAgICAgICB0aGlzLnRlc3RJbWFnZSA9IGltZzsKKyAgICAgICAgICAgIHRoaXMudGVzdElt
YWdlV2lkdGggPSBpbWcubmF0dXJhbFdpZHRoOworICAgICAgICAgICAgdGhpcy50ZXN0SW1hZ2VI
ZWlnaHQgPSBpbWcubmF0dXJhbEhlaWdodDsKKworICAgICAgICAgICAgdGhpcy5kaWZmdXNlWE9m
ZnNldCA9IDQsCisgICAgICAgICAgICB0aGlzLmRpZmZ1c2VZT2Zmc2V0ID0gdGhpcy50ZXN0SW1h
Z2VXaWR0aCAqIDQ7CisKKyAgICAgICAgICAgIGJlbmNobWFyay5yZWFkeVByb21pc2UucmVzb2x2
ZSgpOworICAgICAgICB9LmJpbmQodGhpcykpOworICAgIH0sCisKKyAgICB0dW5lOiBmdW5jdGlv
bihjb3VudCkKKyAgICB7CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgICAgIHRoaXMuX29mZnNl
dEluZGV4ID0gTWF0aC5tYXgodGhpcy5fb2Zmc2V0SW5kZXggKyBjb3VudCwgMCk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLl9vZmZzZXRJbmRleCA9IHRo
aXMuX29mZnNldEluZGV4ICsgY291bnQ7CisgICAgICAgIGlmICh0aGlzLl9vZmZzZXRJbmRleCA8
PSB0aGlzLnRlc3RFbGVtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgdmFyIG5ld0luZGV4ID0gdGhpcy5fb2Zmc2V0SW5kZXggLSB0aGlzLnRlc3RFbGVtZW50cy5s
ZW5ndGg7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3SW5kZXg7ICsraSkgeworICAg
ICAgICAgICAgdmFyIG9iaiA9IHRoaXMuX2NyZWF0ZVRlc3RFbGVtZW50KCk7CisgICAgICAgICAg
ICB0aGlzLnRlc3RFbGVtZW50cy5wdXNoKG9iaik7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQu
YXBwZW5kQ2hpbGQob2JqLmVsZW1lbnQpOworICAgICAgICB9CisgICAgfSwKKworICAgIF9jcmVh
dGVUZXN0RWxlbWVudDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CisgICAgICAgIGVsZW1lbnQud2lkdGggPSB0aGlz
LnRlc3RJbWFnZVdpZHRoOworICAgICAgICBlbGVtZW50LmhlaWdodCA9IHRoaXMudGVzdEltYWdl
SGVpZ2h0OworCisgICAgICAgIHZhciBjb250ZXh0ID0gZWxlbWVudC5nZXRDb250ZXh0KCcyZCcp
OworCisgICAgICAgIC8vIFB1dCBkcmF3IGltYWdlIGludG8gdGhlIGNhbnZhcworICAgICAgICBj
b250ZXh0LmRyYXdJbWFnZSh0aGlzLnRlc3RJbWFnZSwgMCwgMCwgdGhpcy50ZXN0SW1hZ2VXaWR0
aCwgdGhpcy50ZXN0SW1hZ2VIZWlnaHQpOworCisgICAgICAgIC8vIHJhbmRvbWl6ZSBsb2NhdGlv
bgorICAgICAgICB2YXIgbGVmdCA9IFN0YWdlLnJhbmRvbUludCgwLCB0aGlzLnNpemUud2lkdGgg
LSB0aGlzLnRlc3RJbWFnZVdpZHRoKTsKKyAgICAgICAgdmFyIHRvcCA9IFN0YWdlLnJhbmRvbUlu
dCgwLCB0aGlzLnNpemUuaGVpZ2h0IC0gdGhpcy50ZXN0SW1hZ2VIZWlnaHQpOworCisgICAgICAg
IGVsZW1lbnQuc3R5bGUudG9wID0gdG9wICsgJ3B4JzsKKyAgICAgICAgZWxlbWVudC5zdHlsZS5s
ZWZ0ID0gbGVmdCArICdweCc7CisgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnRl
c3RJbWFnZVdpZHRoICsgJ3B4JzsKKyAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlz
LnRlc3RJbWFnZUhlaWdodCArICdweCc7CisKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAg
IGVsZW1lbnQ6IGVsZW1lbnQsCisgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0CisgICAgICAg
IH07CisgICAgfSwKKworICAgIGFuaW1hdGU6IGZ1bmN0aW9uKHRpbWVEZWx0YSkgeworICAgICAg
ICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29mZnNldEluZGV4OyArK2kpIHsKKyAgICAgICAg
ICAgIHZhciBvYmogPSB0aGlzLnRlc3RFbGVtZW50c1tpXTsKKworICAgICAgICAgICAgLy8gR2V0
IGltYWdlIGRhdGEKKyAgICAgICAgICAgIHZhciBpbWFnZURhdGEgPSBvYmouY29udGV4dC5nZXRJ
bWFnZURhdGEoMCwgMCwgdGhpcy50ZXN0SW1hZ2VXaWR0aCwgdGhpcy50ZXN0SW1hZ2VIZWlnaHQp
OworCisgICAgICAgICAgICB2YXIgaiwKKyAgICAgICAgICAgICAgICBrLAorICAgICAgICAgICAg
ICAgIHJnYmFMZW4gPSA0LAorICAgICAgICAgICAgICAgIGRpZERyYXcgPSBmYWxzZSwKKyAgICAg
ICAgICAgICAgICBhbHBoYSA9IDAsCisgICAgICAgICAgICAgICAgbmVpZ2hib3JQaXhlbEluZGV4
LAorICAgICAgICAgICAgICAgIGRhdGFMZW4gPSBpbWFnZURhdGEuZGF0YS5sZW5ndGg7CisgICAg
ICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGF0YUxlbjsgaiArPSByZ2JhTGVuKSB7CisgICAgICAg
ICAgICAgICAgLy8gaWYgaXQgaXNuJ3QgdHJhc25wYXJlbnQsIGRpZmZ1c2UgdGhlIHBpeGVsCisg
ICAgICAgICAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhWyBqICsgMyBdID09PSAwKQorICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIGdldCByYW5kb20g
bmVpZ2hib3JpbmcgcGl4ZWwgY29sb3IKKyAgICAgICAgICAgICAgICBuZWlnaGJvclBpeGVsSW5k
ZXggPSB0aGlzLl9nZXRSYW5kb21OZWlnaGJvcmluZ1BpeGVsSWR4KGosIGRhdGFMZW4pOworCisg
ICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBSR0IgZGF0YQorICAgICAgICAgICAgICAgIGlt
YWdlRGF0YS5kYXRhWyBqIF0gPSBpbWFnZURhdGEuZGF0YVsgbmVpZ2hib3JQaXhlbEluZGV4IF07
CisgICAgICAgICAgICAgICAgaW1hZ2VEYXRhLmRhdGFbIGogKyAxIF0gPSBpbWFnZURhdGEuZGF0
YVsgbmVpZ2hib3JQaXhlbEluZGV4ICsgMSBdOworICAgICAgICAgICAgICAgIGltYWdlRGF0YS5k
YXRhWyBqICsgMiBdID0gaW1hZ2VEYXRhLmRhdGFbIG5laWdoYm9yUGl4ZWxJbmRleCArIDIgXTsK
KworICAgICAgICAgICAgICAgIGFscGhhID0gTWF0aC5tYXgoaW1hZ2VEYXRhLmRhdGFbIG5laWdo
Ym9yUGl4ZWxJbmRleCArIDMgXSAtIGolNywgMCk7CisKKyAgICAgICAgICAgICAgICBpbWFnZURh
dGEuZGF0YVsgaiArIDMgXSA9IGFscGhhOworICAgICAgICAgICAgICAgIGRpZERyYXcgPSB0cnVl
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQdXQgdGhlIGltYWdlIGRhdGEgYmFj
ayBpbnRvIHRoZSBjYW52YXMKKyAgICAgICAgICAgIG9iai5jb250ZXh0LnB1dEltYWdlRGF0YShp
bWFnZURhdGEsIDAsIDApOworCisgICAgICAgICAgICAgLy8gSWYgaXQgZGlkbid0IGRyYXcgcmVz
dGFydAorICAgICAgICAgICAgaWYgKCFkaWREcmF3KQorICAgICAgICAgICAgICAgIG9iai5jb250
ZXh0LmRyYXdJbWFnZSh0aGlzLnRlc3RJbWFnZSwgMCwgMCwgdGhpcy50ZXN0SW1hZ2VXaWR0aCwg
dGhpcy50ZXN0SW1hZ2VIZWlnaHQpCisgICAgICAgIH0KKyAgICB9LAorCisgICAgX2dldFJhbmRv
bU5laWdoYm9yaW5nUGl4ZWxJZHg6IGZ1bmN0aW9uKHBpeGVsSWR4LCBwaXhlbEFycmF5TGVuZ3Ro
KSB7CisgICAgICAgIHZhciB4T2Zmc2V0ID0gU3RhZ2UucmFuZG9tSW50KC0xLCAxKSwKKyAgICAg
ICAgICAgIHlPZmZzZXQgPSBTdGFnZS5yYW5kb21JbnQoLTEsIDEpLAorICAgICAgICAgICAgcmVz
dWx0UGl4ZWxJZHggPSBwaXhlbElkeDsKKworICAgICAgICAvLyBBZGQgWCB0byB0aGUgcmVzdWx0
CisgICAgICAgIHJlc3VsdFBpeGVsSWR4ICs9ICh0aGlzLmRpZmZ1c2VYT2Zmc2V0ICogeE9mZnNl
dCk7CisgICAgICAgIC8vIEFkZCBZIHRvIHRoZSByZXN1bHQKKyAgICAgICAgcmVzdWx0UGl4ZWxJ
ZHggKz0gKHRoaXMuZGlmZnVzZVlPZmZzZXQgKiB5T2Zmc2V0KTsKKworICAgICAgICAvLyBEb24n
dCBmYWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBpbWFnZQorICAgICAgICBpZiAocmVzdWx0UGl4ZWxJ
ZHggPiBwaXhlbEFycmF5TGVuZ3RoKQorICAgICAgICAgICAgcmVzdWx0UGl4ZWxJZHggPSBwaXhl
bElkeDsKKworICAgICAgICAvLyBEb24ndCBmYWxsIG9mZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBp
bWFnZQorICAgICAgICBpZiAocmVzdWx0UGl4ZWxJZHggPCAwKQorICAgICAgICAgICAgcmVzdWx0
UGl4ZWxJZHggPSAwOworCisgICAgICAgIHJldHVybiByZXN1bHRQaXhlbElkeDsKKyAgICB9LAor
CisgICAgY29tcGxleGl0eTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
X29mZnNldEluZGV4OworICAgIH0KK30pOworCit2YXIgSW1hZ2VEYXRhQmVuY2htYXJrID0gVXRp
bGl0aWVzLmNyZWF0ZVN1YmNsYXNzKEJlbmNobWFyaywKKyAgICBmdW5jdGlvbihvcHRpb25zKQor
ICAgIHsKKyAgICAgICAgQmVuY2htYXJrLmNhbGwodGhpcywgbmV3IEltYWdlRGF0YVN0YWdlKCks
IG9wdGlvbnMpOworICAgIH0sIHsKKworICAgIHdhaXRVbnRpbFJlYWR5OiBmdW5jdGlvbigpIHsK
KyAgICAgICAgdGhpcy5yZWFkeVByb21pc2UgPSBuZXcgU2ltcGxlUHJvbWlzZTsKKyAgICAgICAg
cmV0dXJuIHRoaXMucmVhZHlQcm9taXNlOworICAgIH0KK30pOworCit3aW5kb3cuYmVuY2htYXJr
Q2xhc3MgPSBJbWFnZURhdGFCZW5jaG1hcms7CisKK30oKSk7CmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL0FuaW1vbWV0ZXIvdGVzdHMvbWFzdGVyL3Jlc291cmNlcy9tdWx0aXBseS5qcyBi
L1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRlci90ZXN0cy9tYXN0ZXIvcmVzb3VyY2VzL211bHRp
cGx5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmM3MzRjZGIzOGM1MTFlMTU3ODg1ZDA0YzFmM2RiNmE5ZDQ1NjI2
NTYKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL0FuaW1vbWV0ZXIvdGVzdHMv
bWFzdGVyL3Jlc291cmNlcy9tdWx0aXBseS5qcwpAQCAtMCwwICsxLDEyOCBAQAorKGZ1bmN0aW9u
KCkgeworCit2YXIgTXVsdGlwbHlTdGFnZSA9IFV0aWxpdGllcy5jcmVhdGVTdWJjbGFzcyhTdGFn
ZSwKKyAgICBmdW5jdGlvbigpCisgICAgeworICAgICAgICBTdGFnZS5jYWxsKHRoaXMpOworICAg
ICAgICB0aGlzLnRpbGVzID0gW107CisgICAgICAgIHRoaXMuX29mZnNldEluZGV4ID0gMDsKKyAg
ICB9LCB7CisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbihiZW5jaG1hcmssIG9wdGlvbnMpCisg
ICAgeworICAgICAgICBTdGFnZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGJlbmNo
bWFyaywgb3B0aW9ucyk7CisgICAgICAgIHZhciB0aWxlU2l6ZSA9IE1hdGgucm91bmQodGhpcy5z
aXplLmhlaWdodCAvIDIwKTsKKworICAgICAgICAvLyBGaWxsIHRoZSBzY2VuZSB3aXRoIGVsZW1l
bnRzCisgICAgICAgIHZhciB4ID0gTWF0aC5yb3VuZCgodGhpcy5zaXplLndpZHRoIC0gdGlsZVNp
emUpIC8gMik7CisgICAgICAgIHZhciB5ID0gTWF0aC5yb3VuZCgodGhpcy5zaXplLmhlaWdodCAt
IHRpbGVTaXplKSAvIDIpOworICAgICAgICB2YXIgdGlsZVN0cmlkZSA9IHRpbGVTaXplOworICAg
ICAgICB2YXIgZGlyZWN0aW9uID0gMDsKKyAgICAgICAgdmFyIHNwaXJhbENvdW50ZXIgPSAyOwor
ICAgICAgICB2YXIgbmV4dEluZGV4ID0gMTsKKyAgICAgICAgdmFyIG1heFNpZGUgPSBNYXRoLmZs
b29yKHRoaXMuc2l6ZS5oZWlnaHQgLyB0aWxlU3RyaWRlKTsKKyAgICAgICAgdmFyIGNlbnRlclNw
aXJhbENvdW50ID0gbWF4U2lkZSAqIG1heFNpZGU7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgY2VudGVyU3BpcmFsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgdGhpcy5fYWRkVGlsZSh4
LCB5LCB0aWxlU2l6ZSwgaSAlIDM2MCk7CisKKyAgICAgICAgICAgIGlmIChpID09IG5leHRJbmRl
eCkgeworICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IChkaXJlY3Rpb24gKyAxKSAlIDQ7Cisg
ICAgICAgICAgICAgICAgc3BpcmFsQ291bnRlcisrOworICAgICAgICAgICAgICAgIG5leHRJbmRl
eCArPSBNYXRoLmZsb29yKHNwaXJhbENvdW50ZXIgLyAyKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGlmIChkaXJlY3Rpb24gPT0gMCkKKyAgICAgICAgICAgICAgICB4ICs9IHRpbGVTdHJp
ZGU7CisgICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gMSkKKyAgICAgICAgICAgICAg
ICB5IC09IHRpbGVTdHJpZGU7CisgICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gMikK
KyAgICAgICAgICAgICAgICB4IC09IHRpbGVTdHJpZGU7CisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgeSArPSB0aWxlU3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgY2VudGVy
U3BpcmFsQ291bnQgPSBtYXhTaWRlICogTWF0aC5yb3VuZChtYXhTaWRlIC8gMikgKiAyOworICAg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbnRlclNwaXJhbENvdW50OyArK2kpIHsKKyAgICAg
ICAgICAgIHZhciBzaWRlWCA9IHggKyBNYXRoLmZsb29yKE1hdGguZmxvb3IoaSAvIG1heFNpZGUp
IC8gMikgKiB0aWxlU3RyaWRlOworICAgICAgICAgICAgdmFyIHNpZGVZID0geSAtIHRpbGVTdHJp
ZGUgKiAoaSAlIG1heFNpZGUpOworCisgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihpIC8gbWF4
U2lkZSkgJSAyID09IDEpCisgICAgICAgICAgICAgICAgc2lkZVggPSB0aGlzLndpZHRoIC0gc2lk
ZVggLSB0aWxlU2l6ZSArIDE7CisgICAgICAgICAgICB0aGlzLl9hZGRUaWxlKHNpZGVYLCBzaWRl
WSwgdGlsZVNpemUsIGkgJSAzNjApOworICAgICAgICB9CisgICAgfSwKKworICAgIF9hZGRUaWxl
OiBmdW5jdGlvbih4LCB5LCB0aWxlU2l6ZSwgcm90YXRlRGVnKQorICAgIHsKKyAgICAgICAgdmFy
IHRpbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgdmFyIGhhbGZU
aWxlU2l6ZSA9IHRpbGVTaXplIC8gMjsKKyAgICAgICAgdGlsZS5jbGFzc05hbWUgPSAnZGl2LScg
KyBTdGFnZS5yYW5kb21JbnQoMCw2KTsKKyAgICAgICAgdGlsZS5zdHlsZS5sZWZ0ID0geCArICdw
eCc7CisgICAgICAgIHRpbGUuc3R5bGUudG9wID0geSArICdweCc7CisgICAgICAgIHRpbGUuc3R5
bGUud2lkdGggPSB0aWxlU2l6ZSArICdweCc7CisgICAgICAgIHRpbGUuc3R5bGUuaGVpZ2h0ID0g
dGlsZVNpemUgKyAncHgnOworCisgICAgICAgIHZhciBkaXN0YW5jZSA9IDEuNSAvIHRpbGVTaXpl
ICogTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuc2l6ZS5oZWlnaHQgLyAyIC0geSAtIGhhbGZUaWxl
U2l6ZSwgMikgKyBNYXRoLnBvdyh0aGlzLnNpemUud2lkdGggLyAyIC0geCAtIGhhbGZUaWxlU2l6
ZSwgMikpOworCisgICAgICAgIHRoaXMudGlsZXMucHVzaCh7CisgICAgICAgICAgICBlbGVtZW50
OiB0aWxlLAorICAgICAgICAgICAgcm90YXRlOiByb3RhdGVEZWcsCisgICAgICAgICAgICBzdGVw
OiBNYXRoLm1heCgxLCBkaXN0YW5jZSAvIDQpLAorICAgICAgICAgICAgZGlzdGFuY2U6IGRpc3Rh
bmNlLAorICAgICAgICAgICAgYWN0aXZlOiBmYWxzZQorICAgICAgICB9KTsKKyAgICAgICAgdGhp
cy5lbGVtZW50LmFwcGVuZENoaWxkKHRpbGUpOworICAgIH0sCisKKyAgICBjb21wbGV4aXR5OiBm
dW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb2Zmc2V0SW5kZXg7CisgICAg
fSwKKworICAgIHR1bmU6IGZ1bmN0aW9uKGNvdW50KQorICAgIHsKKyAgICAgICAgdGhpcy5fb2Zm
c2V0SW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLl9vZmZzZXRJbmRleCArIGNvdW50
LCB0aGlzLnRpbGVzLmxlbmd0aCkpOworICAgIH0sCisKKyAgICBhbmltYXRlOiBmdW5jdGlvbigp
CisgICAgeworICAgICAgICB2YXIgdGltZSA9IERhdGUubm93KCk7CisgICAgICAgIHZhciBkaXN0
YW5jZUZhY3RvciA9IDEgLyBNYXRoLnNxcnQodGhpcy5fb2Zmc2V0SW5kZXgpOworCisgICAgICAg
IHZhciBwcm9ncmVzcyA9IHRoaXMuX2JlbmNobWFyay50aW1lc3RhbXAgJSAxMDAwMCAvIDEwMDAw
OworICAgICAgICB2YXIgYm91bmNlUHJvZ3Jlc3MgPSBNYXRoLnNpbigyICogTWF0aC5hYnMoIDAu
NSAtIHByb2dyZXNzKSk7CisgICAgICAgIHZhciBsID0gdGhpcy5fbGVycChib3VuY2VQcm9ncmVz
cywgMjAsIDUwKTsKKyAgICAgICAgdmFyIGhzbFByZWZpeCA9ICJoc2xhKCIgKyB0aGlzLl9sZXJw
KHByb2dyZXNzLCAwLCAzNjApICsgIiwxMDAlLCI7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCB0aGlzLnRpbGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICB2YXIgdGlsZSA9IHRo
aXMudGlsZXNbaV07CisgICAgICAgICAgICBpZiAoaSA8IHRoaXMuX29mZnNldEluZGV4KSB7Cisg
ICAgICAgICAgICAgICAgdGlsZS5hY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHRpbGUu
cm90YXRlICs9IHRpbGUuc3RlcDsKKyAgICAgICAgICAgICAgICB0aWxlLmVsZW1lbnQuc3R5bGUu
dHJhbnNmb3JtID0gInJvdGF0ZSgiICsgdGlsZS5yb3RhdGUgKyAiZGVnKSI7CisKKyAgICAgICAg
ICAgICAgICB2YXIgaW5mbHVlbmNlID0gMSAtICh0aWxlLmRpc3RhbmNlICogZGlzdGFuY2VGYWN0
b3IpOworICAgICAgICAgICAgICAgIHRpbGUuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3Ig
PSBoc2xQcmVmaXggKyBsICogTWF0aC50YW4oaW5mbHVlbmNlIC8gMS4yNSkgKyAiJSwiICsgaW5m
bHVlbmNlICsgIikiOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxlLmFjdGl2ZSkgeworICAg
ICAgICAgICAgICAgIHRpbGUuYWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdGlsZS5l
bGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIiOworICAgICAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgX2xlcnA6IGZ1
bmN0aW9uKHZhbHVlLCBtaW4sIG1heCkKKyAgICB7CisgICAgICAgIHJldHVybiBtaW4gKyAoIG1h
eCAtIG1pbiApICogdmFsdWU7CisgICAgfQorfSk7CisKK3ZhciBNdWx0aXBseUJlbmNobWFyayA9
IFV0aWxpdGllcy5jcmVhdGVTdWJjbGFzcyhCZW5jaG1hcmssCisgICAgZnVuY3Rpb24ob3B0aW9u
cykKKyAgICB7CisgICAgICAgIEJlbmNobWFyay5jYWxsKHRoaXMsIG5ldyBNdWx0aXBseVN0YWdl
KCksIG9wdGlvbnMpOworICAgIH0KKyk7CisKK3dpbmRvdy5iZW5jaG1hcmtDbGFzcyA9IE11bHRp
cGx5QmVuY2htYXJrOworCit9KCkpOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9Bbmlt
b21ldGVyL3Rlc3RzL21hc3Rlci9yZXNvdXJjZXMvc3RhZ2UuY3NzIGIvUGVyZm9ybWFuY2VUZXN0
cy9Bbmltb21ldGVyL3Rlc3RzL21hc3Rlci9yZXNvdXJjZXMvc3RhZ2UuY3NzCmluZGV4IGNiNWY4
MWNmMWVlODg1ZGM4NDUxYmM4YTM0YzFiNDVlZDc5YTdhY2EuLjdkZjA2ZTlkZjU1NGFmMzQxMTdl
ZGY2YWM2ZGIxZjZmMTY0NDEzNjQgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9t
ZXRlci90ZXN0cy9tYXN0ZXIvcmVzb3VyY2VzL3N0YWdlLmNzcworKysgYi9QZXJmb3JtYW5jZVRl
c3RzL0FuaW1vbWV0ZXIvdGVzdHMvbWFzdGVyL3Jlc291cmNlcy9zdGFnZS5jc3MKQEAgLTgsMTAg
KzgsMjMgQEAgYm9keSB7CiAgICAgbWFyZ2luOiAwOwogICAgIHBhZGRpbmc6IDA7CiAgICAgYmFj
a2dyb3VuZC1jb2xvcjogcmdiKDI0MSwgMjQxLCAyNDEpOworICAgIGZvbnQtZmFtaWx5OiAtYXBw
bGUtc3lzdGVtLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIFZlcmRhbmEsIHNhbnMtc2Vy
aWY7CiB9CiAKICNzdGFnZSB7Ci0gIHdpZHRoOiAxMDAlOwotICBoZWlnaHQ6IDEwMCU7Ci0gIGJh
Y2tncm91bmQtY29sb3I6IHJnYigyNDEsIDI0MSwgMjQxKTsKKyAgICBwb3NpdGlvbjogcmVsYXRp
dmU7CisgICAgd2lkdGg6IDEwMCU7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIGJhY2tncm91bmQt
Y29sb3I6IHJnYigyNDEsIDI0MSwgMjQxKTsKIH0KKworI2NlbnRlci10ZXh0IHsKKyAgICBwb3Np
dGlvbjogYWJzb2x1dGU7CisgICAgei1pbmRleDogMzsKKyAgICB0b3A6IDUwJTsKKyAgICBsZWZ0
OiA1MCU7CisgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7
CisgICAgY29sb3I6ICNGRkY7CisgICAgZm9udC1zaXplOiAyZW07CisgICAgZm9udC13ZWlnaHQ6
IDIwMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL0FuaW1vbWV0ZXIvdGVzdHMvcmVzb3VyY2VzL21haW4uanMgYi9QZXJmb3JtYW5j
ZVRlc3RzL0FuaW1vbWV0ZXIvdGVzdHMvcmVzb3VyY2VzL21haW4uanMKaW5kZXggODU0MWNjNjg4
NWYxMTA4NTZiMzc5MzIwN2I2OTg1YzFjNDE0YTMwMS4uZjJkMDkxZTU3ZmRiMDAwOGJkNDA0MDI5
NjRkMGM3ODcyMzhhNGQxNiAxMDA2NDQKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9Bbmltb21ldGVy
L3Rlc3RzL3Jlc291cmNlcy9tYWluLmpzCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvQW5pbW9tZXRl
ci90ZXN0cy9yZXNvdXJjZXMvbWFpbi5qcwpAQCAtNzM0LDcgKzczNCwxMiBAQCBVdGlsaXRpZXMu
ZXh0ZW5kT2JqZWN0KFN0YWdlLCB7CiAKICAgICByYW5kb21Cb29sOiBmdW5jdGlvbigpCiAgICAg
ewotICAgICAgICByZXR1cm4gISFNYXRoLnJvdW5kKHRoaXMucmFuZG9tKDAsIDEpKTsKKyAgICAg
ICAgcmV0dXJuICEhTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKTsKKyAgICB9LAorCisgICAgcmFu
ZG9tU2lnbjogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkg
Pj0gLjUgPyAxIDogLTE7CiAgICAgfSwKIAogICAgIHJhbmRvbUludDogZnVuY3Rpb24obWluLCBt
YXgpCkBAIC04NzEsNiArODc2LDE3IEBAIEJlbmNobWFyayA9IFV0aWxpdGllcy5jcmVhdGVDbGFz
cygKICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWdlOwogICAgIH0sCiAKKyAgICBnZXQgdGltZXN0
YW1wKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VGltZXN0YW1wIC0gdGhp
cy5fc3RhcnRUaW1lc3RhbXA7CisgICAgfSwKKworICAgIGJhY2tncm91bmRDb2xvcjogZnVuY3Rp
b24oKQorICAgIHsKKyAgICAgICAgdmFyIHN0YWdlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUo
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YWdlIikpOworICAgICAgICByZXR1cm4gc3RhZ2Vb
ImJhY2tncm91bmQtY29sb3IiXTsKKyAgICB9LAorCiAgICAgcnVuOiBmdW5jdGlvbigpCiAgICAg
ewogICAgICAgICByZXR1cm4gdGhpcy53YWl0VW50aWxSZWFkeSgpLnRoZW4oZnVuY3Rpb24oKSB7
CkBAIC05MDMsNiArOTE5LDcgQEAgQmVuY2htYXJrID0gVXRpbGl0aWVzLmNyZWF0ZUNsYXNzKAog
ICAgICAgICBpZiAoIXRoaXMuX2RpZFdhcm1VcCkgewogICAgICAgICAgICAgaWYgKHRoaXMuX2N1
cnJlbnRUaW1lc3RhbXAgLSB0aGlzLl9wcmV2aW91c1RpbWVzdGFtcCA+PSAxMDApIHsKICAgICAg
ICAgICAgICAgICB0aGlzLl9kaWRXYXJtVXAgPSB0cnVlOworICAgICAgICAgICAgICAgIHRoaXMu
X3N0YXJ0VGltZXN0YW1wID0gdGhpcy5fY3VycmVudFRpbWVzdGFtcDsKICAgICAgICAgICAgICAg
ICB0aGlzLl9jb250cm9sbGVyLnN0YXJ0KHRoaXMuX2N1cnJlbnRUaW1lc3RhbXAsIHRoaXMuX3N0
YWdlKTsKICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1RpbWVzdGFtcCA9IHRoaXMuX2N1
cnJlbnRUaW1lc3RhbXA7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRl
c3RzL0NoYW5nZUxvZyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCmluZGV4IDcwN2I4NTA0
MjBjOTczNmM4MDdjZWQ5NmE5OTQ4YjA3Zjc0YjFhNjAuLjJiYWJmZTIzY2E2MDBmNjU4YjBlOGU4
YjFkOTFmZTgxMmU0YTA0YjUgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9n
CisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjkgQEAKKzIwMTYt
MDItMTAgIEpvbiBMZWUgIDxqb25sZWVAYXBwbGUuY29tPgorCisgICAgICAgIEFkZCBuZXcgYmVu
Y2htYXJrIHRlc3RzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTU0MDYzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQWRkIGEgdGVzdCBmb3IgZ2V0L3B1dCBpbWFnZSBkYXRhLCBmaWx0ZXJzLCBvcGFjaXR5
LCBhbmQgY3NzIHRyYW5zZm9ybXMuCisKKyAgICAgICAgKiBBbmltb21ldGVyL3Jlc291cmNlcy9y
dW5uZXIvYmVuY2htYXJrLXJ1bm5lci5qczoKKyAgICAgICAgKF9ydW5CZW5jaG1hcmtBbmRSZWNv
cmRSZXN1bHRzKTogVXBkYXRlIHRoZSBib2R5IGJhY2tncm91bmQgY29sb3IgdG8gbWF0Y2ggdGhh
dCBvZgorICAgICAgICB0aGUgc3RhZ2UuCisgICAgICAgICh0aGlzLl9ydW5OZXh0SXRlcmF0aW9u
KTogQ2xlYXIgdGhlIGJhY2tncm91bmQgY29sb3Igc3R5bGUgZm9yIHRoZSByZXN1bHRzIHBhZ2Uu
CisgICAgICAgICogQW5pbW9tZXRlci9yZXNvdXJjZXMvcnVubmVyL3Rlc3RzLmpzOgorICAgICAg
ICAqIEFuaW1vbWV0ZXIvdGVzdHMvbWFzdGVyL2ZvY3VzLmh0bWw6IEFkZGVkLgorICAgICAgICAq
IEFuaW1vbWV0ZXIvdGVzdHMvbWFzdGVyL2ltYWdlLWRhdGEuaHRtbDogQWRkZWQuCisgICAgICAg
ICogQW5pbW9tZXRlci90ZXN0cy9tYXN0ZXIvbXVsdGlwbHkuaHRtbDogQWRkZWQuCisgICAgICAg
ICogQW5pbW9tZXRlci90ZXN0cy9tYXN0ZXIvcmVzb3VyY2VzL2ZvY3VzLmpzOiBBZGRlZC4KKyAg
ICAgICAgKiBBbmltb21ldGVyL3Rlc3RzL21hc3Rlci9yZXNvdXJjZXMvaW1hZ2UtZGF0YS5qczog
QWRkZWQuCisgICAgICAgICogQW5pbW9tZXRlci90ZXN0cy9tYXN0ZXIvcmVzb3VyY2VzL211bHRp
cGx5LmpzOiBBZGRlZC4KKyAgICAgICAgKiBBbmltb21ldGVyL3Rlc3RzL21hc3Rlci9yZXNvdXJj
ZXMvc3RhZ2UuY3NzOiBNb3ZlIGNvbW1vbiBzdHlsZXMgb3V0LgorICAgICAgICAqIEFuaW1vbWV0
ZXIvdGVzdHMvcmVzb3VyY2VzL21haW4uanM6IFVwZGF0ZSBTdGFnZS5yYW5kb21Cb29sIHRvIHVz
ZSBNYXRoLnJhbmRvbS4KKyAgICAgICAgQWRkIFN0YWdlLnJhbmRvbVNpZ24gZm9yIHJhbmRvbWx5
IHNldHRpbmcgYSBkaXJlY3Rpb24uIEFkZCB0aGUgbm90aW9uIG9mIHRoZQorICAgICAgICBjdXJy
ZW50IHRpbWVzdGFtcCBvZiB0aGUgdGVzdCB0byBCZW5jaG1hcmssIHNpbmNlIHNvbWUgYW5pbWF0
aW9ucyBjeWNsZSB0aHJvdWdoCisgICAgICAgIGNvbG9ycyBhbmQgcmVseSBvbiBhbiBpbmNyZW1l
bnRhbCBjb3VudGVyIGxpa2UgdGhlIHRpbWUuCisKIDIwMTYtMDItMDggIEpvbiBMZWUgIDxqb25s
ZWVAYXBwbGUuY29tPgogCiAgICAgICAgIEFkZCBhIHJhbXAgY29udHJvbGxlcgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>