<?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>164338</bug_id>
          
          <creation_ts>2016-11-02 13:51:05 -0700</creation_ts>
          <short_desc>Add TCP server to webkitpy for on device testing</short_desc>
          <delta_ts>2016-12-15 13:43:06 -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>Tools / Tests</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=164344</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=164568</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jonathan Bedard">jbedard</reporter>
          <assigned_to name="Jonathan Bedard">jbedard</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>dbates</cc>
    
    <cc>glenn</cc>
    
    <cc>lforschler</cc>
    
    <cc>ossy</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1247455</commentid>
    <comment_count>0</comment_count>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2016-11-02 13:51:05 -0700</bug_when>
    <thetext>In order to test on device, a TCP connection will be opened between device and host.  This adds the TCP server which will run on the host into webkitpy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1247456</commentid>
    <comment_count>1</comment_count>
      <attachid>293692</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2016-11-02 13:53:06 -0700</bug_when>
    <thetext>Created attachment 293692
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1247520</commentid>
    <comment_count>2</comment_count>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2016-11-02 15:33:51 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=164344 contains the client-side of this server.

Note that this patch does not use the TCP server, it simply implements it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1248176</commentid>
    <comment_count>3</comment_count>
      <attachid>293692</attachid>
    <who name="Dean Johnson">dean_johnson</who>
    <bug_when>2016-11-04 11:13:43 -0700</bug_when>
    <thetext>Comment on attachment 293692
Patch

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

Gave some feedback where possible - I&apos;m probably not the best candidate for reviewing such low level interactions. Great work on this!

&gt; Tools/Scripts/webkitpy/common/relayserver.py:58
&gt; +            bound = False

The loop here could be rewritten for conciseness as follows:

upper_bound = PORT_RANGE[1] - PORT_RANGE[0]
for port in range(self._port, self._port + upper_bound):
    try:
        self._socket.bind((self._host, port))
        self._port = port
        break
    except socket.error as msg:
        pass
else: # This condition gets hit if you never break from a for loop
    raise Exception(&apos;Ran out of ports to try to bind to for the TCP server.)

I would also recommend &apos;return&apos;ing after the binding the port in `if port`. Then you can remove the else statement too.

&gt; Tools/Scripts/webkitpy/common/relayserver.py:177
&gt; +            return str()

Generally speaking you should return &apos;&apos; over str().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1248187</commentid>
    <comment_count>4</comment_count>
      <attachid>293905</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2016-11-04 12:04:31 -0700</bug_when>
    <thetext>Created attachment 293905
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1249838</commentid>
    <comment_count>5</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2016-11-10 10:07:43 -0800</bug_when>
    <thetext>&lt;rdar://problem/29201285&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1251881</commentid>
    <comment_count>6</comment_count>
      <attachid>294942</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2016-11-16 08:55:46 -0800</bug_when>
    <thetext>Created attachment 294942
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260238</commentid>
    <comment_count>7</comment_count>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2016-12-15 13:43:06 -0800</bug_when>
    <thetext>Using a different approach.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293692</attachid>
            <date>2016-11-02 13:53:06 -0700</date>
            <delta_ts>2016-11-04 12:04:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-164338-20161102134907.patch</filename>
            <type>text/plain</type>
            <size>32346</size>
            <attacher name="Jonathan Bedard">jbedard</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDIwODI5NykKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI4IEBACisyMDE2LTExLTAyICBKb25hdGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNv
bT4KKworICAgICAgICBBZGQgVENQIHNlcnZlciB0byB3ZWJraXRweSBmb3Igb24gZGV2aWNlIHRl
c3RpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2
NDMzOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRo
aXMgYWRkaXRpb25zIHRvIHdlYmtpdHB5IGFsbG93IGZvciB0aGUgTGF5b3V0VGVzdFJlbGF5IHRv
IGJlIHJlcGxhY2VkIGJ5IGEgVENQIHNlcnZlcgorICAgICAgICBldmVudHVhbGx5IGFsbG93aW5n
IGZvciBvbi1kZXZpY2UgdGVzdGluZy4gIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggZG8gbm90
IHJlcGxhY2UKKyAgICAgICAgTGF5b3V0VGVzdFJlbGF5LCB0aGV5IGFyZSB0aGUgUHl0aG9uIHRv
b2xzIHJlcXVpcmVkIGZvciB0aGUgcmVwbGFjZW1lbnQuCisKKyAgICAgICAgKiBTY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9yZWxheXNlcnZlci5weTogQWRkZWQuCisgICAgICAgIChUQ1BTZXJ2ZXIp
OiBTaW1wbGUgVENQIHNlcnZlciB1c2VkIGJ5IFJlbGF5U2VydmVyVGVzdC4KKyAgICAgICAgKEFi
c3RyYWN0UGlwZSk6IEJhc2UgY2xhc3Mgb2YgZHVlbCBzdHJlYW0gcGlwZS1saWtlIG9iamVjdHMu
CisgICAgICAgIChSZWxheVNlcnZlcik6IFRDUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gb2YgZHVl
bCBzdHJlYW0gcGlwZS4KKyAgICAgICAgKFByb2Nlc3NQaXBlKTogUG9wZW4gaW1wbGVtZW50YXRp
b24gb2YgYSBkdWVsIHN0cmVhbSBwaXBlLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3JlbGF5c2VydmVyX3Rlc3RjYXNlLnB5OiBBZGRlZC4KKyAgICAgICAgKER1bW15UHJvY2Vz
c1BpcGUpOiBTaW1wbGUgZHVlbCBzdHJlYW0gcGlwZSBvYmplY3QgdXNlZCBhcyBhIHN0YW5kLWlu
IGZvciBQcm9jZXNzUGlwZSBhbmQgUmVsYXlTZXJ2ZXIgZHVyaW5nIHRlc3RpbmcuCisgICAgICAg
IChUQ1BDbGllbnQpOiBCYXNpYyBUQ1AgY2xpZW50IHVzZWQgZm9yIHRlc3RpbmcuCisgICAgICAg
ICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vcmVsYXlzZXJ2ZXJfdW5pdHRlc3QucHk6IEFkZGVk
LgorICAgICAgICAoVENQQ2xpZW50VGVzdGluZ1RocmVhZCk6IFRocmVhZGluZyBmdW5jdGlvbiB1
c2VkIGZvciB0ZXN0aW5nIFRDUCBzZXJ2ZXJzLgorICAgICAgICAoUmVsYXlTZXJ2ZXJUZXN0KTog
VW5pdCB0ZXN0cyBmb3IgYWxsIG9mIHRoZSBjbGFzc2VzIGFuZCBzdHJ1Y3R1cmVzIGluIFNjcmlw
dHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5CisgICAgICAgICogU2NyaXB0cy93ZWJr
aXRweS9zdHlsZS9jaGVja2Vycy9weXRob24ucHk6CisgICAgICAgIChQeWxpbnRlci5ydW4pOiBN
b2RpZmljYXRpb24gZm9yIHB5bG9uIGFuZCBfc29ja2V0b2JqZWN0cy4KKwogMjAxNi0xMS0wMiAg
T2xpdmllciBCbGluICA8b2xpdmllci5ibGluQHNvZnRhdGhvbWUuY29tPgogCiAgICAgICAgIFtH
VEtdIFVzZSBsaWJnY3J5cHQgaW5zdGVhZCBvZiBHbnVUTFMgZm9yIENyeXB0b0RpZ2VzdCBhbmQg
U3VidGxlQ3J5cHRvIEhNQUMgaW1wbGVtZW50YXRpb24KSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5CShub25leGlzdGVudCkKKysrIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDI2IEBACisjIENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisj
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBv
cnQgZXJybm8KK2ltcG9ydCBpbworaW1wb3J0IFF1ZXVlCitpbXBvcnQgc2VsZWN0CitpbXBvcnQg
c29ja2V0CitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCisKK2lmIHN5cy5wbGF0Zm9ybS5zdGFy
dHN3aXRoKCd3aW4nKToKKyAgICBpbXBvcnQgbXN2Y3J0CisgICAgaW1wb3J0IHdpbjMycGlwZQor
ICAgIGltcG9ydCB3aW4zMmZpbGUKK2Vsc2U6CisgICAgaW1wb3J0IGZjbnRsCisgICAgaW1wb3J0
IG9zCisKKworY2xhc3MgVENQU2VydmVyKG9iamVjdCk6CisKKyAgICBCVUZGRVIgPSA0MDk2Cisg
ICAgUE9SVF9SQU5HRSA9IFs1MDAwLCAxMDAwMF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBw
b3J0PUZhbHNlKToKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5faG9z
dCA9ICcnCisgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IEZhbHNlCisKKyAgICAgICAgc2VsZi5f
c29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFN
KQorICAgICAgICBzZWxmLl9zb2NrZXQuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29j
a2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc2VsZi5fc29ja2V0LnNldHRpbWVvdXQoMTUp
CisgICAgICAgIGlmIHBvcnQ6CisgICAgICAgICAgICBzZWxmLl9zb2NrZXQuYmluZCgoc2VsZi5f
aG9zdCwgc2VsZi5fcG9ydCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9wb3J0
ID0gKG9zLmdldHBpZCgpICUgKHNlbGYuUE9SVF9SQU5HRVsxXSAtIHNlbGYuUE9SVF9SQU5HRVsw
XSkpICsgc2VsZi5QT1JUX1JBTkdFWzBdCisgICAgICAgICAgICBib3VuZCA9IEZhbHNlCisgICAg
ICAgICAgICBjbnQgPSAwCisgICAgICAgICAgICB3aGlsZSBub3QgYm91bmQ6CisgICAgICAgICAg
ICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zb2NrZXQuYmluZCgoc2VsZi5f
aG9zdCwgc2VsZi5fcG9ydCkpCisgICAgICAgICAgICAgICAgICAgIGJvdW5kID0gVHJ1ZQorICAg
ICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgbXNnOgorICAgICAgICAgICAgICAg
ICAgICBpZiBjbnQgPiBzZWxmLlBPUlRfUkFOR0VbMV0gLSBzZWxmLlBPUlRfUkFOR0VbMF06Cisg
ICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBjbnQgPSBj
bnQgKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQgPSAoKHNlbGYuX3BvcnQgLSBz
ZWxmLlBPUlRfUkFOR0VbMF0pICsgMSAlIChzZWxmLlBPUlRfUkFOR0VbMV0gLSBzZWxmLlBPUlRf
UkFOR0VbMF0pKSArIHNlbGYuUE9SVF9SQU5HRVswXQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6
CisgICAgICAgIHNlbGYuZGlzY29ubmVjdCgpCisKKyAgICBkZWYgY29ubmVjdChzZWxmKToKKyAg
ICAgICAgaWYgc2VsZi5fY29ubmVjdGVkOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAg
ICAgc2VsZi5fc29ja2V0Lmxpc3RlbigwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxm
Ll9jb25uZWN0aW9uLCBzZWxmLl9hZGRyZXNzID0gc2VsZi5fc29ja2V0LmFjY2VwdCgpCisgICAg
ICAgICAgICBzZWxmLl9jb25uZWN0aW9uLnNldGJsb2NraW5nKDApCisgICAgICAgICAgICBzZWxm
Ll9jb25uZWN0ZWQgPSBUcnVlCisgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAg
ICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRpc2Nv
bm5lY3Qoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0ZWQ6CisgICAgICAgICAg
ICByZXR1cm4KKyAgICAgICAgc2VsZi5fc29ja2V0LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fY29u
bmVjdGVkID0gRmFsc2UKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICB0cnk6CisgICAg
ICAgICAgICBkYXRhID0gc2VsZi5fY29ubmVjdGlvbi5yZWN2KHNlbGYuQlVGRkVSKQorICAgICAg
ICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICBleGNl
cHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICAgICAgZXJyID0gZS5hcmdzWzBdCisgICAgICAg
ICAgICBpZiBlcnIgPT0gZXJybm8uRUFHQUlOIG9yIGVyciA9PSBlcnJuby5FV09VTERCTE9DSzoK
KyAgICAgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgc2VsZi5kaXNjb25uZWN0KCkKKyAg
ICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYg
bm90IHNlbGYuX2Nvbm5lY3RlZDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBz
ZWxmLl9jb25uZWN0aW9uLnNlbmQoZGF0YSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRl
ZiBwb3J0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcG9ydAorCisgICAgZGVmIGlzQ29u
bmVjdGVkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdGVkCisKKworY2xhc3Mg
QWJzdHJhY3RQaXBlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAg
IHNlbGYuY2xlYW4oKQorCisgICAgZGVmIGNsZWFuKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGRv
dXRTdHJlYW0gPSBpby5CeXRlc0lPKCkKKyAgICAgICAgc2VsZi5fc3RkZXJyU3RyZWFtID0gaW8u
Qnl0ZXNJTygpCisgICAgICAgIHNlbGYuX3N0ZG91dFRyYyA9IDAKKyAgICAgICAgc2VsZi5fc3Rk
ZXJyVHJjID0gMAorCisgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiBG
YWxzZQorCisgICAgZGVmIGlzQ29ubmVjdGVkKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UK
KworICAgIGRlZiBfcGFyc2VNZXNzYWdlKHNlbGYsIGlzQmxvY2tpbmc9RmFsc2UpOgorICAgICAg
ICByZXR1cm4gRmFsc2UKKworICAgIGRlZiByZWFkTGluZShzZWxmLCBpc0Jsb2NraW5nPUZhbHNl
KToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGVyciA9IHNlbGYuc3RkZXJyUmVh
ZCgpCisgICAgICAgICAgICBpZiBlcnI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycgorICAg
ICAgICAgICAgb3V0ID0gc2VsZi5zdGRvdXRSZWFkKCkKKyAgICAgICAgICAgIGlmIG91dDoKKyAg
ICAgICAgICAgICAgICByZXR1cm4gb3V0CisgICAgICAgICAgICBzZWxmLl9wYXJzZU1lc3NhZ2Uo
aXNCbG9ja2luZykKKyAgICAgICAgICAgIGlmIG5vdCBpc0Jsb2NraW5nOgorICAgICAgICAgICAg
ICAgIGJyZWFrCisgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIHN0ZG91dFJlYWQoc2VsZiwg
aXNCbG9ja2luZz1GYWxzZSk6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxm
Ll9zdGRvdXRTdHJlYW0uc2VlayhzZWxmLl9zdGRvdXRUcmMsIGlvLlNFRUtfU0VUKQorICAgICAg
ICAgICAgZGF0YSA9IHNlbGYuX3N0ZG91dFN0cmVhbS5yZWFkbGluZSgpCisgICAgICAgICAgICBp
ZiBkYXRhIGFuZCBkYXRhWy0xXSA9PSAnXG4nOgorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZG91
dFRyYyA9IHNlbGYuX3N0ZG91dFRyYyArIGxlbihkYXRhKQorICAgICAgICAgICAgICAgIHJldHVy
biBkYXRhCisgICAgICAgICAgICBzZWxmLl9wYXJzZU1lc3NhZ2UoaXNCbG9ja2luZykKKyAgICAg
ICAgICAgIGlmIG5vdCBpc0Jsb2NraW5nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAg
IHJldHVybiBbXQorCisgICAgZGVmIHN0ZGVyclJlYWQoc2VsZiwgaXNCbG9ja2luZz1GYWxzZSk6
CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0uc2Vl
ayhzZWxmLl9zdGRlcnJUcmMsIGlvLlNFRUtfU0VUKQorICAgICAgICAgICAgZGF0YSA9IHNlbGYu
X3N0ZGVyclN0cmVhbS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBkYXRhIGFuZCBkYXRhWy0x
XSA9PSAnXG4nOgorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclRyYyA9IHNlbGYuX3N0ZGVy
clRyYyArIGxlbihkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgICAg
ICBzZWxmLl9wYXJzZU1lc3NhZ2UoaXNCbG9ja2luZykKKyAgICAgICAgICAgIGlmIG5vdCBpc0Js
b2NraW5nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBbXQorCisgICAg
ZGVmIHJlYWRCdWZmZXJTdGRvdXQoc2VsZik6CisgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5z
ZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICBlbmRWYWwgPSBzZWxmLl9zdGRvdXRTdHJlYW0u
dGVsbCgpCisgICAgICAgIGlmIGVuZFZhbCA8PSBzZWxmLl9zdGRvdXRUcmM6CisgICAgICAgICAg
ICByZXR1cm4gc3RyKCkKKyAgICAgICAgc2VsZi5fc3Rkb3V0U3RyZWFtLnNlZWsoc2VsZi5fc3Rk
b3V0VHJjLCBpby5TRUVLX1NFVCkKKyAgICAgICAgc2l6ZSA9IGVuZFZhbCAtIHNlbGYuX3N0ZG91
dFRyYworICAgICAgICBzZWxmLl9zdGRvdXRUcmMgPSBlbmRWYWwKKyAgICAgICAgcmV0dXJuIHNl
bGYuX3N0ZG91dFN0cmVhbS5yZWFkKHNpemUpCisKKyAgICBkZWYgcmVhZEJ1ZmZlclN0ZGVycihz
ZWxmKToKKyAgICAgICAgc2VsZi5fc3RkZXJyU3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisg
ICAgICAgIGVuZFZhbCA9IHNlbGYuX3N0ZGVyclN0cmVhbS50ZWxsKCkKKyAgICAgICAgaWYgZW5k
VmFsIDw9IHNlbGYuX3N0ZG91dFRyYzoKKyAgICAgICAgICAgIHJldHVybiBzdHIoKQorICAgICAg
ICBzZWxmLl9zdGRlcnJTdHJlYW0uc2VlayhzZWxmLl9zdGRlcnJUcmMsIGlvLlNFRUtfU0VUKQor
ICAgICAgICBzaXplID0gZW5kVmFsIC0gc2VsZi5fc3Rkb3V0VHJjCisgICAgICAgIHNlbGYuX3N0
ZGVyclRyYyA9IGVuZFZhbAorICAgICAgICByZXR1cm4gc2VsZi5fc3RkZXJyU3RyZWFtLnJlYWQo
c2l6ZSkKKworICAgIGRlZiByZWFkQmxvY2tTdGRvdXQoc2VsZiwgc2l6ZSwgaXNCbG9ja2luZz1G
YWxzZSk6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLl9zdGRvdXRTdHJl
YW0uc2VlaygwLCBpby5TRUVLX0VORCkKKyAgICAgICAgICAgIGlmIHNlbGYuX3N0ZG91dFN0cmVh
bS50ZWxsKCkgLSBzZWxmLl9zdGRvdXRUcmMgPj0gc2l6ZToKKyAgICAgICAgICAgICAgICBzZWxm
Ll9zdGRvdXRTdHJlYW0uc2VlayhzZWxmLl9zdGRvdXRUcmMsIGlvLlNFRUtfU0VUKQorICAgICAg
ICAgICAgICAgIGRhdGEgPSBzZWxmLl9zdGRvdXRTdHJlYW0ucmVhZChzaXplKQorICAgICAgICAg
ICAgICAgIHNlbGYuX3N0ZG91dFRyYyA9IHNlbGYuX3N0ZG91dFRyYyArIHNpemUKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICAgICAgc2VsZi5fcGFyc2VNZXNzYWdlKGlzQmxv
Y2tpbmcpCisgICAgICAgICAgICBpZiBub3QgaXNCbG9ja2luZzoKKyAgICAgICAgICAgICAgICBi
cmVhaworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHJlYWRCbG9ja1N0ZGVycihzZWxm
LCBzaXplLCBpc0Jsb2NraW5nPUZhbHNlKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAg
ICAgIHNlbGYuX3N0ZGVyclN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAg
aWYgc2VsZi5fc3RkZXJyU3RyZWFtLnRlbGwoKSAtIHNlbGYuX3N0ZGVyclRyYyA+PSBzaXplOgor
ICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS5zZWVrKHNlbGYuX3N0ZGVyclRyYywg
aW8uU0VFS19TRVQpCisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX3N0ZGVyclN0cmVhbS5y
ZWFkKHNpemUpCisgICAgICAgICAgICAgICAgc2VsZi5fc3RkZXJyVHJjID0gc2VsZi5fc3RkZXJy
VHJjICsgc2l6ZQorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgICAgICBzZWxm
Ll9wYXJzZU1lc3NhZ2UoaXNCbG9ja2luZykKKyAgICAgICAgICAgIGlmIG5vdCBpc0Jsb2NraW5n
OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3Mg
UmVsYXlTZXJ2ZXIoVENQU2VydmVyLCBBYnN0cmFjdFBpcGUpOgorCisgICAgX19zdGRvdXRNYXRj
aCA9ICI8c3Rkb3V0PiIKKyAgICBfX3N0ZGVyck1hdGNoID0gIjxzdGRlcnI+IgorCisgICAgZGVm
IF9faW5pdF9fKHNlbGYsIHBvcnQ9RmFsc2UpOgorICAgICAgICBUQ1BTZXJ2ZXIuX19pbml0X18o
c2VsZiwgcG9ydCkKKyAgICAgICAgQWJzdHJhY3RQaXBlLl9faW5pdF9fKHNlbGYpCisgICAgICAg
IHNlbGYuX19pc1N0ZG91dCA9IFRydWUKKyAgICAgICAgc2VsZi5jbGVhbigpCisKKyAgICBkZWYg
X19kZWxfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoUmVsYXlTZXJ2ZXIsIHNlbGYpLl9fZGVsX18o
KQorCisgICAgZGVmIGNsZWFuKHNlbGYpOgorICAgICAgICBzdXBlcihSZWxheVNlcnZlciwgc2Vs
ZikuY2xlYW4oKQorICAgICAgICBzZWxmLl9fc2hhcmVkU3RyZWFtID0gaW8uQnl0ZXNJTygpCisg
ICAgICAgIHNlbGYuX19zaGFyZWRQb3MgPSAwCisKKyAgICBkZWYgX3BhcnNlTWVzc2FnZShzZWxm
LCBpc0Jsb2NraW5nPUZhbHNlKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGRh
dGEgPSBzZWxmLnJlYWQoKQorICAgICAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgICAgICBz
ZWxmLl9zdGRvdXRTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VORCkKKyAgICAgICAgICAgICAgICBz
ZWxmLl9fc2hhcmVkU3RyZWFtLndyaXRlKCcnLmpvaW4oZGF0YSkpCisKKyAgICAgICAgICAgIHNl
bGYuX3N0ZG91dFN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAgbGVuZ3Ro
ID0gc2VsZi5fX3NoYXJlZFN0cmVhbS50ZWxsKCkKKyAgICAgICAgICAgIGlmIGxlbmd0aCA+IHNl
bGYuX19zaGFyZWRQb3M6CisgICAgICAgICAgICAgICAgbG9vcEZsYWcgPSBUcnVlCisgICAgICAg
ICAgICAgICAgd2hpbGUgc2VsZi5fX3NoYXJlZFBvcyA8IGxlbmd0aCBhbmQgbG9vcEZsYWc6Cisg
ICAgICAgICAgICAgICAgICAgIHRlbXAgPSAiIgorCisgICAgICAgICAgICAgICAgICAgIG91dEZs
YWcgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGVyckZsYWcgPSBUcnVlCisgICAgICAgICAg
ICAgICAgICAgIGJlZyA9IHNlbGYuX19zaGFyZWRQb3MKKyAgICAgICAgICAgICAgICAgICAgd2hp
bGUgKG91dEZsYWcgb3IgZXJyRmxhZykgYW5kIHNlbGYuX19zaGFyZWRQb3MgLSBiZWcgPCA4IGFu
ZCBzZWxmLl9fc2hhcmVkUG9zIDwgbGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICAgICAgc2Vs
Zi5fX3NoYXJlZFN0cmVhbS5zZWVrKHNlbGYuX19zaGFyZWRQb3MsIGlvLlNFRUtfU0VUKQorICAg
ICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyBzZWxmLl9fc2hhcmVkU3RyZWFtLnJl
YWQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBvcyA9IHNlbGYuX19zaGFyZWRQb3Mg
LSBiZWcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlbXBbc3VicG9zXSAhPSBzZWxmLl9f
c3Rkb3V0TWF0Y2hbc3VicG9zXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFn
ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlbXBbc3VicG9zXSAhPSBzZWxm
Ll9fc3RkZXJyTWF0Y2hbc3VicG9zXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJG
bGFnID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19zaGFyZWRQb3MgPSBz
ZWxmLl9fc2hhcmVkUG9zICsgMQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fc2hhcmVkUG9z
ID0gc2VsZi5fX3NoYXJlZFBvcyAtIDEKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX3No
YXJlZFBvcyA+PSBsZW5ndGggLSAxIGFuZCAob3V0RmxhZyBvciBlcnJGbGFnKToKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHNlbGYuX19zaGFyZWRQb3MgPSBzZWxmLl9fc2hhcmVkUG9zIC0gbGVu
KHRlbXApCisgICAgICAgICAgICAgICAgICAgICAgICBsb29wRmxhZyA9IEZhbHNlCisgICAgICAg
ICAgICAgICAgICAgIGVsaWYgb3V0RmxhZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAg
PSAiIgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2lzU3Rkb3V0ID0gVHJ1ZQorICAg
ICAgICAgICAgICAgICAgICBlbGlmIGVyckZsYWc6CisgICAgICAgICAgICAgICAgICAgICAgICB0
ZW1wID0gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19pc1N0ZG91dCA9IEZhbHNl
CisKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX2lzU3Rkb3V0IGFuZCBsb29wRmxhZzoK
KyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKDAsIGlvLlNF
RUtfRU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3Rkb3V0U3RyZWFtLndyaXRl
KHRlbXApCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbG9vcEZsYWc6CisgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VORCkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS53cml0ZSh0ZW1wKQorICAgICAg
ICAgICAgICAgICAgICB0ZW1wID0gIiIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3NoYXJl
ZFBvcyA9IHNlbGYuX19zaGFyZWRQb3MgKyAxCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUK
KyAgICAgICAgICAgIGlmIG5vdCBpc0Jsb2NraW5nOgorICAgICAgICAgICAgICAgIGJyZWFrCisg
ICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIFByb2Nlc3NQaXBlKEFic3RyYWN0UGlwZSk6
CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCwgY21kLCBlbnZpcm89Tm9uZSwgdW5pX25l
d2xpbmVzPUZhbHNlKToKKworICAgICAgICBBYnN0cmFjdFBpcGUuX19pbml0X18oc2VsZikKKwor
ICAgICAgICBzZWxmLl9wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLl9ob3N0ID0gc2VsZi5fcG9y
dC5ob3N0CisKKyAgICAgICAgc2VsZi5fcHJvYyA9IHNlbGYuX2hvc3QuZXhlY3V0aXZlLnBvcGVu
KGNtZCwgc3RkaW49c2VsZi5faG9zdC5leGVjdXRpdmUuUElQRSwKKyAgICAgICAgICAgIHN0ZG91
dD1zZWxmLl9ob3N0LmV4ZWN1dGl2ZS5QSVBFLAorICAgICAgICAgICAgc3RkZXJyPXNlbGYuX2hv
c3QuZXhlY3V0aXZlLlBJUEUsCisgICAgICAgICAgICBjbG9zZV9mZHM9bm90IHNlbGYuX2hvc3Qu
cGxhdGZvcm0uaXNfd2luKCksCisgICAgICAgICAgICBlbnY9ZW52aXJvLAorICAgICAgICAgICAg
dW5pdmVyc2FsX25ld2xpbmVzPXVuaV9uZXdsaW5lcykKKworICAgICAgICBzZWxmLl91c2Vfd2lu
MzJfYXBpcyA9IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKQorICAgICAgICBpZiBub3Qg
c2VsZi5fdXNlX3dpbjMyX2FwaXM6CisgICAgICAgICAgICBmZCA9IHNlbGYuX3Byb2Muc3Rkb3V0
LmZpbGVubygpCisgICAgICAgICAgICBmbCA9IGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX0dFVEZM
KQorICAgICAgICAgICAgZmNudGwuZmNudGwoZmQsIGZjbnRsLkZfU0VURkwsIGZsIHwgb3MuT19O
T05CTE9DSykKKyAgICAgICAgICAgIGZkID0gc2VsZi5fcHJvYy5zdGRlcnIuZmlsZW5vKCkKKyAg
ICAgICAgICAgIGZsID0gZmNudGwuZmNudGwoZmQsIGZjbnRsLkZfR0VURkwpCisgICAgICAgICAg
ICBmY250bC5mY250bChmZCwgZmNudGwuRl9TRVRGTCwgZmwgfCBvcy5PX05PTkJMT0NLKQorCisg
ICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3Byb2MucG9sbCgpOgorICAg
ICAgICAgICAgc2VsZi5faG9zdC5leGVjdXRpdmUua2lsbF9wcm9jZXNzKHNlbGYuX3Byb2MucGlk
KQorICAgICAgICBpZiBzZWxmLl9wcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAg
IHNlbGYuX3Byb2Mud2FpdCgpCisKKyAgICAgICAgaWYgc2VsZi5fcHJvYy5zdGRpbjoKKyAgICAg
ICAgICAgIHNlbGYuX3Byb2Muc3RkaW4uY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl9wcm9jLnN0
ZG91dDoKKyAgICAgICAgICAgIHNlbGYuX3Byb2Muc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgaWYg
c2VsZi5fcHJvYy5zdGRlcnI6CisgICAgICAgICAgICBzZWxmLl9wcm9jLnN0ZGVyci5jbG9zZSgp
CisKKyAgICBkZWYgcGlkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvYy5waWQKKwor
ICAgIGRlZiBpc0Nvbm5lY3RlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9wcm9j
LnBvbGwoKQorCisgICAgZGVmIGhhbmRsZV9pbnRlcnJ1cHQoc2VsZik6CisgICAgICAgIGlmIHNl
bGYuX3Byb2MucmV0dXJuY29kZSBpbiAoLTEwNzM3NDE1MTAsIC1zaWduYWwuU0lHSU5UKToKKyAg
ICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisKKyAgICBkZWYgc2VuZChzZWxmLCBi
eXRlcyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3Byb2Muc3RkaW4ud3JpdGUo
Ynl0ZXMpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgcmV0dXJuIEZh
bHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX3VuaXhzdGRCbG9jayhzZWxmKToK
KyAgICAgICAgaWYgc2VsZi5fcHJvYy5zdGRvdXQuY2xvc2VkOgorICAgICAgICAgICAgcmV0dXJu
IE5vbmUKKyAgICAgICAgc2VsZWN0X2ZkcyA9IFtdCisgICAgICAgIHNlbGVjdF9mZHMuYXBwZW5k
KHNlbGYuX3Byb2Muc3Rkb3V0LmZpbGVubygpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBy
ZWFkX2ZkcywgXywgXyA9IHNlbGVjdC5zZWxlY3Qoc2VsZWN0X2ZkcywgW10sIHNlbGVjdF9mZHMs
IDApCisgICAgICAgIGV4Y2VwdCBzZWxlY3QuZXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmFy
Z3NbMF0gPT0gZXJybm8uRUlOVkFMOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAg
ICAgICAgICByYWlzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX3Byb2Mu
c3Rkb3V0LmZpbGVubygpIGluIHJlYWRfZmRzOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxm
Ll9wcm9jLnN0ZG91dC5yZWFkKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAg
ICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXR1cm4g
Tm9uZQorCisgICAgZGVmIF91bml4ZXJyQmxvY2soc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3By
b2Muc3RkZXJyLmNsb3NlZDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGVj
dF9mZHMgPSBbXQorICAgICAgICBzZWxlY3RfZmRzLmFwcGVuZChzZWxmLl9wcm9jLnN0ZGVyci5m
aWxlbm8oKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVhZF9mZHMsIF8sIF8gPSBzZWxl
Y3Quc2VsZWN0KHNlbGVjdF9mZHMsIFtdLCBzZWxlY3RfZmRzLCAwKQorICAgICAgICBleGNlcHQg
c2VsZWN0LmVycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5hcmdzWzBdID09IGVycm5vLkVJTlZB
TDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmFpc2UKKworICAg
ICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9wcm9jLnN0ZGVyci5maWxlbm8oKSBpbiBy
ZWFkX2ZkczoKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fcHJvYy5zdGRlcnIucmVhZCgp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6
CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfd2lu
MzJOb25CbG9ja2luZ1JlYWQoc2VsZiwgaGFuZGxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAg
ICAgXywgYXZhaWwsIF8gPSB3aW4zMnBpcGUuUGVla05hbWVkUGlwZShoYW5kbGUsIDApCisgICAg
ICAgICAgICBpZiBhdmFpbCA+IDA6CisgICAgICAgICAgICAgICAgXywgYnVmID0gd2luMzJmaWxl
LlJlYWRGaWxlKGhhbmRsZSwgYXZhaWwsIE5vbmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1
ZgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgaWYgZVswXSBub3Qg
aW4gKDEwOSwgZXJybm8uRVNIVVRET1dOKTogICMgMTA5ID09IHdpbjMyIEVSUk9SX0JST0tFTl9Q
SVBFCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRl
ZiBfd2luMzJzdGRCbG9jayhzZWxmKToKKyAgICAgICAgb3V0X2ZoID0gbXN2Y3J0LmdldF9vc2Zo
YW5kbGUoc2VsZi5fcHJvYy5zdGRvdXQuZmlsZW5vKCkpCisgICAgICAgIHJldHVybiBzZWxmLl93
aW4zMk5vbkJsb2NraW5nUmVhZChvdXRfZmgpCisKKyAgICBkZWYgX3dpbjMyZXJyQmxvY2soc2Vs
Zik6CisgICAgICAgIGVycl9maCA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHNlbGYuX3Byb2Muc3Rk
ZXJyLmZpbGVubygpKQorICAgICAgICByZXR1cm4gc2VsZi5fd2luMzJOb25CbG9ja2luZ1JlYWQo
ZXJyX2ZoKQorCisgICAgZGVmIF9wYXJzZU1lc3NhZ2Uoc2VsZiwgaXNCbG9ja2luZz1GYWxzZSk6
CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBkYXRhID0gW10KKyAgICAgICAgICAg
IGlmIHNlbGYuX3VzZV93aW4zMl9hcGlzOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl93
aW4zMnN0ZEJsb2NrKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9
IHNlbGYuX3VuaXhzdGRCbG9jaygpCisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAg
ICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAg
ICAgIHNlbGYuX3N0ZG91dFN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgZGF0YSA9IFtd
CisgICAgICAgICAgICBpZiBzZWxmLl91c2Vfd2luMzJfYXBpczoKKyAgICAgICAgICAgICAgICBk
YXRhID0gc2VsZi5fd2luMzJlcnJCbG9jaygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAg
ICAgICAgIGRhdGEgPSBzZWxmLl91bml4ZXJyQmxvY2soKQorICAgICAgICAgICAgaWYgZGF0YToK
KyAgICAgICAgICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VORCkK
KyAgICAgICAgICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAg
ICAgIGlmIG5vdCBpc0Jsb2NraW5nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJl
dHVybiBGYWxzZQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vcmVsYXlzZXJ2
ZXJfdGVzdGNhc2UucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vcmVsYXlzZXJ2ZXJfdGVzdGNhc2UucHkJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vcmVsYXlzZXJ2ZXJfdGVzdGNhc2UucHkJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxMjggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0Ogor
IyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisK
K2ltcG9ydCBlcnJubworaW1wb3J0IGlvCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdGltZQorCitm
cm9tIHdlYmtpdHB5LmNvbW1vbi5yZWxheXNlcnZlciBpbXBvcnQgQWJzdHJhY3RQaXBlCisKKwor
Y2xhc3MgRHVtbXlQcm9jZXNzUGlwZShBYnN0cmFjdFBpcGUpOgorCisgICAgZGVmIF9faW5pdF9f
KHNlbGYsIHBvcnQ9Tm9uZSwgY21kPU5vbmUsIGVudmlybz1Ob25lLCB1bmlfbmV3bGluZXM9RmFs
c2UpOgorICAgICAgICBBYnN0cmFjdFBpcGUuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5f
cG9ydCA9IHBvcnQKKyAgICAgICAgaWYgc2VsZi5fcG9ydDoKKyAgICAgICAgICAgIHNlbGYuX2hv
c3QgPSBzZWxmLl9wb3J0Lmhvc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2hv
c3QgPSBOb25lCisgICAgICAgIHNlbGYuY29ubmVjdGVkRm9yVGVzdGluZyA9IFRydWUKKworICAg
IGRlZiBwaWQoc2VsZik6CisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgaXNDb25uZWN0ZWQo
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZEZvclRlc3RpbmcKKworICAgIGRl
ZiBzZW5kKHNlbGYsIGJ5dGVzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGVkRm9yVGVz
dGluZworCisgICAgZGVmIF9wYXJzZU1lc3NhZ2Uoc2VsZiwgaXNCbG9ja2luZz1GYWxzZSk6Cisg
ICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHB1c2hEYXRhRm9yVGVzdGluZyhzZWxmLCBk
YXRhLCBzdGRlcnI9RmFsc2UsIHN0ZG91dD1UcnVlKToKKyAgICAgICAgaWYgc3RkZXJyOgorICAg
ICAgICAgICAgc2VsZi5fc3RkZXJyU3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAg
ICAgICBzZWxmLl9zdGRlcnJTdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgZWxpZiBzdGRvdXQ6
CisgICAgICAgICAgICBzZWxmLl9zdGRvdXRTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VORCkKKyAg
ICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS53cml0ZShkYXRhKQorCisKK2NsYXNzIFRDUENs
aWVudChvYmplY3QpOgorCisgICAgQlVGRkVSID0gNDA5NgorCisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHBvcnQ9NTAwMCwgYWRkcmVzcz0nMTI3LjAuMC4xJyk6CisgICAgICAgIHNlbGYuX3BvcnQg
PSBwb3J0CisgICAgICAgIHNlbGYuX2FkZHJlc3MgPSBhZGRyZXNzCisgICAgICAgIHNlbGYuX2Nv
bm5lY3RlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBzb2NrZXQuc29ja2V0
KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuX3N0cmVh
bSA9IGlvLkJ5dGVzSU8oKQorICAgICAgICBzZWxmLl9zdHJlYW1UcmMgPSAwCisKKyAgICBkZWYg
X19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kaXNjb25uZWN0KCkKKworICAgIGRlZiBjb25u
ZWN0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jb25uZWN0ZWQ6CisgICAgICAgICAgICByZXR1
cm4gVHJ1ZQorICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNvbm5lY3QoKHNlbGYuX2FkZHJlc3Ms
IHNlbGYuX3BvcnQpKQorICAgICAgICBzZWxmLl9jb25uZWN0ZWQgPSBUcnVlCisKKyAgICBkZWYg
ZGlzY29ubmVjdChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2Nvbm5lY3RlZDoKKyAgICAg
ICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNsb3NlKCkKKyAgICAgICAg
c2VsZi5fY29ubmVjdGVkID0gRmFsc2UKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBpc0Jsb2Nr
aW5nPUZhbHNlKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3N0cmVh
bS5zZWVrKHNlbGYuX3N0cmVhbVRyYywgaW8uU0VFS19TRVQpCisgICAgICAgICAgICBkYXRhID0g
c2VsZi5fc3RyZWFtLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGRhdGEgYW5kIGRhdGFbLTFd
ID09ICdcbic6CisgICAgICAgICAgICAgICAgc2VsZi5fc3RyZWFtVHJjID0gc2VsZi5fc3RyZWFt
VHJjICsgbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgICAg
IGJsb2NrID0gc2VsZi5yZWFkKCkKKyAgICAgICAgICAgIGlmIGJsb2NrOgorICAgICAgICAgICAg
ICAgIHNlbGYuX3N0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAgICAgIHNl
bGYuX3N0cmVhbS53cml0ZShibG9jaykKKyAgICAgICAgICAgIGlmIG5vdCBpc0Jsb2NraW5nOgor
ICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVh
ZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2Nvbm5lY3Rp
b24ucmVjdihzZWxmLkJVRkZFUikKKyAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICAg
ICAgcmV0dXJuIGRhdGEKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAg
ICAgIGVyciA9IGUuYXJnc1swXQorICAgICAgICAgICAgaWYgZXJyID09IGVycm5vLkVBR0FJTiBv
ciBlcnIgPT0gZXJybm8uRVdPVUxEQkxPQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdCisg
ICAgICAgIHNlbGYuZGlzY29ubmVjdCgpCisgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIHNl
bmQoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0ZWQ6CisgICAgICAg
ICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5fY29ubmVjdGlvbi5zZW5kKGRhdGEpCisg
ICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX3BvcnQKKworICAgIGRlZiBpc0Nvbm5lY3RlZChzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX2Nvbm5lY3RlZApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vcmVs
YXlzZXJ2ZXJfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vcmVsYXlzZXJ2ZXJfdW5pdHRlc3QucHkJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vcmVsYXlzZXJ2ZXJfdW5pdHRlc3QucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwyODIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUg
bWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworIyBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorIyBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorIyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyMgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKKyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorIyBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKwor
ZnJvbSB3ZWJraXRweS5jb21tb24ucmVsYXlzZXJ2ZXIgaW1wb3J0IFRDUFNlcnZlciwgUmVsYXlT
ZXJ2ZXIKK2Zyb20gd2Via2l0cHkuY29tbW9uLnJlbGF5c2VydmVyX3Rlc3RjYXNlIGltcG9ydCBE
dW1teVByb2Nlc3NQaXBlLCBUQ1BDbGllbnQKKworCitkZWYgVENQQ2xpZW50VGVzdGluZ1RocmVh
ZChzb3VyY2UsIHBydCwgYXJndW1lbnRzKToKKyAgICBzb3VyY2UuY2xpZW50UmVzdWx0cyA9IFtd
CisgICAgY2xpZW50ID0gVENQQ2xpZW50KHBydCkKKworICAgIGRlYWRsaW5lID0gdGltZS50aW1l
KCkgKyAxLjAKKyAgICB3aGlsZSB0aW1lLnRpbWUoKSA8IGRlYWRsaW5lIGFuZCBub3QgY2xpZW50
LmlzQ29ubmVjdGVkKCk6CisgICAgICAgIGNsaWVudC5jb25uZWN0KCkKKyAgICBpZiBub3QgY2xp
ZW50LmlzQ29ubmVjdGVkKCk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmVhZGluZ21vZGUg
PSBGYWxzZQorICAgIGZvciBlbG0gaW4gYXJndW1lbnRzOgorICAgICAgICBpZiBlbG0gPT0gJy0t
cmVhZCc6CisgICAgICAgICAgICBzb3VyY2UuY2xpZW50UmVzdWx0cy5hcHBlbmQoY2xpZW50LnJl
YWRsaW5lKFRydWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xpZW50LnNlbmQoZWxt
KQorICAgIGNsaWVudC5kaXNjb25uZWN0KCkKKyAgICByZXR1cm4gc291cmNlLmNsaWVudFJlc3Vs
dHMKKworCitjbGFzcyBSZWxheVNlcnZlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFJlbGF5
U2VydmVyVGVzdCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxm
LmNsaWVudFJlc3VsdHMgPSBbXQorCisgICAgZGVmIHRlc3RfYWJzdHJhY3RwaXBlX3N0ZG91dChz
ZWxmKToKKyAgICAgICAgcGlwZSA9IER1bW15UHJvY2Vzc1BpcGUoKQorCisgICAgICAgIHBpcGUu
cHVzaERhdGFGb3JUZXN0aW5nKCdjb21pbmcgZnJvbSBzdGRvdXRcbicpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwocGlwZS5zdGRvdXRSZWFkKCksICdjb21pbmcgZnJvbSBzdGRvdXRcbicpCisK
KyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3RpbmcoJ2NvbWluZyBmcm9tIHN0ZGVyclxuJywg
c3RkZXJyPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlwZS5zdGRvdXRSZWFkKCks
IFtdKQorCisgICAgZGVmIHRlc3RfYWJzdHJhY3RwaXBlX3N0ZGVycihzZWxmKToKKyAgICAgICAg
cGlwZSA9IER1bW15UHJvY2Vzc1BpcGUoKQorCisgICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0
aW5nKCdjb21pbmcgZnJvbSBzdGRvdXRcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlw
ZS5zdGRlcnJSZWFkKCksIFtdKQorCisgICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0aW5nKCdj
b21pbmcgZnJvbSBzdGRlcnJcbicsIHN0ZGVycj1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKHBpcGUuc3RkZXJyUmVhZCgpLCAnY29taW5nIGZyb20gc3RkZXJyXG4nKQorCisgICAgZGVm
IHRlc3RfYWJzdHJhY3RwaXBlX2R1ZWxfc3RyZWFtcyhzZWxmKToKKyAgICAgICAgcGlwZSA9IER1
bW15UHJvY2Vzc1BpcGUoKQorCisgICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0aW5nKCdjb21p
bmcgZnJvbSBzdGRvdXRcbicpCisgICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0aW5nKCdjb21p
bmcgZnJvbSBzdGRlcnJcbicsIHN0ZGVycj1UcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwocGlwZS5yZWFkTGluZSgpLCAnY29taW5nIGZyb20gc3RkZXJyXG4nKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHBpcGUucmVhZExpbmUoKSwgJ2NvbWluZyBmcm9tIHN0ZG91dFxuJykKKwor
ICAgIGRlZiB0ZXN0X2Fic3RyYWN0cGlwZV9zdGRvdXRibG9jayhzZWxmKToKKyAgICAgICAgcGlw
ZSA9IER1bW15UHJvY2Vzc1BpcGUoKQorCisgICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0aW5n
KCdzdGRvdXQgbGluZVxuJykKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3RpbmcoJ3N0ZG91
dCBibG9jaycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlLnJlYWRCdWZmZXJTdGRv
dXQoKSwgJ3N0ZG91dCBsaW5lXG5zdGRvdXQgYmxvY2snKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKHBpcGUucmVhZEJ1ZmZlclN0ZGVycigpLCAnJykKKworICAgIGRlZiB0ZXN0X2Fic3RyYWN0
cGlwZV9zdGRlcnJibG9jayhzZWxmKToKKyAgICAgICAgcGlwZSA9IER1bW15UHJvY2Vzc1BpcGUo
KQorCisgICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0aW5nKCdzdGRlcnIgbGluZVxuJywgc3Rk
ZXJyPVRydWUpCisgICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0aW5nKCdzdGRlcnIgYmxvY2sn
LCBzdGRlcnI9VHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGUucmVhZEJ1ZmZl
clN0ZG91dCgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlLnJlYWRCdWZmZXJT
dGRlcnIoKSwgJ3N0ZGVyciBsaW5lXG5zdGRlcnIgYmxvY2snKQorCisgICAgZGVmIHRlc3RfbXVs
dGlwb3J0X3NlcnZlcihzZWxmKToKKyAgICAgICAgc2Vydl9vbmUgPSBSZWxheVNlcnZlcigpCisg
ICAgICAgIHNlcnZfdHdvID0gUmVsYXlTZXJ2ZXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFs
c2Uoc2Vydl9vbmUucG9ydCgpID09IHNlcnZfdHdvLnBvcnQoKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRGYWxzZShzZXJ2X29uZS5pc0Nvbm5lY3RlZCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNl
KHNlcnZfdHdvLmlzQ29ubmVjdGVkKCkpCisKKyAgICBkZWYgdGVzdF90Y3BTZXJ2ZXIoc2VsZik6
CisgICAgICAgIHNlcnYgPSBUQ1BTZXJ2ZXIoKQorICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcu
VGhyZWFkKHRhcmdldD1UQ1BDbGllbnRUZXN0aW5nVGhyZWFkLCBhcmdzPShzZWxmLCBzZXJ2LnBv
cnQoKSwgWyctLXJlYWQnLCAnTGluZSAxXG4nLCAnTGluZSAyXG4nLCAnLS1yZWFkJ10pKQorICAg
ICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgICBzZXJ2LmNvbm5lY3QoKQorICAgICAgICBzZWxm
LmFzc2VydFRydWUoc2Vydi5pc0Nvbm5lY3RlZCgpKQorCisgICAgICAgIHNlcnYuc2VuZCgnU2Vy
dmVyIHNlbmQgMVxuJykKKyAgICAgICAgc2Vydi5zZW5kKCdTZXJ2ZXIgc2VuZCAyXG4nKQorCisg
ICAgICAgIHRocmVhZC5qb2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnJlYWQo
KSwgJ0xpbmUgMVxuTGluZSAyXG4nKQorICAgICAgICBzZXJ2LmRpc2Nvbm5lY3QoKQorCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1NlcnZlciBzZW5kIDFcbicsIHNlbGYuY2xpZW50UmVzdWx0
c1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnU2VydmVyIHNlbmQgMlxuJywgc2VsZi5j
bGllbnRSZXN1bHRzWzFdKQorCisgICAgZGVmIHRlc3RfcmVsYXlTZXJ2ZXJTdGRvdXRMaW5lKHNl
bGYpOgorICAgICAgICBzZXJ2ID0gUmVsYXlTZXJ2ZXIoKQorICAgICAgICB0aHJlYWQgPSB0aHJl
YWRpbmcuVGhyZWFkKHRhcmdldD1UQ1BDbGllbnRUZXN0aW5nVGhyZWFkLCBhcmdzPShzZWxmLCBz
ZXJ2LnBvcnQoKSwgWworICAgICAgICAgICAgJy0tcmVhZCcsCisgICAgICAgICAgICAnPHN0ZG91
dD5MaW5lIDFcbicsCisgICAgICAgICAgICAnTGluZSAyXG4nLAorICAgICAgICAgICAgJzxzdGRl
cnI+TGluZSBlcnIgMVxuJywKKyAgICAgICAgICAgICc8c3Rkb3V0PkxpbmUgM1xuJywKKyAgICAg
ICAgICAgICc8c3RkJywKKyAgICAgICAgICAgICdvdXQ+TGluZSA0XG4nLAorICAgICAgICAgICAg
Jy0tcmVhZCcsCisgICAgICAgIF0pKQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgICBz
ZXJ2LmNvbm5lY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2Vydi5pc0Nvbm5lY3RlZCgp
KQorCisgICAgICAgIHNlcnYuc2VuZCgnU2VydmVyIHNlbmQgMVxuJykKKyAgICAgICAgc2Vydi5z
ZW5kKCdTZXJ2ZXIgc2VuZCAyXG4nKQorCisgICAgICAgIHRocmVhZC5qb2luKCkKKworICAgICAg
ICBsaW5lID0gW10KKyAgICAgICAgZGVhZGxpbmUgPSB0aW1lLnRpbWUoKSArIDEuMAorICAgICAg
ICB3aGlsZSB0aW1lLnRpbWUoKSA8IGRlYWRsaW5lIGFuZCBub3QgbGluZToKKyAgICAgICAgICAg
IGxpbmUgPSBzZXJ2LnN0ZG91dFJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUs
ICdMaW5lIDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCks
ICdMaW5lIDJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCks
ICdMaW5lIDNcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCks
ICdMaW5lIDRcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCks
ICdMaW5lIGVyciAxXG4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRS
ZWFkKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYuc3RkZXJyUmVhZCgpLCBb
XSkKKyAgICAgICAgc2Vydi5kaXNjb25uZWN0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KCdTZXJ2ZXIgc2VuZCAxXG4nLCBzZWxmLmNsaWVudFJlc3VsdHNbMF0pCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwoJ1NlcnZlciBzZW5kIDJcbicsIHNlbGYuY2xpZW50UmVzdWx0c1sxXSkKKwor
ICAgIGRlZiB0ZXN0X3JlbGF5U2VydmVyU3RkZXJyTGluZShzZWxmKToKKyAgICAgICAgc2VydiA9
IFJlbGF5U2VydmVyKCkKKyAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9
VENQQ2xpZW50VGVzdGluZ1RocmVhZCwgYXJncz0oc2VsZiwgc2Vydi5wb3J0KCksIFsKKyAgICAg
ICAgICAgICc8c3RkZXJyPkxpbmUgMVxuJywKKyAgICAgICAgICAgICdMaW5lIDJcbicsCisgICAg
ICAgICAgICAnPHN0ZG91dD5MaW5lIG91dCAxXG4nLAorICAgICAgICAgICAgJzxzdGRlcnI+TGlu
ZSAzXG4nLAorICAgICAgICAgICAgJzxzdGQnLAorICAgICAgICAgICAgJ2Vycj5MaW5lIDRcbics
CisgICAgICAgIF0pKQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgICBzZXJ2LmNvbm5l
Y3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2Vydi5pc0Nvbm5lY3RlZCgpKQorCisgICAg
ICAgIHRocmVhZC5qb2luKCkKKworICAgICAgICBsaW5lID0gW10KKyAgICAgICAgZGVhZGxpbmUg
PSB0aW1lLnRpbWUoKSArIDEuMAorICAgICAgICB3aGlsZSB0aW1lLnRpbWUoKSA8IGRlYWRsaW5l
IGFuZCBub3QgbGluZToKKyAgICAgICAgICAgIGxpbmUgPSBzZXJ2LnN0ZGVyclJlYWQoKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsICdMaW5lIDFcbicpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCksICdMaW5lIDJcbicpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCksICdMaW5lIDNcbicpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCksICdMaW5lIDRcbicpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCksICdMaW5lIG91dCAxXG4nKQorCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCksIFtdKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKHNlcnYuc3RkZXJyUmVhZCgpLCBbXSkKKyAgICAgICAgc2Vydi5kaXNjb25uZWN0KCkK
KworICAgIGRlZiB0ZXN0X3JlbGF5U2VydmVyTWl4ZWRMaW5lKHNlbGYpOgorICAgICAgICBzZXJ2
ID0gUmVsYXlTZXJ2ZXIoKQorICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdl
dD1UQ1BDbGllbnRUZXN0aW5nVGhyZWFkLCBhcmdzPShzZWxmLCBzZXJ2LnBvcnQoKSwgWworICAg
ICAgICAgICAgJzxzdGRvdXQ+T3V0JywKKyAgICAgICAgICAgICc8c3RkZXJyPkVyciAxXG4nLAor
ICAgICAgICAgICAgJzxzdGRvdXQ+IDFcbicsCisgICAgICAgICAgICAnT3V0IDJcbicsCisgICAg
ICAgICAgICAnPHN0ZGVycj5FcnInLAorICAgICAgICAgICAgJzxzdGRvdXQ+T3V0IDNcbicsCisg
ICAgICAgICAgICAnPHN0ZGVycj4gMlxuJywKKyAgICAgICAgXSkpCisgICAgICAgIHRocmVhZC5z
dGFydCgpCisgICAgICAgIHNlcnYuY29ubmVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShz
ZXJ2LmlzQ29ubmVjdGVkKCkpCisKKyAgICAgICAgdGhyZWFkLmpvaW4oKQorCisgICAgICAgIGxp
bmUgPSBbXQorICAgICAgICBkZWFkbGluZSA9IHRpbWUudGltZSgpICsgMS4wCisgICAgICAgIHdo
aWxlIHRpbWUudGltZSgpIDwgZGVhZGxpbmUgYW5kIG5vdCBsaW5lOgorICAgICAgICAgICAgbGlu
ZSA9IHNlcnYuc3Rkb3V0UmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgJ091
dCAxXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYuc3Rkb3V0UmVhZCgpLCAnT3V0
IDJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCksICdPdXQg
M1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZGVyclJlYWQoKSwgJ0VyciAx
XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYuc3RkZXJyUmVhZCgpLCAnRXJyIDJc
bicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQoKSwgW10pCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCksIFtdKQorICAgICAgICBz
ZXJ2LmRpc2Nvbm5lY3QoKQorCisgICAgZGVmIHRlc3RfcmVsYXlTZXJ2ZXJTdGRvdXRCbG9jayhz
ZWxmKToKKyAgICAgICAgc2VydiA9IFJlbGF5U2VydmVyKCkKKyAgICAgICAgdGhyZWFkID0gdGhy
ZWFkaW5nLlRocmVhZCh0YXJnZXQ9VENQQ2xpZW50VGVzdGluZ1RocmVhZCwgYXJncz0oc2VsZiwg
c2Vydi5wb3J0KCksIFsKKyAgICAgICAgICAgICc8c3Rkb3V0PkhlcmUgaXMgYW4gb3V0IGJsb2Nr
KDI0KScsCisgICAgICAgICAgICAnPHN0ZGVycj5FcnIgMVxuJywKKyAgICAgICAgICAgICc8c3Rk
b3V0PkZpbmlzaGluZyBvdXQgYmxvY2soMjMpJywKKyAgICAgICAgICAgICdPdXQgMVxuJywKKyAg
ICAgICAgICAgICc8c3RkZXJyPkVyciAyXG4nLAorICAgICAgICBdKSkKKyAgICAgICAgdGhyZWFk
LnN0YXJ0KCkKKyAgICAgICAgc2Vydi5jb25uZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVl
KHNlcnYuaXNDb25uZWN0ZWQoKSkKKworICAgICAgICB0aHJlYWQuam9pbigpCisKKyAgICAgICAg
bGluZSA9IFtdCisgICAgICAgIGRlYWRsaW5lID0gdGltZS50aW1lKCkgKyAxLjAKKyAgICAgICAg
d2hpbGUgdGltZS50aW1lKCkgPCBkZWFkbGluZSBhbmQgbm90IGxpbmU6CisgICAgICAgICAgICBs
aW5lID0gc2Vydi5zdGRlcnJSZWFkKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUs
ICdFcnIgMVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnJlYWRCbG9ja1N0ZG91
dCg0NyksICdIZXJlIGlzIGFuIG91dCBibG9jaygyNClGaW5pc2hpbmcgb3V0IGJsb2NrKDIzKScp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCksICdPdXQgMVxuJykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZGVyclJlYWQoKSwgJ0VyciAyXG4nKQor
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5yZWFkQnVmZmVyU3Rkb3V0KCksICcnKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYucmVhZEJ1ZmZlclN0ZGVycigpLCAnJykKKyAg
ICAgICAgc2Vydi5kaXNjb25uZWN0KCkKKworICAgIGRlZiB0ZXN0X3JlbGF5U2VydmVyU3RkZXJy
QmxvY2soc2VsZik6CisgICAgICAgIHNlcnYgPSBSZWxheVNlcnZlcigpCisgICAgICAgIHRocmVh
ZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PVRDUENsaWVudFRlc3RpbmdUaHJlYWQsIGFyZ3M9
KHNlbGYsIHNlcnYucG9ydCgpLCBbCisgICAgICAgICAgICAnPHN0ZGVycj5IZXJlIGlzIGFuIGVy
ciBibG9jaygyNCknLAorICAgICAgICAgICAgJzxzdGRvdXQ+T3V0IDFcbicsCisgICAgICAgICAg
ICAnPHN0ZGVycj5GaW5pc2hpbmcgZXJyIGJsb2NrKDIzKScsCisgICAgICAgICAgICAnRXJyIDFc
bicsCisgICAgICAgICAgICAnPHN0ZG91dD5PdXQgMlxuJywKKyAgICAgICAgXSkpCisgICAgICAg
IHRocmVhZC5zdGFydCgpCisgICAgICAgIHNlcnYuY29ubmVjdCgpCisgICAgICAgIHNlbGYuYXNz
ZXJ0VHJ1ZShzZXJ2LmlzQ29ubmVjdGVkKCkpCisKKyAgICAgICAgdGhyZWFkLmpvaW4oKQorCisg
ICAgICAgIGxpbmUgPSBbXQorICAgICAgICBkZWFkbGluZSA9IHRpbWUudGltZSgpICsgMS4wCisg
ICAgICAgIHdoaWxlIHRpbWUudGltZSgpIDwgZGVhZGxpbmUgYW5kIG5vdCBsaW5lOgorICAgICAg
ICAgICAgbGluZSA9IHNlcnYuc3Rkb3V0UmVhZCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bChsaW5lLCAnT3V0IDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5yZWFkQmxv
Y2tTdGRlcnIoNDcpLCAnSGVyZSBpcyBhbiBlcnIgYmxvY2soMjQpRmluaXNoaW5nIGVyciBibG9j
aygyMyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYuc3RkZXJyUmVhZCgpLCAnRXJy
IDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCksICdPdXQg
MlxuJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYucmVhZEJ1ZmZlclN0ZG91dCgp
LCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnJlYWRCdWZmZXJTdGRlcnIoKSwg
JycpCisgICAgICAgIHNlcnYuZGlzY29ubmVjdCgpCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3N0eWxlL2NoZWNrZXJzL3B5dGhvbi5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3N0eWxlL2NoZWNrZXJzL3B5dGhvbi5weQkocmV2aXNpb24gMjA4Mjk2KQorKysg
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9zdHlsZS9jaGVja2Vycy9weXRob24ucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTEwMyw3ICsxMDMsNyBAQCBjbGFzcyBQeWxpbnRlcihvYmplY3QpOgogCiAgICAg
ZGVmIHJ1bihzZWxmLCBhcmd2KToKICAgICAgICAgb3V0cHV0ID0gX0ZpbHRlcmVkU3RyaW5nSU8o
c2VsZi5GQUxTRV9QT1NJVElWRVMpCi0gICAgICAgIGxpbnQuUnVuKFsnLS1yY2ZpbGUnLCBzZWxm
Ll9weWxpbnRyY10gKyBhcmd2LCByZXBvcnRlcj1QYXJzZWFibGVUZXh0UmVwb3J0ZXIob3V0cHV0
PW91dHB1dCksIGV4aXQ9RmFsc2UpCisgICAgICAgIGxpbnQuUnVuKFsnLS1pZ25vcmVkLWNsYXNz
ZXM9X3NvY2tldG9iamVjdCcsICctLXJjZmlsZScsIHNlbGYuX3B5bGludHJjXSArIGFyZ3YsIHJl
cG9ydGVyPVBhcnNlYWJsZVRleHRSZXBvcnRlcihvdXRwdXQ9b3V0cHV0KSwgZXhpdD1GYWxzZSkK
ICAgICAgICAgcmV0dXJuIG91dHB1dAogCiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293905</attachid>
            <date>2016-11-04 12:04:31 -0700</date>
            <delta_ts>2016-11-16 08:55:42 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-164338-20161104120029.patch</filename>
            <type>text/plain</type>
            <size>32234</size>
            <attacher name="Jonathan Bedard">jbedard</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDIwODM5MCkKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI4IEBACisyMDE2LTExLTA0ICBKb25hdGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNv
bT4KKworICAgICAgICBBZGQgVENQIHNlcnZlciB0byB3ZWJraXRweSBmb3Igb24gZGV2aWNlIHRl
c3RpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2
NDMzOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRo
aXMgYWRkaXRpb25zIHRvIHdlYmtpdHB5IGFsbG93IGZvciB0aGUgTGF5b3V0VGVzdFJlbGF5IHRv
IGJlIHJlcGxhY2VkIGJ5IGEgVENQIHNlcnZlcgorICAgICAgICBldmVudHVhbGx5IGFsbG93aW5n
IGZvciBvbi1kZXZpY2UgdGVzdGluZy4gIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggZG8gbm90
IHJlcGxhY2UKKyAgICAgICAgTGF5b3V0VGVzdFJlbGF5LCB0aGV5IGFyZSB0aGUgUHl0aG9uIHRv
b2xzIHJlcXVpcmVkIGZvciB0aGUgcmVwbGFjZW1lbnQuCisKKyAgICAgICAgKiBTY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9yZWxheXNlcnZlci5weTogQWRkZWQuCisgICAgICAgIChUQ1BTZXJ2ZXIp
OiBTaW1wbGUgVENQIHNlcnZlciB1c2VkIGJ5IFJlbGF5U2VydmVyVGVzdC4KKyAgICAgICAgKEFi
c3RyYWN0UGlwZSk6IEJhc2UgY2xhc3Mgb2YgZHVlbCBzdHJlYW0gcGlwZS1saWtlIG9iamVjdHMu
CisgICAgICAgIChSZWxheVNlcnZlcik6IFRDUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gb2YgZHVl
bCBzdHJlYW0gcGlwZS4KKyAgICAgICAgKFByb2Nlc3NQaXBlKTogUG9wZW4gaW1wbGVtZW50YXRp
b24gb2YgYSBkdWVsIHN0cmVhbSBwaXBlLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3JlbGF5c2VydmVyX3Rlc3RjYXNlLnB5OiBBZGRlZC4KKyAgICAgICAgKER1bW15UHJvY2Vz
c1BpcGUpOiBTaW1wbGUgZHVlbCBzdHJlYW0gcGlwZSBvYmplY3QgdXNlZCBhcyBhIHN0YW5kLWlu
IGZvciBQcm9jZXNzUGlwZSBhbmQgUmVsYXlTZXJ2ZXIgZHVyaW5nIHRlc3RpbmcuCisgICAgICAg
IChUQ1BDbGllbnQpOiBCYXNpYyBUQ1AgY2xpZW50IHVzZWQgZm9yIHRlc3RpbmcuCisgICAgICAg
ICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vcmVsYXlzZXJ2ZXJfdW5pdHRlc3QucHk6IEFkZGVk
LgorICAgICAgICAoVENQQ2xpZW50VGVzdGluZ1RocmVhZCk6IFRocmVhZGluZyBmdW5jdGlvbiB1
c2VkIGZvciB0ZXN0aW5nIFRDUCBzZXJ2ZXJzLgorICAgICAgICAoUmVsYXlTZXJ2ZXJUZXN0KTog
VW5pdCB0ZXN0cyBmb3IgYWxsIG9mIHRoZSBjbGFzc2VzIGFuZCBzdHJ1Y3R1cmVzIGluIFNjcmlw
dHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5CisgICAgICAgICogU2NyaXB0cy93ZWJr
aXRweS9zdHlsZS9jaGVja2Vycy9weXRob24ucHk6CisgICAgICAgIChQeWxpbnRlci5ydW4pOiBN
b2RpZmljYXRpb24gZm9yIHB5bG9uIGFuZCBfc29ja2V0b2JqZWN0cy4KKwogMjAxNi0xMS0wNCAg
QnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgUkVHUkVTU0lPTiAo
cjIwODM0OSkgU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5IGJlaGF2aW9yIGNoYW5nZWQsIGNhdXNp
bmcgQVBJIHRlc3RzIHRvIGZhaWwKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L3JlbGF5c2VydmVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3JlbGF5c2VydmVyLnB5CShub25leGlzdGVudCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDI1IEBA
CisjIENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisj
CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgZXJybm8KK2lt
cG9ydCBpbworaW1wb3J0IFF1ZXVlCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc29ja2V0CitpbXBv
cnQgc2lnbmFsCitpbXBvcnQgc3lzCisKK2lmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4n
KToKKyAgICBpbXBvcnQgbXN2Y3J0CisgICAgaW1wb3J0IHdpbjMycGlwZQorICAgIGltcG9ydCB3
aW4zMmZpbGUKK2Vsc2U6CisgICAgaW1wb3J0IGZjbnRsCisgICAgaW1wb3J0IG9zCisKKworY2xh
c3MgVENQU2VydmVyKG9iamVjdCk6CisKKyAgICBCVUZGRVIgPSA0MDk2CisgICAgUE9SVF9SQU5H
RSA9IFs1MDAwLCAxMDAwMF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0PUZhbHNlKToK
KyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5faG9zdCA9ICcnCisgICAg
ICAgIHNlbGYuX2Nvbm5lY3RlZCA9IEZhbHNlCisKKyAgICAgICAgc2VsZi5fc29ja2V0ID0gc29j
a2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBz
ZWxmLl9zb2NrZXQuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNF
QUREUiwgMSkKKyAgICAgICAgc2VsZi5fc29ja2V0LnNldHRpbWVvdXQoMTUpCisgICAgICAgIGlm
IHBvcnQ6CisgICAgICAgICAgICBzZWxmLl9zb2NrZXQuYmluZCgoc2VsZi5faG9zdCwgc2VsZi5f
cG9ydCkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fcG9ydCA9IChvcy5nZXRw
aWQoKSAlIChzZWxmLlBPUlRfUkFOR0VbMV0gLSBzZWxmLlBPUlRfUkFOR0VbMF0pKSArIHNlbGYu
UE9SVF9SQU5HRVswXQorICAgICAgICB1cHBlcl9ib3VuZCA9IHNlbGYuUE9SVF9SQU5HRVsxXSAt
IHNlbGYuUE9SVF9SQU5HRVswXQorICAgICAgICBmb3IgcG9ydCBpbiByYW5nZShzZWxmLl9wb3J0
LCBzZWxmLl9wb3J0ICsgdXBwZXJfYm91bmQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAg
ICAgICAgIHNlbGYuX3NvY2tldC5iaW5kKChzZWxmLl9ob3N0LCBwb3J0KSkKKyAgICAgICAgICAg
ICAgICBzZWxmLl9wb3J0ID0gcG9ydAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAg
ICBleGNlcHQgc29ja2V0LmVycm9yIGFzIG1zZzoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAg
ICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1JhbiBvdXQgb2YgcG9ydHMg
dG8gdHJ5IHRvIGJpbmQgdG8gZm9yIHRoZSBUQ1Agc2VydmVyLicpCisKKyAgICBkZWYgX19kZWxf
XyhzZWxmKToKKyAgICAgICAgc2VsZi5kaXNjb25uZWN0KCkKKworICAgIGRlZiBjb25uZWN0KHNl
bGYpOgorICAgICAgICBpZiBzZWxmLl9jb25uZWN0ZWQ6CisgICAgICAgICAgICByZXR1cm4gVHJ1
ZQorICAgICAgICBzZWxmLl9zb2NrZXQubGlzdGVuKDApCisgICAgICAgIHRyeToKKyAgICAgICAg
ICAgIHNlbGYuX2Nvbm5lY3Rpb24sIHNlbGYuX2FkZHJlc3MgPSBzZWxmLl9zb2NrZXQuYWNjZXB0
KCkKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uc2V0YmxvY2tpbmcoMCkKKyAgICAgICAg
ICAgIHNlbGYuX2Nvbm5lY3RlZCA9IFRydWUKKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0
OgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBk
ZWYgZGlzY29ubmVjdChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2Nvbm5lY3RlZDoKKyAg
ICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9zb2NrZXQuY2xvc2UoKQorICAgICAgICBz
ZWxmLl9jb25uZWN0ZWQgPSBGYWxzZQorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHRy
eToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb25uZWN0aW9uLnJlY3Yoc2VsZi5CVUZGRVIp
CisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAg
ICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgICAgICBlcnIgPSBlLmFyZ3NbMF0K
KyAgICAgICAgICAgIGlmIGVyciA9PSBlcnJuby5FQUdBSU4gb3IgZXJyID09IGVycm5vLkVXT1VM
REJMT0NLOgorICAgICAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBzZWxmLmRpc2Nvbm5l
Y3QoKQorICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAg
ICAgICBpZiBub3Qgc2VsZi5fY29ubmVjdGVkOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisg
ICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uc2VuZChkYXRhKQorICAgICAgICByZXR1cm4gVHJ1ZQor
CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wb3J0CisKKyAgICBk
ZWYgaXNDb25uZWN0ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0ZWQKKwor
CitjbGFzcyBBYnN0cmFjdFBpcGUob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToK
KyAgICAgICAgc2VsZi5jbGVhbigpCisKKyAgICBkZWYgY2xlYW4oc2VsZik6CisgICAgICAgIHNl
bGYuX3N0ZG91dFN0cmVhbSA9IGlvLkJ5dGVzSU8oKQorICAgICAgICBzZWxmLl9zdGRlcnJTdHJl
YW0gPSBpby5CeXRlc0lPKCkKKyAgICAgICAgc2VsZi5fc3Rkb3V0VHJjID0gMAorICAgICAgICBz
ZWxmLl9zdGRlcnJUcmMgPSAwCisKKyAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKKyAgICAgICAg
cmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaXNDb25uZWN0ZWQoc2VsZik6CisgICAgICAgIHJldHVy
biBGYWxzZQorCisgICAgZGVmIF9wYXJzZU1lc3NhZ2Uoc2VsZiwgaXNCbG9ja2luZz1GYWxzZSk6
CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHJlYWRMaW5lKHNlbGYsIGlzQmxvY2tp
bmc9RmFsc2UpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZXJyID0gc2VsZi5z
dGRlcnJSZWFkKCkKKyAgICAgICAgICAgIGlmIGVycjoKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZXJyCisgICAgICAgICAgICBvdXQgPSBzZWxmLnN0ZG91dFJlYWQoKQorICAgICAgICAgICAgaWYg
b3V0OgorICAgICAgICAgICAgICAgIHJldHVybiBvdXQKKyAgICAgICAgICAgIHNlbGYuX3BhcnNl
TWVzc2FnZShpc0Jsb2NraW5nKQorICAgICAgICAgICAgaWYgbm90IGlzQmxvY2tpbmc6CisgICAg
ICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgc3Rkb3V0UmVh
ZChzZWxmLCBpc0Jsb2NraW5nPUZhbHNlKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAg
ICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKHNlbGYuX3N0ZG91dFRyYywgaW8uU0VFS19TRVQp
CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fc3Rkb3V0U3RyZWFtLnJlYWRsaW5lKCkKKyAgICAg
ICAgICAgIGlmIGRhdGEgYW5kIGRhdGFbLTFdID09ICdcbic6CisgICAgICAgICAgICAgICAgc2Vs
Zi5fc3Rkb3V0VHJjID0gc2VsZi5fc3Rkb3V0VHJjICsgbGVuKGRhdGEpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGRhdGEKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlTWVzc2FnZShpc0Jsb2NraW5n
KQorICAgICAgICAgICAgaWYgbm90IGlzQmxvY2tpbmc6CisgICAgICAgICAgICAgICAgYnJlYWsK
KyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgc3RkZXJyUmVhZChzZWxmLCBpc0Jsb2NraW5n
PUZhbHNlKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0
cmVhbS5zZWVrKHNlbGYuX3N0ZGVyclRyYywgaW8uU0VFS19TRVQpCisgICAgICAgICAgICBkYXRh
ID0gc2VsZi5fc3RkZXJyU3RyZWFtLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGRhdGEgYW5k
IGRhdGFbLTFdID09ICdcbic6CisgICAgICAgICAgICAgICAgc2VsZi5fc3RkZXJyVHJjID0gc2Vs
Zi5fc3RkZXJyVHJjICsgbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAg
ICAgICAgICAgIHNlbGYuX3BhcnNlTWVzc2FnZShpc0Jsb2NraW5nKQorICAgICAgICAgICAgaWYg
bm90IGlzQmxvY2tpbmc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIFtd
CisKKyAgICBkZWYgcmVhZEJ1ZmZlclN0ZG91dChzZWxmKToKKyAgICAgICAgc2VsZi5fc3Rkb3V0
U3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAgIGVuZFZhbCA9IHNlbGYuX3N0ZG91
dFN0cmVhbS50ZWxsKCkKKyAgICAgICAgaWYgZW5kVmFsIDw9IHNlbGYuX3N0ZG91dFRyYzoKKyAg
ICAgICAgICAgIHJldHVybiAnJworICAgICAgICBzZWxmLl9zdGRvdXRTdHJlYW0uc2VlayhzZWxm
Ll9zdGRvdXRUcmMsIGlvLlNFRUtfU0VUKQorICAgICAgICBzaXplID0gZW5kVmFsIC0gc2VsZi5f
c3Rkb3V0VHJjCisgICAgICAgIHNlbGYuX3N0ZG91dFRyYyA9IGVuZFZhbAorICAgICAgICByZXR1
cm4gc2VsZi5fc3Rkb3V0U3RyZWFtLnJlYWQoc2l6ZSkKKworICAgIGRlZiByZWFkQnVmZmVyU3Rk
ZXJyKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VO
RCkKKyAgICAgICAgZW5kVmFsID0gc2VsZi5fc3RkZXJyU3RyZWFtLnRlbGwoKQorICAgICAgICBp
ZiBlbmRWYWwgPD0gc2VsZi5fc3Rkb3V0VHJjOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAg
ICAgIHNlbGYuX3N0ZGVyclN0cmVhbS5zZWVrKHNlbGYuX3N0ZGVyclRyYywgaW8uU0VFS19TRVQp
CisgICAgICAgIHNpemUgPSBlbmRWYWwgLSBzZWxmLl9zdGRvdXRUcmMKKyAgICAgICAgc2VsZi5f
c3RkZXJyVHJjID0gZW5kVmFsCisgICAgICAgIHJldHVybiBzZWxmLl9zdGRlcnJTdHJlYW0ucmVh
ZChzaXplKQorCisgICAgZGVmIHJlYWRCbG9ja1N0ZG91dChzZWxmLCBzaXplLCBpc0Jsb2NraW5n
PUZhbHNlKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0
cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAgaWYgc2VsZi5fc3Rkb3V0U3Ry
ZWFtLnRlbGwoKSAtIHNlbGYuX3N0ZG91dFRyYyA+PSBzaXplOgorICAgICAgICAgICAgICAgIHNl
bGYuX3N0ZG91dFN0cmVhbS5zZWVrKHNlbGYuX3N0ZG91dFRyYywgaW8uU0VFS19TRVQpCisgICAg
ICAgICAgICAgICAgZGF0YSA9IHNlbGYuX3N0ZG91dFN0cmVhbS5yZWFkKHNpemUpCisgICAgICAg
ICAgICAgICAgc2VsZi5fc3Rkb3V0VHJjID0gc2VsZi5fc3Rkb3V0VHJjICsgc2l6ZQorICAgICAg
ICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgICAgICBzZWxmLl9wYXJzZU1lc3NhZ2UoaXNC
bG9ja2luZykKKyAgICAgICAgICAgIGlmIG5vdCBpc0Jsb2NraW5nOgorICAgICAgICAgICAgICAg
IGJyZWFrCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVhZEJsb2NrU3RkZXJyKHNl
bGYsIHNpemUsIGlzQmxvY2tpbmc9RmFsc2UpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAg
ICAgICAgc2VsZi5fc3RkZXJyU3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAgICAg
ICBpZiBzZWxmLl9zdGRlcnJTdHJlYW0udGVsbCgpIC0gc2VsZi5fc3RkZXJyVHJjID49IHNpemU6
CisgICAgICAgICAgICAgICAgc2VsZi5fc3RkZXJyU3RyZWFtLnNlZWsoc2VsZi5fc3RkZXJyVHJj
LCBpby5TRUVLX1NFVCkKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fc3RkZXJyU3RyZWFt
LnJlYWQoc2l6ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRlcnJUcmMgPSBzZWxmLl9zdGRl
cnJUcmMgKyBzaXplCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgICAgIHNl
bGYuX3BhcnNlTWVzc2FnZShpc0Jsb2NraW5nKQorICAgICAgICAgICAgaWYgbm90IGlzQmxvY2tp
bmc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFz
cyBSZWxheVNlcnZlcihUQ1BTZXJ2ZXIsIEFic3RyYWN0UGlwZSk6CisKKyAgICBfX3N0ZG91dE1h
dGNoID0gIjxzdGRvdXQ+IgorICAgIF9fc3RkZXJyTWF0Y2ggPSAiPHN0ZGVycj4iCisKKyAgICBk
ZWYgX19pbml0X18oc2VsZiwgcG9ydD1GYWxzZSk6CisgICAgICAgIFRDUFNlcnZlci5fX2luaXRf
XyhzZWxmLCBwb3J0KQorICAgICAgICBBYnN0cmFjdFBpcGUuX19pbml0X18oc2VsZikKKyAgICAg
ICAgc2VsZi5fX2lzU3Rkb3V0ID0gVHJ1ZQorICAgICAgICBzZWxmLmNsZWFuKCkKKworICAgIGRl
ZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzdXBlcihSZWxheVNlcnZlciwgc2VsZikuX19kZWxf
XygpCisKKyAgICBkZWYgY2xlYW4oc2VsZik6CisgICAgICAgIHN1cGVyKFJlbGF5U2VydmVyLCBz
ZWxmKS5jbGVhbigpCisgICAgICAgIHNlbGYuX19zaGFyZWRTdHJlYW0gPSBpby5CeXRlc0lPKCkK
KyAgICAgICAgc2VsZi5fX3NoYXJlZFBvcyA9IDAKKworICAgIGRlZiBfcGFyc2VNZXNzYWdlKHNl
bGYsIGlzQmxvY2tpbmc9RmFsc2UpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAg
ZGF0YSA9IHNlbGYucmVhZCgpCisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAg
IHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAgICAg
IHNlbGYuX19zaGFyZWRTdHJlYW0ud3JpdGUoJycuam9pbihkYXRhKSkKKworICAgICAgICAgICAg
c2VsZi5fc3Rkb3V0U3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAgICAgICBsZW5n
dGggPSBzZWxmLl9fc2hhcmVkU3RyZWFtLnRlbGwoKQorICAgICAgICAgICAgaWYgbGVuZ3RoID4g
c2VsZi5fX3NoYXJlZFBvczoKKyAgICAgICAgICAgICAgICBsb29wRmxhZyA9IFRydWUKKyAgICAg
ICAgICAgICAgICB3aGlsZSBzZWxmLl9fc2hhcmVkUG9zIDwgbGVuZ3RoIGFuZCBsb29wRmxhZzoK
KyAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICIiCisKKyAgICAgICAgICAgICAgICAgICAgb3V0
RmxhZyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgZXJyRmxhZyA9IFRydWUKKyAgICAgICAg
ICAgICAgICAgICAgYmVnID0gc2VsZi5fX3NoYXJlZFBvcworICAgICAgICAgICAgICAgICAgICB3
aGlsZSAob3V0RmxhZyBvciBlcnJGbGFnKSBhbmQgc2VsZi5fX3NoYXJlZFBvcyAtIGJlZyA8IDgg
YW5kIHNlbGYuX19zaGFyZWRQb3MgPCBsZW5ndGg6CisgICAgICAgICAgICAgICAgICAgICAgICBz
ZWxmLl9fc2hhcmVkU3RyZWFtLnNlZWsoc2VsZi5fX3NoYXJlZFBvcywgaW8uU0VFS19TRVQpCisg
ICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCArIHNlbGYuX19zaGFyZWRTdHJlYW0u
cmVhZCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VicG9zID0gc2VsZi5fX3NoYXJlZFBv
cyAtIGJlZworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVtcFtzdWJwb3NdICE9IHNlbGYu
X19zdGRvdXRNYXRjaFtzdWJwb3NdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZs
YWcgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVtcFtzdWJwb3NdICE9IHNl
bGYuX19zdGRlcnJNYXRjaFtzdWJwb3NdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVy
ckZsYWcgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3NoYXJlZFBvcyA9
IHNlbGYuX19zaGFyZWRQb3MgKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19zaGFyZWRQ
b3MgPSBzZWxmLl9fc2hhcmVkUG9zIC0gMQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9f
c2hhcmVkUG9zID49IGxlbmd0aCAtIDEgYW5kIChvdXRGbGFnIG9yIGVyckZsYWcpOgorICAgICAg
ICAgICAgICAgICAgICAgICAgc2VsZi5fX3NoYXJlZFBvcyA9IHNlbGYuX19zaGFyZWRQb3MgLSBs
ZW4odGVtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BGbGFnID0gRmFsc2UKKyAgICAg
ICAgICAgICAgICAgICAgZWxpZiBvdXRGbGFnOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVt
cCA9ICIiCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9faXNTdGRvdXQgPSBUcnVlCisg
ICAgICAgICAgICAgICAgICAgIGVsaWYgZXJyRmxhZzoKKyAgICAgICAgICAgICAgICAgICAgICAg
IHRlbXAgPSAiIgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2lzU3Rkb3V0ID0gRmFs
c2UKKworICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9faXNTdGRvdXQgYW5kIGxvb3BGbGFn
OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3Rkb3V0U3RyZWFtLnNlZWsoMCwgaW8u
U0VFS19FTkQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGRvdXRTdHJlYW0ud3Jp
dGUodGVtcCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBsb29wRmxhZzoKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RkZXJyU3RyZWFtLndyaXRlKHRlbXApCisgICAg
ICAgICAgICAgICAgICAgIHRlbXAgPSAiIgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fc2hh
cmVkUG9zID0gc2VsZi5fX3NoYXJlZFBvcyArIDEKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1
ZQorICAgICAgICAgICAgaWYgbm90IGlzQmxvY2tpbmc6CisgICAgICAgICAgICAgICAgYnJlYWsK
KyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgUHJvY2Vzc1BpcGUoQWJzdHJhY3RQaXBl
KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0LCBjbWQsIGVudmlybz1Ob25lLCB1bmlf
bmV3bGluZXM9RmFsc2UpOgorCisgICAgICAgIEFic3RyYWN0UGlwZS5fX2luaXRfXyhzZWxmKQor
CisgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuX2hvc3QgPSBzZWxmLl9w
b3J0Lmhvc3QKKworICAgICAgICBzZWxmLl9wcm9jID0gc2VsZi5faG9zdC5leGVjdXRpdmUucG9w
ZW4oY21kLCBzdGRpbj1zZWxmLl9ob3N0LmV4ZWN1dGl2ZS5QSVBFLAorICAgICAgICAgICAgc3Rk
b3V0PXNlbGYuX2hvc3QuZXhlY3V0aXZlLlBJUEUsCisgICAgICAgICAgICBzdGRlcnI9c2VsZi5f
aG9zdC5leGVjdXRpdmUuUElQRSwKKyAgICAgICAgICAgIGNsb3NlX2Zkcz1ub3Qgc2VsZi5faG9z
dC5wbGF0Zm9ybS5pc193aW4oKSwKKyAgICAgICAgICAgIGVudj1lbnZpcm8sCisgICAgICAgICAg
ICB1bml2ZXJzYWxfbmV3bGluZXM9dW5pX25ld2xpbmVzKQorCisgICAgICAgIHNlbGYuX3VzZV93
aW4zMl9hcGlzID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpCisgICAgICAgIGlmIG5v
dCBzZWxmLl91c2Vfd2luMzJfYXBpczoKKyAgICAgICAgICAgIGZkID0gc2VsZi5fcHJvYy5zdGRv
dXQuZmlsZW5vKCkKKyAgICAgICAgICAgIGZsID0gZmNudGwuZmNudGwoZmQsIGZjbnRsLkZfR0VU
RkwpCisgICAgICAgICAgICBmY250bC5mY250bChmZCwgZmNudGwuRl9TRVRGTCwgZmwgfCBvcy5P
X05PTkJMT0NLKQorICAgICAgICAgICAgZmQgPSBzZWxmLl9wcm9jLnN0ZGVyci5maWxlbm8oKQor
ICAgICAgICAgICAgZmwgPSBmY250bC5mY250bChmZCwgZmNudGwuRl9HRVRGTCkKKyAgICAgICAg
ICAgIGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX1NFVEZMLCBmbCB8IG9zLk9fTk9OQkxPQ0spCisK
KyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcHJvYy5wb2xsKCk6Cisg
ICAgICAgICAgICBzZWxmLl9ob3N0LmV4ZWN1dGl2ZS5raWxsX3Byb2Nlc3Moc2VsZi5fcHJvYy5w
aWQpCisgICAgICAgIGlmIHNlbGYuX3Byb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAg
ICAgc2VsZi5fcHJvYy53YWl0KCkKKworICAgICAgICBpZiBzZWxmLl9wcm9jLnN0ZGluOgorICAg
ICAgICAgICAgc2VsZi5fcHJvYy5zdGRpbi5jbG9zZSgpCisgICAgICAgIGlmIHNlbGYuX3Byb2Mu
c3Rkb3V0OgorICAgICAgICAgICAgc2VsZi5fcHJvYy5zdGRvdXQuY2xvc2UoKQorICAgICAgICBp
ZiBzZWxmLl9wcm9jLnN0ZGVycjoKKyAgICAgICAgICAgIHNlbGYuX3Byb2Muc3RkZXJyLmNsb3Nl
KCkKKworICAgIGRlZiBwaWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm9jLnBpZAor
CisgICAgZGVmIGlzQ29ubmVjdGVkKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX3By
b2MucG9sbCgpCisKKyAgICBkZWYgaGFuZGxlX2ludGVycnVwdChzZWxmKToKKyAgICAgICAgaWYg
c2VsZi5fcHJvYy5yZXR1cm5jb2RlIGluICgtMTA3Mzc0MTUxMCwgLXNpZ25hbC5TSUdJTlQpOgor
ICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKworICAgIGRlZiBzZW5kKHNlbGYs
IGJ5dGVzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcHJvYy5zdGRpbi53cml0
ZShieXRlcykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICByZXR1cm4g
RmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfdW5peHN0ZEJsb2NrKHNlbGYp
OgorICAgICAgICBpZiBzZWxmLl9wcm9jLnN0ZG91dC5jbG9zZWQ6CisgICAgICAgICAgICByZXR1
cm4gTm9uZQorICAgICAgICBzZWxlY3RfZmRzID0gW10KKyAgICAgICAgc2VsZWN0X2Zkcy5hcHBl
bmQoc2VsZi5fcHJvYy5zdGRvdXQuZmlsZW5vKCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAg
IHJlYWRfZmRzLCBfLCBfID0gc2VsZWN0LnNlbGVjdChzZWxlY3RfZmRzLCBbXSwgc2VsZWN0X2Zk
cywgMCkKKyAgICAgICAgZXhjZXB0IHNlbGVjdC5lcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUu
YXJnc1swXSA9PSBlcnJuby5FSU5WQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAg
ICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fcHJv
Yy5zdGRvdXQuZmlsZW5vKCkgaW4gcmVhZF9mZHM6CisgICAgICAgICAgICAgICAgZGF0YSA9IHNl
bGYuX3Byb2Muc3Rkb3V0LnJlYWQoKQorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAg
ICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJldHVy
biBOb25lCisKKyAgICBkZWYgX3VuaXhlcnJCbG9jayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5f
cHJvYy5zdGRlcnIuY2xvc2VkOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2Vs
ZWN0X2ZkcyA9IFtdCisgICAgICAgIHNlbGVjdF9mZHMuYXBwZW5kKHNlbGYuX3Byb2Muc3RkZXJy
LmZpbGVubygpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZWFkX2ZkcywgXywgXyA9IHNl
bGVjdC5zZWxlY3Qoc2VsZWN0X2ZkcywgW10sIHNlbGVjdF9mZHMsIDApCisgICAgICAgIGV4Y2Vw
dCBzZWxlY3QuZXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gZXJybm8uRUlO
VkFMOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByYWlzZQorCisg
ICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX3Byb2Muc3RkZXJyLmZpbGVubygpIGlu
IHJlYWRfZmRzOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9wcm9jLnN0ZGVyci5yZWFk
KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICBleGNlcHQgSU9FcnJvciwg
ZToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF93
aW4zMk5vbkJsb2NraW5nUmVhZChzZWxmLCBoYW5kbGUpOgorICAgICAgICB0cnk6CisgICAgICAg
ICAgICBfLCBhdmFpbCwgXyA9IHdpbjMycGlwZS5QZWVrTmFtZWRQaXBlKGhhbmRsZSwgMCkKKyAg
ICAgICAgICAgIGlmIGF2YWlsID4gMDoKKyAgICAgICAgICAgICAgICBfLCBidWYgPSB3aW4zMmZp
bGUuUmVhZEZpbGUoaGFuZGxlLCBhdmFpbCwgTm9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
YnVmCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBpZiBlWzBdIG5v
dCBpbiAoMTA5LCBlcnJuby5FU0hVVERPV04pOiAgIyAxMDkgPT0gd2luMzIgRVJST1JfQlJPS0VO
X1BJUEUKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAg
ZGVmIF93aW4zMnN0ZEJsb2NrKHNlbGYpOgorICAgICAgICBvdXRfZmggPSBtc3ZjcnQuZ2V0X29z
ZmhhbmRsZShzZWxmLl9wcm9jLnN0ZG91dC5maWxlbm8oKSkKKyAgICAgICAgcmV0dXJuIHNlbGYu
X3dpbjMyTm9uQmxvY2tpbmdSZWFkKG91dF9maCkKKworICAgIGRlZiBfd2luMzJlcnJCbG9jayhz
ZWxmKToKKyAgICAgICAgZXJyX2ZoID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc2VsZi5fcHJvYy5z
dGRlcnIuZmlsZW5vKCkpCisgICAgICAgIHJldHVybiBzZWxmLl93aW4zMk5vbkJsb2NraW5nUmVh
ZChlcnJfZmgpCisKKyAgICBkZWYgX3BhcnNlTWVzc2FnZShzZWxmLCBpc0Jsb2NraW5nPUZhbHNl
KToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGRhdGEgPSBbXQorICAgICAgICAg
ICAgaWYgc2VsZi5fdXNlX3dpbjMyX2FwaXM6CisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYu
X3dpbjMyc3RkQmxvY2soKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkYXRh
ID0gc2VsZi5fdW5peHN0ZEJsb2NrKCkKKyAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAg
ICAgICAgc2VsZi5fc3Rkb3V0U3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAgICAg
ICAgICAgc2VsZi5fc3Rkb3V0U3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICBkYXRhID0g
W10KKyAgICAgICAgICAgIGlmIHNlbGYuX3VzZV93aW4zMl9hcGlzOgorICAgICAgICAgICAgICAg
IGRhdGEgPSBzZWxmLl93aW4zMmVyckJsb2NrKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICAgICAgZGF0YSA9IHNlbGYuX3VuaXhlcnJCbG9jaygpCisgICAgICAgICAgICBpZiBkYXRh
OgorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5E
KQorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS53cml0ZShkYXRhKQorICAgICAg
ICAgICAgaWYgbm90IGlzQmxvY2tpbmc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAg
cmV0dXJuIEZhbHNlCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9yZWxheXNl
cnZlcl90ZXN0Y2FzZS5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9yZWxheXNlcnZlcl90ZXN0Y2FzZS5weQkobm9uZXhpc3RlbnQpCisrKyBUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9yZWxheXNlcnZlcl90ZXN0Y2FzZS5weQkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDEyOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
IyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworaW1wb3J0IGVycm5vCitpbXBvcnQgaW8KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB0aW1lCisK
K2Zyb20gd2Via2l0cHkuY29tbW9uLnJlbGF5c2VydmVyIGltcG9ydCBBYnN0cmFjdFBpcGUKKwor
CitjbGFzcyBEdW1teVByb2Nlc3NQaXBlKEFic3RyYWN0UGlwZSk6CisKKyAgICBkZWYgX19pbml0
X18oc2VsZiwgcG9ydD1Ob25lLCBjbWQ9Tm9uZSwgZW52aXJvPU5vbmUsIHVuaV9uZXdsaW5lcz1G
YWxzZSk6CisgICAgICAgIEFic3RyYWN0UGlwZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxm
Ll9wb3J0ID0gcG9ydAorICAgICAgICBpZiBzZWxmLl9wb3J0OgorICAgICAgICAgICAgc2VsZi5f
aG9zdCA9IHNlbGYuX3BvcnQuaG9zdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5f
aG9zdCA9IE5vbmUKKyAgICAgICAgc2VsZi5jb25uZWN0ZWRGb3JUZXN0aW5nID0gVHJ1ZQorCisg
ICAgZGVmIHBpZChzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBpc0Nvbm5lY3Rl
ZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGVkRm9yVGVzdGluZworCisgICAg
ZGVmIHNlbmQoc2VsZiwgYnl0ZXMpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0ZWRGb3JU
ZXN0aW5nCisKKyAgICBkZWYgX3BhcnNlTWVzc2FnZShzZWxmLCBpc0Jsb2NraW5nPUZhbHNlKToK
KyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcHVzaERhdGFGb3JUZXN0aW5nKHNlbGYs
IGRhdGEsIHN0ZGVycj1GYWxzZSwgc3Rkb3V0PVRydWUpOgorICAgICAgICBpZiBzdGRlcnI6Cisg
ICAgICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VORCkKKyAgICAg
ICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICBlbGlmIHN0ZG91
dDoKKyAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQor
ICAgICAgICAgICAgc2VsZi5fc3Rkb3V0U3RyZWFtLndyaXRlKGRhdGEpCisKKworY2xhc3MgVENQ
Q2xpZW50KG9iamVjdCk6CisKKyAgICBCVUZGRVIgPSA0MDk2CisKKyAgICBkZWYgX19pbml0X18o
c2VsZiwgcG9ydD01MDAwLCBhZGRyZXNzPScxMjcuMC4wLjEnKToKKyAgICAgICAgc2VsZi5fcG9y
dCA9IHBvcnQKKyAgICAgICAgc2VsZi5fYWRkcmVzcyA9IGFkZHJlc3MKKyAgICAgICAgc2VsZi5f
Y29ubmVjdGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IHNvY2tldC5zb2Nr
ZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5fc3Ry
ZWFtID0gaW8uQnl0ZXNJTygpCisgICAgICAgIHNlbGYuX3N0cmVhbVRyYyA9IDAKKworICAgIGRl
ZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmRpc2Nvbm5lY3QoKQorCisgICAgZGVmIGNv
bm5lY3Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2Nvbm5lY3RlZDoKKyAgICAgICAgICAgIHJl
dHVybiBUcnVlCisgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uY29ubmVjdCgoc2VsZi5fYWRkcmVz
cywgc2VsZi5fcG9ydCkpCisgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IFRydWUKKworICAgIGRl
ZiBkaXNjb25uZWN0KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fY29ubmVjdGVkOgorICAg
ICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uY2xvc2UoKQorICAgICAg
ICBzZWxmLl9jb25uZWN0ZWQgPSBGYWxzZQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGlzQmxv
Y2tpbmc9RmFsc2UpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5fc3Ry
ZWFtLnNlZWsoc2VsZi5fc3RyZWFtVHJjLCBpby5TRUVLX1NFVCkKKyAgICAgICAgICAgIGRhdGEg
PSBzZWxmLl9zdHJlYW0ucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgZGF0YSBhbmQgZGF0YVst
MV0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9zdHJlYW1UcmMgPSBzZWxmLl9zdHJl
YW1UcmMgKyBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICAg
ICAgYmxvY2sgPSBzZWxmLnJlYWQoKQorICAgICAgICAgICAgaWYgYmxvY2s6CisgICAgICAgICAg
ICAgICAgc2VsZi5fc3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAgICAgICAgICAg
c2VsZi5fc3RyZWFtLndyaXRlKGJsb2NrKQorICAgICAgICAgICAgaWYgbm90IGlzQmxvY2tpbmc6
CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBy
ZWFkKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fY29ubmVj
dGlvbi5yZWN2KHNlbGYuQlVGRkVSKQorICAgICAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZGF0YQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAg
ICAgICAgZXJyID0gZS5hcmdzWzBdCisgICAgICAgICAgICBpZiBlcnIgPT0gZXJybm8uRUFHQUlO
IG9yIGVyciA9PSBlcnJuby5FV09VTERCTE9DSzoKKyAgICAgICAgICAgICAgICByZXR1cm4gW10K
KyAgICAgICAgc2VsZi5kaXNjb25uZWN0KCkKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYg
c2VuZChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2Nvbm5lY3RlZDoKKyAgICAg
ICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzZWxmLl9jb25uZWN0aW9uLnNlbmQoZGF0YSkK
KyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwb3J0KHNlbGYpOgorICAgICAgICByZXR1
cm4gc2VsZi5fcG9ydAorCisgICAgZGVmIGlzQ29ubmVjdGVkKHNlbGYpOgorICAgICAgICByZXR1
cm4gc2VsZi5fY29ubmVjdGVkCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9y
ZWxheXNlcnZlcl91bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9yZWxheXNlcnZlcl91bml0dGVzdC5weQkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9yZWxheXNlcnZlcl91bml0dGVzdC5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDI4MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFy
ZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisjIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworIyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisj
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworaW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAor
Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5yZWxheXNlcnZlciBpbXBvcnQgVENQU2VydmVyLCBSZWxh
eVNlcnZlcgorZnJvbSB3ZWJraXRweS5jb21tb24ucmVsYXlzZXJ2ZXJfdGVzdGNhc2UgaW1wb3J0
IER1bW15UHJvY2Vzc1BpcGUsIFRDUENsaWVudAorCisKK2RlZiBUQ1BDbGllbnRUZXN0aW5nVGhy
ZWFkKHNvdXJjZSwgcHJ0LCBhcmd1bWVudHMpOgorICAgIHNvdXJjZS5jbGllbnRSZXN1bHRzID0g
W10KKyAgICBjbGllbnQgPSBUQ1BDbGllbnQocHJ0KQorCisgICAgZGVhZGxpbmUgPSB0aW1lLnRp
bWUoKSArIDEuMAorICAgIHdoaWxlIHRpbWUudGltZSgpIDwgZGVhZGxpbmUgYW5kIG5vdCBjbGll
bnQuaXNDb25uZWN0ZWQoKToKKyAgICAgICAgY2xpZW50LmNvbm5lY3QoKQorICAgIGlmIG5vdCBj
bGllbnQuaXNDb25uZWN0ZWQoKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZWFkaW5nbW9k
ZSA9IEZhbHNlCisgICAgZm9yIGVsbSBpbiBhcmd1bWVudHM6CisgICAgICAgIGlmIGVsbSA9PSAn
LS1yZWFkJzoKKyAgICAgICAgICAgIHNvdXJjZS5jbGllbnRSZXN1bHRzLmFwcGVuZChjbGllbnQu
cmVhZGxpbmUoVHJ1ZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbGllbnQuc2VuZChl
bG0pCisgICAgY2xpZW50LmRpc2Nvbm5lY3QoKQorICAgIHJldHVybiBzb3VyY2UuY2xpZW50UmVz
dWx0cworCisKK2NsYXNzIFJlbGF5U2VydmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoUmVs
YXlTZXJ2ZXJUZXN0LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNl
bGYuY2xpZW50UmVzdWx0cyA9IFtdCisKKyAgICBkZWYgdGVzdF9hYnN0cmFjdHBpcGVfc3Rkb3V0
KHNlbGYpOgorICAgICAgICBwaXBlID0gRHVtbXlQcm9jZXNzUGlwZSgpCisKKyAgICAgICAgcGlw
ZS5wdXNoRGF0YUZvclRlc3RpbmcoJ2NvbWluZyBmcm9tIHN0ZG91dFxuJykKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbChwaXBlLnN0ZG91dFJlYWQoKSwgJ2NvbWluZyBmcm9tIHN0ZG91dFxuJykK
KworICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygnY29taW5nIGZyb20gc3RkZXJyXG4n
LCBzdGRlcnI9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlLnN0ZG91dFJlYWQo
KSwgW10pCisKKyAgICBkZWYgdGVzdF9hYnN0cmFjdHBpcGVfc3RkZXJyKHNlbGYpOgorICAgICAg
ICBwaXBlID0gRHVtbXlQcm9jZXNzUGlwZSgpCisKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRl
c3RpbmcoJ2NvbWluZyBmcm9tIHN0ZG91dFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChw
aXBlLnN0ZGVyclJlYWQoKSwgW10pCisKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3Rpbmco
J2NvbWluZyBmcm9tIHN0ZGVyclxuJywgc3RkZXJyPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwocGlwZS5zdGRlcnJSZWFkKCksICdjb21pbmcgZnJvbSBzdGRlcnJcbicpCisKKyAgICBk
ZWYgdGVzdF9hYnN0cmFjdHBpcGVfZHVlbF9zdHJlYW1zKHNlbGYpOgorICAgICAgICBwaXBlID0g
RHVtbXlQcm9jZXNzUGlwZSgpCisKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3RpbmcoJ2Nv
bWluZyBmcm9tIHN0ZG91dFxuJykKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3RpbmcoJ2Nv
bWluZyBmcm9tIHN0ZGVyclxuJywgc3RkZXJyPVRydWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChwaXBlLnJlYWRMaW5lKCksICdjb21pbmcgZnJvbSBzdGRlcnJcbicpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwocGlwZS5yZWFkTGluZSgpLCAnY29taW5nIGZyb20gc3Rkb3V0XG4nKQor
CisgICAgZGVmIHRlc3RfYWJzdHJhY3RwaXBlX3N0ZG91dGJsb2NrKHNlbGYpOgorICAgICAgICBw
aXBlID0gRHVtbXlQcm9jZXNzUGlwZSgpCisKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3Rp
bmcoJ3N0ZG91dCBsaW5lXG4nKQorICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygnc3Rk
b3V0IGJsb2NrJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGUucmVhZEJ1ZmZlclN0
ZG91dCgpLCAnc3Rkb3V0IGxpbmVcbnN0ZG91dCBibG9jaycpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwocGlwZS5yZWFkQnVmZmVyU3RkZXJyKCksICcnKQorCisgICAgZGVmIHRlc3RfYWJzdHJh
Y3RwaXBlX3N0ZGVycmJsb2NrKHNlbGYpOgorICAgICAgICBwaXBlID0gRHVtbXlQcm9jZXNzUGlw
ZSgpCisKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3RpbmcoJ3N0ZGVyciBsaW5lXG4nLCBz
dGRlcnI9VHJ1ZSkKKyAgICAgICAgcGlwZS5wdXNoRGF0YUZvclRlc3RpbmcoJ3N0ZGVyciBibG9j
aycsIHN0ZGVycj1UcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlwZS5yZWFkQnVm
ZmVyU3Rkb3V0KCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGUucmVhZEJ1ZmZl
clN0ZGVycigpLCAnc3RkZXJyIGxpbmVcbnN0ZGVyciBibG9jaycpCisKKyAgICBkZWYgdGVzdF9t
dWx0aXBvcnRfc2VydmVyKHNlbGYpOgorICAgICAgICBzZXJ2X29uZSA9IFJlbGF5U2VydmVyKCkK
KyAgICAgICAgc2Vydl90d28gPSBSZWxheVNlcnZlcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRG
YWxzZShzZXJ2X29uZS5wb3J0KCkgPT0gc2Vydl90d28ucG9ydCgpKQorICAgICAgICBzZWxmLmFz
c2VydEZhbHNlKHNlcnZfb25lLmlzQ29ubmVjdGVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFs
c2Uoc2Vydl90d28uaXNDb25uZWN0ZWQoKSkKKworICAgIGRlZiB0ZXN0X3RjcFNlcnZlcihzZWxm
KToKKyAgICAgICAgc2VydiA9IFRDUFNlcnZlcigpCisgICAgICAgIHRocmVhZCA9IHRocmVhZGlu
Zy5UaHJlYWQodGFyZ2V0PVRDUENsaWVudFRlc3RpbmdUaHJlYWQsIGFyZ3M9KHNlbGYsIHNlcnYu
cG9ydCgpLCBbJy0tcmVhZCcsICdMaW5lIDFcbicsICdMaW5lIDJcbicsICctLXJlYWQnXSkpCisg
ICAgICAgIHRocmVhZC5zdGFydCgpCisgICAgICAgIHNlcnYuY29ubmVjdCgpCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShzZXJ2LmlzQ29ubmVjdGVkKCkpCisKKyAgICAgICAgc2Vydi5zZW5kKCdT
ZXJ2ZXIgc2VuZCAxXG4nKQorICAgICAgICBzZXJ2LnNlbmQoJ1NlcnZlciBzZW5kIDJcbicpCisK
KyAgICAgICAgdGhyZWFkLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYucmVh
ZCgpLCAnTGluZSAxXG5MaW5lIDJcbicpCisgICAgICAgIHNlcnYuZGlzY29ubmVjdCgpCisKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnU2VydmVyIHNlbmQgMVxuJywgc2VsZi5jbGllbnRSZXN1
bHRzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdTZXJ2ZXIgc2VuZCAyXG4nLCBzZWxm
LmNsaWVudFJlc3VsdHNbMV0pCisKKyAgICBkZWYgdGVzdF9yZWxheVNlcnZlclN0ZG91dExpbmUo
c2VsZik6CisgICAgICAgIHNlcnYgPSBSZWxheVNlcnZlcigpCisgICAgICAgIHRocmVhZCA9IHRo
cmVhZGluZy5UaHJlYWQodGFyZ2V0PVRDUENsaWVudFRlc3RpbmdUaHJlYWQsIGFyZ3M9KHNlbGYs
IHNlcnYucG9ydCgpLCBbCisgICAgICAgICAgICAnLS1yZWFkJywKKyAgICAgICAgICAgICc8c3Rk
b3V0PkxpbmUgMVxuJywKKyAgICAgICAgICAgICdMaW5lIDJcbicsCisgICAgICAgICAgICAnPHN0
ZGVycj5MaW5lIGVyciAxXG4nLAorICAgICAgICAgICAgJzxzdGRvdXQ+TGluZSAzXG4nLAorICAg
ICAgICAgICAgJzxzdGQnLAorICAgICAgICAgICAgJ291dD5MaW5lIDRcbicsCisgICAgICAgICAg
ICAnLS1yZWFkJywKKyAgICAgICAgXSkpCisgICAgICAgIHRocmVhZC5zdGFydCgpCisgICAgICAg
IHNlcnYuY29ubmVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXJ2LmlzQ29ubmVjdGVk
KCkpCisKKyAgICAgICAgc2Vydi5zZW5kKCdTZXJ2ZXIgc2VuZCAxXG4nKQorICAgICAgICBzZXJ2
LnNlbmQoJ1NlcnZlciBzZW5kIDJcbicpCisKKyAgICAgICAgdGhyZWFkLmpvaW4oKQorCisgICAg
ICAgIGxpbmUgPSBbXQorICAgICAgICBkZWFkbGluZSA9IHRpbWUudGltZSgpICsgMS4wCisgICAg
ICAgIHdoaWxlIHRpbWUudGltZSgpIDwgZGVhZGxpbmUgYW5kIG5vdCBsaW5lOgorICAgICAgICAg
ICAgbGluZSA9IHNlcnYuc3Rkb3V0UmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlu
ZSwgJ0xpbmUgMVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQo
KSwgJ0xpbmUgMlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQo
KSwgJ0xpbmUgM1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQo
KSwgJ0xpbmUgNFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZGVyclJlYWQo
KSwgJ0xpbmUgZXJyIDFcbicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91
dFJlYWQoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCks
IFtdKQorICAgICAgICBzZXJ2LmRpc2Nvbm5lY3QoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoJ1NlcnZlciBzZW5kIDFcbicsIHNlbGYuY2xpZW50UmVzdWx0c1swXSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbCgnU2VydmVyIHNlbmQgMlxuJywgc2VsZi5jbGllbnRSZXN1bHRzWzFdKQor
CisgICAgZGVmIHRlc3RfcmVsYXlTZXJ2ZXJTdGRlcnJMaW5lKHNlbGYpOgorICAgICAgICBzZXJ2
ID0gUmVsYXlTZXJ2ZXIoKQorICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdl
dD1UQ1BDbGllbnRUZXN0aW5nVGhyZWFkLCBhcmdzPShzZWxmLCBzZXJ2LnBvcnQoKSwgWworICAg
ICAgICAgICAgJzxzdGRlcnI+TGluZSAxXG4nLAorICAgICAgICAgICAgJ0xpbmUgMlxuJywKKyAg
ICAgICAgICAgICc8c3Rkb3V0PkxpbmUgb3V0IDFcbicsCisgICAgICAgICAgICAnPHN0ZGVycj5M
aW5lIDNcbicsCisgICAgICAgICAgICAnPHN0ZCcsCisgICAgICAgICAgICAnZXJyPkxpbmUgNFxu
JywKKyAgICAgICAgXSkpCisgICAgICAgIHRocmVhZC5zdGFydCgpCisgICAgICAgIHNlcnYuY29u
bmVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXJ2LmlzQ29ubmVjdGVkKCkpCisKKyAg
ICAgICAgdGhyZWFkLmpvaW4oKQorCisgICAgICAgIGxpbmUgPSBbXQorICAgICAgICBkZWFkbGlu
ZSA9IHRpbWUudGltZSgpICsgMS4wCisgICAgICAgIHdoaWxlIHRpbWUudGltZSgpIDwgZGVhZGxp
bmUgYW5kIG5vdCBsaW5lOgorICAgICAgICAgICAgbGluZSA9IHNlcnYuc3RkZXJyUmVhZCgpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgJ0xpbmUgMVxuJykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZXJ2LnN0ZGVyclJlYWQoKSwgJ0xpbmUgMlxuJykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZXJ2LnN0ZGVyclJlYWQoKSwgJ0xpbmUgM1xuJykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZXJ2LnN0ZGVyclJlYWQoKSwgJ0xpbmUgNFxuJykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQoKSwgJ0xpbmUgb3V0IDFcbicpCisKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQoKSwgW10pCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCksIFtdKQorICAgICAgICBzZXJ2LmRpc2Nvbm5lY3Qo
KQorCisgICAgZGVmIHRlc3RfcmVsYXlTZXJ2ZXJNaXhlZExpbmUoc2VsZik6CisgICAgICAgIHNl
cnYgPSBSZWxheVNlcnZlcigpCisgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFy
Z2V0PVRDUENsaWVudFRlc3RpbmdUaHJlYWQsIGFyZ3M9KHNlbGYsIHNlcnYucG9ydCgpLCBbCisg
ICAgICAgICAgICAnPHN0ZG91dD5PdXQnLAorICAgICAgICAgICAgJzxzdGRlcnI+RXJyIDFcbics
CisgICAgICAgICAgICAnPHN0ZG91dD4gMVxuJywKKyAgICAgICAgICAgICdPdXQgMlxuJywKKyAg
ICAgICAgICAgICc8c3RkZXJyPkVycicsCisgICAgICAgICAgICAnPHN0ZG91dD5PdXQgM1xuJywK
KyAgICAgICAgICAgICc8c3RkZXJyPiAyXG4nLAorICAgICAgICBdKSkKKyAgICAgICAgdGhyZWFk
LnN0YXJ0KCkKKyAgICAgICAgc2Vydi5jb25uZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVl
KHNlcnYuaXNDb25uZWN0ZWQoKSkKKworICAgICAgICB0aHJlYWQuam9pbigpCisKKyAgICAgICAg
bGluZSA9IFtdCisgICAgICAgIGRlYWRsaW5lID0gdGltZS50aW1lKCkgKyAxLjAKKyAgICAgICAg
d2hpbGUgdGltZS50aW1lKCkgPCBkZWFkbGluZSBhbmQgbm90IGxpbmU6CisgICAgICAgICAgICBs
aW5lID0gc2Vydi5zdGRvdXRSZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCAn
T3V0IDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRvdXRSZWFkKCksICdP
dXQgMlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQoKSwgJ091
dCAzXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYuc3RkZXJyUmVhZCgpLCAnRXJy
IDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCksICdFcnIg
MlxuJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYuc3Rkb3V0UmVhZCgpLCBbXSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZGVyclJlYWQoKSwgW10pCisgICAgICAg
IHNlcnYuZGlzY29ubmVjdCgpCisKKyAgICBkZWYgdGVzdF9yZWxheVNlcnZlclN0ZG91dEJsb2Nr
KHNlbGYpOgorICAgICAgICBzZXJ2ID0gUmVsYXlTZXJ2ZXIoKQorICAgICAgICB0aHJlYWQgPSB0
aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1UQ1BDbGllbnRUZXN0aW5nVGhyZWFkLCBhcmdzPShzZWxm
LCBzZXJ2LnBvcnQoKSwgWworICAgICAgICAgICAgJzxzdGRvdXQ+SGVyZSBpcyBhbiBvdXQgYmxv
Y2soMjQpJywKKyAgICAgICAgICAgICc8c3RkZXJyPkVyciAxXG4nLAorICAgICAgICAgICAgJzxz
dGRvdXQ+RmluaXNoaW5nIG91dCBibG9jaygyMyknLAorICAgICAgICAgICAgJ091dCAxXG4nLAor
ICAgICAgICAgICAgJzxzdGRlcnI+RXJyIDJcbicsCisgICAgICAgIF0pKQorICAgICAgICB0aHJl
YWQuc3RhcnQoKQorICAgICAgICBzZXJ2LmNvbm5lY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRy
dWUoc2Vydi5pc0Nvbm5lY3RlZCgpKQorCisgICAgICAgIHRocmVhZC5qb2luKCkKKworICAgICAg
ICBsaW5lID0gW10KKyAgICAgICAgZGVhZGxpbmUgPSB0aW1lLnRpbWUoKSArIDEuMAorICAgICAg
ICB3aGlsZSB0aW1lLnRpbWUoKSA8IGRlYWRsaW5lIGFuZCBub3QgbGluZToKKyAgICAgICAgICAg
IGxpbmUgPSBzZXJ2LnN0ZGVyclJlYWQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlu
ZSwgJ0VyciAxXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYucmVhZEJsb2NrU3Rk
b3V0KDQ3KSwgJ0hlcmUgaXMgYW4gb3V0IGJsb2NrKDI0KUZpbmlzaGluZyBvdXQgYmxvY2soMjMp
JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQoKSwgJ091dCAxXG4n
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYuc3RkZXJyUmVhZCgpLCAnRXJyIDJcbicp
CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnJlYWRCdWZmZXJTdGRvdXQoKSwgJycp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5yZWFkQnVmZmVyU3RkZXJyKCksICcnKQor
ICAgICAgICBzZXJ2LmRpc2Nvbm5lY3QoKQorCisgICAgZGVmIHRlc3RfcmVsYXlTZXJ2ZXJTdGRl
cnJCbG9jayhzZWxmKToKKyAgICAgICAgc2VydiA9IFJlbGF5U2VydmVyKCkKKyAgICAgICAgdGhy
ZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9VENQQ2xpZW50VGVzdGluZ1RocmVhZCwgYXJn
cz0oc2VsZiwgc2Vydi5wb3J0KCksIFsKKyAgICAgICAgICAgICc8c3RkZXJyPkhlcmUgaXMgYW4g
ZXJyIGJsb2NrKDI0KScsCisgICAgICAgICAgICAnPHN0ZG91dD5PdXQgMVxuJywKKyAgICAgICAg
ICAgICc8c3RkZXJyPkZpbmlzaGluZyBlcnIgYmxvY2soMjMpJywKKyAgICAgICAgICAgICdFcnIg
MVxuJywKKyAgICAgICAgICAgICc8c3Rkb3V0Pk91dCAyXG4nLAorICAgICAgICBdKSkKKyAgICAg
ICAgdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgc2Vydi5jb25uZWN0KCkKKyAgICAgICAgc2VsZi5h
c3NlcnRUcnVlKHNlcnYuaXNDb25uZWN0ZWQoKSkKKworICAgICAgICB0aHJlYWQuam9pbigpCisK
KyAgICAgICAgbGluZSA9IFtdCisgICAgICAgIGRlYWRsaW5lID0gdGltZS50aW1lKCkgKyAxLjAK
KyAgICAgICAgd2hpbGUgdGltZS50aW1lKCkgPCBkZWFkbGluZSBhbmQgbm90IGxpbmU6CisgICAg
ICAgICAgICBsaW5lID0gc2Vydi5zdGRvdXRSZWFkKCkKKworICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKGxpbmUsICdPdXQgMVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnJlYWRC
bG9ja1N0ZGVycig0NyksICdIZXJlIGlzIGFuIGVyciBibG9jaygyNClGaW5pc2hpbmcgZXJyIGJs
b2NrKDIzKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5zdGRlcnJSZWFkKCksICdF
cnIgMVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnN0ZG91dFJlYWQoKSwgJ091
dCAyXG4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vydi5yZWFkQnVmZmVyU3Rkb3V0
KCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnYucmVhZEJ1ZmZlclN0ZGVycigp
LCAnJykKKyAgICAgICAgc2Vydi5kaXNjb25uZWN0KCkKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvc3R5bGUvY2hlY2tlcnMvcHl0aG9uLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvc3R5bGUvY2hlY2tlcnMvcHl0aG9uLnB5CShyZXZpc2lvbiAyMDgzOTApCisr
KyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3N0eWxlL2NoZWNrZXJzL3B5dGhvbi5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMTAzLDcgKzEwMyw3IEBAIGNsYXNzIFB5bGludGVyKG9iamVjdCk6CiAKICAg
ICBkZWYgcnVuKHNlbGYsIGFyZ3YpOgogICAgICAgICBvdXRwdXQgPSBfRmlsdGVyZWRTdHJpbmdJ
TyhzZWxmLkZBTFNFX1BPU0lUSVZFUykKLSAgICAgICAgbGludC5SdW4oWyctLXJjZmlsZScsIHNl
bGYuX3B5bGludHJjXSArIGFyZ3YsIHJlcG9ydGVyPVBhcnNlYWJsZVRleHRSZXBvcnRlcihvdXRw
dXQ9b3V0cHV0KSwgZXhpdD1GYWxzZSkKKyAgICAgICAgbGludC5SdW4oWyctLWlnbm9yZWQtY2xh
c3Nlcz1fc29ja2V0b2JqZWN0JywgJy0tcmNmaWxlJywgc2VsZi5fcHlsaW50cmNdICsgYXJndiwg
cmVwb3J0ZXI9UGFyc2VhYmxlVGV4dFJlcG9ydGVyKG91dHB1dD1vdXRwdXQpLCBleGl0PUZhbHNl
KQogICAgICAgICByZXR1cm4gb3V0cHV0CiAKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>294942</attachid>
            <date>2016-11-16 08:55:46 -0800</date>
            <delta_ts>2016-11-29 12:00:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-164338-20161116085549.patch</filename>
            <type>text/plain</type>
            <size>28444</size>
            <attacher name="Jonathan Bedard">jbedard</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDIwODc5MikKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDczIEBACisyMDE2LTExLTE2ICBKb25hdGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNv
bT4KKworICAgICAgICBBZGQgVENQIHNlcnZlciB0byB3ZWJraXRweSBmb3Igb24gZGV2aWNlIHRl
c3RpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2
NDMzOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRo
aXMgcGF0Y2ggYWRkcyBhIFRDUCBzZXJ2ZXIgdG8gd2Via2l0cHkgZm9yIGV2ZW50dWFsIG9uLWRl
dmljZSB0ZXN0aW5nLgorICAgICAgICBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgY2hhbmdlcyBpbiB0
aGlzIHBhdGNoIGFyZSB0aGUgYmVnaW5uaW5ncyBvZiBhIG1pbm9yIHJlZmFjdG9yIG1lYW50IHRv
IHJlcGxhY2UgY29kZSBpbiBwb3J0L3NlcnZlcl9wcm9jZXNzLnB5LgorCisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vcmVsYXlzZXJ2ZXIucHk6IEFkZGVkLgorICAgICAgICAoVENQ
U2VydmVyKTogU2luZ2xlLXBvcnQgVENQIHNlcnZlci4KKyAgICAgICAgKFRDUFNlcnZlci5fX2lu
aXRfXyk6IENvbnN0cnVjdCBUQ1Agc2VydmVyIHdpdGggcG9ydCwgaWYgYXBwbGljYWJsZS4KKyAg
ICAgICAgKFRDUFNlcnZlci5fX2RlbF9fKTogQ2FsbCBzaHV0ZG93biB3aGVuIGRlbGV0ZWQuCisg
ICAgICAgIChUQ1BTZXJ2ZXIuY29ubmVjdCk6IEJsb2NrIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24u
CisgICAgICAgIChUQ1BTZXJ2ZXIuZGlzY29ubmVjdCk6IERpc2Nvbm5lY3Qgc2luZ2xlIGNvbm5l
Y3Rpb24uCisgICAgICAgIChUQ1BTZXJ2ZXIucmVhZCk6IFJlYWQgZnJvbSBjb25uZWN0ZWQgc2Vy
dmVyLgorICAgICAgICAoVENQU2VydmVyLnNlbmQpOiBTZW5kIGRhdGEgdG8gY2xpZW50LgorICAg
ICAgICAoVENQU2VydmVyLnBvcnQpOiBQb3J0IHZhbHVlIGFjY2Vzc29yLgorICAgICAgICAoVENQ
U2VydmVyLmlzQ29ubmVjdGVkKTogQ29ubmVjdGlvbiBhY2Nlc3Nvci4KKyAgICAgICAgKEFic3Ry
YWN0UGlwZSk6IEJhc2UgY2xhc3Mgb2YgcGlwZS1saWtlIG9iamVjdHMgd2l0aCBzdGRpbiwgc3Rk
b3V0IGFuZCBzdGRlcnIuCisgICAgICAgIChBYnN0cmFjdFBpcGUuX19pbml0X18pOiBDb25zdHJ1
Y3Rvci4KKyAgICAgICAgKEFic3RyYWN0UGlwZS5jbGVhbik6IFJlLWNvbnN0cnVjdCBpbnB1dCBz
dHJlYW1zLCBwcmV2ZW50cyBkYXRhIG92ZXJmbG93LgorICAgICAgICAoQWJzdHJhY3RQaXBlLnNl
bmQpOiBBYnN0cmFjdCBmdW5jdGlvbiB0byBzZW5kIGRhdGEgdG8gY2xpZW50LgorICAgICAgICAo
QWJzdHJhY3RQaXBlLmlzQ29ubmVjdGVkKTogQWJzdHJhY3QgY29ubmVjdGlvbiBhY2Nlc3Nvci4K
KyAgICAgICAgKEFic3RyYWN0UGlwZS5fcGFyc2VNZXNzYWdlKTogQWJzdHJhY3QgZnVuY3Rpb24g
Y2FsbGVkIGluIGF0dGVtcHRzIHRvIGZpbGwgaW5wdXQgc3RyZWFtcy4KKyAgICAgICAgKEFic3Ry
YWN0UGlwZS5yZWFkTGluZSk6IFJlYWQgc2luZ2xlIGxpbmUgZnJvbSBlaXRoZXIgc3RyZWFtLgor
ICAgICAgICAoQWJzdHJhY3RQaXBlLnN0ZG91dFJlYWQpOiBSZWFkIHNpbmdsZSBsaW5lIGZyb20g
c3Rkb3V0LgorICAgICAgICAoQWJzdHJhY3RQaXBlLnN0ZGVyclJlYWQpOiBSZWFkIHNpbmdsZSBs
aW5lIGZyb20gc3RkZXJyLgorICAgICAgICAoQWJzdHJhY3RQaXBlLnJlYWRCdWZmZXJTdGRvdXQp
OiBSZWFkIGFsbCBvZiBzdGRvdXQuCisgICAgICAgIChBYnN0cmFjdFBpcGUucmVhZEJ1ZmZlclN0
ZGVycik6IFJlYWQgYWxsIG9mIHN0ZGVyci4KKyAgICAgICAgKEFic3RyYWN0UGlwZS5yZWFkQmxv
Y2tTdGRvdXQpOiBSZWFkIGJsb2NrIG9mIHNpemUgZnJvbSBzdGRvdXQuCisgICAgICAgIChBYnN0
cmFjdFBpcGUucmVhZEJsb2NrU3RkZXJyKTogUmVhZCBibG9jayBvZiBzaXplIGZyb20gc3RkZXJy
LgorICAgICAgICAoUmVsYXlTZXJ2ZXIpOiBUQ1Agc2VydmVyIGltcGxlbWVudGF0aW9uIG9mIHBy
b2Nlc3MgcGlwZS4KKyAgICAgICAgKFJlbGF5U2VydmVyLl9faW5pdF9fKTogQ29uc3RydWN0IDMg
VENQIHNlcnZlcnMgZm9yIDMgc3RyZWFtcy4KKyAgICAgICAgKFJlbGF5U2VydmVyLmNvbm5lY3Qp
OiBXYWl0IGZvciBjb25uZWN0aW9uIG9uIGFsbCAzIHNlcnZlcnMuCisgICAgICAgIChSZWxheVNl
cnZlci5kaXNjb25uZWN0KTogRGlzY29ubmVjdCBhbGwgMyBzZXJ2ZXJzLgorICAgICAgICAoUmVs
YXlTZXJ2ZXIuaXNDb25uZWN0ZWQpOiBDaGVjayBpZiBhbGwgMyBzZXJ2ZXJzIGFyZSBjb25uZWN0
ZWQuCisgICAgICAgIChSZWxheVNlcnZlci5wb3J0cyk6IEFjY2VzcyBhcnJheSBvZiAzIHBvcnRz
IHVzZWQuCisgICAgICAgIChSZWxheVNlcnZlci5fcGFyc2VNZXNzYWdlKTogUG9wdWxhdGUgc3Rk
b3V0IGFuZCBzdGRlcnIgYnVmZmVycyB3aXRoIGRhdGEgZnJvbSBzZXJ2ZXJzLgorICAgICAgICAo
UmVsYXlTZXJ2ZXIuc2VuZCk6IFNlbmQgZGF0YSB0aHJvdWdoIHN0ZGluIHNlcnZlci4KKyAgICAg
ICAgKFByb2Nlc3NQaXBlKTogUG9wZW4gaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcyBwaXBlLgor
ICAgICAgICAoUHJvY2Vzc1BpcGUuX19pbml0X18pOiBTdGFydCBwcm9jZXNzLgorICAgICAgICAo
UHJvY2Vzc1BpcGUuX19kZWxfXyk6IENsb3NlIHByb2Nlc3MuCisgICAgICAgIChQcm9jZXNzUGlw
ZS5waWQpOiBBY2Nlc3MgcGlkIG9mIHByb2Nlc3MuCisgICAgICAgIChQcm9jZXNzUGlwZS5pc0Nv
bm5lY3RlZCk6IFRydWUgaXMgcHJvY2VzcyBoYXMgbm90IGNyYXNoZWQuCisgICAgICAgIChQcm9j
ZXNzUGlwZS5oYW5kbGVfaW50ZXJydXB0KTogSGFuZGxlIGludGVydXB0IGNhc2UuCisgICAgICAg
IChQcm9jZXNzUGlwZS5zZW5kKTogU2VuZCBkYXRhIHRocm91Z2ggc3RkaW4uCisgICAgICAgIChQ
cm9jZXNzUGlwZS5fdW5peHN0ZEJsb2NrKTogUmVhZCBkYXRhIGZyb20gc3RkaW4gZm9yIFVuaXgu
CisgICAgICAgIChQcm9jZXNzUGlwZS5fdW5peGVyckJsb2NrKTogUmVhZCBkYXRhIGZyb20gc3Rk
ZXJyIGZvciBVbml4LgorICAgICAgICAoUHJvY2Vzc1BpcGUuX3dpbjMyTm9uQmxvY2tpbmdSZWFk
KTogUmVhZCBkYXRhIGZyb20gcHJvdmlkZWQgV2luZG93cyBoYW5kbGUuCisgICAgICAgIChQcm9j
ZXNzUGlwZS5fd2luMzJzdGRCbG9jayk6IFJlYWQgZGF0YSBmcm9tIHN0ZGluIGZvciBXaW5kb3dz
LgorICAgICAgICAoUHJvY2Vzc1BpcGUuX3dpbjMyZXJyQmxvY2spOiBSZWFkIGRhdGEgZnJvbSBz
dGRlcnIgZm9yIFdpbmRvd3MuCisgICAgICAgIChQcm9jZXNzUGlwZS5fcGFyc2VNZXNzYWdlKTog
UG9wdWxhdGUgc3Rkb3V0IGFuZCBzdGRlcnIgYnVmZmVycyB3aXRoIGRhdGEgZnJvbSBzZXJ2ZXJz
LgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyX3Rlc3RjYXNl
LnB5OiBBZGRlZC4KKyAgICAgICAgKER1bW15UHJvY2Vzc1BpcGUpOiBEdW1teSBwaXBlIGZvciB0
ZXN0aW5nCisgICAgICAgIChUQ1BDbGllbnQpOiBUQ1AgY2xpZW50IGZvciB0ZXN0aW5nCisgICAg
ICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vcmVsYXlzZXJ2ZXJfdW5pdHRlc3QucHk6IEFk
ZGVkLgorICAgICAgICAoVENQQ2xpZW50VGVzdGluZ1RocmVhZCk6IE5lZWRlZCBmb3IgdGVzdGlu
ZyBUQ1Agc2VydmVycy4KKyAgICAgICAgKFJlbGF5U2VydmVyVGVzdCk6IFVuaXQgdGVzdHMgZm9y
IHRoZSBUQ1BTZXJ2ZXIsIEFic3RyYWN0UGlwZSBhbmQgUmVsYXlTZXJ2ZXIuCisgICAgICAgIChS
ZWxheVNlcnZlclRlc3QudGVzdF9hYnN0cmFjdHBpcGVfc3Rkb3V0KTogVGVzdGluZyBzdGRvdXQg
YWNjZXNzLgorICAgICAgICAoUmVsYXlTZXJ2ZXJUZXN0LnRlc3RfYWJzdHJhY3RwaXBlX3N0ZGVy
cik6IFRlc3Rpbmcgc3RkZXJyIGFjY2Vzcy4KKyAgICAgICAgKFJlbGF5U2VydmVyVGVzdC50ZXN0
X2Fic3RyYWN0cGlwZV9kdWVsX3N0cmVhbXMpOiBUZXN0aW5nIGNvbWJpbmVkIGFjY2Vzcy4KKyAg
ICAgICAgKFJlbGF5U2VydmVyVGVzdC50ZXN0X2Fic3RyYWN0cGlwZV9zdGRvdXRibG9jayk6IFRl
c3RpbmcgcmVhZGluZyBhIGJsb2NrIG9mIGRhdGEgZnJvbSBzdGRvdXQuCisgICAgICAgIChSZWxh
eVNlcnZlclRlc3QudGVzdF9hYnN0cmFjdHBpcGVfc3RkZXJyYmxvY2spOiBUZXN0aW5nIHJlYWRp
bmcgYSBibG9jayBvZiBkYXRhIGZyb20gc3RkZXJyLgorICAgICAgICAoUmVsYXlTZXJ2ZXJUZXN0
LnRlc3RfbXVsdGlwb3J0X3NlcnZlcik6IENvbnN0cnVjdCB0d28gUmVsYXlTZXJ2ZXJzIGFuZCB0
ZXN0IGZvciBleHBlY3RlZCB2YWx1ZXMuCisgICAgICAgIChSZWxheVNlcnZlclRlc3QudGVzdF90
Y3BTZXJ2ZXIpOiBUZXN0IFRDUCBzZXJ2ZXIuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9z
dHlsZS9jaGVja2Vycy9weXRob24ucHk6CisgICAgICAgIChQeWxpbnRlci5ydW4pOiBMaW50ZXIg
Zml4IGZvciBzb2NrZXRzLgorCiAyMDE2LTExLTE2ICBQZXIgQXJuZSBWb2xsYW4gIDxwdm9sbGFu
QGFwcGxlLmNvbT4KIAogICAgICAgICBbV2luXSBXZWJDb3JlIHRlc3QgaXMgZmFpbGluZy4KSW5k
ZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5CShub25l
eGlzdGVudCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyLnB5
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAxIEBACisjIENvcHlyaWdodCAoQykgMjAxNiBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisjIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitpbXBvcnQgZXJybm8KK2ltcG9ydCBpbworaW1wb3J0IFF1ZXVlCitp
bXBvcnQgc2VsZWN0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCisK
K2lmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICBpbXBvcnQgbXN2Y3J0Cisg
ICAgaW1wb3J0IHdpbjMycGlwZQorICAgIGltcG9ydCB3aW4zMmZpbGUKK2Vsc2U6CisgICAgaW1w
b3J0IGZjbnRsCisgICAgaW1wb3J0IG9zCisKKworY2xhc3MgVENQU2VydmVyKG9iamVjdCk6CisK
KyAgICBCVUZGRVIgPSA0MDk2CisgICAgUE9SVF9SQU5HRSA9IFs1MDAwLCAxMDAwMF0KKworICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0PUZhbHNlKToKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBv
cnQKKyAgICAgICAgc2VsZi5faG9zdCA9ICcnCisgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IEZh
bHNlCisKKyAgICAgICAgc2VsZi5fc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5F
VCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLl9zb2NrZXQuc2V0c29ja29wdChz
b2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc2VsZi5f
c29ja2V0LnNldHRpbWVvdXQoMTUpCisgICAgICAgIGlmIHBvcnQ6CisgICAgICAgICAgICBzZWxm
Ll9zb2NrZXQuYmluZCgoc2VsZi5faG9zdCwgc2VsZi5fcG9ydCkpCisgICAgICAgICAgICByZXR1
cm4KKyAgICAgICAgc2VsZi5fcG9ydCA9IChvcy5nZXRwaWQoKSAlIChzZWxmLlBPUlRfUkFOR0Vb
MV0gLSBzZWxmLlBPUlRfUkFOR0VbMF0pKSArIHNlbGYuUE9SVF9SQU5HRVswXQorICAgICAgICB1
cHBlcl9ib3VuZCA9IHNlbGYuUE9SVF9SQU5HRVsxXSAtIHNlbGYuUE9SVF9SQU5HRVswXQorICAg
ICAgICBmb3IgcG9ydCBpbiByYW5nZShzZWxmLl9wb3J0LCBzZWxmLl9wb3J0ICsgdXBwZXJfYm91
bmQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3NvY2tldC5iaW5k
KChzZWxmLl9ob3N0LCBwb3J0KSkKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0ID0gcG9ydAor
ICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFz
IG1zZzoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBy
YWlzZSBFeGNlcHRpb24oJ1JhbiBvdXQgb2YgcG9ydHMgdG8gdHJ5IHRvIGJpbmQgdG8gZm9yIHRo
ZSBUQ1Agc2VydmVyLicpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5k
aXNjb25uZWN0KCkKKworICAgIGRlZiBjb25uZWN0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9j
b25uZWN0ZWQ6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBzZWxmLl9zb2NrZXQu
bGlzdGVuKDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24sIHNl
bGYuX2FkZHJlc3MgPSBzZWxmLl9zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgICAgIHNlbGYuX2Nv
bm5lY3Rpb24uc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IFRy
dWUKKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgcmV0dXJuIEZh
bHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZGlzY29ubmVjdChzZWxmKToKKyAg
ICAgICAgaWYgbm90IHNlbGYuX2Nvbm5lY3RlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAg
ICBzZWxmLl9zb2NrZXQuY2xvc2UoKQorICAgICAgICBzZWxmLl9jb25uZWN0ZWQgPSBGYWxzZQor
CisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBz
ZWxmLl9jb25uZWN0aW9uLnJlY3Yoc2VsZi5CVUZGRVIpCisgICAgICAgICAgICBpZiBkYXRhOgor
ICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3Is
IGU6CisgICAgICAgICAgICBlcnIgPSBlLmFyZ3NbMF0KKyAgICAgICAgICAgIGlmIGVyciA9PSBl
cnJuby5FQUdBSU4gb3IgZXJyID09IGVycm5vLkVXT1VMREJMT0NLOgorICAgICAgICAgICAgICAg
IHJldHVybiBbXQorICAgICAgICBzZWxmLmRpc2Nvbm5lY3QoKQorICAgICAgICByZXR1cm4gW10K
KworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3Qgc2VsZi5fY29ubmVj
dGVkOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24u
c2VuZChkYXRhKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBvcnQoc2VsZik6Cisg
ICAgICAgIHJldHVybiBzZWxmLl9wb3J0CisKKyAgICBkZWYgaXNDb25uZWN0ZWQoc2VsZik6Cisg
ICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0ZWQKKworCitjbGFzcyBBYnN0cmFjdFBpcGUob2Jq
ZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbGVhbigpCisK
KyAgICBkZWYgY2xlYW4oc2VsZik6CisgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbSA9IGlvLkJ5
dGVzSU8oKQorICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0gPSBpby5CeXRlc0lPKCkKKyAgICAg
ICAgc2VsZi5fc3Rkb3V0VHJjID0gMAorICAgICAgICBzZWxmLl9zdGRlcnJUcmMgPSAwCisKKyAg
ICBkZWYgc2VuZChzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYg
aXNDb25uZWN0ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9wYXJz
ZU1lc3NhZ2Uoc2VsZiwgaXNCbG9ja2luZz1GYWxzZSk6CisgICAgICAgIHJldHVybiBGYWxzZQor
CisgICAgZGVmIHJlYWRMaW5lKHNlbGYsIGlzQmxvY2tpbmc9RmFsc2UpOgorICAgICAgICB3aGls
ZSBUcnVlOgorICAgICAgICAgICAgZXJyID0gc2VsZi5zdGRlcnJSZWFkKCkKKyAgICAgICAgICAg
IGlmIGVycjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyCisgICAgICAgICAgICBvdXQgPSBz
ZWxmLnN0ZG91dFJlYWQoKQorICAgICAgICAgICAgaWYgb3V0OgorICAgICAgICAgICAgICAgIHJl
dHVybiBvdXQKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlTWVzc2FnZShpc0Jsb2NraW5nKQorICAg
ICAgICAgICAgaWYgbm90IGlzQmxvY2tpbmc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAg
ICAgcmV0dXJuIFtdCisKKyAgICBkZWYgc3Rkb3V0UmVhZChzZWxmLCBpc0Jsb2NraW5nPUZhbHNl
KToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5z
ZWVrKHNlbGYuX3N0ZG91dFRyYywgaW8uU0VFS19TRVQpCisgICAgICAgICAgICBkYXRhID0gc2Vs
Zi5fc3Rkb3V0U3RyZWFtLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGRhdGEgYW5kIGRhdGFb
LTFdID09ICdcbic6CisgICAgICAgICAgICAgICAgc2VsZi5fc3Rkb3V0VHJjID0gc2VsZi5fc3Rk
b3V0VHJjICsgbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAg
ICAgIHNlbGYuX3BhcnNlTWVzc2FnZShpc0Jsb2NraW5nKQorICAgICAgICAgICAgaWYgbm90IGlz
QmxvY2tpbmc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIFtdCisKKyAg
ICBkZWYgc3RkZXJyUmVhZChzZWxmLCBpc0Jsb2NraW5nPUZhbHNlKToKKyAgICAgICAgd2hpbGUg
VHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS5zZWVrKHNlbGYuX3N0ZGVyclRy
YywgaW8uU0VFS19TRVQpCisgICAgICAgICAgICBkYXRhID0gc2VsZi5fc3RkZXJyU3RyZWFtLnJl
YWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGRhdGEgYW5kIGRhdGFbLTFdID09ICdcbic6CisgICAg
ICAgICAgICAgICAgc2VsZi5fc3RkZXJyVHJjID0gc2VsZi5fc3RkZXJyVHJjICsgbGVuKGRhdGEp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlTWVz
c2FnZShpc0Jsb2NraW5nKQorICAgICAgICAgICAgaWYgbm90IGlzQmxvY2tpbmc6CisgICAgICAg
ICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgcmVhZEJ1ZmZlclN0
ZG91dChzZWxmKToKKyAgICAgICAgc2VsZi5fc3Rkb3V0U3RyZWFtLnNlZWsoMCwgaW8uU0VFS19F
TkQpCisgICAgICAgIGVuZFZhbCA9IHNlbGYuX3N0ZG91dFN0cmVhbS50ZWxsKCkKKyAgICAgICAg
aWYgZW5kVmFsIDw9IHNlbGYuX3N0ZG91dFRyYzoKKyAgICAgICAgICAgIHJldHVybiAnJworICAg
ICAgICBzZWxmLl9zdGRvdXRTdHJlYW0uc2VlayhzZWxmLl9zdGRvdXRUcmMsIGlvLlNFRUtfU0VU
KQorICAgICAgICBzaXplID0gZW5kVmFsIC0gc2VsZi5fc3Rkb3V0VHJjCisgICAgICAgIHNlbGYu
X3N0ZG91dFRyYyA9IGVuZFZhbAorICAgICAgICByZXR1cm4gc2VsZi5fc3Rkb3V0U3RyZWFtLnJl
YWQoc2l6ZSkKKworICAgIGRlZiByZWFkQnVmZmVyU3RkZXJyKHNlbGYpOgorICAgICAgICBzZWxm
Ll9zdGRlcnJTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VORCkKKyAgICAgICAgZW5kVmFsID0gc2Vs
Zi5fc3RkZXJyU3RyZWFtLnRlbGwoKQorICAgICAgICBpZiBlbmRWYWwgPD0gc2VsZi5fc3Rkb3V0
VHJjOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVhbS5z
ZWVrKHNlbGYuX3N0ZGVyclRyYywgaW8uU0VFS19TRVQpCisgICAgICAgIHNpemUgPSBlbmRWYWwg
LSBzZWxmLl9zdGRvdXRUcmMKKyAgICAgICAgc2VsZi5fc3RkZXJyVHJjID0gZW5kVmFsCisgICAg
ICAgIHJldHVybiBzZWxmLl9zdGRlcnJTdHJlYW0ucmVhZChzaXplKQorCisgICAgZGVmIHJlYWRC
bG9ja1N0ZG91dChzZWxmLCBzaXplLCBpc0Jsb2NraW5nPUZhbHNlKToKKyAgICAgICAgd2hpbGUg
VHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5E
KQorICAgICAgICAgICAgaWYgc2VsZi5fc3Rkb3V0U3RyZWFtLnRlbGwoKSAtIHNlbGYuX3N0ZG91
dFRyYyA+PSBzaXplOgorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKHNl
bGYuX3N0ZG91dFRyYywgaW8uU0VFS19TRVQpCisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYu
X3N0ZG91dFN0cmVhbS5yZWFkKHNpemUpCisgICAgICAgICAgICAgICAgc2VsZi5fc3Rkb3V0VHJj
ID0gc2VsZi5fc3Rkb3V0VHJjICsgc2l6ZQorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisg
ICAgICAgICAgICBzZWxmLl9wYXJzZU1lc3NhZ2UoaXNCbG9ja2luZykKKyAgICAgICAgICAgIGlm
IG5vdCBpc0Jsb2NraW5nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBO
b25lCisKKyAgICBkZWYgcmVhZEJsb2NrU3RkZXJyKHNlbGYsIHNpemUsIGlzQmxvY2tpbmc9RmFs
c2UpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5fc3RkZXJyU3RyZWFt
LnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAgICAgICBpZiBzZWxmLl9zdGRlcnJTdHJlYW0u
dGVsbCgpIC0gc2VsZi5fc3RkZXJyVHJjID49IHNpemU6CisgICAgICAgICAgICAgICAgc2VsZi5f
c3RkZXJyU3RyZWFtLnNlZWsoc2VsZi5fc3RkZXJyVHJjLCBpby5TRUVLX1NFVCkKKyAgICAgICAg
ICAgICAgICBkYXRhID0gc2VsZi5fc3RkZXJyU3RyZWFtLnJlYWQoc2l6ZSkKKyAgICAgICAgICAg
ICAgICBzZWxmLl9zdGRlcnJUcmMgPSBzZWxmLl9zdGRlcnJUcmMgKyBzaXplCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlTWVzc2FnZShpc0Jsb2Nr
aW5nKQorICAgICAgICAgICAgaWYgbm90IGlzQmxvY2tpbmc6CisgICAgICAgICAgICAgICAgYnJl
YWsKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBSZWxheVNlcnZlcihBYnN0cmFjdFBp
cGUpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQ9RmFsc2UpOgorICAgICAgICBBYnN0
cmFjdFBpcGUuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5zdGRpblNlcnZlciA9IFRDUFNl
cnZlcigpCisgICAgICAgIHNlbGYuc3Rkb3V0U2VydmVyID0gVENQU2VydmVyKCkKKyAgICAgICAg
c2VsZi5zdGRlcnJTZXJ2ZXIgPSBUQ1BTZXJ2ZXIoKQorCisgICAgZGVmIGNvbm5lY3Qoc2VsZik6
CisgICAgICAgIHNlbGYuc3RkaW5TZXJ2ZXIuY29ubmVjdCgpCisgICAgICAgIHNlbGYuc3Rkb3V0
U2VydmVyLmNvbm5lY3QoKQorICAgICAgICBzZWxmLnN0ZGVyclNlcnZlci5jb25uZWN0KCkKKwor
ICAgIGRlZiBkaXNjb25uZWN0KHNlbGYpOgorICAgICAgICBzZWxmLnN0ZGluU2VydmVyLmRpc2Nv
bm5lY3QoKQorICAgICAgICBzZWxmLnN0ZG91dFNlcnZlci5kaXNjb25uZWN0KCkKKyAgICAgICAg
c2VsZi5zdGRlcnJTZXJ2ZXIuZGlzY29ubmVjdCgpCisKKyAgICBkZWYgaXNDb25uZWN0ZWQoc2Vs
Zik6CisgICAgICAgIHJldHVybiBzZWxmLnN0ZGluU2VydmVyLmlzQ29ubmVjdGVkKCkgYW5kIHNl
bGYuc3Rkb3V0U2VydmVyLmlzQ29ubmVjdGVkKCkgYW5kIHNlbGYuc3RkZXJyU2VydmVyLmlzQ29u
bmVjdGVkKCkKKworICAgIGRlZiBwb3J0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtzZWxmLnN0
ZGluU2VydmVyLnBvcnQoKSwgc2VsZi5zdGRvdXRTZXJ2ZXIucG9ydCgpLCBzZWxmLnN0ZGVyclNl
cnZlci5wb3J0KCldCisKKyAgICBkZWYgX3BhcnNlTWVzc2FnZShzZWxmLCBpc0Jsb2NraW5nPUZh
bHNlKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGRhdGEgPSBbXQorICAgICAg
ICAgICAgZGF0YSA9IHNlbGYuc3RkZXJyU2VydmVyLnJlYWQoKQorICAgICAgICAgICAgaWYgZGF0
YToKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0uc2VlaygwLCBpby5TRUVLX0VO
RCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRlcnJTdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAg
ICAgICAgIGRhdGEgPSBbXQorICAgICAgICAgICAgZGF0YSA9IHNlbGYuc3Rkb3V0U2VydmVyLnJl
YWQoKQorICAgICAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRvdXRT
dHJlYW0uc2VlaygwLCBpby5TRUVLX0VORCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRvdXRT
dHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGlmIG5vdCBpc0Jsb2NraW5nOgorICAgICAg
ICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHNlbmQoc2Vs
ZiwgYnl0ZXMpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGRpblNlcnZlci5zZW5kKGJ5dGVzKQor
CisKK2NsYXNzIFByb2Nlc3NQaXBlKEFic3RyYWN0UGlwZSk6CisKKyAgICBkZWYgX19pbml0X18o
c2VsZiwgcG9ydCwgY21kLCBlbnZpcm89Tm9uZSwgdW5pX25ld2xpbmVzPUZhbHNlKToKKworICAg
ICAgICBBYnN0cmFjdFBpcGUuX19pbml0X18oc2VsZikKKworICAgICAgICBzZWxmLl9wb3J0ID0g
cG9ydAorICAgICAgICBzZWxmLl9ob3N0ID0gc2VsZi5fcG9ydC5ob3N0CisKKyAgICAgICAgc2Vs
Zi5fcHJvYyA9IHNlbGYuX2hvc3QuZXhlY3V0aXZlLnBvcGVuKGNtZCwgc3RkaW49c2VsZi5faG9z
dC5leGVjdXRpdmUuUElQRSwKKyAgICAgICAgICAgIHN0ZG91dD1zZWxmLl9ob3N0LmV4ZWN1dGl2
ZS5QSVBFLAorICAgICAgICAgICAgc3RkZXJyPXNlbGYuX2hvc3QuZXhlY3V0aXZlLlBJUEUsCisg
ICAgICAgICAgICBjbG9zZV9mZHM9bm90IHNlbGYuX2hvc3QucGxhdGZvcm0uaXNfd2luKCksCisg
ICAgICAgICAgICBlbnY9ZW52aXJvLAorICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPXVu
aV9uZXdsaW5lcykKKworICAgICAgICBzZWxmLl91c2Vfd2luMzJfYXBpcyA9IHN5cy5wbGF0Zm9y
bS5zdGFydHN3aXRoKCd3aW4nKQorICAgICAgICBpZiBub3Qgc2VsZi5fdXNlX3dpbjMyX2FwaXM6
CisgICAgICAgICAgICBmZCA9IHNlbGYuX3Byb2Muc3Rkb3V0LmZpbGVubygpCisgICAgICAgICAg
ICBmbCA9IGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX0dFVEZMKQorICAgICAgICAgICAgZmNudGwu
ZmNudGwoZmQsIGZjbnRsLkZfU0VURkwsIGZsIHwgb3MuT19OT05CTE9DSykKKyAgICAgICAgICAg
IGZkID0gc2VsZi5fcHJvYy5zdGRlcnIuZmlsZW5vKCkKKyAgICAgICAgICAgIGZsID0gZmNudGwu
ZmNudGwoZmQsIGZjbnRsLkZfR0VURkwpCisgICAgICAgICAgICBmY250bC5mY250bChmZCwgZmNu
dGwuRl9TRVRGTCwgZmwgfCBvcy5PX05PTkJMT0NLKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6
CisgICAgICAgIGlmIHNlbGYuX3Byb2MucG9sbCgpOgorICAgICAgICAgICAgc2VsZi5faG9zdC5l
eGVjdXRpdmUua2lsbF9wcm9jZXNzKHNlbGYuX3Byb2MucGlkKQorICAgICAgICBpZiBzZWxmLl9w
cm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3Byb2Mud2FpdCgpCisK
KyAgICAgICAgaWYgc2VsZi5fcHJvYy5zdGRpbjoKKyAgICAgICAgICAgIHNlbGYuX3Byb2Muc3Rk
aW4uY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl9wcm9jLnN0ZG91dDoKKyAgICAgICAgICAgIHNl
bGYuX3Byb2Muc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5fcHJvYy5zdGRlcnI6Cisg
ICAgICAgICAgICBzZWxmLl9wcm9jLnN0ZGVyci5jbG9zZSgpCisKKyAgICBkZWYgcGlkKHNlbGYp
OgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvYy5waWQKKworICAgIGRlZiBpc0Nvbm5lY3RlZChz
ZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9wcm9jLnBvbGwoKQorCisgICAgZGVmIGhh
bmRsZV9pbnRlcnJ1cHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3Byb2MucmV0dXJuY29kZSBp
biAoLTEwNzM3NDE1MTAsIC1zaWduYWwuU0lHSU5UKToKKyAgICAgICAgICAgIHJhaXNlIEtleWJv
YXJkSW50ZXJydXB0CisKKyAgICBkZWYgc2VuZChzZWxmLCBieXRlcyk6CisgICAgICAgIHRyeToK
KyAgICAgICAgICAgIHNlbGYuX3Byb2Muc3RkaW4ud3JpdGUoYnl0ZXMpCisgICAgICAgIGV4Y2Vw
dCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBU
cnVlCisKKyAgICBkZWYgX3VuaXhzdGRCbG9jayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcHJv
Yy5zdGRvdXQuY2xvc2VkOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZWN0
X2ZkcyA9IFtdCisgICAgICAgIHNlbGVjdF9mZHMuYXBwZW5kKHNlbGYuX3Byb2Muc3Rkb3V0LmZp
bGVubygpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZWFkX2ZkcywgXywgXyA9IHNlbGVj
dC5zZWxlY3Qoc2VsZWN0X2ZkcywgW10sIHNlbGVjdF9mZHMsIDApCisgICAgICAgIGV4Y2VwdCBz
ZWxlY3QuZXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gZXJybm8uRUlOVkFM
OgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByYWlzZQorCisgICAg
ICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX3Byb2Muc3Rkb3V0LmZpbGVubygpIGluIHJl
YWRfZmRzOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9wcm9jLnN0ZG91dC5yZWFkKCkK
KyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToK
KyAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF91bml4
ZXJyQmxvY2soc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3Byb2Muc3RkZXJyLmNsb3NlZDoKKyAg
ICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGVjdF9mZHMgPSBbXQorICAgICAgICBz
ZWxlY3RfZmRzLmFwcGVuZChzZWxmLl9wcm9jLnN0ZGVyci5maWxlbm8oKSkKKyAgICAgICAgdHJ5
OgorICAgICAgICAgICAgcmVhZF9mZHMsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KHNlbGVjdF9mZHMs
IFtdLCBzZWxlY3RfZmRzLCAwKQorICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yLCBlOgorICAg
ICAgICAgICAgaWYgZS5hcmdzWzBdID09IGVycm5vLkVJTlZBTDoKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gTm9uZQorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAg
ICBpZiBzZWxmLl9wcm9jLnN0ZGVyci5maWxlbm8oKSBpbiByZWFkX2ZkczoKKyAgICAgICAgICAg
ICAgICBkYXRhID0gc2VsZi5fcHJvYy5zdGRlcnIucmVhZCgpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGRhdGEKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICBwYXNzCisK
KyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfd2luMzJOb25CbG9ja2luZ1JlYWQoc2Vs
ZiwgaGFuZGxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgXywgYXZhaWwsIF8gPSB3aW4z
MnBpcGUuUGVla05hbWVkUGlwZShoYW5kbGUsIDApCisgICAgICAgICAgICBpZiBhdmFpbCA+IDA6
CisgICAgICAgICAgICAgICAgXywgYnVmID0gd2luMzJmaWxlLlJlYWRGaWxlKGhhbmRsZSwgYXZh
aWwsIE5vbmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICBleGNlcHQgRXhj
ZXB0aW9uLCBlOgorICAgICAgICAgICAgaWYgZVswXSBub3QgaW4gKDEwOSwgZXJybm8uRVNIVVRE
T1dOKTogICMgMTA5ID09IHdpbjMyIEVSUk9SX0JST0tFTl9QSVBFCisgICAgICAgICAgICAgICAg
cmFpc2UKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfd2luMzJzdGRCbG9jayhzZWxm
KToKKyAgICAgICAgb3V0X2ZoID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc2VsZi5fcHJvYy5zdGRv
dXQuZmlsZW5vKCkpCisgICAgICAgIHJldHVybiBzZWxmLl93aW4zMk5vbkJsb2NraW5nUmVhZChv
dXRfZmgpCisKKyAgICBkZWYgX3dpbjMyZXJyQmxvY2soc2VsZik6CisgICAgICAgIGVycl9maCA9
IG1zdmNydC5nZXRfb3NmaGFuZGxlKHNlbGYuX3Byb2Muc3RkZXJyLmZpbGVubygpKQorICAgICAg
ICByZXR1cm4gc2VsZi5fd2luMzJOb25CbG9ja2luZ1JlYWQoZXJyX2ZoKQorCisgICAgZGVmIF9w
YXJzZU1lc3NhZ2Uoc2VsZiwgaXNCbG9ja2luZz1GYWxzZSk6CisgICAgICAgIHdoaWxlIFRydWU6
CisgICAgICAgICAgICBkYXRhID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYuX3VzZV93aW4zMl9h
cGlzOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl93aW4zMmVyckJsb2NrKCkKKyAgICAg
ICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX3VuaXhlcnJCbG9jaygp
CisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVh
bS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVyclN0cmVh
bS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBk
YXRhID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYuX3VzZV93aW4zMl9hcGlzOgorICAgICAgICAg
ICAgICAgIGRhdGEgPSBzZWxmLl93aW4zMnN0ZEJsb2NrKCkKKyAgICAgICAgICAgIGVsc2U6Cisg
ICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX3VuaXhzdGRCbG9jaygpCisgICAgICAgICAgICBp
ZiBkYXRhOgorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS5zZWVrKDAsIGlvLlNF
RUtfRU5EKQorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZG91dFN0cmVhbS53cml0ZShkYXRhKQor
ICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBpZiBub3QgaXNCbG9ja2lu
ZzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gRmFsc2UKSW5kZXg6IFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyX3Rlc3RjYXNlLnB5Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyX3Rlc3Rj
YXNlLnB5CShub25leGlzdGVudCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Jl
bGF5c2VydmVyX3Rlc3RjYXNlLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI4IEBACisj
IENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisj
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisj
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgZXJybm8KK2ltcG9y
dCBpbworaW1wb3J0IHNvY2tldAoraW1wb3J0IHRpbWUKKworZnJvbSB3ZWJraXRweS5jb21tb24u
cmVsYXlzZXJ2ZXIgaW1wb3J0IEFic3RyYWN0UGlwZQorCisKK2NsYXNzIER1bW15UHJvY2Vzc1Bp
cGUoQWJzdHJhY3RQaXBlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0PU5vbmUsIGNt
ZD1Ob25lLCBlbnZpcm89Tm9uZSwgdW5pX25ld2xpbmVzPUZhbHNlKToKKyAgICAgICAgQWJzdHJh
Y3RQaXBlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3BvcnQgPSBwb3J0CisgICAgICAg
IGlmIHNlbGYuX3BvcnQ6CisgICAgICAgICAgICBzZWxmLl9ob3N0ID0gc2VsZi5fcG9ydC5ob3N0
CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9ob3N0ID0gTm9uZQorICAgICAgICBz
ZWxmLmNvbm5lY3RlZEZvclRlc3RpbmcgPSBUcnVlCisKKyAgICBkZWYgcGlkKHNlbGYpOgorICAg
ICAgICByZXR1cm4gMQorCisgICAgZGVmIGlzQ29ubmVjdGVkKHNlbGYpOgorICAgICAgICByZXR1
cm4gc2VsZi5jb25uZWN0ZWRGb3JUZXN0aW5nCisKKyAgICBkZWYgc2VuZChzZWxmLCBieXRlcyk6
CisgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZEZvclRlc3RpbmcKKworICAgIGRlZiBfcGFy
c2VNZXNzYWdlKHNlbGYsIGlzQmxvY2tpbmc9RmFsc2UpOgorICAgICAgICByZXR1cm4gRmFsc2UK
KworICAgIGRlZiBwdXNoRGF0YUZvclRlc3Rpbmcoc2VsZiwgZGF0YSwgc3RkZXJyPUZhbHNlLCBz
dGRvdXQ9VHJ1ZSk6CisgICAgICAgIGlmIHN0ZGVycjoKKyAgICAgICAgICAgIHNlbGYuX3N0ZGVy
clN0cmVhbS5zZWVrKDAsIGlvLlNFRUtfRU5EKQorICAgICAgICAgICAgc2VsZi5fc3RkZXJyU3Ry
ZWFtLndyaXRlKGRhdGEpCisgICAgICAgIGVsaWYgc3Rkb3V0OgorICAgICAgICAgICAgc2VsZi5f
c3Rkb3V0U3RyZWFtLnNlZWsoMCwgaW8uU0VFS19FTkQpCisgICAgICAgICAgICBzZWxmLl9zdGRv
dXRTdHJlYW0ud3JpdGUoZGF0YSkKKworCitjbGFzcyBUQ1BDbGllbnQob2JqZWN0KToKKworICAg
IEJVRkZFUiA9IDQwOTYKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0PTUwMDAsIGFkZHJl
c3M9JzEyNy4wLjAuMScpOgorICAgICAgICBzZWxmLl9wb3J0ID0gcG9ydAorICAgICAgICBzZWxm
Ll9hZGRyZXNzID0gYWRkcmVzcworICAgICAgICBzZWxmLl9jb25uZWN0ZWQgPSBGYWxzZQorICAg
ICAgICBzZWxmLl9jb25uZWN0aW9uID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29j
a2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLl9zdHJlYW0gPSBpby5CeXRlc0lPKCkKKyAg
ICAgICAgc2VsZi5fc3RyZWFtVHJjID0gMAorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAg
ICAgIHNlbGYuZGlzY29ubmVjdCgpCisKKyAgICBkZWYgY29ubmVjdChzZWxmKToKKyAgICAgICAg
aWYgc2VsZi5fY29ubmVjdGVkOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgc2Vs
Zi5fY29ubmVjdGlvbi5jb25uZWN0KChzZWxmLl9hZGRyZXNzLCBzZWxmLl9wb3J0KSkKKyAgICAg
ICAgc2VsZi5fY29ubmVjdGVkID0gVHJ1ZQorCisgICAgZGVmIGRpc2Nvbm5lY3Qoc2VsZik6Cisg
ICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0ZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAg
ICAgc2VsZi5fY29ubmVjdGlvbi5jbG9zZSgpCisgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IEZh
bHNlCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgaXNCbG9ja2luZz1GYWxzZSk6CisgICAgICAg
IHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLl9zdHJlYW0uc2VlayhzZWxmLl9zdHJlYW1U
cmMsIGlvLlNFRUtfU0VUKQorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX3N0cmVhbS5yZWFkbGlu
ZSgpCisgICAgICAgICAgICBpZiBkYXRhIGFuZCBkYXRhWy0xXSA9PSAnXG4nOgorICAgICAgICAg
ICAgICAgIHNlbGYuX3N0cmVhbVRyYyA9IHNlbGYuX3N0cmVhbVRyYyArIGxlbihkYXRhKQorICAg
ICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgICAgICBibG9jayA9IHNlbGYucmVhZCgp
CisgICAgICAgICAgICBpZiBibG9jazoKKyAgICAgICAgICAgICAgICBzZWxmLl9zdHJlYW0uc2Vl
aygwLCBpby5TRUVLX0VORCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zdHJlYW0ud3JpdGUoYmxv
Y2spCisgICAgICAgICAgICBpZiBub3QgaXNCbG9ja2luZzoKKyAgICAgICAgICAgICAgICBicmVh
aworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHRy
eToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb25uZWN0aW9uLnJlY3Yoc2VsZi5CVUZGRVIp
CisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAg
ICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgICAgICBlcnIgPSBlLmFyZ3NbMF0K
KyAgICAgICAgICAgIGlmIGVyciA9PSBlcnJuby5FQUdBSU4gb3IgZXJyID09IGVycm5vLkVXT1VM
REJMT0NLOgorICAgICAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBzZWxmLmRpc2Nvbm5l
Y3QoKQorICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAg
ICAgICBpZiBub3Qgc2VsZi5fY29ubmVjdGVkOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisg
ICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uc2VuZChkYXRhKQorICAgICAgICByZXR1cm4gVHJ1ZQor
CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wb3J0CisKKyAgICBk
ZWYgaXNDb25uZWN0ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0ZWQKSW5k
ZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVyX3VuaXR0ZXN0LnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3JlbGF5c2VydmVy
X3VuaXR0ZXN0LnB5CShub25leGlzdGVudCkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3JlbGF5c2VydmVyX3VuaXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI1
IEBACisjIENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisjIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyMgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisjIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisjIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyMgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgdGhyZWFk
aW5nCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gd2Via2l0cHkuY29tbW9u
LnJlbGF5c2VydmVyIGltcG9ydCBUQ1BTZXJ2ZXIsIFJlbGF5U2VydmVyCitmcm9tIHdlYmtpdHB5
LmNvbW1vbi5yZWxheXNlcnZlcl90ZXN0Y2FzZSBpbXBvcnQgRHVtbXlQcm9jZXNzUGlwZSwgVENQ
Q2xpZW50CisKKworZGVmIFRDUENsaWVudFRlc3RpbmdUaHJlYWQoc291cmNlLCBwcnQsIGFyZ3Vt
ZW50cyk6CisgICAgc291cmNlLmNsaWVudFJlc3VsdHMgPSBbXQorICAgIGNsaWVudCA9IFRDUENs
aWVudChwcnQpCisKKyAgICBkZWFkbGluZSA9IHRpbWUudGltZSgpICsgMS4wCisgICAgd2hpbGUg
dGltZS50aW1lKCkgPCBkZWFkbGluZSBhbmQgbm90IGNsaWVudC5pc0Nvbm5lY3RlZCgpOgorICAg
ICAgICBjbGllbnQuY29ubmVjdCgpCisgICAgaWYgbm90IGNsaWVudC5pc0Nvbm5lY3RlZCgpOgor
ICAgICAgICByZXR1cm4gTm9uZQorICAgIHJlYWRpbmdtb2RlID0gRmFsc2UKKyAgICBmb3IgZWxt
IGluIGFyZ3VtZW50czoKKyAgICAgICAgaWYgZWxtID09ICctLXJlYWQnOgorICAgICAgICAgICAg
c291cmNlLmNsaWVudFJlc3VsdHMuYXBwZW5kKGNsaWVudC5yZWFkbGluZShUcnVlKSkKKyAgICAg
ICAgZWxzZToKKyAgICAgICAgICAgIGNsaWVudC5zZW5kKGVsbSkKKyAgICBjbGllbnQuZGlzY29u
bmVjdCgpCisgICAgcmV0dXJuIHNvdXJjZS5jbGllbnRSZXN1bHRzCisKKworY2xhc3MgUmVsYXlT
ZXJ2ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAq
YXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihSZWxheVNlcnZlclRlc3QsIHNlbGYpLl9f
aW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5jbGllbnRSZXN1bHRzID0gW10K
KworICAgIGRlZiB0ZXN0X2Fic3RyYWN0cGlwZV9zdGRvdXQoc2VsZik6CisgICAgICAgIHBpcGUg
PSBEdW1teVByb2Nlc3NQaXBlKCkKKworICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygn
Y29taW5nIGZyb20gc3Rkb3V0XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGUuc3Rk
b3V0UmVhZCgpLCAnY29taW5nIGZyb20gc3Rkb3V0XG4nKQorCisgICAgICAgIHBpcGUucHVzaERh
dGFGb3JUZXN0aW5nKCdjb21pbmcgZnJvbSBzdGRlcnJcbicsIHN0ZGVycj1UcnVlKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKHBpcGUuc3Rkb3V0UmVhZCgpLCBbXSkKKworICAgIGRlZiB0ZXN0
X2Fic3RyYWN0cGlwZV9zdGRlcnIoc2VsZik6CisgICAgICAgIHBpcGUgPSBEdW1teVByb2Nlc3NQ
aXBlKCkKKworICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygnY29taW5nIGZyb20gc3Rk
b3V0XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGUuc3RkZXJyUmVhZCgpLCBbXSkK
KworICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygnY29taW5nIGZyb20gc3RkZXJyXG4n
LCBzdGRlcnI9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlLnN0ZGVyclJlYWQo
KSwgJ2NvbWluZyBmcm9tIHN0ZGVyclxuJykKKworICAgIGRlZiB0ZXN0X2Fic3RyYWN0cGlwZV9k
dWVsX3N0cmVhbXMoc2VsZik6CisgICAgICAgIHBpcGUgPSBEdW1teVByb2Nlc3NQaXBlKCkKKwor
ICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygnY29taW5nIGZyb20gc3Rkb3V0XG4nKQor
ICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygnY29taW5nIGZyb20gc3RkZXJyXG4nLCBz
dGRlcnI9VHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGUucmVhZExpbmUoKSwg
J2NvbWluZyBmcm9tIHN0ZGVyclxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlLnJl
YWRMaW5lKCksICdjb21pbmcgZnJvbSBzdGRvdXRcbicpCisKKyAgICBkZWYgdGVzdF9hYnN0cmFj
dHBpcGVfc3Rkb3V0YmxvY2soc2VsZik6CisgICAgICAgIHBpcGUgPSBEdW1teVByb2Nlc3NQaXBl
KCkKKworICAgICAgICBwaXBlLnB1c2hEYXRhRm9yVGVzdGluZygnc3Rkb3V0IGxpbmVcbicpCisg
ICAgICAgIHBpcGUucHVzaERhdGFGb3JUZXN0aW5nKCdzdGRvdXQgYmxvY2snKQorCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwocGlwZS5yZWFkQnVmZmVyU3Rkb3V0KCksICdzdGRvdXQgbGluZVxu
c3Rkb3V0IGJsb2NrJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlLnJlYWRCdWZmZXJT
dGRlcnIoKSwgJycpCisKKyAgICBkZWYgdGVzdF9hYnN0cmFjdHBpcGVfc3RkZXJyYmxvY2soc2Vs
Zik6CisgICAgICAgIHBpcGUgPSBEdW1teVByb2Nlc3NQaXBlKCkKKworICAgICAgICBwaXBlLnB1
c2hEYXRhRm9yVGVzdGluZygnc3RkZXJyIGxpbmVcbicsIHN0ZGVycj1UcnVlKQorICAgICAgICBw
aXBlLnB1c2hEYXRhRm9yVGVzdGluZygnc3RkZXJyIGJsb2NrJywgc3RkZXJyPVRydWUpCisKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlLnJlYWRCdWZmZXJTdGRvdXQoKSwgJycpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlwZS5yZWFkQnVmZmVyU3RkZXJyKCksICdzdGRlcnIgbGlu
ZVxuc3RkZXJyIGJsb2NrJykKKworICAgIGRlZiB0ZXN0X211bHRpcG9ydF9zZXJ2ZXIoc2VsZik6
CisgICAgICAgIHNlcnZlck9uZSA9IFJlbGF5U2VydmVyKCkKKyAgICAgICAgc2VydmVyVHdvID0g
UmVsYXlTZXJ2ZXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VydmVyT25lLnBvcnRz
KCkgPT0gc2VydmVyVHdvLnBvcnRzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VydmVy
T25lLmlzQ29ubmVjdGVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VydmVyVHdvLmlz
Q29ubmVjdGVkKCkpCisKKyAgICBkZWYgdGVzdF90Y3BTZXJ2ZXIoc2VsZik6CisgICAgICAgIHNl
cnYgPSBUQ1BTZXJ2ZXIoKQorICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdl
dD1UQ1BDbGllbnRUZXN0aW5nVGhyZWFkLCBhcmdzPShzZWxmLCBzZXJ2LnBvcnQoKSwgWyctLXJl
YWQnLCAnTGluZSAxXG4nLCAnTGluZSAyXG4nLCAnLS1yZWFkJ10pKQorICAgICAgICB0aHJlYWQu
c3RhcnQoKQorICAgICAgICBzZXJ2LmNvbm5lY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUo
c2Vydi5pc0Nvbm5lY3RlZCgpKQorCisgICAgICAgIHNlcnYuc2VuZCgnU2VydmVyIHNlbmQgMVxu
JykKKyAgICAgICAgc2Vydi5zZW5kKCdTZXJ2ZXIgc2VuZCAyXG4nKQorCisgICAgICAgIHRocmVh
ZC5qb2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2LnJlYWQoKSwgJ0xpbmUgMVxu
TGluZSAyXG4nKQorICAgICAgICBzZXJ2LmRpc2Nvbm5lY3QoKQorCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoJ1NlcnZlciBzZW5kIDFcbicsIHNlbGYuY2xpZW50UmVzdWx0c1swXSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbCgnU2VydmVyIHNlbmQgMlxuJywgc2VsZi5jbGllbnRSZXN1bHRz
WzFdKQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9zdHlsZS9jaGVja2Vycy9weXRob24u
cHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9zdHlsZS9jaGVja2Vycy9w
eXRob24ucHkJKHJldmlzaW9uIDIwODc2NSkKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3R5
bGUvY2hlY2tlcnMvcHl0aG9uLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xMDMsNyArMTAzLDcgQEAg
Y2xhc3MgUHlsaW50ZXIob2JqZWN0KToKIAogICAgIGRlZiBydW4oc2VsZiwgYXJndik6CiAgICAg
ICAgIG91dHB1dCA9IF9GaWx0ZXJlZFN0cmluZ0lPKHNlbGYuRkFMU0VfUE9TSVRJVkVTKQotICAg
ICAgICBsaW50LlJ1bihbJy0tcmNmaWxlJywgc2VsZi5fcHlsaW50cmNdICsgYXJndiwgcmVwb3J0
ZXI9UGFyc2VhYmxlVGV4dFJlcG9ydGVyKG91dHB1dD1vdXRwdXQpLCBleGl0PUZhbHNlKQorICAg
ICAgICBsaW50LlJ1bihbJy0taWdub3JlZC1jbGFzc2VzPV9zb2NrZXRvYmplY3QnLCAnLS1yY2Zp
bGUnLCBzZWxmLl9weWxpbnRyY10gKyBhcmd2LCByZXBvcnRlcj1QYXJzZWFibGVUZXh0UmVwb3J0
ZXIob3V0cHV0PW91dHB1dCksIGV4aXQ9RmFsc2UpCiAgICAgICAgIHJldHVybiBvdXRwdXQKIAog
Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>