<?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>132387</bug_id>
          
          <creation_ts>2014-04-30 10:16:45 -0700</creation_ts>
          <short_desc>Web Inspector: clean up and decompose InspectorBackend functionality</short_desc>
          <delta_ts>2014-04-30 13:31:15 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector</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>DoNotImportToRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Brian Burg">burg</reporter>
          <assigned_to name="Brian Burg">burg</assigned_to>
          <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>1005407</commentid>
    <comment_count>0</comment_count>
    <who name="Brian Burg">burg</who>
    <bug_when>2014-04-30 10:16:45 -0700</bug_when>
    <thetext>This code needs to be spruced up. We are using too many indentation levels. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1005445</commentid>
    <comment_count>1</comment_count>
      <attachid>230501</attachid>
    <who name="Brian Burg">burg</who>
    <bug_when>2014-04-30 11:40:43 -0700</bug_when>
    <thetext>Created attachment 230501
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1005482</commentid>
    <comment_count>2</comment_count>
      <attachid>230501</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2014-04-30 12:51:14 -0700</bug_when>
    <thetext>Comment on attachment 230501
the patch

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

Difficult to read the diff with it being scattered red/green. Not much that can be done about that given the diff algorithm. But looks good. r=me

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:40
&gt; +    this._callbackData = {};

I wonder if we should make this a Map instead of an object. Oliver keeps telling me that `delete` makes objects slow. Well, with a Map has built in set/delete methods.

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:41
&gt; +    this._agents = {};

This could probably also be a map.

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:63
&gt; +        agent.addEnum(new InspectorBackend.Enum(enumName, enumValues));

Nit: Seems kind of a waste to construct this object, which just immediately gets garbage collected. Unlike the others, this one doesn&apos;t stay around.

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:122
&gt; +            var callbackData =  {

Style: double space

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:138
&gt; +        --this._pendingResponsesCount;

Nit: console.assert(this._pendingResponsesCount &gt;= 0)

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:164
&gt; +            callbackArguments.unshift(messageObject[&quot;error&quot;] ? messageObject[&quot;error&quot;].message : null);

Instead of this being an unshift after pushing all the result pieces we should make pushing the error / null the first push. In testing that can would speed up this array creation by ~2x.

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:198
&gt; +            console.error(&quot;Protocol Error: Attempted to dispatch an unspecified method &apos;&quot; + qualifiedName + &quot;&apos;&quot;);

Nit: Could include the domain it tried to evalute the method on.

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:233
&gt; +        messageObject[&quot;id&quot;] = this._registerSentCommand(command, callback);

Nit: &quot;_registerSentCommand&quot; seems like the wrong name for this function since it is happening before we are sending. Some alternatives, &quot;this._sequenceCommandForBackend&quot; or &quot;this._willSendMessageToBackend&quot;.

&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:387
&gt;          var instance = this._instance;
&gt; -        return instance._callSignature.any(function(parameter) {
&gt; +        return instance.callSignature.any(function(parameter) {
&gt;              return parameter[&quot;name&quot;] === parameterName

Style: Why the local var instance at all? Also missing a semicolon in the inner statement.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1005487</commentid>
    <comment_count>3</comment_count>
      <attachid>230501</attachid>
    <who name="Brian Burg">burg</who>
    <bug_when>2014-04-30 13:07:57 -0700</bug_when>
    <thetext>Comment on attachment 230501
the patch

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

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:40
&gt;&gt; +    this._callbackData = {};
&gt; 
&gt; I wonder if we should make this a Map instead of an object. Oliver keeps telling me that `delete` makes objects slow. Well, with a Map has built in set/delete methods.

I wasn&apos;t sure which is preferred. For this one, I agree a map will be better, since there&apos;s no &quot;shape&quot; and the code can create sparse arrays if some commands have no callbacks.

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:41
&gt;&gt; +    this._agents = {};
&gt; 
&gt; This could probably also be a map.

OTOH, the list of agents is monotonic and we never delete anything.

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:63
&gt;&gt; +        agent.addEnum(new InspectorBackend.Enum(enumName, enumValues));
&gt; 
&gt; Nit: Seems kind of a waste to construct this object, which just immediately gets garbage collected. Unlike the others, this one doesn&apos;t stay around.

OK, true.

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:138
&gt;&gt; +        --this._pendingResponsesCount;
&gt; 
&gt; Nit: console.assert(this._pendingResponsesCount &gt;= 0)

OK

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:164
&gt;&gt; +            callbackArguments.unshift(messageObject[&quot;error&quot;] ? messageObject[&quot;error&quot;].message : null);
&gt; 
&gt; Instead of this being an unshift after pushing all the result pieces we should make pushing the error / null the first push. In testing that can would speed up this array creation by ~2x.

Oops, didn&apos;t really grasp what it was doing.

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:198
&gt;&gt; +            console.error(&quot;Protocol Error: Attempted to dispatch an unspecified method &apos;&quot; + qualifiedName + &quot;&apos;&quot;);
&gt; 
&gt; Nit: Could include the domain it tried to evalute the method on.

It does: qualifiedName is Domain.EventName.

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:233
&gt;&gt; +        messageObject[&quot;id&quot;] = this._registerSentCommand(command, callback);
&gt; 
&gt; Nit: &quot;_registerSentCommand&quot; seems like the wrong name for this function since it is happening before we are sending. Some alternatives, &quot;this._sequenceCommandForBackend&quot; or &quot;this._willSendMessageToBackend&quot;.

I don&apos;t like it either. That&apos;s the 5th name I tried.

&gt;&gt; Source/WebInspectorUI/UserInterface/Protocol/InspectorBackend.js:387
&gt;&gt;              return parameter[&quot;name&quot;] === parameterName
&gt; 
&gt; Style: Why the local var instance at all? Also missing a semicolon in the inner statement.

So that all methods in BackendCommand are consistently using instance rather than this._instance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1005492</commentid>
    <comment_count>4</comment_count>
    <who name="Brian Burg">burg</who>
    <bug_when>2014-04-30 13:31:15 -0700</bug_when>
    <thetext>Committed r168040: &lt;http://trac.webkit.org/changeset/168040&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>230501</attachid>
            <date>2014-04-30 11:40:43 -0700</date>
            <delta_ts>2014-04-30 13:07:57 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>bug-132387-20140430114020.patch</filename>
            <type>text/plain</type>
            <size>25651</size>
            <attacher name="Brian Burg">burg</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTY4MDI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwppbmRleCA0
M2FjM2FhNzE1OTg5NWI2MmMwMzE2ODU1NDA3MWUwY2YzMzgxYWJhLi45YmI1NjNiYjk0ZjI4MGQ4
OWJkNWIyMmFkM2JjNzhlZTg4NTU4YjgxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw2MSBAQAorMjAxNC0wNC0zMCAgQnJpYW4gSi4gQnVyZyAgPGJ1cmdAY3Mud2FzaGluZ3Rv
bi5lZHU+CisKKyAgICAgICAgV2ViIEluc3BlY3RvcjogY2xlYW4gdXAgYW5kIGRlY29tcG9zZSBJ
bnNwZWN0b3JCYWNrZW5kIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTEzMjM4NworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFzaWRlIGZyb20gcmVuYW1pbmcgdmFyaWFibGVzIGFuZCBv
dGhlciBtaW5vciBjbGVhbnVwLCB0aGlzIHBhdGNoCisgICAgICAgIGNoYW5nZXMgdGhlIGZvbGxv
d2luZzoKKworICAgICAgICBXaGVuIGNhbGxpbmcgYSBjb21tYW5kLCBvbmx5IHN0b3JlIGNhbGxi
YWNrIGRhdGEgd2hlbiBhIGNhbGxiYWNrIGlzIHBhc3NlZC4KKyAgICAgICAgVXNlIGV4cGxpY2l0
IG1vZGVsIG9iamVjdHMgZm9yIHRoZSBhZ2VudCwgZXZlbnQsIGVudW0sIGFuZCBjb21tYW5kcy4K
KyAgICAgICAgU2VwYXJhdGUgdGhlIGFnZW50IG1vZGVscyBmcm9tIGVuY29kaW5nIGFuZCBkZWNv
ZGluZyBvZiBKU09OIG1lc3NhZ2VzLgorCisgICAgICAgICogVXNlckludGVyZmFjZS9Qcm90b2Nv
bC9JbnNwZWN0b3JCYWNrZW5kLmpzOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZENsYXNzKToK
KyAgICAgICAgKEluc3BlY3RvckJhY2tlbmRDbGFzcy5wcm90b3R5cGUucmVnaXN0ZXJDb21tYW5k
KToKKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmRDbGFzcy5wcm90b3R5cGUucmVnaXN0ZXJFbnVt
KToKKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmRDbGFzcy5wcm90b3R5cGUucmVnaXN0ZXJFdmVu
dCk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kQ2xhc3MucHJvdG90eXBlLnJlZ2lzdGVyRG9t
YWluRGlzcGF0Y2hlcik6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kQ2xhc3MucHJvdG90eXBl
LmRpc3BhdGNoKToKKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmRDbGFzcy5wcm90b3R5cGUucnVu
QWZ0ZXJQZW5kaW5nRGlzcGF0Y2hlcyk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kQ2xhc3Mu
cHJvdG90eXBlLl9hZ2VudEZvckRvbWFpbik6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kQ2xh
c3MucHJvdG90eXBlLl9yZWdpc3RlclNlbnRDb21tYW5kKToKKyAgICAgICAgKEluc3BlY3RvckJh
Y2tlbmRDbGFzcy5wcm90b3R5cGUuX2Rpc3BhdGNoQ2FsbGJhY2spOgorICAgICAgICAoSW5zcGVj
dG9yQmFja2VuZENsYXNzLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudCk6CisgICAgICAgIChJbnNw
ZWN0b3JCYWNrZW5kQ2xhc3MucHJvdG90eXBlLl9pbnZva2VDb21tYW5kKToKKyAgICAgICAgKElu
c3BlY3RvckJhY2tlbmRDbGFzcy5wcm90b3R5cGUuX3JlcG9ydFByb3RvY29sRXJyb3IpOgorICAg
ICAgICAoSW5zcGVjdG9yQmFja2VuZC5BZ2VudCk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5k
LkFnZW50LnByb3RvdHlwZS5nZXQgZG9tYWluTmFtZSk6CisgICAgICAgIChJbnNwZWN0b3JCYWNr
ZW5kLkFnZW50LnByb3RvdHlwZS5zZXQgZGlzcGF0Y2hlcik6CisgICAgICAgIChJbnNwZWN0b3JC
YWNrZW5kLkFnZW50LnByb3RvdHlwZS5hZGRFbnVtKToKKyAgICAgICAgKEluc3BlY3RvckJhY2tl
bmQuQWdlbnQucHJvdG90eXBlLmFkZENvbW1hbmQpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2Vu
ZC5BZ2VudC5wcm90b3R5cGUuYWRkRXZlbnQpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZC5B
Z2VudC5wcm90b3R5cGUuZ2V0RXZlbnQpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZC5BZ2Vu
dC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kLkNv
bW1hbmQpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZC5Db21tYW5kLmNyZWF0ZSk6CisgICAg
ICAgIChJbnNwZWN0b3JCYWNrZW5kLkNvbW1hbmQucHJvdG90eXBlLmdldCBxdWFsaWZpZWROYW1l
KToKKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmQuQ29tbWFuZC5wcm90b3R5cGUuZ2V0IGNvbW1h
bmROYW1lKToKKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmQuQ29tbWFuZC5wcm90b3R5cGUuZ2V0
IGNhbGxTaWduYXR1cmUpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZC5Db21tYW5kLnByb3Rv
dHlwZS5nZXQgcmVwbHlTaWduYXR1cmUpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZC5Db21t
YW5kLnByb3RvdHlwZS5pbnZva2UpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZC5Db21tYW5k
LnByb3RvdHlwZS5zdXBwb3J0cyk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kLkNvbW1hbmQu
cHJvdG90eXBlLl9pbnZva2VXaXRoQXJndW1lbnRzKToKKyAgICAgICAgKEluc3BlY3RvckJhY2tl
bmQuRXZlbnQpOgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZC5FbnVtKToKKyAgICAgICAgKElu
c3BlY3RvckJhY2tlbmRDbGFzcy5wcm90b3R5cGUuY2FsbGJhY2spOiBEZWxldGVkLgorICAgICAg
ICAoSW5zcGVjdG9yQmFja2VuZENsYXNzLnByb3RvdHlwZS5fcmVnaXN0ZXJQZW5kaW5nUmVzcG9u
c2UpOiBEZWxldGVkLgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZENsYXNzLnByb3RvdHlwZS5f
aW52b2tlTWV0aG9kKTogRGVsZXRlZC4KKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmRDbGFzcy5w
cm90b3R5cGUuX2dldEFnZW50KTogRGVsZXRlZC4KKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmRD
bGFzcy5wcm90b3R5cGUucmVwb3J0UHJvdG9jb2xFcnJvcik6IERlbGV0ZWQuCisgICAgICAgIChJ
bnNwZWN0b3JCYWNrZW5kQ29tbWFuZCk6IERlbGV0ZWQuCisgICAgICAgIChJbnNwZWN0b3JCYWNr
ZW5kQ29tbWFuZC5jcmVhdGUpOiBEZWxldGVkLgorICAgICAgICAoSW5zcGVjdG9yQmFja2VuZENv
bW1hbmQucHJvdG90eXBlLmludm9rZSk6IERlbGV0ZWQuCisgICAgICAgIChJbnNwZWN0b3JCYWNr
ZW5kQ29tbWFuZC5wcm90b3R5cGUuc3VwcG9ydHMpOiBEZWxldGVkLgorICAgICAgICAoSW5zcGVj
dG9yQmFja2VuZENvbW1hbmQucHJvdG90eXBlLl9pbnZva2VXaXRoQXJndW1lbnRzKTogRGVsZXRl
ZC4KKwogMjAxNC0wNC0yOSAgQnJpYW4gSi4gQnVyZyAgPGJ1cmdAY3Mud2FzaGluZ3Rvbi5lZHU+
CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogcmVkdWNlIHBlci1wcm90b2NvbCBtZXRob2QgZnVu
Y3Rpb24gY3JlYXRpb24gaW4gSW5zcGVjdG9yQmFja2VuZApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
Ykluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvUHJvdG9jb2wvSW5zcGVjdG9yQmFja2VuZC5qcyBi
L1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1Byb3RvY29sL0luc3BlY3RvckJh
Y2tlbmQuanMKaW5kZXggYzY1MGIxOTNjYzUxZTEzMjg3N2JmNmE2YWJkZWM2ZDhhNzNjNWE2OC4u
MmEwNmNiNjAyNDJiZTRmMDI3YWRiZWJjMjZjZjRiOGQ0NjQ4YTQwZSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvUHJvdG9jb2wvSW5zcGVjdG9yQmFja2Vu
ZC5qcworKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Qcm90b2NvbC9J
bnNwZWN0b3JCYWNrZW5kLmpzCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykg
MjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAy
MDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
NCBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24uCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCkBAIC0zNCwxMiArMzUsMTAgQEAKICAqLwogZnVuY3Rpb24gSW5zcGVjdG9yQmFja2Vu
ZENsYXNzKCkKIHsKLSAgICB0aGlzLl9sYXN0Q2FsbGJhY2tJZCA9IDE7CisgICAgdGhpcy5fbGFz
dFNlcXVlbmNlSWQgPSAxOwogICAgIHRoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3VudCA9IDA7Ci0g
ICAgdGhpcy5fY2FsbGJhY2tzID0ge307Ci0gICAgdGhpcy5fZG9tYWluRGlzcGF0Y2hlcnMgPSB7
fTsKLSAgICB0aGlzLl9ldmVudEFyZ3MgPSB7fTsKLSAgICB0aGlzLl9yZXBseUFyZ3MgPSB7fTsK
KyAgICB0aGlzLl9jYWxsYmFja0RhdGEgPSB7fTsKKyAgICB0aGlzLl9hZ2VudHMgPSB7fTsKICAg
ICB0aGlzLl9kZWZlcnJlZFNjcmlwdHMgPSBbXTsKIAogICAgIHRoaXMuZHVtcEluc3BlY3RvclRp
bWVTdGF0cyA9IGZhbHNlOwpAQCAtNDcsMTc3ICs0NiwyMDMgQEAgZnVuY3Rpb24gSW5zcGVjdG9y
QmFja2VuZENsYXNzKCkKIH0KIAogSW5zcGVjdG9yQmFja2VuZENsYXNzLnByb3RvdHlwZSA9IHsK
LSAgICBfcmVnaXN0ZXJQZW5kaW5nUmVzcG9uc2U6IGZ1bmN0aW9uKGNhbGxiYWNrLCBtZXRob2RO
YW1lKQotICAgIHsKLSAgICAgICAgdmFyIGNhbGxiYWNrSWQgPSB0aGlzLl9sYXN0Q2FsbGJhY2tJ
ZCsrOwotICAgICAgICBpZiAoIWNhbGxiYWNrKQotICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5j
dGlvbigpIHt9OwogCi0gICAgICAgIHRoaXMuX2NhbGxiYWNrc1tjYWxsYmFja0lkXSA9IGNhbGxi
YWNrOwotICAgICAgICBjYWxsYmFjay5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLSAgICAgICAg
aWYgKHRoaXMuZHVtcEluc3BlY3RvclRpbWVTdGF0cykKLSAgICAgICAgICAgIGNhbGxiYWNrLnNl
bmRSZXF1ZXN0VGltZSA9IERhdGUubm93KCk7CisgICAgLy8gUHVibGljCiAKLSAgICAgICAgKyt0
aGlzLl9wZW5kaW5nUmVzcG9uc2VzQ291bnQ7Ci0KLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrSWQ7
CisgICAgcmVnaXN0ZXJDb21tYW5kOiBmdW5jdGlvbihxdWFsaWZpZWROYW1lLCBjYWxsU2lnbmF0
dXJlLCByZXBseVNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIHZhciBbZG9tYWluTmFtZSwgY29t
bWFuZE5hbWVdID0gcXVhbGlmaWVkTmFtZS5zcGxpdCgiLiIpOworICAgICAgICB2YXIgYWdlbnQg
PSB0aGlzLl9hZ2VudEZvckRvbWFpbihkb21haW5OYW1lKTsKKyAgICAgICAgYWdlbnQuYWRkQ29t
bWFuZChJbnNwZWN0b3JCYWNrZW5kLkNvbW1hbmQuY3JlYXRlKHRoaXMsIHF1YWxpZmllZE5hbWUs
IGNhbGxTaWduYXR1cmUsIHJlcGx5U2lnbmF0dXJlKSk7CiAgICAgfSwKIAotICAgIF9pbnZva2VN
ZXRob2Q6IGZ1bmN0aW9uKGNvbW1hbmQsIHBhcmFtZXRlcnMsIGNhbGxiYWNrKQorICAgIHJlZ2lz
dGVyRW51bTogZnVuY3Rpb24ocXVhbGlmaWVkTmFtZSwgZW51bVZhbHVlcykKICAgICB7Ci0gICAg
ICAgIHZhciBtZXNzYWdlT2JqZWN0ID0ge307Ci0gICAgICAgIG1lc3NhZ2VPYmplY3RbIm1ldGhv
ZCJdID0gY29tbWFuZC5tZXRob2ROYW1lOwotICAgICAgICBpZiAocGFyYW1ldGVycykKLSAgICAg
ICAgICAgIG1lc3NhZ2VPYmplY3RbInBhcmFtcyJdID0gcGFyYW1ldGVyczsKLSAgICAgICAgbWVz
c2FnZU9iamVjdFsiaWQiXSA9IHRoaXMuX3JlZ2lzdGVyUGVuZGluZ1Jlc3BvbnNlKGNhbGxiYWNr
LCBjb21tYW5kLm1ldGhvZE5hbWUpOwotCi0gICAgICAgIHZhciBzdHJpbmdpZmllZE1lc3NhZ2Ug
PSBKU09OLnN0cmluZ2lmeShtZXNzYWdlT2JqZWN0KTsKLSAgICAgICAgaWYgKHRoaXMuZHVtcElu
c3BlY3RvclByb3RvY29sTWVzc2FnZXMpCi0gICAgICAgICAgICBjb25zb2xlLmxvZygiZnJvbnRl
bmQ6ICIgKyBzdHJpbmdpZmllZE1lc3NhZ2UpOwotCi0gICAgICAgIEluc3BlY3RvckZyb250ZW5k
SG9zdC5zZW5kTWVzc2FnZVRvQmFja2VuZChzdHJpbmdpZmllZE1lc3NhZ2UpOworICAgICAgICB2
YXIgW2RvbWFpbk5hbWUsIGVudW1OYW1lXSA9IHF1YWxpZmllZE5hbWUuc3BsaXQoIi4iKTsKKyAg
ICAgICAgdmFyIGFnZW50ID0gdGhpcy5fYWdlbnRGb3JEb21haW4oZG9tYWluTmFtZSk7CisgICAg
ICAgIGFnZW50LmFkZEVudW0obmV3IEluc3BlY3RvckJhY2tlbmQuRW51bShlbnVtTmFtZSwgZW51
bVZhbHVlcykpOwogICAgIH0sCiAKLSAgICBfZ2V0QWdlbnQ6IGZ1bmN0aW9uKGRvbWFpbikKKyAg
ICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbihxdWFsaWZpZWROYW1lLCBzaWduYXR1cmUpCiAgICAg
ewotICAgICAgICB2YXIgYWdlbnROYW1lID0gZG9tYWluICsgIkFnZW50IjsKLSAgICAgICAgaWYg
KCF3aW5kb3dbYWdlbnROYW1lXSkKLSAgICAgICAgICAgIHdpbmRvd1thZ2VudE5hbWVdID0ge307
Ci0gICAgICAgIHJldHVybiB3aW5kb3dbYWdlbnROYW1lXTsKKyAgICAgICAgdmFyIFtkb21haW5O
YW1lLCBldmVudE5hbWVdID0gcXVhbGlmaWVkTmFtZS5zcGxpdCgiLiIpOworICAgICAgICB2YXIg
YWdlbnQgPSB0aGlzLl9hZ2VudEZvckRvbWFpbihkb21haW5OYW1lKTsKKyAgICAgICAgYWdlbnQu
YWRkRXZlbnQobmV3IEluc3BlY3RvckJhY2tlbmQuRXZlbnQoZXZlbnROYW1lLCBzaWduYXR1cmUp
KTsKICAgICB9LAogCi0gICAgcmVnaXN0ZXJDb21tYW5kOiBmdW5jdGlvbihtZXRob2QsIHNpZ25h
dHVyZSwgcmVwbHlBcmdzKQorICAgIHJlZ2lzdGVyRG9tYWluRGlzcGF0Y2hlcjogZnVuY3Rpb24o
ZG9tYWluTmFtZSwgZGlzcGF0Y2hlcikKICAgICB7Ci0gICAgICAgIHZhciBkb21haW5BbmRNZXRo
b2QgPSBtZXRob2Quc3BsaXQoIi4iKTsKLSAgICAgICAgdmFyIGFnZW50ID0gdGhpcy5fZ2V0QWdl
bnQoZG9tYWluQW5kTWV0aG9kWzBdKTsKLSAgICAgICAgYWdlbnRbZG9tYWluQW5kTWV0aG9kWzFd
XSA9IEluc3BlY3RvckJhY2tlbmRDb21tYW5kLmNyZWF0ZSh0aGlzLCBtZXRob2QsIHNpZ25hdHVy
ZSk7Ci0KLSAgICAgICAgdGhpcy5fcmVwbHlBcmdzW21ldGhvZF0gPSByZXBseUFyZ3M7CisgICAg
ICAgIHZhciBhZ2VudCA9IHRoaXMuX2FnZW50Rm9yRG9tYWluKGRvbWFpbk5hbWUpOworICAgICAg
ICBhZ2VudC5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsKICAgICB9LAogCi0gICAgcmVnaXN0ZXJF
bnVtOiBmdW5jdGlvbih0eXBlLCB2YWx1ZXMpCisgICAgZGlzcGF0Y2g6IGZ1bmN0aW9uKG1lc3Nh
Z2UpCiAgICAgewotICAgICAgICB2YXIgZG9tYWluQW5kTWV0aG9kID0gdHlwZS5zcGxpdCgiLiIp
OwotICAgICAgICB2YXIgYWdlbnQgPSB0aGlzLl9nZXRBZ2VudChkb21haW5BbmRNZXRob2RbMF0p
OworICAgICAgICBpZiAodGhpcy5kdW1wSW5zcGVjdG9yUHJvdG9jb2xNZXNzYWdlcykKKyAgICAg
ICAgICAgIGNvbnNvbGUubG9nKCJiYWNrZW5kOiAiICsgKCh0eXBlb2YgbWVzc2FnZSA9PT0gInN0
cmluZyIpID8gbWVzc2FnZSA6IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKSk7CiAKLSAgICAgICAg
YWdlbnRbZG9tYWluQW5kTWV0aG9kWzFdXSA9IHZhbHVlczsKLSAgICB9LAorICAgICAgICB2YXIg
bWVzc2FnZU9iamVjdCA9ICh0eXBlb2YgbWVzc2FnZSA9PT0gInN0cmluZyIpID8gSlNPTi5wYXJz
ZShtZXNzYWdlKSA6IG1lc3NhZ2U7CiAKLSAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbihldmVu
dE5hbWUsIHBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICB0aGlzLl9ldmVudEFyZ3NbZXZlbnRO
YW1lXSA9IHBhcmFtZXRlcnM7CisgICAgICAgIGlmICgiaWQiIGluIG1lc3NhZ2VPYmplY3QpCisg
ICAgICAgICAgICB0aGlzLl9kaXNwYXRjaENhbGxiYWNrKG1lc3NhZ2VPYmplY3QpOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KG1lc3NhZ2VPYmplY3QpOwog
ICAgIH0sCiAKLSAgICByZWdpc3RlckRvbWFpbkRpc3BhdGNoZXI6IGZ1bmN0aW9uKGRvbWFpbiwg
ZGlzcGF0Y2hlcikKKyAgICBydW5BZnRlclBlbmRpbmdEaXNwYXRjaGVzOiBmdW5jdGlvbihzY3Jp
cHQpCiAgICAgewotICAgICAgICB0aGlzLl9kb21haW5EaXNwYXRjaGVyc1tkb21haW5dID0gZGlz
cGF0Y2hlcjsKKyAgICAgICAgY29uc29sZS5hc3NlcnQoc2NyaXB0KTsKKyAgICAgICAgY29uc29s
ZS5hc3NlcnQodHlwZW9mIHNjcmlwdCA9PT0gImZ1bmN0aW9uIik7CisKKyAgICAgICAgaWYgKCF0
aGlzLl9wZW5kaW5nUmVzcG9uc2VzQ291bnQpCisgICAgICAgICAgICBzY3JpcHQuY2FsbCh0aGlz
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWRTY3JpcHRzLnB1c2go
c2NyaXB0KTsKICAgICB9LAogCi0gICAgZGlzcGF0Y2g6IGZ1bmN0aW9uKG1lc3NhZ2UpCisgICAg
Ly8gUHJpdmF0ZQorCisgICAgX2FnZW50Rm9yRG9tYWluOiBmdW5jdGlvbihkb21haW5OYW1lKQog
ICAgIHsKLSAgICAgICAgaWYgKHRoaXMuZHVtcEluc3BlY3RvclByb3RvY29sTWVzc2FnZXMpCi0g
ICAgICAgICAgICBjb25zb2xlLmxvZygiYmFja2VuZDogIiArICgodHlwZW9mIG1lc3NhZ2UgPT09
ICJzdHJpbmciKSA/IG1lc3NhZ2UgOiBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSkpOworICAgICAg
ICBpZiAodGhpcy5fYWdlbnRzW2RvbWFpbk5hbWVdKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMu
X2FnZW50c1tkb21haW5OYW1lXTsKIAotICAgICAgICB2YXIgbWVzc2FnZU9iamVjdCA9ICh0eXBl
b2YgbWVzc2FnZSA9PT0gInN0cmluZyIpID8gSlNPTi5wYXJzZShtZXNzYWdlKSA6IG1lc3NhZ2U7
CisgICAgICAgIHZhciBhZ2VudCA9IG5ldyBJbnNwZWN0b3JCYWNrZW5kLkFnZW50KGRvbWFpbk5h
bWUpOworICAgICAgICB0aGlzLl9hZ2VudHNbZG9tYWluTmFtZV0gPSBhZ2VudDsKKyAgICAgICAg
d2luZG93W2RvbWFpbk5hbWUgKyAiQWdlbnQiXSA9IGFnZW50OworICAgICAgICByZXR1cm4gYWdl
bnQ7CisgICAgfSwKIAotICAgICAgICBpZiAoImlkIiBpbiBtZXNzYWdlT2JqZWN0KSB7IC8vIGp1
c3QgYSByZXNwb25zZSBmb3Igc29tZSByZXF1ZXN0Ci0gICAgICAgICAgICBpZiAobWVzc2FnZU9i
amVjdC5lcnJvcikgewotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlT2JqZWN0LmVycm9yLmNv
ZGUgIT09IC0zMjAwMCkKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRQcm90b2NvbEVy
cm9yKG1lc3NhZ2VPYmplY3QpOwotICAgICAgICAgICAgfQorICAgIF9yZWdpc3RlclNlbnRDb21t
YW5kOiBmdW5jdGlvbihjb21tYW5kLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgICsrdGhpcy5f
cGVuZGluZ1Jlc3BvbnNlc0NvdW50OworICAgICAgICB2YXIgc2VxdWVuY2VJZCA9IHRoaXMuX2xh
c3RTZXF1ZW5jZUlkKys7CiAKLSAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IHRoaXMuX2NhbGxi
YWNrc1ttZXNzYWdlT2JqZWN0LmlkXTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewotICAg
ICAgICAgICAgICAgIHZhciBhcmd1bWVudHNBcnJheSA9IFtdOwotICAgICAgICAgICAgICAgIGlm
IChtZXNzYWdlT2JqZWN0LnJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJh
Y2suZXhwZWN0c1Jlc3VsdE9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhl
IGNhbGxiYWNrIGV4cGVjdHMgcmVzdWx0cyBhcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzLCB0
aGlzIGlzIHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJhY2t3YXJkcyBj
b21wYXRpYmlsaXR5IHdpdGggcmVuYW1lZCBvciBkaWZmZXJlbnQgcGFyYW1ldGVycy4KLSAgICAg
ICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c0FycmF5LnB1c2gobWVzc2FnZU9iamVjdC5yZXN1
bHQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAg
ICAgdmFyIHBhcmFtTmFtZXMgPSB0aGlzLl9yZXBseUFyZ3NbY2FsbGJhY2subWV0aG9kTmFtZV07
Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lcykgewotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7ICsr
aSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzQXJyYXkucHVzaCht
ZXNzYWdlT2JqZWN0LnJlc3VsdFtwYXJhbU5hbWVzW2ldXSk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAg
IGlmIChjYWxsYmFjayAmJiB0eXBlb2YgY2FsbGJhY2sgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAg
ICAgICAgIHZhciBjYWxsYmFja0RhdGEgPSAgeworICAgICAgICAgICAgICAgICJjYWxsYmFjayI6
IGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICJjb21tYW5kIjogY29tbWFuZCwKKyAgICAgICAg
ICAgIH07CiAKLSAgICAgICAgICAgICAgICB2YXIgcHJvY2Vzc2luZ1N0YXJ0VGltZTsKLSAgICAg
ICAgICAgICAgICBpZiAodGhpcy5kdW1wSW5zcGVjdG9yVGltZVN0YXRzICYmIGNhbGxiYWNrLm1l
dGhvZE5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdTdGFydFRpbWUgPSBEYXRl
Lm5vdygpOworICAgICAgICAgICAgaWYgKHRoaXMuZHVtcEluc3BlY3RvclRpbWVTdGF0cykKKyAg
ICAgICAgICAgICAgICBjYWxsYmFja0RhdGEuc2VuZFJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTsK
IAotICAgICAgICAgICAgICAgIGFyZ3VtZW50c0FycmF5LnVuc2hpZnQobWVzc2FnZU9iamVjdC5l
cnJvciA/IG1lc3NhZ2VPYmplY3QuZXJyb3IubWVzc2FnZSA6IG51bGwpOwotICAgICAgICAgICAg
ICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50c0FycmF5KTsKLSAgICAgICAgICAgICAg
ICAtLXRoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3VudDsKLSAgICAgICAgICAgICAgICBkZWxldGUg
dGhpcy5fY2FsbGJhY2tzW21lc3NhZ2VPYmplY3QuaWRdOworICAgICAgICAgICAgdGhpcy5fY2Fs
bGJhY2tEYXRhW3NlcXVlbmNlSWRdID0gY2FsbGJhY2tEYXRhOworICAgICAgICB9CiAKLSAgICAg
ICAgICAgICAgICBpZiAodGhpcy5kdW1wSW5zcGVjdG9yVGltZVN0YXRzICYmIGNhbGxiYWNrLm1l
dGhvZE5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ0aW1lLXN0YXRzOiAi
ICsgY2FsbGJhY2subWV0aG9kTmFtZSArICIgPSAiICsgKHByb2Nlc3NpbmdTdGFydFRpbWUgLSBj
YWxsYmFjay5zZW5kUmVxdWVzdFRpbWUpICsgIiArICIgKyAoRGF0ZS5ub3coKSAtIHByb2Nlc3Np
bmdTdGFydFRpbWUpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcXVlbmNlSWQ7
CisgICAgfSwKIAotICAgICAgICAgICAgaWYgKHRoaXMuX2RlZmVycmVkU2NyaXB0cy5sZW5ndGgg
JiYgIXRoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3VudCkKLSAgICAgICAgICAgICAgICB0aGlzLl9m
bHVzaFBlbmRpbmdTY3JpcHRzKCk7CisgICAgX2Rpc3BhdGNoQ2FsbGJhY2s6IGZ1bmN0aW9uKG1l
c3NhZ2VPYmplY3QpCisgICAgeworICAgICAgICAtLXRoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3Vu
dDsKIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
dmFyIG1ldGhvZCA9IG1lc3NhZ2VPYmplY3QubWV0aG9kLnNwbGl0KCIuIik7Ci0gICAgICAgICAg
ICB2YXIgZG9tYWluTmFtZSA9IG1ldGhvZFswXTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbk5h
bWUgPSBtZXRob2RbMV07Ci0gICAgICAgICAgICBpZiAoIShkb21haW5OYW1lIGluIHRoaXMuX2Rv
bWFpbkRpc3BhdGNoZXJzKSkgewotICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlByb3Rv
Y29sIEVycm9yOiBBdHRlbXB0ZWQgdG8gZGlzcGF0Y2ggbWV0aG9kICciICsgZnVuY3Rpb25OYW1l
ICsgIicgZm9yIG5vbi1leGlzdGluZyBkb21haW4gJyIgKyBkb21haW5OYW1lICsgIiciKTsKLSAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgZGlz
cGF0Y2hlciA9IHRoaXMuX2RvbWFpbkRpc3BhdGNoZXJzW2RvbWFpbk5hbWVdOwotICAgICAgICAg
ICAgaWYgKCEoZnVuY3Rpb25OYW1lIGluIGRpc3BhdGNoZXIpKSB7Ci0gICAgICAgICAgICAgICAg
Y29uc29sZS5lcnJvcigiUHJvdG9jb2wgRXJyb3I6IEF0dGVtcHRlZCB0byBkaXNwYXRjaCBhbiB1
bmltcGxlbWVudGVkIG1ldGhvZCAnIiArIG1lc3NhZ2VPYmplY3QubWV0aG9kICsgIiciKTsKLSAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtZXNzYWdl
T2JqZWN0WyJlcnJvciJdKSB7CisgICAgICAgICAgICBpZiAobWVzc2FnZU9iamVjdFsiZXJyb3Ii
XS5jb2RlICE9PSAtMzIwMDApCisgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0UHJvdG9jb2xF
cnJvcihtZXNzYWdlT2JqZWN0KTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIXRoaXMu
X2V2ZW50QXJnc1ttZXNzYWdlT2JqZWN0Lm1ldGhvZF0pIHsKLSAgICAgICAgICAgICAgICBjb25z
b2xlLmVycm9yKCJQcm90b2NvbCBFcnJvcjogQXR0ZW1wdGVkIHRvIGRpc3BhdGNoIGFuIHVuc3Bl
Y2lmaWVkIG1ldGhvZCAnIiArIG1lc3NhZ2VPYmplY3QubWV0aG9kICsgIiciKTsKLSAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIHZhciBjYWxsYmFja0RhdGEgPSB0aGlzLl9jYWxsYmFj
a0RhdGFbbWVzc2FnZU9iamVjdFsiaWQiXV07CisgICAgICAgIGlmIChjYWxsYmFja0RhdGEgJiYg
dHlwZW9mIGNhbGxiYWNrRGF0YS5jYWxsYmFjayA9PT0gImZ1bmN0aW9uIikgeworICAgICAgICAg
ICAgdmFyIGNvbW1hbmQgPSBjYWxsYmFja0RhdGEuY29tbWFuZDsKKyAgICAgICAgICAgIHZhciBj
YWxsYmFjayA9IGNhbGxiYWNrRGF0YS5jYWxsYmFjazsKKyAgICAgICAgICAgIHZhciBjYWxsYmFj
a0FyZ3VtZW50cyA9IFtdOworCisgICAgICAgICAgICBpZiAobWVzc2FnZU9iamVjdFsicmVzdWx0
Il0pIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgaW5kaWNhdGVk
IGJ5IGludm9raW5nIHRoZSBjb21tYW5kIGRpZmZlcmVudGx5LCByYXRoZXIKKyAgICAgICAgICAg
ICAgICAvLyB0aGFuIGJ5IHNldHRpbmcgYSBtYWdpY2FsIHByb3BlcnR5IG9uIHRoZSBjYWxsYmFj
ay4gPHdlYmtpdC5vcmcvYi8xMzIzODY+CisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmV4
cGVjdHNSZXN1bHRPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNr
IGV4cGVjdHMgcmVzdWx0cyBhcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzLCB0aGlzIGlzIHVz
ZWZ1bAorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkg
d2l0aCByZW5hbWVkIG9yIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAg
ICBjYWxsYmFja0FyZ3VtZW50cy5wdXNoKG1lc3NhZ2VPYmplY3RbInJlc3VsdCJdKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwYXJhbWV0
ZXJOYW1lIG9mIGNvbW1hbmQucmVwbHlTaWduYXR1cmUpCisgICAgICAgICAgICAgICAgICAgICAg
ICBjYWxsYmFja0FyZ3VtZW50cy5wdXNoKG1lc3NhZ2VPYmplY3RbInJlc3VsdCJdW3BhcmFtZXRl
ck5hbWVdKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAg
IHZhciBwYXJhbXMgPSBbXTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlT2JqZWN0LnBhcmFtcykg
ewotICAgICAgICAgICAgICAgIHZhciBwYXJhbU5hbWVzID0gdGhpcy5fZXZlbnRBcmdzW21lc3Nh
Z2VPYmplY3QubWV0aG9kXTsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBh
cmFtTmFtZXMubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKG1l
c3NhZ2VPYmplY3QucGFyYW1zW3BhcmFtTmFtZXNbaV1dKTsKLSAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNhbGxiYWNrQXJndW1lbnRzLnVuc2hpZnQobWVzc2FnZU9iamVjdFsiZXJyb3IiXSA/
IG1lc3NhZ2VPYmplY3RbImVycm9yIl0ubWVzc2FnZSA6IG51bGwpOwogCiAgICAgICAgICAgICB2
YXIgcHJvY2Vzc2luZ1N0YXJ0VGltZTsKICAgICAgICAgICAgIGlmICh0aGlzLmR1bXBJbnNwZWN0
b3JUaW1lU3RhdHMpCiAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1N0YXJ0VGltZSA9IERhdGUu
bm93KCk7CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hlcltm
dW5jdGlvbk5hbWVdLmFwcGx5KGRpc3BhdGNoZXIsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAg
Y2FsbGJhY2suYXBwbHkobnVsbCwgY2FsbGJhY2tBcmd1bWVudHMpOwogICAgICAgICAgICAgfSBj
YXRjaCAoZSkgewotICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlVuY2F1Z2h0IGV4Y2Vw
dGlvbiBpbiBpbnNwZWN0b3IgcGFnZTogIiwgZSk7CisgICAgICAgICAgICAgICAgY29uc29sZS5l
cnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uIGluIGluc3BlY3RvciBwYWdlIHdoaWxlIGRpc3BhdGNo
aW5nIGNhbGxiYWNrIGZvciBjb21tYW5kICIgKyBjb21tYW5kLnF1YWxpZmllZE5hbWUgKyAiOiAi
LCBlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHRoaXMuZHVtcEluc3BlY3Rv
clRpbWVTdGF0cykKLSAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygidGltZS1zdGF0czogIiAr
IG1lc3NhZ2VPYmplY3QubWV0aG9kICsgIiA9ICIgKyAoRGF0ZS5ub3coKSAtIHByb2Nlc3NpbmdT
dGFydFRpbWUpKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygidGltZS1zdGF0czogIiAr
IGNvbW1hbmQucXVhbGlmaWVkTmFtZSArICIgPSAiICsgKHByb2Nlc3NpbmdTdGFydFRpbWUgLSBj
YWxsYmFja0RhdGEuc2VuZFJlcXVlc3RUaW1lKSArICIgKyAiICsgKERhdGUubm93KCkgLSBwcm9j
ZXNzaW5nU3RhcnRUaW1lKSk7CisKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja0Rh
dGFbbWVzc2FnZU9iamVjdFsiaWQiXV07CiAgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5f
ZGVmZXJyZWRTY3JpcHRzLmxlbmd0aCAmJiAhdGhpcy5fcGVuZGluZ1Jlc3BvbnNlc0NvdW50KQor
ICAgICAgICAgICAgdGhpcy5fZmx1c2hQZW5kaW5nU2NyaXB0cygpOwogICAgIH0sCiAKLSAgICBy
ZXBvcnRQcm90b2NvbEVycm9yOiBmdW5jdGlvbihtZXNzYWdlT2JqZWN0KQorICAgIF9kaXNwYXRj
aEV2ZW50OiBmdW5jdGlvbihtZXNzYWdlT2JqZWN0KQogICAgIHsKLSAgICAgICAgY29uc29sZS5l
cnJvcigiUmVxdWVzdCB3aXRoIGlkID0gIiArIG1lc3NhZ2VPYmplY3QuaWQgKyAiIGZhaWxlZC4g
IiArIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VPYmplY3QuZXJyb3IpKTsKKyAgICAgICAgdmFyIHF1
YWxpZmllZE5hbWUgPSBtZXNzYWdlT2JqZWN0WyJtZXRob2QiXTsKKyAgICAgICAgdmFyIFtkb21h
aW5OYW1lLCBldmVudE5hbWVdID0gcXVhbGlmaWVkTmFtZS5zcGxpdCgiLiIpOworICAgICAgICBp
ZiAoIShkb21haW5OYW1lIGluIHRoaXMuX2FnZW50cykpIHsKKyAgICAgICAgICAgIGNvbnNvbGUu
ZXJyb3IoIlByb3RvY29sIEVycm9yOiBBdHRlbXB0ZWQgdG8gZGlzcGF0Y2ggbWV0aG9kICciICsg
ZXZlbnROYW1lICsgIicgZm9yIG5vbi1leGlzdGluZyBkb21haW4gJyIgKyBkb21haW5OYW1lICsg
IiciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBhZ2Vu
dCA9IHRoaXMuX2FnZW50Rm9yRG9tYWluKGRvbWFpbk5hbWUpOworICAgICAgICB2YXIgZXZlbnQg
PSBhZ2VudC5nZXRFdmVudChldmVudE5hbWUpOworICAgICAgICBpZiAoIWV2ZW50KSB7CisgICAg
ICAgICAgICBjb25zb2xlLmVycm9yKCJQcm90b2NvbCBFcnJvcjogQXR0ZW1wdGVkIHRvIGRpc3Bh
dGNoIGFuIHVuc3BlY2lmaWVkIG1ldGhvZCAnIiArIHF1YWxpZmllZE5hbWUgKyAiJyIpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGV2ZW50QXJndW1lbnRz
ID0gW107CisgICAgICAgIGlmIChtZXNzYWdlT2JqZWN0WyJwYXJhbXMiXSkgeworICAgICAgICAg
ICAgdmFyIHBhcmFtZXRlck5hbWVzID0gZXZlbnQucGFyYW1ldGVyTmFtZXM7CisgICAgICAgICAg
ICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsgKytpKQorICAgICAg
ICAgICAgICAgIGV2ZW50QXJndW1lbnRzLnB1c2gobWVzc2FnZU9iamVjdFsicGFyYW1zIl1bcGFy
YW1ldGVyTmFtZXNbaV1dKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwcm9jZXNzaW5nU3Rh
cnRUaW1lOworICAgICAgICBpZiAodGhpcy5kdW1wSW5zcGVjdG9yVGltZVN0YXRzKQorICAgICAg
ICAgICAgcHJvY2Vzc2luZ1N0YXJ0VGltZSA9IERhdGUubm93KCk7CisKKyAgICAgICAgdHJ5IHsK
KyAgICAgICAgICAgIGFnZW50LmRpc3BhdGNoRXZlbnQoZXZlbnROYW1lLCBldmVudEFyZ3VtZW50
cyk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlVu
Y2F1Z2h0IGV4Y2VwdGlvbiBpbiBpbnNwZWN0b3IgcGFnZSB3aGlsZSBoYW5kbGluZyBldmVudCAi
ICsgcXVhbGlmaWVkTmFtZSArICI6ICIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRo
aXMuZHVtcEluc3BlY3RvclRpbWVTdGF0cykKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ0aW1l
LXN0YXRzOiAiICsgbWVzc2FnZU9iamVjdFsibWV0aG9kIl0gKyAiID0gIiArIChEYXRlLm5vdygp
IC0gcHJvY2Vzc2luZ1N0YXJ0VGltZSkpOwogICAgIH0sCiAKLSAgICBydW5BZnRlclBlbmRpbmdE
aXNwYXRjaGVzOiBmdW5jdGlvbihzY3JpcHQpCisgICAgX2ludm9rZUNvbW1hbmQ6IGZ1bmN0aW9u
KGNvbW1hbmQsIHBhcmFtZXRlcnMsIGNhbGxiYWNrKQogICAgIHsKLSAgICAgICAgY29uc29sZS5h
c3NlcnQoc2NyaXB0KTsKLSAgICAgICAgY29uc29sZS5hc3NlcnQodHlwZW9mIHNjcmlwdCA9PT0g
ImZ1bmN0aW9uIik7CisgICAgICAgIHZhciBtZXNzYWdlT2JqZWN0ID0ge307CisgICAgICAgIG1l
c3NhZ2VPYmplY3RbIm1ldGhvZCJdID0gY29tbWFuZC5xdWFsaWZpZWROYW1lOwogCi0gICAgICAg
IGlmICghdGhpcy5fcGVuZGluZ1Jlc3BvbnNlc0NvdW50KQotICAgICAgICAgICAgc2NyaXB0LmNh
bGwodGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkU2NyaXB0
cy5wdXNoKHNjcmlwdCk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzKQorICAgICAgICAgICAgbWVz
c2FnZU9iamVjdFsicGFyYW1zIl0gPSBwYXJhbWV0ZXJzOworCisgICAgICAgIC8vIFdlIGFsd2F5
cyBhc3NpZ24gYW4gaWQgYXMgYSBzZXF1ZW5jZSBpZGVudGlmaWVyLgorICAgICAgICAvLyBDYWxs
YmFjayBkYXRhIGlzIHNhdmVkIG9ubHkgaWYgYSBjYWxsYmFjayBpcyBhY3R1YWxseSBwYXNzZWQu
CisgICAgICAgIG1lc3NhZ2VPYmplY3RbImlkIl0gPSB0aGlzLl9yZWdpc3RlclNlbnRDb21tYW5k
KGNvbW1hbmQsIGNhbGxiYWNrKTsKKworICAgICAgICB2YXIgc3RyaW5naWZpZWRNZXNzYWdlID0g
SlNPTi5zdHJpbmdpZnkobWVzc2FnZU9iamVjdCk7CisgICAgICAgIGlmICh0aGlzLmR1bXBJbnNw
ZWN0b3JQcm90b2NvbE1lc3NhZ2VzKQorICAgICAgICAgICAgY29uc29sZS5sb2coImZyb250ZW5k
OiAiICsgc3RyaW5naWZpZWRNZXNzYWdlKTsKKworICAgICAgICBJbnNwZWN0b3JGcm9udGVuZEhv
c3Quc2VuZE1lc3NhZ2VUb0JhY2tlbmQoc3RyaW5naWZpZWRNZXNzYWdlKTsKICAgICB9LAogCi0g
ICAgLy8gUHJpdmF0ZQorICAgIF9yZXBvcnRQcm90b2NvbEVycm9yOiBmdW5jdGlvbihtZXNzYWdl
T2JqZWN0KQorICAgIHsKKyAgICAgICAgY29uc29sZS5lcnJvcigiUmVxdWVzdCB3aXRoIGlkID0g
IiArIG1lc3NhZ2VPYmplY3RbImlkIl0gKyAiIGZhaWxlZC4gIiArIEpTT04uc3RyaW5naWZ5KG1l
c3NhZ2VPYmplY3RbImVycm9yIl0pKTsKKyAgICB9LAogCiAgICAgX2ZsdXNoUGVuZGluZ1Njcmlw
dHM6IGZ1bmN0aW9uKCkKICAgICB7CkBAIC0yMzIsMzUgKzI1NywxMTQgQEAgSW5zcGVjdG9yQmFj
a2VuZENsYXNzLnByb3RvdHlwZSA9IHsKIAogSW5zcGVjdG9yQmFja2VuZCA9IG5ldyBJbnNwZWN0
b3JCYWNrZW5kQ2xhc3MoKTsKIAotSW5zcGVjdG9yQmFja2VuZENvbW1hbmQgPSBmdW5jdGlvbihi
YWNrZW5kLCBtZXRob2ROYW1lLCBjYWxsU2lnbmF0dXJlKQorSW5zcGVjdG9yQmFja2VuZC5BZ2Vu
dCA9IGZ1bmN0aW9uKGRvbWFpbk5hbWUpCit7CisgICAgdGhpcy5fZG9tYWluTmFtZSA9IGRvbWFp
bk5hbWU7CisKKyAgICAvLyBDb21tYW5kcyBhcmUgc3RvcmVkIGRpcmVjdGx5IG9uIHRoZSBBZ2Vu
dCBpbnN0YW5jZSB1c2luZyB0aGVpciB1bnF1YWxpZmllZAorICAgIC8vIG1ldGhvZCBuYW1lIGFz
IHRoZSBwcm9wZXJ0eS4gVGh1cywgY2FsbGVycyBjYW4gd3JpdGU6IEZvb0FnZW50Lm1ldGhvZE5h
bWUoKS4KKyAgICAvLyBFbnVtcyBhcmUgc3RvcmVkIHNpbWlsYXJseSBiYXNlZCBvbiB0aGUgdW5x
dWFsaWZpZWQgdHlwZSBuYW1lLgorICAgIHRoaXMuX2V2ZW50cyA9IHt9OworfQorCitJbnNwZWN0
b3JCYWNrZW5kLkFnZW50LnByb3RvdHlwZSA9IHsKKyAgICBnZXQgZG9tYWluTmFtZSgpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5fZG9tYWluTmFtZTsKKyAgICB9LAorCisgICAgc2V0IGRp
c3BhdGNoZXIodmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl9kaXNwYXRjaGVyID0gdmFsdWU7
CisgICAgfSwKKworICAgIGFkZEVudW06IGZ1bmN0aW9uKGVudW1JbnN0YW5jZSkKKyAgICB7Cisg
ICAgICAgIHRoaXNbZW51bUluc3RhbmNlLmVudW1OYW1lXSA9IGVudW1JbnN0YW5jZS5lbnVtVmFs
dWVzOworICAgIH0sCisKKyAgICBhZGRDb21tYW5kOiBmdW5jdGlvbihjb21tYW5kKQorICAgIHsK
KyAgICAgICAgdGhpc1tjb21tYW5kLmNvbW1hbmROYW1lXSA9IGNvbW1hbmQ7CisgICAgfSwKKwor
ICAgIGFkZEV2ZW50OiBmdW5jdGlvbihldmVudCkKKyAgICB7CisgICAgICAgIHRoaXMuX2V2ZW50
c1tldmVudC5ldmVudE5hbWVdID0gZXZlbnQ7CisgICAgfSwKKworICAgIGdldEV2ZW50OiBmdW5j
dGlvbihldmVudE5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzW2V2ZW50
TmFtZV07CisgICAgfSwKKworICAgIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSwg
ZXZlbnRBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAoIShldmVudE5hbWUgaW4gdGhpcy5f
ZGlzcGF0Y2hlcikpIHsKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlByb3RvY29sIEVycm9y
OiBBdHRlbXB0ZWQgdG8gZGlzcGF0Y2ggYW4gdW5pbXBsZW1lbnRlZCBtZXRob2QgJyIgKyB0aGlz
Ll9kb21haW5OYW1lICsgIi4iICsgZXZlbnROYW1lICsgIiciKTsKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX2Rpc3BhdGNoZXJbZXZlbnROYW1l
XS5hcHBseSh0aGlzLl9kaXNwYXRjaGVyLCBldmVudEFyZ3VtZW50cyk7CisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KK30KKworSW5zcGVjdG9yQmFja2VuZC5Db21tYW5kID0gZnVuY3Rpb24o
YmFja2VuZCwgcXVhbGlmaWVkTmFtZSwgY2FsbFNpZ25hdHVyZSwgcmVwbHlTaWduYXR1cmUpCiB7
CiAgICAgdGhpcy5fYmFja2VuZCA9IGJhY2tlbmQ7Ci0gICAgdGhpcy5tZXRob2ROYW1lID0gbWV0
aG9kTmFtZTsKLSAgICB0aGlzLl9jYWxsU2lnbmF0dXJlID0gY2FsbFNpZ25hdHVyZTsKICAgICB0
aGlzLl9pbnN0YW5jZSA9IHRoaXM7CisKKyAgICB2YXIgW2RvbWFpbk5hbWUsIGNvbW1hbmROYW1l
XSA9IHF1YWxpZmllZE5hbWUuc3BsaXQoIi4iKTsKKyAgICB0aGlzLl9xdWFsaWZpZWROYW1lID0g
cXVhbGlmaWVkTmFtZTsKKyAgICB0aGlzLl9jb21tYW5kTmFtZSA9IGNvbW1hbmROYW1lOworICAg
IHRoaXMuX2NhbGxTaWduYXR1cmUgPSBjYWxsU2lnbmF0dXJlIHx8IFtdOworICAgIHRoaXMuX3Jl
cGx5U2lnbmF0dXJlID0gcmVwbHlTaWduYXR1cmUgfHwgW107CiB9CiAKLUluc3BlY3RvckJhY2tl
bmRDb21tYW5kLmNyZWF0ZSA9IGZ1bmN0aW9uKGJhY2tlbmQsIG1ldGhvZE5hbWUsIGNhbGxTaWdu
YXR1cmUpCitJbnNwZWN0b3JCYWNrZW5kLkNvbW1hbmQuY3JlYXRlID0gZnVuY3Rpb24oYmFja2Vu
ZCwgY29tbWFuZE5hbWUsIGNhbGxTaWduYXR1cmUsIHJlcGx5U2lnbmF0dXJlKQogewotICAgIHZh
ciBpbnN0YW5jZSA9IG5ldyBJbnNwZWN0b3JCYWNrZW5kQ29tbWFuZChiYWNrZW5kLCBtZXRob2RO
YW1lLCBjYWxsU2lnbmF0dXJlKTsKKyAgICB2YXIgaW5zdGFuY2UgPSBuZXcgSW5zcGVjdG9yQmFj
a2VuZC5Db21tYW5kKGJhY2tlbmQsIGNvbW1hbmROYW1lLCBjYWxsU2lnbmF0dXJlLCByZXBseVNp
Z25hdHVyZSk7CiAKICAgICBmdW5jdGlvbiBjYWxsYWJsZSgpIHsKICAgICAgICAgaW5zdGFuY2Uu
X2ludm9rZVdpdGhBcmd1bWVudHMuYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7CiAgICAgfQog
ICAgIGNhbGxhYmxlLl9pbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIGNhbGxhYmxlLl9fcHJvdG9f
XyA9IEluc3BlY3RvckJhY2tlbmRDb21tYW5kLnByb3RvdHlwZTsKKyAgICBjYWxsYWJsZS5fX3By
b3RvX18gPSBJbnNwZWN0b3JCYWNrZW5kLkNvbW1hbmQucHJvdG90eXBlOwogICAgIHJldHVybiBj
YWxsYWJsZTsKIH0KIAogLy8gQXMgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCB0byBtYWtlIGNvbW1h
bmRzIGNhbGxhYmxlLCB0aGVzZSBmdW5jdGlvbnMgdXNlIHx0aGlzLl9pbnN0YW5jZXwuCi0vLyB8
dGhpc3wgY291bGQgcmVmZXIgdG8gdGhlIGNhbGxhYmxlIHRyYW1wb2xpbmUsIG9yIHRoZSBJbnNw
ZWN0b3JCYWNrZW5kQ29tbWFuZCBpbnN0YW5jZS4KLUluc3BlY3RvckJhY2tlbmRDb21tYW5kLnBy
b3RvdHlwZSA9IHsKKy8vIHx0aGlzfCBjb3VsZCByZWZlciB0byB0aGUgY2FsbGFibGUgdHJhbXBv
bGluZSwgb3IgdGhlIEluc3BlY3RvckJhY2tlbmQuQ29tbWFuZCBpbnN0YW5jZS4KK0luc3BlY3Rv
ckJhY2tlbmQuQ29tbWFuZC5wcm90b3R5cGUgPSB7CiAgICAgX19wcm90b19fOiBGdW5jdGlvbi5w
cm90b3R5cGUsCiAKLSAgICBpbnZva2U6IGZ1bmN0aW9uKGFyZ3MsIGNhbGxiYWNrKQorICAgIC8v
IFB1YmxpYworCisgICAgZ2V0IHF1YWxpZmllZE5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMuX2luc3RhbmNlLl9xdWFsaWZpZWROYW1lOworICAgIH0sCisKKyAgICBnZXQgY29tbWFu
ZE5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLl9jb21tYW5kTmFt
ZTsKKyAgICB9LAorCisgICAgZ2V0IGNhbGxTaWduYXR1cmUoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuX2luc3RhbmNlLl9jYWxsU2lnbmF0dXJlOworICAgIH0sCisKKyAgICBnZXQgcmVw
bHlTaWduYXR1cmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLl9yZXBs
eVNpZ25hdHVyZTsKKyAgICB9LAorCisgICAgaW52b2tlOiBmdW5jdGlvbihjb21tYW5kQXJndW1l
bnRzLCBjYWxsYmFjaykKICAgICB7CiAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3Rh
bmNlOwotICAgICAgICBpbnN0YW5jZS5fYmFja2VuZC5faW52b2tlTWV0aG9kKGluc3RhbmNlLCBh
cmdzLCBjYWxsYmFjayk7CisgICAgICAgIGluc3RhbmNlLl9iYWNrZW5kLl9pbnZva2VDb21tYW5k
KGluc3RhbmNlLCBjb21tYW5kQXJndW1lbnRzLCBjYWxsYmFjayk7CiAgICAgfSwKIAogICAgIHBy
b21pc2U6IGZ1bmN0aW9uKCkKQEAgLTI3OSw0OCArMzgzLDYyIEBAIEluc3BlY3RvckJhY2tlbmRD
b21tYW5kLnByb3RvdHlwZSA9IHsKICAgICBzdXBwb3J0czogZnVuY3Rpb24ocGFyYW1ldGVyTmFt
ZSkKICAgICB7CiAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlOwotICAgICAg
ICByZXR1cm4gaW5zdGFuY2UuX2NhbGxTaWduYXR1cmUuYW55KGZ1bmN0aW9uKHBhcmFtZXRlcikg
eworICAgICAgICByZXR1cm4gaW5zdGFuY2UuY2FsbFNpZ25hdHVyZS5hbnkoZnVuY3Rpb24ocGFy
YW1ldGVyKSB7CiAgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyWyJuYW1lIl0gPT09IHBhcmFt
ZXRlck5hbWUKICAgICAgICAgfSk7CiAgICAgfSwKIAorICAgIC8vIFByaXZhdGUKKwogICAgIF9p
bnZva2VXaXRoQXJndW1lbnRzOiBmdW5jdGlvbigpCiAgICAgewogICAgICAgICB2YXIgaW5zdGFu
Y2UgPSB0aGlzLl9pbnN0YW5jZTsKLSAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUu
c2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgICAgICB2YXIgY2FsbGJhY2sgPSB0eXBlb2YgYXJn
cy5sYXN0VmFsdWUgPT09ICJmdW5jdGlvbiIgPyBhcmdzLnBvcCgpIDogbnVsbDsKKyAgICAgICAg
dmFyIGNvbW1hbmRBcmd1bWVudHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVu
dHMpOworICAgICAgICB2YXIgY2FsbGJhY2sgPSB0eXBlb2YgY29tbWFuZEFyZ3VtZW50cy5sYXN0
VmFsdWUgPT09ICJmdW5jdGlvbiIgPyBjb21tYW5kQXJndW1lbnRzLnBvcCgpIDogbnVsbDsKIAog
ICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHt9OwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IGluc3RhbmNlLl9jYWxsU2lnbmF0dXJlLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICB2YXIg
cGFyYW1ldGVyID0gaW5zdGFuY2UuX2NhbGxTaWduYXR1cmVbaV07CisgICAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgaW5zdGFuY2UuY2FsbFNpZ25hdHVyZS5sZW5ndGg7ICsraSkgeworICAgICAg
ICAgICAgdmFyIHBhcmFtZXRlciA9IGluc3RhbmNlLmNhbGxTaWduYXR1cmVbaV07CiAgICAgICAg
ICAgICB2YXIgcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlclsibmFtZSJdOwogICAgICAgICAgICAg
dmFyIHR5cGVOYW1lID0gcGFyYW1ldGVyWyJ0eXBlIl07CiAgICAgICAgICAgICB2YXIgb3B0aW9u
YWxGbGFnID0gcGFyYW1ldGVyWyJvcHRpb25hbCJdOwogCi0gICAgICAgICAgICBpZiAoIWFyZ3Mu
bGVuZ3RoICYmICFvcHRpb25hbEZsYWcpIHsKLSAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9y
KCJQcm90b2NvbCBFcnJvcjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBtZXRob2Qg
JyIgKyBpbnN0YW5jZS5tZXRob2ROYW1lICsgIicgY2FsbC4gSXQgbXVzdCBoYXZlIHRoZSBmb2xs
b3dpbmcgYXJndW1lbnRzICciICsgSlNPTi5zdHJpbmdpZnkoc2lnbmF0dXJlKSArICInLiIpOwor
ICAgICAgICAgICAgaWYgKCFjb21tYW5kQXJndW1lbnRzLmxlbmd0aCAmJiAhb3B0aW9uYWxGbGFn
KSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUHJvdG9jb2wgRXJyb3I6IEludmFs
aWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgbWV0aG9kICciICsgaW5zdGFuY2UucXVhbGlmaWVk
TmFtZSArICInIGNhbGwuIEl0IG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyAnIiAr
IEpTT04uc3RyaW5naWZ5KHNpZ25hdHVyZSkgKyAiJy4iKTsKICAgICAgICAgICAgICAgICByZXR1
cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IGFyZ3Muc2hpZnQo
KTsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbW1hbmRBcmd1bWVudHMuc2hpZnQoKTsKICAg
ICAgICAgICAgIGlmIChvcHRpb25hbEZsYWcgJiYgdHlwZW9mIHZhbHVlID09PSAidW5kZWZpbmVk
IikKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgaWYgKHR5cGVvZiB2
YWx1ZSAhPT0gdHlwZU5hbWUpIHsKLSAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJQcm90
b2NvbCBFcnJvcjogSW52YWxpZCB0eXBlIG9mIGFyZ3VtZW50ICciICsgcGFyYW1ldGVyTmFtZSAr
ICInIGZvciBtZXRob2QgJyIgKyBpbnN0YW5jZS5tZXRob2ROYW1lICsgIicgY2FsbC4gSXQgbXVz
dCBiZSAnIiArIHR5cGVOYW1lICsgIicgYnV0IGl0IGlzICciICsgdHlwZW9mIHZhbHVlICsgIicu
Iik7CisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUHJvdG9jb2wgRXJyb3I6IEludmFs
aWQgdHlwZSBvZiBhcmd1bWVudCAnIiArIHBhcmFtZXRlck5hbWUgKyAiJyBmb3IgbWV0aG9kICci
ICsgaW5zdGFuY2UucXVhbGlmaWVkTmFtZSArICInIGNhbGwuIEl0IG11c3QgYmUgJyIgKyB0eXBl
TmFtZSArICInIGJ1dCBpdCBpcyAnIiArIHR5cGVvZiB2YWx1ZSArICInLiIpOwogICAgICAgICAg
ICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcGFyYW1ldGVyc1tw
YXJhbWV0ZXJOYW1lXSA9IHZhbHVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGFyZ3MubGVu
Z3RoID09PSAxICYmICFjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBd
ICE9PSAidW5kZWZpbmVkIikgewotICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlByb3Rv
Y29sIEVycm9yOiBPcHRpb25hbCBjYWxsYmFjayBhcmd1bWVudCBmb3IgbWV0aG9kICciICsgaW5z
dGFuY2UubWV0aG9kTmFtZSArICInIGNhbGwgbXVzdCBiZSBhIGZ1bmN0aW9uIGJ1dCBpdHMgdHlw
ZSBpcyAnIiArIHR5cGVvZiBhcmdzWzBdICsgIicuIik7CisgICAgICAgIGlmIChjb21tYW5kQXJn
dW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmICh0eXBl
b2YgY29tbWFuZEFyZ3VtZW50c1swXSAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAgICAg
ICBjb25zb2xlLmVycm9yKCJQcm90b2NvbCBFcnJvcjogT3B0aW9uYWwgY2FsbGJhY2sgYXJndW1l
bnQgZm9yIG1ldGhvZCAnIiArIGluc3RhbmNlLnF1YWxpZmllZE5hbWUgKyAiJyBjYWxsIG11c3Qg
YmUgYSBmdW5jdGlvbiBidXQgaXRzIHR5cGUgaXMgJyIgKyB0eXBlb2YgYXJnc1swXSArICInLiIp
OwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0g
ICAgICAgIGluc3RhbmNlLl9iYWNrZW5kLl9pbnZva2VNZXRob2QoaW5zdGFuY2UsIE9iamVjdC5r
ZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA/IHBhcmFtZXRlcnMgOiBudWxsLCBjYWxsYmFjayk7Cisg
ICAgICAgIGluc3RhbmNlLl9iYWNrZW5kLl9pbnZva2VDb21tYW5kKGluc3RhbmNlLCBPYmplY3Qu
a2V5cyhwYXJhbWV0ZXJzKS5sZW5ndGggPyBwYXJhbWV0ZXJzIDogbnVsbCwgY2FsbGJhY2spOwog
ICAgIH0sCiB9CisKK0luc3BlY3RvckJhY2tlbmQuRXZlbnQgPSBmdW5jdGlvbihldmVudE5hbWUs
IHBhcmFtZXRlck5hbWVzKQoreworICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lOworICAg
IHRoaXMucGFyYW1ldGVyTmFtZXMgPSBwYXJhbWV0ZXJOYW1lczsKK30KKworSW5zcGVjdG9yQmFj
a2VuZC5FbnVtID0gZnVuY3Rpb24oZW51bU5hbWUsIGVudW1WYWx1ZXMpCit7CisgICAgdGhpcy5l
bnVtTmFtZSA9IGVudW1OYW1lOworICAgIHRoaXMuZW51bVZhbHVlcyA9IGVudW1WYWx1ZXM7Cit9
Cg==
</data>
<flag name="review"
          id="254882"
          type_id="1"
          status="+"
          setter="joepeck"
    />
          </attachment>
      

    </bug>

</bugzilla>