<?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>138454</bug_id>
          
          <creation_ts>2014-11-05 22:33:22 -0800</creation_ts>
          <short_desc>Web Inspector: Provide a front end for JSC&apos;s Control Flow Profiler</short_desc>
          <delta_ts>2015-01-19 21:17:27 -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>Web Inspector</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>140377</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>ekamenskaya</cc>
    
    <cc>graouts</cc>
    
    <cc>joepeck</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1046723</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2014-11-05 22:33:22 -0800</bug_when>
    <thetext>JSC is developing a control flow profiler that will profile which basic blocks have executed.
This patch should provide an API for the Web Inspector to use and also create a UI around this API.
The API will work by sending a list of the following 3-tuples:
(&lt;int&gt; basic block start offset, &lt;int&gt; basic block end offset, &lt;bool&gt; has executed).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1046724</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2014-11-05 22:33:35 -0800</bug_when>
    <thetext>&lt;rdar://problem/18891513&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1047155</commentid>
    <comment_count>2</comment_count>
      <attachid>241201</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2014-11-07 13:00:38 -0800</bug_when>
    <thetext>Created attachment 241201
work in progress

This is a simple front end to JSC&apos;s backend basic block ranges. It simply grabs the ranges JSC gives it and displays the background as either gray or white.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053076</commentid>
    <comment_count>3</comment_count>
      <attachid>242728</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2014-12-06 16:57:10 -0800</bug_when>
    <thetext>Created attachment 242728
work in progress

I&apos;m thinking of breaking this up into two patches, one that creates the parent class JavaScriptAnnotator and JavaScriptAnnotatorManager, and another that does this UI work for basic block highlighting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053077</commentid>
    <comment_count>4</comment_count>
      <attachid>242729</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2014-12-06 17:20:48 -0800</bug_when>
    <thetext>Created attachment 242729
work in progress

Mostly the same patch as above, but handle enabling/disabling the TypeTokenAnnotator/BasicBlockAnnotator differently.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1055903</commentid>
    <comment_count>5</comment_count>
    <who name="Brian Burg">burg</who>
    <bug_when>2014-12-16 00:29:28 -0800</bug_when>
    <thetext>*** Bug 42739 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1056359</commentid>
    <comment_count>6</comment_count>
      <attachid>242729</attachid>
    <who name="Brian Burg">burg</who>
    <bug_when>2014-12-17 10:06:12 -0800</bug_when>
    <thetext>Comment on attachment 242729
work in progress

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

Looking good so far. You might want to split the AnnotatorManager refactor into its own bug if it&apos;s not too big a problem. ChangeLog entries will help a lot with understanding some of the API changes.

&gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:88
&gt; +        // FIXME: Eventually, the back end data shouldn&apos;t give us these bad ranges.

Bugzilla number?

&gt; Source/WebInspectorUI/UserInterface/Views/TextEditor.js:611
&gt; +        console.log(&quot;gained focus&quot;);

Oops</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1056377</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2014-12-17 10:59:22 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; Comment on attachment 242729 [details]
&gt; work in progress
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=242729&amp;action=review
&gt; 
&gt; Looking good so far. You might want to split the AnnotatorManager refactor
&gt; into its own bug if it&apos;s not too big a problem. ChangeLog entries will help
&gt; a lot with understanding some of the API changes.

Agreed. I&apos;ve split out *Annotator and AnnotatorManager into this bug:
https://bugs.webkit.org/show_bug.cgi?id=139426

Do you think I should have AnnotatorManager in its own patch?

&gt; 
&gt; &gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:88
&gt; &gt; +        // FIXME: Eventually, the back end data shouldn&apos;t give us these bad ranges.
&gt; 
&gt; Bugzilla number?

I should remove this, it&apos;s no longer the case that this may happen.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1060689</commentid>
    <comment_count>8</comment_count>
      <attachid>244469</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-01-12 15:16:47 -0800</bug_when>
    <thetext>Created attachment 244469
work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061713</commentid>
    <comment_count>9</comment_count>
      <attachid>244732</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-01-15 17:07:44 -0800</bug_when>
    <thetext>Created attachment 244732
work in progress

This patch is pretty close to final. I think the only thing left
is to pause basic block highlighted when an error is encountered.

Any feedback is greatly appreciated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061745</commentid>
    <comment_count>10</comment_count>
      <attachid>244732</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2015-01-15 19:06:47 -0800</bug_when>
    <thetext>Comment on attachment 244732
work in progress

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

&gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:117
&gt; +            var startLineEndPosition = { line: startPosition.line, ch: this.sourceCodeTextEditor.line(startPosition.line).length };

I think if you leave ch off it will be end of line.

&gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:156
&gt; +    _canGrayOutEntireLine: function(lineNumber, startPosition, endPosition)

This should assert startPosition.line === endPosition.line.

&gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:163
&gt; +        lineText = lineText.replace(/\s/g, &quot;&quot;);
&gt; +        blockText = blockText.replace(/\s/g, &quot;&quot;);
&gt; +        if (lineText === blockText)
&gt; +            return true;

Ideally this shouldn&apos;t use replace, as that would be heavy if this gets called a lot. I there another approach that uses _isTextRangeOnlyWhitespace?

&gt; Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js:271
&gt; +        var basicBlockAnnotator = this._annotatorManager.getAnnotator(WebInspector.SourceCodeTextEditor.BasicBlockAnnotatorKey);

Not new to this patch: I don&apos;t see the point of having AnnotatorManager. It seems like we could/should just have annotators, and use them directly. Requiring a key/map to look up annotators seems heavy when we could just access them as properties on SourceCodeTextEditor directly.

&gt; Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js:287
&gt;          var typeTokenAnnotator = this._annotatorManager.getAnnotator(WebInspector.SourceCodeTextEditor.TypeTokenAnnotatorKey);
&gt; +        var basicBlockAnnotator = this._annotatorManager.getAnnotator(WebInspector.SourceCodeTextEditor.BasicBlockAnnotatorKey);

Like this should just be this._typeTokenAnnotator and this._basicBlockAnnotator. Unless there is a deeper reason I don&apos;t see.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061836</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-01-16 10:21:22 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; Comment on attachment 244732 [details]
&gt; work in progress
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=244732&amp;action=review
&gt; 
&gt; &gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:117
&gt; &gt; +            var startLineEndPosition = { line: startPosition.line, ch: this.sourceCodeTextEditor.line(startPosition.line).length };
&gt; 
&gt; I think if you leave ch off it will be end of line.
&gt; 
I personally like that it is explicitly written out. I suppose the name of the variable would indicate this if ch is left off, but I can foresee myself reading the LOC with ch left off in the future and forgetting this.

&gt; &gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:156
&gt; &gt; +    _canGrayOutEntireLine: function(lineNumber, startPosition, endPosition)
&gt; 
&gt; This should assert startPosition.line === endPosition.line.
&gt; 
&gt; &gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:163
&gt; &gt; +        lineText = lineText.replace(/\s/g, &quot;&quot;);
&gt; &gt; +        blockText = blockText.replace(/\s/g, &quot;&quot;);
&gt; &gt; +        if (lineText === blockText)
&gt; &gt; +            return true;
&gt; 
&gt; Ideally this shouldn&apos;t use replace, as that would be heavy if this gets
&gt; called a lot. I there another approach that uses _isTextRangeOnlyWhitespace?
&gt; 

Yeah, I think this can be done just by:
return lineText.trim() === blockText.trim()

&gt; &gt; Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js:271
&gt; &gt; +        var basicBlockAnnotator = this._annotatorManager.getAnnotator(WebInspector.SourceCodeTextEditor.BasicBlockAnnotatorKey);
&gt; 
&gt; Not new to this patch: I don&apos;t see the point of having AnnotatorManager. It
&gt; seems like we could/should just have annotators, and use them directly.
&gt; Requiring a key/map to look up annotators seems heavy when we could just
&gt; access them as properties on SourceCodeTextEditor directly.
&gt; 

After writing this patch, I tend to agree. I think it would be nicer just having these as properties on SourceCodeTextEditor. I originally thought that there would be more places where I could just group operations under the Manager, but there are enough exceptions here that it&apos;s a bit circuitous to use the Manager. The goal of the Manager was to create an easy way for other *Annotator classes to be created and easily integrated in SourceCodeTextEditor, but I think that it&apos;s currently not worth it. I&apos;m going to remove the Manager.

&gt; &gt; Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js:287
&gt; &gt;          var typeTokenAnnotator = this._annotatorManager.getAnnotator(WebInspector.SourceCodeTextEditor.TypeTokenAnnotatorKey);
&gt; &gt; +        var basicBlockAnnotator = this._annotatorManager.getAnnotator(WebInspector.SourceCodeTextEditor.BasicBlockAnnotatorKey);
&gt; 
&gt; Like this should just be this._typeTokenAnnotator and
&gt; this._basicBlockAnnotator. Unless there is a deeper reason I don&apos;t see.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061856</commentid>
    <comment_count>12</comment_count>
      <attachid>244732</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2015-01-16 11:21:30 -0800</bug_when>
    <thetext>Comment on attachment 244732
work in progress

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

&gt;&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:156
&gt;&gt;&gt; +    _canGrayOutEntireLine: function(lineNumber, startPosition, endPosition)
&gt;&gt; 
&gt;&gt; This should assert startPosition.line === endPosition.line.
&gt; 
&gt; Yeah, I think this can be done just by:
&gt; return lineText.trim() === blockText.trim()

Using trim() s just as expensive as replace().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061926</commentid>
    <comment_count>13</comment_count>
      <attachid>244794</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-01-16 13:03:04 -0800</bug_when>
    <thetext>Created attachment 244794
patch

Took into account Tim&apos;s recommendations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061944</commentid>
    <comment_count>14</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-01-16 13:29:14 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; Comment on attachment 244732 [details]
&gt; work in progress
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=244732&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/BasicBlockAnnotator.js:156
&gt; &gt;&gt;&gt; +    _canGrayOutEntireLine: function(lineNumber, startPosition, endPosition)
&gt; &gt;&gt; 
&gt; &gt;&gt; This should assert startPosition.line === endPosition.line.
&gt; &gt; 
&gt; &gt; Yeah, I think this can be done just by:
&gt; &gt; return lineText.trim() === blockText.trim()
&gt; 
&gt; Using trim() s just as expensive as replace().

As Tim and I discussed on IRC, we can do this and still be performant because the BasicBlockAnnotator will only view basic blocks that are visible on screen, so the number of strings created/compared is proportional to the number of basic blocks on screen and not proportional to the number of basic blocks in the program.

The bigger problem is when the strings are very long. See:
https://bugs.webkit.org/show_bug.cgi?id=140550</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061969</commentid>
    <comment_count>15</comment_count>
      <attachid>244794</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2015-01-16 14:22:24 -0800</bug_when>
    <thetext>Comment on attachment 244794
patch

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

&gt; Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js:356
&gt; +        var shouldResumeTypeTokenAnnotator = this._typeTokenAnnotator &amp;&amp; this._typeTokenAnnotator.isActive;

Nit: Not new, but we typically treat things like isActive as a function, not a getter. My rule: if it sounds like a question, it is a function.

&gt; Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js:1625
&gt; -        var typeTokenAnnotator = new WebInspector.TypeTokenAnnotator(this, script);
&gt; -        this._annotatorManager.addAnnotator(WebInspector.SourceCodeTextEditor.TypeTokenAnnotatorKey, typeTokenAnnotator);
&gt; +        this._typeTokenAnnotator = new WebInspector.TypeTokenAnnotator(this, script);

I like this much better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1062090</commentid>
    <comment_count>16</comment_count>
      <attachid>244838</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-01-16 23:35:04 -0800</bug_when>
    <thetext>Created attachment 244838
patch

This is the same patch as before, but I&apos;ve included a change
that grays out the white padding on the left side of the TextEditor
when a text range is marked but not the entire line is marked.
(This usually occurs on the last line of a basic block).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1062642</commentid>
    <comment_count>17</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-01-19 21:17:27 -0800</bug_when>
    <thetext>landed in:
http://trac.webkit.org/changeset/178695</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>241201</attachid>
            <date>2014-11-07 13:00:38 -0800</date>
            <delta_ts>2014-12-06 16:57:10 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>8066</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3IvYWdlbnRzL0luc3BlY3RvclJ1
bnRpbWVBZ2VudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3Bl
Y3Rvci9hZ2VudHMvSW5zcGVjdG9yUnVudGltZUFnZW50LmNwcAkocmV2aXNpb24gMTc1NjkxKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3BlY3Rvci9hZ2VudHMvSW5zcGVjdG9yUnVudGlt
ZUFnZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjI2LDcgKzIyNiw3IEBAIHZvaWQgSW5zcGVj
dG9yUnVudGltZUFnZW50OjpnZXRSdW50aW1lVHkKICAgICAgICAgbG9jYXRpb24tPmdldEludGVn
ZXIoQVNDSUlMaXRlcmFsKCJkaXZvdCIpLCBkaXZvdCk7CiAKICAgICAgICAgYm9vbCBva2F5Owot
ICAgICAgICBUeXBlTG9jYXRpb24qIHR5cGVMb2NhdGlvbiA9IHZtLnR5cGVQcm9maWxlcigpLT5m
aW5kTG9jYXRpb24oZGl2b3QsIHNvdXJjZUlEQXNTdHJpbmcudG9JbnRQdHJTdHJpY3QoJm9rYXkp
LCBzdGF0aWNfY2FzdDxUeXBlUHJvZmlsZXJTZWFyY2hEZXNjcmlwdG9yPihkZXNjcmlwdG9yKSk7
CisgICAgICAgIFR5cGVMb2NhdGlvbiogdHlwZUxvY2F0aW9uID0gdm0udHlwZVByb2ZpbGVyKCkt
PmZpbmRMb2NhdGlvbihkaXZvdCwgc291cmNlSURBc1N0cmluZy50b0ludFB0clN0cmljdCgmb2th
eSksIHN0YXRpY19jYXN0PFR5cGVQcm9maWxlclNlYXJjaERlc2NyaXB0b3I+KGRlc2NyaXB0b3Ip
LCB2bSk7CiAKICAgICAgICAgUmVmUHRyPFR5cGVTZXQ+IHR5cGVTZXQ7CiAgICAgICAgIGlmICh0
eXBlTG9jYXRpb24pIHsKQEAgLTMxNyw2ICszMTcsMjIgQEAgdm9pZCBJbnNwZWN0b3JSdW50aW1l
QWdlbnQ6OnNldFR5cGVQcm9maQogICAgICAgICByZWNvbXBpbGVBbGxKU0Z1bmN0aW9uc0ZvclR5
cGVQcm9maWxpbmcodm0sIHNob3VsZEVuYWJsZVR5cGVQcm9maWxpbmcpOwogfQogCit2b2lkIElu
c3BlY3RvclJ1bnRpbWVBZ2VudDo6Z2V0QmFzaWNCbG9ja0xvY2F0aW9ucyhFcnJvclN0cmluZyYs
IGNvbnN0IFN0cmluZyYgaW5fc291cmNlSUQsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpB
cnJheTxJbnNwZWN0b3I6OlByb3RvY29sOjpSdW50aW1lOjpCYXNpY0Jsb2NrTG9jYXRpb24+PiYg
YmFzaWNCbG9ja0xvY2F0aW9ucykKK3sKKyAgICBWTSYgdm0gPSBnbG9iYWxWTSgpOworICAgIGJv
b2wgb2theTsKKyAgICBpbnRwdHJfdCBzb3VyY2VJRCA9IGluX3NvdXJjZUlELnRvSW50UHRyU3Ry
aWN0KCZva2F5KTsKKyAgICBWZWN0b3I8QmFzaWNCbG9ja1JhbmdlPiBiYXNpY0Jsb2NrcyA9IHZt
LmJhc2ljQmxvY2tMb2NhdGlvbkNhY2hlKCktPmdldEJhc2ljQmxvY2tzRm9yU291cmNlSUQoc291
cmNlSUQsIHZtKTsKKyAgICBiYXNpY0Jsb2NrTG9jYXRpb25zID0gSW5zcGVjdG9yOjpQcm90b2Nv
bDo6QXJyYXk8SW5zcGVjdG9yOjpQcm90b2NvbDo6UnVudGltZTo6QmFzaWNCbG9ja0xvY2F0aW9u
Pjo6Y3JlYXRlKCk7CisgICAgZm9yIChCYXNpY0Jsb2NrUmFuZ2UmIGJsb2NrIDogYmFzaWNCbG9j
a3MpIHsKKyAgICAgICAgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OlJ1bnRpbWU6OkJhc2lj
QmxvY2tMb2NhdGlvbj4gbG9jYXRpb24gPSBJbnNwZWN0b3I6OlByb3RvY29sOjpSdW50aW1lOjpC
YXNpY0Jsb2NrTG9jYXRpb246OmNyZWF0ZSgpCisgICAgICAgICAgICAuc2V0U3RhcnRPZmZzZXQo
YmxvY2subV9zdGFydE9mZnNldCkKKyAgICAgICAgICAgIC5zZXRFbmRPZmZzZXQoYmxvY2subV9l
bmRPZmZzZXQpCisgICAgICAgICAgICAuc2V0SGFzRXhlY3V0ZWQoYmxvY2subV9oYXNFeGVjdXRl
ZCk7CisgICAgICAgIGJhc2ljQmxvY2tMb2NhdGlvbnMtPmFkZEl0ZW0obG9jYXRpb24pOworICAg
IH0KK30KKwogfSAvLyBuYW1lc3BhY2UgSW5zcGVjdG9yCiAKICNlbmRpZiAvLyBFTkFCTEUoSU5T
UEVDVE9SKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3BlY3Rvci9hZ2VudHMvSW5z
cGVjdG9yUnVudGltZUFnZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2luc3BlY3Rvci9hZ2VudHMvSW5zcGVjdG9yUnVudGltZUFnZW50LmgJKHJldmlzaW9uIDE3NTY5
MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3IvYWdlbnRzL0luc3BlY3RvclJ1
bnRpbWVBZ2VudC5oCSh3b3JraW5nIGNvcHkpCkBAIC03MSw2ICs3MSw4IEBAIHB1YmxpYzoKICAg
ICB2aXJ0dWFsIHZvaWQgZ2V0UnVudGltZVR5cGVzRm9yVmFyaWFibGVzQXRPZmZzZXRzKEVycm9y
U3RyaW5nJiwgY29uc3QgUmVmUHRyPEluc3BlY3Rvcjo6SW5zcGVjdG9yQXJyYXk+JiBsb2NhdGlv
bnMsIFJlZlB0cjxJbnNwZWN0b3I6OlByb3RvY29sOjpBcnJheTxJbnNwZWN0b3I6OlByb3RvY29s
OjpSdW50aW1lOjpUeXBlRGVzY3JpcHRpb24+PiYpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9p
ZCBlbmFibGVUeXBlUHJvZmlsZXIoRXJyb3JTdHJpbmcmKSBvdmVycmlkZTsKICAgICB2aXJ0dWFs
IHZvaWQgZGlzYWJsZVR5cGVQcm9maWxlcihFcnJvclN0cmluZyYpIG92ZXJyaWRlOworICAgIHZp
cnR1YWwgdm9pZCBnZXRCYXNpY0Jsb2NrTG9jYXRpb25zKEVycm9yU3RyaW5nJiwgY29uc3QgU3Ry
aW5nJiBpbl9zb3VyY2VJRCwgUmVmUHRyPEluc3BlY3Rvcjo6UHJvdG9jb2w6OkFycmF5PEluc3Bl
Y3Rvcjo6UHJvdG9jb2w6OlJ1bnRpbWU6OkJhc2ljQmxvY2tMb2NhdGlvbj4+JiBvdXRfYmFzaWNC
bG9ja0xvY2F0aW9ucykgb3ZlcnJpZGU7CisgICAgICAgIAogICAgIAogICAgIHZvaWQgc2V0U2Ny
aXB0RGVidWdTZXJ2ZXIoU2NyaXB0RGVidWdTZXJ2ZXIqIHNjcmlwdERlYnVnU2VydmVyKSB7IG1f
c2NyaXB0RGVidWdTZXJ2ZXIgPSBzY3JpcHREZWJ1Z1NlcnZlcjsgfQogCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaW5zcGVjdG9yL3Byb3RvY29sL1J1bnRpbWUuanNvbgo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW5zcGVjdG9yL3Byb3RvY29sL1J1bnRpbWUuanNv
bgkocmV2aXNpb24gMTc1NjkxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3BlY3Rvci9w
cm90b2NvbC9SdW50aW1lLmpzb24JKHdvcmtpbmcgY29weSkKQEAgLTE1Myw2ICsxNTMsMTYgQEAK
ICAgICAgICAgICAgICAgICB7ICJuYW1lIjogInNvdXJjZUlEIiwgInR5cGUiOiAic3RyaW5nIiwg
ImRlc2NyaXB0aW9uIjogInNvdXJjZUlEIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGEgc2NyaXB0IiB9
LAogICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiZGl2b3QiLCAidHlwZSI6ICJpbnRlZ2VyIiwg
ImRlc2NyaXB0aW9uIjogImNoYXJhY3RlciBvZmZzZXQgZm9yIGFzc2lnbm1lbnQgcmFuZ2UiIH0K
ICAgICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImlkIjog
IkJhc2ljQmxvY2tMb2NhdGlvbiIsCisgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAg
ICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlc2NyaWJlcyB0aGUgbG9jYXRpb24gb2YgYSBiYXNp
YyBibG9jayBhbmQgaWYgdGhhdCBiYXNpYyBibG9jayBoYXMgZXhlY3V0ZWQuIiwKKyAgICAgICAg
ICAgICJwcm9wZXJ0aWVzIjogWworICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAic3RhcnRPZmZz
ZXQiLCAidHlwZSI6ICJpbnRlZ2VyIiwgImRlc2NyaXB0aW9uIjogIlN0YXJ0IG9mZnNldCBvZiB0
aGUgYmFzaWMgYmxvY2suIiB9LAorICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiZW5kT2Zmc2V0
IiwgInR5cGUiOiAiaW50ZWdlciIsICJkZXNjcmlwdGlvbiI6ICJFbmQgb2Zmc2V0IG9mIHRoZSBi
YXNpYyBibG9jay4iIH0sCisgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJoYXNFeGVjdXRlZCIs
ICJ0eXBlIjogImJvb2xlYW4iLCAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIGlmIHRoZSBiYXNp
YyBibG9jayBoYXMgZXhlY3V0ZWQgYmVmb3JlLiIgfQorICAgICAgICAgICAgXQogICAgICAgICB9
CiAgICAgXSwKICAgICAiY29tbWFuZHMiOiBbCkBAIC0yNTYsNiArMjY2LDE2IEBACiAgICAgICAg
IHsKICAgICAgICAgICAgICJuYW1lIjogImRpc2FibGVUeXBlUHJvZmlsZXIiLAogICAgICAgICAg
ICAgImRlc2NyaXB0aW9uIjogIkRpc2FibGVzIHR5cGUgcHJvZmlsaW5nIG9uIHRoZSBWTS4iCisg
ICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogImdldEJhc2ljQmxvY2tM
b2NhdGlvbnMiLAorICAgICAgICAgICAgInBhcmFtZXRlcnMiOiBbCisgICAgICAgICAgICAgICAg
eyAibmFtZSI6ICJzb3VyY2VJRCIsICJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJJ
bmRpY2F0ZXMgd2hpY2ggc291cmNlSUQgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkIGZvci4iIH0K
KyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAicmV0dXJucyI6IFsKKyAgICAgICAgICAgICAg
ICB7ICJuYW1lIjogImJhc2ljQmxvY2tMb2NhdGlvbnMiLCAidHlwZSI6ICJhcnJheSIsICJpdGVt
cyI6IHsgIiRyZWYiOiAiQmFzaWNCbG9ja0xvY2F0aW9uIiwgImRlc2NyaXB0aW9uIjogIkJhc2lj
IGJsb2NrIGxvY2F0aW9ucy4iIH0gfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJkZXNj
cmlwdGlvbiI6ICJSZXR1cm5zIGEgbGlzdCBvZiBiYXNpYyBibG9ja3Mgd2l0aCBpbmZvcm1hdGlv
biBhYm91dCB0aGVpciB0ZXh0IHJhbmdlcyBhbmQgd2hldGhlciBvciBub3QgdGhleSBoYXZlIGV4
ZWN1dGVkLiIKICAgICAgICAgfQogICAgIF0sCiAgICAgImV2ZW50cyI6IFsKSW5kZXg6IFNvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9y
LmNzcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9W
aWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5jc3MJKHJldmlzaW9uIDE3NTY5MSkKKysrIFNvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9y
LmNzcwkod29ya2luZyBjb3B5KQpAQCAtNzYsMyArNzYsMTIgQEAKIAogICAgIC13ZWJraXQtdHJh
bnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7CiB9CisKKy5oYXMtZXhlY3V0ZWQgeworICAgIGJhY2tn
cm91bmQtY29sb3I6IHdoaXRlOworfQorCisuaGFzLW5vdC1leGVjdXRlZCB7CisgICAgYmFja2dy
b3VuZC1jb2xvcjogcmdiKDIzMywgMjMzLCAyMzMpOworfQorCkluZGV4OiBTb3VyY2UvV2ViSW5z
cGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3Vy
Y2VDb2RlVGV4dEVkaXRvci5qcwkocmV2aXNpb24gMTc1NjkxKQorKysgU291cmNlL1dlYkluc3Bl
Y3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0b3IuanMJKHdvcmtp
bmcgY29weSkKQEAgLTQzMiw2ICs0MzIsNyBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRF
ZGl0b3IucHJvdG90CiAgICAgICAgIHRoaXMuc3RyaW5nID0gY29udGVudDsKIAogICAgICAgICB0
aGlzLl9tYWtlVHlwZVRva2VuQW5ub3RhdG9yKCk7CisgICAgICAgIHRoaXMuX2VuYWJsZUJhc2lj
QmxvY2tIaWdobGlnaHRpbmcoKTsKIAogICAgICAgICB0aGlzLl9jb250ZW50RGlkUG9wdWxhdGUo
KTsKICAgICB9LApAQCAtMTU3Niw2ICsxNTc3LDU1IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2Rl
VGV4dEVkaXRvci5wcm90b3QKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzY3JvbGxIYW5k
bGVyOworICAgIH0sIAorCisgICAgX2VuYWJsZUJhc2ljQmxvY2tIaWdobGlnaHRpbmc6IGZ1bmN0
aW9uKCkKKyAgICB7CisgICAgICAgIHZhciBzY3JpcHQgPSBudWxsOworICAgICAgICBpZiAodGhp
cy5fc291cmNlQ29kZSBpbnN0YW5jZW9mIFdlYkluc3BlY3Rvci5TY3JpcHQpCisgICAgICAgICAg
ICBzY3JpcHQgPSB0aGlzLl9zb3VyY2VDb2RlOworICAgICAgICBlbHNlIGlmICh0aGlzLl9zb3Vy
Y2VDb2RlIGluc3RhbmNlb2YgV2ViSW5zcGVjdG9yLlJlc291cmNlICYmIHRoaXMuX3NvdXJjZUNv
ZGUudHlwZSA9PT0gV2ViSW5zcGVjdG9yLlJlc291cmNlLlR5cGUuU2NyaXB0ICYmIHRoaXMuX3Nv
dXJjZUNvZGUuc2NyaXB0cy5sZW5ndGgpCisgICAgICAgICAgICBzY3JpcHQgPSB0aGlzLl9zb3Vy
Y2VDb2RlLnNjcmlwdHNbMF07CisKKyAgICAgICAgaWYgKCFzY3JpcHQpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgdmFyIHNvdXJjZUlEID0gc2NyaXB0LmlkOworICAgICAgICB2YXIg
b2xkTWFya2VycyA9IG51bGw7CisKKyAgICAgICAgZnVuY3Rpb24gYW5ub3RhdGVCYXNpY0Jsb2Nr
cygpIAorICAgICAgICB7CisgICAgICAgICAgICBSdW50aW1lQWdlbnQuZ2V0QmFzaWNCbG9ja0xv
Y2F0aW9ucyhzb3VyY2VJRCwgZnVuY3Rpb24oZXJyb3IsIGJhc2ljQmxvY2tzKSB7CisgICAgICAg
ICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJF
cnJvciBpbiBnZXR0aW5nIGJhc2ljIGJsb2NrIGxvY2F0aW9ucy4iKTsKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBpZiAob2xkTWFya2VycykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHZh
ciBtYXJrZXIgb2Ygb2xkTWFya2VycykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5j
bGVhcigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9sZE1hcmtlcnMg
PSBbXTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBibG9jayBvZiBiYXNpY0Jsb2Nrcykgewor
ICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogRXZlbnR1YWxseSwgdGhlIGJhY2sgZW5kIGRh
dGEgc2hvdWxkbid0IGdpdmUgdXMgdGhlc2UgYmFkIHJhbmdlcy4KKyAgICAgICAgICAgICAgICAg
ICAgaWYgKGJsb2NrLnN0YXJ0T2Zmc2V0ID4gYmxvY2suZW5kT2Zmc2V0IHx8IGJsb2NrLnN0YXJ0
T2Zmc2V0IDwgMCB8fCBibG9jay5lbmRPZmZzZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSB0
aGlzLm9yaWdpbmFsT2Zmc2V0VG9DdXJyZW50UG9zaXRpb24oYmxvY2suc3RhcnRPZmZzZXQpOwor
ICAgICAgICAgICAgICAgICAgICB2YXIgZW5kUG9zaXRpb24gPSB0aGlzLm9yaWdpbmFsT2Zmc2V0
VG9DdXJyZW50UG9zaXRpb24oYmxvY2suZW5kT2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAg
ICB2YXIgY2xhc3NOYW1lID0gYmxvY2suaGFzRXhlY3V0ZWQgPyAiaGFzLWV4ZWN1dGVkIiA6ICJo
YXMtbm90LWV4ZWN1dGVkIjsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMu
X2NvZGVNaXJyb3IuZ2V0RG9jKCkubWFya1RleHQoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24s
IHtjbGFzc05hbWU6IGNsYXNzTmFtZX0pOworICAgICAgICAgICAgICAgICAgICBvbGRNYXJrZXJz
LnB1c2gobWFya2VyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzZXRU
aW1lb3V0KGFubm90YXRlQmFzaWNCbG9ja3MuYmluZCh0aGlzKSwgNDAwMCk7CisKKyAgICAgICAg
ICAgIH0uYmluZCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBhbm5vdGF0ZUJhc2ljQmxv
Y2tzLmNhbGwodGhpcyk7CiAgICAgfQogfTsKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>242728</attachid>
            <date>2014-12-06 16:57:10 -0800</date>
            <delta_ts>2014-12-06 17:20:48 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>30397</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL01haW4uaHRtbAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9NYWluLmh0bWwJ
KHJldmlzaW9uIDE3NjgzNikKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNl
L01haW4uaHRtbAkod29ya2luZyBjb3B5KQpAQCAtNDYwLDkgKzQ2MCwxMSBAQAogICAgIDxzY3Jp
cHQgc3JjPSJWaWV3cy9UeXBlVG9rZW5WaWV3LmpzIj48L3NjcmlwdD4KIAogICAgIDxzY3JpcHQg
c3JjPSJDb250cm9sbGVycy9Db2RlTWlycm9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9KYXZhU2NyaXB0QW5ub3RhdG9yLmpzIj48
L3NjcmlwdD4KIAogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9BbmFseXplck1hbmFnZXIu
anMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9BcHBsaWNhdGlvbkNh
Y2hlTWFuYWdlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Jh
c2ljQmxvY2tBbm5vdGF0b3IuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9s
bGVycy9CcmFuY2hNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJv
bGxlcnMvQ1NTU3R5bGVNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29u
dHJvbGxlcnMvQ29kZU1pcnJvckNvbG9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0PgpA
QCAtNDc5LDYgKzQ4MSw3IEBACiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Zvcm1hdHRl
clNvdXJjZU1hcC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Zy
YW1lUmVzb3VyY2VNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJv
bGxlcnMvSXNzdWVNYW5hZ2VyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iQ29udHJv
bGxlcnMvSmF2YVNjcmlwdEFubm90YXRvck1hbmFnZXIuanMiPjwvc2NyaXB0PgogICAgIDxzY3Jp
cHQgc3JjPSJDb250cm9sbGVycy9KYXZhU2NyaXB0TG9nVmlld0NvbnRyb2xsZXIuanMiPjwvc2Ny
aXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9KYXZhU2NyaXB0UnVudGltZUNvbXBs
ZXRpb25Qcm92aWRlci5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJz
L0xheWVyVHJlZU1hbmFnZXIuanMiPjwvc2NyaXB0PgpJbmRleDogU291cmNlL1dlYkluc3BlY3Rv
clVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVy
cy9CYXNpY0Jsb2NrQW5ub3RhdG9yLmpzCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkluc3Bl
Y3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQg
U2FhbSBCYXJhdGkgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworV2ViSW5zcGVj
dG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IgPSBmdW5jdGlvbihzb3VyY2VDb2RlVGV4dEVkaXRvciwg
c2NyaXB0KQoreworICAgIFdlYkluc3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yLmNhbGwodGhp
cywgc291cmNlQ29kZVRleHRFZGl0b3IsIHNjcmlwdCk7CisKKyAgICB0aGlzLl9oaWdobGlnaHRN
YXJrZXJzID0gW107CisgICAgdGhpcy5fbGluZURlc2NyaXB0aW9ucyA9IFtdOworfTsKKworV2Vi
SW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWUgPSAi
YmFzaWMtYmxvY2staGFzLW5vdC1leGVjdXRlZCI7CisKK1dlYkluc3BlY3Rvci5CYXNpY0Jsb2Nr
QW5ub3RhdG9yLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkJh
c2ljQmxvY2tBbm5vdGF0b3IsCisgICAgX19wcm90b19fOiBXZWJJbnNwZWN0b3IuSmF2YVNjcmlw
dEFubm90YXRvci5wcm90b3R5cGUsCisKKyAgICAvLyBQcm90ZWN0ZWQKKworICAgIGNsZWFyQW5u
b3RhdGlvbnM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGZvciAodmFyIGxpbmVEZXNjcmlw
dGlvbiBvZiB0aGlzLl9saW5lRGVzY3JpcHRpb25zKQorICAgICAgICAgICAgdGhpcy5fc291cmNl
Q29kZVRleHRFZGl0b3IucmVtb3ZlU3R5bGVDbGFzc0Zyb21MaW5lKGxpbmVEZXNjcmlwdGlvbi5s
aW5lTnVtYmVyLCBsaW5lRGVzY3JpcHRpb24uY2xhc3NOYW1lKTsKKyAgICAgICAgdGhpcy5fbGlu
ZURlc2NyaXB0aW9ucyA9IFtdOworCisgICAgICAgIGZvciAodmFyIG1hcmtlciBvZiB0aGlzLl9o
aWdobGlnaHRNYXJrZXJzKQorICAgICAgICAgICAgbWFya2VyLmNsZWFyKCk7CisgICAgICAgIHRo
aXMuX2hpZ2hsaWdodE1hcmtlcnMgPSBbXTsKKyAgICB9LAorCisgICAgaW5zZXJ0QW5ub3RhdGlv
bnM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5faXNBY3RpdmUpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMuX2Fubm90YXRlQmFzaWNCbG9ja0V4ZWN1dGlv
blJhbmdlcygpOworICAgIH0sCisKKyAgICAvLyBQcml2YXRlCisKKyAgICBfYW5ub3RhdGVCYXNp
Y0Jsb2NrRXhlY3V0aW9uUmFuZ2VzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIgc291
cmNlSUQgPSB0aGlzLl9zY3JpcHQuaWQ7CisKKyAgICAgICAgUnVudGltZUFnZW50LmdldEJhc2lj
QmxvY2tMb2NhdGlvbnMoc291cmNlSUQsIGZ1bmN0aW9uKGVycm9yLCBiYXNpY0Jsb2Nrcykgewor
ICAgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVy
cm9yIGluIGdldHRpbmcgYmFzaWMgYmxvY2sgbG9jYXRpb25zLiIpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0FjdGl2
ZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRoaXMuY2xlYXJBbm5v
dGF0aW9ucygpOworCisgICAgICAgICAgICBmb3IgKHZhciBibG9jayBvZiBiYXNpY0Jsb2NrcykK
KyAgICAgICAgICAgICAgICB0aGlzLl9oaWdobGlnaHRUZXh0Rm9yQmFzaWNCbG9jayhibG9jayk7
CisKKyAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gc2V0VGltZW91dCh0aGlz
Lmluc2VydEFubm90YXRpb25zLmJpbmQodGhpcyksIDQwMDApOworCisgICAgICAgIH0uYmluZCh0
aGlzKSk7CisgICAgfSwKKworICAgIF9oaWdobGlnaHRUZXh0Rm9yQmFzaWNCbG9jazogZnVuY3Rp
b24oYmFzaWNCbG9jaykKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5LCB0aGUg
YmFjayBlbmQgZGF0YSBzaG91bGRuJ3QgZ2l2ZSB1cyB0aGVzZSBiYWQgcmFuZ2VzLgorICAgICAg
ICBpZiAoYmFzaWNCbG9jay5zdGFydE9mZnNldCA+IGJhc2ljQmxvY2suZW5kT2Zmc2V0IHx8IGJh
c2ljQmxvY2suc3RhcnRPZmZzZXQgPCAwIHx8IGJhc2ljQmxvY2suZW5kT2Zmc2V0IDwgMCkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGJhc2ljQmxvY2suaGFzRXhlY3V0ZWQpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSB0aGlzLl9z
b3VyY2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3VycmVudFBvc2l0aW9uKGJhc2lj
QmxvY2suc3RhcnRPZmZzZXQpOworICAgICAgICB2YXIgZW5kUG9zaXRpb24gPSB0aGlzLl9zb3Vy
Y2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3VycmVudFBvc2l0aW9uKGJhc2ljQmxv
Y2suZW5kT2Zmc2V0KTsKKworICAgICAgICBpZiAodGhpcy5fc2hvdWxkU2tpcEJhc2ljQmxvY2so
c3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIHZhciBtYXJrZXIgPSB0aGlzLl9zb3VyY2VDb2RlVGV4dEVkaXRvci5hZGRTdHlsZVRvVGV4
dFJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBXZWJJbnNwZWN0b3IuQmFzaWNCbG9j
a0Fubm90YXRvci5IYXNOb3RFeGVjdXRlZENsYXNzTmFtZSk7CisgICAgICAgIHRoaXMuX2hpZ2hs
aWdodE1hcmtlcnMucHVzaChtYXJrZXIpOworCisgICAgICAgIGlmIChlbmRQb3NpdGlvbi5saW5l
ID4gc3RhcnRQb3NpdGlvbi5saW5lKSB7CisgICAgICAgICAgICB2YXIgc3RhcnRMaW5lRW5kUG9z
aXRpb24gPSB7IGxpbmU6IHN0YXJ0UG9zaXRpb24ubGluZSwgY2g6IHRoaXMuX3NvdXJjZUNvZGVU
ZXh0RWRpdG9yLmxpbmUoc3RhcnRQb3NpdGlvbi5saW5lKS5sZW5ndGggfTsKKyAgICAgICAgICAg
IGlmICh0aGlzLl9jYW5HcmF5T3V0RW50aXJlTGluZShzdGFydFBvc2l0aW9uLmxpbmUsIHN0YXJ0
UG9zaXRpb24sIHN0YXJ0TGluZUVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICB0aGlzLl9n
cmF5T3V0TGluZShzdGFydFBvc2l0aW9uLmxpbmUpOworCisgICAgICAgICAgICB2YXIgZW5kTGlu
ZVN0YXJ0UG9zaXRpb24gPSB7IGxpbmU6IGVuZFBvc2l0aW9uLmxpbmUsIGNoOiAwIH07CisgICAg
ICAgICAgICBpZiAodGhpcy5fY2FuR3JheU91dEVudGlyZUxpbmUoZW5kUG9zaXRpb24ubGluZSwg
ZW5kTGluZVN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICB0aGlz
Ll9ncmF5T3V0TGluZShlbmRQb3NpdGlvbi5saW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIGlmICh0aGlzLl9jYW5HcmF5T3V0RW50aXJlTGluZShzdGFydFBvc2l0aW9uLmxpbmUs
IHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICB0aGlzLl9ncmF5
T3V0TGluZShzdGFydFBvc2l0aW9uLmxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVu
ZFBvc2l0aW9uLmxpbmUgLSBzdGFydFBvc2l0aW9uLmxpbmUgPiAxKSB7CisgICAgICAgICAgICBm
b3IgKHZhciBsaW5lTnVtYmVyID0gc3RhcnRQb3NpdGlvbi5saW5lICsgMTsgbGluZU51bWJlciA8
IGVuZFBvc2l0aW9uLmxpbmU7IGxpbmVOdW1iZXIrKykKKyAgICAgICAgICAgICAgICB0aGlzLl9n
cmF5T3V0TGluZShsaW5lTnVtYmVyKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBfc2hvdWxk
U2tpcEJhc2ljQmxvY2s6IGZ1bmN0aW9uKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKQorICAg
IHsKKyAgICAgICAgdmFyIGlzT25seVdoaXRlc3BhY2UgPSAvXlxzKyQvOworICAgICAgICByZXR1
cm4gaXNPbmx5V2hpdGVzcGFjZS50ZXN0KHRoaXMuX3NvdXJjZUNvZGVUZXh0RWRpdG9yLmdldFRl
eHRJblJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSk7CisgICAgfSwKKworICAgIF9j
YW5HcmF5T3V0RW50aXJlTGluZTogZnVuY3Rpb24obGluZU51bWJlciwgc3RhcnRQb3NpdGlvbiwg
ZW5kUG9zaXRpb24pCisgICAgeworICAgICAgICB2YXIgbGluZVRleHQgPSB0aGlzLl9zb3VyY2VD
b2RlVGV4dEVkaXRvci5saW5lKGxpbmVOdW1iZXIpOworICAgICAgICB2YXIgYmxvY2tUZXh0ID0g
dGhpcy5fc291cmNlQ29kZVRleHRFZGl0b3IuZ2V0VGV4dEluUmFuZ2Uoc3RhcnRQb3NpdGlvbiwg
ZW5kUG9zaXRpb24pOworICAgICAgICBsaW5lVGV4dCA9IGxpbmVUZXh0LnJlcGxhY2UoL1xzL2cs
ICIiKTsKKyAgICAgICAgYmxvY2tUZXh0ID0gYmxvY2tUZXh0LnJlcGxhY2UoL1xzL2csICIiKTsK
KyAgICAgICAgaWYgKGxpbmVUZXh0ID09PSBibG9ja1RleHQpCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICBfZ3JheU91dExpbmU6
IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCisgICAgeworICAgICAgICB2YXIgY2xhc3NOYW1lID0gV2Vi
SW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWU7Cisg
ICAgICAgIHRoaXMuX3NvdXJjZUNvZGVUZXh0RWRpdG9yLmFkZFN0eWxlQ2xhc3NUb0xpbmUobGlu
ZU51bWJlciwgY2xhc3NOYW1lKTsKKyAgICAgICAgdmFyIGxpbmVEZXNjcmlwdGlvbiA9IHtsaW5l
TnVtYmVyOiBsaW5lTnVtYmVyLCBjbGFzc05hbWU6IGNsYXNzTmFtZX07CisgICAgICAgIHRoaXMu
X2xpbmVEZXNjcmlwdGlvbnMucHVzaChsaW5lRGVzY3JpcHRpb24pOworICAgIH0KK307CkluZGV4
OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9KYXZhU2Ny
aXB0QW5ub3RhdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2Vy
SW50ZXJmYWNlL0NvbnRyb2xsZXJzL0phdmFTY3JpcHRBbm5vdGF0b3IuanMJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9KYXZh
U2NyaXB0QW5ub3RhdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAxNCBTYWFtIEJhcmF0aSA8c2FhbWJhcmF0aTFAZ21haWwuY29tPgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCitXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEFubm90YXRvciA9IGZ1bmN0aW9uKHNv
dXJjZUNvZGVUZXh0RWRpdG9yLCBzY3JpcHQpCit7CisgICAgV2ViSW5zcGVjdG9yLk9iamVjdC5j
YWxsKHRoaXMpOworCisgICAgY29uc29sZS5hc3NlcnQoc291cmNlQ29kZVRleHRFZGl0b3IgJiYg
c291cmNlQ29kZVRleHRFZGl0b3IgaW5zdGFuY2VvZiBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRl
eHRFZGl0b3IsIHNvdXJjZUNvZGVUZXh0RWRpdG9yKTsKKyAgICBjb25zb2xlLmFzc2VydChzY3Jp
cHQsIHNjcmlwdCk7CisKKyAgICB0aGlzLl9zY3JpcHQgPSBzY3JpcHQ7CisgICAgdGhpcy5fc291
cmNlQ29kZVRleHRFZGl0b3IgPSBzb3VyY2VDb2RlVGV4dEVkaXRvcjsKKyAgICB0aGlzLl90aW1l
b3V0SWRlbnRpZmllciA9IG51bGw7CisgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTsKK307CisK
K1dlYkluc3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yLnByb3RvdHlwZSA9IHsKKyAgICBjb25z
dHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkphdmFTY3JpcHRBbm5vdGF0b3IsCisgICAgX19wcm90b19f
OiBXZWJJbnNwZWN0b3IuT2JqZWN0LnByb3RvdHlwZSwKKworICAgIC8vIFB1YmxpYworCisgICAg
Z2V0IHNvdXJjZUNvZGVUZXh0RWRpdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9z
b3VyY2VDb2RlVGV4dEVkaXRvcjsKKyAgICB9LAorCisgICAgZ2V0IGlzQWN0aXZlKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTsKKyAgICB9LAorCisgICAgcGF1c2U6IGZ1
bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX2NsZWFyVGltZW91dElmTmVlZGVkKCk7Cisg
ICAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7CisgICAgfSwKKworICAgIHJlc3VtZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0SWZOZWVkZWQoKTsKKyAg
ICAgICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlOworICAgICAgICB0aGlzLmluc2VydEFubm90YXRp
b25zKCk7CisgICAgfSwKKworICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IGNvbnNvbGUuYXNzZXJ0KHRoaXMuX2lzQWN0aXZlKTsKKyAgICAgICAgaWYgKCF0aGlzLl9pc0Fj
dGl2ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRJ
Zk5lZWRlZCgpOworICAgICAgICB0aGlzLmluc2VydEFubm90YXRpb25zKCk7CisgICAgfSwKKwor
ICAgIHJlc2V0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRJ
Zk5lZWRlZCgpOworICAgICAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7CisgICAgICAgIHRoaXMu
Y2xlYXJBbm5vdGF0aW9ucygpOworICAgICAgICB0aGlzLmluc2VydEFubm90YXRpb25zKCk7Cisg
ICAgfSwKKworICAgIGNsZWFyOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLnBhdXNl
KCk7CisgICAgICAgIHRoaXMuY2xlYXJBbm5vdGF0aW9ucygpOworICAgIH0sCisKKyAgICAvLyBQ
cm90ZWN0ZWQKKworICAgIGluc2VydEFubm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICAvLyBJbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgorICAgIH0sCisKKyAgICBjbGVhckFu
bm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICAvLyBJbXBsZW1lbnRlZCBieSBz
dWJjbGFzc2VzLgorICAgIH0sCisKKyAgICAvLyBQcml2YXRlCisKKyAgICBfY2xlYXJUaW1lb3V0
SWZOZWVkZWQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl90aW1lb3V0SWRl
bnRpZmllcikgeworICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZGVudGlm
aWVyKTsKKyAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKKyAgICAg
ICAgfQorICAgIH0KK307CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFj
ZS9Db250cm9sbGVycy9KYXZhU2NyaXB0QW5ub3RhdG9yTWFuYWdlci5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9KYXZhU2Ny
aXB0QW5ub3RhdG9yTWFuYWdlci5qcwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJJbnNwZWN0
b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL0phdmFTY3JpcHRBbm5vdGF0b3JNYW5hZ2Vy
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAxNCBTYWFtIEJhcmF0aSA8c2FhbWJhcmF0aTFAZ21haWwuY29tPgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJ
bnNwZWN0b3IuSmF2YVNjcmlwdEFubm90YXRvck1hbmFnZXIgPSBmdW5jdGlvbigpCit7CisgICAg
V2ViSW5zcGVjdG9yLk9iamVjdC5jYWxsKHRoaXMpOworCisgICAgdGhpcy5fYW5ub3RhdG9ycyA9
IHt9OworfTsKKworV2ViSW5zcGVjdG9yLkphdmFTY3JpcHRBbm5vdGF0b3JNYW5hZ2VyLnByb3Rv
dHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkphdmFTY3JpcHRBbm5vdGF0
b3JNYW5hZ2VyLAorICAgIF9fcHJvdG9fXzogV2ViSW5zcGVjdG9yLk9iamVjdC5wcm90b3R5cGUs
CisKKyAgICAvLyBQdWJsaWMKKworICAgIGFkZEFubm90YXRvcjogZnVuY3Rpb24oa2V5LCBhbm5v
dGF0b3IpCisgICAgeworICAgICAgICB0aGlzLl9hbm5vdGF0b3JzW2tleV0gPSBhbm5vdGF0b3I7
CisgICAgfSwKKworICAgIGdldEFubm90YXRvcjogZnVuY3Rpb24oa2V5KQorICAgIHsKKyAgICAg
ICAgdmFyIGFubm90YXRvciA9IHRoaXMuX2Fubm90YXRvcnNba2V5XTsKKyAgICAgICAgcmV0dXJu
IGFubm90YXRvciA/IGFubm90YXRvciA6IG51bGw7CisgICAgfSwKKworICAgIGlzQW5ub3RhdG9y
QWN0aXZlOiBmdW5jdGlvbihrZXkpCisgICAgeworICAgICAgICB2YXIgYW5ub3RhdG9yID0gdGhp
cy5nZXRBbm5vdGF0b3Ioa2V5KTsKKyAgICAgICAgaWYgKCFhbm5vdGF0b3IpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBhbm5vdGF0b3IuaXNBY3RpdmU7CisgICAg
fSwKKworICAgIHBhdXNlQWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBmb3IgKGFubm90
YXRvciBvZiB0aGlzLl9nZXRBbm5vdGF0b3JzKCkpCisgICAgICAgICAgICBhbm5vdGF0b3IucGF1
c2UoKTsKKyAgICB9LAorCisgICAgcmVzdW1lQWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAg
ICBmb3IgKGFubm90YXRvciBvZiB0aGlzLl9nZXRBbm5vdGF0b3JzKCkpCisgICAgICAgICAgICBh
bm5vdGF0b3IucmVzdW1lKCk7CisgICAgfSwKKworICAgIHJlZnJlc2hBbGxJZkFjdGl2ZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgZm9yIChhbm5vdGF0b3Igb2YgdGhpcy5fZ2V0QW5ub3Rh
dG9ycygpKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdG9yLmlzQWN0aXZlKQorICAgICAgICAg
ICAgICAgIGFubm90YXRvci5yZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgcmVz
ZXRBbGxJZkFjdGl2ZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgZm9yIChhbm5vdGF0b3Ig
b2YgdGhpcy5fZ2V0QW5ub3RhdG9ycygpKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdG9yLmlz
QWN0aXZlKQorICAgICAgICAgICAgICAgIGFubm90YXRvci5yZXNldCgpOworICAgICAgICB9Cisg
ICAgfSwKKworICAgIGNsZWFyQWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBmb3IgKGFu
bm90YXRvciBvZiB0aGlzLl9nZXRBbm5vdGF0b3JzKCkpCisgICAgICAgICAgICBhbm5vdGF0b3Iu
Y2xlYXIoKTsKKyAgICB9LAorCisgICAgcmVtb3ZlQWxsQW5ub3RhdG9yczogZnVuY3Rpb24oKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fYW5ub3RhdG9ycyA9IHt9OworICAgIH0sCisKKyAgICAvLyBQ
cml2YXRlCisKKyAgICBfZ2V0QW5ub3RhdG9yczogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2Fubm90YXRvcnMpLm1hcChmdW5jdGlvbihrZXkpIHsg
cmV0dXJuIHRoaXMuX2Fubm90YXRvcnNba2V5XTsgfSwgdGhpcyk7CisgICAgfQorfTsKSW5kZXg6
IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1R5cGVUb2tl
bkFubm90YXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9Db250cm9sbGVycy9UeXBlVG9rZW5Bbm5vdGF0b3IuanMJKHJldmlzaW9uIDE3Njgz
NikKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1R5
cGVUb2tlbkFubm90YXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMjUsNjYgKzI1LDE4IEBACiAK
IFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IgPSBmdW5jdGlvbihzb3VyY2VDb2RlVGV4
dEVkaXRvciwgc2NyaXB0KQogewotICAgIFdlYkluc3BlY3Rvci5PYmplY3QuY2FsbCh0aGlzKTsK
KyAgICBXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEFubm90YXRvci5jYWxsKHRoaXMsIHNvdXJjZUNv
ZGVUZXh0RWRpdG9yLCBzY3JpcHQpOwogCi0gICAgY29uc29sZS5hc3NlcnQoc291cmNlQ29kZVRl
eHRFZGl0b3IgJiYgc291cmNlQ29kZVRleHRFZGl0b3IgaW5zdGFuY2VvZiBXZWJJbnNwZWN0b3Iu
U291cmNlQ29kZVRleHRFZGl0b3IsIHNvdXJjZUNvZGVUZXh0RWRpdG9yKTsKLSAgICBjb25zb2xl
LmFzc2VydChzY3JpcHQsIHNjcmlwdCk7Ci0KLSAgICB0aGlzLl9zY3JpcHQgPSBzY3JpcHQ7Ci0g
ICAgdGhpcy5fc291cmNlQ29kZVRleHRFZGl0b3IgPSBzb3VyY2VDb2RlVGV4dEVkaXRvcjsKICAg
ICB0aGlzLl90eXBlVG9rZW5Ob2RlcyA9IFtdOwogICAgIHRoaXMuX3R5cGVUb2tlbkJvb2ttYXJr
cyA9IFtdOwotICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKLSAgICB0aGlzLl9p
c0FjdGl2ZSA9IGZhbHNlOwogfTsKIAogV2ViSW5zcGVjdG9yLlR5cGVUb2tlbkFubm90YXRvci5w
cm90b3R5cGUgPSB7CiAgICAgY29uc3RydWN0b3I6IFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5v
dGF0b3IsCi0gICAgX19wcm90b19fOiBXZWJJbnNwZWN0b3IuT2JqZWN0LnByb3RvdHlwZSwKKyAg
ICBfX3Byb3RvX186IFdlYkluc3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yLnByb3RvdHlwZSwK
IAogICAgIC8vIFB1YmxpYwogCi0gICAgZ2V0IGlzQWN0aXZlKCkKLSAgICB7Ci0gICAgICAgIHJl
dHVybiB0aGlzLl9pc0FjdGl2ZTsKLSAgICB9LAotCi0gICAgZ2V0IHNvdXJjZUNvZGVUZXh0RWRp
dG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlVGV4dEVkaXRvcjsK
LSAgICB9LAotCi0gICAgcGF1c2U6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2Ns
ZWFyVGltZW91dElmTmVlZGVkKCk7Ci0gICAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7Ci0g
ICAgfSwKLQotICAgIHJlc3VtZTogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5fY2xl
YXJUaW1lb3V0SWZOZWVkZWQoKTsKLSAgICAgICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlOwotICAg
ICAgICB0aGlzLl9pbnNlcnRBbm5vdGF0aW9ucygpOwotICAgIH0sCi0KLSAgICByZWZyZXNoOiBm
dW5jdGlvbigpCi0gICAgewotICAgICAgICBjb25zb2xlLmFzc2VydCh0aGlzLl9pc0FjdGl2ZSk7
Ci0gICAgICAgIGlmICghdGhpcy5faXNBY3RpdmUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0SWZOZWVkZWQoKTsKLSAgICAgICAgdGhpcy5faW5zZXJ0
QW5ub3RhdGlvbnMoKTsKLSAgICB9LAotCi0gICAgcmVzZXQ6IGZ1bmN0aW9uKCkKLSAgICB7Ci0g
ICAgICAgIHRoaXMuX2NsZWFyVGltZW91dElmTmVlZGVkKCk7Ci0gICAgICAgIHRoaXMuX2lzQWN0
aXZlID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5fY2xlYXJUeXBlVG9rZW5zKCk7Ci0gICAgICAgIHRo
aXMuX2luc2VydEFubm90YXRpb25zKCk7Ci0gICAgfSwKLQogICAgIHRvZ2dsZVR5cGVBbm5vdGF0
aW9uczogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7CkBA
IC05OCw5ICs1MCw5IEBAIFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IucHJvdG90eXAK
ICAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlOwogICAgIH0sCiAKLSAgICAvLyBQcml2YXRl
CisgICAgLy8gUHJvdGVjdGVkCiAKLSAgICBfaW5zZXJ0QW5ub3RhdGlvbnM6IGZ1bmN0aW9uKCkK
KyAgICBpbnNlcnRBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgaWYgKCF0
aGlzLl9pc0FjdGl2ZSkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTExMSw3ICs2Myw3IEBAIFdl
Ykluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IucHJvdG90eXAKICAgICAgICAgICAgIHRoaXMu
X3NjcmlwdC5yZXF1ZXN0U2NyaXB0U3ludGF4VHJlZShmdW5jdGlvbihzeW50YXhUcmVlKSB7CiAg
ICAgICAgICAgICAgICAgLy8gQWZ0ZXIgcmVxdWVzdGluZyB0aGUgdHJlZSwgd2Ugc3RpbGwgbWln
aHQgZ2V0IGEgbnVsbCB0cmVlIGZyb20gYSBwYXJzZSBlcnJvci4KICAgICAgICAgICAgICAgICBp
ZiAoc3ludGF4VHJlZSkKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0QW5ub3RhdGlv
bnMoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRBbm5vdGF0aW9ucygpOwogICAg
ICAgICAgICAgfS5iaW5kKHRoaXMpKTsKIAogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTM3LDEx
ICs4OSwxOCBAQCBXZWJJbnNwZWN0b3IuVHlwZVRva2VuQW5ub3RhdG9yLnByb3RvdHlwCiAKICAg
ICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gc2V0VGltZW91dChmdW5jdGlvbiB0
aW1lb3V0VXBkYXRlKCkgewogICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVy
ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aGlzLl9pbnNlcnRBbm5vdGF0aW9ucygpOworICAg
ICAgICAgICAgICAgIHRoaXMuaW5zZXJ0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgIH0uYmlu
ZCh0aGlzKSwgdGltZW91dFRpbWUpOwogICAgICAgICB9LmJpbmQodGhpcykpOwogICAgIH0sCiAK
KyAgICBjbGVhckFubm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9j
bGVhclR5cGVUb2tlbnMoKTsKKyAgICB9LAorCisgICAgLy8gUHJpdmF0ZQorCiAgICAgX2luc2Vy
dFR5cGVUb2tlbnNGb3JFYWNoTm9kZTogZnVuY3Rpb24obm9kZSkKICAgICB7CiAgICAgICAgIHZh
ciBzY3JpcHRTeW50YXhUcmVlID0gdGhpcy5fc2NyaXB0Ll9zY3JpcHRTeW50YXhUcmVlOwpAQCAt
MjcxLDEzICsyMzAsNSBAQCBXZWJJbnNwZWN0b3IuVHlwZVRva2VuQW5ub3RhdG9yLnByb3RvdHlw
CiAKICAgICAgICAgdGhpcy5fdHlwZVRva2VuTm9kZXMgPSBbXTsKICAgICAgICAgdGhpcy5fdHlw
ZVRva2VuQm9va21hcmtzID0gW107Ci0gICAgfSwKLQotICAgIF9jbGVhclRpbWVvdXRJZk5lZWRl
ZDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXRJZGVudGlmaWVy
KSB7Ci0gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dElkZW50aWZpZXIpOwot
ICAgICAgICAgICAgdGhpcy5fdGltZW91dElkZW50aWZpZXIgPSBudWxsOwotICAgICAgICB9CiAg
ICAgfQogfTsKSW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdz
L1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVj
dG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5jc3MJKHJldmlz
aW9uIDE3NjgzNikKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdz
L1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzcwkod29ya2luZyBjb3B5KQpAQCAtNzYsMyArNzYsNyBA
QAogCiAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKIH0KKworLmJhc2lj
LWJsb2NrLWhhcy1ub3QtZXhlY3V0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDAs
IDI0MCwgMjQwKTsKK30KSW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNl
L1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJ
bnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmpzCShy
ZXZpc2lvbiAxNzY4MzYpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9W
aWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMzYsOCArMzYs
OCBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IgPSBmdW5jCiAKICAgICBXZWJJ
bnNwZWN0b3IuVGV4dEVkaXRvci5jYWxsKHRoaXMsIG51bGwsIG51bGwsIHRoaXMpOwogCi0gICAg
dGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yID0gbnVsbDsKICAgICB0aGlzLl90eXBlVG9rZW5TY3Jv
bGxIYW5kbGVyID0gbnVsbDsKKyAgICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyID0gbmV3IFdlYklu
c3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yTWFuYWdlcjsKIAogICAgIC8vIEZJWE1FOiBDdXJy
ZW50bHkgdGhpcyBqdXN0IGp1bXBzIGJldHdlZW4gcmVzb3VyY2VzIGFuZCByZWxhdGVkIHNvdXJj
ZSBtYXAgcmVzb3VyY2VzLiBJdCBkb2Vzbid0ICJqdW1wIHRvIHN5bWJvbCIgeWV0LgogICAgIHRo
aXMuX3VwZGF0ZVRva2VuVHJhY2tpbmdDb250cm9sbGVyU3RhdGUoKTsKQEAgLTkwLDYgKzkwLDkg
QEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkR1cmF0aQogCiBXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IuQXV0b0Zvcm1hdE1pbmltdW1MaW5lTGVuZ3RoID0gNTAw
OwogCitXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9y
S2V5ID0gIlR5cGVUb2tlbkFubm90YXRvcktleSI7CitXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRl
eHRFZGl0b3IuQmFzaWNCbG9ja0Fubm90YXRvcktleSA9ICJCYXNpY0Jsb2NrQW5ub3RhdG9yS2V5
IjsKKwogV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkV2ZW50ID0gewogICAgIENv
bnRlbnRXaWxsUG9wdWxhdGU6ICJzb3VyY2UtY29kZS10ZXh0LWVkaXRvci1jb250ZW50LXdpbGwt
cG9wdWxhdGUiLAogICAgIENvbnRlbnREaWRQb3B1bGF0ZTogInNvdXJjZS1jb2RlLXRleHQtZWRp
dG9yLWNvbnRlbnQtZGlkLXBvcHVsYXRlIgpAQCAtMTA5LDggKzExMiw3IEBAIFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAgICB7CiAgICAgICAgIFdlYkluc3BlY3Rv
ci5UZXh0RWRpdG9yLnByb3RvdHlwZS5zaG93bi5jYWxsKHRoaXMpOwogCi0gICAgICAgIGlmICh0
aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IpCi0gICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5v
dGF0b3IucmVzdW1lKCk7CisgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucmVzdW1lQWxs
KCk7CiAgICAgfSwKIAogICAgIGhpZGRlbjogZnVuY3Rpb24oKQpAQCAtMTIzLDggKzEyNSw3IEBA
IFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAgICAgICAgCiAgICAg
ICAgIHRoaXMuX2Rpc21pc3NFZGl0aW5nQ29udHJvbGxlcih0cnVlKTsKIAotICAgICAgICBpZiAo
dGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yKQotICAgICAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5u
b3RhdG9yLnBhdXNlKCk7CisgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucGF1c2VBbGwo
KTsKICAgICB9LAogCiAgICAgY2xvc2U6IGZ1bmN0aW9uKCkKQEAgLTE2Niw3ICsxNjcsNyBAQCBX
ZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAKICAgICBjYW5TaG93VHlw
ZUFubm90YXRpb25zOiBmdW5jdGlvbigpCiAgICAgewotICAgICAgICByZXR1cm4gISF0aGlzLl90
eXBlVG9rZW5Bbm5vdGF0b3I7CisgICAgICAgIHJldHVybiAhIXRoaXMuX2Fubm90YXRvck1hbmFn
ZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9r
ZW5Bbm5vdGF0b3JLZXkpOwogICAgIH0sCiAKICAgICBjdXN0b21QZXJmb3JtU2VhcmNoOiBmdW5j
dGlvbihxdWVyeSkKQEAgLTI1NywxMiArMjU4LDE5IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2Rl
VGV4dEVkaXRvci5wcm90b3QKICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVkaXRhYmxlTWFya2Vy
cyhyYW5nZSk7CiAgICAgfSwKIAorICAgIGNvbnRlbnRXaWxsQ2hhbmdlOiBmdW5jdGlvbigpCisg
ICAgeworICAgICAgICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmNsZWFyQWxsKCk7CisgICAgICAg
IHRoaXMuX2Fubm90YXRvck1hbmFnZXIucmVtb3ZlQWxsQW5ub3RhdG9ycygpOworICAgIH0sCisK
ICAgICB0b2dnbGVUeXBlQW5ub3RhdGlvbnM6IGZ1bmN0aW9uKCkKICAgICB7Ci0gICAgICAgIGlm
ICghdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yKQorICAgICAgICB2YXIgdHlwZVRva2VuQW5ub3Rh
dG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNv
dXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRvcktleSk7CisgICAgICAgIGlmICgh
dHlwZVRva2VuQW5ub3RhdG9yKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAg
IHZhciBpc0FjdGl2YXRlZCA9IHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci50b2dnbGVUeXBlQW5u
b3RhdGlvbnMoKTsKKyAgICAgICAgdmFyIGlzQWN0aXZhdGVkID0gdHlwZVRva2VuQW5ub3RhdG9y
LnRvZ2dsZVR5cGVBbm5vdGF0aW9ucygpOwogICAgICAgICBpZiAoaXNBY3RpdmF0ZWQpIHsKICAg
ICAgICAgICAgIFJ1bnRpbWVBZ2VudC5lbmFibGVUeXBlUHJvZmlsZXIoKTsKICAgICAgICAgICAg
IHRoaXMuX2VuYWJsZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOwpAQCAtMzAy
LDggKzMxMCw3IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAg
ICB7CiAgICAgICAgIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5wcmV0dHlQcmlu
dC5jYWxsKHRoaXMsIHByZXR0eSk7CiAKLSAgICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFubm90
YXRvciAmJiB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IuaXNBY3RpdmUpCi0gICAgICAgICAgICB0
aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IucmVzZXQoKTsKKyAgICAgICAgdGhpcy5fYW5ub3RhdG9y
TWFuYWdlci5yZXNldEFsbElmQWN0aXZlKCk7CiAgICAgfSwKIAogICAgIC8vIFByaXZhdGUKQEAg
LTQzMiw2ICs0MzksMTAgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3Rv
dAogICAgICAgICB0aGlzLnN0cmluZyA9IGNvbnRlbnQ7CiAKICAgICAgICAgdGhpcy5fbWFrZVR5
cGVUb2tlbkFubm90YXRvcigpOworICAgICAgICB0aGlzLl9tYWtlQmFzaWNCbG9ja0Fubm90YXRv
cigpOworICAgICAgICB2YXIgYmFzaWNCbG9ja0Fubm90YXRvciA9IHRoaXMuX2Fubm90YXRvck1h
bmFnZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5CYXNp
Y0Jsb2NrQW5ub3RhdG9yS2V5KTsKKyAgICAgICAgaWYgKGJhc2ljQmxvY2tBbm5vdGF0b3IpCisg
ICAgICAgICAgICBiYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc3VtZSgpOwogCiAgICAgICAgIHRoaXMu
X2NvbnRlbnREaWRQb3B1bGF0ZSgpOwogICAgIH0sCkBAIC0xMDQyLDE2ICsxMDUzLDE0IEBAIFdl
Ykluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAgICBfZGVidWdnZXJEaWRQ
YXVzZTogZnVuY3Rpb24oZXZlbnQpCiAgICAgewogICAgICAgICB0aGlzLl91cGRhdGVUb2tlblRy
YWNraW5nQ29udHJvbGxlclN0YXRlKCk7Ci0gICAgICAgIGlmICh0aGlzLl90eXBlVG9rZW5Bbm5v
dGF0b3IgJiYgdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yLmlzQWN0aXZlKQotICAgICAgICAgICAg
dGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yLnJlZnJlc2goKTsKKyAgICAgICAgdGhpcy5fYW5ub3Rh
dG9yTWFuYWdlci5yZWZyZXNoQWxsSWZBY3RpdmUoKTsKICAgICB9LAogCiAgICAgX2RlYnVnZ2Vy
RGlkUmVzdW1lOiBmdW5jdGlvbihldmVudCkKICAgICB7CiAgICAgICAgIHRoaXMuX3VwZGF0ZVRv
a2VuVHJhY2tpbmdDb250cm9sbGVyU3RhdGUoKTsKICAgICAgICAgdGhpcy5fZGlzbWlzc1BvcG92
ZXIoKTsKLSAgICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFubm90YXRvciAmJiB0aGlzLl90eXBl
VG9rZW5Bbm5vdGF0b3IuaXNBY3RpdmUpCi0gICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5v
dGF0b3IucmVmcmVzaCgpOworICAgICAgICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLnJlZnJlc2hB
bGxJZkFjdGl2ZSgpOwogICAgIH0sCiAKICAgICBfc291cmNlQ29kZVNvdXJjZU1hcEFkZGVkOiBm
dW5jdGlvbihldmVudCkKQEAgLTEwNjcsNyArMTA3Niw3IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VD
b2RlVGV4dEVkaXRvci5wcm90b3QKICAgICAgICAgdmFyIG1vZGUgPSBXZWJJbnNwZWN0b3IuQ29k
ZU1pcnJvclRva2VuVHJhY2tpbmdDb250cm9sbGVyLk1vZGUuTm9uZTsKICAgICAgICAgaWYgKFdl
Ykluc3BlY3Rvci5kZWJ1Z2dlck1hbmFnZXIucGF1c2VkKQogICAgICAgICAgICAgbW9kZSA9IFdl
Ykluc3BlY3Rvci5Db2RlTWlycm9yVG9rZW5UcmFja2luZ0NvbnRyb2xsZXIuTW9kZS5KYXZhU2Ny
aXB0RXhwcmVzc2lvbjsKLSAgICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZVRva2VuQW5ub3RhdG9y
ICYmIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5pc0FjdGl2ZSkKKyAgICAgICAgZWxzZSBpZiAo
dGhpcy5fYW5ub3RhdG9yTWFuYWdlci5pc0Fubm90YXRvckFjdGl2ZShXZWJJbnNwZWN0b3IuU291
cmNlQ29kZVRleHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9yS2V5KSkKICAgICAgICAgICAgIG1v
ZGUgPSBXZWJJbnNwZWN0b3IuQ29kZU1pcnJvclRva2VuVHJhY2tpbmdDb250cm9sbGVyLk1vZGUu
SmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvbjsKICAgICAgICAgZWxzZSBpZiAodGhpcy5faGFzQ29s
b3JNYXJrZXJzKCkpCiAgICAgICAgICAgICBtb2RlID0gV2ViSW5zcGVjdG9yLkNvZGVNaXJyb3JU
b2tlblRyYWNraW5nQ29udHJvbGxlci5Nb2RlLk1hcmtlZFRva2VuczsKQEAgLTE1MDcsOSArMTUx
NiwxMCBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAKICAgICAg
ICAgLy8gV2UgY2xlYXIgdGhlIG1hcmtlciBzaW5jZSB3ZSdsbCByZXNldCBpdCBhZnRlciBlZGl0
aW5nLgogICAgICAgICBlZGl0aW5nQ29udHJvbGxlci5tYXJrZXIuY2xlYXIoKTsKLSAgICAgICAg
CisKICAgICAgICAgLy8gV2UgaWdub3JlIGNvbnRlbnQgY2hhbmdlcyBtYWRlIGFzIGEgcmVzdWx0
IG9mIGNvbG9yIGVkaXRpbmcuCiAgICAgICAgIHRoaXMuX2lnbm9yZUNvbnRlbnREaWRDaGFuZ2Ur
KzsKKwogICAgIH0sCiAgICAgCiAgICAgZWRpdGluZ0NvbnRyb2xsZXJEaWRGaW5pc2hFZGl0aW5n
OiBmdW5jdGlvbihlZGl0aW5nQ29udHJvbGxlcikKQEAgLTE1MjEsMjggKzE1MzEsNDggQEAgV2Vi
SW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdAogICAgICAgICBkZWxldGUgdGhp
cy5fZWRpdGluZ0NvbnRyb2xsZXI7CiAgICAgfSwKIAotICAgIF9tYWtlVHlwZVRva2VuQW5ub3Rh
dG9yOiBmdW5jdGlvbigpCisgICAgX2dldEFzc29jaWF0ZWRTY3JpcHQ6IGZ1bmN0aW9uKCkKICAg
ICB7Ci0gICAgICAgIGlmICghUnVudGltZUFnZW50LmdldFJ1bnRpbWVUeXBlc0ZvclZhcmlhYmxl
c0F0T2Zmc2V0cykKLSAgICAgICAgICAgIHJldHVybjsKLQogICAgICAgICB2YXIgc2NyaXB0ID0g
bnVsbDsKICAgICAgICAgLy8gRklYTUU6IFRoaXMgbmVlZHMgdG8gbWUgbW9kaWZpZWQgdG8gd29y
ayB3aXRoIEhUTUwgZmlsZXMgd2l0aCBpbmxpbmUgc2NyaXB0IHRhZ3MuCiAgICAgICAgIGlmICh0
aGlzLl9zb3VyY2VDb2RlIGluc3RhbmNlb2YgV2ViSW5zcGVjdG9yLlNjcmlwdCkKICAgICAgICAg
ICAgIHNjcmlwdCA9IHRoaXMuX3NvdXJjZUNvZGU7CiAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3Nv
dXJjZUNvZGUgaW5zdGFuY2VvZiBXZWJJbnNwZWN0b3IuUmVzb3VyY2UgJiYgdGhpcy5fc291cmNl
Q29kZS50eXBlID09PSBXZWJJbnNwZWN0b3IuUmVzb3VyY2UuVHlwZS5TY3JpcHQgJiYgdGhpcy5f
c291cmNlQ29kZS5zY3JpcHRzLmxlbmd0aCkKICAgICAgICAgICAgIHNjcmlwdCA9IHRoaXMuX3Nv
dXJjZUNvZGUuc2NyaXB0c1swXTsKKyAgICAgICAgcmV0dXJuIHNjcmlwdDsKKyAgICB9LAogCisg
ICAgX21ha2VUeXBlVG9rZW5Bbm5vdGF0b3I6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlm
ICghUnVudGltZUFnZW50LmdldFJ1bnRpbWVUeXBlc0ZvclZhcmlhYmxlc0F0T2Zmc2V0cykKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YXIgc2NyaXB0ID0gdGhpcy5fZ2V0QXNzb2Np
YXRlZFNjcmlwdCgpOwogICAgICAgICBpZiAoIXNjcmlwdCkKICAgICAgICAgICAgIHJldHVybjsK
IAotICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IgPSBuZXcgV2ViSW5zcGVjdG9yLlR5
cGVUb2tlbkFubm90YXRvcih0aGlzLCBzY3JpcHQpOworICAgICAgICB2YXIgdHlwZVRva2VuQW5u
b3RhdG9yID0gbmV3IFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IodGhpcywgc2NyaXB0
KTsKKyAgICAgICAgdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5hZGRBbm5vdGF0b3IoV2ViSW5zcGVj
dG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRvcktleSwgdHlwZVRva2Vu
QW5ub3RhdG9yKTsKKwogICAgICAgICBpZiAoV2ViSW5zcGVjdG9yLnNob3dKYXZhU2NyaXB0VHlw
ZUluZm9ybWF0aW9uU2V0dGluZy52YWx1ZSkgewotICAgICAgICAgICAgdGhpcy5fdHlwZVRva2Vu
QW5ub3RhdG9yLnJlc2V0KCk7CisgICAgICAgICAgICB0eXBlVG9rZW5Bbm5vdGF0b3IucmVzZXQo
KTsKICAgICAgICAgICAgIHRoaXMuX2VuYWJsZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tlbkFubm90
YXRvcigpOwogICAgICAgICB9CiAgICAgfSwKIAorICAgIF9tYWtlQmFzaWNCbG9ja0Fubm90YXRv
cjogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKCFSdW50aW1lQWdlbnQuZ2V0QmFzaWNC
bG9ja0xvY2F0aW9ucykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YXIgc2NyaXB0
ID0gdGhpcy5fZ2V0QXNzb2NpYXRlZFNjcmlwdCgpOworICAgICAgICBpZiAoIXNjcmlwdCkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YXIgYmFzaWNCbG9ja0Fubm90YXRvciA9IG5l
dyBXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvcih0aGlzLCBzY3JpcHQpOworICAgICAg
ICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmFkZEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNl
Q29kZVRleHRFZGl0b3IuQmFzaWNCbG9ja0Fubm90YXRvcktleSwgYmFzaWNCbG9ja0Fubm90YXRv
cik7CisgICAgfSwKKwogICAgIF9lbmFibGVTY3JvbGxFdmVudHNGb3JUeXBlVG9rZW5Bbm5vdGF0
b3I6IGZ1bmN0aW9uKCkKICAgICB7CiAgICAgICAgIC8vIFBhdXNlIHVwZGF0aW5nIHR5cGUgdG9r
ZW5zIHdoaWxlIHNjcm9sbGluZyB0byBwcmV2ZW50IGZyYW1lIGxvc3MuCkBAIC0xNTYwLDEwICsx
NTkwLDE1IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKIAogICAg
IF9tYWtlVHlwZVRva2VuU2Nyb2xsRXZlbnRIYW5kbGVyOiBmdW5jdGlvbigpCiAgICAgewotICAg
ICAgICB2YXIgdHlwZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yOwog
ICAgICAgICB2YXIgdGltZW91dElkZW50aWZpZXIgPSBudWxsOwogICAgICAgICBmdW5jdGlvbiBz
Y3JvbGxIYW5kbGVyKCkKICAgICAgICAgeworICAgICAgICAgICAgdmFyIHR5cGVUb2tlbkFubm90
YXRvciA9IHRoaXMuX2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5T
b3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkpOworICAgICAgICAgICAg
aWYgKCF0eXBlVG9rZW5Bbm5vdGF0b3IpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxl
U2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAodGltZW91dElkZW50aWZpZXIp
CiAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZGVudGlmaWVyKTsKICAgICAg
ICAgICAgIGVsc2UKQEAgLTE1NzEsMTEgKzE2MDYsMTMgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNv
ZGVUZXh0RWRpdG9yLnByb3RvdAogCiAgICAgICAgICAgICB0aW1lb3V0SWRlbnRpZmllciA9IHNl
dFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgdGltZW91dElkZW50aWZpZXIg
PSBudWxsOwotICAgICAgICAgICAgICAgIHR5cGVUb2tlbkFubm90YXRvci5yZXN1bWUoKTsKLSAg
ICAgICAgICAgIH0sIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5EdXJhdGlvblRv
VXBkYXRlVHlwZVRva2Vuc0FmdGVyU2Nyb2xsaW5nKTsKKyAgICAgICAgICAgICAgICB2YXIgdHlw
ZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2Vi
SW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRvcktleSk7Cisg
ICAgICAgICAgICAgICAgaWYgKHR5cGVUb2tlbkFubm90YXRvcikKKyAgICAgICAgICAgICAgICAg
ICAgdHlwZVRva2VuQW5ub3RhdG9yLnJlc3VtZSgpOworICAgICAgICAgICAgfS5iaW5kKHRoaXMp
LCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuRHVyYXRpb25Ub1VwZGF0ZVR5cGVU
b2tlbnNBZnRlclNjcm9sbGluZyk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gc2Nyb2xs
SGFuZGxlcjsKKyAgICAgICAgcmV0dXJuIHNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKTsKICAgICB9
CiB9OwogCkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9U
ZXh0RWRpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50
ZXJmYWNlL1ZpZXdzL1RleHRFZGl0b3IuanMJKHJldmlzaW9uIDE3NjgzNikKKysrIFNvdXJjZS9X
ZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RleHRFZGl0b3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTQzLDYgKzQzLDcgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IgPSBmdW5jdGlv
bihlbGVtZQogICAgIH0pOwogCiAgICAgdGhpcy5fY29kZU1pcnJvci5vbigiY2hhbmdlIiwgdGhp
cy5fY29udGVudENoYW5nZWQuYmluZCh0aGlzKSk7CisgICAgdGhpcy5fY29kZU1pcnJvci5vbigi
YmVmb3JlQ2hhbmdlIiwgdGhpcy5fY29udGVudFdpbGxDaGFuZ2UuYmluZCh0aGlzKSk7CiAgICAg
dGhpcy5fY29kZU1pcnJvci5vbigiZ3V0dGVyQ2xpY2siLCB0aGlzLl9ndXR0ZXJNb3VzZURvd24u
YmluZCh0aGlzKSk7CiAgICAgdGhpcy5fY29kZU1pcnJvci5vbigiZ3V0dGVyQ29udGV4dE1lbnUi
LCB0aGlzLl9ndXR0ZXJDb250ZXh0TWVudS5iaW5kKHRoaXMpKTsKICAgICB0aGlzLl9jb2RlTWly
cm9yLmdldFNjcm9sbGVyRWxlbWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5f
b3BlbkNsaWNrZWRMaW5rcy5iaW5kKHRoaXMpLCB0cnVlKTsKQEAgLTQ1MCw2ICs0NTEsMTYgQEAg
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlID0gewogICAgICAgICByZXR1cm4gdGhp
cy5fY29kZU1pcnJvci5nZXRMaW5lKGxpbmVOdW1iZXIpOwogICAgIH0sCiAKKyAgICBnZXRUZXh0
SW5SYW5nZTogZnVuY3Rpb24oc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvci5nZXRSYW5nZShzdGFydFBvc2l0aW9uLCBlbmRQ
b3NpdGlvbik7CisgICAgfSwKKworICAgIGFkZFN0eWxlVG9UZXh0UmFuZ2U6IGZ1bmN0aW9uKHN0
YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBzdHlsZUNsYXNzTmFtZSkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldERvYygpLm1hcmtUZXh0KHN0YXJ0UG9zaXRpb24s
IGVuZFBvc2l0aW9uLCB7Y2xhc3NOYW1lOiBzdHlsZUNsYXNzTmFtZX0pOworICAgIH0sCisKICAg
ICByZXZlYWxQb3NpdGlvbjogZnVuY3Rpb24ocG9zaXRpb24sIHRleHRSYW5nZVRvU2VsZWN0LCBm
b3JjZVVuZm9ybWF0dGVkLCBub0hpZ2hsaWdodCkKICAgICB7CiAgICAgICAgIGNvbnNvbGUuYXNz
ZXJ0KHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gaW5zdGFuY2VvZiBXZWJJbnNw
ZWN0b3IuU291cmNlQ29kZVBvc2l0aW9uLCAicmV2ZWFsUG9zaXRpb24gY2FsbGVkIHdpdGhvdXQg
YSBTb3VyY2VDb2RlUG9zaXRpb24iKTsKQEAgLTYwMyw2ICs2MTQsMTEgQEAgV2ViSW5zcGVjdG9y
LlRleHRFZGl0b3IucHJvdG90eXBlID0gewogICAgICAgICAvLyBJbXBsZW1lbnRlZCBieSBzdWJj
bGFzc2VzLgogICAgIH0sCiAKKyAgICBjb250ZW50V2lsbENoYW5nZTogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgLy8gSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICB9LAorCiAgICAg
cmVjdHNGb3JSYW5nZTogZnVuY3Rpb24ocmFuZ2UpCiAgICAgewogICAgICAgICByZXR1cm4gdGhp
cy5fY29kZU1pcnJvci5yZWN0c0ZvclJhbmdlKHJhbmdlKTsKQEAgLTgxOCw2ICs4MzQsMTEgQEAg
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlID0gewogICAgICAgICByZXR1cm4gIXRo
aXMuX2NvZGVNaXJyb3IuaXNDbGVhbigpOwogICAgIH0sCiAKKyAgICBfY29udGVudFdpbGxDaGFu
Z2U6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuY29udGVudFdpbGxDaGFuZ2UoKTsK
KyAgICB9LAorCiAgICAgX2NvbnRlbnRDaGFuZ2VkOiBmdW5jdGlvbihjb2RlTWlycm9yLCBjaGFu
Z2UpCiAgICAgewogICAgICAgICBpZiAodGhpcy5faWdub3JlQ29kZU1pcnJvckNvbnRlbnREaWRD
aGFuZ2VFdmVudCA+IDApCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>242729</attachid>
            <date>2014-12-06 17:20:48 -0800</date>
            <delta_ts>2015-01-12 15:16:47 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>31104</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL01haW4uaHRtbAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9NYWluLmh0bWwJ
KHJldmlzaW9uIDE3NjgzNikKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNl
L01haW4uaHRtbAkod29ya2luZyBjb3B5KQpAQCAtNDYwLDkgKzQ2MCwxMSBAQAogICAgIDxzY3Jp
cHQgc3JjPSJWaWV3cy9UeXBlVG9rZW5WaWV3LmpzIj48L3NjcmlwdD4KIAogICAgIDxzY3JpcHQg
c3JjPSJDb250cm9sbGVycy9Db2RlTWlycm9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9KYXZhU2NyaXB0QW5ub3RhdG9yLmpzIj48
L3NjcmlwdD4KIAogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9BbmFseXplck1hbmFnZXIu
anMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9BcHBsaWNhdGlvbkNh
Y2hlTWFuYWdlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Jh
c2ljQmxvY2tBbm5vdGF0b3IuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9s
bGVycy9CcmFuY2hNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJv
bGxlcnMvQ1NTU3R5bGVNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29u
dHJvbGxlcnMvQ29kZU1pcnJvckNvbG9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0PgpA
QCAtNDc5LDYgKzQ4MSw3IEBACiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Zvcm1hdHRl
clNvdXJjZU1hcC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Zy
YW1lUmVzb3VyY2VNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJv
bGxlcnMvSXNzdWVNYW5hZ2VyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iQ29udHJv
bGxlcnMvSmF2YVNjcmlwdEFubm90YXRvck1hbmFnZXIuanMiPjwvc2NyaXB0PgogICAgIDxzY3Jp
cHQgc3JjPSJDb250cm9sbGVycy9KYXZhU2NyaXB0TG9nVmlld0NvbnRyb2xsZXIuanMiPjwvc2Ny
aXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9KYXZhU2NyaXB0UnVudGltZUNvbXBs
ZXRpb25Qcm92aWRlci5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJz
L0xheWVyVHJlZU1hbmFnZXIuanMiPjwvc2NyaXB0PgpJbmRleDogU291cmNlL1dlYkluc3BlY3Rv
clVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVy
cy9CYXNpY0Jsb2NrQW5ub3RhdG9yLmpzCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkluc3Bl
Y3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQg
U2FhbSBCYXJhdGkgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworV2ViSW5zcGVj
dG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IgPSBmdW5jdGlvbihzb3VyY2VDb2RlVGV4dEVkaXRvciwg
c2NyaXB0KQoreworICAgIFdlYkluc3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yLmNhbGwodGhp
cywgc291cmNlQ29kZVRleHRFZGl0b3IsIHNjcmlwdCk7CisKKyAgICB0aGlzLl9oaWdobGlnaHRN
YXJrZXJzID0gW107CisgICAgdGhpcy5fbGluZURlc2NyaXB0aW9ucyA9IFtdOworfTsKKworV2Vi
SW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWUgPSAi
YmFzaWMtYmxvY2staGFzLW5vdC1leGVjdXRlZCI7CisKK1dlYkluc3BlY3Rvci5CYXNpY0Jsb2Nr
QW5ub3RhdG9yLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkJh
c2ljQmxvY2tBbm5vdGF0b3IsCisgICAgX19wcm90b19fOiBXZWJJbnNwZWN0b3IuSmF2YVNjcmlw
dEFubm90YXRvci5wcm90b3R5cGUsCisKKyAgICAvLyBQcm90ZWN0ZWQKKworICAgIGNsZWFyQW5u
b3RhdGlvbnM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGZvciAodmFyIGxpbmVEZXNjcmlw
dGlvbiBvZiB0aGlzLl9saW5lRGVzY3JpcHRpb25zKQorICAgICAgICAgICAgdGhpcy5fc291cmNl
Q29kZVRleHRFZGl0b3IucmVtb3ZlU3R5bGVDbGFzc0Zyb21MaW5lKGxpbmVEZXNjcmlwdGlvbi5s
aW5lTnVtYmVyLCBsaW5lRGVzY3JpcHRpb24uY2xhc3NOYW1lKTsKKyAgICAgICAgdGhpcy5fbGlu
ZURlc2NyaXB0aW9ucyA9IFtdOworCisgICAgICAgIGZvciAodmFyIG1hcmtlciBvZiB0aGlzLl9o
aWdobGlnaHRNYXJrZXJzKQorICAgICAgICAgICAgbWFya2VyLmNsZWFyKCk7CisgICAgICAgIHRo
aXMuX2hpZ2hsaWdodE1hcmtlcnMgPSBbXTsKKyAgICB9LAorCisgICAgaW5zZXJ0QW5ub3RhdGlv
bnM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5faXNBY3RpdmUpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMuX2Fubm90YXRlQmFzaWNCbG9ja0V4ZWN1dGlv
blJhbmdlcygpOworICAgIH0sCisKKyAgICAvLyBQcml2YXRlCisKKyAgICBfYW5ub3RhdGVCYXNp
Y0Jsb2NrRXhlY3V0aW9uUmFuZ2VzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIgc291
cmNlSUQgPSB0aGlzLl9zY3JpcHQuaWQ7CisKKyAgICAgICAgUnVudGltZUFnZW50LmdldEJhc2lj
QmxvY2tMb2NhdGlvbnMoc291cmNlSUQsIGZ1bmN0aW9uKGVycm9yLCBiYXNpY0Jsb2Nrcykgewor
ICAgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVy
cm9yIGluIGdldHRpbmcgYmFzaWMgYmxvY2sgbG9jYXRpb25zLiIpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0FjdGl2
ZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRoaXMuY2xlYXJBbm5v
dGF0aW9ucygpOworCisgICAgICAgICAgICBmb3IgKHZhciBibG9jayBvZiBiYXNpY0Jsb2NrcykK
KyAgICAgICAgICAgICAgICB0aGlzLl9oaWdobGlnaHRUZXh0Rm9yQmFzaWNCbG9jayhibG9jayk7
CisKKyAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gc2V0VGltZW91dCh0aGlz
Lmluc2VydEFubm90YXRpb25zLmJpbmQodGhpcyksIDQwMDApOworCisgICAgICAgIH0uYmluZCh0
aGlzKSk7CisgICAgfSwKKworICAgIF9oaWdobGlnaHRUZXh0Rm9yQmFzaWNCbG9jazogZnVuY3Rp
b24oYmFzaWNCbG9jaykKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5LCB0aGUg
YmFjayBlbmQgZGF0YSBzaG91bGRuJ3QgZ2l2ZSB1cyB0aGVzZSBiYWQgcmFuZ2VzLgorICAgICAg
ICBpZiAoYmFzaWNCbG9jay5zdGFydE9mZnNldCA+IGJhc2ljQmxvY2suZW5kT2Zmc2V0IHx8IGJh
c2ljQmxvY2suc3RhcnRPZmZzZXQgPCAwIHx8IGJhc2ljQmxvY2suZW5kT2Zmc2V0IDwgMCkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGJhc2ljQmxvY2suaGFzRXhlY3V0ZWQpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSB0aGlzLl9z
b3VyY2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3VycmVudFBvc2l0aW9uKGJhc2lj
QmxvY2suc3RhcnRPZmZzZXQpOworICAgICAgICB2YXIgZW5kUG9zaXRpb24gPSB0aGlzLl9zb3Vy
Y2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3VycmVudFBvc2l0aW9uKGJhc2ljQmxv
Y2suZW5kT2Zmc2V0KTsKKworICAgICAgICBpZiAodGhpcy5fc2hvdWxkU2tpcEJhc2ljQmxvY2so
c3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIHZhciBtYXJrZXIgPSB0aGlzLl9zb3VyY2VDb2RlVGV4dEVkaXRvci5hZGRTdHlsZVRvVGV4
dFJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBXZWJJbnNwZWN0b3IuQmFzaWNCbG9j
a0Fubm90YXRvci5IYXNOb3RFeGVjdXRlZENsYXNzTmFtZSk7CisgICAgICAgIHRoaXMuX2hpZ2hs
aWdodE1hcmtlcnMucHVzaChtYXJrZXIpOworCisgICAgICAgIGlmIChlbmRQb3NpdGlvbi5saW5l
ID4gc3RhcnRQb3NpdGlvbi5saW5lKSB7CisgICAgICAgICAgICB2YXIgc3RhcnRMaW5lRW5kUG9z
aXRpb24gPSB7IGxpbmU6IHN0YXJ0UG9zaXRpb24ubGluZSwgY2g6IHRoaXMuX3NvdXJjZUNvZGVU
ZXh0RWRpdG9yLmxpbmUoc3RhcnRQb3NpdGlvbi5saW5lKS5sZW5ndGggfTsKKyAgICAgICAgICAg
IGlmICh0aGlzLl9jYW5HcmF5T3V0RW50aXJlTGluZShzdGFydFBvc2l0aW9uLmxpbmUsIHN0YXJ0
UG9zaXRpb24sIHN0YXJ0TGluZUVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICB0aGlzLl9n
cmF5T3V0TGluZShzdGFydFBvc2l0aW9uLmxpbmUpOworCisgICAgICAgICAgICB2YXIgZW5kTGlu
ZVN0YXJ0UG9zaXRpb24gPSB7IGxpbmU6IGVuZFBvc2l0aW9uLmxpbmUsIGNoOiAwIH07CisgICAg
ICAgICAgICBpZiAodGhpcy5fY2FuR3JheU91dEVudGlyZUxpbmUoZW5kUG9zaXRpb24ubGluZSwg
ZW5kTGluZVN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICB0aGlz
Ll9ncmF5T3V0TGluZShlbmRQb3NpdGlvbi5saW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIGlmICh0aGlzLl9jYW5HcmF5T3V0RW50aXJlTGluZShzdGFydFBvc2l0aW9uLmxpbmUs
IHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICB0aGlzLl9ncmF5
T3V0TGluZShzdGFydFBvc2l0aW9uLmxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVu
ZFBvc2l0aW9uLmxpbmUgLSBzdGFydFBvc2l0aW9uLmxpbmUgPiAxKSB7CisgICAgICAgICAgICBm
b3IgKHZhciBsaW5lTnVtYmVyID0gc3RhcnRQb3NpdGlvbi5saW5lICsgMTsgbGluZU51bWJlciA8
IGVuZFBvc2l0aW9uLmxpbmU7IGxpbmVOdW1iZXIrKykKKyAgICAgICAgICAgICAgICB0aGlzLl9n
cmF5T3V0TGluZShsaW5lTnVtYmVyKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBfc2hvdWxk
U2tpcEJhc2ljQmxvY2s6IGZ1bmN0aW9uKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKQorICAg
IHsKKyAgICAgICAgdmFyIGlzT25seVdoaXRlc3BhY2UgPSAvXlxzKyQvOworICAgICAgICByZXR1
cm4gaXNPbmx5V2hpdGVzcGFjZS50ZXN0KHRoaXMuX3NvdXJjZUNvZGVUZXh0RWRpdG9yLmdldFRl
eHRJblJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSk7CisgICAgfSwKKworICAgIF9j
YW5HcmF5T3V0RW50aXJlTGluZTogZnVuY3Rpb24obGluZU51bWJlciwgc3RhcnRQb3NpdGlvbiwg
ZW5kUG9zaXRpb24pCisgICAgeworICAgICAgICB2YXIgbGluZVRleHQgPSB0aGlzLl9zb3VyY2VD
b2RlVGV4dEVkaXRvci5saW5lKGxpbmVOdW1iZXIpOworICAgICAgICB2YXIgYmxvY2tUZXh0ID0g
dGhpcy5fc291cmNlQ29kZVRleHRFZGl0b3IuZ2V0VGV4dEluUmFuZ2Uoc3RhcnRQb3NpdGlvbiwg
ZW5kUG9zaXRpb24pOworICAgICAgICBsaW5lVGV4dCA9IGxpbmVUZXh0LnJlcGxhY2UoL1xzL2cs
ICIiKTsKKyAgICAgICAgYmxvY2tUZXh0ID0gYmxvY2tUZXh0LnJlcGxhY2UoL1xzL2csICIiKTsK
KyAgICAgICAgaWYgKGxpbmVUZXh0ID09PSBibG9ja1RleHQpCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICBfZ3JheU91dExpbmU6
IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCisgICAgeworICAgICAgICB2YXIgY2xhc3NOYW1lID0gV2Vi
SW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWU7Cisg
ICAgICAgIHRoaXMuX3NvdXJjZUNvZGVUZXh0RWRpdG9yLmFkZFN0eWxlQ2xhc3NUb0xpbmUobGlu
ZU51bWJlciwgY2xhc3NOYW1lKTsKKyAgICAgICAgdmFyIGxpbmVEZXNjcmlwdGlvbiA9IHtsaW5l
TnVtYmVyOiBsaW5lTnVtYmVyLCBjbGFzc05hbWU6IGNsYXNzTmFtZX07CisgICAgICAgIHRoaXMu
X2xpbmVEZXNjcmlwdGlvbnMucHVzaChsaW5lRGVzY3JpcHRpb24pOworICAgIH0KK307CkluZGV4
OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9KYXZhU2Ny
aXB0QW5ub3RhdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2Vy
SW50ZXJmYWNlL0NvbnRyb2xsZXJzL0phdmFTY3JpcHRBbm5vdGF0b3IuanMJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9KYXZh
U2NyaXB0QW5ub3RhdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAxNCBTYWFtIEJhcmF0aSA8c2FhbWJhcmF0aTFAZ21haWwuY29tPgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCitXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEFubm90YXRvciA9IGZ1bmN0aW9uKHNv
dXJjZUNvZGVUZXh0RWRpdG9yLCBzY3JpcHQpCit7CisgICAgV2ViSW5zcGVjdG9yLk9iamVjdC5j
YWxsKHRoaXMpOworCisgICAgY29uc29sZS5hc3NlcnQoc291cmNlQ29kZVRleHRFZGl0b3IgJiYg
c291cmNlQ29kZVRleHRFZGl0b3IgaW5zdGFuY2VvZiBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRl
eHRFZGl0b3IsIHNvdXJjZUNvZGVUZXh0RWRpdG9yKTsKKyAgICBjb25zb2xlLmFzc2VydChzY3Jp
cHQsIHNjcmlwdCk7CisKKyAgICB0aGlzLl9zY3JpcHQgPSBzY3JpcHQ7CisgICAgdGhpcy5fc291
cmNlQ29kZVRleHRFZGl0b3IgPSBzb3VyY2VDb2RlVGV4dEVkaXRvcjsKKyAgICB0aGlzLl90aW1l
b3V0SWRlbnRpZmllciA9IG51bGw7CisgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTsKK307CisK
K1dlYkluc3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yLnByb3RvdHlwZSA9IHsKKyAgICBjb25z
dHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkphdmFTY3JpcHRBbm5vdGF0b3IsCisgICAgX19wcm90b19f
OiBXZWJJbnNwZWN0b3IuT2JqZWN0LnByb3RvdHlwZSwKKworICAgIC8vIFB1YmxpYworCisgICAg
Z2V0IHNvdXJjZUNvZGVUZXh0RWRpdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9z
b3VyY2VDb2RlVGV4dEVkaXRvcjsKKyAgICB9LAorCisgICAgZ2V0IGlzQWN0aXZlKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTsKKyAgICB9LAorCisgICAgcGF1c2U6IGZ1
bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX2NsZWFyVGltZW91dElmTmVlZGVkKCk7Cisg
ICAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7CisgICAgfSwKKworICAgIHJlc3VtZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0SWZOZWVkZWQoKTsKKyAg
ICAgICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlOworICAgICAgICB0aGlzLmluc2VydEFubm90YXRp
b25zKCk7CisgICAgfSwKKworICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IGNvbnNvbGUuYXNzZXJ0KHRoaXMuX2lzQWN0aXZlKTsKKyAgICAgICAgaWYgKCF0aGlzLl9pc0Fj
dGl2ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRJ
Zk5lZWRlZCgpOworICAgICAgICB0aGlzLmluc2VydEFubm90YXRpb25zKCk7CisgICAgfSwKKwor
ICAgIHJlc2V0OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRJ
Zk5lZWRlZCgpOworICAgICAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7CisgICAgICAgIHRoaXMu
Y2xlYXJBbm5vdGF0aW9ucygpOworICAgICAgICB0aGlzLmluc2VydEFubm90YXRpb25zKCk7Cisg
ICAgfSwKKworICAgIGNsZWFyOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLnBhdXNl
KCk7CisgICAgICAgIHRoaXMuY2xlYXJBbm5vdGF0aW9ucygpOworICAgIH0sCisKKyAgICAvLyBQ
cm90ZWN0ZWQKKworICAgIGluc2VydEFubm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICAvLyBJbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgorICAgIH0sCisKKyAgICBjbGVhckFu
bm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICAvLyBJbXBsZW1lbnRlZCBieSBz
dWJjbGFzc2VzLgorICAgIH0sCisKKyAgICAvLyBQcml2YXRlCisKKyAgICBfY2xlYXJUaW1lb3V0
SWZOZWVkZWQ6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl90aW1lb3V0SWRl
bnRpZmllcikgeworICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZGVudGlm
aWVyKTsKKyAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKKyAgICAg
ICAgfQorICAgIH0KK307CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFj
ZS9Db250cm9sbGVycy9KYXZhU2NyaXB0QW5ub3RhdG9yTWFuYWdlci5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9KYXZhU2Ny
aXB0QW5ub3RhdG9yTWFuYWdlci5qcwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJJbnNwZWN0
b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL0phdmFTY3JpcHRBbm5vdGF0b3JNYW5hZ2Vy
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAxNCBTYWFtIEJhcmF0aSA8c2FhbWJhcmF0aTFAZ21haWwuY29tPgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJ
bnNwZWN0b3IuSmF2YVNjcmlwdEFubm90YXRvck1hbmFnZXIgPSBmdW5jdGlvbigpCit7CisgICAg
V2ViSW5zcGVjdG9yLk9iamVjdC5jYWxsKHRoaXMpOworCisgICAgdGhpcy5fYW5ub3RhdG9ycyA9
IHt9OworfTsKKworV2ViSW5zcGVjdG9yLkphdmFTY3JpcHRBbm5vdGF0b3JNYW5hZ2VyLnByb3Rv
dHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkphdmFTY3JpcHRBbm5vdGF0
b3JNYW5hZ2VyLAorICAgIF9fcHJvdG9fXzogV2ViSW5zcGVjdG9yLk9iamVjdC5wcm90b3R5cGUs
CisKKyAgICAvLyBQdWJsaWMKKworICAgIGFkZEFubm90YXRvcjogZnVuY3Rpb24oa2V5LCBhbm5v
dGF0b3IpCisgICAgeworICAgICAgICB0aGlzLl9hbm5vdGF0b3JzW2tleV0gPSBhbm5vdGF0b3I7
CisgICAgfSwKKworICAgIGdldEFubm90YXRvcjogZnVuY3Rpb24oa2V5KQorICAgIHsKKyAgICAg
ICAgdmFyIGFubm90YXRvciA9IHRoaXMuX2Fubm90YXRvcnNba2V5XTsKKyAgICAgICAgcmV0dXJu
IGFubm90YXRvciA/IGFubm90YXRvciA6IG51bGw7CisgICAgfSwKKworICAgIGlzQW5ub3RhdG9y
QWN0aXZlOiBmdW5jdGlvbihrZXkpCisgICAgeworICAgICAgICB2YXIgYW5ub3RhdG9yID0gdGhp
cy5nZXRBbm5vdGF0b3Ioa2V5KTsKKyAgICAgICAgaWYgKCFhbm5vdGF0b3IpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBhbm5vdGF0b3IuaXNBY3RpdmU7CisgICAg
fSwKKworICAgIHBhdXNlQWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBmb3IgKGFubm90
YXRvciBvZiB0aGlzLl9nZXRBbm5vdGF0b3JzKCkpCisgICAgICAgICAgICBhbm5vdGF0b3IucGF1
c2UoKTsKKyAgICB9LAorCisgICAgcmVzdW1lQWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAg
ICBmb3IgKGFubm90YXRvciBvZiB0aGlzLl9nZXRBbm5vdGF0b3JzKCkpCisgICAgICAgICAgICBh
bm5vdGF0b3IucmVzdW1lKCk7CisgICAgfSwKKworICAgIHJlZnJlc2hBbGxJZkFjdGl2ZTogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgZm9yIChhbm5vdGF0b3Igb2YgdGhpcy5fZ2V0QW5ub3Rh
dG9ycygpKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdG9yLmlzQWN0aXZlKQorICAgICAgICAg
ICAgICAgIGFubm90YXRvci5yZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgcmVz
ZXRBbGxJZkFjdGl2ZTogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgZm9yIChhbm5vdGF0b3Ig
b2YgdGhpcy5fZ2V0QW5ub3RhdG9ycygpKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdG9yLmlz
QWN0aXZlKQorICAgICAgICAgICAgICAgIGFubm90YXRvci5yZXNldCgpOworICAgICAgICB9Cisg
ICAgfSwKKworICAgIGNsZWFyQWxsOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBmb3IgKGFu
bm90YXRvciBvZiB0aGlzLl9nZXRBbm5vdGF0b3JzKCkpCisgICAgICAgICAgICBhbm5vdGF0b3Iu
Y2xlYXIoKTsKKyAgICB9LAorCisgICAgcmVtb3ZlQWxsQW5ub3RhdG9yczogZnVuY3Rpb24oKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fYW5ub3RhdG9ycyA9IHt9OworICAgIH0sCisKKyAgICAvLyBQ
cml2YXRlCisKKyAgICBfZ2V0QW5ub3RhdG9yczogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2Fubm90YXRvcnMpLm1hcChmdW5jdGlvbihrZXkpIHsg
cmV0dXJuIHRoaXMuX2Fubm90YXRvcnNba2V5XTsgfSwgdGhpcyk7CisgICAgfQorfTsKSW5kZXg6
IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1R5cGVUb2tl
bkFubm90YXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9Db250cm9sbGVycy9UeXBlVG9rZW5Bbm5vdGF0b3IuanMJKHJldmlzaW9uIDE3Njgz
NikKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1R5
cGVUb2tlbkFubm90YXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMjUsNjYgKzI1LDE4IEBACiAK
IFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IgPSBmdW5jdGlvbihzb3VyY2VDb2RlVGV4
dEVkaXRvciwgc2NyaXB0KQogewotICAgIFdlYkluc3BlY3Rvci5PYmplY3QuY2FsbCh0aGlzKTsK
KyAgICBXZWJJbnNwZWN0b3IuSmF2YVNjcmlwdEFubm90YXRvci5jYWxsKHRoaXMsIHNvdXJjZUNv
ZGVUZXh0RWRpdG9yLCBzY3JpcHQpOwogCi0gICAgY29uc29sZS5hc3NlcnQoc291cmNlQ29kZVRl
eHRFZGl0b3IgJiYgc291cmNlQ29kZVRleHRFZGl0b3IgaW5zdGFuY2VvZiBXZWJJbnNwZWN0b3Iu
U291cmNlQ29kZVRleHRFZGl0b3IsIHNvdXJjZUNvZGVUZXh0RWRpdG9yKTsKLSAgICBjb25zb2xl
LmFzc2VydChzY3JpcHQsIHNjcmlwdCk7Ci0KLSAgICB0aGlzLl9zY3JpcHQgPSBzY3JpcHQ7Ci0g
ICAgdGhpcy5fc291cmNlQ29kZVRleHRFZGl0b3IgPSBzb3VyY2VDb2RlVGV4dEVkaXRvcjsKICAg
ICB0aGlzLl90eXBlVG9rZW5Ob2RlcyA9IFtdOwogICAgIHRoaXMuX3R5cGVUb2tlbkJvb2ttYXJr
cyA9IFtdOwotICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKLSAgICB0aGlzLl9p
c0FjdGl2ZSA9IGZhbHNlOwogfTsKIAogV2ViSW5zcGVjdG9yLlR5cGVUb2tlbkFubm90YXRvci5w
cm90b3R5cGUgPSB7CiAgICAgY29uc3RydWN0b3I6IFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5v
dGF0b3IsCi0gICAgX19wcm90b19fOiBXZWJJbnNwZWN0b3IuT2JqZWN0LnByb3RvdHlwZSwKKyAg
ICBfX3Byb3RvX186IFdlYkluc3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yLnByb3RvdHlwZSwK
IAogICAgIC8vIFB1YmxpYwogCi0gICAgZ2V0IGlzQWN0aXZlKCkKLSAgICB7Ci0gICAgICAgIHJl
dHVybiB0aGlzLl9pc0FjdGl2ZTsKLSAgICB9LAotCi0gICAgZ2V0IHNvdXJjZUNvZGVUZXh0RWRp
dG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlVGV4dEVkaXRvcjsK
LSAgICB9LAotCi0gICAgcGF1c2U6IGZ1bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2Ns
ZWFyVGltZW91dElmTmVlZGVkKCk7Ci0gICAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7Ci0g
ICAgfSwKLQotICAgIHJlc3VtZTogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5fY2xl
YXJUaW1lb3V0SWZOZWVkZWQoKTsKLSAgICAgICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlOwotICAg
ICAgICB0aGlzLl9pbnNlcnRBbm5vdGF0aW9ucygpOwotICAgIH0sCi0KLSAgICByZWZyZXNoOiBm
dW5jdGlvbigpCi0gICAgewotICAgICAgICBjb25zb2xlLmFzc2VydCh0aGlzLl9pc0FjdGl2ZSk7
Ci0gICAgICAgIGlmICghdGhpcy5faXNBY3RpdmUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0SWZOZWVkZWQoKTsKLSAgICAgICAgdGhpcy5faW5zZXJ0
QW5ub3RhdGlvbnMoKTsKLSAgICB9LAotCi0gICAgcmVzZXQ6IGZ1bmN0aW9uKCkKLSAgICB7Ci0g
ICAgICAgIHRoaXMuX2NsZWFyVGltZW91dElmTmVlZGVkKCk7Ci0gICAgICAgIHRoaXMuX2lzQWN0
aXZlID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5fY2xlYXJUeXBlVG9rZW5zKCk7Ci0gICAgICAgIHRo
aXMuX2luc2VydEFubm90YXRpb25zKCk7Ci0gICAgfSwKLQogICAgIHRvZ2dsZVR5cGVBbm5vdGF0
aW9uczogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7CkBA
IC05OCw5ICs1MCw5IEBAIFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IucHJvdG90eXAK
ICAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlOwogICAgIH0sCiAKLSAgICAvLyBQcml2YXRl
CisgICAgLy8gUHJvdGVjdGVkCiAKLSAgICBfaW5zZXJ0QW5ub3RhdGlvbnM6IGZ1bmN0aW9uKCkK
KyAgICBpbnNlcnRBbm5vdGF0aW9uczogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgaWYgKCF0
aGlzLl9pc0FjdGl2ZSkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTExMSw3ICs2Myw3IEBAIFdl
Ykluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IucHJvdG90eXAKICAgICAgICAgICAgIHRoaXMu
X3NjcmlwdC5yZXF1ZXN0U2NyaXB0U3ludGF4VHJlZShmdW5jdGlvbihzeW50YXhUcmVlKSB7CiAg
ICAgICAgICAgICAgICAgLy8gQWZ0ZXIgcmVxdWVzdGluZyB0aGUgdHJlZSwgd2Ugc3RpbGwgbWln
aHQgZ2V0IGEgbnVsbCB0cmVlIGZyb20gYSBwYXJzZSBlcnJvci4KICAgICAgICAgICAgICAgICBp
ZiAoc3ludGF4VHJlZSkKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0QW5ub3RhdGlv
bnMoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRBbm5vdGF0aW9ucygpOwogICAg
ICAgICAgICAgfS5iaW5kKHRoaXMpKTsKIAogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTM3LDEx
ICs4OSwxOCBAQCBXZWJJbnNwZWN0b3IuVHlwZVRva2VuQW5ub3RhdG9yLnByb3RvdHlwCiAKICAg
ICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVyID0gc2V0VGltZW91dChmdW5jdGlvbiB0
aW1lb3V0VXBkYXRlKCkgewogICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZGVudGlmaWVy
ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aGlzLl9pbnNlcnRBbm5vdGF0aW9ucygpOworICAg
ICAgICAgICAgICAgIHRoaXMuaW5zZXJ0QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgIH0uYmlu
ZCh0aGlzKSwgdGltZW91dFRpbWUpOwogICAgICAgICB9LmJpbmQodGhpcykpOwogICAgIH0sCiAK
KyAgICBjbGVhckFubm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLl9j
bGVhclR5cGVUb2tlbnMoKTsKKyAgICB9LAorCisgICAgLy8gUHJpdmF0ZQorCiAgICAgX2luc2Vy
dFR5cGVUb2tlbnNGb3JFYWNoTm9kZTogZnVuY3Rpb24obm9kZSkKICAgICB7CiAgICAgICAgIHZh
ciBzY3JpcHRTeW50YXhUcmVlID0gdGhpcy5fc2NyaXB0Ll9zY3JpcHRTeW50YXhUcmVlOwpAQCAt
MjcxLDEzICsyMzAsNSBAQCBXZWJJbnNwZWN0b3IuVHlwZVRva2VuQW5ub3RhdG9yLnByb3RvdHlw
CiAKICAgICAgICAgdGhpcy5fdHlwZVRva2VuTm9kZXMgPSBbXTsKICAgICAgICAgdGhpcy5fdHlw
ZVRva2VuQm9va21hcmtzID0gW107Ci0gICAgfSwKLQotICAgIF9jbGVhclRpbWVvdXRJZk5lZWRl
ZDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXRJZGVudGlmaWVy
KSB7Ci0gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dElkZW50aWZpZXIpOwot
ICAgICAgICAgICAgdGhpcy5fdGltZW91dElkZW50aWZpZXIgPSBudWxsOwotICAgICAgICB9CiAg
ICAgfQogfTsKSW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdz
L1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVj
dG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5jc3MJKHJldmlz
aW9uIDE3NjgzNikKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdz
L1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzcwkod29ya2luZyBjb3B5KQpAQCAtNzYsMyArNzYsNyBA
QAogCiAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKIH0KKworLmJhc2lj
LWJsb2NrLWhhcy1ub3QtZXhlY3V0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDAs
IDI0MCwgMjQwKTsKK30KSW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNl
L1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJ
bnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmpzCShy
ZXZpc2lvbiAxNzY4MzYpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9W
aWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMzYsOCArMzYs
OCBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IgPSBmdW5jCiAKICAgICBXZWJJ
bnNwZWN0b3IuVGV4dEVkaXRvci5jYWxsKHRoaXMsIG51bGwsIG51bGwsIHRoaXMpOwogCi0gICAg
dGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yID0gbnVsbDsKICAgICB0aGlzLl90eXBlVG9rZW5TY3Jv
bGxIYW5kbGVyID0gbnVsbDsKKyAgICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyID0gbmV3IFdlYklu
c3BlY3Rvci5KYXZhU2NyaXB0QW5ub3RhdG9yTWFuYWdlcjsKIAogICAgIC8vIEZJWE1FOiBDdXJy
ZW50bHkgdGhpcyBqdXN0IGp1bXBzIGJldHdlZW4gcmVzb3VyY2VzIGFuZCByZWxhdGVkIHNvdXJj
ZSBtYXAgcmVzb3VyY2VzLiBJdCBkb2Vzbid0ICJqdW1wIHRvIHN5bWJvbCIgeWV0LgogICAgIHRo
aXMuX3VwZGF0ZVRva2VuVHJhY2tpbmdDb250cm9sbGVyU3RhdGUoKTsKQEAgLTkwLDYgKzkwLDkg
QEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkR1cmF0aQogCiBXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IuQXV0b0Zvcm1hdE1pbmltdW1MaW5lTGVuZ3RoID0gNTAw
OwogCitXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9y
S2V5ID0gIlR5cGVUb2tlbkFubm90YXRvcktleSI7CitXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRl
eHRFZGl0b3IuQmFzaWNCbG9ja0Fubm90YXRvcktleSA9ICJCYXNpY0Jsb2NrQW5ub3RhdG9yS2V5
IjsKKwogV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkV2ZW50ID0gewogICAgIENv
bnRlbnRXaWxsUG9wdWxhdGU6ICJzb3VyY2UtY29kZS10ZXh0LWVkaXRvci1jb250ZW50LXdpbGwt
cG9wdWxhdGUiLAogICAgIENvbnRlbnREaWRQb3B1bGF0ZTogInNvdXJjZS1jb2RlLXRleHQtZWRp
dG9yLWNvbnRlbnQtZGlkLXBvcHVsYXRlIgpAQCAtMTA5LDggKzExMiw3IEBAIFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAgICB7CiAgICAgICAgIFdlYkluc3BlY3Rv
ci5UZXh0RWRpdG9yLnByb3RvdHlwZS5zaG93bi5jYWxsKHRoaXMpOwogCi0gICAgICAgIGlmICh0
aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IpCi0gICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5v
dGF0b3IucmVzdW1lKCk7CisgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucmVzdW1lQWxs
KCk7CiAgICAgfSwKIAogICAgIGhpZGRlbjogZnVuY3Rpb24oKQpAQCAtMTIzLDggKzEyNSw3IEBA
IFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAgICAgICAgCiAgICAg
ICAgIHRoaXMuX2Rpc21pc3NFZGl0aW5nQ29udHJvbGxlcih0cnVlKTsKIAotICAgICAgICBpZiAo
dGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yKQotICAgICAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5u
b3RhdG9yLnBhdXNlKCk7CisgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucGF1c2VBbGwo
KTsKICAgICB9LAogCiAgICAgY2xvc2U6IGZ1bmN0aW9uKCkKQEAgLTE2Niw3ICsxNjcsNyBAQCBX
ZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAKICAgICBjYW5TaG93VHlw
ZUFubm90YXRpb25zOiBmdW5jdGlvbigpCiAgICAgewotICAgICAgICByZXR1cm4gISF0aGlzLl90
eXBlVG9rZW5Bbm5vdGF0b3I7CisgICAgICAgIHJldHVybiAhIXRoaXMuX2Fubm90YXRvck1hbmFn
ZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9r
ZW5Bbm5vdGF0b3JLZXkpOwogICAgIH0sCiAKICAgICBjdXN0b21QZXJmb3JtU2VhcmNoOiBmdW5j
dGlvbihxdWVyeSkKQEAgLTI1NSwxNCArMjU2LDM0IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2Rl
VGV4dEVkaXRvci5wcm90b3QKIAogICAgICAgICBmb3IgKHZhciByYW5nZSBvZiBuZXdSYW5nZXMp
CiAgICAgICAgICAgICB0aGlzLl91cGRhdGVFZGl0YWJsZU1hcmtlcnMocmFuZ2UpOworCisgICAg
ICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIuY2xlYXJBbGwoKTsKKyAgICAgICAgdGhpcy5fYW5u
b3RhdG9yTWFuYWdlci5yZW1vdmVBbGxBbm5vdGF0b3JzKCk7CisgICAgICAgIGlmICh0aGlzLl90
eXBlVG9rZW5TY3JvbGxIYW5kbGVyKQorICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEV2
ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOworICAgIH0sCisKKyAgICBnYWluZWRGb2N1czog
ZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdmFyIGJhc2ljQmxvY2tBbm5vdGF0b3IgPSB0aGlz
Ll9hbm5vdGF0b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRl
eHRFZGl0b3IuQmFzaWNCbG9ja0Fubm90YXRvcktleSk7CisgICAgICAgIGlmIChiYXNpY0Jsb2Nr
QW5ub3RhdG9yKQorICAgICAgICAgICAgYmFzaWNCbG9ja0Fubm90YXRvci5jbGVhcigpOworICAg
IH0sCisKKyAgICBsb3N0Rm9jdXM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHZhciBiYXNp
Y0Jsb2NrQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2Vi
SW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3JLZXkpOwor
ICAgICAgICBpZiAoYmFzaWNCbG9ja0Fubm90YXRvcikKKyAgICAgICAgICAgIGJhc2ljQmxvY2tB
bm5vdGF0b3IucmVzdW1lKCk7CiAgICAgfSwKIAogICAgIHRvZ2dsZVR5cGVBbm5vdGF0aW9uczog
ZnVuY3Rpb24oKQogICAgIHsKLSAgICAgICAgaWYgKCF0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3Ip
CisgICAgICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSB0aGlzLl9hbm5vdGF0b3JNYW5hZ2Vy
LmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuVHlwZVRva2Vu
QW5ub3RhdG9yS2V5KTsKKyAgICAgICAgaWYgKCF0eXBlVG9rZW5Bbm5vdGF0b3IpCiAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgdmFyIGlzQWN0aXZhdGVkID0gdGhpcy5fdHlw
ZVRva2VuQW5ub3RhdG9yLnRvZ2dsZVR5cGVBbm5vdGF0aW9ucygpOworICAgICAgICB2YXIgaXNB
Y3RpdmF0ZWQgPSB0eXBlVG9rZW5Bbm5vdGF0b3IudG9nZ2xlVHlwZUFubm90YXRpb25zKCk7CiAg
ICAgICAgIGlmIChpc0FjdGl2YXRlZCkgewogICAgICAgICAgICAgUnVudGltZUFnZW50LmVuYWJs
ZVR5cGVQcm9maWxlcigpOwogICAgICAgICAgICAgdGhpcy5fZW5hYmxlU2Nyb2xsRXZlbnRzRm9y
VHlwZVRva2VuQW5ub3RhdG9yKCk7CkBAIC0zMDIsOCArMzIzLDcgQEAgV2ViSW5zcGVjdG9yLlNv
dXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdAogICAgIHsKICAgICAgICAgV2ViSW5zcGVjdG9yLlRl
eHRFZGl0b3IucHJvdG90eXBlLnByZXR0eVByaW50LmNhbGwodGhpcywgcHJldHR5KTsKIAotICAg
ICAgICBpZiAodGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yICYmIHRoaXMuX3R5cGVUb2tlbkFubm90
YXRvci5pc0FjdGl2ZSkKLSAgICAgICAgICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5yZXNl
dCgpOworICAgICAgICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLnJlc2V0QWxsSWZBY3RpdmUoKTsK
ICAgICB9LAogCiAgICAgLy8gUHJpdmF0ZQpAQCAtNDMyLDYgKzQ1MiwxMCBAQCBXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgICAgIHRoaXMuc3RyaW5nID0gY29u
dGVudDsKIAogICAgICAgICB0aGlzLl9tYWtlVHlwZVRva2VuQW5ub3RhdG9yKCk7CisgICAgICAg
IHRoaXMuX21ha2VCYXNpY0Jsb2NrQW5ub3RhdG9yKCk7CisgICAgICAgIHZhciBiYXNpY0Jsb2Nr
QW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2ViSW5zcGVj
dG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3JLZXkpOworICAgICAg
ICBpZiAoYmFzaWNCbG9ja0Fubm90YXRvcikKKyAgICAgICAgICAgIGJhc2ljQmxvY2tBbm5vdGF0
b3IucmVzdW1lKCk7CiAKICAgICAgICAgdGhpcy5fY29udGVudERpZFBvcHVsYXRlKCk7CiAgICAg
fSwKQEAgLTEwNDIsMTYgKzEwNjYsMTQgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRp
dG9yLnByb3RvdAogICAgIF9kZWJ1Z2dlckRpZFBhdXNlOiBmdW5jdGlvbihldmVudCkKICAgICB7
CiAgICAgICAgIHRoaXMuX3VwZGF0ZVRva2VuVHJhY2tpbmdDb250cm9sbGVyU3RhdGUoKTsKLSAg
ICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFubm90YXRvciAmJiB0aGlzLl90eXBlVG9rZW5Bbm5v
dGF0b3IuaXNBY3RpdmUpCi0gICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IucmVm
cmVzaCgpOworICAgICAgICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLnJlZnJlc2hBbGxJZkFjdGl2
ZSgpOwogICAgIH0sCiAKICAgICBfZGVidWdnZXJEaWRSZXN1bWU6IGZ1bmN0aW9uKGV2ZW50KQog
ICAgIHsKICAgICAgICAgdGhpcy5fdXBkYXRlVG9rZW5UcmFja2luZ0NvbnRyb2xsZXJTdGF0ZSgp
OwogICAgICAgICB0aGlzLl9kaXNtaXNzUG9wb3ZlcigpOwotICAgICAgICBpZiAodGhpcy5fdHlw
ZVRva2VuQW5ub3RhdG9yICYmIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5pc0FjdGl2ZSkKLSAg
ICAgICAgICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5yZWZyZXNoKCk7CisgICAgICAgIHRo
aXMuX2Fubm90YXRvck1hbmFnZXIucmVmcmVzaEFsbElmQWN0aXZlKCk7CiAgICAgfSwKIAogICAg
IF9zb3VyY2VDb2RlU291cmNlTWFwQWRkZWQ6IGZ1bmN0aW9uKGV2ZW50KQpAQCAtMTA2Nyw3ICsx
MDg5LDcgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdAogICAgICAg
ICB2YXIgbW9kZSA9IFdlYkluc3BlY3Rvci5Db2RlTWlycm9yVG9rZW5UcmFja2luZ0NvbnRyb2xs
ZXIuTW9kZS5Ob25lOwogICAgICAgICBpZiAoV2ViSW5zcGVjdG9yLmRlYnVnZ2VyTWFuYWdlci5w
YXVzZWQpCiAgICAgICAgICAgICBtb2RlID0gV2ViSW5zcGVjdG9yLkNvZGVNaXJyb3JUb2tlblRy
YWNraW5nQ29udHJvbGxlci5Nb2RlLkphdmFTY3JpcHRFeHByZXNzaW9uOwotICAgICAgICBlbHNl
IGlmICh0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IgJiYgdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9y
LmlzQWN0aXZlKQorICAgICAgICBlbHNlIGlmICh0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmlzQW5u
b3RhdG9yQWN0aXZlKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9rZW5B
bm5vdGF0b3JLZXkpKQogICAgICAgICAgICAgbW9kZSA9IFdlYkluc3BlY3Rvci5Db2RlTWlycm9y
VG9rZW5UcmFja2luZ0NvbnRyb2xsZXIuTW9kZS5KYXZhU2NyaXB0VHlwZUluZm9ybWF0aW9uOwog
ICAgICAgICBlbHNlIGlmICh0aGlzLl9oYXNDb2xvck1hcmtlcnMoKSkKICAgICAgICAgICAgIG1v
ZGUgPSBXZWJJbnNwZWN0b3IuQ29kZU1pcnJvclRva2VuVHJhY2tpbmdDb250cm9sbGVyLk1vZGUu
TWFya2VkVG9rZW5zOwpAQCAtMTUwNyw5ICsxNTI5LDEwIEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VD
b2RlVGV4dEVkaXRvci5wcm90b3QKIAogICAgICAgICAvLyBXZSBjbGVhciB0aGUgbWFya2VyIHNp
bmNlIHdlJ2xsIHJlc2V0IGl0IGFmdGVyIGVkaXRpbmcuCiAgICAgICAgIGVkaXRpbmdDb250cm9s
bGVyLm1hcmtlci5jbGVhcigpOwotICAgICAgICAKKwogICAgICAgICAvLyBXZSBpZ25vcmUgY29u
dGVudCBjaGFuZ2VzIG1hZGUgYXMgYSByZXN1bHQgb2YgY29sb3IgZWRpdGluZy4KICAgICAgICAg
dGhpcy5faWdub3JlQ29udGVudERpZENoYW5nZSsrOworCiAgICAgfSwKICAgICAKICAgICBlZGl0
aW5nQ29udHJvbGxlckRpZEZpbmlzaEVkaXRpbmc6IGZ1bmN0aW9uKGVkaXRpbmdDb250cm9sbGVy
KQpAQCAtMTUyMSwyOCArMTU0NCw0OCBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0
b3IucHJvdG90CiAgICAgICAgIGRlbGV0ZSB0aGlzLl9lZGl0aW5nQ29udHJvbGxlcjsKICAgICB9
LAogCi0gICAgX21ha2VUeXBlVG9rZW5Bbm5vdGF0b3I6IGZ1bmN0aW9uKCkKKyAgICBfZ2V0QXNz
b2NpYXRlZFNjcmlwdDogZnVuY3Rpb24oKQogICAgIHsKLSAgICAgICAgaWYgKCFSdW50aW1lQWdl
bnQuZ2V0UnVudGltZVR5cGVzRm9yVmFyaWFibGVzQXRPZmZzZXRzKQotICAgICAgICAgICAgcmV0
dXJuOwotCiAgICAgICAgIHZhciBzY3JpcHQgPSBudWxsOwogICAgICAgICAvLyBGSVhNRTogVGhp
cyBuZWVkcyB0byBtZSBtb2RpZmllZCB0byB3b3JrIHdpdGggSFRNTCBmaWxlcyB3aXRoIGlubGlu
ZSBzY3JpcHQgdGFncy4KICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZUNvZGUgaW5zdGFuY2VvZiBX
ZWJJbnNwZWN0b3IuU2NyaXB0KQogICAgICAgICAgICAgc2NyaXB0ID0gdGhpcy5fc291cmNlQ29k
ZTsKICAgICAgICAgZWxzZSBpZiAodGhpcy5fc291cmNlQ29kZSBpbnN0YW5jZW9mIFdlYkluc3Bl
Y3Rvci5SZXNvdXJjZSAmJiB0aGlzLl9zb3VyY2VDb2RlLnR5cGUgPT09IFdlYkluc3BlY3Rvci5S
ZXNvdXJjZS5UeXBlLlNjcmlwdCAmJiB0aGlzLl9zb3VyY2VDb2RlLnNjcmlwdHMubGVuZ3RoKQog
ICAgICAgICAgICAgc2NyaXB0ID0gdGhpcy5fc291cmNlQ29kZS5zY3JpcHRzWzBdOworICAgICAg
ICByZXR1cm4gc2NyaXB0OworICAgIH0sCisKKyAgICBfbWFrZVR5cGVUb2tlbkFubm90YXRvcjog
ZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKCFSdW50aW1lQWdlbnQuZ2V0UnVudGltZVR5
cGVzRm9yVmFyaWFibGVzQXRPZmZzZXRzKQorICAgICAgICAgICAgcmV0dXJuOwogCisgICAgICAg
IHZhciBzY3JpcHQgPSB0aGlzLl9nZXRBc3NvY2lhdGVkU2NyaXB0KCk7CiAgICAgICAgIGlmICgh
c2NyaXB0KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHRoaXMuX3R5cGVUb2tlbkFu
bm90YXRvciA9IG5ldyBXZWJJbnNwZWN0b3IuVHlwZVRva2VuQW5ub3RhdG9yKHRoaXMsIHNjcmlw
dCk7CisgICAgICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSBuZXcgV2ViSW5zcGVjdG9yLlR5
cGVUb2tlbkFubm90YXRvcih0aGlzLCBzY3JpcHQpOworICAgICAgICB0aGlzLl9hbm5vdGF0b3JN
YW5hZ2VyLmFkZEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuVHlw
ZVRva2VuQW5ub3RhdG9yS2V5LCB0eXBlVG9rZW5Bbm5vdGF0b3IpOworCiAgICAgICAgIGlmIChX
ZWJJbnNwZWN0b3Iuc2hvd0phdmFTY3JpcHRUeXBlSW5mb3JtYXRpb25TZXR0aW5nLnZhbHVlKSB7
Ci0gICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IucmVzZXQoKTsKKyAgICAgICAg
ICAgIHR5cGVUb2tlbkFubm90YXRvci5yZXNldCgpOwogICAgICAgICAgICAgdGhpcy5fZW5hYmxl
U2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7CiAgICAgICAgIH0KICAgICB9LAog
CisgICAgX21ha2VCYXNpY0Jsb2NrQW5ub3RhdG9yOiBmdW5jdGlvbigpCisgICAgeworICAgICAg
ICBpZiAoIVJ1bnRpbWVBZ2VudC5nZXRCYXNpY0Jsb2NrTG9jYXRpb25zKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIHZhciBzY3JpcHQgPSB0aGlzLl9nZXRBc3NvY2lhdGVkU2NyaXB0
KCk7CisgICAgICAgIGlmICghc2NyaXB0KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IHZhciBiYXNpY0Jsb2NrQW5ub3RhdG9yID0gbmV3IFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5u
b3RhdG9yKHRoaXMsIHNjcmlwdCk7CisgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIuYWRk
QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5CYXNpY0Jsb2NrQW5u
b3RhdG9yS2V5LCBiYXNpY0Jsb2NrQW5ub3RhdG9yKTsKKyAgICB9LAorCiAgICAgX2VuYWJsZVNj
cm9sbEV2ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcjogZnVuY3Rpb24oKQogICAgIHsKICAgICAg
ICAgLy8gUGF1c2UgdXBkYXRpbmcgdHlwZSB0b2tlbnMgd2hpbGUgc2Nyb2xsaW5nIHRvIHByZXZl
bnQgZnJhbWUgbG9zcy4KQEAgLTE1NjAsOCArMTYwMyw4IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VD
b2RlVGV4dEVkaXRvci5wcm90b3QKIAogICAgIF9tYWtlVHlwZVRva2VuU2Nyb2xsRXZlbnRIYW5k
bGVyOiBmdW5jdGlvbigpCiAgICAgewotICAgICAgICB2YXIgdHlwZVRva2VuQW5ub3RhdG9yID0g
dGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yOwogICAgICAgICB2YXIgdGltZW91dElkZW50aWZpZXIg
PSBudWxsOworICAgICAgICB2YXIgdHlwZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9y
TWFuYWdlci5nZXRBbm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5
cGVUb2tlbkFubm90YXRvcktleSk7CiAgICAgICAgIGZ1bmN0aW9uIHNjcm9sbEhhbmRsZXIoKQog
ICAgICAgICB7CiAgICAgICAgICAgICBpZiAodGltZW91dElkZW50aWZpZXIpCkBAIC0xNTcxLDEx
ICsxNjE0LDE1IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKIAog
ICAgICAgICAgICAgdGltZW91dElkZW50aWZpZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewog
ICAgICAgICAgICAgICAgIHRpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKLSAgICAgICAgICAgICAg
ICB0eXBlVG9rZW5Bbm5vdGF0b3IucmVzdW1lKCk7Ci0gICAgICAgICAgICB9LCBXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IuRHVyYXRpb25Ub1VwZGF0ZVR5cGVUb2tlbnNBZnRlclNj
cm9sbGluZyk7CisgICAgICAgICAgICAgICAgdmFyIHR5cGVUb2tlbkFubm90YXRvciA9IHRoaXMu
X2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4
dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkpOworICAgICAgICAgICAgICAgIC8vIFRoZXJl
IGlzIGEgc21hbGwgY2hhbmNlIHRoYXQgd2UgZGlzYWJsZWQgdGhlIHR5cGUgdG9rZW4gYW5ub3Rh
dG9yIGFuZCB0aGUgc2Nyb2xsIHNjcm9sbCBoYW5kbGVyIAorICAgICAgICAgICAgICAgIC8vIGR1
cmluZyB0aGUgRHVyYXRpb25Ub1VwZGF0ZVR5cGVUb2tlbnNBZnRlclNjcm9sbGluZyB0aW1lIGRl
bGF5LgorICAgICAgICAgICAgICAgIGlmICh0eXBlVG9rZW5Bbm5vdGF0b3IpCisgICAgICAgICAg
ICAgICAgICAgIHR5cGVUb2tlbkFubm90YXRvci5yZXN1bWUoKTsKKyAgICAgICAgICAgIH0uYmlu
ZCh0aGlzKSwgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkR1cmF0aW9uVG9VcGRh
dGVUeXBlVG9rZW5zQWZ0ZXJTY3JvbGxpbmcpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJu
IHNjcm9sbEhhbmRsZXI7CisgICAgICAgIHJldHVybiBzY3JvbGxIYW5kbGVyLmJpbmQodGhpcyk7
CiAgICAgfQogfTsKIApJbmRleDogU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2Uv
Vmlld3MvVGV4dEVkaXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9WaWV3cy9UZXh0RWRpdG9yLmpzCShyZXZpc2lvbiAxNzY4MzYpCisrKyBT
b3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9UZXh0RWRpdG9yLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSw4IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yID0g
ZnVuY3Rpb24oZWxlbWUKICAgICB0aGlzLl9jb2RlTWlycm9yLm9uKCJjaGFuZ2UiLCB0aGlzLl9j
b250ZW50Q2hhbmdlZC5iaW5kKHRoaXMpKTsKICAgICB0aGlzLl9jb2RlTWlycm9yLm9uKCJndXR0
ZXJDbGljayIsIHRoaXMuX2d1dHRlck1vdXNlRG93bi5iaW5kKHRoaXMpKTsKICAgICB0aGlzLl9j
b2RlTWlycm9yLm9uKCJndXR0ZXJDb250ZXh0TWVudSIsIHRoaXMuX2d1dHRlckNvbnRleHRNZW51
LmJpbmQodGhpcykpOworICAgIHRoaXMuX2NvZGVNaXJyb3Iub24oImZvY3VzIiwgdGhpcy5nYWlu
ZWRGb2N1cy5iaW5kKHRoaXMpKTsKKyAgICB0aGlzLl9jb2RlTWlycm9yLm9uKCJibHVyIiwgdGhp
cy5sb3N0Rm9jdXMuYmluZCh0aGlzKSk7CiAgICAgdGhpcy5fY29kZU1pcnJvci5nZXRTY3JvbGxl
ckVsZW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuX29wZW5DbGlja2VkTGlu
a3MuYmluZCh0aGlzKSwgdHJ1ZSk7CiAKICAgICB0aGlzLl9jb21wbGV0aW9uQ29udHJvbGxlciA9
IG5ldyBXZWJJbnNwZWN0b3IuQ29kZU1pcnJvckNvbXBsZXRpb25Db250cm9sbGVyKHRoaXMuX2Nv
ZGVNaXJyb3IsIHRoaXMpOwpAQCAtNDUwLDYgKzQ1MiwxNiBAQCBXZWJJbnNwZWN0b3IuVGV4dEVk
aXRvci5wcm90b3R5cGUgPSB7CiAgICAgICAgIHJldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldExp
bmUobGluZU51bWJlcik7CiAgICAgfSwKIAorICAgIGdldFRleHRJblJhbmdlOiBmdW5jdGlvbihz
dGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9j
b2RlTWlycm9yLmdldFJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKKyAgICB9LAor
CisgICAgYWRkU3R5bGVUb1RleHRSYW5nZTogZnVuY3Rpb24oc3RhcnRQb3NpdGlvbiwgZW5kUG9z
aXRpb24sIHN0eWxlQ2xhc3NOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVN
aXJyb3IuZ2V0RG9jKCkubWFya1RleHQoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIHtjbGFz
c05hbWU6IHN0eWxlQ2xhc3NOYW1lfSk7CisgICAgfSwKKwogICAgIHJldmVhbFBvc2l0aW9uOiBm
dW5jdGlvbihwb3NpdGlvbiwgdGV4dFJhbmdlVG9TZWxlY3QsIGZvcmNlVW5mb3JtYXR0ZWQsIG5v
SGlnaGxpZ2h0KQogICAgIHsKICAgICAgICAgY29uc29sZS5hc3NlcnQocG9zaXRpb24gPT09IHVu
ZGVmaW5lZCB8fCBwb3NpdGlvbiBpbnN0YW5jZW9mIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlUG9z
aXRpb24sICJyZXZlYWxQb3NpdGlvbiBjYWxsZWQgd2l0aG91dCBhIFNvdXJjZUNvZGVQb3NpdGlv
biIpOwpAQCAtNTk2LDYgKzYwOCw3IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlw
ZSA9IHsKICAgICBmb2N1czogZnVuY3Rpb24oKQogICAgIHsKICAgICAgICAgdGhpcy5fY29kZU1p
cnJvci5mb2N1cygpOworICAgICAgICBjb25zb2xlLmxvZygiZ2FpbmVkIGZvY3VzIik7CiAgICAg
fSwKIAogICAgIGNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKHJlcGxhY2VkUmFuZ2VzLCBuZXdS
YW5nZXMpCkBAIC02MDMsNiArNjE2LDE2IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3Rv
dHlwZSA9IHsKICAgICAgICAgLy8gSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KICAgICB9LAog
CisgICAgZ2FpbmVkRm9jdXM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIC8vIEltcGxlbWVu
dGVkIGJ5IHN1YmNsYXNzZXMuCisgICAgfSwKKworICAgIGxvc3RGb2N1czogZnVuY3Rpb24oKQor
ICAgIHsKKyAgICAgICAgLy8gSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICB9LAorCiAg
ICAgcmVjdHNGb3JSYW5nZTogZnVuY3Rpb24ocmFuZ2UpCiAgICAgewogICAgICAgICByZXR1cm4g
dGhpcy5fY29kZU1pcnJvci5yZWN0c0ZvclJhbmdlKHJhbmdlKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>244469</attachid>
            <date>2015-01-12 15:16:47 -0800</date>
            <delta_ts>2015-01-15 17:07:44 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>21109</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3IvYWdlbnRzL0luc3BlY3RvclJ1
bnRpbWVBZ2VudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3Bl
Y3Rvci9hZ2VudHMvSW5zcGVjdG9yUnVudGltZUFnZW50LmNwcAkocmV2aXNpb24gMTc4MjQzKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3BlY3Rvci9hZ2VudHMvSW5zcGVjdG9yUnVudGlt
ZUFnZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjMsNyArNjMsNyBAQCBJbnNwZWN0b3JSdW50
aW1lQWdlbnQ6Okluc3BlY3RvclJ1bnRpbWVBCiAgICAgLCBtX2luamVjdGVkU2NyaXB0TWFuYWdl
cihpbmplY3RlZFNjcmlwdE1hbmFnZXIpCiAgICAgLCBtX3NjcmlwdERlYnVnU2VydmVyKG51bGxw
dHIpCiAgICAgLCBtX2VuYWJsZWQoZmFsc2UpCi0gICAgLCBtX2lzVHlwZVByb2ZpbGluZ0VuYWJs
ZWQoZmFsc2UpCisgICAgLCBtX2lzUHJvZmlsaW5nRW5hYmxlZChmYWxzZSkKIHsKIH0KIApAQCAt
MjU2LDcgKzI1Niw3IEBAIHZvaWQgSW5zcGVjdG9yUnVudGltZUFnZW50OjpnZXRSdW50aW1lVHkK
ICAgICAgICAgZGF0YUxvZ0YoIkluc3BlY3Rvcjo6Z2V0UnVudGltZVR5cGVzRm9yVmFyaWFibGVz
QXRPZmZzZXRzIHRvb2sgJWxmbXNcbiIsIGVuZCAtIHN0YXJ0KTsKIH0KIAotY2xhc3MgVHlwZVJl
Y29tcGlsZXIgOiBwdWJsaWMgTWFya2VkQmxvY2s6OlZvaWRGdW5jdG9yIHsKK2NsYXNzIEphdmFT
Y3JpcHRSZWNvbXBpbGVyIDogcHVibGljIE1hcmtlZEJsb2NrOjpWb2lkRnVuY3RvciB7CiBwdWJs
aWM6CiAgICAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShKU0NlbGwqIGNlbGwpCiAgICAgewpAQCAt
MjY5LDEzICsyNjksMTQgQEAgcHVibGljOgogICAgIH0KIH07CiAKLXN0YXRpYyB2b2lkIHJlY29t
cGlsZUFsbEpTRnVuY3Rpb25zRm9yVHlwZVByb2ZpbGluZyhWTSYgdm0sIGJvb2wgc2hvdWxkRW5h
YmxlVHlwZVByb2ZpbGluZykKK3N0YXRpYyB2b2lkIHJlY29tcGlsZUFsbEpTRnVuY3Rpb25zRm9y
UHJvZmlsaW5nKFZNJiB2bSwgYm9vbCBzaG91bGRFbmFibGVQcm9maWxpbmcpCiB7Ci0gICAgdm0u
cHJlcGFyZVRvRGlzY2FyZENvZGUoKTsKLQotICAgIGJvb2wgbmVlZHNUb1JlY29tcGlsZSA9IChz
aG91bGRFbmFibGVUeXBlUHJvZmlsaW5nID8gdm0uZW5hYmxlVHlwZVByb2ZpbGVyKCkgOiB2bS5k
aXNhYmxlVHlwZVByb2ZpbGVyKCkpOworICAgIGJvb2wgc2hvdWxkUmVjb21waWxlRnJvbVR5cGVQ
cm9maWxlciA9IChzaG91bGRFbmFibGVQcm9maWxpbmcgPyB2bS5lbmFibGVUeXBlUHJvZmlsZXIo
KSA6IHZtLmRpc2FibGVUeXBlUHJvZmlsZXIoKSk7IAorICAgIGJvb2wgc2hvdWxkUmVjb21waWxl
RnJvbUNvbnRyb2xGbG93UHJvZmlsZXIgPSAoc2hvdWxkRW5hYmxlUHJvZmlsaW5nID8gdm0uZW5h
YmxlQ29udHJvbEZsb3dQcm9maWxlcigpIDogdm0uZGlzYWJsZUNvbnRyb2xGbG93UHJvZmlsZXIo
KSk7CisgICAgYm9vbCBuZWVkc1RvUmVjb21waWxlID0gc2hvdWxkUmVjb21waWxlRnJvbVR5cGVQ
cm9maWxlciB8fCBzaG91bGRSZWNvbXBpbGVGcm9tQ29udHJvbEZsb3dQcm9maWxlcjsKICAgICBp
ZiAobmVlZHNUb1JlY29tcGlsZSkgewotICAgICAgICBUeXBlUmVjb21waWxlciByZWNvbXBpbGVy
OworICAgICAgICB2bS5wcmVwYXJlVG9EaXNjYXJkQ29kZSgpOworICAgICAgICBKYXZhU2NyaXB0
UmVjb21waWxlciByZWNvbXBpbGVyOwogICAgICAgICBIZWFwSXRlcmF0aW9uU2NvcGUgaXRlcmF0
aW9uU2NvcGUodm0uaGVhcCk7CiAgICAgICAgIHZtLmhlYXAub2JqZWN0U3BhY2UoKS5mb3JFYWNo
TGl2ZUNlbGwoaXRlcmF0aW9uU2NvcGUsIHJlY29tcGlsZXIpOwogICAgIH0KQEAgLTI4MywyNiAr
Mjg0LDI2IEBAIHN0YXRpYyB2b2lkIHJlY29tcGlsZUFsbEpTRnVuY3Rpb25zRm9yVHkKIAogdm9p
ZCBJbnNwZWN0b3JSdW50aW1lQWdlbnQ6OndpbGxEZXN0cm95RnJvbnRlbmRBbmRCYWNrZW5kKElu
c3BlY3RvckRpc2Nvbm5lY3RSZWFzb24gcmVhc29uKQogewotICAgIGlmIChyZWFzb24gIT0gSW5z
cGVjdG9yRGlzY29ubmVjdFJlYXNvbjo6SW5zcGVjdGVkVGFyZ2V0RGVzdHJveWVkICYmIG1faXNU
eXBlUHJvZmlsaW5nRW5hYmxlZCkKLSAgICAgICAgc2V0VHlwZVByb2ZpbGVyRW5hYmxlZFN0YXRl
KGZhbHNlKTsKKyAgICBpZiAocmVhc29uICE9IEluc3BlY3RvckRpc2Nvbm5lY3RSZWFzb246Oklu
c3BlY3RlZFRhcmdldERlc3Ryb3llZCAmJiBtX2lzUHJvZmlsaW5nRW5hYmxlZCkKKyAgICAgICAg
c2V0UHJvZmlsZXJFbmFibGVkU3RhdGUoZmFsc2UpOwogfQogCiB2b2lkIEluc3BlY3RvclJ1bnRp
bWVBZ2VudDo6ZW5hYmxlVHlwZVByb2ZpbGVyKEVycm9yU3RyaW5nJikKIHsKLSAgICBzZXRUeXBl
UHJvZmlsZXJFbmFibGVkU3RhdGUodHJ1ZSk7CisgICAgc2V0UHJvZmlsZXJFbmFibGVkU3RhdGUo
dHJ1ZSk7CiB9CiAKIHZvaWQgSW5zcGVjdG9yUnVudGltZUFnZW50OjpkaXNhYmxlVHlwZVByb2Zp
bGVyKEVycm9yU3RyaW5nJikKIHsKLSAgICBzZXRUeXBlUHJvZmlsZXJFbmFibGVkU3RhdGUoZmFs
c2UpOworICAgIHNldFByb2ZpbGVyRW5hYmxlZFN0YXRlKGZhbHNlKTsKIH0KIAotdm9pZCBJbnNw
ZWN0b3JSdW50aW1lQWdlbnQ6OnNldFR5cGVQcm9maWxlckVuYWJsZWRTdGF0ZShib29sIHNob3Vs
ZEVuYWJsZVR5cGVQcm9maWxpbmcpCit2b2lkIEluc3BlY3RvclJ1bnRpbWVBZ2VudDo6c2V0UHJv
ZmlsZXJFbmFibGVkU3RhdGUoYm9vbCBzaG91bGRFbmFibGVQcm9maWxpbmcpCiB7Ci0gICAgaWYg
KG1faXNUeXBlUHJvZmlsaW5nRW5hYmxlZCA9PSBzaG91bGRFbmFibGVUeXBlUHJvZmlsaW5nKQor
ICAgIGlmIChtX2lzUHJvZmlsaW5nRW5hYmxlZCA9PSBzaG91bGRFbmFibGVQcm9maWxpbmcpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIG1faXNUeXBlUHJvZmlsaW5nRW5hYmxlZCA9IHNob3VsZEVu
YWJsZVR5cGVQcm9maWxpbmc7CisgICAgbV9pc1Byb2ZpbGluZ0VuYWJsZWQgPSBzaG91bGRFbmFi
bGVQcm9maWxpbmc7CiAKICAgICBWTSYgdm0gPSBnbG9iYWxWTSgpOwogCkBAIC0zMTEsMTEgKzMx
MiwxMSBAQCB2b2lkIEluc3BlY3RvclJ1bnRpbWVBZ2VudDo6c2V0VHlwZVByb2ZpCiAgICAgaWYg
KHZtLmVudHJ5U2NvcGUpIHsKICAgICAgICAgdm0uZW50cnlTY29wZS0+c2V0RW50cnlTY29wZURp
ZFBvcExpc3RlbmVyKHRoaXMsCiAgICAgICAgICAgICBbPV0gKFZNJiB2bSwgSlNHbG9iYWxPYmpl
Y3QqKSB7Ci0gICAgICAgICAgICAgICAgcmVjb21waWxlQWxsSlNGdW5jdGlvbnNGb3JUeXBlUHJv
ZmlsaW5nKHZtLCBzaG91bGRFbmFibGVUeXBlUHJvZmlsaW5nKTsgCisgICAgICAgICAgICAgICAg
cmVjb21waWxlQWxsSlNGdW5jdGlvbnNGb3JQcm9maWxpbmcodm0sIHNob3VsZEVuYWJsZVByb2Zp
bGluZyk7IAogICAgICAgICAgICAgfQogICAgICAgICApOwogICAgIH0gZWxzZQotICAgICAgICBy
ZWNvbXBpbGVBbGxKU0Z1bmN0aW9uc0ZvclR5cGVQcm9maWxpbmcodm0sIHNob3VsZEVuYWJsZVR5
cGVQcm9maWxpbmcpOworICAgICAgICByZWNvbXBpbGVBbGxKU0Z1bmN0aW9uc0ZvclByb2ZpbGlu
Zyh2bSwgc2hvdWxkRW5hYmxlUHJvZmlsaW5nKTsKIH0KIAogdm9pZCBJbnNwZWN0b3JSdW50aW1l
QWdlbnQ6OmdldEJhc2ljQmxvY2tzKEVycm9yU3RyaW5nJiBlcnJvclN0cmluZywgY29uc3QgU3Ry
aW5nJiBzb3VyY2VJREFzU3RyaW5nLCBSZWZQdHI8SW5zcGVjdG9yOjpQcm90b2NvbDo6QXJyYXk8
SW5zcGVjdG9yOjpQcm90b2NvbDo6UnVudGltZTo6QmFzaWNCbG9jaz4+JiBiYXNpY0Jsb2NrcykK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3IvYWdlbnRzL0luc3BlY3RvclJ1
bnRpbWVBZ2VudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0
b3IvYWdlbnRzL0luc3BlY3RvclJ1bnRpbWVBZ2VudC5oCShyZXZpc2lvbiAxNzgyNDMpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvaW5zcGVjdG9yL2FnZW50cy9JbnNwZWN0b3JSdW50aW1lQWdl
bnQuaAkod29ya2luZyBjb3B5KQpAQCAtODksMTIgKzg5LDEzIEBAIHByb3RlY3RlZDoKICAgICB2
aXJ0dWFsIHZvaWQgdW5tdXRlQ29uc29sZSgpID0gMDsKIAogcHJpdmF0ZToKLSAgICB2b2lkIHNl
dFR5cGVQcm9maWxlckVuYWJsZWRTdGF0ZShib29sKTsKKyAgICB2b2lkIHNldFByb2ZpbGVyRW5h
YmxlZFN0YXRlKGJvb2wpOworICAgIHZvaWQgcmVjb21waWxlQWxsRnVuY3Rpb25zKEpTQzo6Vk0m
KTsKIAogICAgIEluamVjdGVkU2NyaXB0TWFuYWdlciogbV9pbmplY3RlZFNjcmlwdE1hbmFnZXI7
CiAgICAgU2NyaXB0RGVidWdTZXJ2ZXIqIG1fc2NyaXB0RGVidWdTZXJ2ZXI7CiAgICAgYm9vbCBt
X2VuYWJsZWQ7Ci0gICAgYm9vbCBtX2lzVHlwZVByb2ZpbGluZ0VuYWJsZWQ7CisgICAgYm9vbCBt
X2lzUHJvZmlsaW5nRW5hYmxlZDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIEluc3BlY3RvcgpJbmRl
eDogU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvTWFpbi5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL01haW4uaHRtbAkocmV2
aXNpb24gMTc4MjQzKQorKysgU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvTWFp
bi5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC00NjUsNiArNDY1LDcgQEAKICAgICA8c2NyaXB0IHNy
Yz0iQ29udHJvbGxlcnMvQW5hbHl6ZXJNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0
IHNyYz0iQ29udHJvbGxlcnMvQW5ub3RhdG9yTWFuYWdlci5qcyI+PC9zY3JpcHQ+CiAgICAgPHNj
cmlwdCBzcmM9IkNvbnRyb2xsZXJzL0FwcGxpY2F0aW9uQ2FjaGVNYW5hZ2VyLmpzIj48L3Njcmlw
dD4KKyAgICA8c2NyaXB0IHNyYz0iQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcyI+
PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0JyYW5jaE1hbmFnZXIuanMi
Pjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9DU1NTdHlsZU1hbmFnZXIu
anMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9Db2RlTWlycm9yQ29s
b3JFZGl0aW5nQ29udHJvbGxlci5qcyI+PC9zY3JpcHQ+CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVj
dG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9CYXNpY0Jsb2NrQW5ub3RhdG9yLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xs
ZXJzL0Jhc2ljQmxvY2tBbm5vdGF0b3IuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViSW5z
cGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9CYXNpY0Jsb2NrQW5ub3RhdG9yLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
NCBTYWFtIEJhcmF0aSA8c2FhbWJhcmF0aTFAZ21haWwuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJbnNw
ZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvciA9IGZ1bmN0aW9uKHNvdXJjZUNvZGVUZXh0RWRpdG9y
LCBzY3JpcHQpCit7CisgICAgV2ViSW5zcGVjdG9yLkFubm90YXRvci5jYWxsKHRoaXMsIHNvdXJj
ZUNvZGVUZXh0RWRpdG9yKTsKKworICAgIHRoaXMuX3NjcmlwdCA9IHNjcmlwdDsKKworICAgIHRo
aXMuX2hpZ2hsaWdodE1hcmtlcnMgPSBbXTsKKyAgICB0aGlzLl9saW5lRGVzY3JpcHRpb25zID0g
W107Cit9OworCitXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5IYXNOb3RFeGVjdXRl
ZENsYXNzTmFtZSA9ICJiYXNpYy1ibG9jay1oYXMtbm90LWV4ZWN1dGVkIjsKKworV2ViSW5zcGVj
dG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBX
ZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvciwKKyAgICBfX3Byb3RvX186IFdlYkluc3Bl
Y3Rvci5Bbm5vdGF0b3IucHJvdG90eXBlLAorCisgICAgLy8gUHJvdGVjdGVkCisKKyAgICBjbGVh
ckFubm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBmb3IgKHZhciBsaW5lRGVz
Y3JpcHRpb24gb2YgdGhpcy5fbGluZURlc2NyaXB0aW9ucykKKyAgICAgICAgICAgIHRoaXMuc291
cmNlQ29kZVRleHRFZGl0b3IucmVtb3ZlU3R5bGVDbGFzc0Zyb21MaW5lKGxpbmVEZXNjcmlwdGlv
bi5saW5lTnVtYmVyLCBsaW5lRGVzY3JpcHRpb24uY2xhc3NOYW1lKTsKKyAgICAgICAgdGhpcy5f
bGluZURlc2NyaXB0aW9ucyA9IFtdOworCisgICAgICAgIGZvciAodmFyIG1hcmtlciBvZiB0aGlz
Ll9oaWdobGlnaHRNYXJrZXJzKQorICAgICAgICAgICAgbWFya2VyLmNsZWFyKCk7CisgICAgICAg
IHRoaXMuX2hpZ2hsaWdodE1hcmtlcnMgPSBbXTsKKyAgICB9LAorCisgICAgaW5zZXJ0QW5ub3Rh
dGlvbnM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5faXNBY3RpdmUpCisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMuX2Fubm90YXRlQmFzaWNCbG9ja0V4ZWN1
dGlvblJhbmdlcygpOworICAgIH0sCisKKyAgICAvLyBQcml2YXRlCisKKyAgICBfYW5ub3RhdGVC
YXNpY0Jsb2NrRXhlY3V0aW9uUmFuZ2VzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIg
c291cmNlSUQgPSB0aGlzLl9zY3JpcHQuaWQ7CisKKyAgICAgICAgUnVudGltZUFnZW50LmdldEJh
c2ljQmxvY2tzKHNvdXJjZUlELCBmdW5jdGlvbihlcnJvciwgYmFzaWNCbG9ja3MpIHsKKyAgICAg
ICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9y
IGluIGdldHRpbmcgYmFzaWMgYmxvY2sgbG9jYXRpb25zLiIpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkK
KyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRoaXMuY2xlYXJBbm5vdGF0
aW9ucygpOworCisgICAgICAgICAgICB2YXIge3N0YXJ0T2Zmc2V0LCBlbmRPZmZzZXR9ID0gdGhp
cy5zb3VyY2VDb2RlVGV4dEVkaXRvci52aXNpYmxlUmFuZ2VPZmZzZXRzKCk7CisgICAgICAgICAg
ICBiYXNpY0Jsb2NrcyA9IGJhc2ljQmxvY2tzLmZpbHRlcihmdW5jdGlvbihibG9jaykgeworICAg
ICAgICAgICAgICAgIHJldHVybiBibG9jay5zdGFydE9mZnNldCA+PSBzdGFydE9mZnNldCAmJiBi
bG9jay5zdGFydE9mZnNldCA8PSBlbmRPZmZzZXQ7CisgICAgICAgICAgICB9KTsKKworICAgICAg
ICAgICAgZm9yICh2YXIgYmxvY2sgb2YgYmFzaWNCbG9ja3MpCisgICAgICAgICAgICAgICAgdGhp
cy5faGlnaGxpZ2h0VGV4dEZvckJhc2ljQmxvY2soYmxvY2spOworCisgICAgICAgICAgICB0aGlz
Ll90aW1lb3V0SWRlbnRpZmllciA9IHNldFRpbWVvdXQodGhpcy5pbnNlcnRBbm5vdGF0aW9ucy5i
aW5kKHRoaXMpLCA0MDAwKTsKKyAgICAgICAgfS5iaW5kKHRoaXMpKTsKKyAgICB9LAorCisgICAg
X2hpZ2hsaWdodFRleHRGb3JCYXNpY0Jsb2NrOiBmdW5jdGlvbihiYXNpY0Jsb2NrKQorICAgIHsK
KyAgICAgICAgY29uc29sZS5hc3NlcnQoYmFzaWNCbG9jay5zdGFydE9mZnNldCA8PSBiYXNpY0Js
b2NrLmVuZE9mZnNldCAmJiBiYXNpY0Jsb2NrLnN0YXJ0T2Zmc2V0ID49IDAgJiYgYmFzaWNCbG9j
ay5lbmRPZmZzZXQgPj0gMCwgIiIgKyBiYXNpY0Jsb2NrLnN0YXJ0T2Zmc2V0ICsgIjoiICsgYmFz
aWNCbG9jay5lbmRPZmZzZXQpOworCisgICAgICAgIGlmIChiYXNpY0Jsb2NrLmhhc0V4ZWN1dGVk
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gdGhp
cy5zb3VyY2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3VycmVudFBvc2l0aW9uKGJh
c2ljQmxvY2suc3RhcnRPZmZzZXQpOworICAgICAgICB2YXIgZW5kUG9zaXRpb24gPSB0aGlzLnNv
dXJjZUNvZGVUZXh0RWRpdG9yLm9yaWdpbmFsT2Zmc2V0VG9DdXJyZW50UG9zaXRpb24oYmFzaWNC
bG9jay5lbmRPZmZzZXQpOworCisgICAgICAgIGlmICh0aGlzLl9zaG91bGRTa2lwQmFzaWNCbG9j
ayhzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgLy8gR3JheSBvdXQgdGhlIHRleHQgcmFuZ2UuCisgICAgICAgIHZhciBtYXJrZXIgPSB0
aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLmFkZFN0eWxlVG9UZXh0UmFuZ2Uoc3RhcnRQb3NpdGlv
biwgZW5kUG9zaXRpb24sIFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yLkhhc05vdEV4
ZWN1dGVkQ2xhc3NOYW1lKTsKKyAgICAgICAgdGhpcy5faGlnaGxpZ2h0TWFya2Vycy5wdXNoKG1h
cmtlcik7CisKKyAgICAgICAgLy8gV2hlbiBhZGRpbmcgYSBzdHlsZSB0byB0aGUgY29kZSByYW5n
ZSBpbiBDb2RlTWlycm9yLCBzdWNoIGFzIGEgYmFja2dyb3VuZCBjb2xvciwgaXQgd2lsbCBvbmx5
IGFwcGx5IHRoZSBzdHlsZQorICAgICAgICAvLyB0byB0aGUgYXJlYSB3aGVyZSB0ZXh0IGlzLCBu
b3QgdG8gdGhlIHN0eWxlIG9mIGFuIGVudGlyZSBsaW5lLiBCdXQsIGZyb20gYSB1c2VyIGludGVy
ZmFjZSBwZXJzcGVjdGl2ZSwgaXQgbG9va3MgCisgICAgICAgIC8vIGNsZWFuZXIgdG8gaGF2ZSBl
bnRpcmUgbGluZXMgaGlnaGxpZ2h0ZWQuIFRoZSBmb2xsb3dpbmcgbG9naWMgZ3JheXMgb3V0IGVu
dGlyZSBsaW5lcyB3aGVuIHRoZSBsaW5lJ3MgcmFuZ2UgaXMgCisgICAgICAgIC8vIG5vdCBhY3Jv
c3MgYmFzaWMgYmxvY2sgYm91bmRhcmllcy4KKyAgICAgICAgaWYgKGVuZFBvc2l0aW9uLmxpbmUg
PiBzdGFydFBvc2l0aW9uLmxpbmUpIHsKKyAgICAgICAgICAgIHZhciBzdGFydExpbmVFbmRQb3Np
dGlvbiA9IHsgbGluZTogc3RhcnRQb3NpdGlvbi5saW5lLCBjaDogdGhpcy5zb3VyY2VDb2RlVGV4
dEVkaXRvci5saW5lKHN0YXJ0UG9zaXRpb24ubGluZSkubGVuZ3RoIH07CisgICAgICAgICAgICBp
ZiAodGhpcy5fY2FuR3JheU91dEVudGlyZUxpbmUoc3RhcnRQb3NpdGlvbi5saW5lLCBzdGFydFBv
c2l0aW9uLCBzdGFydExpbmVFbmRQb3NpdGlvbikpCisgICAgICAgICAgICAgICAgdGhpcy5fZ3Jh
eU91dExpbmUoc3RhcnRQb3NpdGlvbi5saW5lKTsKKworICAgICAgICAgICAgdmFyIGVuZExpbmVT
dGFydFBvc2l0aW9uID0geyBsaW5lOiBlbmRQb3NpdGlvbi5saW5lLCBjaDogMCB9OworICAgICAg
ICAgICAgaWYgKHRoaXMuX2NhbkdyYXlPdXRFbnRpcmVMaW5lKGVuZFBvc2l0aW9uLmxpbmUsIGVu
ZExpbmVTdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpCisgICAgICAgICAgICAgICAgdGhpcy5f
Z3JheU91dExpbmUoZW5kUG9zaXRpb24ubGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICBjb25zb2xlLmFzc2VydChlbmRQb3NpdGlvbi5saW5lID09PSBzdGFydFBvc2l0aW9uLmxp
bmUpOworICAgICAgICAgICAgaWYgKHRoaXMuX2NhbkdyYXlPdXRFbnRpcmVMaW5lKHN0YXJ0UG9z
aXRpb24ubGluZSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pKQorICAgICAgICAgICAgICAg
IHRoaXMuX2dyYXlPdXRMaW5lKHN0YXJ0UG9zaXRpb24ubGluZSk7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAoZW5kUG9zaXRpb24ubGluZSAtIHN0YXJ0UG9zaXRpb24ubGluZSA+PSAyKSB7Cisg
ICAgICAgICAgICAvLyBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgZW50aXJlIGxpbmUgdG8gYmUgZ3Jh
eWVkIG91dCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9uIG9mIHRoZSBiYXNpYyBi
bG9jazoKKyAgICAgICAgICAgIC8vIExpbmUgc3RhcnQgOiAuLi4KKyAgICAgICAgICAgIC8vIExp
bmUgbWlkZGxlOiAuLi4gKFRoaXMgZW50aXJlIGxpbmUgY2FuIHNhZmVseSBiZSBncmF5ZWQgb3V0
KS4KKyAgICAgICAgICAgIC8vIExpbmUgZW5kICAgOiAuLi4KKyAgICAgICAgICAgIGZvciAodmFy
IGxpbmVOdW1iZXIgPSBzdGFydFBvc2l0aW9uLmxpbmUgKyAxOyBsaW5lTnVtYmVyIDwgZW5kUG9z
aXRpb24ubGluZTsgbGluZU51bWJlcisrKQorICAgICAgICAgICAgICAgIHRoaXMuX2dyYXlPdXRM
aW5lKGxpbmVOdW1iZXIpOworICAgICAgICB9CisgICAgfSwKKworICAgIF9zaG91bGRTa2lwQmFz
aWNCbG9jazogZnVuY3Rpb24oc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pCisgICAgeworICAg
ICAgICB2YXIgaXNPbmx5V2hpdGVzcGFjZSA9IC9eXHMrJC87CisgICAgICAgIHJldHVybiBpc09u
bHlXaGl0ZXNwYWNlLnRlc3QodGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5nZXRUZXh0SW5SYW5n
ZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpOworICAgIH0sCisKKyAgICBfY2FuR3JheU91
dEVudGlyZUxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0
aW9uKQorICAgIHsKKyAgICAgICAgdmFyIGxpbmVUZXh0ID0gdGhpcy5zb3VyY2VDb2RlVGV4dEVk
aXRvci5saW5lKGxpbmVOdW1iZXIpOworICAgICAgICB2YXIgYmxvY2tUZXh0ID0gdGhpcy5zb3Vy
Y2VDb2RlVGV4dEVkaXRvci5nZXRUZXh0SW5SYW5nZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlv
bik7CisgICAgICAgIGxpbmVUZXh0ID0gbGluZVRleHQucmVwbGFjZSgvXHMvZywgIiIpOworICAg
ICAgICBibG9ja1RleHQgPSBibG9ja1RleHQucmVwbGFjZSgvXHMvZywgIiIpOworICAgICAgICBp
ZiAobGluZVRleHQgPT09IGJsb2NrVGV4dCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIF9ncmF5T3V0TGluZTogZnVuY3Rpb24o
bGluZU51bWJlcikKKyAgICB7CisgICAgICAgIHZhciBjbGFzc05hbWUgPSBXZWJJbnNwZWN0b3Iu
QmFzaWNCbG9ja0Fubm90YXRvci5IYXNOb3RFeGVjdXRlZENsYXNzTmFtZTsKKyAgICAgICAgdGhp
cy5zb3VyY2VDb2RlVGV4dEVkaXRvci5hZGRTdHlsZUNsYXNzVG9MaW5lKGxpbmVOdW1iZXIsIGNs
YXNzTmFtZSk7CisgICAgICAgIHZhciBsaW5lRGVzY3JpcHRpb24gPSB7bGluZU51bWJlcjogbGlu
ZU51bWJlciwgY2xhc3NOYW1lOiBjbGFzc05hbWV9OworICAgICAgICB0aGlzLl9saW5lRGVzY3Jp
cHRpb25zLnB1c2gobGluZURlc2NyaXB0aW9uKTsKKyAgICB9Cit9OwpJbmRleDogU291cmNlL1dl
Ykluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0b3IuY3Nz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdz
L1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzcwkocmV2aXNpb24gMTc4MjQzKQorKysgU291cmNlL1dl
Ykluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0b3IuY3Nz
CSh3b3JraW5nIGNvcHkpCkBAIC03NiwzICs3Niw3IEBACiAKICAgICAtd2Via2l0LXRyYW5zZm9y
bTogdHJhbnNsYXRlWSgxcHgpOwogfQorCisuYmFzaWMtYmxvY2staGFzLW5vdC1leGVjdXRlZCB7
CisgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOworfQpJbmRleDogU291
cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2Uv
Vmlld3MvU291cmNlQ29kZVRleHRFZGl0b3IuanMJKHJldmlzaW9uIDE3ODI0MykKKysrIFNvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9y
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC05MSw2ICs5MSw3IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VD
b2RlVGV4dEVkaXRvci5EdXJhdGkKIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5B
dXRvRm9ybWF0TWluaW11bUxpbmVMZW5ndGggPSA1MDA7CiAKIFdlYkluc3BlY3Rvci5Tb3VyY2VD
b2RlVGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkgPSAiVHlwZVRva2VuQW5ub3RhdG9y
S2V5IjsKK1dlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5CYXNpY0Jsb2NrQW5ub3Rh
dG9yS2V5ID0gIkJhc2ljQmxvY2tBbm5vdGF0b3JLZXkiOwogCiBXZWJJbnNwZWN0b3IuU291cmNl
Q29kZVRleHRFZGl0b3IuRXZlbnQgPSB7CiAgICAgQ29udGVudFdpbGxQb3B1bGF0ZTogInNvdXJj
ZS1jb2RlLXRleHQtZWRpdG9yLWNvbnRlbnQtd2lsbC1wb3B1bGF0ZSIsCkBAIC0yNjIsMjIgKzI2
Myw0NCBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgICAg
ICAgICB0aGlzLl9kaXNhYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7CiAg
ICAgfSwKIAorICAgIGdhaW5lZEZvY3VzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB2YXIg
YmFzaWNCbG9ja0Fubm90YXRvciA9IHRoaXMuX2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9y
KFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5CYXNpY0Jsb2NrQW5ub3RhdG9yS2V5
KTsKKyAgICAgICAgaWYgKGJhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICBiYXNpY0Js
b2NrQW5ub3RhdG9yLmNsZWFyKCk7CisgICAgfSwKKworICAgIGxvc3RGb2N1czogZnVuY3Rpb24o
KQorICAgIHsKKyAgICAgICAgdmFyIGJhc2ljQmxvY2tBbm5vdGF0b3IgPSB0aGlzLl9hbm5vdGF0
b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3Iu
QmFzaWNCbG9ja0Fubm90YXRvcktleSk7CisgICAgICAgIGlmIChiYXNpY0Jsb2NrQW5ub3RhdG9y
KQorICAgICAgICAgICAgYmFzaWNCbG9ja0Fubm90YXRvci5yZXN1bWUoKTsKKyAgICB9LAorCiAg
ICAgdG9nZ2xlVHlwZUFubm90YXRpb25zOiBmdW5jdGlvbigpCiAgICAgewogICAgICAgICB2YXIg
dHlwZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3Io
V2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRvcktleSk7
CisgICAgICAgIHZhciBiYXNpY0Jsb2NrQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdl
ci5nZXRBbm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkJhc2ljQmxv
Y2tBbm5vdGF0b3JLZXkpOwogICAgICAgICBpZiAoIXR5cGVUb2tlbkFubm90YXRvcikKICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICB2YXIgaXNBY3RpdmF0ZWQgPSB0eXBlVG9r
ZW5Bbm5vdGF0b3IudG9nZ2xlVHlwZUFubm90YXRpb25zKCk7CiAgICAgICAgIGlmIChpc0FjdGl2
YXRlZCkgeworICAgICAgICAgICAgaWYgKGJhc2ljQmxvY2tBbm5vdGF0b3IgJiYgIWJhc2ljQmxv
Y2tBbm5vdGF0b3IuaXNBY3RpdmUpCisgICAgICAgICAgICAgICAgYmFzaWNCbG9ja0Fubm90YXRv
ci5yZXNldCgpOworCiAgICAgICAgICAgICBSdW50aW1lQWdlbnQuZW5hYmxlVHlwZVByb2ZpbGVy
KCk7CiAgICAgICAgICAgICB0aGlzLl9lbmFibGVTY3JvbGxFdmVudHNGb3JUeXBlVG9rZW5Bbm5v
dGF0b3IoKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChiYXNpY0Jsb2NrQW5u
b3RhdG9yICYmIGJhc2ljQmxvY2tBbm5vdGF0b3IuaXNBY3RpdmUpCisgICAgICAgICAgICAgICAg
YmFzaWNCbG9ja0Fubm90YXRvci5jbGVhcigpOworCiAgICAgICAgICAgICAvLyBXZSBkaXNhYmxl
IHR5cGUgcHJvZmlsaW5nIHdoZW4gZXhpdGluZyB0aGUgaW5zcGVjdG9yLCBzbyBubyBuZWVkIHRv
IGNhbGwgaXQgaGVyZS4gSWYgd2Ugd2VyZQogICAgICAgICAgICAgLy8gdG8gY2FsbCBpdCBoZXJl
LCB3ZSB3b3VsZCBoYXZlIEphdmFTY3JpcHRDb3JlIGNvbXBpbGUgb3V0IGFsbCB0aGUgbmVjZXNz
YXJ5IHR5cGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uLAogICAgICAgICAgICAgLy8gc28gaWYgYSB1
c2VyIHdlcmUgdG8gcXVpY2tseSBwcmVzcyB0aGVuIHVucHJlc3MgdGhlIGJ1dHRvbiwgd2Ugd291
bGRuJ3QgYmUgYWJsZSB0byByZS1zaG93IHR5cGUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICB0
aGlzLl9kaXNhYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7CiAgICAgICAg
IH0KKwogICAgICAgICBXZWJJbnNwZWN0b3Iuc2hvd0phdmFTY3JpcHRUeXBlSW5mb3JtYXRpb25T
ZXR0aW5nLnZhbHVlID0gaXNBY3RpdmF0ZWQ7CiAKICAgICAgICAgdGhpcy5fdXBkYXRlVG9rZW5U
cmFja2luZ0NvbnRyb2xsZXJTdGF0ZSgpOwpAQCAtNDM3LDYgKzQ2MCwxOSBAQCBXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgICAgIHRoaXMuc3RyaW5nID0gY29u
dGVudDsKIAogICAgICAgICB0aGlzLl9tYWtlVHlwZVRva2VuQW5ub3RhdG9yKCk7CisgICAgICAg
IHRoaXMuX21ha2VCYXNpY0Jsb2NrQW5ub3RhdG9yKCk7CisKKyAgICAgICAgaWYgKFdlYkluc3Bl
Y3Rvci5zaG93SmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvblNldHRpbmcudmFsdWUpIHsKKyAgICAg
ICAgICAgIHZhciBiYXNpY0Jsb2NrQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5n
ZXRBbm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkJhc2ljQmxvY2tB
bm5vdGF0b3JLZXkpOworICAgICAgICAgICAgdmFyIHR5cGVUb2tlbkFubm90YXRvciA9IHRoaXMu
X2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4
dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkpOworCisgICAgICAgICAgICBpZiAoYmFzaWNC
bG9ja0Fubm90YXRvcikKKyAgICAgICAgICAgICAgICBiYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc2V0
KCk7CisgICAgICAgICAgICBpZiAodHlwZVRva2VuQW5ub3RhdG9yKQorICAgICAgICAgICAgICAg
IHR5cGVUb2tlbkFubm90YXRvci5yZXNldCgpOworICAgICAgICAgICAgaWYgKHR5cGVUb2tlbkFu
bm90YXRvciB8fCBiYXNpY0Jsb2NrQW5ub3RhdG9yKQorICAgICAgICAgICAgICAgIHRoaXMuX2Vu
YWJsZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOworICAgICAgICB9CiAKICAg
ICAgICAgdGhpcy5fY29udGVudERpZFBvcHVsYXRlKCk7CiAgICAgfSwKQEAgLTE1NTEsMTEgKzE1
ODcsMTkgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdAogCiAgICAg
ICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSBuZXcgV2ViSW5zcGVjdG9yLlR5cGVUb2tlbkFu
bm90YXRvcih0aGlzLCBzY3JpcHQpOwogICAgICAgICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmFk
ZEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuVHlwZVRva2VuQW5u
b3RhdG9yS2V5LCB0eXBlVG9rZW5Bbm5vdGF0b3IpOworICAgIH0sCiAKLSAgICAgICAgaWYgKFdl
Ykluc3BlY3Rvci5zaG93SmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvblNldHRpbmcudmFsdWUpIHsK
LSAgICAgICAgICAgIHR5cGVUb2tlbkFubm90YXRvci5yZXNldCgpOwotICAgICAgICAgICAgdGhp
cy5fZW5hYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7Ci0gICAgICAgIH0K
KyAgICBfbWFrZUJhc2ljQmxvY2tBbm5vdGF0b3I6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IGlmICghUnVudGltZUFnZW50LmdldEJhc2ljQmxvY2tzKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIHZhciBzY3JpcHQgPSB0aGlzLl9nZXRBc3NvY2lhdGVkU2NyaXB0KCk7CisgICAg
ICAgIGlmICghc2NyaXB0KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHZhciBiYXNp
Y0Jsb2NrQW5ub3RhdG9yID0gbmV3IFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yKHRo
aXMsIHNjcmlwdCk7CisgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIuYWRkQW5ub3RhdG9y
KFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5CYXNpY0Jsb2NrQW5ub3RhdG9yS2V5
LCBiYXNpY0Jsb2NrQW5ub3RhdG9yKTsKICAgICB9LAogCiAgICAgX2VuYWJsZVNjcm9sbEV2ZW50
c0ZvclR5cGVUb2tlbkFubm90YXRvcjogZnVuY3Rpb24oKQpAQCAtMTU3NiwyMiArMTYyMCwxNiBA
QCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgX21ha2VUeXBl
VG9rZW5TY3JvbGxFdmVudEhhbmRsZXI6IGZ1bmN0aW9uKCkKICAgICB7CiAgICAgICAgIHZhciB0
aW1lb3V0SWRlbnRpZmllciA9IG51bGw7Ci0gICAgICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3Ig
PSB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNl
Q29kZVRleHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9yS2V5KTsKICAgICAgICAgZnVuY3Rpb24g
c2Nyb2xsSGFuZGxlcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh0aW1lb3V0SWRlbnRp
ZmllcikKICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkZW50aWZpZXIpOwog
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHR5cGVUb2tlbkFubm90YXRvci5wYXVz
ZSgpOworICAgICAgICAgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucGF1c2VBbGwoKTsK
IAogICAgICAgICAgICAgdGltZW91dElkZW50aWZpZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkg
ewogICAgICAgICAgICAgICAgIHRpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKLSAgICAgICAgICAg
ICAgICB2YXIgdHlwZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRB
bm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90
YXRvcktleSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzbWFsbCBjaGFuY2UgdGhh
dCB3ZSBkaXNhYmxlZCB0aGUgdHlwZSB0b2tlbiBhbm5vdGF0b3IgYW5kIHRoZSBzY3JvbGwgaGFu
ZGxlciAKLSAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhlIER1cmF0aW9uVG9VcGRhdGVUeXBl
VG9rZW5zQWZ0ZXJTY3JvbGxpbmcgdGltZSBkZWxheSwgc28gd2UgbXVzdCBlbnN1cmUgdGhhdCB0
aGlzCi0gICAgICAgICAgICAgICAgLy8gaXMgbm90IG51bGwuCi0gICAgICAgICAgICAgICAgaWYg
KHR5cGVUb2tlbkFubm90YXRvcikKLSAgICAgICAgICAgICAgICAgICAgdHlwZVRva2VuQW5ub3Rh
dG9yLnJlc3VtZSgpOworICAgICAgICAgICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucmVz
dW1lQWxsKCk7CiAgICAgICAgICAgICB9LmJpbmQodGhpcyksIFdlYkluc3BlY3Rvci5Tb3VyY2VD
b2RlVGV4dEVkaXRvci5EdXJhdGlvblRvVXBkYXRlVHlwZVRva2Vuc0FmdGVyU2Nyb2xsaW5nKTsK
ICAgICAgICAgfQogCkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9W
aWV3cy9UZXh0RWRpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9V
c2VySW50ZXJmYWNlL1ZpZXdzL1RleHRFZGl0b3IuanMJKHJldmlzaW9uIDE3ODI0MykKKysrIFNv
dXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RleHRFZGl0b3IuanMJKHdv
cmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDggQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IgPSBm
dW5jdGlvbihlbGVtZQogICAgIHRoaXMuX2NvZGVNaXJyb3Iub24oImNoYW5nZSIsIHRoaXMuX2Nv
bnRlbnRDaGFuZ2VkLmJpbmQodGhpcykpOwogICAgIHRoaXMuX2NvZGVNaXJyb3Iub24oImd1dHRl
ckNsaWNrIiwgdGhpcy5fZ3V0dGVyTW91c2VEb3duLmJpbmQodGhpcykpOwogICAgIHRoaXMuX2Nv
ZGVNaXJyb3Iub24oImd1dHRlckNvbnRleHRNZW51IiwgdGhpcy5fZ3V0dGVyQ29udGV4dE1lbnUu
YmluZCh0aGlzKSk7CisgICAgdGhpcy5fY29kZU1pcnJvci5vbigiZm9jdXMiLCB0aGlzLmdhaW5l
ZEZvY3VzLmJpbmQodGhpcykpOworICAgIHRoaXMuX2NvZGVNaXJyb3Iub24oImJsdXIiLCB0aGlz
Lmxvc3RGb2N1cy5iaW5kKHRoaXMpKTsKICAgICB0aGlzLl9jb2RlTWlycm9yLmdldFNjcm9sbGVy
RWxlbWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5fb3BlbkNsaWNrZWRMaW5r
cy5iaW5kKHRoaXMpLCB0cnVlKTsKIAogICAgIHRoaXMuX2NvbXBsZXRpb25Db250cm9sbGVyID0g
bmV3IFdlYkluc3BlY3Rvci5Db2RlTWlycm9yQ29tcGxldGlvbkNvbnRyb2xsZXIodGhpcy5fY29k
ZU1pcnJvciwgdGhpcyk7CkBAIC00NTQsNiArNDU2LDE2IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRp
dG9yLnByb3RvdHlwZSA9IHsKICAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3IuZ2V0TGlu
ZShsaW5lTnVtYmVyKTsKICAgICB9LAogCisgICAgZ2V0VGV4dEluUmFuZ2U6IGZ1bmN0aW9uKHN0
YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2Nv
ZGVNaXJyb3IuZ2V0UmFuZ2Uoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pOworICAgIH0sCisK
KyAgICBhZGRTdHlsZVRvVGV4dFJhbmdlOiBmdW5jdGlvbihzdGFydFBvc2l0aW9uLCBlbmRQb3Np
dGlvbiwgc3R5bGVDbGFzc05hbWUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fY29kZU1p
cnJvci5nZXREb2MoKS5tYXJrVGV4dChzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwge2NsYXNz
TmFtZTogc3R5bGVDbGFzc05hbWV9KTsKKyAgICB9LAorCiAgICAgcmV2ZWFsUG9zaXRpb246IGZ1
bmN0aW9uKHBvc2l0aW9uLCB0ZXh0UmFuZ2VUb1NlbGVjdCwgZm9yY2VVbmZvcm1hdHRlZCwgbm9I
aWdobGlnaHQpCiAgICAgewogICAgICAgICBjb25zb2xlLmFzc2VydChwb3NpdGlvbiA9PT0gdW5k
ZWZpbmVkIHx8IHBvc2l0aW9uIGluc3RhbmNlb2YgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVQb3Np
dGlvbiwgInJldmVhbFBvc2l0aW9uIGNhbGxlZCB3aXRob3V0IGEgU291cmNlQ29kZVBvc2l0aW9u
Iik7CkBAIC04MTUsNiArODI3LDE2IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlw
ZSA9IHsKICAgICAgICAgdGhpcy5fY29kZU1pcnJvci5vcGVyYXRpb24ocHJldHR5UHJpbnRBbmRV
cGRhdGVFZGl0b3IuYmluZCh0aGlzKSk7CiAgICAgfSwKIAorICAgIGdhaW5lZEZvY3VzOiBmdW5j
dGlvbigpCisgICAgeworICAgICAgICAvLyBJbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgorICAg
IH0sCisKKyAgICBsb3N0Rm9jdXM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIC8vIEltcGxl
bWVudGVkIGJ5IHN1YmNsYXNzZXMuCisgICAgfSwKKwogICAgIC8vIFByaXZhdGUKIAogICAgIGhh
c0VkaXRzOiBmdW5jdGlvbigpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>244732</attachid>
            <date>2015-01-15 17:07:44 -0800</date>
            <delta_ts>2015-01-16 13:03:04 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>27594</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTc4NTQzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBA
CisyMDE1LTAxLTE1ICBTYWFtIEJhcmF0aSAgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBQcm92aWRlIGEgZnJvbnQgZW5kIGZvciBKU0MncyBDb250cm9s
IEZsb3cgUHJvZmlsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTEzODQ1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFRoaXMgcGF0Y2ggcHV0cyB0aGUgZmluYWwgdG91Y2hlcyBvbiB3aGF0IEpTQyBuZWVk
cyB0byBwcm92aWRlCisgICAgICAgIGZvciB0aGUgV2ViIEluc3BlY3RvciB0byBzaG93IGEgVUkg
Zm9yIHRoZSBjb250cm9sIGZsb3cgcHJvZmlsZXIuCisKKyAgICAgICAgKiBpbnNwZWN0b3IvYWdl
bnRzL0luc3BlY3RvclJ1bnRpbWVBZ2VudC5jcHA6CisgICAgICAgIChJbnNwZWN0b3I6OnJlY29t
cGlsZUFsbEpTRnVuY3Rpb25zRm9yVHlwZVByb2ZpbGluZyk6CisgICAgICAgICogcnVudGltZS9D
b250cm9sRmxvd1Byb2ZpbGVyLmNwcDoKKyAgICAgICAgKEpTQzo6Q29udHJvbEZsb3dQcm9maWxl
cjo6Z2V0QmFzaWNCbG9ja3NGb3JTb3VyY2VJRCk6CisgICAgICAgICogcnVudGltZS9GdW5jdGlv
bkhhc0V4ZWN1dGVkQ2FjaGUuY3BwOgorICAgICAgICAoSlNDOjpGdW5jdGlvbkhhc0V4ZWN1dGVk
Q2FjaGU6OmdldEZ1bmN0aW9uUmFuZ2VzKToKKyAgICAgICAgKEpTQzo6RnVuY3Rpb25IYXNFeGVj
dXRlZENhY2hlOjpnZXRVbmV4ZWN1dGVkRnVuY3Rpb25SYW5nZXMpOiBEZWxldGVkLgorICAgICAg
ICAqIHJ1bnRpbWUvRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmg6CisKIDIwMTUtMDEtMTQgIEFs
ZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAgICAgV2ViIEluc3BlY3Rv
ciBhbmQgcmVndWxhciBjb25zb2xlIHVzZSBkaWZmZXJlbnQgc291cmNlIGNvZGUgbG9jYXRpb25z
IGZvciBtZXNzYWdlcwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3BlY3Rvci9hZ2Vu
dHMvSW5zcGVjdG9yUnVudGltZUFnZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvaW5zcGVjdG9yL2FnZW50cy9JbnNwZWN0b3JSdW50aW1lQWdlbnQuY3BwCShyZXZp
c2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW5zcGVjdG9yL2FnZW50cy9J
bnNwZWN0b3JSdW50aW1lQWdlbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNzEsMTAgKzI3MSwx
MiBAQCBwdWJsaWM6CiAKIHN0YXRpYyB2b2lkIHJlY29tcGlsZUFsbEpTRnVuY3Rpb25zRm9yVHlw
ZVByb2ZpbGluZyhWTSYgdm0sIGJvb2wgc2hvdWxkRW5hYmxlVHlwZVByb2ZpbGluZykKIHsKLSAg
ICB2bS5wcmVwYXJlVG9EaXNjYXJkQ29kZSgpOworICAgIGJvb2wgc2hvdWxkUmVjb21waWxlRnJv
bVR5cGVQcm9maWxlciA9IChzaG91bGRFbmFibGVUeXBlUHJvZmlsaW5nID8gdm0uZW5hYmxlVHlw
ZVByb2ZpbGVyKCkgOiB2bS5kaXNhYmxlVHlwZVByb2ZpbGVyKCkpOyAKKyAgICBib29sIHNob3Vs
ZFJlY29tcGlsZUZyb21Db250cm9sRmxvd1Byb2ZpbGVyID0gKHNob3VsZEVuYWJsZVR5cGVQcm9m
aWxpbmcgPyB2bS5lbmFibGVDb250cm9sRmxvd1Byb2ZpbGVyKCkgOiB2bS5kaXNhYmxlQ29udHJv
bEZsb3dQcm9maWxlcigpKTsKKyAgICBib29sIG5lZWRzVG9SZWNvbXBpbGUgPSBzaG91bGRSZWNv
bXBpbGVGcm9tVHlwZVByb2ZpbGVyIHx8IHNob3VsZFJlY29tcGlsZUZyb21Db250cm9sRmxvd1By
b2ZpbGVyOwogCi0gICAgYm9vbCBuZWVkc1RvUmVjb21waWxlID0gKHNob3VsZEVuYWJsZVR5cGVQ
cm9maWxpbmcgPyB2bS5lbmFibGVUeXBlUHJvZmlsZXIoKSA6IHZtLmRpc2FibGVUeXBlUHJvZmls
ZXIoKSk7CiAgICAgaWYgKG5lZWRzVG9SZWNvbXBpbGUpIHsKKyAgICAgICAgdm0ucHJlcGFyZVRv
RGlzY2FyZENvZGUoKTsKICAgICAgICAgVHlwZVJlY29tcGlsZXIgcmVjb21waWxlcjsKICAgICAg
ICAgSGVhcEl0ZXJhdGlvblNjb3BlIGl0ZXJhdGlvblNjb3BlKHZtLmhlYXApOwogICAgICAgICB2
bS5oZWFwLm9iamVjdFNwYWNlKCkuZm9yRWFjaExpdmVDZWxsKGl0ZXJhdGlvblNjb3BlLCByZWNv
bXBpbGVyKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbnRyb2xGbG93
UHJvZmlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0NvbnRyb2xGbG93UHJvZmlsZXIuY3BwCShyZXZpc2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9Db250cm9sRmxvd1Byb2ZpbGVyLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtODEsMTIgKzgxLDEyIEBAIFZlY3RvcjxCYXNpY0Jsb2NrUmFuZ2U+IENvbnRyb2xGbG93
UHJvZmkKICAgICAgICAgfQogICAgIH0KIAotICAgIGNvbnN0IFZlY3RvcjxzdGQ6OnBhaXI8dW5z
aWduZWQsIHVuc2lnbmVkPj4mIHVuZXhlY3V0ZWRGdW5jdGlvblJhbmdlcyA9IHZtLmZ1bmN0aW9u
SGFzRXhlY3V0ZWRDYWNoZSgpLT5nZXRVbmV4ZWN1dGVkRnVuY3Rpb25SYW5nZXMoc291cmNlSUQp
OworICAgIGNvbnN0IFZlY3RvcjxzdGQ6OnR1cGxlPGJvb2wsIHVuc2lnbmVkLCB1bnNpZ25lZD4+
JiB1bmV4ZWN1dGVkRnVuY3Rpb25SYW5nZXMgPSB2bS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUo
KS0+Z2V0RnVuY3Rpb25SYW5nZXMoc291cmNlSUQpOwogICAgIGZvciAoY29uc3QgYXV0byYgZnVu
Y3Rpb25SYW5nZSA6IHVuZXhlY3V0ZWRGdW5jdGlvblJhbmdlcykgewogICAgICAgICBCYXNpY0Js
b2NrUmFuZ2UgcmFuZ2U7Ci0gICAgICAgIHJhbmdlLm1faGFzRXhlY3V0ZWQgPSBmYWxzZTsKLSAg
ICAgICAgcmFuZ2UubV9zdGFydE9mZnNldCA9IHN0YXRpY19jYXN0PGludD4oZnVuY3Rpb25SYW5n
ZS5maXJzdCk7Ci0gICAgICAgIHJhbmdlLm1fZW5kT2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50Pihm
dW5jdGlvblJhbmdlLnNlY29uZCArIDEpOworICAgICAgICByYW5nZS5tX2hhc0V4ZWN1dGVkID0g
c3RkOjpnZXQ8MD4oZnVuY3Rpb25SYW5nZSk7CisgICAgICAgIHJhbmdlLm1fc3RhcnRPZmZzZXQg
PSBzdGF0aWNfY2FzdDxpbnQ+KHN0ZDo6Z2V0PDE+KGZ1bmN0aW9uUmFuZ2UpKTsKKyAgICAgICAg
cmFuZ2UubV9lbmRPZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KHN0ZDo6Z2V0PDI+KGZ1bmN0aW9u
UmFuZ2UpICsgMSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocmFuZ2UpOwogICAgIH0KIApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9GdW5jdGlv
bkhhc0V4ZWN1dGVkQ2FjaGUuY3BwCShyZXZpc2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvcnVudGltZS9GdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC04MCwxOSArODAsMTggQEAgdm9pZCBGdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGU6OnJl
bW92ZVVuZQogICAgIG1hcFtyYW5nZV0gPSB0cnVlOwogfQogCi1WZWN0b3I8c3RkOjpwYWlyPHVu
c2lnbmVkLCB1bnNpZ25lZD4+IEZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZTo6Z2V0VW5leGVjdXRl
ZEZ1bmN0aW9uUmFuZ2VzKGludHB0cl90IGlkKQorVmVjdG9yPHN0ZDo6dHVwbGU8Ym9vbCwgdW5z
aWduZWQsIHVuc2lnbmVkPj4gRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlOjpnZXRGdW5jdGlvblJh
bmdlcyhpbnRwdHJfdCBpZCkKIHsKLSAgICBWZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNp
Z25lZD4+IHJhbmdlcygwKTsKKyAgICBWZWN0b3I8c3RkOjp0dXBsZTxib29sLCB1bnNpZ25lZCwg
dW5zaWduZWQ+PiByYW5nZXMoMCk7CiAgICAgYXV0byBmaW5kUmVzdWx0ID0gbV9yYW5nZU1hcC5m
aW5kKGlkKTsKICAgICBpZiAoZmluZFJlc3VsdCA9PSBtX3JhbmdlTWFwLmVuZCgpKQogICAgICAg
ICByZXR1cm4gcmFuZ2VzOwogCiAgICAgUmFuZ2VNYXAmIG1hcCA9IG1fcmFuZ2VNYXAuZmluZChp
ZCktPnNlY29uZDsKICAgICBmb3IgKGF1dG8gaXRlciA9IG1hcC5iZWdpbigpLCBlbmQgPSBtYXAu
ZW5kKCk7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKLSAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQp
IHsKLSAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUmFuZ2UmIHJhbmdlID0gaXRlci0+Zmlyc3Q7
Ci0gICAgICAgICAgICByYW5nZXMuYXBwZW5kKHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+
KHJhbmdlLm1fc3RhcnQsIHJhbmdlLm1fZW5kKSk7Ci0gICAgICAgIH0KKyAgICAgICAgY29uc3Qg
RnVuY3Rpb25SYW5nZSYgcmFuZ2UgPSBpdGVyLT5maXJzdDsKKyAgICAgICAgYm9vbCBoYXNFeGVj
dXRlZCA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgcmFuZ2VzLmFwcGVuZChzdGQ6OnR1cGxlPGJv
b2wsIHVuc2lnbmVkLCB1bnNpZ25lZD4oaGFzRXhlY3V0ZWQsIHJhbmdlLm1fc3RhcnQsIHJhbmdl
Lm1fZW5kKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJhbmdlczsKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uSGFzRXhlY3V0ZWRDYWNo
ZS5oCShyZXZpc2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9G
dW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUuaAkod29ya2luZyBjb3B5KQpAQCAtNTIsNyArNTIsNyBA
QCBwdWJsaWM6CiAgICAgYm9vbCBoYXNFeGVjdXRlZEF0T2Zmc2V0KGludHB0cl90IGlkLCB1bnNp
Z25lZCBvZmZzZXQpOwogICAgIHZvaWQgaW5zZXJ0VW5leGVjdXRlZFJhbmdlKGludHB0cl90IGlk
LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKICAgICB2b2lkIHJlbW92ZVVuZXhlY3V0
ZWRSYW5nZShpbnRwdHJfdCBpZCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCk7Ci0gICAg
VmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+PiBnZXRVbmV4ZWN1dGVkRnVuY3Rp
b25SYW5nZXMoaW50cHRyX3QgaWQpOworICAgIFZlY3RvcjxzdGQ6OnR1cGxlPGJvb2wsIHVuc2ln
bmVkLCB1bnNpZ25lZD4+IGdldEZ1bmN0aW9uUmFuZ2VzKGludHB0cl90IGlkKTsKIAogcHJpdmF0
ZTogICAgIAogICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPEZ1bmN0aW9uUmFuZ2UsIGJv
b2wsIEhhc2hNZXRob2Q8RnVuY3Rpb25SYW5nZT4+IFJhbmdlTWFwOwpJbmRleDogU291cmNlL1dl
Ykluc3BlY3RvclVJL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCShyZXZpc2lvbiAxNzg1NDMpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTYgQEAKKzIwMTUtMDEtMTUgIFNh
YW0gQmFyYXRpICA8c2FhbWJhcmF0aTFAZ21haWwuY29tPgorCisgICAgICAgIFdlYiBJbnNwZWN0
b3I6IFByb3ZpZGUgYSBmcm9udCBlbmQgZm9yIEpTQydzIENvbnRyb2wgRmxvdyBQcm9maWxlcgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NDU0CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRj
aCBjcmVhdGVzIGEgdXNlciBpbnRlcmZhY2UgZm9yIEpTQydzIGNvbnRyb2wgZmxvdyBwcm9maWxl
ci4KKyAgICAgICAgVGhlIFdlYiBJbnNwZWN0b3IgZ2V0cyBiYXNpYyBibG9jayByYW5nZXMgZnJv
bSBKU0MsIGFuZCBkaXNwbGF5cworICAgICAgICBiYXNpYyBibG9ja3MgdGhhdCBoYXZlIG5vdCBl
eGVjdXRlZCBhcyBoYXZpbmcgYSBncmF5IGJhY2tncm91bmQuCisgICAgICAgIAorICAgICAgICBC
YXNpY0Jsb2NrQW5ub3RhdG9yIGlzIHRoZSBjbGFzcyByZXNwb25zaWJsZSBmb3IgdGhpcyBVSSBs
b2dpYy4KKyAgICAgICAgSXQgYWxzbyBkb2VzIGEgZmV3IG5pZnR5IHRoaW5ncyB3aGVuIHByZXNl
bnRpbmcgYSBVSSBmb3IgdGhpcyBncmF5CisgICAgICAgIGJhY2tncm91bmQgY29sb3I6IGlmIGFu
IGVudGlyZSBsaW5lIG9mIGNvZGUgaXMgd2l0aGluIHRoZSBiYXNpYyAKKyAgICAgICAgYmxvY2sn
cyBib3VuZGFyeSwgdGhlIGFubm90YXRvciB3aWxsIG5vdCBqdXN0IGhpZ2hsaWdodCB0aGUgYmFj
a2dyb3VuZCAKKyAgICAgICAgYmVoaW5kIHRoZSB0ZXh0LCBidXQgdGhlIGJhY2tncm91bmQgb2Yg
dGhlIGVudGlyZSBsaW5lIGl0c2VsZi4gVGhpcworICAgICAgICBwcm92aWRlcyBhIG5pY2VyIGV4
cGVyaWVuY2Ugd2hlbiBnbGFuY2luZyB0aHJvdWdoIGxhcmdlIEphdmFTY3JpcHQgZmlsZXMuCisK
KyAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGFkZHMgc29tZSBuZWNlc3Nhcnkgd3JhcHBlciBtZXRo
b2RzIGluc2lkZSBUZXh0RWRpdG9yCisgICAgICAgIGZvciBhY2Nlc3NpbmcgQ29kZU1pcnJvcidz
IHRleHQgaGlnaGxpZ2h0aW5nIGZ1bmN0aW9uYWxpdHkuIEl0IGFsc28KKyAgICAgICAgY3JlYXRl
cyBhIHdheSBmb3IgVGV4dEVkaXRvciBhbmQgU291cmNlQ29kZVRleHRFZGl0b3IgdG8gbGlzdGVu
CisgICAgICAgIGZvciBmb2N1cyBldmVudHMgaW5zaWRlIENvZGVNaXJyb3IuCisKKyAgICAgICAg
KiBVc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL0Jhc2ljQmxvY2tBbm5vdGF0b3IuanM6IEFkZGVk
LgorICAgICAgICAoV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IucHJvdG90eXBlLmNsZWFyQW5ub3RhdGlv
bnMpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IucHJvdG90eXBl
Lmluc2VydEFubm90YXRpb25zKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5u
b3RhdG9yLnByb3RvdHlwZS5fYW5ub3RhdGVCYXNpY0Jsb2NrRXhlY3V0aW9uUmFuZ2VzLik6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5wcm90b3R5cGUuX2Fubm90
YXRlQmFzaWNCbG9ja0V4ZWN1dGlvblJhbmdlcyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuQmFz
aWNCbG9ja0Fubm90YXRvci5wcm90b3R5cGUuc2V0IF9oaWdobGlnaHRUZXh0Rm9yQmFzaWNCbG9j
ayk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5wcm90b3R5cGUu
X2lzVGV4dFJhbmdlT25seVdoaXRlc3BhY2UpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLkJhc2lj
QmxvY2tBbm5vdGF0b3IucHJvdG90eXBlLl9jYW5HcmF5T3V0RW50aXJlTGluZSk6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5wcm90b3R5cGUuX2dyYXlPdXRMaW5l
KToKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL01haW4uaHRtbDoKKyAgICAgICAgKiBVc2VySW50
ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzczoKKyAgICAgICAgKC5iYXNpYy1i
bG9jay1oYXMtbm90LWV4ZWN1dGVkKToKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdzL1Nv
dXJjZUNvZGVUZXh0RWRpdG9yLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVU
ZXh0RWRpdG9yKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5w
cm90b3R5cGUuZ2FpbmVkRm9jdXMpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVU
ZXh0RWRpdG9yLnByb3RvdHlwZS5sb3N0Rm9jdXMpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNv
dXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS50b2dnbGVUeXBlQW5ub3RhdGlvbnMpOgorICAg
ICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS5fcG9wdWxh
dGVXaXRoQ29udGVudCk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0
b3IucHJvdG90eXBlLl9tYWtlVHlwZVRva2VuQW5ub3RhdG9yKToKKyAgICAgICAgKFdlYkluc3Bl
Y3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUuX21ha2VCYXNpY0Jsb2NrQW5ub3Rh
dG9yKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5
cGUuX21ha2VUeXBlVG9rZW5TY3JvbGxFdmVudEhhbmRsZXIuc2Nyb2xsSGFuZGxlcik6CisgICAg
ICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLl9tYWtlVHlw
ZVRva2VuU2Nyb2xsRXZlbnRIYW5kbGVyKToKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdz
L1RleHRFZGl0b3IuanM6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvcik6CisgICAg
ICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUuZ2V0VGV4dEluUmFuZ2UpOgor
ICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLmFkZFN0eWxlVG9UZXh0
UmFuZ2UpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLmdhaW5l
ZEZvY3VzKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5sb3N0
Rm9jdXMpOgorCiAyMDE1LTAxLTEzICBKb3NlcGggUGVjb3Jhcm8gIDxwZWNvcmFyb0BhcHBsZS5j
b20+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogVGV4dEVkaXRvciBkb2Vzbid0IHVwZGF0ZSB3
aGVuIHJlc2l6aW5nIGNvbnNvbGUsIHdoaXRlIHNwYWNlIGluc3RlYWQgb2YgY29udGVudApJbmRl
eDogU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvTWFpbi5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL01haW4uaHRtbAkocmV2
aXNpb24gMTc4NDkxKQorKysgU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvTWFp
bi5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC00NjUsNiArNDY1LDcgQEAKICAgICA8c2NyaXB0IHNy
Yz0iQ29udHJvbGxlcnMvQW5hbHl6ZXJNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0
IHNyYz0iQ29udHJvbGxlcnMvQW5ub3RhdG9yTWFuYWdlci5qcyI+PC9zY3JpcHQ+CiAgICAgPHNj
cmlwdCBzcmM9IkNvbnRyb2xsZXJzL0FwcGxpY2F0aW9uQ2FjaGVNYW5hZ2VyLmpzIj48L3Njcmlw
dD4KKyAgICA8c2NyaXB0IHNyYz0iQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcyI+
PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0JyYW5jaE1hbmFnZXIuanMi
Pjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9DU1NTdHlsZU1hbmFnZXIu
anMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9Db2RlTWlycm9yQ29s
b3JFZGl0aW5nQ29udHJvbGxlci5qcyI+PC9zY3JpcHQ+CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVj
dG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9CYXNpY0Jsb2NrQW5ub3RhdG9yLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xs
ZXJzL0Jhc2ljQmxvY2tBbm5vdGF0b3IuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViSW5z
cGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9CYXNpY0Jsb2NrQW5ub3RhdG9yLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
NSBTYWFtIEJhcmF0aSA8c2FhbWJhcmF0aTFAZ21haWwuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJbnNw
ZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvciA9IGZ1bmN0aW9uKHNvdXJjZUNvZGVUZXh0RWRpdG9y
LCBzY3JpcHQpCit7CisgICAgV2ViSW5zcGVjdG9yLkFubm90YXRvci5jYWxsKHRoaXMsIHNvdXJj
ZUNvZGVUZXh0RWRpdG9yKTsKKworICAgIHRoaXMuX3NjcmlwdCA9IHNjcmlwdDsKKworICAgIHRo
aXMuX2Jhc2ljQmxvY2tNYXJrZXJzID0gbmV3IE1hcDsgLy8gT25seSBjb250YWlucyB1bmV4ZWN1
dGVkIGJhc2ljIGJsb2Nrcy4KK307CisKK1dlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9y
Lkhhc05vdEV4ZWN1dGVkQ2xhc3NOYW1lID0gImJhc2ljLWJsb2NrLWhhcy1ub3QtZXhlY3V0ZWQi
OworCitXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5wcm90b3R5cGUgPSB7CisgICAg
Y29uc3RydWN0b3I6IFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yLAorICAgIF9fcHJv
dG9fXzogV2ViSW5zcGVjdG9yLkFubm90YXRvci5wcm90b3R5cGUsCisKKyAgICAvLyBQcm90ZWN0
ZWQKKworICAgIGNsZWFyQW5ub3RhdGlvbnM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGZv
ciAodmFyIGtleSBvZiB0aGlzLl9iYXNpY0Jsb2NrTWFya2Vycy5rZXlzKCkpCisgICAgICAgICAg
ICB0aGlzLl9jbGVhclJhbmdlRm9yQmFzaWNCbG9ja01hcmtlcihrZXkpOworICAgIH0sCisKKyAg
ICBpbnNlcnRBbm5vdGF0aW9uczogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlz
Ll9pc0FjdGl2ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGhpcy5fYW5ub3RhdGVC
YXNpY0Jsb2NrRXhlY3V0aW9uUmFuZ2VzKCk7CisgICAgfSwKKworICAgIC8vIFByaXZhdGUKKwor
ICAgIF9hbm5vdGF0ZUJhc2ljQmxvY2tFeGVjdXRpb25SYW5nZXM6IGZ1bmN0aW9uKCkKKyAgICB7
CisgICAgICAgIHZhciBzb3VyY2VJRCA9IHRoaXMuX3NjcmlwdC5pZDsKKyAgICAgICAgdmFyIHN0
YXJ0VGltZSA9IERhdGUubm93KCk7CisKKyAgICAgICAgUnVudGltZUFnZW50LmdldEJhc2ljQmxv
Y2tzKHNvdXJjZUlELCBmdW5jdGlvbihlcnJvciwgYmFzaWNCbG9ja3MpIHsKKyAgICAgICAgICAg
IGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGluIGdl
dHRpbmcgYmFzaWMgYmxvY2sgbG9jYXRpb25zOiAiICsgZXJyb3IpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0FjdGl2
ZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHZhciB7c3RhcnRPZmZz
ZXQsIGVuZE9mZnNldH0gPSB0aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLnZpc2libGVSYW5nZU9m
ZnNldHMoKTsKKyAgICAgICAgICAgIGJhc2ljQmxvY2tzID0gYmFzaWNCbG9ja3MuZmlsdGVyKGZ1
bmN0aW9uKGJsb2NrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrLnN0YXJ0T2Zmc2V0
ID49IHN0YXJ0T2Zmc2V0ICYmIGJsb2NrLnN0YXJ0T2Zmc2V0IDw9IGVuZE9mZnNldDsKKyAgICAg
ICAgICAgIH0pOworCisgICAgICAgICAgICBmb3IgKHZhciBibG9jayBvZiBiYXNpY0Jsb2Nrcykg
eworICAgICAgICAgICAgICAgIHZhciBrZXkgPSBibG9jay5zdGFydE9mZnNldCArICI6IiArIGJs
b2NrLmVuZE9mZnNldDsKKyAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gdGhpcy5fYmFzaWNC
bG9ja01hcmtlcnMuaGFzKGtleSk7CisgICAgICAgICAgICAgICAgdmFyIGhhc0V4ZWN1dGVkID0g
YmxvY2suaGFzRXhlY3V0ZWQ7CisgICAgICAgICAgICAgICAgaWYgKGhhc0tleSAmJiBoYXNFeGVj
dXRlZCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJSYW5nZUZvckJhc2ljQmxvY2tN
YXJrZXIoa2V5KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghaGFzS2V5ICYmICFoYXNFeGVj
dXRlZCkgeworICAgICAgICAgICAgICAgICAgICB2YXIgYmFzaWNCbG9ja01hcmtlciA9IHRoaXMu
X2hpZ2hsaWdodFRleHRGb3JCYXNpY0Jsb2NrKGJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKGJhc2ljQmxvY2tNYXJrZXIpCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYXNp
Y0Jsb2NrTWFya2Vycy5zZXQoa2V5LCBiYXNpY0Jsb2NrTWFya2VyKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB0b3RhbFRpbWUgPSBEYXRlLm5v
dygpIC0gc3RhcnRUaW1lOworICAgICAgICAgICAgdmFyIHRpbWVvdXRUaW1lID0gTWF0aC5taW4o
TWF0aC5tYXgoNjUwMCwgdG90YWxUaW1lKSwgMTUgKiB0b3RhbFRpbWUpOworICAgICAgICAgICAg
dGhpcy5fdGltZW91dElkZW50aWZpZXIgPSBzZXRUaW1lb3V0KHRoaXMuaW5zZXJ0QW5ub3RhdGlv
bnMuYmluZCh0aGlzKSwgdGltZW91dFRpbWUpOworICAgICAgICB9LmJpbmQodGhpcykpOworICAg
IH0sCisKKyAgICBfaGlnaGxpZ2h0VGV4dEZvckJhc2ljQmxvY2s6IGZ1bmN0aW9uKGJhc2ljQmxv
Y2spCisgICAgeworICAgICAgICBjb25zb2xlLmFzc2VydChiYXNpY0Jsb2NrLnN0YXJ0T2Zmc2V0
IDw9IGJhc2ljQmxvY2suZW5kT2Zmc2V0ICYmIGJhc2ljQmxvY2suc3RhcnRPZmZzZXQgPj0gMCAm
JiBiYXNpY0Jsb2NrLmVuZE9mZnNldCA+PSAwLCAiIiArIGJhc2ljQmxvY2suc3RhcnRPZmZzZXQg
KyAiOiIgKyBiYXNpY0Jsb2NrLmVuZE9mZnNldCk7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KCFi
YXNpY0Jsb2NrLmhhc0V4ZWN1dGVkKTsKKworICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHRo
aXMuc291cmNlQ29kZVRleHRFZGl0b3Iub3JpZ2luYWxPZmZzZXRUb0N1cnJlbnRQb3NpdGlvbihi
YXNpY0Jsb2NrLnN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgdmFyIGVuZFBvc2l0aW9uID0gdGhpcy5z
b3VyY2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3VycmVudFBvc2l0aW9uKGJhc2lj
QmxvY2suZW5kT2Zmc2V0KTsKKworICAgICAgICBpZiAodGhpcy5faXNUZXh0UmFuZ2VPbmx5V2hp
dGVzcGFjZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4g
bnVsbDsKKworICAgICAgICAvLyBHcmF5IG91dCB0aGUgdGV4dCByYW5nZS4KKyAgICAgICAgdmFy
IG1hcmtlciA9IHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3IuYWRkU3R5bGVUb1RleHRSYW5nZShz
dGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0
b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWUpOworCisgICAgICAgIC8vIFdoZW4gYWRkaW5nIGEg
c3R5bGUgdG8gdGhlIGNvZGUgcmFuZ2UgaW4gQ29kZU1pcnJvciwgc3VjaCBhcyBhIGJhY2tncm91
bmQgY29sb3IsIGl0IHdpbGwgb25seSBhcHBseSB0aGUgc3R5bGUKKyAgICAgICAgLy8gdG8gdGhl
IGFyZWEgd2hlcmUgdGV4dCBpcywgbm90IHRvIHRoZSBzdHlsZSBvZiBhbiBlbnRpcmUgbGluZS4g
QnV0LCBmcm9tIGEgdXNlciBpbnRlcmZhY2UgcGVyc3BlY3RpdmUsIGl0IGxvb2tzCisgICAgICAg
IC8vIGNsZWFuZXIgdG8gaGF2ZSBlbnRpcmUgbGluZXMgaGlnaGxpZ2h0ZWQuIFRoZSBmb2xsb3dp
bmcgbG9naWMgZ3JheXMgb3V0IGVudGlyZSBsaW5lcyB3aGVuIHRoZSBsaW5lJ3MgcmFuZ2UgaXMK
KyAgICAgICAgLy8gbm90IGFjcm9zcyBiYXNpYyBibG9jayBib3VuZGFyaWVzLgorICAgICAgICB2
YXIgbGluZU51bWJlcnMgPSBbXTsKKyAgICAgICAgaWYgKGVuZFBvc2l0aW9uLmxpbmUgPiBzdGFy
dFBvc2l0aW9uLmxpbmUpIHsKKyAgICAgICAgICAgIHZhciBzdGFydExpbmVFbmRQb3NpdGlvbiA9
IHsgbGluZTogc3RhcnRQb3NpdGlvbi5saW5lLCBjaDogdGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRv
ci5saW5lKHN0YXJ0UG9zaXRpb24ubGluZSkubGVuZ3RoIH07CisgICAgICAgICAgICBpZiAodGhp
cy5fY2FuR3JheU91dEVudGlyZUxpbmUoc3RhcnRQb3NpdGlvbi5saW5lLCBzdGFydFBvc2l0aW9u
LCBzdGFydExpbmVFbmRQb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9ncmF5T3V0
TGluZShzdGFydFBvc2l0aW9uLmxpbmUpOworICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJzLnB1
c2goc3RhcnRQb3NpdGlvbi5saW5lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFy
IGVuZExpbmVTdGFydFBvc2l0aW9uID0geyBsaW5lOiBlbmRQb3NpdGlvbi5saW5lLCBjaDogMCB9
OworICAgICAgICAgICAgaWYgKHRoaXMuX2NhbkdyYXlPdXRFbnRpcmVMaW5lKGVuZFBvc2l0aW9u
LmxpbmUsIGVuZExpbmVTdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpIHsKKyAgICAgICAgICAg
ICAgICB0aGlzLl9ncmF5T3V0TGluZShlbmRQb3NpdGlvbi5saW5lKTsKKyAgICAgICAgICAgICAg
ICBsaW5lTnVtYmVycy5wdXNoKGVuZFBvc2l0aW9uLmxpbmUpOworICAgICAgICAgICAgfQorICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoZW5kUG9zaXRpb24ubGlu
ZSA9PT0gc3RhcnRQb3NpdGlvbi5saW5lKTsKKyAgICAgICAgICAgIGlmICh0aGlzLl9jYW5HcmF5
T3V0RW50aXJlTGluZShzdGFydFBvc2l0aW9uLmxpbmUsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0
aW9uKSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2dyYXlPdXRMaW5lKHN0YXJ0UG9zaXRpb24u
bGluZSk7CisgICAgICAgICAgICAgICAgbGluZU51bWJlcnMucHVzaChzdGFydFBvc2l0aW9uLmxp
bmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZFBvc2l0aW9u
LmxpbmUgLSBzdGFydFBvc2l0aW9uLmxpbmUgPj0gMikgeworICAgICAgICAgICAgLy8gVGhlcmUg
aXMgYXQgbGVhc3Qgb25lIGVudGlyZSBsaW5lIHRvIGJlIGdyYXllZCBvdXQgYmV0d2VlbiB0aGUg
c3RhcnQgYW5kIGVuZCBwb3NpdGlvbiBvZiB0aGUgYmFzaWMgYmxvY2s6CisgICAgICAgICAgICAv
LyBuICA6IC4uLgorICAgICAgICAgICAgLy8gbisxOiAuLi4gKFRoaXMgZW50aXJlIGxpbmUgY2Fu
IHNhZmVseSBiZSBncmF5ZWQgb3V0KS4KKyAgICAgICAgICAgIC8vIG4rMjogLi4uCisgICAgICAg
ICAgICBmb3IgKHZhciBsaW5lTnVtYmVyID0gc3RhcnRQb3NpdGlvbi5saW5lICsgMTsgbGluZU51
bWJlciA8IGVuZFBvc2l0aW9uLmxpbmU7IGxpbmVOdW1iZXIrKykgeworICAgICAgICAgICAgICAg
IHRoaXMuX2dyYXlPdXRMaW5lKGxpbmVOdW1iZXIpCisgICAgICAgICAgICAgICAgbGluZU51bWJl
cnMucHVzaChsaW5lTnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiB7bWFya2VyOiBtYXJrZXIsIGxpbmVOdW1iZXJzOiBsaW5lTnVtYmVyc307CisgICAg
fSwKKworICAgIF9pc1RleHRSYW5nZU9ubHlXaGl0ZXNwYWNlOiBmdW5jdGlvbihzdGFydFBvc2l0
aW9uLCBlbmRQb3NpdGlvbikKKyAgICB7CisgICAgICAgIHZhciBpc09ubHlXaGl0ZXNwYWNlID0g
L15ccyskLzsKKyAgICAgICAgcmV0dXJuIGlzT25seVdoaXRlc3BhY2UudGVzdCh0aGlzLnNvdXJj
ZUNvZGVUZXh0RWRpdG9yLmdldFRleHRJblJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9u
KSk7CisgICAgfSwKKworICAgIF9jYW5HcmF5T3V0RW50aXJlTGluZTogZnVuY3Rpb24obGluZU51
bWJlciwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pCisgICAgeworICAgICAgICB2YXIgbGlu
ZVRleHQgPSB0aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLmxpbmUobGluZU51bWJlcik7CisgICAg
ICAgIHZhciBibG9ja1RleHQgPSB0aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLmdldFRleHRJblJh
bmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKKyAgICAgICAgbGluZVRleHQgPSBsaW5l
VGV4dC5yZXBsYWNlKC9ccy9nLCAiIik7CisgICAgICAgIGJsb2NrVGV4dCA9IGJsb2NrVGV4dC5y
ZXBsYWNlKC9ccy9nLCAiIik7CisgICAgICAgIGlmIChsaW5lVGV4dCA9PT0gYmxvY2tUZXh0KQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAor
CisgICAgX2dyYXlPdXRMaW5lOiBmdW5jdGlvbihsaW5lTnVtYmVyKQorICAgIHsKKyAgICAgICAg
dmFyIGNsYXNzTmFtZSA9IFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yLkhhc05vdEV4
ZWN1dGVkQ2xhc3NOYW1lOworICAgICAgICB0aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLmFkZFN0
eWxlQ2xhc3NUb0xpbmUobGluZU51bWJlciwgY2xhc3NOYW1lKTsKKyAgICB9LAorCisgICAgX2Ns
ZWFyUmFuZ2VGb3JCYXNpY0Jsb2NrTWFya2VyOiBmdW5jdGlvbihrZXkpCisgICAgeworICAgICAg
ICBjb25zb2xlLmFzc2VydCh0aGlzLl9iYXNpY0Jsb2NrTWFya2Vycy5oYXMoa2V5KSk7CisgICAg
ICAgIHZhciB7bWFya2VyLCBsaW5lTnVtYmVyc30gPSB0aGlzLl9iYXNpY0Jsb2NrTWFya2Vycy5n
ZXQoa2V5KTsKKyAgICAgICAgbWFya2VyLmNsZWFyKCk7CisgICAgICAgIHZhciBjbGFzc05hbWUg
PSBXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5IYXNOb3RFeGVjdXRlZENsYXNzTmFt
ZTsKKyAgICAgICAgZm9yICh2YXIgbGluZU51bWJlciBvZiBsaW5lTnVtYmVycykKKyAgICAgICAg
ICAgIHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3IucmVtb3ZlU3R5bGVDbGFzc0Zyb21MaW5lKGxp
bmVOdW1iZXIsIGNsYXNzTmFtZSk7CisgICAgICAgIHRoaXMuX2Jhc2ljQmxvY2tNYXJrZXJzLmRl
bGV0ZShrZXkpOworICAgIH0KK307CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5jc3MKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0
b3IuY3NzCShyZXZpc2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5jc3MJKHdvcmtpbmcgY29weSkKQEAg
LTc2LDMgKzc2LDcgQEAKIAogICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7
CiB9CisKKy5iYXNpYy1ibG9jay1oYXMtbm90LWV4ZWN1dGVkIHsKKyAgICBiYWNrZ3JvdW5kLWNv
bG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7Cit9CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4
dEVkaXRvci5qcwkocmV2aXNpb24gMTc4NDkxKQorKysgU291cmNlL1dlYkluc3BlY3RvclVJL1Vz
ZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0b3IuanMJKHdvcmtpbmcgY29weSkK
QEAgLTM5LDYgKzM5LDggQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yID0gZnVu
YwogICAgIHRoaXMuX3R5cGVUb2tlblNjcm9sbEhhbmRsZXIgPSBudWxsOwogICAgIHRoaXMuX2Fu
bm90YXRvck1hbmFnZXIgPSBuZXcgV2ViSW5zcGVjdG9yLkFubm90YXRvck1hbmFnZXI7CiAKKyAg
ICB0aGlzLl9oYXNGb2N1cyA9IGZhbHNlOworCiAgICAgLy8gRklYTUU6IEN1cnJlbnRseSB0aGlz
IGp1c3QganVtcHMgYmV0d2VlbiByZXNvdXJjZXMgYW5kIHJlbGF0ZWQgc291cmNlIG1hcCByZXNv
dXJjZXMuIEl0IGRvZXNuJ3QgImp1bXAgdG8gc3ltYm9sIiB5ZXQuCiAgICAgdGhpcy5fdXBkYXRl
VG9rZW5UcmFja2luZ0NvbnRyb2xsZXJTdGF0ZSgpOwogCkBAIC05MSw2ICs5Myw3IEBAIFdlYklu
c3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5EdXJhdGkKIFdlYkluc3BlY3Rvci5Tb3VyY2VD
b2RlVGV4dEVkaXRvci5BdXRvRm9ybWF0TWluaW11bUxpbmVMZW5ndGggPSA1MDA7CiAKIFdlYklu
c3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkgPSAiVHlw
ZVRva2VuQW5ub3RhdG9yS2V5IjsKK1dlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5C
YXNpY0Jsb2NrQW5ub3RhdG9yS2V5ID0gIkJhc2ljQmxvY2tBbm5vdGF0b3JLZXkiOwogCiBXZWJJ
bnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuRXZlbnQgPSB7CiAgICAgQ29udGVudFdpbGxQ
b3B1bGF0ZTogInNvdXJjZS1jb2RlLXRleHQtZWRpdG9yLWNvbnRlbnQtd2lsbC1wb3B1bGF0ZSIs
CkBAIC0yNjIsMjIgKzI2NSw0NiBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3Iu
cHJvdG90CiAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2Vu
QW5ub3RhdG9yKCk7CiAgICAgfSwKIAorICAgIGdhaW5lZEZvY3VzOiBmdW5jdGlvbigpCisgICAg
eworICAgICAgICB0aGlzLl9oYXNGb2N1cyA9IHRydWU7CisgICAgICAgIHZhciBiYXNpY0Jsb2Nr
QW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2ViSW5zcGVj
dG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3JLZXkpOworICAgICAg
ICBpZiAoYmFzaWNCbG9ja0Fubm90YXRvcikKKyAgICAgICAgICAgIGJhc2ljQmxvY2tBbm5vdGF0
b3IuY2xlYXIoKTsKKyAgICB9LAorCisgICAgbG9zdEZvY3VzOiBmdW5jdGlvbigpCisgICAgewor
ICAgICAgICB0aGlzLl9oYXNGb2N1cyA9IGZhbHNlOworICAgICAgICB2YXIgYmFzaWNCbG9ja0Fu
bm90YXRvciA9IHRoaXMuX2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5CYXNpY0Jsb2NrQW5ub3RhdG9yS2V5KTsKKyAgICAgICAg
aWYgKGJhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICBiYXNpY0Jsb2NrQW5ub3RhdG9y
LnJlc3VtZSgpOworICAgIH0sCisKICAgICB0b2dnbGVUeXBlQW5ub3RhdGlvbnM6IGZ1bmN0aW9u
KCkKICAgICB7CiAgICAgICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSB0aGlzLl9hbm5vdGF0
b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3Iu
VHlwZVRva2VuQW5ub3RhdG9yS2V5KTsKKyAgICAgICAgdmFyIGJhc2ljQmxvY2tBbm5vdGF0b3Ig
PSB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNl
Q29kZVRleHRFZGl0b3IuQmFzaWNCbG9ja0Fubm90YXRvcktleSk7CiAgICAgICAgIGlmICghdHlw
ZVRva2VuQW5ub3RhdG9yKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIHZh
ciBpc0FjdGl2YXRlZCA9IHR5cGVUb2tlbkFubm90YXRvci50b2dnbGVUeXBlQW5ub3RhdGlvbnMo
KTsKICAgICAgICAgaWYgKGlzQWN0aXZhdGVkKSB7CisgICAgICAgICAgICBpZiAoYmFzaWNCbG9j
a0Fubm90YXRvciAmJiAhYmFzaWNCbG9ja0Fubm90YXRvci5pc0FjdGl2ZSkKKyAgICAgICAgICAg
ICAgICBiYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc2V0KCk7CisKICAgICAgICAgICAgIFJ1bnRpbWVB
Z2VudC5lbmFibGVUeXBlUHJvZmlsZXIoKTsKICAgICAgICAgICAgIHRoaXMuX2VuYWJsZVNjcm9s
bEV2ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOwogICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgaWYgKGJhc2ljQmxvY2tBbm5vdGF0b3IgJiYgYmFzaWNCbG9ja0Fubm90YXRvci5pc0Fj
dGl2ZSkKKyAgICAgICAgICAgICAgICBiYXNpY0Jsb2NrQW5ub3RhdG9yLmNsZWFyKCk7CisKICAg
ICAgICAgICAgIC8vIFdlIGRpc2FibGUgdHlwZSBwcm9maWxpbmcgd2hlbiBleGl0aW5nIHRoZSBp
bnNwZWN0b3IsIHNvIG5vIG5lZWQgdG8gY2FsbCBpdCBoZXJlLiBJZiB3ZSB3ZXJlCiAgICAgICAg
ICAgICAvLyB0byBjYWxsIGl0IGhlcmUsIHdlIHdvdWxkIGhhdmUgSmF2YVNjcmlwdENvcmUgY29t
cGlsZSBvdXQgYWxsIHRoZSBuZWNlc3NhcnkgdHlwZSBwcm9maWxpbmcgaW5mb3JtYXRpb24sCiAg
ICAgICAgICAgICAvLyBzbyBpZiBhIHVzZXIgd2VyZSB0byBxdWlja2x5IHByZXNzIHRoZW4gdW5w
cmVzcyB0aGUgYnV0dG9uLCB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHJlLXNob3cgdHlwZSBpbmZv
cm1hdGlvbi4KICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVTY3JvbGxFdmVudHNGb3JUeXBlVG9r
ZW5Bbm5vdGF0b3IoKTsKICAgICAgICAgfQorCiAgICAgICAgIFdlYkluc3BlY3Rvci5zaG93SmF2
YVNjcmlwdFR5cGVJbmZvcm1hdGlvblNldHRpbmcudmFsdWUgPSBpc0FjdGl2YXRlZDsKIAogICAg
ICAgICB0aGlzLl91cGRhdGVUb2tlblRyYWNraW5nQ29udHJvbGxlclN0YXRlKCk7CkBAIC00Mzcs
NiArNDY0LDE5IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAg
ICAgICAgdGhpcy5zdHJpbmcgPSBjb250ZW50OwogCiAgICAgICAgIHRoaXMuX21ha2VUeXBlVG9r
ZW5Bbm5vdGF0b3IoKTsKKyAgICAgICAgdGhpcy5fbWFrZUJhc2ljQmxvY2tBbm5vdGF0b3IoKTsK
KworICAgICAgICBpZiAoV2ViSW5zcGVjdG9yLnNob3dKYXZhU2NyaXB0VHlwZUluZm9ybWF0aW9u
U2V0dGluZy52YWx1ZSkgeworICAgICAgICAgICAgdmFyIGJhc2ljQmxvY2tBbm5vdGF0b3IgPSB0
aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29k
ZVRleHRFZGl0b3IuQmFzaWNCbG9ja0Fubm90YXRvcktleSk7CisgICAgICAgICAgICB2YXIgdHlw
ZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2Vi
SW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRvcktleSk7CisK
KyAgICAgICAgICAgIGlmIChiYXNpY0Jsb2NrQW5ub3RhdG9yKQorICAgICAgICAgICAgICAgIGJh
c2ljQmxvY2tBbm5vdGF0b3IucmVzZXQoKTsKKyAgICAgICAgICAgIGlmICh0eXBlVG9rZW5Bbm5v
dGF0b3IpCisgICAgICAgICAgICAgICAgdHlwZVRva2VuQW5ub3RhdG9yLnJlc2V0KCk7CisgICAg
ICAgICAgICBpZiAodHlwZVRva2VuQW5ub3RhdG9yIHx8IGJhc2ljQmxvY2tBbm5vdGF0b3IpCisg
ICAgICAgICAgICAgICAgdGhpcy5fZW5hYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3Rh
dG9yKCk7CisgICAgICAgIH0KIAogICAgICAgICB0aGlzLl9jb250ZW50RGlkUG9wdWxhdGUoKTsK
ICAgICB9LApAQCAtMTU1MSwxMSArMTU5MSwxOSBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRl
eHRFZGl0b3IucHJvdG90CiAKICAgICAgICAgdmFyIHR5cGVUb2tlbkFubm90YXRvciA9IG5ldyBX
ZWJJbnNwZWN0b3IuVHlwZVRva2VuQW5ub3RhdG9yKHRoaXMsIHNjcmlwdCk7CiAgICAgICAgIHRo
aXMuX2Fubm90YXRvck1hbmFnZXIuYWRkQW5ub3RhdG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2Rl
VGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXksIHR5cGVUb2tlbkFubm90YXRvcik7Cisg
ICAgfSwKIAotICAgICAgICBpZiAoV2ViSW5zcGVjdG9yLnNob3dKYXZhU2NyaXB0VHlwZUluZm9y
bWF0aW9uU2V0dGluZy52YWx1ZSkgewotICAgICAgICAgICAgdHlwZVRva2VuQW5ub3RhdG9yLnJl
c2V0KCk7Ci0gICAgICAgICAgICB0aGlzLl9lbmFibGVTY3JvbGxFdmVudHNGb3JUeXBlVG9rZW5B
bm5vdGF0b3IoKTsKLSAgICAgICAgfQorICAgIF9tYWtlQmFzaWNCbG9ja0Fubm90YXRvcjogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgaWYgKCFSdW50aW1lQWdlbnQuZ2V0QmFzaWNCbG9ja3Mp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFyIHNjcmlwdCA9IHRoaXMuX2dldEFz
c29jaWF0ZWRTY3JpcHQoKTsKKyAgICAgICAgaWYgKCFzY3JpcHQpCisgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgdmFyIGJhc2ljQmxvY2tBbm5vdGF0b3IgPSBuZXcgV2ViSW5zcGVjdG9y
LkJhc2ljQmxvY2tBbm5vdGF0b3IodGhpcywgc2NyaXB0KTsKKyAgICAgICAgdGhpcy5fYW5ub3Rh
dG9yTWFuYWdlci5hZGRBbm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9y
LkJhc2ljQmxvY2tBbm5vdGF0b3JLZXksIGJhc2ljQmxvY2tBbm5vdGF0b3IpOwogICAgIH0sCiAK
ICAgICBfZW5hYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yOiBmdW5jdGlvbigp
CkBAIC0xNTc2LDIyICsxNjI0LDIzIEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRv
ci5wcm90b3QKICAgICBfbWFrZVR5cGVUb2tlblNjcm9sbEV2ZW50SGFuZGxlcjogZnVuY3Rpb24o
KQogICAgIHsKICAgICAgICAgdmFyIHRpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKLSAgICAgICAg
dmFyIHR5cGVUb2tlbkFubm90YXRvciA9IHRoaXMuX2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3Rh
dG9yKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JL
ZXkpOwogICAgICAgICBmdW5jdGlvbiBzY3JvbGxIYW5kbGVyKCkKICAgICAgICAgewogICAgICAg
ICAgICAgaWYgKHRpbWVvdXRJZGVudGlmaWVyKQogICAgICAgICAgICAgICAgIGNsZWFyVGltZW91
dCh0aW1lb3V0SWRlbnRpZmllcik7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
dHlwZVRva2VuQW5ub3RhdG9yLnBhdXNlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5fYW5ub3Rh
dG9yTWFuYWdlci5wYXVzZUFsbCgpOwogCiAgICAgICAgICAgICB0aW1lb3V0SWRlbnRpZmllciA9
IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgdGltZW91dElkZW50aWZp
ZXIgPSBudWxsOwogICAgICAgICAgICAgICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSB0aGlz
Ll9hbm5vdGF0b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRl
eHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9yS2V5KTsKLSAgICAgICAgICAgICAgICAvLyBUaGVy
ZSBpcyBhIHNtYWxsIGNoYW5jZSB0aGF0IHdlIGRpc2FibGVkIHRoZSB0eXBlIHRva2VuIGFubm90
YXRvciBhbmQgdGhlIHNjcm9sbCBoYW5kbGVyIAotICAgICAgICAgICAgICAgIC8vIGR1cmluZyB0
aGUgRHVyYXRpb25Ub1VwZGF0ZVR5cGVUb2tlbnNBZnRlclNjcm9sbGluZyB0aW1lIGRlbGF5LCBz
byB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMKLSAgICAgICAgICAgICAgICAvLyBpcyBub3QgbnVs
bC4KICAgICAgICAgICAgICAgICBpZiAodHlwZVRva2VuQW5ub3RhdG9yKQogICAgICAgICAgICAg
ICAgICAgICB0eXBlVG9rZW5Bbm5vdGF0b3IucmVzdW1lKCk7CisgICAgICAgICAgICAgICAgaWYg
KCF0aGlzLl9oYXNGb2N1cykgeworICAgICAgICAgICAgICAgICAgICB2YXIgYmFzaWNCbG9ja0Fu
bm90YXRvciA9IHRoaXMuX2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5CYXNpY0Jsb2NrQW5ub3RhdG9yS2V5KTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKGJhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICAgICAgICAg
ICAgICBiYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc3VtZSgpOworICAgICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgIH0uYmluZCh0aGlzKSwgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9y
LkR1cmF0aW9uVG9VcGRhdGVUeXBlVG9rZW5zQWZ0ZXJTY3JvbGxpbmcpOwogICAgICAgICB9CiAK
SW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RleHRFZGl0
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2Uv
Vmlld3MvVGV4dEVkaXRvci5qcwkocmV2aXNpb24gMTc4NDkxKQorKysgU291cmNlL1dlYkluc3Bl
Y3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVGV4dEVkaXRvci5qcwkod29ya2luZyBjb3B5KQpA
QCAtNDUsNiArNDUsOCBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvciA9IGZ1bmN0aW9uKGVsZW1l
CiAgICAgdGhpcy5fY29kZU1pcnJvci5vbigiY2hhbmdlIiwgdGhpcy5fY29udGVudENoYW5nZWQu
YmluZCh0aGlzKSk7CiAgICAgdGhpcy5fY29kZU1pcnJvci5vbigiZ3V0dGVyQ2xpY2siLCB0aGlz
Ll9ndXR0ZXJNb3VzZURvd24uYmluZCh0aGlzKSk7CiAgICAgdGhpcy5fY29kZU1pcnJvci5vbigi
Z3V0dGVyQ29udGV4dE1lbnUiLCB0aGlzLl9ndXR0ZXJDb250ZXh0TWVudS5iaW5kKHRoaXMpKTsK
KyAgICB0aGlzLl9jb2RlTWlycm9yLm9uKCJmb2N1cyIsIHRoaXMuZ2FpbmVkRm9jdXMuYmluZCh0
aGlzKSk7CisgICAgdGhpcy5fY29kZU1pcnJvci5vbigiYmx1ciIsIHRoaXMubG9zdEZvY3VzLmJp
bmQodGhpcykpOwogICAgIHRoaXMuX2NvZGVNaXJyb3IuZ2V0U2Nyb2xsZXJFbGVtZW50KCkuYWRk
RXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLl9vcGVuQ2xpY2tlZExpbmtzLmJpbmQodGhpcyks
IHRydWUpOwogCiAgICAgdGhpcy5fY29tcGxldGlvbkNvbnRyb2xsZXIgPSBuZXcgV2ViSW5zcGVj
dG9yLkNvZGVNaXJyb3JDb21wbGV0aW9uQ29udHJvbGxlcih0aGlzLl9jb2RlTWlycm9yLCB0aGlz
KTsKQEAgLTQ1NCw2ICs0NTYsMTYgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBl
ID0gewogICAgICAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvci5nZXRMaW5lKGxpbmVOdW1iZXIp
OwogICAgIH0sCiAKKyAgICBnZXRUZXh0SW5SYW5nZTogZnVuY3Rpb24oc3RhcnRQb3NpdGlvbiwg
ZW5kUG9zaXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvci5nZXRS
YW5nZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7CisgICAgfSwKKworICAgIGFkZFN0eWxl
VG9UZXh0UmFuZ2U6IGZ1bmN0aW9uKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBzdHlsZUNs
YXNzTmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldERvYygp
Lm1hcmtUZXh0KHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCB7Y2xhc3NOYW1lOiBzdHlsZUNs
YXNzTmFtZX0pOworICAgIH0sCisKICAgICByZXZlYWxQb3NpdGlvbjogZnVuY3Rpb24ocG9zaXRp
b24sIHRleHRSYW5nZVRvU2VsZWN0LCBmb3JjZVVuZm9ybWF0dGVkLCBub0hpZ2hsaWdodCkKICAg
ICB7CiAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9z
aXRpb24gaW5zdGFuY2VvZiBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVBvc2l0aW9uLCAicmV2ZWFs
UG9zaXRpb24gY2FsbGVkIHdpdGhvdXQgYSBTb3VyY2VDb2RlUG9zaXRpb24iKTsKQEAgLTgxNSw2
ICs4MjcsMTYgQEAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlID0gewogICAgICAg
ICB0aGlzLl9jb2RlTWlycm9yLm9wZXJhdGlvbihwcmV0dHlQcmludEFuZFVwZGF0ZUVkaXRvci5i
aW5kKHRoaXMpKTsKICAgICB9LAogCisgICAgZ2FpbmVkRm9jdXM6IGZ1bmN0aW9uKCkKKyAgICB7
CisgICAgICAgIC8vIEltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCisgICAgfSwKKworICAgIGxv
c3RGb2N1czogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgLy8gSW1wbGVtZW50ZWQgYnkgc3Vi
Y2xhc3Nlcy4KKyAgICB9LAorCiAgICAgLy8gUHJpdmF0ZQogCiAgICAgaGFzRWRpdHM6IGZ1bmN0
aW9uKCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>244794</attachid>
            <date>2015-01-16 13:03:04 -0800</date>
            <delta_ts>2015-01-16 23:35:04 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>35710</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTc4NTkxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBA
CisyMDE1LTAxLTE2ICBTYWFtIEJhcmF0aSAgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBQcm92aWRlIGEgZnJvbnQgZW5kIGZvciBKU0MncyBDb250cm9s
IEZsb3cgUHJvZmlsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTEzODQ1NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFRoaXMgcGF0Y2ggcHV0cyB0aGUgZmluYWwgdG91Y2hlcyBvbiB3aGF0IEpTQyBuZWVk
cyB0byBwcm92aWRlCisgICAgICAgIGZvciB0aGUgV2ViIEluc3BlY3RvciB0byBzaG93IGEgVUkg
Zm9yIHRoZSBjb250cm9sIGZsb3cgcHJvZmlsZXIuCisKKyAgICAgICAgKiBpbnNwZWN0b3IvYWdl
bnRzL0luc3BlY3RvclJ1bnRpbWVBZ2VudC5jcHA6CisgICAgICAgIChJbnNwZWN0b3I6OnJlY29t
cGlsZUFsbEpTRnVuY3Rpb25zRm9yVHlwZVByb2ZpbGluZyk6CisgICAgICAgICogcnVudGltZS9D
b250cm9sRmxvd1Byb2ZpbGVyLmNwcDoKKyAgICAgICAgKEpTQzo6Q29udHJvbEZsb3dQcm9maWxl
cjo6Z2V0QmFzaWNCbG9ja3NGb3JTb3VyY2VJRCk6CisgICAgICAgICogcnVudGltZS9GdW5jdGlv
bkhhc0V4ZWN1dGVkQ2FjaGUuY3BwOgorICAgICAgICAoSlNDOjpGdW5jdGlvbkhhc0V4ZWN1dGVk
Q2FjaGU6OmdldEZ1bmN0aW9uUmFuZ2VzKToKKyAgICAgICAgKEpTQzo6RnVuY3Rpb25IYXNFeGVj
dXRlZENhY2hlOjpnZXRVbmV4ZWN1dGVkRnVuY3Rpb25SYW5nZXMpOiBEZWxldGVkLgorICAgICAg
ICAqIHJ1bnRpbWUvRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmg6CisKIDIwMTUtMDEtMTYgIE1p
Y2hhZWwgU2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CiAKICAgICAgICAgUkVHUkVTU0lPTiAo
cjE3NDIyNik6IEhlYWRlciBvbiBodWZmaW5ndG9ucG9zdC5jb20gaXMgdG9vIGxhcmdlCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW5zcGVjdG9yL2FnZW50cy9JbnNwZWN0b3JSdW50aW1l
QWdlbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3Iv
YWdlbnRzL0luc3BlY3RvclJ1bnRpbWVBZ2VudC5jcHAJKHJldmlzaW9uIDE3ODQ5MSkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9pbnNwZWN0b3IvYWdlbnRzL0luc3BlY3RvclJ1bnRpbWVBZ2Vu
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3MSwxMCArMjcxLDEyIEBAIHB1YmxpYzoKIAogc3Rh
dGljIHZvaWQgcmVjb21waWxlQWxsSlNGdW5jdGlvbnNGb3JUeXBlUHJvZmlsaW5nKFZNJiB2bSwg
Ym9vbCBzaG91bGRFbmFibGVUeXBlUHJvZmlsaW5nKQogewotICAgIHZtLnByZXBhcmVUb0Rpc2Nh
cmRDb2RlKCk7CisgICAgYm9vbCBzaG91bGRSZWNvbXBpbGVGcm9tVHlwZVByb2ZpbGVyID0gKHNo
b3VsZEVuYWJsZVR5cGVQcm9maWxpbmcgPyB2bS5lbmFibGVUeXBlUHJvZmlsZXIoKSA6IHZtLmRp
c2FibGVUeXBlUHJvZmlsZXIoKSk7IAorICAgIGJvb2wgc2hvdWxkUmVjb21waWxlRnJvbUNvbnRy
b2xGbG93UHJvZmlsZXIgPSAoc2hvdWxkRW5hYmxlVHlwZVByb2ZpbGluZyA/IHZtLmVuYWJsZUNv
bnRyb2xGbG93UHJvZmlsZXIoKSA6IHZtLmRpc2FibGVDb250cm9sRmxvd1Byb2ZpbGVyKCkpOwor
ICAgIGJvb2wgbmVlZHNUb1JlY29tcGlsZSA9IHNob3VsZFJlY29tcGlsZUZyb21UeXBlUHJvZmls
ZXIgfHwgc2hvdWxkUmVjb21waWxlRnJvbUNvbnRyb2xGbG93UHJvZmlsZXI7CiAKLSAgICBib29s
IG5lZWRzVG9SZWNvbXBpbGUgPSAoc2hvdWxkRW5hYmxlVHlwZVByb2ZpbGluZyA/IHZtLmVuYWJs
ZVR5cGVQcm9maWxlcigpIDogdm0uZGlzYWJsZVR5cGVQcm9maWxlcigpKTsKICAgICBpZiAobmVl
ZHNUb1JlY29tcGlsZSkgeworICAgICAgICB2bS5wcmVwYXJlVG9EaXNjYXJkQ29kZSgpOwogICAg
ICAgICBUeXBlUmVjb21waWxlciByZWNvbXBpbGVyOwogICAgICAgICBIZWFwSXRlcmF0aW9uU2Nv
cGUgaXRlcmF0aW9uU2NvcGUodm0uaGVhcCk7CiAgICAgICAgIHZtLmhlYXAub2JqZWN0U3BhY2Uo
KS5mb3JFYWNoTGl2ZUNlbGwoaXRlcmF0aW9uU2NvcGUsIHJlY29tcGlsZXIpOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29udHJvbEZsb3dQcm9maWxlci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29udHJvbEZsb3dQcm9maWxl
ci5jcHAJKHJldmlzaW9uIDE3ODQ5MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0NvbnRyb2xGbG93UHJvZmlsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MSwxMiArODEsMTIg
QEAgVmVjdG9yPEJhc2ljQmxvY2tSYW5nZT4gQ29udHJvbEZsb3dQcm9maQogICAgICAgICB9CiAg
ICAgfQogCi0gICAgY29uc3QgVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+PiYg
dW5leGVjdXRlZEZ1bmN0aW9uUmFuZ2VzID0gdm0uZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCkt
PmdldFVuZXhlY3V0ZWRGdW5jdGlvblJhbmdlcyhzb3VyY2VJRCk7CisgICAgY29uc3QgVmVjdG9y
PHN0ZDo6dHVwbGU8Ym9vbCwgdW5zaWduZWQsIHVuc2lnbmVkPj4mIHVuZXhlY3V0ZWRGdW5jdGlv
blJhbmdlcyA9IHZtLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5nZXRGdW5jdGlvblJhbmdl
cyhzb3VyY2VJRCk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBmdW5jdGlvblJhbmdlIDogdW5leGVj
dXRlZEZ1bmN0aW9uUmFuZ2VzKSB7CiAgICAgICAgIEJhc2ljQmxvY2tSYW5nZSByYW5nZTsKLSAg
ICAgICAgcmFuZ2UubV9oYXNFeGVjdXRlZCA9IGZhbHNlOwotICAgICAgICByYW5nZS5tX3N0YXJ0
T2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihmdW5jdGlvblJhbmdlLmZpcnN0KTsKLSAgICAgICAg
cmFuZ2UubV9lbmRPZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KGZ1bmN0aW9uUmFuZ2Uuc2Vjb25k
ICsgMSk7CisgICAgICAgIHJhbmdlLm1faGFzRXhlY3V0ZWQgPSBzdGQ6OmdldDwwPihmdW5jdGlv
blJhbmdlKTsKKyAgICAgICAgcmFuZ2UubV9zdGFydE9mZnNldCA9IHN0YXRpY19jYXN0PGludD4o
c3RkOjpnZXQ8MT4oZnVuY3Rpb25SYW5nZSkpOworICAgICAgICByYW5nZS5tX2VuZE9mZnNldCA9
IHN0YXRpY19jYXN0PGludD4oc3RkOjpnZXQ8Mj4oZnVuY3Rpb25SYW5nZSkgKyAxKTsKICAgICAg
ICAgcmVzdWx0LmFwcGVuZChyYW5nZSk7CiAgICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9GdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZS5j
cHAJKHJldmlzaW9uIDE3ODQ5MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1
bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgwLDE5ICs4MCwx
OCBAQCB2b2lkIEZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZTo6cmVtb3ZlVW5lCiAgICAgbWFwW3Jh
bmdlXSA9IHRydWU7CiB9CiAKLVZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj4g
RnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlOjpnZXRVbmV4ZWN1dGVkRnVuY3Rpb25SYW5nZXMoaW50
cHRyX3QgaWQpCitWZWN0b3I8c3RkOjp0dXBsZTxib29sLCB1bnNpZ25lZCwgdW5zaWduZWQ+PiBG
dW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGU6OmdldEZ1bmN0aW9uUmFuZ2VzKGludHB0cl90IGlkKQog
ewotICAgIFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj4gcmFuZ2VzKDApOwor
ICAgIFZlY3RvcjxzdGQ6OnR1cGxlPGJvb2wsIHVuc2lnbmVkLCB1bnNpZ25lZD4+IHJhbmdlcygw
KTsKICAgICBhdXRvIGZpbmRSZXN1bHQgPSBtX3JhbmdlTWFwLmZpbmQoaWQpOwogICAgIGlmIChm
aW5kUmVzdWx0ID09IG1fcmFuZ2VNYXAuZW5kKCkpCiAgICAgICAgIHJldHVybiByYW5nZXM7CiAK
ICAgICBSYW5nZU1hcCYgbWFwID0gbV9yYW5nZU1hcC5maW5kKGlkKS0+c2Vjb25kOwogICAgIGZv
ciAoYXV0byBpdGVyID0gbWFwLmJlZ2luKCksIGVuZCA9IG1hcC5lbmQoKTsgaXRlciAhPSBlbmQ7
ICsraXRlcikgewotICAgICAgICBpZiAoIWl0ZXItPnNlY29uZCkgewotICAgICAgICAgICAgY29u
c3QgRnVuY3Rpb25SYW5nZSYgcmFuZ2UgPSBpdGVyLT5maXJzdDsKLSAgICAgICAgICAgIHJhbmdl
cy5hcHBlbmQoc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4ocmFuZ2UubV9zdGFydCwgcmFu
Z2UubV9lbmQpKTsKLSAgICAgICAgfQorICAgICAgICBjb25zdCBGdW5jdGlvblJhbmdlJiByYW5n
ZSA9IGl0ZXItPmZpcnN0OworICAgICAgICBib29sIGhhc0V4ZWN1dGVkID0gaXRlci0+c2Vjb25k
OworICAgICAgICByYW5nZXMuYXBwZW5kKHN0ZDo6dHVwbGU8Ym9vbCwgdW5zaWduZWQsIHVuc2ln
bmVkPihoYXNFeGVjdXRlZCwgcmFuZ2UubV9zdGFydCwgcmFuZ2UubV9lbmQpKTsKICAgICB9CiAK
ICAgICByZXR1cm4gcmFuZ2VzOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
RnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmgJKHJldmlzaW9uIDE3ODQ5
MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uSGFzRXhlY3V0ZWRD
YWNoZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01Miw3ICs1Miw3IEBAIHB1YmxpYzoKICAgICBib29s
IGhhc0V4ZWN1dGVkQXRPZmZzZXQoaW50cHRyX3QgaWQsIHVuc2lnbmVkIG9mZnNldCk7CiAgICAg
dm9pZCBpbnNlcnRVbmV4ZWN1dGVkUmFuZ2UoaW50cHRyX3QgaWQsIHVuc2lnbmVkIHN0YXJ0LCB1
bnNpZ25lZCBlbmQpOwogICAgIHZvaWQgcmVtb3ZlVW5leGVjdXRlZFJhbmdlKGludHB0cl90IGlk
LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKLSAgICBWZWN0b3I8c3RkOjpwYWlyPHVu
c2lnbmVkLCB1bnNpZ25lZD4+IGdldFVuZXhlY3V0ZWRGdW5jdGlvblJhbmdlcyhpbnRwdHJfdCBp
ZCk7CisgICAgVmVjdG9yPHN0ZDo6dHVwbGU8Ym9vbCwgdW5zaWduZWQsIHVuc2lnbmVkPj4gZ2V0
RnVuY3Rpb25SYW5nZXMoaW50cHRyX3QgaWQpOwogCiBwcml2YXRlOiAgICAgCiAgICAgdHlwZWRl
ZiBzdGQ6OnVub3JkZXJlZF9tYXA8RnVuY3Rpb25SYW5nZSwgYm9vbCwgSGFzaE1ldGhvZDxGdW5j
dGlvblJhbmdlPj4gUmFuZ2VNYXA7CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cJKHJldmlz
aW9uIDE3ODU5MSkKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cJKHdvcmtpbmcg
Y29weSkKQEAgLTEsMyArMSw1NSBAQAorMjAxNS0wMS0xNiAgU2FhbSBCYXJhdGkgIDxzYWFtYmFy
YXRpMUBnbWFpbC5jb20+CisKKyAgICAgICAgV2ViIEluc3BlY3RvcjogUHJvdmlkZSBhIGZyb250
IGVuZCBmb3IgSlNDJ3MgQ29udHJvbCBGbG93IFByb2ZpbGVyCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzg0NTQKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGNyZWF0ZXMgYSB1c2VyIGlu
dGVyZmFjZSBmb3IgSlNDJ3MgY29udHJvbCBmbG93IHByb2ZpbGVyLgorICAgICAgICBUaGUgV2Vi
IEluc3BlY3RvciBnZXRzIGJhc2ljIGJsb2NrIHJhbmdlcyBmcm9tIEpTQywgYW5kIGRpc3BsYXlz
CisgICAgICAgIGJhc2ljIGJsb2NrcyB0aGF0IGhhdmUgbm90IGV4ZWN1dGVkIGFzIGhhdmluZyBh
IGdyYXkgYmFja2dyb3VuZC4KKyAgICAgICAgCisgICAgICAgIEJhc2ljQmxvY2tBbm5vdGF0b3Ig
aXMgdGhlIGNsYXNzIHJlc3BvbnNpYmxlIGZvciB0aGlzIFVJIGxvZ2ljLgorICAgICAgICBJdCBh
bHNvIGRvZXMgYSBmZXcgbmlmdHkgdGhpbmdzIHdoZW4gcHJlc2VudGluZyBhIFVJIGZvciB0aGlz
IGdyYXkKKyAgICAgICAgYmFja2dyb3VuZCBjb2xvcjogaWYgYW4gZW50aXJlIGxpbmUgb2YgY29k
ZSBpcyB3aXRoaW4gdGhlIGJhc2ljIAorICAgICAgICBibG9jaydzIGJvdW5kYXJ5LCB0aGUgYW5u
b3RhdG9yIHdpbGwgbm90IGp1c3QgaGlnaGxpZ2h0IHRoZSBiYWNrZ3JvdW5kIAorICAgICAgICBi
ZWhpbmQgdGhlIHRleHQsIGJ1dCB0aGUgYmFja2dyb3VuZCBvZiB0aGUgZW50aXJlIGxpbmUgaXRz
ZWxmLiBUaGlzCisgICAgICAgIHByb3ZpZGVzIGEgbmljZXIgZXhwZXJpZW5jZSB3aGVuIGdsYW5j
aW5nIHRocm91Z2ggbGFyZ2UgSmF2YVNjcmlwdCBmaWxlcy4KKworICAgICAgICBUaGlzIHBhdGNo
IGFsc28gYWRkcyBzb21lIG5lY2Vzc2FyeSB3cmFwcGVyIG1ldGhvZHMgaW5zaWRlIFRleHRFZGl0
b3IKKyAgICAgICAgZm9yIGFjY2Vzc2luZyBDb2RlTWlycm9yJ3MgdGV4dCBoaWdobGlnaHRpbmcg
ZnVuY3Rpb25hbGl0eS4gSXQgYWxzbworICAgICAgICBjcmVhdGVzIGEgd2F5IGZvciBUZXh0RWRp
dG9yIGFuZCBTb3VyY2VDb2RlVGV4dEVkaXRvciB0byBsaXN0ZW4KKyAgICAgICAgZm9yIGZvY3Vz
IGV2ZW50cyBpbnNpZGUgQ29kZU1pcnJvci4KKworICAgICAgICAqIFVzZXJJbnRlcmZhY2UvQ29u
dHJvbGxlcnMvQW5ub3RhdG9yTWFuYWdlci5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBVc2VySW50
ZXJmYWNlL01haW4uaHRtbDoKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNv
ZGVUZXh0RWRpdG9yLmNzczoKKyAgICAgICAgKC5iYXNpYy1ibG9jay1oYXMtbm90LWV4ZWN1dGVk
KToKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmpz
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yKToKKyAgICAgICAg
KFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUuc2hvd24pOgorICAg
ICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS5oaWRkZW4p
OgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS5j
YW5TaG93VHlwZUFubm90YXRpb25zKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2Rl
VGV4dEVkaXRvci5wcm90b3R5cGUuY29udGVudERpZENoYW5nZSk6CisgICAgICAgIChXZWJJbnNw
ZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLmdhaW5lZEZvY3VzKToKKyAgICAg
ICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUubG9zdEZvY3Vz
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUu
dG9nZ2xlVHlwZUFubm90YXRpb25zKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2Rl
VGV4dEVkaXRvci5wcm90b3R5cGUucHJldHR5UHJpbnQpOgorICAgICAgICAoV2ViSW5zcGVjdG9y
LlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS5fcG9wdWxhdGVXaXRoQ29udGVudCk6Cisg
ICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLl9kZWJ1
Z2dlckRpZFBhdXNlKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRv
ci5wcm90b3R5cGUuX2RlYnVnZ2VyRGlkUmVzdW1lKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5T
b3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUuX3VwZGF0ZVRva2VuVHJhY2tpbmdDb250cm9s
bGVyU3RhdGUpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnBy
b3RvdHlwZS5fbWFrZVR5cGVUb2tlbkFubm90YXRvcik6CisgICAgICAgIChXZWJJbnNwZWN0b3Iu
U291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLl9tYWtlQmFzaWNCbG9ja0Fubm90YXRvcik6
CisgICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLl9t
YWtlVHlwZVRva2VuU2Nyb2xsRXZlbnRIYW5kbGVyLnNjcm9sbEhhbmRsZXIpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS5fbWFrZVR5cGVUb2tl
blNjcm9sbEV2ZW50SGFuZGxlcik6CisgICAgICAgICogVXNlckludGVyZmFjZS9WaWV3cy9UZXh0
RWRpdG9yLmpzOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IpOgorICAgICAgICAo
V2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLmdldFRleHRJblJhbmdlKToKKyAgICAg
ICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5hZGRTdHlsZVRvVGV4dFJhbmdl
KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5nYWluZWRGb2N1
cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUubG9zdEZvY3Vz
KToKKwogMjAxNS0wMS0xNSAgSm9zZXBoIFBlY29yYXJvICA8cGVjb3Jhcm9AYXBwbGUuY29tPgog
CiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IFVuY2F1Z2h0IGV4Y2VwdGlvbnMsIGF0dGVtcHRpbmcg
dG8gZGlzcGF0Y2ggdW5pbXBsZW1lbnRlZCBOZXR3b3JrIFdlYlNvY2tldCBtZXRob2RzCkluZGV4
OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9NYWluLmh0bWwKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvTWFpbi5odG1sCShyZXZp
c2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9NYWlu
Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTQ2Myw4ICs0NjMsOCBAQAogICAgIDxzY3JpcHQgc3Jj
PSJDb250cm9sbGVycy9Db2RlTWlycm9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0Pgog
CiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0FuYWx5emVyTWFuYWdlci5qcyI+PC9zY3Jp
cHQ+Ci0gICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Fubm90YXRvck1hbmFnZXIuanMiPjwv
c2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9BcHBsaWNhdGlvbkNhY2hlTWFu
YWdlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Jhc2ljQmxv
Y2tBbm5vdGF0b3IuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9C
cmFuY2hNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJvbGxlcnMv
Q1NTU3R5bGVNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJvbGxl
cnMvQ29kZU1pcnJvckNvbG9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0PgpJbmRleDog
U291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvQW5ub3RhdG9y
TWFuYWdlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVy
ZmFjZS9Db250cm9sbGVycy9Bbm5vdGF0b3JNYW5hZ2VyLmpzCShyZXZpc2lvbiAxNzg0OTEpCisr
KyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9Bbm5vdGF0
b3JNYW5hZ2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJp
Z2h0IChDKSAyMDE0IFNhYW0gQmFyYXRpIDxzYWFtYmFyYXRpMUBnbWFpbC5jb20+Ci0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLVdlYkluc3BlY3Rvci5Bbm5vdGF0b3JNYW5hZ2VyID0gZnVuY3Rpb24oKQotewotICAgIFdl
Ykluc3BlY3Rvci5PYmplY3QuY2FsbCh0aGlzKTsKLQotICAgIHRoaXMuX2Fubm90YXRvcnMgPSBu
ZXcgTWFwOwotfTsKLQotV2ViSW5zcGVjdG9yLkFubm90YXRvck1hbmFnZXIucHJvdG90eXBlID0g
ewotICAgIGNvbnN0cnVjdG9yOiBXZWJJbnNwZWN0b3IuQW5ub3RhdG9yTWFuYWdlciwKLSAgICBf
X3Byb3RvX186IFdlYkluc3BlY3Rvci5PYmplY3QucHJvdG90eXBlLAotCi0gICAgLy8gUHVibGlj
Ci0KLSAgICBhZGRBbm5vdGF0b3I6IGZ1bmN0aW9uKGtleSwgYW5ub3RhdG9yKQotICAgIHsKLSAg
ICAgICAgY29uc29sZS5hc3NlcnQoYW5ub3RhdG9yIGluc3RhbmNlb2YgV2ViSW5zcGVjdG9yLkFu
bm90YXRvcik7Ci0gICAgICAgIHRoaXMuX2Fubm90YXRvcnMuc2V0KGtleSwgYW5ub3RhdG9yKTsK
LSAgICB9LAotCi0gICAgZ2V0QW5ub3RhdG9yOiBmdW5jdGlvbihrZXkpCi0gICAgewotICAgICAg
ICByZXR1cm4gdGhpcy5fYW5ub3RhdG9ycy5nZXQoa2V5KSB8fCBudWxsOwotICAgIH0sCi0KLSAg
ICBpc0Fubm90YXRvckFjdGl2ZTogZnVuY3Rpb24oa2V5KQotICAgIHsKLSAgICAgICAgdmFyIGFu
bm90YXRvciA9IHRoaXMuZ2V0QW5ub3RhdG9yKGtleSk7Ci0gICAgICAgIGlmICghYW5ub3RhdG9y
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gYW5ub3RhdG9yLmlz
QWN0aXZlOwotICAgIH0sCi0KLSAgICBwYXVzZUFsbDogZnVuY3Rpb24oKQotICAgIHsKLSAgICAg
ICAgZm9yICh2YXIgYW5ub3RhdG9yIG9mIHRoaXMuX2Fubm90YXRvcnMudmFsdWVzKCkpCi0gICAg
ICAgICAgICBhbm5vdGF0b3IucGF1c2UoKTsKLSAgICB9LAotCi0gICAgcmVzdW1lQWxsOiBmdW5j
dGlvbigpCi0gICAgewotICAgICAgICBmb3IgKHZhciBhbm5vdGF0b3Igb2YgdGhpcy5fYW5ub3Rh
dG9ycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIGFubm90YXRvci5yZXN1bWUoKTsKLSAgICB9LAot
Ci0gICAgcmVmcmVzaEFsbElmQWN0aXZlOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICBmb3Ig
KHZhciBhbm5vdGF0b3Igb2YgdGhpcy5fYW5ub3RhdG9ycy52YWx1ZXMoKSkgewotICAgICAgICAg
ICAgaWYgKGFubm90YXRvci5pc0FjdGl2ZSkKLSAgICAgICAgICAgICAgICBhbm5vdGF0b3IucmVm
cmVzaCgpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIHJlc2V0QWxsSWZBY3RpdmU6IGZ1bmN0
aW9uKCkKLSAgICB7Ci0gICAgICAgIGZvciAodmFyIGFubm90YXRvciBvZiB0aGlzLl9hbm5vdGF0
b3JzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdG9yLmlzQWN0aXZlKQotICAg
ICAgICAgICAgICAgIGFubm90YXRvci5yZXNldCgpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAg
IGNsZWFyQWxsOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICBmb3IgKHZhciBhbm5vdGF0b3Ig
b2YgdGhpcy5fYW5ub3RhdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIGFubm90YXRvci5jbGVh
cigpOwotICAgIH0sCi0KLSAgICByZW1vdmVBbGxBbm5vdGF0b3JzOiBmdW5jdGlvbigpCi0gICAg
ewotICAgICAgICB0aGlzLl9hbm5vdGF0b3JzLmNsZWFyKCk7Ci0gICAgfQotfTsKSW5kZXg6IFNv
dXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL0Jhc2ljQmxvY2tB
bm5vdGF0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRl
cmZhY2UvQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcwkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL0Jhc2ljQmxv
Y2tBbm5vdGF0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDE1IFNhYW0gQmFyYXRpIDxzYWFtYmFyYXRpMUBnbWFpbC5jb20+CisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKK1dlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yID0gZnVuY3Rpb24oc291cmNl
Q29kZVRleHRFZGl0b3IsIHNjcmlwdCkKK3sKKyAgICBXZWJJbnNwZWN0b3IuQW5ub3RhdG9yLmNh
bGwodGhpcywgc291cmNlQ29kZVRleHRFZGl0b3IpOworCisgICAgdGhpcy5fc2NyaXB0ID0gc2Ny
aXB0OworCisgICAgdGhpcy5fYmFzaWNCbG9ja01hcmtlcnMgPSBuZXcgTWFwOyAvLyBPbmx5IGNv
bnRhaW5zIHVuZXhlY3V0ZWQgYmFzaWMgYmxvY2tzLgorfTsKKworV2ViSW5zcGVjdG9yLkJhc2lj
QmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWUgPSAiYmFzaWMtYmxvY2staGFz
LW5vdC1leGVjdXRlZCI7CisKK1dlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yLnByb3Rv
dHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0
b3IsCisgICAgX19wcm90b19fOiBXZWJJbnNwZWN0b3IuQW5ub3RhdG9yLnByb3RvdHlwZSwKKwor
ICAgIC8vIFByb3RlY3RlZAorCisgICAgY2xlYXJBbm5vdGF0aW9uczogZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgZm9yICh2YXIga2V5IG9mIHRoaXMuX2Jhc2ljQmxvY2tNYXJrZXJzLmtleXMo
KSkKKyAgICAgICAgICAgIHRoaXMuX2NsZWFyUmFuZ2VGb3JCYXNpY0Jsb2NrTWFya2VyKGtleSk7
CisgICAgfSwKKworICAgIGluc2VydEFubm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAg
ICAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0
aGlzLl9hbm5vdGF0ZUJhc2ljQmxvY2tFeGVjdXRpb25SYW5nZXMoKTsKKyAgICB9LAorCisgICAg
Ly8gUHJpdmF0ZQorCisgICAgX2Fubm90YXRlQmFzaWNCbG9ja0V4ZWN1dGlvblJhbmdlczogZnVu
Y3Rpb24oKQorICAgIHsKKyAgICAgICAgdmFyIHNvdXJjZUlEID0gdGhpcy5fc2NyaXB0LmlkOwor
ICAgICAgICB2YXIgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKKworICAgICAgICBSdW50aW1lQWdl
bnQuZ2V0QmFzaWNCbG9ja3Moc291cmNlSUQsIGZ1bmN0aW9uKGVycm9yLCBiYXNpY0Jsb2Nrcykg
eworICAgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJv
cigiRXJyb3IgaW4gZ2V0dGluZyBiYXNpYyBibG9jayBsb2NhdGlvbnM6ICIgKyBlcnJvcik7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAo
IXRoaXMuX2lzQWN0aXZlKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAg
dmFyIHtzdGFydE9mZnNldCwgZW5kT2Zmc2V0fSA9IHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3Iu
dmlzaWJsZVJhbmdlT2Zmc2V0cygpOworICAgICAgICAgICAgYmFzaWNCbG9ja3MgPSBiYXNpY0Js
b2Nrcy5maWx0ZXIoZnVuY3Rpb24oYmxvY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxv
Y2suc3RhcnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgYmxvY2suc3RhcnRPZmZzZXQgPD0gZW5k
T2Zmc2V0OworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGZvciAodmFyIGJsb2NrIG9m
IGJhc2ljQmxvY2tzKSB7CisgICAgICAgICAgICAgICAgdmFyIGtleSA9IGJsb2NrLnN0YXJ0T2Zm
c2V0ICsgIjoiICsgYmxvY2suZW5kT2Zmc2V0OworICAgICAgICAgICAgICAgIHZhciBoYXNLZXkg
PSB0aGlzLl9iYXNpY0Jsb2NrTWFya2Vycy5oYXMoa2V5KTsKKyAgICAgICAgICAgICAgICB2YXIg
aGFzRXhlY3V0ZWQgPSBibG9jay5oYXNFeGVjdXRlZDsKKyAgICAgICAgICAgICAgICBpZiAoaGFz
S2V5ICYmIGhhc0V4ZWN1dGVkKQorICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclJhbmdl
Rm9yQmFzaWNCbG9ja01hcmtlcihrZXkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFoYXNL
ZXkgJiYgIWhhc0V4ZWN1dGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBiYXNpY0Jsb2Nr
TWFya2VyID0gdGhpcy5faGlnaGxpZ2h0VGV4dEZvckJhc2ljQmxvY2soYmxvY2spOworICAgICAg
ICAgICAgICAgICAgICBpZiAoYmFzaWNCbG9ja01hcmtlcikKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHRoaXMuX2Jhc2ljQmxvY2tNYXJrZXJzLnNldChrZXksIGJhc2ljQmxvY2tNYXJrZXIpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHRvdGFs
VGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7CisgICAgICAgICAgICB2YXIgdGltZW91dFRp
bWUgPSBNYXRoLm1pbihNYXRoLm1heCg2NTAwLCB0b3RhbFRpbWUpLCAxNSAqIHRvdGFsVGltZSk7
CisgICAgICAgICAgICB0aGlzLl90aW1lb3V0SWRlbnRpZmllciA9IHNldFRpbWVvdXQodGhpcy5p
bnNlcnRBbm5vdGF0aW9ucy5iaW5kKHRoaXMpLCB0aW1lb3V0VGltZSk7CisgICAgICAgIH0uYmlu
ZCh0aGlzKSk7CisgICAgfSwKKworICAgIF9oaWdobGlnaHRUZXh0Rm9yQmFzaWNCbG9jazogZnVu
Y3Rpb24oYmFzaWNCbG9jaykKKyAgICB7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGJhc2ljQmxv
Y2suc3RhcnRPZmZzZXQgPD0gYmFzaWNCbG9jay5lbmRPZmZzZXQgJiYgYmFzaWNCbG9jay5zdGFy
dE9mZnNldCA+PSAwICYmIGJhc2ljQmxvY2suZW5kT2Zmc2V0ID49IDAsICIiICsgYmFzaWNCbG9j
ay5zdGFydE9mZnNldCArICI6IiArIGJhc2ljQmxvY2suZW5kT2Zmc2V0KTsKKyAgICAgICAgY29u
c29sZS5hc3NlcnQoIWJhc2ljQmxvY2suaGFzRXhlY3V0ZWQpOworCisgICAgICAgIHZhciBzdGFy
dFBvc2l0aW9uID0gdGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3Vy
cmVudFBvc2l0aW9uKGJhc2ljQmxvY2suc3RhcnRPZmZzZXQpOworICAgICAgICB2YXIgZW5kUG9z
aXRpb24gPSB0aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLm9yaWdpbmFsT2Zmc2V0VG9DdXJyZW50
UG9zaXRpb24oYmFzaWNCbG9jay5lbmRPZmZzZXQpOworCisgICAgICAgIGlmICh0aGlzLl9pc1Rl
eHRSYW5nZU9ubHlXaGl0ZXNwYWNlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkKKyAgICAg
ICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIEdyYXkgb3V0IHRoZSB0ZXh0IHJhbmdl
LgorICAgICAgICB2YXIgbWFya2VyID0gdGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5hZGRTdHls
ZVRvVGV4dFJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBXZWJJbnNwZWN0b3IuQmFz
aWNCbG9ja0Fubm90YXRvci5IYXNOb3RFeGVjdXRlZENsYXNzTmFtZSk7CisKKyAgICAgICAgLy8g
V2hlbiBhZGRpbmcgYSBzdHlsZSB0byB0aGUgY29kZSByYW5nZSBpbiBDb2RlTWlycm9yLCBzdWNo
IGFzIGEgYmFja2dyb3VuZCBjb2xvciwgaXQgd2lsbCBvbmx5IGFwcGx5IHRoZSBzdHlsZQorICAg
ICAgICAvLyB0byB0aGUgYXJlYSB3aGVyZSB0ZXh0IGlzLCBub3QgdG8gdGhlIHN0eWxlIG9mIGFu
IGVudGlyZSBsaW5lLiBCdXQsIGZyb20gYSB1c2VyIGludGVyZmFjZSBwZXJzcGVjdGl2ZSwgaXQg
bG9va3MKKyAgICAgICAgLy8gY2xlYW5lciB0byBoYXZlIGVudGlyZSBsaW5lcyBoaWdobGlnaHRl
ZC4gVGhlIGZvbGxvd2luZyBsb2dpYyBncmF5cyBvdXQgZW50aXJlIGxpbmVzIHdoZW4gdGhlIGxp
bmUncyByYW5nZSBpcworICAgICAgICAvLyBub3QgYWNyb3NzIGJhc2ljIGJsb2NrIGJvdW5kYXJp
ZXMuCisgICAgICAgIHZhciBsaW5lTnVtYmVycyA9IFtdOworICAgICAgICBpZiAoZW5kUG9zaXRp
b24ubGluZSA+IHN0YXJ0UG9zaXRpb24ubGluZSkgeworICAgICAgICAgICAgdmFyIHN0YXJ0TGlu
ZUVuZFBvc2l0aW9uID0geyBsaW5lOiBzdGFydFBvc2l0aW9uLmxpbmUsIGNoOiB0aGlzLnNvdXJj
ZUNvZGVUZXh0RWRpdG9yLmxpbmUoc3RhcnRQb3NpdGlvbi5saW5lKS5sZW5ndGggfTsKKyAgICAg
ICAgICAgIGlmICh0aGlzLl9jYW5HcmF5T3V0RW50aXJlTGluZShzdGFydFBvc2l0aW9uLmxpbmUs
IHN0YXJ0UG9zaXRpb24sIHN0YXJ0TGluZUVuZFBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAg
IHRoaXMuX2dyYXlPdXRMaW5lKHN0YXJ0UG9zaXRpb24ubGluZSk7CisgICAgICAgICAgICAgICAg
bGluZU51bWJlcnMucHVzaChzdGFydFBvc2l0aW9uLmxpbmUpOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB2YXIgZW5kTGluZVN0YXJ0UG9zaXRpb24gPSB7IGxpbmU6IGVuZFBvc2l0aW9u
LmxpbmUsIGNoOiAwIH07CisgICAgICAgICAgICBpZiAodGhpcy5fY2FuR3JheU91dEVudGlyZUxp
bmUoZW5kUG9zaXRpb24ubGluZSwgZW5kTGluZVN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkg
eworICAgICAgICAgICAgICAgIHRoaXMuX2dyYXlPdXRMaW5lKGVuZFBvc2l0aW9uLmxpbmUpOwor
ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJzLnB1c2goZW5kUG9zaXRpb24ubGluZSk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zb2xlLmFzc2VydChl
bmRQb3NpdGlvbi5saW5lID09PSBzdGFydFBvc2l0aW9uLmxpbmUpOworICAgICAgICAgICAgaWYg
KHRoaXMuX2NhbkdyYXlPdXRFbnRpcmVMaW5lKHN0YXJ0UG9zaXRpb24ubGluZSwgc3RhcnRQb3Np
dGlvbiwgZW5kUG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fZ3JheU91dExpbmUo
c3RhcnRQb3NpdGlvbi5saW5lKTsKKyAgICAgICAgICAgICAgICBsaW5lTnVtYmVycy5wdXNoKHN0
YXJ0UG9zaXRpb24ubGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoZW5kUG9zaXRpb24ubGluZSAtIHN0YXJ0UG9zaXRpb24ubGluZSA+PSAyKSB7CisgICAgICAg
ICAgICAvLyBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgZW50aXJlIGxpbmUgdG8gYmUgZ3JheWVkIG91
dCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9uIG9mIHRoZSBiYXNpYyBibG9jazoK
KyAgICAgICAgICAgIC8vIG4gIDogLi4uCisgICAgICAgICAgICAvLyBuKzE6IC4uLiAoVGhpcyBl
bnRpcmUgbGluZSBjYW4gc2FmZWx5IGJlIGdyYXllZCBvdXQpLgorICAgICAgICAgICAgLy8gbisy
OiAuLi4KKyAgICAgICAgICAgIGZvciAodmFyIGxpbmVOdW1iZXIgPSBzdGFydFBvc2l0aW9uLmxp
bmUgKyAxOyBsaW5lTnVtYmVyIDwgZW5kUG9zaXRpb24ubGluZTsgbGluZU51bWJlcisrKSB7Cisg
ICAgICAgICAgICAgICAgdGhpcy5fZ3JheU91dExpbmUobGluZU51bWJlcikKKyAgICAgICAgICAg
ICAgICBsaW5lTnVtYmVycy5wdXNoKGxpbmVOdW1iZXIpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgcmV0dXJuIHttYXJrZXI6IG1hcmtlciwgbGluZU51bWJlcnM6IGxpbmVO
dW1iZXJzfTsKKyAgICB9LAorCisgICAgX2lzVGV4dFJhbmdlT25seVdoaXRlc3BhY2U6IGZ1bmN0
aW9uKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgdmFyIGlzT25s
eVdoaXRlc3BhY2UgPSAvXlxzKyQvOworICAgICAgICByZXR1cm4gaXNPbmx5V2hpdGVzcGFjZS50
ZXN0KHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3IuZ2V0VGV4dEluUmFuZ2Uoc3RhcnRQb3NpdGlv
biwgZW5kUG9zaXRpb24pKTsKKyAgICB9LAorCisgICAgX2NhbkdyYXlPdXRFbnRpcmVMaW5lOiBm
dW5jdGlvbihsaW5lTnVtYmVyLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikKKyAgICB7Cisg
ICAgICAgIGNvbnNvbGUuYXNzZXJ0KHN0YXJ0UG9zaXRpb24ubGluZSA9PT0gZW5kUG9zaXRpb24u
bGluZSk7CisgICAgICAgIHZhciBsaW5lVGV4dCA9IHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3Iu
bGluZShsaW5lTnVtYmVyKTsKKyAgICAgICAgdmFyIGJsb2NrVGV4dCA9IHRoaXMuc291cmNlQ29k
ZVRleHRFZGl0b3IuZ2V0VGV4dEluUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pOwor
ICAgICAgICByZXR1cm4gbGluZVRleHQudHJpbSgpID09PSBibG9ja1RleHQudHJpbSgpOworICAg
IH0sCisKKyAgICBfZ3JheU91dExpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIpCisgICAgeworICAg
ICAgICB2YXIgY2xhc3NOYW1lID0gV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFz
Tm90RXhlY3V0ZWRDbGFzc05hbWU7CisgICAgICAgIHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3Iu
YWRkU3R5bGVDbGFzc1RvTGluZShsaW5lTnVtYmVyLCBjbGFzc05hbWUpOworICAgIH0sCisKKyAg
ICBfY2xlYXJSYW5nZUZvckJhc2ljQmxvY2tNYXJrZXI6IGZ1bmN0aW9uKGtleSkKKyAgICB7Cisg
ICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRoaXMuX2Jhc2ljQmxvY2tNYXJrZXJzLmhhcyhrZXkpKTsK
KyAgICAgICAgdmFyIHttYXJrZXIsIGxpbmVOdW1iZXJzfSA9IHRoaXMuX2Jhc2ljQmxvY2tNYXJr
ZXJzLmdldChrZXkpOworICAgICAgICBtYXJrZXIuY2xlYXIoKTsKKyAgICAgICAgdmFyIGNsYXNz
TmFtZSA9IFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yLkhhc05vdEV4ZWN1dGVkQ2xh
c3NOYW1lOworICAgICAgICBmb3IgKHZhciBsaW5lTnVtYmVyIG9mIGxpbmVOdW1iZXJzKQorICAg
ICAgICAgICAgdGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5yZW1vdmVTdHlsZUNsYXNzRnJvbUxp
bmUobGluZU51bWJlciwgY2xhc3NOYW1lKTsKKyAgICAgICAgdGhpcy5fYmFzaWNCbG9ja01hcmtl
cnMuZGVsZXRlKGtleSk7CisgICAgfQorfTsKSW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9V
c2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4
dEVkaXRvci5jc3MJKHJldmlzaW9uIDE3ODQ5MSkKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9V
c2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzcwkod29ya2luZyBjb3B5
KQpAQCAtNzYsMyArNzYsNyBAQAogCiAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVko
MXB4KTsKIH0KKworLmJhc2ljLWJsb2NrLWhhcy1ub3QtZXhlY3V0ZWQgeworICAgIGJhY2tncm91
bmQtY29sb3I6IHJnYigyNDAsIDI0MCwgMjQwKTsKK30KSW5kZXg6IFNvdXJjZS9XZWJJbnNwZWN0
b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNv
ZGVUZXh0RWRpdG9yLmpzCShyZXZpc2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9y
VUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5qcwkod29ya2luZyBj
b3B5KQpAQCAtMzcsNyArMzcsMTAgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9y
ID0gZnVuYwogICAgIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLmNhbGwodGhpcywgbnVsbCwgbnVs
bCwgdGhpcyk7CiAKICAgICB0aGlzLl90eXBlVG9rZW5TY3JvbGxIYW5kbGVyID0gbnVsbDsKLSAg
ICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyID0gbmV3IFdlYkluc3BlY3Rvci5Bbm5vdGF0b3JNYW5h
Z2VyOworICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvciA9IG51bGw7CisgICAgdGhpcy5fYmFz
aWNCbG9ja0Fubm90YXRvciA9IG51bGw7CisKKyAgICB0aGlzLl9oYXNGb2N1cyA9IGZhbHNlOwog
CiAgICAgLy8gRklYTUU6IEN1cnJlbnRseSB0aGlzIGp1c3QganVtcHMgYmV0d2VlbiByZXNvdXJj
ZXMgYW5kIHJlbGF0ZWQgc291cmNlIG1hcCByZXNvdXJjZXMuIEl0IGRvZXNuJ3QgImp1bXAgdG8g
c3ltYm9sIiB5ZXQuCiAgICAgdGhpcy5fdXBkYXRlVG9rZW5UcmFja2luZ0NvbnRyb2xsZXJTdGF0
ZSgpOwpAQCAtOTAsOCArOTMsNiBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3Iu
RHVyYXRpCiAKIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5BdXRvRm9ybWF0TWlu
aW11bUxpbmVMZW5ndGggPSA1MDA7CiAKLVdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRv
ci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkgPSAiVHlwZVRva2VuQW5ub3RhdG9yS2V5IjsKLQogV2Vi
SW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkV2ZW50ID0gewogICAgIENvbnRlbnRXaWxs
UG9wdWxhdGU6ICJzb3VyY2UtY29kZS10ZXh0LWVkaXRvci1jb250ZW50LXdpbGwtcG9wdWxhdGUi
LAogICAgIENvbnRlbnREaWRQb3B1bGF0ZTogInNvdXJjZS1jb2RlLXRleHQtZWRpdG9yLWNvbnRl
bnQtZGlkLXBvcHVsYXRlIgpAQCAtMTExLDcgKzExMiwyMSBAQCBXZWJJbnNwZWN0b3IuU291cmNl
Q29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgewogICAgICAgICBXZWJJbnNwZWN0b3IuVGV4dEVk
aXRvci5wcm90b3R5cGUuc2hvd24uY2FsbCh0aGlzKTsKIAotICAgICAgICB0aGlzLl9hbm5vdGF0
b3JNYW5hZ2VyLnJlc3VtZUFsbCgpOworICAgICAgICBpZiAoV2ViSW5zcGVjdG9yLnNob3dKYXZh
U2NyaXB0VHlwZUluZm9ybWF0aW9uU2V0dGluZy52YWx1ZSkgeworICAgICAgICAgICAgaWYgKHRo
aXMuX3R5cGVUb2tlbkFubm90YXRvcikKKyAgICAgICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5B
bm5vdGF0b3IucmVzdW1lKCk7CisgICAgICAgICAgICBpZiAodGhpcy5fYmFzaWNCbG9ja0Fubm90
YXRvcikKKyAgICAgICAgICAgICAgICB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc3VtZSgp
OworICAgICAgICAgICAgaWYgKCF0aGlzLl90eXBlVG9rZW5TY3JvbGxIYW5kbGVyICYmICh0aGlz
Ll90eXBlVG9rZW5Bbm5vdGF0b3IgfHwgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvcikpCisgICAg
ICAgICAgICAgICAgdGhpcy5fZW5hYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9y
KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodGhpcy5fdHlwZVRva2VuQW5u
b3RhdG9yKQorICAgICAgICAgICAgICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5jbGVhcigp
OworICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAg
ICAgICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvci5jbGVhcigpOworICAgICAgICAgICAgaWYg
KHRoaXMuX3R5cGVUb2tlblNjcm9sbEhhbmRsZXIpCisgICAgICAgICAgICAgICAgdGhpcy5fZGlz
YWJsZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOworICAgICAgICB9CiAgICAg
fSwKIAogICAgIGhpZGRlbjogZnVuY3Rpb24oKQpAQCAtMTI0LDcgKzEzOSwxMCBAQCBXZWJJbnNw
ZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgICAgIAogICAgICAgICB0aGlz
Ll9kaXNtaXNzRWRpdGluZ0NvbnRyb2xsZXIodHJ1ZSk7CiAKLSAgICAgICAgdGhpcy5fYW5ub3Rh
dG9yTWFuYWdlci5wYXVzZUFsbCgpOworICAgICAgICBpZiAodGhpcy5fdHlwZVRva2VuQW5ub3Rh
dG9yKQorICAgICAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yLnBhdXNlKCk7CisgICAg
ICAgIGlmICh0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yKQorICAgICAgICAgICAgdGhpcy5fYmFz
aWNCbG9ja0Fubm90YXRvci5wYXVzZSgpOwogICAgIH0sCiAKICAgICBjbG9zZTogZnVuY3Rpb24o
KQpAQCAtMTY2LDcgKzE4NCw3IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5w
cm90b3QKIAogICAgIGNhblNob3dUeXBlQW5ub3RhdGlvbnM6IGZ1bmN0aW9uKCkKICAgICB7Ci0g
ICAgICAgIHJldHVybiAhIXRoaXMuX2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9yKFdlYklu
c3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkpOworICAg
ICAgICByZXR1cm4gISF0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3I7CiAgICAgfSwKIAogICAgIGN1
c3RvbVBlcmZvcm1TZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5KQpAQCAtMjU2LDI4ICsyNzQsNTQgQEAg
V2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdAogICAgICAgICBmb3IgKHZh
ciByYW5nZSBvZiBuZXdSYW5nZXMpCiAgICAgICAgICAgICB0aGlzLl91cGRhdGVFZGl0YWJsZU1h
cmtlcnMocmFuZ2UpOwogCi0gICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIuY2xlYXJBbGwo
KTsKLSAgICAgICAgdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5yZW1vdmVBbGxBbm5vdGF0b3JzKCk7
CisgICAgICAgIGlmICh0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IpIHsKKyAgICAgICAgICAgIHRo
aXMuX3R5cGVUb2tlbkFubm90YXRvci5jbGVhcigpOworICAgICAgICAgICAgdGhpcy5fdHlwZVRv
a2VuQW5ub3RhdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fYmFzaWNC
bG9ja0Fubm90YXRvcikgeworICAgICAgICAgICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvci5j
bGVhcigpOworICAgICAgICAgICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvciA9IG51bGw7Cisg
ICAgICAgIH0KICAgICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlblNjcm9sbEhhbmRsZXIpCiAgICAg
ICAgICAgICB0aGlzLl9kaXNhYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7
CiAgICAgfSwKIAorICAgIGdhaW5lZEZvY3VzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0
aGlzLl9oYXNGb2N1cyA9IHRydWU7CisgICAgICAgIGlmICh0aGlzLl9iYXNpY0Jsb2NrQW5ub3Rh
dG9yKQorICAgICAgICAgICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvci5jbGVhcigpOworICAg
IH0sCisKKyAgICBsb3N0Rm9jdXM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX2hh
c0ZvY3VzID0gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yICYm
IFdlYkluc3BlY3Rvci5zaG93SmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvblNldHRpbmcudmFsdWUp
CisgICAgICAgICAgICB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc3VtZSgpOworICAgIH0s
CisKICAgICB0b2dnbGVUeXBlQW5ub3RhdGlvbnM6IGZ1bmN0aW9uKCkKICAgICB7Ci0gICAgICAg
IHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmdldEFubm90
YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9y
S2V5KTsKLSAgICAgICAgaWYgKCF0eXBlVG9rZW5Bbm5vdGF0b3IpCisgICAgICAgIGlmICghdGhp
cy5fdHlwZVRva2VuQW5ub3RhdG9yKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAg
ICAgIHZhciBpc0FjdGl2YXRlZCA9IHR5cGVUb2tlbkFubm90YXRvci50b2dnbGVUeXBlQW5ub3Rh
dGlvbnMoKTsKKyAgICAgICAgdmFyIGlzQWN0aXZhdGVkID0gdGhpcy5fdHlwZVRva2VuQW5ub3Rh
dG9yLnRvZ2dsZVR5cGVBbm5vdGF0aW9ucygpOwogICAgICAgICBpZiAoaXNBY3RpdmF0ZWQpIHsK
KyAgICAgICAgICAgIGlmICh0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yICYmICF0aGlzLl9iYXNp
Y0Jsb2NrQW5ub3RhdG9yLmlzQWN0aXZlICYmICF0aGlzLl9oYXNGb2N1cykKKyAgICAgICAgICAg
ICAgICB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc2V0KCk7CisKICAgICAgICAgICAgIFJ1
bnRpbWVBZ2VudC5lbmFibGVUeXBlUHJvZmlsZXIoKTsKICAgICAgICAgICAgIHRoaXMuX2VuYWJs
ZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOwogICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICAg
ICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvci5jbGVhcigpOworCiAgICAgICAgICAgICAvLyBX
ZSBkaXNhYmxlIHR5cGUgcHJvZmlsaW5nIHdoZW4gZXhpdGluZyB0aGUgaW5zcGVjdG9yLCBzbyBu
byBuZWVkIHRvIGNhbGwgaXQgaGVyZS4gSWYgd2Ugd2VyZQogICAgICAgICAgICAgLy8gdG8gY2Fs
bCBpdCBoZXJlLCB3ZSB3b3VsZCBoYXZlIEphdmFTY3JpcHRDb3JlIGNvbXBpbGUgb3V0IGFsbCB0
aGUgbmVjZXNzYXJ5IHR5cGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uLAogICAgICAgICAgICAgLy8g
c28gaWYgYSB1c2VyIHdlcmUgdG8gcXVpY2tseSBwcmVzcyB0aGVuIHVucHJlc3MgdGhlIGJ1dHRv
biwgd2Ugd291bGRuJ3QgYmUgYWJsZSB0byByZS1zaG93IHR5cGUgaW5mb3JtYXRpb24uCiAgICAg
ICAgICAgICB0aGlzLl9kaXNhYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7
CiAgICAgICAgIH0KKwogICAgICAgICBXZWJJbnNwZWN0b3Iuc2hvd0phdmFTY3JpcHRUeXBlSW5m
b3JtYXRpb25TZXR0aW5nLnZhbHVlID0gaXNBY3RpdmF0ZWQ7CiAKICAgICAgICAgdGhpcy5fdXBk
YXRlVG9rZW5UcmFja2luZ0NvbnRyb2xsZXJTdGF0ZSgpOwpAQCAtMzA2LDkgKzM1MCwyMiBAQCBX
ZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAKICAgICBwcmV0dHlQcmlu
dDogZnVuY3Rpb24ocHJldHR5KQogICAgIHsKKyAgICAgICAgLy8gVGhlIGFubm90YXRvcnMgbXVz
dCBiZSBjbGVhcmVkIGJlZm9yZSBwcmV0dHkgcHJpbnRpbmcgdGFrZXMgcGxhY2UgYW5kIHJlc3Vt
ZWQgCisgICAgICAgIC8vIGFmdGVyIHNvIHRoYXQgdGhleSBjbGVhciB0aGVpciBhbm5vdGF0aW9u
cyBpbiBhIGtub3duIHN0YXRlIGFuZCBpbnNlcnQgbmV3IGFubm90YXRpb25zIAorICAgICAgICAv
LyBpbiB0aGUgbmV3IHN0YXRlLgorICAgICAgICB2YXIgc2hvdWxkUmVzdW1lVHlwZVRva2VuQW5u
b3RhdG9yID0gdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yICYmIHRoaXMuX3R5cGVUb2tlbkFubm90
YXRvci5pc0FjdGl2ZTsKKyAgICAgICAgdmFyIHNob3VsZFJlc3VtZUJhc2ljQmxvY2tBbm5vdGF0
b3IgPSB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yICYmIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0
b3IuaXNBY3RpdmU7CisgICAgICAgIGlmIChzaG91bGRSZXN1bWVUeXBlVG9rZW5Bbm5vdGF0b3Ip
CisgICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IuY2xlYXIoKTsKKyAgICAgICAg
aWYgKHNob3VsZFJlc3VtZUJhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICB0aGlzLl9i
YXNpY0Jsb2NrQW5ub3RhdG9yLmNsZWFyKCk7CisKICAgICAgICAgV2ViSW5zcGVjdG9yLlRleHRF
ZGl0b3IucHJvdG90eXBlLnByZXR0eVByaW50LmNhbGwodGhpcywgcHJldHR5KTsKIAotICAgICAg
ICB0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLnJlc2V0QWxsSWZBY3RpdmUoKTsKKyAgICAgICAgaWYg
KHNob3VsZFJlc3VtZVR5cGVUb2tlbkFubm90YXRvcikKKyAgICAgICAgICAgIHRoaXMuX3R5cGVU
b2tlbkFubm90YXRvci5yZXNldCgpOworICAgICAgICBpZiAoc2hvdWxkUmVzdW1lQmFzaWNCbG9j
a0Fubm90YXRvcikKKyAgICAgICAgICAgIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IucmVzZXQo
KTsKICAgICB9LAogCiAgICAgLy8gUHJpdmF0ZQpAQCAtNDM3LDYgKzQ5NCwxNiBAQCBXZWJJbnNw
ZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgICAgIHRoaXMuc3RyaW5nID0g
Y29udGVudDsKIAogICAgICAgICB0aGlzLl9tYWtlVHlwZVRva2VuQW5ub3RhdG9yKCk7CisgICAg
ICAgIHRoaXMuX21ha2VCYXNpY0Jsb2NrQW5ub3RhdG9yKCk7CisKKyAgICAgICAgaWYgKFdlYklu
c3BlY3Rvci5zaG93SmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvblNldHRpbmcudmFsdWUpIHsKKyAg
ICAgICAgICAgIGlmICh0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yKQorICAgICAgICAgICAgICAg
IHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IucmVzZXQoKTsKKyAgICAgICAgICAgIGlmICh0aGlz
Ll90eXBlVG9rZW5Bbm5vdGF0b3IpCisgICAgICAgICAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5u
b3RhdG9yLnJlc2V0KCk7CisgICAgICAgICAgICBpZiAodGhpcy5fdHlwZVRva2VuQW5ub3RhdG9y
IHx8IHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICAgICAgdGhpcy5fZW5h
YmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7CisgICAgICAgIH0KIAogICAg
ICAgICB0aGlzLl9jb250ZW50RGlkUG9wdWxhdGUoKTsKICAgICB9LApAQCAtMTA1MiwxNCArMTEx
OSwyMCBAQCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgX2Rl
YnVnZ2VyRGlkUGF1c2U6IGZ1bmN0aW9uKGV2ZW50KQogICAgIHsKICAgICAgICAgdGhpcy5fdXBk
YXRlVG9rZW5UcmFja2luZ0NvbnRyb2xsZXJTdGF0ZSgpOwotICAgICAgICB0aGlzLl9hbm5vdGF0
b3JNYW5hZ2VyLnJlZnJlc2hBbGxJZkFjdGl2ZSgpOworICAgICAgICBpZiAodGhpcy5fdHlwZVRv
a2VuQW5ub3RhdG9yICYmIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5pc0FjdGl2ZSkKKyAgICAg
ICAgICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5yZWZyZXNoKCk7CisgICAgICAgIGlmICh0
aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yICYmIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IuaXNB
Y3RpdmUpCisgICAgICAgICAgICB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLnJlZnJlc2goKTsK
ICAgICB9LAogCiAgICAgX2RlYnVnZ2VyRGlkUmVzdW1lOiBmdW5jdGlvbihldmVudCkKICAgICB7
CiAgICAgICAgIHRoaXMuX3VwZGF0ZVRva2VuVHJhY2tpbmdDb250cm9sbGVyU3RhdGUoKTsKICAg
ICAgICAgdGhpcy5fZGlzbWlzc1BvcG92ZXIoKTsKLSAgICAgICAgdGhpcy5fYW5ub3RhdG9yTWFu
YWdlci5yZWZyZXNoQWxsSWZBY3RpdmUoKTsKKyAgICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFu
bm90YXRvciAmJiB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IuaXNBY3RpdmUpCisgICAgICAgICAg
ICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IucmVmcmVzaCgpOworICAgICAgICBpZiAodGhpcy5f
YmFzaWNCbG9ja0Fubm90YXRvciAmJiB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLmlzQWN0aXZl
KQorICAgICAgICAgICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvci5yZWZyZXNoKCk7CiAgICAg
fSwKIAogICAgIF9zb3VyY2VDb2RlU291cmNlTWFwQWRkZWQ6IGZ1bmN0aW9uKGV2ZW50KQpAQCAt
MTA3NSw3ICsxMTQ4LDcgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3Rv
dAogICAgICAgICB2YXIgbW9kZSA9IFdlYkluc3BlY3Rvci5Db2RlTWlycm9yVG9rZW5UcmFja2lu
Z0NvbnRyb2xsZXIuTW9kZS5Ob25lOwogICAgICAgICBpZiAoV2ViSW5zcGVjdG9yLmRlYnVnZ2Vy
TWFuYWdlci5wYXVzZWQpCiAgICAgICAgICAgICBtb2RlID0gV2ViSW5zcGVjdG9yLkNvZGVNaXJy
b3JUb2tlblRyYWNraW5nQ29udHJvbGxlci5Nb2RlLkphdmFTY3JpcHRFeHByZXNzaW9uOwotICAg
ICAgICBlbHNlIGlmICh0aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmlzQW5ub3RhdG9yQWN0aXZlKFdl
Ykluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkpKQor
ICAgICAgICBlbHNlIGlmICh0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IgJiYgdGhpcy5fdHlwZVRv
a2VuQW5ub3RhdG9yLmlzQWN0aXZlKQogICAgICAgICAgICAgbW9kZSA9IFdlYkluc3BlY3Rvci5D
b2RlTWlycm9yVG9rZW5UcmFja2luZ0NvbnRyb2xsZXIuTW9kZS5KYXZhU2NyaXB0VHlwZUluZm9y
bWF0aW9uOwogICAgICAgICBlbHNlIGlmICh0aGlzLl9oYXNDb2xvck1hcmtlcnMoKSkKICAgICAg
ICAgICAgIG1vZGUgPSBXZWJJbnNwZWN0b3IuQ29kZU1pcnJvclRva2VuVHJhY2tpbmdDb250cm9s
bGVyLk1vZGUuTWFya2VkVG9rZW5zOwpAQCAtMTU0OSwxMyArMTYyMiwxOSBAQCBXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgICAgIGlmICghc2NyaXB0KQogICAg
ICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSBuZXcg
V2ViSW5zcGVjdG9yLlR5cGVUb2tlbkFubm90YXRvcih0aGlzLCBzY3JpcHQpOwotICAgICAgICB0
aGlzLl9hbm5vdGF0b3JNYW5hZ2VyLmFkZEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29k
ZVRleHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9yS2V5LCB0eXBlVG9rZW5Bbm5vdGF0b3IpOwor
ICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IgPSBuZXcgV2ViSW5zcGVjdG9yLlR5cGVU
b2tlbkFubm90YXRvcih0aGlzLCBzY3JpcHQpOworICAgIH0sCiAKLSAgICAgICAgaWYgKFdlYklu
c3BlY3Rvci5zaG93SmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvblNldHRpbmcudmFsdWUpIHsKLSAg
ICAgICAgICAgIHR5cGVUb2tlbkFubm90YXRvci5yZXNldCgpOwotICAgICAgICAgICAgdGhpcy5f
ZW5hYmxlU2Nyb2xsRXZlbnRzRm9yVHlwZVRva2VuQW5ub3RhdG9yKCk7Ci0gICAgICAgIH0KKyAg
ICBfbWFrZUJhc2ljQmxvY2tBbm5vdGF0b3I6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIGlm
ICghUnVudGltZUFnZW50LmdldEJhc2ljQmxvY2tzKQorICAgICAgICAgICAgcmV0dXJuOworCisg
ICAgICAgIHZhciBzY3JpcHQgPSB0aGlzLl9nZXRBc3NvY2lhdGVkU2NyaXB0KCk7CisgICAgICAg
IGlmICghc2NyaXB0KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRoaXMuX2Jhc2lj
QmxvY2tBbm5vdGF0b3IgPSBuZXcgV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IodGhp
cywgc2NyaXB0KTsKICAgICB9LAogCiAgICAgX2VuYWJsZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tl
bkFubm90YXRvcjogZnVuY3Rpb24oKQpAQCAtMTU3NiwyMiArMTY1NSwyMyBAQCBXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAgICAgX21ha2VUeXBlVG9rZW5TY3JvbGxF
dmVudEhhbmRsZXI6IGZ1bmN0aW9uKCkKICAgICB7CiAgICAgICAgIHZhciB0aW1lb3V0SWRlbnRp
ZmllciA9IG51bGw7Ci0gICAgICAgIHZhciB0eXBlVG9rZW5Bbm5vdGF0b3IgPSB0aGlzLl9hbm5v
dGF0b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0
b3IuVHlwZVRva2VuQW5ub3RhdG9yS2V5KTsKICAgICAgICAgZnVuY3Rpb24gc2Nyb2xsSGFuZGxl
cigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh0aW1lb3V0SWRlbnRpZmllcikKICAgICAg
ICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkZW50aWZpZXIpOwotICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgIHR5cGVUb2tlbkFubm90YXRvci5wYXVzZSgpOworICAgICAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFubm90YXRv
cikKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yLnBhdXNlKCk7
CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAg
ICAgICAgICAgICAgIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IucGF1c2UoKTsKKyAgICAgICAg
ICAgIH0KIAogICAgICAgICAgICAgdGltZW91dElkZW50aWZpZXIgPSBzZXRUaW1lb3V0KGZ1bmN0
aW9uKCkgewogICAgICAgICAgICAgICAgIHRpbWVvdXRJZGVudGlmaWVyID0gbnVsbDsKLSAgICAg
ICAgICAgICAgICB2YXIgdHlwZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdl
ci5nZXRBbm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tl
bkFubm90YXRvcktleSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzbWFsbCBjaGFu
Y2UgdGhhdCB3ZSBkaXNhYmxlZCB0aGUgdHlwZSB0b2tlbiBhbm5vdGF0b3IgYW5kIHRoZSBzY3Jv
bGwgaGFuZGxlciAKLSAgICAgICAgICAgICAgICAvLyBkdXJpbmcgdGhlIER1cmF0aW9uVG9VcGRh
dGVUeXBlVG9rZW5zQWZ0ZXJTY3JvbGxpbmcgdGltZSBkZWxheSwgc28gd2UgbXVzdCBlbnN1cmUg
dGhhdCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gaXMgbm90IG51bGwuCi0gICAgICAgICAgICAg
ICAgaWYgKHR5cGVUb2tlbkFubm90YXRvcikKLSAgICAgICAgICAgICAgICAgICAgdHlwZVRva2Vu
QW5ub3RhdG9yLnJlc3VtZSgpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLl90eXBlVG9rZW5B
bm5vdGF0b3IpCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5y
ZXN1bWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2hhc0ZvY3VzICYmIHRoaXMuX2Jh
c2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2ljQmxvY2tB
bm5vdGF0b3IucmVzdW1lKCk7CiAgICAgICAgICAgICB9LmJpbmQodGhpcyksIFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5EdXJhdGlvblRvVXBkYXRlVHlwZVRva2Vuc0FmdGVyU2Ny
b2xsaW5nKTsKICAgICAgICAgfQogCkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9WaWV3cy9UZXh0RWRpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJJbnNw
ZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RleHRFZGl0b3IuanMJKHJldmlzaW9uIDE3ODQ5
MSkKKysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RleHRFZGl0
b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDggQEAgV2ViSW5zcGVjdG9yLlRleHRF
ZGl0b3IgPSBmdW5jdGlvbihlbGVtZQogICAgIHRoaXMuX2NvZGVNaXJyb3Iub24oImNoYW5nZSIs
IHRoaXMuX2NvbnRlbnRDaGFuZ2VkLmJpbmQodGhpcykpOwogICAgIHRoaXMuX2NvZGVNaXJyb3Iu
b24oImd1dHRlckNsaWNrIiwgdGhpcy5fZ3V0dGVyTW91c2VEb3duLmJpbmQodGhpcykpOwogICAg
IHRoaXMuX2NvZGVNaXJyb3Iub24oImd1dHRlckNvbnRleHRNZW51IiwgdGhpcy5fZ3V0dGVyQ29u
dGV4dE1lbnUuYmluZCh0aGlzKSk7CisgICAgdGhpcy5fY29kZU1pcnJvci5vbigiZm9jdXMiLCB0
aGlzLmdhaW5lZEZvY3VzLmJpbmQodGhpcykpOworICAgIHRoaXMuX2NvZGVNaXJyb3Iub24oImJs
dXIiLCB0aGlzLmxvc3RGb2N1cy5iaW5kKHRoaXMpKTsKICAgICB0aGlzLl9jb2RlTWlycm9yLmdl
dFNjcm9sbGVyRWxlbWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5fb3BlbkNs
aWNrZWRMaW5rcy5iaW5kKHRoaXMpLCB0cnVlKTsKIAogICAgIHRoaXMuX2NvbXBsZXRpb25Db250
cm9sbGVyID0gbmV3IFdlYkluc3BlY3Rvci5Db2RlTWlycm9yQ29tcGxldGlvbkNvbnRyb2xsZXIo
dGhpcy5fY29kZU1pcnJvciwgdGhpcyk7CkBAIC00NTQsNiArNDU2LDE2IEBAIFdlYkluc3BlY3Rv
ci5UZXh0RWRpdG9yLnByb3RvdHlwZSA9IHsKICAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJy
b3IuZ2V0TGluZShsaW5lTnVtYmVyKTsKICAgICB9LAogCisgICAgZ2V0VGV4dEluUmFuZ2U6IGZ1
bmN0aW9uKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMuX2NvZGVNaXJyb3IuZ2V0UmFuZ2Uoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pOwor
ICAgIH0sCisKKyAgICBhZGRTdHlsZVRvVGV4dFJhbmdlOiBmdW5jdGlvbihzdGFydFBvc2l0aW9u
LCBlbmRQb3NpdGlvbiwgc3R5bGVDbGFzc05hbWUpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fY29kZU1pcnJvci5nZXREb2MoKS5tYXJrVGV4dChzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlv
biwge2NsYXNzTmFtZTogc3R5bGVDbGFzc05hbWV9KTsKKyAgICB9LAorCiAgICAgcmV2ZWFsUG9z
aXRpb246IGZ1bmN0aW9uKHBvc2l0aW9uLCB0ZXh0UmFuZ2VUb1NlbGVjdCwgZm9yY2VVbmZvcm1h
dHRlZCwgbm9IaWdobGlnaHQpCiAgICAgewogICAgICAgICBjb25zb2xlLmFzc2VydChwb3NpdGlv
biA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uIGluc3RhbmNlb2YgV2ViSW5zcGVjdG9yLlNvdXJj
ZUNvZGVQb3NpdGlvbiwgInJldmVhbFBvc2l0aW9uIGNhbGxlZCB3aXRob3V0IGEgU291cmNlQ29k
ZVBvc2l0aW9uIik7CkBAIC04MTUsNiArODI3LDE2IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9y
LnByb3RvdHlwZSA9IHsKICAgICAgICAgdGhpcy5fY29kZU1pcnJvci5vcGVyYXRpb24ocHJldHR5
UHJpbnRBbmRVcGRhdGVFZGl0b3IuYmluZCh0aGlzKSk7CiAgICAgfSwKIAorICAgIGdhaW5lZEZv
Y3VzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICAvLyBJbXBsZW1lbnRlZCBieSBzdWJjbGFz
c2VzLgorICAgIH0sCisKKyAgICBsb3N0Rm9jdXM6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAg
IC8vIEltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCisgICAgfSwKKwogICAgIC8vIFByaXZhdGUK
IAogICAgIGhhc0VkaXRzOiBmdW5jdGlvbigpCg==
</data>
<flag name="review"
          id="269721"
          type_id="1"
          status="+"
          setter="timothy"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>244838</attachid>
            <date>2015-01-16 23:35:04 -0800</date>
            <delta_ts>2015-01-17 06:46:29 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>36935</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTc4NjIxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBA
CisyMDE1LTAxLTE2ICBTYWFtIEJhcmF0aSAgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KKworICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBQcm92aWRlIGEgZnJvbnQgZW5kIGZvciBKU0MncyBDb250cm9s
IEZsb3cgUHJvZmlsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTEzODQ1NAorCisgICAgICAgIFJldmlld2VkIGJ5IFRpbW90aHkgSGF0Y2hlci4KKwor
ICAgICAgICBUaGlzIHBhdGNoIHB1dHMgdGhlIGZpbmFsIHRvdWNoZXMgb24gd2hhdCBKU0MgbmVl
ZHMgdG8gcHJvdmlkZQorICAgICAgICBmb3IgdGhlIFdlYiBJbnNwZWN0b3IgdG8gc2hvdyBhIFVJ
IGZvciB0aGUgY29udHJvbCBmbG93IHByb2ZpbGVyLgorCisgICAgICAgICogaW5zcGVjdG9yL2Fn
ZW50cy9JbnNwZWN0b3JSdW50aW1lQWdlbnQuY3BwOgorICAgICAgICAoSW5zcGVjdG9yOjpyZWNv
bXBpbGVBbGxKU0Z1bmN0aW9uc0ZvclR5cGVQcm9maWxpbmcpOgorICAgICAgICAqIHJ1bnRpbWUv
Q29udHJvbEZsb3dQcm9maWxlci5jcHA6CisgICAgICAgIChKU0M6OkNvbnRyb2xGbG93UHJvZmls
ZXI6OmdldEJhc2ljQmxvY2tzRm9yU291cmNlSUQpOgorICAgICAgICAqIHJ1bnRpbWUvRnVuY3Rp
b25IYXNFeGVjdXRlZENhY2hlLmNwcDoKKyAgICAgICAgKEpTQzo6RnVuY3Rpb25IYXNFeGVjdXRl
ZENhY2hlOjpnZXRGdW5jdGlvblJhbmdlcyk6CisgICAgICAgIChKU0M6OkZ1bmN0aW9uSGFzRXhl
Y3V0ZWRDYWNoZTo6Z2V0VW5leGVjdXRlZEZ1bmN0aW9uUmFuZ2VzKTogRGVsZXRlZC4KKyAgICAg
ICAgKiBydW50aW1lL0Z1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZS5oOgorCiAyMDE1LTAxLTE2ICBC
cmlhbiBKLiBCdXJnICA8YnVyZ0Bjcy53YXNoaW5ndG9uLmVkdT4KIAogICAgICAgICBXZWIgSW5z
cGVjdG9yOiBjb2RlIGdlbmVyYXRvciBzaG91bGQgaW50cm9kdWNlIHR5cGVkZWZzIGZvciBwcm90
b2NvbCB0eXBlcyB0aGF0IGFyZSBhcnJheXMKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9p
bnNwZWN0b3IvYWdlbnRzL0luc3BlY3RvclJ1bnRpbWVBZ2VudC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2luc3BlY3Rvci9hZ2VudHMvSW5zcGVjdG9yUnVudGltZUFn
ZW50LmNwcAkocmV2aXNpb24gMTc4NDkxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2luc3Bl
Y3Rvci9hZ2VudHMvSW5zcGVjdG9yUnVudGltZUFnZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjcxLDEwICsyNzEsMTIgQEAgcHVibGljOgogCiBzdGF0aWMgdm9pZCByZWNvbXBpbGVBbGxKU0Z1
bmN0aW9uc0ZvclR5cGVQcm9maWxpbmcoVk0mIHZtLCBib29sIHNob3VsZEVuYWJsZVR5cGVQcm9m
aWxpbmcpCiB7Ci0gICAgdm0ucHJlcGFyZVRvRGlzY2FyZENvZGUoKTsKKyAgICBib29sIHNob3Vs
ZFJlY29tcGlsZUZyb21UeXBlUHJvZmlsZXIgPSAoc2hvdWxkRW5hYmxlVHlwZVByb2ZpbGluZyA/
IHZtLmVuYWJsZVR5cGVQcm9maWxlcigpIDogdm0uZGlzYWJsZVR5cGVQcm9maWxlcigpKTsgCisg
ICAgYm9vbCBzaG91bGRSZWNvbXBpbGVGcm9tQ29udHJvbEZsb3dQcm9maWxlciA9IChzaG91bGRF
bmFibGVUeXBlUHJvZmlsaW5nID8gdm0uZW5hYmxlQ29udHJvbEZsb3dQcm9maWxlcigpIDogdm0u
ZGlzYWJsZUNvbnRyb2xGbG93UHJvZmlsZXIoKSk7CisgICAgYm9vbCBuZWVkc1RvUmVjb21waWxl
ID0gc2hvdWxkUmVjb21waWxlRnJvbVR5cGVQcm9maWxlciB8fCBzaG91bGRSZWNvbXBpbGVGcm9t
Q29udHJvbEZsb3dQcm9maWxlcjsKIAotICAgIGJvb2wgbmVlZHNUb1JlY29tcGlsZSA9IChzaG91
bGRFbmFibGVUeXBlUHJvZmlsaW5nID8gdm0uZW5hYmxlVHlwZVByb2ZpbGVyKCkgOiB2bS5kaXNh
YmxlVHlwZVByb2ZpbGVyKCkpOwogICAgIGlmIChuZWVkc1RvUmVjb21waWxlKSB7CisgICAgICAg
IHZtLnByZXBhcmVUb0Rpc2NhcmRDb2RlKCk7CiAgICAgICAgIFR5cGVSZWNvbXBpbGVyIHJlY29t
cGlsZXI7CiAgICAgICAgIEhlYXBJdGVyYXRpb25TY29wZSBpdGVyYXRpb25TY29wZSh2bS5oZWFw
KTsKICAgICAgICAgdm0uaGVhcC5vYmplY3RTcGFjZSgpLmZvckVhY2hMaXZlQ2VsbChpdGVyYXRp
b25TY29wZSwgcmVjb21waWxlcik7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9Db250cm9sRmxvd1Byb2ZpbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9Db250cm9sRmxvd1Byb2ZpbGVyLmNwcAkocmV2aXNpb24gMTc4NDkxKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29udHJvbEZsb3dQcm9maWxlci5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTgxLDEyICs4MSwxMiBAQCBWZWN0b3I8QmFzaWNCbG9ja1Jhbmdl
PiBDb250cm9sRmxvd1Byb2ZpCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBjb25zdCBWZWN0b3I8
c3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4+JiB1bmV4ZWN1dGVkRnVuY3Rpb25SYW5nZXMg
PSB2bS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUoKS0+Z2V0VW5leGVjdXRlZEZ1bmN0aW9uUmFu
Z2VzKHNvdXJjZUlEKTsKKyAgICBjb25zdCBWZWN0b3I8c3RkOjp0dXBsZTxib29sLCB1bnNpZ25l
ZCwgdW5zaWduZWQ+PiYgdW5leGVjdXRlZEZ1bmN0aW9uUmFuZ2VzID0gdm0uZnVuY3Rpb25IYXNF
eGVjdXRlZENhY2hlKCktPmdldEZ1bmN0aW9uUmFuZ2VzKHNvdXJjZUlEKTsKICAgICBmb3IgKGNv
bnN0IGF1dG8mIGZ1bmN0aW9uUmFuZ2UgOiB1bmV4ZWN1dGVkRnVuY3Rpb25SYW5nZXMpIHsKICAg
ICAgICAgQmFzaWNCbG9ja1JhbmdlIHJhbmdlOwotICAgICAgICByYW5nZS5tX2hhc0V4ZWN1dGVk
ID0gZmFsc2U7Ci0gICAgICAgIHJhbmdlLm1fc3RhcnRPZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+
KGZ1bmN0aW9uUmFuZ2UuZmlyc3QpOwotICAgICAgICByYW5nZS5tX2VuZE9mZnNldCA9IHN0YXRp
Y19jYXN0PGludD4oZnVuY3Rpb25SYW5nZS5zZWNvbmQgKyAxKTsKKyAgICAgICAgcmFuZ2UubV9o
YXNFeGVjdXRlZCA9IHN0ZDo6Z2V0PDA+KGZ1bmN0aW9uUmFuZ2UpOworICAgICAgICByYW5nZS5t
X3N0YXJ0T2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihzdGQ6OmdldDwxPihmdW5jdGlvblJhbmdl
KSk7CisgICAgICAgIHJhbmdlLm1fZW5kT2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihzdGQ6Omdl
dDwyPihmdW5jdGlvblJhbmdlKSArIDEpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHJhbmdlKTsK
ICAgICB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uSGFz
RXhlY3V0ZWRDYWNoZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmNwcAkocmV2aXNpb24gMTc4NDkxKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtODAsMTkgKzgwLDE4IEBAIHZvaWQgRnVuY3Rpb25IYXNFeGVj
dXRlZENhY2hlOjpyZW1vdmVVbmUKICAgICBtYXBbcmFuZ2VdID0gdHJ1ZTsKIH0KIAotVmVjdG9y
PHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+PiBGdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGU6
OmdldFVuZXhlY3V0ZWRGdW5jdGlvblJhbmdlcyhpbnRwdHJfdCBpZCkKK1ZlY3RvcjxzdGQ6OnR1
cGxlPGJvb2wsIHVuc2lnbmVkLCB1bnNpZ25lZD4+IEZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZTo6
Z2V0RnVuY3Rpb25SYW5nZXMoaW50cHRyX3QgaWQpCiB7Ci0gICAgVmVjdG9yPHN0ZDo6cGFpcjx1
bnNpZ25lZCwgdW5zaWduZWQ+PiByYW5nZXMoMCk7CisgICAgVmVjdG9yPHN0ZDo6dHVwbGU8Ym9v
bCwgdW5zaWduZWQsIHVuc2lnbmVkPj4gcmFuZ2VzKDApOwogICAgIGF1dG8gZmluZFJlc3VsdCA9
IG1fcmFuZ2VNYXAuZmluZChpZCk7CiAgICAgaWYgKGZpbmRSZXN1bHQgPT0gbV9yYW5nZU1hcC5l
bmQoKSkKICAgICAgICAgcmV0dXJuIHJhbmdlczsKIAogICAgIFJhbmdlTWFwJiBtYXAgPSBtX3Jh
bmdlTWFwLmZpbmQoaWQpLT5zZWNvbmQ7CiAgICAgZm9yIChhdXRvIGl0ZXIgPSBtYXAuYmVnaW4o
KSwgZW5kID0gbWFwLmVuZCgpOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7Ci0gICAgICAgIGlmICgh
aXRlci0+c2Vjb25kKSB7Ci0gICAgICAgICAgICBjb25zdCBGdW5jdGlvblJhbmdlJiByYW5nZSA9
IGl0ZXItPmZpcnN0OwotICAgICAgICAgICAgcmFuZ2VzLmFwcGVuZChzdGQ6OnBhaXI8dW5zaWdu
ZWQsIHVuc2lnbmVkPihyYW5nZS5tX3N0YXJ0LCByYW5nZS5tX2VuZCkpOwotICAgICAgICB9Cisg
ICAgICAgIGNvbnN0IEZ1bmN0aW9uUmFuZ2UmIHJhbmdlID0gaXRlci0+Zmlyc3Q7CisgICAgICAg
IGJvb2wgaGFzRXhlY3V0ZWQgPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgIHJhbmdlcy5hcHBlbmQo
c3RkOjp0dXBsZTxib29sLCB1bnNpZ25lZCwgdW5zaWduZWQ+KGhhc0V4ZWN1dGVkLCByYW5nZS5t
X3N0YXJ0LCByYW5nZS5tX2VuZCkpOwogICAgIH0KIAogICAgIHJldHVybiByYW5nZXM7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9GdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9GdW5jdGlvbkhh
c0V4ZWN1dGVkQ2FjaGUuaAkocmV2aXNpb24gMTc4NDkxKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3J1bnRpbWUvRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTUyLDcgKzUyLDcgQEAgcHVibGljOgogICAgIGJvb2wgaGFzRXhlY3V0ZWRBdE9mZnNldChpbnRw
dHJfdCBpZCwgdW5zaWduZWQgb2Zmc2V0KTsKICAgICB2b2lkIGluc2VydFVuZXhlY3V0ZWRSYW5n
ZShpbnRwdHJfdCBpZCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCk7CiAgICAgdm9pZCBy
ZW1vdmVVbmV4ZWN1dGVkUmFuZ2UoaW50cHRyX3QgaWQsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25l
ZCBlbmQpOwotICAgIFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj4gZ2V0VW5l
eGVjdXRlZEZ1bmN0aW9uUmFuZ2VzKGludHB0cl90IGlkKTsKKyAgICBWZWN0b3I8c3RkOjp0dXBs
ZTxib29sLCB1bnNpZ25lZCwgdW5zaWduZWQ+PiBnZXRGdW5jdGlvblJhbmdlcyhpbnRwdHJfdCBp
ZCk7CiAKIHByaXZhdGU6ICAgICAKICAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxGdW5j
dGlvblJhbmdlLCBib29sLCBIYXNoTWV0aG9kPEZ1bmN0aW9uUmFuZ2U+PiBSYW5nZU1hcDsKSW5k
ZXg6IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwkocmV2aXNpb24gMTc4NjIxKQorKysgU291cmNlL1dl
Ykluc3BlY3RvclVJL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU2IEBACisy
MDE1LTAxLTE2ICBTYWFtIEJhcmF0aSAgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KKworICAgICAg
ICBXZWIgSW5zcGVjdG9yOiBQcm92aWRlIGEgZnJvbnQgZW5kIGZvciBKU0MncyBDb250cm9sIEZs
b3cgUHJvZmlsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTEzODQ1NAorCisgICAgICAgIFJldmlld2VkIGJ5IFRpbW90aHkgSGF0Y2hlci4KKworICAg
ICAgICBUaGlzIHBhdGNoIGNyZWF0ZXMgYSB1c2VyIGludGVyZmFjZSBmb3IgSlNDJ3MgY29udHJv
bCBmbG93IHByb2ZpbGVyLgorICAgICAgICBUaGUgV2ViIEluc3BlY3RvciBnZXRzIGJhc2ljIGJs
b2NrIHJhbmdlcyBmcm9tIEpTQywgYW5kIGRpc3BsYXlzCisgICAgICAgIGJhc2ljIGJsb2NrcyB0
aGF0IGhhdmUgbm90IGV4ZWN1dGVkIGFzIGhhdmluZyBhIGdyYXkgYmFja2dyb3VuZC4KKyAgICAg
ICAgCisgICAgICAgIEJhc2ljQmxvY2tBbm5vdGF0b3IgaXMgdGhlIGNsYXNzIHJlc3BvbnNpYmxl
IGZvciB0aGlzIFVJIGxvZ2ljLgorICAgICAgICBJdCBhbHNvIGRvZXMgYSBmZXcgbmlmdHkgdGhp
bmdzIHdoZW4gcHJlc2VudGluZyBhIFVJIGZvciB0aGlzIGdyYXkKKyAgICAgICAgYmFja2dyb3Vu
ZCBjb2xvcjogaWYgYW4gZW50aXJlIGxpbmUgb2YgY29kZSBpcyB3aXRoaW4gdGhlIGJhc2ljIAor
ICAgICAgICBibG9jaydzIGJvdW5kYXJ5LCB0aGUgYW5ub3RhdG9yIHdpbGwgbm90IGp1c3QgaGln
aGxpZ2h0IHRoZSBiYWNrZ3JvdW5kIAorICAgICAgICBiZWhpbmQgdGhlIHRleHQsIGJ1dCB0aGUg
YmFja2dyb3VuZCBvZiB0aGUgZW50aXJlIGxpbmUgaXRzZWxmLiBUaGlzCisgICAgICAgIHByb3Zp
ZGVzIGEgbmljZXIgZXhwZXJpZW5jZSB3aGVuIGdsYW5jaW5nIHRocm91Z2ggbGFyZ2UgSmF2YVNj
cmlwdCBmaWxlcy4KKworICAgICAgICBUaGlzIHBhdGNoIGFsc28gYWRkcyBzb21lIG5lY2Vzc2Fy
eSB3cmFwcGVyIG1ldGhvZHMgaW5zaWRlIFRleHRFZGl0b3IKKyAgICAgICAgZm9yIGFjY2Vzc2lu
ZyBDb2RlTWlycm9yJ3MgdGV4dCBoaWdobGlnaHRpbmcgZnVuY3Rpb25hbGl0eS4gSXQgYWxzbwor
ICAgICAgICBjcmVhdGVzIGEgd2F5IGZvciBUZXh0RWRpdG9yIGFuZCBTb3VyY2VDb2RlVGV4dEVk
aXRvciB0byBsaXN0ZW4KKyAgICAgICAgZm9yIGZvY3VzIGV2ZW50cyBpbnNpZGUgQ29kZU1pcnJv
ci4KKworICAgICAgICAqIFVzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvQW5ub3RhdG9yTWFuYWdl
ci5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL01haW4uaHRtbDoKKyAgICAg
ICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNvZGVUZXh0RWRpdG9yLmNzczoKKyAgICAg
ICAgKC5iYXNpYy1ibG9jay1oYXMtbm90LWV4ZWN1dGVkKToKKyAgICAgICAgKC5iYXNpYy1ibG9j
ay1oYXMtbm90LWV4ZWN1dGVkLXByZXBlbmQ6OmJlZm9yZSk6CisgICAgICAgICogVXNlckludGVy
ZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5qczoKKyAgICAgICAgKFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvcik6CisgICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29k
ZVRleHRFZGl0b3IucHJvdG90eXBlLnNob3duKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3Vy
Y2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUuaGlkZGVuKToKKyAgICAgICAgKFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUuY2FuU2hvd1R5cGVBbm5vdGF0aW9ucyk6
CisgICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLmNv
bnRlbnREaWRDaGFuZ2UpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRp
dG9yLnByb3RvdHlwZS5nYWluZWRGb2N1cyk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNl
Q29kZVRleHRFZGl0b3IucHJvdG90eXBlLmxvc3RGb2N1cyk6CisgICAgICAgIChXZWJJbnNwZWN0
b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLnRvZ2dsZVR5cGVBbm5vdGF0aW9ucyk6
CisgICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLnBy
ZXR0eVByaW50KToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5w
cm90b3R5cGUuX3BvcHVsYXRlV2l0aENvbnRlbnQpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNv
dXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS5fZGVidWdnZXJEaWRQYXVzZSk6CisgICAgICAg
IChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90eXBlLl9kZWJ1Z2dlckRp
ZFJlc3VtZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJv
dG90eXBlLl91cGRhdGVUb2tlblRyYWNraW5nQ29udHJvbGxlclN0YXRlKToKKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3R5cGUuX21ha2VUeXBlVG9rZW5B
bm5vdGF0b3IpOgorICAgICAgICAoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnBy
b3RvdHlwZS5fbWFrZUJhc2ljQmxvY2tBbm5vdGF0b3IpOgorICAgICAgICAoV2ViSW5zcGVjdG9y
LlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdHlwZS5fbWFrZVR5cGVUb2tlblNjcm9sbEV2ZW50
SGFuZGxlci5zY3JvbGxIYW5kbGVyKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5Tb3VyY2VDb2Rl
VGV4dEVkaXRvci5wcm90b3R5cGUuX21ha2VUeXBlVG9rZW5TY3JvbGxFdmVudEhhbmRsZXIpOgor
ICAgICAgICAqIFVzZXJJbnRlcmZhY2UvVmlld3MvVGV4dEVkaXRvci5qczoKKyAgICAgICAgKFdl
Ykluc3BlY3Rvci5UZXh0RWRpdG9yKToKKyAgICAgICAgKFdlYkluc3BlY3Rvci5UZXh0RWRpdG9y
LnByb3RvdHlwZS5nZXRUZXh0SW5SYW5nZSk6CisgICAgICAgIChXZWJJbnNwZWN0b3IuVGV4dEVk
aXRvci5wcm90b3R5cGUuYWRkU3R5bGVUb1RleHRSYW5nZSk6CisgICAgICAgIChXZWJJbnNwZWN0
b3IuVGV4dEVkaXRvci5wcm90b3R5cGUuZ2FpbmVkRm9jdXMpOgorICAgICAgICAoV2ViSW5zcGVj
dG9yLlRleHRFZGl0b3IucHJvdG90eXBlLmxvc3RGb2N1cyk6CisKIDIwMTUtMDEtMTYgIE5pa2l0
YSBWYXNpbHlldiAgPG52YXNpbHlldkBhcHBsZS5jb20+CiAKICAgICAgICAgV2ViIEluc3BlY3Rv
cjogTWFrZSBtZXNzYWdlIHNlbGVjdGlvbiBpbiB0aGUgY29uc29sZSBtb3JlIHJlYWRhYmxlCklu
ZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9NYWluLmh0bWwKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvTWFpbi5odG1sCShy
ZXZpc2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9N
YWluLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTQ2Myw4ICs0NjMsOCBAQAogICAgIDxzY3JpcHQg
c3JjPSJDb250cm9sbGVycy9Db2RlTWlycm9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0
PgogCiAgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0FuYWx5emVyTWFuYWdlci5qcyI+PC9z
Y3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Fubm90YXRvck1hbmFnZXIuanMi
Pjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVycy9BcHBsaWNhdGlvbkNhY2hl
TWFuYWdlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9IkNvbnRyb2xsZXJzL0Jhc2lj
QmxvY2tBbm5vdGF0b3IuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJDb250cm9sbGVy
cy9CcmFuY2hNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJvbGxl
cnMvQ1NTU3R5bGVNYW5hZ2VyLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0IHNyYz0iQ29udHJv
bGxlcnMvQ29kZU1pcnJvckNvbG9yRWRpdGluZ0NvbnRyb2xsZXIuanMiPjwvc2NyaXB0PgpJbmRl
eDogU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvQW5ub3Rh
dG9yTWFuYWdlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9Db250cm9sbGVycy9Bbm5vdGF0b3JNYW5hZ2VyLmpzCShyZXZpc2lvbiAxNzg0OTEp
CisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9sbGVycy9Bbm5v
dGF0b3JNYW5hZ2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29w
eXJpZ2h0IChDKSAyMDE0IFNhYW0gQmFyYXRpIDxzYWFtYmFyYXRpMUBnbWFpbC5jb20+Ci0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLVdlYkluc3BlY3Rvci5Bbm5vdGF0b3JNYW5hZ2VyID0gZnVuY3Rpb24oKQotewotICAg
IFdlYkluc3BlY3Rvci5PYmplY3QuY2FsbCh0aGlzKTsKLQotICAgIHRoaXMuX2Fubm90YXRvcnMg
PSBuZXcgTWFwOwotfTsKLQotV2ViSW5zcGVjdG9yLkFubm90YXRvck1hbmFnZXIucHJvdG90eXBl
ID0gewotICAgIGNvbnN0cnVjdG9yOiBXZWJJbnNwZWN0b3IuQW5ub3RhdG9yTWFuYWdlciwKLSAg
ICBfX3Byb3RvX186IFdlYkluc3BlY3Rvci5PYmplY3QucHJvdG90eXBlLAotCi0gICAgLy8gUHVi
bGljCi0KLSAgICBhZGRBbm5vdGF0b3I6IGZ1bmN0aW9uKGtleSwgYW5ub3RhdG9yKQotICAgIHsK
LSAgICAgICAgY29uc29sZS5hc3NlcnQoYW5ub3RhdG9yIGluc3RhbmNlb2YgV2ViSW5zcGVjdG9y
LkFubm90YXRvcik7Ci0gICAgICAgIHRoaXMuX2Fubm90YXRvcnMuc2V0KGtleSwgYW5ub3RhdG9y
KTsKLSAgICB9LAotCi0gICAgZ2V0QW5ub3RhdG9yOiBmdW5jdGlvbihrZXkpCi0gICAgewotICAg
ICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdG9ycy5nZXQoa2V5KSB8fCBudWxsOwotICAgIH0sCi0K
LSAgICBpc0Fubm90YXRvckFjdGl2ZTogZnVuY3Rpb24oa2V5KQotICAgIHsKLSAgICAgICAgdmFy
IGFubm90YXRvciA9IHRoaXMuZ2V0QW5ub3RhdG9yKGtleSk7Ci0gICAgICAgIGlmICghYW5ub3Rh
dG9yKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gYW5ub3RhdG9y
LmlzQWN0aXZlOwotICAgIH0sCi0KLSAgICBwYXVzZUFsbDogZnVuY3Rpb24oKQotICAgIHsKLSAg
ICAgICAgZm9yICh2YXIgYW5ub3RhdG9yIG9mIHRoaXMuX2Fubm90YXRvcnMudmFsdWVzKCkpCi0g
ICAgICAgICAgICBhbm5vdGF0b3IucGF1c2UoKTsKLSAgICB9LAotCi0gICAgcmVzdW1lQWxsOiBm
dW5jdGlvbigpCi0gICAgewotICAgICAgICBmb3IgKHZhciBhbm5vdGF0b3Igb2YgdGhpcy5fYW5u
b3RhdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIGFubm90YXRvci5yZXN1bWUoKTsKLSAgICB9
LAotCi0gICAgcmVmcmVzaEFsbElmQWN0aXZlOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICBm
b3IgKHZhciBhbm5vdGF0b3Igb2YgdGhpcy5fYW5ub3RhdG9ycy52YWx1ZXMoKSkgewotICAgICAg
ICAgICAgaWYgKGFubm90YXRvci5pc0FjdGl2ZSkKLSAgICAgICAgICAgICAgICBhbm5vdGF0b3Iu
cmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIHJlc2V0QWxsSWZBY3RpdmU6IGZ1
bmN0aW9uKCkKLSAgICB7Ci0gICAgICAgIGZvciAodmFyIGFubm90YXRvciBvZiB0aGlzLl9hbm5v
dGF0b3JzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdG9yLmlzQWN0aXZlKQot
ICAgICAgICAgICAgICAgIGFubm90YXRvci5yZXNldCgpOwotICAgICAgICB9Ci0gICAgfSwKLQot
ICAgIGNsZWFyQWxsOiBmdW5jdGlvbigpCi0gICAgewotICAgICAgICBmb3IgKHZhciBhbm5vdGF0
b3Igb2YgdGhpcy5fYW5ub3RhdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIGFubm90YXRvci5j
bGVhcigpOwotICAgIH0sCi0KLSAgICByZW1vdmVBbGxBbm5vdGF0b3JzOiBmdW5jdGlvbigpCi0g
ICAgewotICAgICAgICB0aGlzLl9hbm5vdGF0b3JzLmNsZWFyKCk7Ci0gICAgfQotfTsKSW5kZXg6
IFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL0Jhc2ljQmxv
Y2tBbm5vdGF0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJ
bnRlcmZhY2UvQ29udHJvbGxlcnMvQmFzaWNCbG9ja0Fubm90YXRvci5qcwkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL0Jhc2lj
QmxvY2tBbm5vdGF0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxODUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDE1IFNhYW0gQmFyYXRpIDxzYWFtYmFyYXRpMUBnbWFpbC5jb20+Cisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKK1dlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yID0gZnVuY3Rpb24oc291
cmNlQ29kZVRleHRFZGl0b3IsIHNjcmlwdCkKK3sKKyAgICBXZWJJbnNwZWN0b3IuQW5ub3RhdG9y
LmNhbGwodGhpcywgc291cmNlQ29kZVRleHRFZGl0b3IpOworCisgICAgdGhpcy5fc2NyaXB0ID0g
c2NyaXB0OworICAgIHRoaXMuX2Jhc2ljQmxvY2tNYXJrZXJzID0gbmV3IE1hcDsgLy8gT25seSBj
b250YWlucyB1bmV4ZWN1dGVkIGJhc2ljIGJsb2Nrcy4KK307CisKK1dlYkluc3BlY3Rvci5CYXNp
Y0Jsb2NrQW5ub3RhdG9yLkhhc05vdEV4ZWN1dGVkQ2xhc3NOYW1lID0gImJhc2ljLWJsb2NrLWhh
cy1ub3QtZXhlY3V0ZWQiOworV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90
RXhlY3V0ZWRQcmVwZW5kQ2xhc3NOYW1lID0gImJhc2ljLWJsb2NrLWhhcy1ub3QtZXhlY3V0ZWQt
cHJlcGVuZCI7CisKK1dlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yLnByb3RvdHlwZSA9
IHsKKyAgICBjb25zdHJ1Y3RvcjogV2ViSW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IsCisg
ICAgX19wcm90b19fOiBXZWJJbnNwZWN0b3IuQW5ub3RhdG9yLnByb3RvdHlwZSwKKworICAgIC8v
IFByb3RlY3RlZAorCisgICAgY2xlYXJBbm5vdGF0aW9uczogZnVuY3Rpb24oKQorICAgIHsKKyAg
ICAgICAgZm9yICh2YXIga2V5IG9mIHRoaXMuX2Jhc2ljQmxvY2tNYXJrZXJzLmtleXMoKSkKKyAg
ICAgICAgICAgIHRoaXMuX2NsZWFyUmFuZ2VGb3JCYXNpY0Jsb2NrTWFya2VyKGtleSk7CisgICAg
fSwKKworICAgIGluc2VydEFubm90YXRpb25zOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICBp
ZiAoIXRoaXMuX2lzQWN0aXZlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0aGlzLl9h
bm5vdGF0ZUJhc2ljQmxvY2tFeGVjdXRpb25SYW5nZXMoKTsKKyAgICB9LAorCisgICAgLy8gUHJp
dmF0ZQorCisgICAgX2Fubm90YXRlQmFzaWNCbG9ja0V4ZWN1dGlvblJhbmdlczogZnVuY3Rpb24o
KQorICAgIHsKKyAgICAgICAgdmFyIHNvdXJjZUlEID0gdGhpcy5fc2NyaXB0LmlkOworICAgICAg
ICB2YXIgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKKworICAgICAgICBSdW50aW1lQWdlbnQuZ2V0
QmFzaWNCbG9ja3Moc291cmNlSUQsIGZ1bmN0aW9uKGVycm9yLCBiYXNpY0Jsb2NrcykgeworICAg
ICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRXJy
b3IgaW4gZ2V0dGluZyBiYXNpYyBibG9jayBsb2NhdGlvbnM6ICIgKyBlcnJvcik7CisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXRoaXMu
X2lzQWN0aXZlKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdmFyIHtz
dGFydE9mZnNldCwgZW5kT2Zmc2V0fSA9IHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3IudmlzaWJs
ZVJhbmdlT2Zmc2V0cygpOworICAgICAgICAgICAgYmFzaWNCbG9ja3MgPSBiYXNpY0Jsb2Nrcy5m
aWx0ZXIoZnVuY3Rpb24oYmxvY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2suc3Rh
cnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgYmxvY2suc3RhcnRPZmZzZXQgPD0gZW5kT2Zmc2V0
OworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGZvciAodmFyIGJsb2NrIG9mIGJhc2lj
QmxvY2tzKSB7CisgICAgICAgICAgICAgICAgdmFyIGtleSA9IGJsb2NrLnN0YXJ0T2Zmc2V0ICsg
IjoiICsgYmxvY2suZW5kT2Zmc2V0OworICAgICAgICAgICAgICAgIHZhciBoYXNLZXkgPSB0aGlz
Ll9iYXNpY0Jsb2NrTWFya2Vycy5oYXMoa2V5KTsKKyAgICAgICAgICAgICAgICB2YXIgaGFzRXhl
Y3V0ZWQgPSBibG9jay5oYXNFeGVjdXRlZDsKKyAgICAgICAgICAgICAgICBpZiAoaGFzS2V5ICYm
IGhhc0V4ZWN1dGVkKQorICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclJhbmdlRm9yQmFz
aWNCbG9ja01hcmtlcihrZXkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFoYXNLZXkgJiYg
IWhhc0V4ZWN1dGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBiYXNpY0Jsb2NrTWFya2Vy
ID0gdGhpcy5faGlnaGxpZ2h0VGV4dEZvckJhc2ljQmxvY2soYmxvY2spOworICAgICAgICAgICAg
ICAgICAgICBpZiAoYmFzaWNCbG9ja01hcmtlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRo
aXMuX2Jhc2ljQmxvY2tNYXJrZXJzLnNldChrZXksIGJhc2ljQmxvY2tNYXJrZXIpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHRvdGFsVGltZSA9
IERhdGUubm93KCkgLSBzdGFydFRpbWU7CisgICAgICAgICAgICB2YXIgdGltZW91dFRpbWUgPSBN
YXRoLm1pbihNYXRoLm1heCg2NTAwLCB0b3RhbFRpbWUpLCAxNSAqIHRvdGFsVGltZSk7CisgICAg
ICAgICAgICB0aGlzLl90aW1lb3V0SWRlbnRpZmllciA9IHNldFRpbWVvdXQodGhpcy5pbnNlcnRB
bm5vdGF0aW9ucy5iaW5kKHRoaXMpLCB0aW1lb3V0VGltZSk7CisgICAgICAgIH0uYmluZCh0aGlz
KSk7CisgICAgfSwKKworICAgIF9oaWdobGlnaHRUZXh0Rm9yQmFzaWNCbG9jazogZnVuY3Rpb24o
YmFzaWNCbG9jaykKKyAgICB7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGJhc2ljQmxvY2suc3Rh
cnRPZmZzZXQgPD0gYmFzaWNCbG9jay5lbmRPZmZzZXQgJiYgYmFzaWNCbG9jay5zdGFydE9mZnNl
dCA+PSAwICYmIGJhc2ljQmxvY2suZW5kT2Zmc2V0ID49IDAsICIiICsgYmFzaWNCbG9jay5zdGFy
dE9mZnNldCArICI6IiArIGJhc2ljQmxvY2suZW5kT2Zmc2V0KTsKKyAgICAgICAgY29uc29sZS5h
c3NlcnQoIWJhc2ljQmxvY2suaGFzRXhlY3V0ZWQpOworCisgICAgICAgIHZhciBzdGFydFBvc2l0
aW9uID0gdGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5vcmlnaW5hbE9mZnNldFRvQ3VycmVudFBv
c2l0aW9uKGJhc2ljQmxvY2suc3RhcnRPZmZzZXQpOworICAgICAgICB2YXIgZW5kUG9zaXRpb24g
PSB0aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLm9yaWdpbmFsT2Zmc2V0VG9DdXJyZW50UG9zaXRp
b24oYmFzaWNCbG9jay5lbmRPZmZzZXQpOworCisgICAgICAgIGlmICh0aGlzLl9pc1RleHRSYW5n
ZU9ubHlXaGl0ZXNwYWNlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAg
IHJldHVybiBudWxsOworCisgICAgICAgIC8vIEdyYXkgb3V0IHRoZSB0ZXh0IHJhbmdlLgorICAg
ICAgICB2YXIgbWFya2VyID0gdGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5hZGRTdHlsZVRvVGV4
dFJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBXZWJJbnNwZWN0b3IuQmFzaWNCbG9j
a0Fubm90YXRvci5IYXNOb3RFeGVjdXRlZENsYXNzTmFtZSk7CisKKyAgICAgICAgLy8gV2hlbiBh
ZGRpbmcgYSBzdHlsZSB0byB0aGUgY29kZSByYW5nZSBpbiBDb2RlTWlycm9yLCBzdWNoIGFzIGEg
YmFja2dyb3VuZCBjb2xvciwgaXQgd2lsbCBvbmx5IGFwcGx5IHRoZSBzdHlsZQorICAgICAgICAv
LyB0byB0aGUgYXJlYSB3aGVyZSB0ZXh0IGlzLCBub3QgdG8gdGhlIHN0eWxlIG9mIGFuIGVudGly
ZSBsaW5lLiBCdXQsIGZyb20gYSB1c2VyIGludGVyZmFjZSBwZXJzcGVjdGl2ZSwgaXQgbG9va3MK
KyAgICAgICAgLy8gY2xlYW5lciB0byBoYXZlIGVudGlyZSBsaW5lcyBoaWdobGlnaHRlZC4gVGhl
IGZvbGxvd2luZyBsb2dpYyBncmF5cyBvdXQgZW50aXJlIGxpbmVzIHdoZW4gdGhlIGxpbmUncyBy
YW5nZSBpcworICAgICAgICAvLyBub3QgYWNyb3NzIGJhc2ljIGJsb2NrIGJvdW5kYXJpZXMuCisg
ICAgICAgIHZhciBsaW5lU3R5bGVzID0gW107CisgICAgICAgIGlmIChlbmRQb3NpdGlvbi5saW5l
ID4gc3RhcnRQb3NpdGlvbi5saW5lKSB7CisgICAgICAgICAgICB2YXIgc3RhcnRMaW5lRW5kUG9z
aXRpb24gPSB7bGluZTogc3RhcnRQb3NpdGlvbi5saW5lLCBjaDogdGhpcy5zb3VyY2VDb2RlVGV4
dEVkaXRvci5saW5lKHN0YXJ0UG9zaXRpb24ubGluZSkubGVuZ3RofTsKKyAgICAgICAgICAgIGlm
ICh0aGlzLl9jYW5HcmF5T3V0RW50aXJlTGluZShzdGFydFBvc2l0aW9uLmxpbmUsIHN0YXJ0UG9z
aXRpb24sIHN0YXJ0TGluZUVuZFBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2dy
YXlPdXRMaW5lKHN0YXJ0UG9zaXRpb24ubGluZSk7CisgICAgICAgICAgICAgICAgbGluZVN0eWxl
cy5wdXNoKHtsaW5lOiBzdGFydFBvc2l0aW9uLmxpbmUsIGNsYXNzTmFtZTogV2ViSW5zcGVjdG9y
LkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWV9KTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgdmFyIGVuZExpbmVTdGFydFBvc2l0aW9uID0ge2xpbmU6IGVu
ZFBvc2l0aW9uLmxpbmUsIGNoOiAwfTsKKyAgICAgICAgICAgIGlmICh0aGlzLl9jYW5HcmF5T3V0
RW50aXJlTGluZShlbmRQb3NpdGlvbi5saW5lLCBlbmRMaW5lU3RhcnRQb3NpdGlvbiwgZW5kUG9z
aXRpb24pKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fZ3JheU91dExpbmUoZW5kUG9zaXRpb24u
bGluZSk7CisgICAgICAgICAgICAgICAgbGluZVN0eWxlcy5wdXNoKHtsaW5lOiBlbmRQb3NpdGlv
bi5saW5lLCBjbGFzc05hbWU6IFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yLkhhc05v
dEV4ZWN1dGVkQ2xhc3NOYW1lfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIHRoaXMuc291cmNlQ29kZVRleHRFZGl0b3IuYWRkU3R5bGVDbGFzc1RvTGluZShlbmRQb3Np
dGlvbi5saW5lLCBXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5IYXNOb3RFeGVjdXRl
ZFByZXBlbmRDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIGxpbmVTdHlsZXMucHVzaCh7bGlu
ZTogZW5kUG9zaXRpb24ubGluZSwgY2xhc3NOYW1lOiBXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fu
bm90YXRvci5IYXNOb3RFeGVjdXRlZFByZXBlbmRDbGFzc05hbWV9KTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGVuZFBvc2l0aW9u
LmxpbmUgPT09IHN0YXJ0UG9zaXRpb24ubGluZSk7CisgICAgICAgICAgICBpZiAodGhpcy5fY2Fu
R3JheU91dEVudGlyZUxpbmUoc3RhcnRQb3NpdGlvbi5saW5lLCBzdGFydFBvc2l0aW9uLCBlbmRQ
b3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9ncmF5T3V0TGluZShzdGFydFBvc2l0
aW9uLmxpbmUpOworICAgICAgICAgICAgICAgIGxpbmVTdHlsZXMucHVzaCh7bGluZTogc3RhcnRQ
b3NpdGlvbi5saW5lLCBjbGFzc05hbWU6IFdlYkluc3BlY3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9y
Lkhhc05vdEV4ZWN1dGVkQ2xhc3NOYW1lfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0
UG9zaXRpb24uY2ggPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNvZGVUZXh0
RWRpdG9yLmFkZFN0eWxlQ2xhc3NUb0xpbmUoZW5kUG9zaXRpb24ubGluZSwgV2ViSW5zcGVjdG9y
LkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRQcmVwZW5kQ2xhc3NOYW1lKTsKKyAg
ICAgICAgICAgICAgICBsaW5lU3R5bGVzLnB1c2goe2xpbmU6IHN0YXJ0UG9zaXRpb24ubGluZSwg
Y2xhc3NOYW1lOiBXZWJJbnNwZWN0b3IuQmFzaWNCbG9ja0Fubm90YXRvci5IYXNOb3RFeGVjdXRl
ZFByZXBlbmRDbGFzc05hbWV9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IGlmIChlbmRQb3NpdGlvbi5saW5lIC0gc3RhcnRQb3NpdGlvbi5saW5lID49IDIpIHsKKyAgICAg
ICAgICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbnRpcmUgbGluZSB0byBiZSBncmF5ZWQg
b3V0IGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24gb2YgdGhlIGJhc2ljIGJsb2Nr
OgorICAgICAgICAgICAgLy8gbiAgOiAuLi4KKyAgICAgICAgICAgIC8vIG4rMTogLi4uIChUaGlz
IGVudGlyZSBsaW5lIGNhbiBzYWZlbHkgYmUgZ3JheWVkIG91dCkuCisgICAgICAgICAgICAvLyBu
KzI6IC4uLgorICAgICAgICAgICAgZm9yICh2YXIgbGluZU51bWJlciA9IHN0YXJ0UG9zaXRpb24u
bGluZSArIDE7IGxpbmVOdW1iZXIgPCBlbmRQb3NpdGlvbi5saW5lOyBsaW5lTnVtYmVyKyspIHsK
KyAgICAgICAgICAgICAgICB0aGlzLl9ncmF5T3V0TGluZShsaW5lTnVtYmVyKTsKKyAgICAgICAg
ICAgICAgICBsaW5lU3R5bGVzLnB1c2goe2xpbmU6IGxpbmVOdW1iZXIsIGNsYXNzTmFtZTogV2Vi
SW5zcGVjdG9yLkJhc2ljQmxvY2tBbm5vdGF0b3IuSGFzTm90RXhlY3V0ZWRDbGFzc05hbWV9KTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7bWFya2VyOiBtYXJr
ZXIsIGxpbmVTdHlsZXM6IGxpbmVTdHlsZXN9OworICAgIH0sCisKKyAgICBfaXNUZXh0UmFuZ2VP
bmx5V2hpdGVzcGFjZTogZnVuY3Rpb24oc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pCisgICAg
eworICAgICAgICB2YXIgaXNPbmx5V2hpdGVzcGFjZSA9IC9eXHMrJC87CisgICAgICAgIHJldHVy
biBpc09ubHlXaGl0ZXNwYWNlLnRlc3QodGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5nZXRUZXh0
SW5SYW5nZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpOworICAgIH0sCisKKyAgICBfY2Fu
R3JheU91dEVudGlyZUxpbmU6IGZ1bmN0aW9uKGxpbmVOdW1iZXIsIHN0YXJ0UG9zaXRpb24sIGVu
ZFBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgY29uc29sZS5hc3NlcnQoc3RhcnRQb3NpdGlvbi5s
aW5lID09PSBlbmRQb3NpdGlvbi5saW5lKTsKKyAgICAgICAgdmFyIGxpbmVUZXh0ID0gdGhpcy5z
b3VyY2VDb2RlVGV4dEVkaXRvci5saW5lKGxpbmVOdW1iZXIpOworICAgICAgICB2YXIgYmxvY2tU
ZXh0ID0gdGhpcy5zb3VyY2VDb2RlVGV4dEVkaXRvci5nZXRUZXh0SW5SYW5nZShzdGFydFBvc2l0
aW9uLCBlbmRQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBsaW5lVGV4dC50cmltKCkgPT09IGJs
b2NrVGV4dC50cmltKCk7CisgICAgfSwKKworICAgIF9ncmF5T3V0TGluZTogZnVuY3Rpb24obGlu
ZU51bWJlcikKKyAgICB7CisgICAgICAgIHZhciBjbGFzc05hbWUgPSBXZWJJbnNwZWN0b3IuQmFz
aWNCbG9ja0Fubm90YXRvci5IYXNOb3RFeGVjdXRlZENsYXNzTmFtZTsKKyAgICAgICAgdGhpcy5z
b3VyY2VDb2RlVGV4dEVkaXRvci5hZGRTdHlsZUNsYXNzVG9MaW5lKGxpbmVOdW1iZXIsIGNsYXNz
TmFtZSk7CisgICAgfSwKKworICAgIF9jbGVhclJhbmdlRm9yQmFzaWNCbG9ja01hcmtlcjogZnVu
Y3Rpb24oa2V5KQorICAgIHsKKyAgICAgICAgY29uc29sZS5hc3NlcnQodGhpcy5fYmFzaWNCbG9j
a01hcmtlcnMuaGFzKGtleSkpOworICAgICAgICB2YXIge21hcmtlciwgbGluZVN0eWxlc30gPSB0
aGlzLl9iYXNpY0Jsb2NrTWFya2Vycy5nZXQoa2V5KTsKKyAgICAgICAgbWFya2VyLmNsZWFyKCk7
CisgICAgICAgIGZvciAodmFyIHtsaW5lTnVtYmVyLCBjbGFzc05hbWV9IG9mIGxpbmVTdHlsZXMp
CisgICAgICAgICAgICB0aGlzLnNvdXJjZUNvZGVUZXh0RWRpdG9yLnJlbW92ZVN0eWxlQ2xhc3NG
cm9tTGluZShsaW5lTnVtYmVyLCBjbGFzc05hbWUpOworICAgICAgICB0aGlzLl9iYXNpY0Jsb2Nr
TWFya2Vycy5kZWxldGUoa2V5KTsKKyAgICB9Cit9OwpJbmRleDogU291cmNlL1dlYkluc3BlY3Rv
clVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0b3IuY3NzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1NvdXJjZUNv
ZGVUZXh0RWRpdG9yLmNzcwkocmV2aXNpb24gMTc4NDkxKQorKysgU291cmNlL1dlYkluc3BlY3Rv
clVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNlQ29kZVRleHRFZGl0b3IuY3NzCSh3b3JraW5n
IGNvcHkpCkBAIC03NiwzICs3NiwxNiBAQAogCiAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5z
bGF0ZVkoMXB4KTsKIH0KKworLmJhc2ljLWJsb2NrLWhhcy1ub3QtZXhlY3V0ZWQgeworICAgIGJh
Y2tncm91bmQtY29sb3I6IHJnYigyNDAsIDI0MCwgMjQwKTsKK30KKworLmJhc2ljLWJsb2NrLWhh
cy1ub3QtZXhlY3V0ZWQtcHJlcGVuZDo6YmVmb3JlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBy
Z2IoMjQwLCAyNDAsIDI0MCk7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGNvbnRlbnQ6
ICIiOyAKKyAgICBoZWlnaHQ6IDEzcHg7CisgICAgbGVmdDogMHB4OworICAgIHdpZHRoOiA3cHg7
Cit9CkluZGV4OiBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9Tb3Vy
Y2VDb2RlVGV4dEVkaXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9WaWV3cy9Tb3VyY2VDb2RlVGV4dEVkaXRvci5qcwkocmV2aXNpb24gMTc4
NDkxKQorKysgU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvU291cmNl
Q29kZVRleHRFZGl0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTM3LDcgKzM3LDEwIEBAIFdlYklu
c3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRvciA9IGZ1bmMKICAgICBXZWJJbnNwZWN0b3IuVGV4
dEVkaXRvci5jYWxsKHRoaXMsIG51bGwsIG51bGwsIHRoaXMpOwogCiAgICAgdGhpcy5fdHlwZVRv
a2VuU2Nyb2xsSGFuZGxlciA9IG51bGw7Ci0gICAgdGhpcy5fYW5ub3RhdG9yTWFuYWdlciA9IG5l
dyBXZWJJbnNwZWN0b3IuQW5ub3RhdG9yTWFuYWdlcjsKKyAgICB0aGlzLl90eXBlVG9rZW5Bbm5v
dGF0b3IgPSBudWxsOworICAgIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IgPSBudWxsOworCisg
ICAgdGhpcy5faGFzRm9jdXMgPSBmYWxzZTsKIAogICAgIC8vIEZJWE1FOiBDdXJyZW50bHkgdGhp
cyBqdXN0IGp1bXBzIGJldHdlZW4gcmVzb3VyY2VzIGFuZCByZWxhdGVkIHNvdXJjZSBtYXAgcmVz
b3VyY2VzLiBJdCBkb2Vzbid0ICJqdW1wIHRvIHN5bWJvbCIgeWV0LgogICAgIHRoaXMuX3VwZGF0
ZVRva2VuVHJhY2tpbmdDb250cm9sbGVyU3RhdGUoKTsKQEAgLTkwLDggKzkzLDYgQEAgV2ViSW5z
cGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLkR1cmF0aQogCiBXZWJJbnNwZWN0b3IuU291cmNl
Q29kZVRleHRFZGl0b3IuQXV0b0Zvcm1hdE1pbmltdW1MaW5lTGVuZ3RoID0gNTAwOwogCi1XZWJJ
bnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuVHlwZVRva2VuQW5ub3RhdG9yS2V5ID0gIlR5
cGVUb2tlbkFubm90YXRvcktleSI7Ci0KIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVkaXRv
ci5FdmVudCA9IHsKICAgICBDb250ZW50V2lsbFBvcHVsYXRlOiAic291cmNlLWNvZGUtdGV4dC1l
ZGl0b3ItY29udGVudC13aWxsLXBvcHVsYXRlIiwKICAgICBDb250ZW50RGlkUG9wdWxhdGU6ICJz
b3VyY2UtY29kZS10ZXh0LWVkaXRvci1jb250ZW50LWRpZC1wb3B1bGF0ZSIKQEAgLTExMSw3ICsx
MTIsMjEgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3RvdAogICAgIHsK
ICAgICAgICAgV2ViSW5zcGVjdG9yLlRleHRFZGl0b3IucHJvdG90eXBlLnNob3duLmNhbGwodGhp
cyk7CiAKLSAgICAgICAgdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5yZXN1bWVBbGwoKTsKKyAgICAg
ICAgaWYgKFdlYkluc3BlY3Rvci5zaG93SmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvblNldHRpbmcu
dmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IpCisgICAg
ICAgICAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yLnJlc3VtZSgpOworICAgICAgICAg
ICAgaWYgKHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICAgICAgdGhpcy5f
YmFzaWNCbG9ja0Fubm90YXRvci5yZXN1bWUoKTsKKyAgICAgICAgICAgIGlmICghdGhpcy5fdHlw
ZVRva2VuU2Nyb2xsSGFuZGxlciAmJiAodGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yIHx8IHRoaXMu
X2Jhc2ljQmxvY2tBbm5vdGF0b3IpKQorICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZVNjcm9s
bEV2ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFubm90YXRvcikKKyAgICAgICAgICAgICAgICB0aGlz
Ll90eXBlVG9rZW5Bbm5vdGF0b3IuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLl9iYXNp
Y0Jsb2NrQW5ub3RhdG9yKQorICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0
b3IuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLl90eXBlVG9rZW5TY3JvbGxIYW5kbGVy
KQorICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVTY3JvbGxFdmVudHNGb3JUeXBlVG9rZW5B
bm5vdGF0b3IoKTsKKyAgICAgICAgfQogICAgIH0sCiAKICAgICBoaWRkZW46IGZ1bmN0aW9uKCkK
QEAgLTEyNCw3ICsxMzksMTAgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnBy
b3RvdAogICAgICAgICAKICAgICAgICAgdGhpcy5fZGlzbWlzc0VkaXRpbmdDb250cm9sbGVyKHRy
dWUpOwogCi0gICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucGF1c2VBbGwoKTsKKyAgICAg
ICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFubm90YXRvcikKKyAgICAgICAgICAgIHRoaXMuX3R5cGVU
b2tlbkFubm90YXRvci5wYXVzZSgpOworICAgICAgICBpZiAodGhpcy5fYmFzaWNCbG9ja0Fubm90
YXRvcikKKyAgICAgICAgICAgIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IucGF1c2UoKTsKICAg
ICB9LAogCiAgICAgY2xvc2U6IGZ1bmN0aW9uKCkKQEAgLTE2Niw3ICsxODQsNyBAQCBXZWJJbnNw
ZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IucHJvdG90CiAKICAgICBjYW5TaG93VHlwZUFubm90
YXRpb25zOiBmdW5jdGlvbigpCiAgICAgewotICAgICAgICByZXR1cm4gISF0aGlzLl9hbm5vdGF0
b3JNYW5hZ2VyLmdldEFubm90YXRvcihXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3Iu
VHlwZVRva2VuQW5ub3RhdG9yS2V5KTsKKyAgICAgICAgcmV0dXJuICEhdGhpcy5fdHlwZVRva2Vu
QW5ub3RhdG9yOwogICAgIH0sCiAKICAgICBjdXN0b21QZXJmb3JtU2VhcmNoOiBmdW5jdGlvbihx
dWVyeSkKQEAgLTI1NiwyOCArMjc0LDU0IEBAIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlVGV4dEVk
aXRvci5wcm90b3QKICAgICAgICAgZm9yICh2YXIgcmFuZ2Ugb2YgbmV3UmFuZ2VzKQogICAgICAg
ICAgICAgdGhpcy5fdXBkYXRlRWRpdGFibGVNYXJrZXJzKHJhbmdlKTsKIAotICAgICAgICB0aGlz
Ll9hbm5vdGF0b3JNYW5hZ2VyLmNsZWFyQWxsKCk7Ci0gICAgICAgIHRoaXMuX2Fubm90YXRvck1h
bmFnZXIucmVtb3ZlQWxsQW5ub3RhdG9ycygpOworICAgICAgICBpZiAodGhpcy5fdHlwZVRva2Vu
QW5ub3RhdG9yKSB7CisgICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IuY2xlYXIo
KTsKKyAgICAgICAgICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvciA9IG51bGw7CisgICAgICAg
IH0KKyAgICAgICAgaWYgKHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IpIHsKKyAgICAgICAgICAg
IHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IuY2xlYXIoKTsKKyAgICAgICAgICAgIHRoaXMuX2Jh
c2ljQmxvY2tBbm5vdGF0b3IgPSBudWxsOworICAgICAgICB9CiAgICAgICAgIGlmICh0aGlzLl90
eXBlVG9rZW5TY3JvbGxIYW5kbGVyKQogICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEV2
ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOwogICAgIH0sCiAKKyAgICBnYWluZWRGb2N1czog
ZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5faGFzRm9jdXMgPSB0cnVlOworICAgICAg
ICBpZiAodGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvcikKKyAgICAgICAgICAgIHRoaXMuX2Jhc2lj
QmxvY2tBbm5vdGF0b3IuY2xlYXIoKTsKKyAgICB9LAorCisgICAgbG9zdEZvY3VzOiBmdW5jdGlv
bigpCisgICAgeworICAgICAgICB0aGlzLl9oYXNGb2N1cyA9IGZhbHNlOworICAgICAgICBpZiAo
dGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvciAmJiBXZWJJbnNwZWN0b3Iuc2hvd0phdmFTY3JpcHRU
eXBlSW5mb3JtYXRpb25TZXR0aW5nLnZhbHVlKQorICAgICAgICAgICAgdGhpcy5fYmFzaWNCbG9j
a0Fubm90YXRvci5yZXN1bWUoKTsKKyAgICB9LAorCiAgICAgdG9nZ2xlVHlwZUFubm90YXRpb25z
OiBmdW5jdGlvbigpCiAgICAgewotICAgICAgICB2YXIgdHlwZVRva2VuQW5ub3RhdG9yID0gdGhp
cy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVU
ZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRvcktleSk7Ci0gICAgICAgIGlmICghdHlwZVRva2Vu
QW5ub3RhdG9yKQorICAgICAgICBpZiAoIXRoaXMuX3R5cGVUb2tlbkFubm90YXRvcikKICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICB2YXIgaXNBY3RpdmF0ZWQgPSB0eXBlVG9r
ZW5Bbm5vdGF0b3IudG9nZ2xlVHlwZUFubm90YXRpb25zKCk7CisgICAgICAgIHZhciBpc0FjdGl2
YXRlZCA9IHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci50b2dnbGVUeXBlQW5ub3RhdGlvbnMoKTsK
ICAgICAgICAgaWYgKGlzQWN0aXZhdGVkKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fYmFzaWNC
bG9ja0Fubm90YXRvciAmJiAhdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvci5pc0FjdGl2ZSAmJiAh
dGhpcy5faGFzRm9jdXMpCisgICAgICAgICAgICAgICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRv
ci5yZXNldCgpOworCiAgICAgICAgICAgICBSdW50aW1lQWdlbnQuZW5hYmxlVHlwZVByb2ZpbGVy
KCk7CiAgICAgICAgICAgICB0aGlzLl9lbmFibGVTY3JvbGxFdmVudHNGb3JUeXBlVG9rZW5Bbm5v
dGF0b3IoKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9iYXNpY0Js
b2NrQW5ub3RhdG9yKQorICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3Iu
Y2xlYXIoKTsKKwogICAgICAgICAgICAgLy8gV2UgZGlzYWJsZSB0eXBlIHByb2ZpbGluZyB3aGVu
IGV4aXRpbmcgdGhlIGluc3BlY3Rvciwgc28gbm8gbmVlZCB0byBjYWxsIGl0IGhlcmUuIElmIHdl
IHdlcmUKICAgICAgICAgICAgIC8vIHRvIGNhbGwgaXQgaGVyZSwgd2Ugd291bGQgaGF2ZSBKYXZh
U2NyaXB0Q29yZSBjb21waWxlIG91dCBhbGwgdGhlIG5lY2Vzc2FyeSB0eXBlIHByb2ZpbGluZyBp
bmZvcm1hdGlvbiwKICAgICAgICAgICAgIC8vIHNvIGlmIGEgdXNlciB3ZXJlIHRvIHF1aWNrbHkg
cHJlc3MgdGhlbiB1bnByZXNzIHRoZSBidXR0b24sIHdlIHdvdWxkbid0IGJlIGFibGUgdG8gcmUt
c2hvdyB0eXBlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEV2
ZW50c0ZvclR5cGVUb2tlbkFubm90YXRvcigpOwogICAgICAgICB9CisKICAgICAgICAgV2ViSW5z
cGVjdG9yLnNob3dKYXZhU2NyaXB0VHlwZUluZm9ybWF0aW9uU2V0dGluZy52YWx1ZSA9IGlzQWN0
aXZhdGVkOwogCiAgICAgICAgIHRoaXMuX3VwZGF0ZVRva2VuVHJhY2tpbmdDb250cm9sbGVyU3Rh
dGUoKTsKQEAgLTMwNiw5ICszNTAsMjIgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRp
dG9yLnByb3RvdAogCiAgICAgcHJldHR5UHJpbnQ6IGZ1bmN0aW9uKHByZXR0eSkKICAgICB7Cisg
ICAgICAgIC8vIFRoZSBhbm5vdGF0b3JzIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcHJldHR5IHBy
aW50aW5nIHRha2VzIHBsYWNlIGFuZCByZXN1bWVkIAorICAgICAgICAvLyBhZnRlciBzbyB0aGF0
IHRoZXkgY2xlYXIgdGhlaXIgYW5ub3RhdGlvbnMgaW4gYSBrbm93biBzdGF0ZSBhbmQgaW5zZXJ0
IG5ldyBhbm5vdGF0aW9ucyAKKyAgICAgICAgLy8gaW4gdGhlIG5ldyBzdGF0ZS4KKyAgICAgICAg
dmFyIHNob3VsZFJlc3VtZVR5cGVUb2tlbkFubm90YXRvciA9IHRoaXMuX3R5cGVUb2tlbkFubm90
YXRvciAmJiB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IuaXNBY3RpdmU7CisgICAgICAgIHZhciBz
aG91bGRSZXN1bWVCYXNpY0Jsb2NrQW5ub3RhdG9yID0gdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRv
ciAmJiB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLmlzQWN0aXZlOworICAgICAgICBpZiAoc2hv
dWxkUmVzdW1lVHlwZVRva2VuQW5ub3RhdG9yKQorICAgICAgICAgICAgdGhpcy5fdHlwZVRva2Vu
QW5ub3RhdG9yLmNsZWFyKCk7CisgICAgICAgIGlmIChzaG91bGRSZXN1bWVCYXNpY0Jsb2NrQW5u
b3RhdG9yKQorICAgICAgICAgICAgdGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvci5jbGVhcigpOwor
CiAgICAgICAgIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yLnByb3RvdHlwZS5wcmV0dHlQcmludC5j
YWxsKHRoaXMsIHByZXR0eSk7CiAKLSAgICAgICAgdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5yZXNl
dEFsbElmQWN0aXZlKCk7CisgICAgICAgIGlmIChzaG91bGRSZXN1bWVUeXBlVG9rZW5Bbm5vdGF0
b3IpCisgICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IucmVzZXQoKTsKKyAgICAg
ICAgaWYgKHNob3VsZFJlc3VtZUJhc2ljQmxvY2tBbm5vdGF0b3IpCisgICAgICAgICAgICB0aGlz
Ll9iYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc2V0KCk7CiAgICAgfSwKIAogICAgIC8vIFByaXZhdGUK
QEAgLTQzNyw2ICs0OTQsMTYgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnBy
b3RvdAogICAgICAgICB0aGlzLnN0cmluZyA9IGNvbnRlbnQ7CiAKICAgICAgICAgdGhpcy5fbWFr
ZVR5cGVUb2tlbkFubm90YXRvcigpOworICAgICAgICB0aGlzLl9tYWtlQmFzaWNCbG9ja0Fubm90
YXRvcigpOworCisgICAgICAgIGlmIChXZWJJbnNwZWN0b3Iuc2hvd0phdmFTY3JpcHRUeXBlSW5m
b3JtYXRpb25TZXR0aW5nLnZhbHVlKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fYmFzaWNCbG9j
a0Fubm90YXRvcikKKyAgICAgICAgICAgICAgICB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLnJl
c2V0KCk7CisgICAgICAgICAgICBpZiAodGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yKQorICAgICAg
ICAgICAgICAgIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5yZXNldCgpOworICAgICAgICAgICAg
aWYgKHRoaXMuX3R5cGVUb2tlbkFubm90YXRvciB8fCB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9y
KQorICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tlbkFu
bm90YXRvcigpOworICAgICAgICB9CiAKICAgICAgICAgdGhpcy5fY29udGVudERpZFBvcHVsYXRl
KCk7CiAgICAgfSwKQEAgLTEwNTIsMTQgKzExMTksMjAgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNv
ZGVUZXh0RWRpdG9yLnByb3RvdAogICAgIF9kZWJ1Z2dlckRpZFBhdXNlOiBmdW5jdGlvbihldmVu
dCkKICAgICB7CiAgICAgICAgIHRoaXMuX3VwZGF0ZVRva2VuVHJhY2tpbmdDb250cm9sbGVyU3Rh
dGUoKTsKLSAgICAgICAgdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5yZWZyZXNoQWxsSWZBY3RpdmUo
KTsKKyAgICAgICAgaWYgKHRoaXMuX3R5cGVUb2tlbkFubm90YXRvciAmJiB0aGlzLl90eXBlVG9r
ZW5Bbm5vdGF0b3IuaXNBY3RpdmUpCisgICAgICAgICAgICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0
b3IucmVmcmVzaCgpOworICAgICAgICBpZiAodGhpcy5fYmFzaWNCbG9ja0Fubm90YXRvciAmJiB0
aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLmlzQWN0aXZlKQorICAgICAgICAgICAgdGhpcy5fYmFz
aWNCbG9ja0Fubm90YXRvci5yZWZyZXNoKCk7CiAgICAgfSwKIAogICAgIF9kZWJ1Z2dlckRpZFJl
c3VtZTogZnVuY3Rpb24oZXZlbnQpCiAgICAgewogICAgICAgICB0aGlzLl91cGRhdGVUb2tlblRy
YWNraW5nQ29udHJvbGxlclN0YXRlKCk7CiAgICAgICAgIHRoaXMuX2Rpc21pc3NQb3BvdmVyKCk7
Ci0gICAgICAgIHRoaXMuX2Fubm90YXRvck1hbmFnZXIucmVmcmVzaEFsbElmQWN0aXZlKCk7Cisg
ICAgICAgIGlmICh0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IgJiYgdGhpcy5fdHlwZVRva2VuQW5u
b3RhdG9yLmlzQWN0aXZlKQorICAgICAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yLnJl
ZnJlc2goKTsKKyAgICAgICAgaWYgKHRoaXMuX2Jhc2ljQmxvY2tBbm5vdGF0b3IgJiYgdGhpcy5f
YmFzaWNCbG9ja0Fubm90YXRvci5pc0FjdGl2ZSkKKyAgICAgICAgICAgIHRoaXMuX2Jhc2ljQmxv
Y2tBbm5vdGF0b3IucmVmcmVzaCgpOwogICAgIH0sCiAKICAgICBfc291cmNlQ29kZVNvdXJjZU1h
cEFkZGVkOiBmdW5jdGlvbihldmVudCkKQEAgLTEwNzUsNyArMTE0OCw3IEBAIFdlYkluc3BlY3Rv
ci5Tb3VyY2VDb2RlVGV4dEVkaXRvci5wcm90b3QKICAgICAgICAgdmFyIG1vZGUgPSBXZWJJbnNw
ZWN0b3IuQ29kZU1pcnJvclRva2VuVHJhY2tpbmdDb250cm9sbGVyLk1vZGUuTm9uZTsKICAgICAg
ICAgaWYgKFdlYkluc3BlY3Rvci5kZWJ1Z2dlck1hbmFnZXIucGF1c2VkKQogICAgICAgICAgICAg
bW9kZSA9IFdlYkluc3BlY3Rvci5Db2RlTWlycm9yVG9rZW5UcmFja2luZ0NvbnRyb2xsZXIuTW9k
ZS5KYXZhU2NyaXB0RXhwcmVzc2lvbjsKLSAgICAgICAgZWxzZSBpZiAodGhpcy5fYW5ub3RhdG9y
TWFuYWdlci5pc0Fubm90YXRvckFjdGl2ZShXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0
b3IuVHlwZVRva2VuQW5ub3RhdG9yS2V5KSkKKyAgICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZVRv
a2VuQW5ub3RhdG9yICYmIHRoaXMuX3R5cGVUb2tlbkFubm90YXRvci5pc0FjdGl2ZSkKICAgICAg
ICAgICAgIG1vZGUgPSBXZWJJbnNwZWN0b3IuQ29kZU1pcnJvclRva2VuVHJhY2tpbmdDb250cm9s
bGVyLk1vZGUuSmF2YVNjcmlwdFR5cGVJbmZvcm1hdGlvbjsKICAgICAgICAgZWxzZSBpZiAodGhp
cy5faGFzQ29sb3JNYXJrZXJzKCkpCiAgICAgICAgICAgICBtb2RlID0gV2ViSW5zcGVjdG9yLkNv
ZGVNaXJyb3JUb2tlblRyYWNraW5nQ29udHJvbGxlci5Nb2RlLk1hcmtlZFRva2VuczsKQEAgLTE1
NDksMTMgKzE2MjIsMTkgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3Rv
dAogICAgICAgICBpZiAoIXNjcmlwdCkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICB2
YXIgdHlwZVRva2VuQW5ub3RhdG9yID0gbmV3IFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0
b3IodGhpcywgc2NyaXB0KTsKLSAgICAgICAgdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5hZGRBbm5v
dGF0b3IoV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRv
cktleSwgdHlwZVRva2VuQW5ub3RhdG9yKTsKKyAgICAgICAgdGhpcy5fdHlwZVRva2VuQW5ub3Rh
dG9yID0gbmV3IFdlYkluc3BlY3Rvci5UeXBlVG9rZW5Bbm5vdGF0b3IodGhpcywgc2NyaXB0KTsK
KyAgICB9LAogCi0gICAgICAgIGlmIChXZWJJbnNwZWN0b3Iuc2hvd0phdmFTY3JpcHRUeXBlSW5m
b3JtYXRpb25TZXR0aW5nLnZhbHVlKSB7Ci0gICAgICAgICAgICB0eXBlVG9rZW5Bbm5vdGF0b3Iu
cmVzZXQoKTsKLSAgICAgICAgICAgIHRoaXMuX2VuYWJsZVNjcm9sbEV2ZW50c0ZvclR5cGVUb2tl
bkFubm90YXRvcigpOwotICAgICAgICB9CisgICAgX21ha2VCYXNpY0Jsb2NrQW5ub3RhdG9yOiBm
dW5jdGlvbigpCisgICAgeworICAgICAgICBpZiAoIVJ1bnRpbWVBZ2VudC5nZXRCYXNpY0Jsb2Nr
cykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2YXIgc2NyaXB0ID0gdGhpcy5fZ2V0
QXNzb2NpYXRlZFNjcmlwdCgpOworICAgICAgICBpZiAoIXNjcmlwdCkKKyAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yID0gbmV3IFdlYkluc3Bl
Y3Rvci5CYXNpY0Jsb2NrQW5ub3RhdG9yKHRoaXMsIHNjcmlwdCk7CiAgICAgfSwKIAogICAgIF9l
bmFibGVTY3JvbGxFdmVudHNGb3JUeXBlVG9rZW5Bbm5vdGF0b3I6IGZ1bmN0aW9uKCkKQEAgLTE1
NzYsMjIgKzE2NTUsMjMgQEAgV2ViSW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLnByb3Rv
dAogICAgIF9tYWtlVHlwZVRva2VuU2Nyb2xsRXZlbnRIYW5kbGVyOiBmdW5jdGlvbigpCiAgICAg
ewogICAgICAgICB2YXIgdGltZW91dElkZW50aWZpZXIgPSBudWxsOwotICAgICAgICB2YXIgdHlw
ZVRva2VuQW5ub3RhdG9yID0gdGhpcy5fYW5ub3RhdG9yTWFuYWdlci5nZXRBbm5vdGF0b3IoV2Vi
SW5zcGVjdG9yLlNvdXJjZUNvZGVUZXh0RWRpdG9yLlR5cGVUb2tlbkFubm90YXRvcktleSk7CiAg
ICAgICAgIGZ1bmN0aW9uIHNjcm9sbEhhbmRsZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBp
ZiAodGltZW91dElkZW50aWZpZXIpCiAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVv
dXRJZGVudGlmaWVyKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0eXBlVG9r
ZW5Bbm5vdGF0b3IucGF1c2UoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAg
IGlmICh0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IpCisgICAgICAgICAgICAgICAgICAgIHRoaXMu
X3R5cGVUb2tlbkFubm90YXRvci5wYXVzZSgpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9i
YXNpY0Jsb2NrQW5ub3RhdG9yKQorICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYXNpY0Jsb2Nr
QW5ub3RhdG9yLnBhdXNlKCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRpbWVvdXRJ
ZGVudGlmaWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICB0aW1l
b3V0SWRlbnRpZmllciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdmFyIHR5cGVUb2tlbkFubm90
YXRvciA9IHRoaXMuX2Fubm90YXRvck1hbmFnZXIuZ2V0QW5ub3RhdG9yKFdlYkluc3BlY3Rvci5T
b3VyY2VDb2RlVGV4dEVkaXRvci5UeXBlVG9rZW5Bbm5vdGF0b3JLZXkpOwotICAgICAgICAgICAg
ICAgIC8vIFRoZXJlIGlzIGEgc21hbGwgY2hhbmNlIHRoYXQgd2UgZGlzYWJsZWQgdGhlIHR5cGUg
dG9rZW4gYW5ub3RhdG9yIGFuZCB0aGUgc2Nyb2xsIGhhbmRsZXIgCi0gICAgICAgICAgICAgICAg
Ly8gZHVyaW5nIHRoZSBEdXJhdGlvblRvVXBkYXRlVHlwZVRva2Vuc0FmdGVyU2Nyb2xsaW5nIHRp
bWUgZGVsYXksIHNvIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhpcwotICAgICAgICAgICAgICAgIC8v
IGlzIG5vdCBudWxsLgotICAgICAgICAgICAgICAgIGlmICh0eXBlVG9rZW5Bbm5vdGF0b3IpCi0g
ICAgICAgICAgICAgICAgICAgIHR5cGVUb2tlbkFubm90YXRvci5yZXN1bWUoKTsKKyAgICAgICAg
ICAgICAgICBpZiAodGhpcy5fdHlwZVRva2VuQW5ub3RhdG9yKQorICAgICAgICAgICAgICAgICAg
ICB0aGlzLl90eXBlVG9rZW5Bbm5vdGF0b3IucmVzdW1lKCk7CisgICAgICAgICAgICAgICAgaWYg
KCF0aGlzLl9oYXNGb2N1cyAmJiB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yKQorICAgICAgICAg
ICAgICAgICAgICB0aGlzLl9iYXNpY0Jsb2NrQW5ub3RhdG9yLnJlc3VtZSgpOwogICAgICAgICAg
ICAgfS5iaW5kKHRoaXMpLCBXZWJJbnNwZWN0b3IuU291cmNlQ29kZVRleHRFZGl0b3IuRHVyYXRp
b25Ub1VwZGF0ZVR5cGVUb2tlbnNBZnRlclNjcm9sbGluZyk7CiAgICAgICAgIH0KIApJbmRleDog
U291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVGV4dEVkaXRvci5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9U
ZXh0RWRpdG9yLmpzCShyZXZpc2lvbiAxNzg0OTEpCisrKyBTb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9WaWV3cy9UZXh0RWRpdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC00NSw2
ICs0NSw4IEBAIFdlYkluc3BlY3Rvci5UZXh0RWRpdG9yID0gZnVuY3Rpb24oZWxlbWUKICAgICB0
aGlzLl9jb2RlTWlycm9yLm9uKCJjaGFuZ2UiLCB0aGlzLl9jb250ZW50Q2hhbmdlZC5iaW5kKHRo
aXMpKTsKICAgICB0aGlzLl9jb2RlTWlycm9yLm9uKCJndXR0ZXJDbGljayIsIHRoaXMuX2d1dHRl
ck1vdXNlRG93bi5iaW5kKHRoaXMpKTsKICAgICB0aGlzLl9jb2RlTWlycm9yLm9uKCJndXR0ZXJD
b250ZXh0TWVudSIsIHRoaXMuX2d1dHRlckNvbnRleHRNZW51LmJpbmQodGhpcykpOworICAgIHRo
aXMuX2NvZGVNaXJyb3Iub24oImZvY3VzIiwgdGhpcy5nYWluZWRGb2N1cy5iaW5kKHRoaXMpKTsK
KyAgICB0aGlzLl9jb2RlTWlycm9yLm9uKCJibHVyIiwgdGhpcy5sb3N0Rm9jdXMuYmluZCh0aGlz
KSk7CiAgICAgdGhpcy5fY29kZU1pcnJvci5nZXRTY3JvbGxlckVsZW1lbnQoKS5hZGRFdmVudExp
c3RlbmVyKCJjbGljayIsIHRoaXMuX29wZW5DbGlja2VkTGlua3MuYmluZCh0aGlzKSwgdHJ1ZSk7
CiAKICAgICB0aGlzLl9jb21wbGV0aW9uQ29udHJvbGxlciA9IG5ldyBXZWJJbnNwZWN0b3IuQ29k
ZU1pcnJvckNvbXBsZXRpb25Db250cm9sbGVyKHRoaXMuX2NvZGVNaXJyb3IsIHRoaXMpOwpAQCAt
NDU0LDYgKzQ1NiwxNiBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUgPSB7CiAg
ICAgICAgIHJldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldExpbmUobGluZU51bWJlcik7CiAgICAg
fSwKIAorICAgIGdldFRleHRJblJhbmdlOiBmdW5jdGlvbihzdGFydFBvc2l0aW9uLCBlbmRQb3Np
dGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldFJhbmdlKHN0
YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKKyAgICB9LAorCisgICAgYWRkU3R5bGVUb1RleHRS
YW5nZTogZnVuY3Rpb24oc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIHN0eWxlQ2xhc3NOYW1l
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3IuZ2V0RG9jKCkubWFya1Rl
eHQoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIHtjbGFzc05hbWU6IHN0eWxlQ2xhc3NOYW1l
fSk7CisgICAgfSwKKwogICAgIHJldmVhbFBvc2l0aW9uOiBmdW5jdGlvbihwb3NpdGlvbiwgdGV4
dFJhbmdlVG9TZWxlY3QsIGZvcmNlVW5mb3JtYXR0ZWQsIG5vSGlnaGxpZ2h0KQogICAgIHsKICAg
ICAgICAgY29uc29sZS5hc3NlcnQocG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbiBp
bnN0YW5jZW9mIFdlYkluc3BlY3Rvci5Tb3VyY2VDb2RlUG9zaXRpb24sICJyZXZlYWxQb3NpdGlv
biBjYWxsZWQgd2l0aG91dCBhIFNvdXJjZUNvZGVQb3NpdGlvbiIpOwpAQCAtODE1LDYgKzgyNywx
NiBAQCBXZWJJbnNwZWN0b3IuVGV4dEVkaXRvci5wcm90b3R5cGUgPSB7CiAgICAgICAgIHRoaXMu
X2NvZGVNaXJyb3Iub3BlcmF0aW9uKHByZXR0eVByaW50QW5kVXBkYXRlRWRpdG9yLmJpbmQodGhp
cykpOwogICAgIH0sCiAKKyAgICBnYWluZWRGb2N1czogZnVuY3Rpb24oKQorICAgIHsKKyAgICAg
ICAgLy8gSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICB9LAorCisgICAgbG9zdEZvY3Vz
OiBmdW5jdGlvbigpCisgICAgeworICAgICAgICAvLyBJbXBsZW1lbnRlZCBieSBzdWJjbGFzc2Vz
LgorICAgIH0sCisKICAgICAvLyBQcml2YXRlCiAKICAgICBoYXNFZGl0czogZnVuY3Rpb24oKQo=
</data>
<flag name="review"
          id="269765"
          type_id="1"
          status="+"
          setter="timothy"
    />
          </attachment>
      

    </bug>

</bugzilla>