[Date Prev] [Date Next] [Thread Prev] [Thread Next] Indexes: Date | Thread | Author

[XML-SIG] WSDL library ?


--------------Boundary-00=_27XBJLWDN55MQIL2GW2F
Content-Type: text/plain;
  charset="iso-8859-15"
Content-Transfer-Encoding: 8bit    (01)

I've been playing with wsdllib, from a IBM developerWorks article by Uche. 
I've attached the actual module for you to look at. The article can be found 
here:
http://www-105.ibm.com/developerworks/education.nsf/webservices-onlinecourse-bytitle/D092605075D1D67D86256A7E0042432D?OpenDocument    (02)

Regards,    (03)

Eron
--------------Boundary-00=_27XBJLWDN55MQIL2GW2F
Content-Type: text/x-python;
  charset="iso-8859-15";
  name="wsdllib.py"
Content-Transfer-Encoding: base64
Content-Description: WSDL Python module
Content-Disposition: attachment; filename="wsdllib.py"    (04)

IiIid3NkbDRweQoKVGhpcyBsaWJyYXJ5IGNhbiBiZSB1c2VkIHRvIHJlYWQgV1NETCBtZXNzYWdl
cyBpbnRvIGEgcHl0aG9uIGNsYXNzIHN0cnVjdHVyZS4gIFlvdSBjYW4gYWxzbyBjcmVhdGUKbmV3
IGluc3RhbmNlcyBvZiB0aGUgV1NETCBjbGFzcyB0byBkZWZpbmUgbmV3IG1lc3NhZ2VzLgoKRXhh
bXBsZTogIENyZWF0ZSBmb3JtIGEgVVJJCgp3c2RsID0gUmVhZEZyb21VcmkoJ2h0dHA6Ly9mb3Vy
dGhvdWdodC5jb20vZGVmcy53c2RsJykKCkV4YW1wbGU6ICBDcmVhdGUgYSBuZXcgV1NETCBkZWZp
bml0aW9uCgpmcm9tIHhtbC5kb20uZXh0IGltcG9ydCBQcmV0dHlQcmludAp3c2RsID0gV3NkbCgp
Cm0gPSB3c2RsLmFkZE1lc3NhZ2UoJ21lc3NhZ2VOYW1lJykKbS5kb2N1bWVudGF0aW9uID0gJ0Rv
Y3VtZW50YXRpb24gYWJvdXQgdGhlIG1lc3NhZ2UnCmQgPSB3c2RsLnRvRG9tKCkKUHJldHR5UHJp
bnQoZCkKCkZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgSUJNIGRldmVsb3BlcldvcmtzIHR1
dG9yaWFsIG9uIHdzZGw0cHkgYXQKCmh0dHA6Ly93d3ctMTA1LmlibS5jb20vZGV2ZWxvcGVyd29y
a3MvZWR1Y2F0aW9uLm5zZi93ZWJzZXJ2aWNlcy1vbmxpbmVjb3Vyc2UtYnl0aXRsZS9EMDkyNjA1
MDc1RDFENjdEODYyNTZBN0UwMDQyNDMyRD9PcGVuRG9jdW1lbnQKCihmcmVlIHJlZ2lzdHJhdGlv
biByZXF1aXJlZCkKIiIiCgppbXBvcnQgdXJsbGliLCBVc2VyRGljdCwgY1N0cmluZ0lPCmZyb20g
RnQuTGliIGltcG9ydCBwRG9tbGV0dGUKZnJvbSB4bWwgaW1wb3J0IHhwYXRoCmZyb20geG1sLnhw
YXRoIGltcG9ydCBDb252ZXJzaW9ucwpmcm9tIHhtbC5kb20uZXh0IGltcG9ydCBQcmV0dHlQcmlu
dCwgU3BsaXRRTmFtZQpmcm9tIHhtbC5kb20gaW1wb3J0IE5vZGUKCldTRExfTkFNRVNQQUNFPSdo
dHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLycKCgojVGhlc2UgZXhwcmVzc2lvbnMgYXJl
IHVzZWQgdG8gcHVsbCBpbmZvcm1hdGlvbiBmcm9tIGEgWE1MIGRvY3VtZW50CmdfbmFtZUV4cHJl
c3Npb24gPSB4cGF0aC5Db21waWxlKCdzdHJpbmcoQG5hbWUpJykKZ190YXJnZXROYW1lc3BhY2VF
eHByZXNzaW9uID0geHBhdGguQ29tcGlsZSgnc3RyaW5nKEB0YXJnZXROYW1lc3BhY2UpJykKZ19p
bXBvcnRFeHByZXNzaW9uID0geHBhdGguQ29tcGlsZSgndzppbXBvcnQnKQpnX2RvY3VtZW50YXRp
b25FeHByZXNzaW9uID0geHBhdGguQ29tcGlsZSgndzpkb2N1bWVudGF0aW9uJykKZ190eXBlc0V4
cHJlc3Npb24gPSB4cGF0aC5Db21waWxlKCd3OnR5cGVzJykKZ19tZXNzYWdlc0V4cHJlc3Npb24g
PSB4cGF0aC5Db21waWxlKCd3Om1lc3NhZ2UnKQpnX3BvcnRUeXBlc0V4cHJlc3Npb24gPSB4cGF0
aC5Db21waWxlKCd3OnBvcnRUeXBlJykKZ19iaW5kaW5nc0V4cHJlc3Npb24gPSB4cGF0aC5Db21w
aWxlKCd3OmJpbmRpbmcnKQpnX3NlcnZpY2VzRXhwcmVzc2lvbiA9IHhwYXRoLkNvbXBpbGUoJ3c6
c2VydmljZScpCmdfcGFydHNFeHByZXNzaW9uID0geHBhdGguQ29tcGlsZSgndzpwYXJ0JykKZ19v
cGVyYXRpb25zRXhwcmVzc2lvbiA9IHhwYXRoLkNvbXBpbGUoJ3c6b3BlcmF0aW9uJykKZ19pbnB1
dEV4cHJlc3Npb24gPSB4cGF0aC5Db21waWxlKCd3OmlucHV0JykKZ19vdXRwdXRFeHByZXNzaW9u
ID0geHBhdGguQ29tcGlsZSgndzpvdXRwdXQnKQpnX2ZhdWx0RXhwcmVzc2lvbiA9IHhwYXRoLkNv
bXBpbGUoJ3c6ZmF1bHQnKQpnX3BvcnRzRXhwcmVzc2lvbiA9IHhwYXRoLkNvbXBpbGUoJ3c6cG9y
dCcpCgpkZWYgUmVhZEZyb21TdHJlYW0oc3RyZWFtKToKICAgICIiIlJlYWQgaW4gYSBXU0RMIG1l
c3NhZ2UgZnJvbSBhIHN0ZWFtIG9iamVjdCIiIgogICAgd3MgPSBXc2RsKCkKICAgIHJlYWRlciA9
IHBEb21sZXR0ZS5QeUV4cGF0UmVhZGVyKCkKICAgIGRvbSA9IHJlYWRlci5mcm9tU3RyZWFtKHN0
cmVhbSkKICAgIHdzLmZyb21Eb20oZG9tKQogICAgcmVhZGVyLnJlbGVhc2VOb2RlKGRvbSkKICAg
IHJldHVybiB3cwoKCmRlZiBSZWFkRnJvbVN0cmluZyhzdCk6CiAgICAiIiJSZWFkIGluIGEgV1NE
TCBtZXNzYWdlIGZyb20gYSBzdHJpbmciIiIKICAgIHN0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKHN0
KQogICAgcmV0dXJuIFJlYWRGcm9tU3RyZWFtKHN0KQoKZGVmIFJlYWRGcm9tVXJpKHVyaSk6CiAg
ICAiIiJSZWFkIGluIGEgV1NETCBtZXNzYWdlIGZyb20gYSBVUkkiIiIKICAgIHN0ID0gdXJsbGli
LnVybG9wZW4odXJpKQogICAgd3MgPSBSZWFkRnJvbVN0cmVhbShzdCkKICAgIHN0LmNsb3NlKCkK
ICAgIHJldHVybiB3cwogICAgCgpjbGFzcyBXc2RsOgogICAgIiIiVGhpcyBjbGFzcyByZXByZXNl
bnRzIHRoZSBlbnRpcmUgV1NETCBkZWZpbml0aW9uLiAgSXQgY2FuIGJlIGNyZWF0ZWQgZnJvbSBv
bmUgb2YgdGhlIGFib3ZlCiAgICBjb25zdHJ1Y3RvciBmdW5jdGlvbnMsIG9yIGEgbmV3IGluc3Rh
bmNlIGNhbiBiZSBjcmVhdGVkIGFuZCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgY2xhc3Mgc2V0CiAg
ICBtYW51YWxseS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi50eXBl
cyA9IFR5cGVzKCkKICAgICAgICBzZWxmLm1lc3NhZ2VzID0gTWVzc2FnZXMoKQogICAgICAgIHNl
bGYucG9ydFR5cGVzID0gUG9ydFR5cGVzKCkKICAgICAgICBzZWxmLmJpbmRpbmdzID0gQmluZGlu
Z3MoKQogICAgICAgIHNlbGYuc2VydmljZXMgPSBTZXJ2aWNlcygpCgogICAgICAgIHNlbGYubmFt
ZSA9ICcnCiAgICAgICAgc2VsZi50YXJnZXROYW1lc3BhY2UgPSAnJwogICAgICAgIHNlbGYuZG9j
dW1lbnRhdGlvbiA9ICcnCgoKICAgIGRlZiBmcm9tRG9tKHNlbGYsZG9tKToKICAgICAgICAiIiJS
ZWFkIGluIGEgV1NETCBkZWZpbml0aW9uIGZyb20gRE9NLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhl
IFJlYWQqIG1ldGhvZHMgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlIiIiCgogICAgICAgIGNvbiA9
IHhwYXRoLkNvbnRleHQuQ29udGV4dChkb20uZG9jdW1lbnRFbGVtZW50LCBwcm9jZXNzb3JOc3M9
eyd3JzogV1NETF9OQU1FU1BBQ0V9KQoKICAgICAgICBzZWxmLnNldE5hbWUoZ19uYW1lRXhwcmVz
c2lvbi5ldmFsdWF0ZShjb24pKQogICAgICAgIHNlbGYuc2V0VGFyZ2V0TmFtZXNwYWNlKGdfdGFy
Z2V0TmFtZXNwYWNlRXhwcmVzc2lvbi5ldmFsdWF0ZShjb24pKQoKICAgICAgICBpbXBvcnRzID0g
Z19pbXBvcnRFeHByZXNzaW9uLmV2YWx1YXRlKGNvbikKICAgICAgICBmb3IgaSBpbiBpbXBvcnRz
OgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkltcG9ydHMgbm90IHN1cHBvcnRlZCIpCgog
ICAgICAgIGRvY3MgPSBnX2RvY3VtZW50YXRpb25FeHByZXNzaW9uLmV2YWx1YXRlKGNvbikKICAg
ICAgICBpZiBkb2NzOgogICAgICAgICAgICBzZWxmLnNldERvY3VtZW50YXRpb24oQ29udmVyc2lv
bnMuU3RyaW5nVmFsdWUoZG9jc1swXSkpCgogICAgICAgIHR5cGVzID0gZ190eXBlc0V4cHJlc3Np
b24uZXZhbHVhdGUoY29uKQogICAgICAgIHNlbGYudHlwZXMuZnJvbURvbSh0eXBlcykKCiAgICAg
ICAgbWVzc2FnZXMgPSBnX21lc3NhZ2VzRXhwcmVzc2lvbi5ldmFsdWF0ZShjb24pCiAgICAgICAg
c2VsZi5tZXNzYWdlcy5mcm9tRG9tKG1lc3NhZ2VzKQoKICAgICAgICBwb3J0VHlwZXMgPSBnX3Bv
cnRUeXBlc0V4cHJlc3Npb24uZXZhbHVhdGUoY29uKQogICAgICAgIHNlbGYucG9ydFR5cGVzLmZy
b21Eb20ocG9ydFR5cGVzKQoKICAgICAgICBiaW5kaW5ncyA9IGdfYmluZGluZ3NFeHByZXNzaW9u
LmV2YWx1YXRlKGNvbikKICAgICAgICBzZWxmLmJpbmRpbmdzLmZyb21Eb20oYmluZGluZ3MpCgog
ICAgICAgIHNlcnZpY2VzID0gZ19zZXJ2aWNlc0V4cHJlc3Npb24uZXZhbHVhdGUoY29uKQogICAg
ICAgIHNlbGYuc2VydmljZXMuZnJvbURvbShzZXJ2aWNlcykKICAgIAoKICAgIGRlZiBzZXROYW1l
KHNlbGYsbmV3TmFtZSk6CiAgICAgICAgIiIiQ2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBkZWZpbml0
aW9uIiIiCiAgICAgICAgc2VsZi5uYW1lID0gbmV3TmFtZQoKICAgIGRlZiBzZXRUYXJnZXROYW1l
c3BhY2Uoc2VsZixuZXdUbnMpOgogICAgICAgICIiIkNoYW5nZSB0aGUgdGFyZ2V0IG5hbWVzcGFj
ZSBvZiB0aGUgZGVmaW5pdGlvbiIiIgogICAgICAgIHNlbGYudGFyZ2V0TmFtZXNwYWNlID0gbmV3
VG5zCgogICAgZGVmIHNldERvY3VtZW50YXRpb24oc2VsZixkb2N1bWVudGF0aW9uKToKICAgICAg
ICBzZWxmLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uCgogICAgZGVmIHRvRG9tKHNlbGYp
OgogICAgICAgICIiIkdlbmVyYXRlIGEgRE9NIGRvY3VtZW50IGZvciB0aGUgY3VycmVudCBXU0RM
IGRlZmluaXRpb24gc3RydWN0dXJlIiIiCiAgICAgICAgZG9jID0gcERvbWxldHRlLkRvY3VtZW50
KCkKICAgICAgICBkZWZzID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhXU0RMX05BTUVTUEFDRSwnd3Nk
bDpkZWZpbml0aW9ucycpCgogICAgICAgIGlmIHNlbGYubmFtZToKICAgICAgICAgICAgZGVmcy5z
ZXRBdHRyaWJ1dGVOUygnJywnbmFtZScsc2VsZi5uYW1lKQogICAgICAgIGlmIHNlbGYudGFyZ2V0
TmFtZXNwYWNlOgogICAgICAgICAgICBkZWZzLnNldEF0dHJpYnV0ZU5TKCcnLCd0YXJnZXROYW1l
c3BhY2UnLHNlbGYudGFyZ2V0TmFtZXNwYWNlKQoKICAgICAgICBEb2N1bWVudGF0aW9uVG9Eb20o
ZGVmcyxzZWxmLmRvY3VtZW50YXRpb24pCgogICAgICAgIGRvYy5hcHBlbmRDaGlsZChkZWZzKQoK
ICAgICAgICBzZWxmLnR5cGVzLnRvRG9tKGRvYykKICAgICAgICBzZWxmLm1lc3NhZ2VzLnRvRG9t
KGRvYykKICAgICAgICBzZWxmLnBvcnRUeXBlcy50b0RvbShkb2MpCiAgICAgICAgc2VsZi5iaW5k
aW5ncy50b0RvbShkb2MpCiAgICAgICAgc2VsZi5zZXJ2aWNlcy50b0RvbShkb2MpCgogICAgICAg
IHJldHVybiBkb2MKICAgICAgICAKCiAgICBkZWYgdmFsaWRhdGUoc2VsZik6CiAgICAgICAgIiIi
VmFsaWRhdGUgdGhlIGN1cnJlbnQgV1NETCBzdHJ1Y3R1cmUuICBQZXJmb3JtIGNoZWNrcyB0aGF0
IGFsbCBvZiB0aGUgaW50ZXJjb25uZWN0ZWQgcGFydHMgKG1lc3NhZ2VzLAogICAgICAgIHBvcnRU
eXBlcywgc2VydmljZXMsIGV0YykgcmVmZXJlbmNlIHZhbGlkIGRlZmluaXRpb25zIiIiCgoKICAg
ICAgICAjRklYTUUgV2UgY2Fubm90IHZhbGlkYXRlIG1lc3NhZ2VzIHRvIGRlZmluaXRpb25zIGJl
Y2F1c2Ugd2UgYXJlIHVuYWJsZSB0byBwYXJzZSB0aGUgZGVmaW5pdGlvbgoKICAgICAgICBzZWxm
LnBvcnRUeXBlcy52YWxpZGF0ZShzZWxmLm1lc3NhZ2VzKQogICAgICAgIHNlbGYuYmluZGluZ3Mu
dmFsaWRhdGUoc2VsZi5wb3J0VHlwZXMpCiAgICAgICAgI3NlbGYuc2VydmljZXMudmFsaWRhdGUo
c2VsZi5iaW5kaW5ncykKCgpjbGFzcyBUeXBlczoKICAgICIiIkEgcmVwcmVzZW50YXRpb24gb2Yg
dGhlIHR5cGUgZGVmaW5pdGlvbnMgaW4gYSBXU0RMIGRlZmluaXRpb24uICBUaGlzIHdpbGwgc29t
ZSBkYXkgYmUKICAgIGluY29ycG9yYXRlZCBpbnRvIGEgc2NoZW1hIHBhcnNlciB0aGF0IGNhbiB2
YWxpZGF0ZSB0aGF0IHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSB2YWxpZC4gIEN1cnJlbnRseQog
ICAgaXQgc3RvcmVzIHRoZSBzdHJpbmdzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIGRlZmlu
aXRpb24uIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuZG9jdW1lbnRh
dGlvbiA9ICIiCiAgICAgICAgc2VsZi5kZWZpbml0aW9ucyA9IFtdCgogICAgZGVmIGZyb21Eb20o
c2VsZix0eXBlTm9kZXMpOgogICAgICAgICIiIkNyZWF0ZSBhIG5ldyB0eXBlIGRlZmluaXRpb24g
ZnJvbSBhIERPTS4gIEdlbmVyYWxseSBjYWxsZWQgYnkgV3NkbC5mcm9tRG9tIiIiCgogICAgICAg
IGlmIG5vdCBsZW4odHlwZU5vZGVzKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHlwZXMg
PSB0eXBlTm9kZXNbMF0KICAgICAgICBjb24gPSB4cGF0aC5Db250ZXh0LkNvbnRleHQodHlwZXMs
IHByb2Nlc3Nvck5zcz17J3cnOiBXU0RMX05BTUVTUEFDRX0pCiAgICAgICAgZG9jcyA9IGdfZG9j
dW1lbnRhdGlvbkV4cHJlc3Npb24uZXZhbHVhdGUoY29uKQogICAgICAgIGlmIGRvY3M6CiAgICAg
ICAgICAgIHNlbGYuc2V0RG9jdW1lbnRhdGlvbihDb252ZXJzaW9ucy5TdHJpbmdWYWx1ZShkb2Nz
WzBdKSkKCiAgICAgICAgZm9yIGNoaWxkIGluIHR5cGVzLmNoaWxkTm9kZXM6CiAgICAgICAgICAg
IGlmIGNoaWxkLm5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFOgogICAgICAgICAgICAgICAg
Y29udGludWUKICAgICAgICAgICAgc2VsZi5kZWZpbml0aW9ucy5hcHBlbmQoRXh0ZW5zaW9uRnJv
bURvbShjaGlsZCkpCgogICAgZGVmIHRvRG9tKHNlbGYsZG9jKToKICAgICAgICAiIiJHZW5lcmF0
ZSB0aGUgRE9NIGVxdWl2YWxlbnQgZm9yIHRoaXMgdHlwZSBkZWZpbml0aW9uLiAgR2VuZXJhbGx5
IGNhbGxlZCBieSBXc2RsLnRvRG9tIiIiCgogICAgICAgIGRlID0gZG9jLmRvY3VtZW50RWxlbWVu
dAogICAgICAgIHR5cGVzID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhXU0RMX05BTUVTUEFDRSwnd3Nk
bDp0eXBlcycpCiAgICAgICAgRG9jdW1lbnRhdGlvblRvRG9tKHR5cGVzLHNlbGYuZG9jdW1lbnRh
dGlvbikKICAgICAgICBFeHRlbnNpb25zVG9Eb20odHlwZXMsc2VsZi5kZWZpbml0aW9ucykKICAg
ICAgICBkZS5hcHBlbmRDaGlsZCh0eXBlcykKCgpjbGFzcyBNZXNzYWdlcyhVc2VyRGljdC5Vc2Vy
RGljdCk6CgogICAgZGVmIGFkZE1lc3NhZ2Uoc2VsZixuYW1lLGRvY3VtZW50YXRpb24gPSAiIik6
CiAgICAgICAgIiIiQWRkIGEgbmV3IG1lc3NhZ2UgdG8gdGhlIFdTREwgZGVmaW5pdGlvbiIiIgog
ICAgICAgIGlmIHNlbGYuaGFzX2tleShuYW1lKToKICAgICAgICAgICAgcmFpc2UgV3NkbEV4Y2Vw
dGlvbigiTWVzc2FnZSAlcyBhbHJlYWR5IGV4aXN0cyIgJSBuYW1lKQogICAgICAgIG0gPSBNZXNz
YWdlKG5hbWUpCiAgICAgICAgbS5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbgogICAgICAg
IHNlbGZbbmFtZV0gPSBtCiAgICAgICAgcmV0dXJuIG0KCiAgICBkZWYgZnJvbURvbShzZWxmLG1l
c3NhZ2VzKToKICAgICAgICBmb3IgbSBpbiBtZXNzYWdlczoKICAgICAgICAgICAgY29uID0geHBh
dGguQ29udGV4dC5Db250ZXh0KG0sIHByb2Nlc3Nvck5zcz17J3cnOiBXU0RMX05BTUVTUEFDRX0p
CiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBEb2N1bWVudGF0aW9uRnJvbURvbShjb24pCiAg
ICAgICAgICAgIG1zZyA9IHNlbGYuYWRkTWVzc2FnZShtLmdldEF0dHJpYnV0ZU5TKCcnLCduYW1l
JyksZG9jdW1lbnRhdGlvbikKCiAgICAgICAgICAgIHBhcnRzID0gZ19wYXJ0c0V4cHJlc3Npb24u
ZXZhbHVhdGUoY29uKQogICAgICAgICAgICBmb3IgcCBpbiBwYXJ0czoKICAgICAgICAgICAgICAg
IG4gPSBwLmdldEF0dHJpYnV0ZU5TKCcnLCduYW1lJykKICAgICAgICAgICAgICAgIGVsZW1lbnQg
PSBwLmdldEF0dHJpYnV0ZU5TKCcnLCdlbGVtZW50JykKICAgICAgICAgICAgICAgIF90eXBlID0g
cC5nZXRBdHRyaWJ1dGVOUygnJywndHlwZScpCiAgICAgICAgICAgICAgICBtc2cuYWRkUGFydChu
LGVsZW1lbnQsX3R5cGUpICAgICAgICAgICAgCgogICAgZGVmIHRvRG9tKHNlbGYsZG9jKToKICAg
ICAgICBmb3IgbWVzc2FnZSBpbiBzZWxmLnZhbHVlcygpOgogICAgICAgICAgICBtZXNzYWdlLnRv
RG9tKGRvYykKCmNsYXNzIE1lc3NhZ2U6CiAgICBkZWYgX19pbml0X18oc2VsZixuYW1lKToKICAg
ICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5kb2N1bWVudGF0aW9uID0gIiIKICAg
ICAgICBzZWxmLnBhcnRzID0ge30KCgogICAgZGVmIGFkZFBhcnQoc2VsZixuYW1lLGVsZW1lbnQ9
JycsX3R5cGU9JycpOgogICAgICAgICIiIkFkZCBhIG5ldyBwYXJ0IHRvIGEgbWVzc2FnZSIiIgog
ICAgICAgIGlmIHNlbGYucGFydHMuaGFzX2tleShuYW1lKToKICAgICAgICAgICAgcmFpc2UgV3Nk
bEV4Y2VwdGlvbigiTWVzc2FnZSAlcyBhbHJlYWR5IGhhcyBwYXJ0ICVzIGV4aXN0cyIgJSAoc2Vs
Zi5uYW1lLG5hbWUpKQogICAgICAgIHAgPSBQYXJ0KG5hbWUpCiAgICAgICAgcC5lbGVtZW50ID0g
ZWxlbWVudAogICAgICAgIHAudHlwZSA9IF90eXBlCiAgICAgICAgc2VsZi5wYXJ0c1tuYW1lXSA9
IHAKICAgICAgICByZXR1cm4gcAogICAgICAgIAoKICAgIGRlZiB0b0RvbShzZWxmLGRvYyk6CiAg
ICAgICAgZGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50CiAgICAgICAgbSA9IGRvYy5jcmVhdGVFbGVt
ZW50TlMoV1NETF9OQU1FU1BBQ0UsJ3dzZGw6bWVzc2FnZScpCiAgICAgICAgbS5zZXRBdHRyaWJ1
dGVOUygnJywnbmFtZScsc2VsZi5uYW1lKQogICAgICAgIERvY3VtZW50YXRpb25Ub0RvbShtLHNl
bGYuZG9jdW1lbnRhdGlvbikKICAgICAgICBmb3IgcCBpbiBzZWxmLnBhcnRzLnZhbHVlcygpOgog
ICAgICAgICAgICBwLnRvRG9tKG0pCiAgICAgICAgZGUuYXBwZW5kQ2hpbGQobSkKCgpjbGFzcyBQ
YXJ0OgogICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFt
ZQogICAgICAgIHNlbGYuZWxlbWVudCA9ICIiCiAgICAgICAgc2VsZi50eXBlID0gIiIKCiAgICBk
ZWYgdG9Eb20oc2VsZixtZXNzYWdlKToKICAgICAgICBkb2MgPSBtZXNzYWdlLm93bmVyRG9jdW1l
bnQKICAgICAgICBwID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhXU0RMX05BTUVTUEFDRSwnd3NkbDpw
YXJ0JykKICAgICAgICBwLnNldEF0dHJpYnV0ZU5TKCcnLCduYW1lJyxzZWxmLm5hbWUpCiAgICAg
ICAgaWYgc2VsZi5lbGVtZW50OgogICAgICAgICAgICBwLnNldEF0dHJpYnV0ZU5TKCcnLCdlbGVt
ZW50JyxzZWxmLmVsZW1lbnQpCiAgICAgICAgaWYgc2VsZi50eXBlOgogICAgICAgICAgICBwLnNl
dEF0dHJpYnV0ZU5TKCcnLCd0eXBlJyxzZWxmLnR5cGUpCiAgICAgICAgICAgIAogICAgICAgIG1l
c3NhZ2UuYXBwZW5kQ2hpbGQocCkKICAgICAgICAKCmNsYXNzIFBvcnRUeXBlcyhVc2VyRGljdC5V
c2VyRGljdCk6CgogICAgZGVmIGFkZFBvcnRUeXBlKHNlbGYsbmFtZSxkb2N1bWVudGF0aW9uPScn
KToKICAgICAgICAiIiJBZGQgYSBuZXcgcG9ydCB0eXBlIHRvIHRoZSBkZWZpbml0aW9uIiIiCiAg
ICAgICAgaWYgc2VsZi5oYXNfa2V5KG5hbWUpOgogICAgICAgICAgICByYWlzZSBXc2RsRXhjZXB0
aW9uKCJQb3J0IFR5cGUgJXMgYWxyZWFkeSBleGlzdHMiICUgKG5hbWUpKQogICAgICAgIHB0ID0g
UG9ydFR5cGUobmFtZSkKICAgICAgICBwdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbgog
ICAgICAgIHNlbGZbbmFtZV0gPSBwdAogICAgICAgIHJldHVybiBwdAoKICAgIGRlZiBmcm9tRG9t
KHNlbGYscG9ydFR5cGVzKToKCiAgICAgICAgZm9yIHB0IGluIHBvcnRUeXBlczoKICAgICAgICAg
ICAgaWYgcHQubm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAgICAgICAgICBj
b250aW51ZQogICAgICAgICAgICBjb24gPSB4cGF0aC5Db250ZXh0LkNvbnRleHQocHQsIHByb2Nl
c3Nvck5zcz17J3cnOiBXU0RMX05BTUVTUEFDRX0pCgogICAgICAgICAgICBkb2N1bWVudGF0aW9u
ID0gRG9jdW1lbnRhdGlvbkZyb21Eb20oY29uKQogICAgICAgICAgICBwID0gc2VsZi5hZGRQb3J0
VHlwZShwdC5nZXRBdHRyaWJ1dGVOUygnJywnbmFtZScpLGRvY3VtZW50YXRpb24pCgogICAgICAg
ICAgICBvcGVyYXRpb25zID0gZ19vcGVyYXRpb25zRXhwcmVzc2lvbi5ldmFsdWF0ZShjb24pCiAg
ICAgICAgICAgIGZvciBvcCBpbiBvcGVyYXRpb25zOgogICAgICAgICAgICAgICAgY29uID0geHBh
dGguQ29udGV4dC5Db250ZXh0KG9wLCBwcm9jZXNzb3JOc3M9eyd3JzogV1NETF9OQU1FU1BBQ0V9
KQogICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiA9IERvY3VtZW50YXRpb25Gcm9tRG9tKGNv
bikKICAgICAgICAgICAgICAgIG8gPSBwLmFkZE9wZXJhdGlvbihvcC5nZXRBdHRyaWJ1dGVOUygn
JywnbmFtZScpLGRvY3VtZW50YXRpb24pCiAgICAgICAgICAgICAgICBzZWxmLl9faW5wdXRGcm9t
RG9tKGNvbixvKQogICAgICAgICAgICAgICAgc2VsZi5fX291dHB1dEZyb21Eb20oY29uLG8pCiAg
ICAgICAgICAgICAgICBzZWxmLl9fZmF1bHRzRnJvbURvbShjb24sbykKCiAgICBkZWYgdG9Eb20o
c2VsZixkb2MpOgogICAgICAgIGZvciBwdCBpbiBzZWxmLnZhbHVlcygpOgogICAgICAgICAgICBw
dC50b0RvbShkb2MpCgoKICAgIGRlZiB2YWxpZGF0ZShzZWxmLG1lc3NhZ2VzKToKICAgICAgICAi
IiJNYWtlIHN1cmUgYWxsIG9mIG91ciBvcGVyYXRpb25zIGhhdmUgdmFsaWRlIGlucHV0cyBhbmQg
b3V0cHV0cyIiIgogICAgICAgIGZvciBwdCBpbiBzZWxmLnZhbHVlcygpOgogICAgICAgICAgICBw
dC52YWxpZGF0ZShtZXNzYWdlcykKICAgICAgICAKCiAgICBkZWYgX19pbnB1dEZyb21Eb20oc2Vs
Zixjb24sbyk6CiAgICAgICAgaW5wdXQgPSBnX2lucHV0RXhwcmVzc2lvbi5ldmFsdWF0ZShjb24p
CiAgICAgICAgaWYgbGVuKGlucHV0KToKICAgICAgICAgICAgaW5wdXQgPSBpbnB1dFswXQogICAg
ICAgICAgICBtc2cgPSBpbnB1dC5nZXRBdHRyaWJ1dGVOUygnJywnbWVzc2FnZScpCiAgICAgICAg
ICAgIG5hbWUgPSBpbnB1dC5nZXRBdHRyaWJ1dGVOUygnJywnbmFtZScpCiAgICAgICAgICAgIGlj
b24gPSB4cGF0aC5Db250ZXh0LkNvbnRleHQoaW5wdXQsIHByb2Nlc3Nvck5zcz17J3cnOiBXU0RM
X05BTUVTUEFDRX0pCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBEb2N1bWVudGF0aW9uRnJv
bURvbShpY29uKQogICAgICAgICAgICBvLnNldElucHV0KG1zZyxuYW1lLGRvY3VtZW50YXRpb24p
CgogICAgZGVmIF9fb3V0cHV0RnJvbURvbShzZWxmLGNvbixvKToKICAgICAgICBvdXRwdXQgPSBn
X291dHB1dEV4cHJlc3Npb24uZXZhbHVhdGUoY29uKQogICAgICAgIGlmIGxlbihvdXRwdXQpOgog
ICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRbMF0KICAgICAgICAgICAgbXNnID0gb3V0cHV0Lmdl
dEF0dHJpYnV0ZU5TKCcnLCdtZXNzYWdlJykKICAgICAgICAgICAgbmFtZSA9IG91dHB1dC5nZXRB
dHRyaWJ1dGVOUygnJywnbmFtZScpCiAgICAgICAgICAgIG9jb24gPSB4cGF0aC5Db250ZXh0LkNv
bnRleHQob3V0cHV0LCBwcm9jZXNzb3JOc3M9eyd3JzogV1NETF9OQU1FU1BBQ0V9KQogICAgICAg
ICAgICBkb2N1bWVudGF0aW9uID0gRG9jdW1lbnRhdGlvbkZyb21Eb20ob2NvbikKICAgICAgICAg
ICAgby5zZXRPdXRwdXQobXNnLG5hbWUsZG9jdW1lbnRhdGlvbikKCiAgICBkZWYgX19mYXVsdHNG
cm9tRG9tKHNlbGYsY29uLG8pOgogICAgICAgIGZhdWx0cyA9IGdfZmF1bHRFeHByZXNzaW9uLmV2
YWx1YXRlKGNvbikKICAgICAgICBmb3IgZmF1bHQgaW4gZmF1bHRzOgogICAgICAgICAgICBtc2cg
PSBmYXVsdC5nZXRBdHRyaWJ1dGVOUygnJywnbWVzc2FnZScpCiAgICAgICAgICAgIG5hbWUgPSBm
YXVsdC5nZXRBdHRyaWJ1dGVOUygnJywnbmFtZScpCiAgICAgICAgICAgIGZjb24gPSB4cGF0aC5D
b250ZXh0LkNvbnRleHQoZmF1bHQsIHByb2Nlc3Nvck5zcz17J3cnOiBXU0RMX05BTUVTUEFDRX0p
CiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBEb2N1bWVudGF0aW9uRnJvbURvbShmY29uKQog
ICAgICAgICAgICBvLmFkZEZhdWx0KG5hbWUsbXNnLGRvY3VtZW50YXRpb24pCgoKICAgICAgICAK
CmNsYXNzIFBvcnRUeXBlOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLG5hbWUpOgogICAgICAgIHNl
bGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLmRvY3VtZW50YXRpb24gPSAiIgogICAgICAgIHNl
bGYub3BlcmF0aW9ucyA9IHt9CgoKICAgIGRlZiBhZGRPcGVyYXRpb24oc2VsZixuYW1lLGRvY3Vt
ZW50YXRpb249JycpOgogICAgICAgICIiIkFkZCBhIG5ldyBvcGVyYXRpb24gdG8gYSBwb3J0IHR5
cGUiIiIKICAgICAgICBpZiBzZWxmLm9wZXJhdGlvbnMuaGFzX2tleShuYW1lKToKICAgICAgICAg
ICAgcmFpc2UgV3NkbEV4Y2VwdGlvbigiUG9ydCBUeXBlICVzIGFscmVhZHkgaGFzIG9wZXJhdGlv
biAlcyIgJSAoc2VsZi5uYW1lLG5hbWUpKQogICAgICAgIG8gPSBPcGVyYXRpb24obmFtZSkKICAg
ICAgICBvLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uCiAgICAgICAgc2VsZi5vcGVyYXRp
b25zW25hbWVdID0gbwogICAgICAgIHJldHVybiBvCiAgICAgICAgCgogICAgZGVmIHRvRG9tKHNl
bGYsZG9jKToKICAgICAgICBkZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKCiAgICAgICAgcHQgPSBk
b2MuY3JlYXRlRWxlbWVudE5TKFdTRExfTkFNRVNQQUNFLCd3c2RsOnBvcnRUeXBlJykKICAgICAg
ICBwdC5zZXRBdHRyaWJ1dGVOUygnJywnbmFtZScsc2VsZi5uYW1lKQogICAgICAgIERvY3VtZW50
YXRpb25Ub0RvbShwdCxzZWxmLmRvY3VtZW50YXRpb24pCiAgICAgICAgZm9yIG9wIGluIHNlbGYu
b3BlcmF0aW9ucy52YWx1ZXMoKToKICAgICAgICAgICAgb3AudG9Eb20ocHQpCiAgICAgICAgCiAg
ICAgICAgZGUuYXBwZW5kQ2hpbGQocHQpCgogICAgZGVmIHZhbGlkYXRlKHNlbGYsbWVzc2FnZXMp
OgogICAgICAgICIiIk1ha2Ugc3VyZSBhbGwgb2Ygb3VyIG9wZXJhdGlvbnMgaGF2ZSB2YWxpZCBp
bnB1dHMsIG91dHB1dHMgYW5kIGZhdWx0cyIiIgogICAgICAgIGZvciBvcCBpbiBzZWxmLm9wZXJh
dGlvbnMudmFsdWVzKCk6CiAgICAgICAgICAgIG9wLnZhbGlkYXRlKG1lc3NhZ2VzKQogICAgICAg
IAoKCmNsYXNzIE9wZXJhdGlvbjoKCiAgICBkZWYgX19pbml0X18oc2VsZixuYW1lKToKICAgICAg
ICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5kb2N1bWVudGF0aW9uID0gIiIKICAgICAg
ICBzZWxmLmlucHV0ID0gTm9uZQogICAgICAgIHNlbGYub3V0cHV0ID0gTm9uZQogICAgICAgIHNl
bGYuZmF1bHRzID0ge30KCiAgICBkZWYgYWRkRmF1bHQoc2VsZixuYW1lLG1lc3NhZ2UsZG9jdW1l
bnRhdGlvbj0nJyk6CiAgICAgICAgIiIiQWRkIGEgbmV3IGZhdWx0IHRvIHRoZSBvcGVyYXRpb24i
IiIKICAgICAgICBpZiBzZWxmLmZhdWx0cy5oYXNfa2V5KG5hbWUpOgogICAgICAgICAgICByYWlz
ZSBXc2RsRXhjZXB0aW9uKCJPcGVyYXRpb24gJXMgYWxyZWFkeSBoYXMgZmF1bHQgJXMiICUgKHNl
bGYubmFtZSxuYW1lKSkKCiAgICAgICAgZiA9IEZhdWx0KG5hbWUsbWVzc2FnZSkKICAgICAgICBm
LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uCiAgICAgICAgc2VsZi5mYXVsdHNbbmFtZV0g
PSBmCiAgICAgICAgcmV0dXJuIGYKCgogICAgZGVmIHNldElucHV0KHNlbGYsbWVzc2FnZSxuYW1l
PScnLGRvY3VtZW50YXRpb249JycpOgogICAgICAgIGkgPSBJbnB1dChtZXNzYWdlKQogICAgICAg
IGkubmFtZSA9IG5hbWUKICAgICAgICBpLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uCiAg
ICAgICAgc2VsZi5pbnB1dCA9IGkKICAgICAgICByZXR1cm4gaQoKICAgIGRlZiBzZXRPdXRwdXQo
c2VsZixtZXNzYWdlLG5hbWU9JycsZG9jdW1lbnRhdGlvbj0nJyk6CiAgICAgICAgbyA9IE91dHB1
dChtZXNzYWdlKQogICAgICAgIG8ubmFtZSA9IG5hbWUKICAgICAgICBvLmRvY3VtZW50YXRpb24g
PSBkb2N1bWVudGF0aW9uCiAgICAgICAgc2VsZi5vdXRwdXQgPSBvCiAgICAgICAgcmV0dXJuIG8K
CgogICAgZGVmIHRvRG9tKHNlbGYscG9ydFR5cGUpOgogICAgICAgIGRvYyA9IHBvcnRUeXBlLm93
bmVyRG9jdW1lbnQKCiAgICAgICAgb3AgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFdTRExfTkFNRVNQ
QUNFLCd3c2RsOm9wZXJhdGlvbicpCiAgICAgICAgb3Auc2V0QXR0cmlidXRlTlMoJycsJ25hbWUn
LHNlbGYubmFtZSkKCiAgICAgICAgRG9jdW1lbnRhdGlvblRvRG9tKG9wLHNlbGYuZG9jdW1lbnRh
dGlvbikKCiAgICAgICAgaWYgc2VsZi5pbnB1dDoKICAgICAgICAgICAgc2VsZi5pbnB1dC50b0Rv
bShvcCkKICAgICAgICBpZiBzZWxmLm91dHB1dDoKICAgICAgICAgICAgc2VsZi5vdXRwdXQudG9E
b20ob3ApCiAgICAgICAgZm9yIGYgaW4gc2VsZi5mYXVsdHMudmFsdWVzKCk6CiAgICAgICAgICAg
IGYudG9Eb20ob3ApCgogICAgICAgIHBvcnRUeXBlLmFwcGVuZENoaWxkKG9wKQoKICAgIGRlZiB2
YWxpZGF0ZShzZWxmLG1lc3NhZ2VzKToKICAgICAgICAiIiJNYWtlIHN1cmUgb3VyIGlucHV0LCBv
dXRwdXQgYW5kIGZhdWx0cyByZWZyZW5jZSB2YWxpZCBtZXNzYWdlcyIiIgogICAgICAgIGlmIHNl
bGYuaW5wdXQgYW5kIG5vdCBWYWxpZGF0ZVRucyhzZWxmLmlucHV0Lm1lc3NhZ2UsbWVzc2FnZXMp
OgogICAgICAgICAgICByYWlzZSBXc2RsVmFsaWRhdGlvbkV4Y2VwdGlvbigiT3BlcmF0aW9uICVz
LCBPdXRwdXQgcmVmZXJlbmNlcyBpbnZhbGlkIG1lc3NhZ2UgJXMiICUgKHNlbGYubmFtZSwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlucHV0Lm1lc3NhZ2Up
KQoKICAgICAgICBpZiBzZWxmLm91dHB1dCBhbmQgbm90IFZhbGlkYXRlVG5zKHNlbGYub3V0cHV0
Lm1lc3NhZ2UsbWVzc2FnZXMpOgogICAgICAgICAgICByYWlzZSBXc2RsVmFsaWRhdGlvbkV4Y2Vw
dGlvbigiT3BlcmF0aW9uICVzLCBPdXRwdXQgcmVmZXJlbmNlcyBpbnZhbGlkIG1lc3NhZ2UgJXMi
ICUgKHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
ZWxmLm91dHB1dC5tZXNzYWdlKSkKCiAgICAgICAgZm9yIGZhdWx0IGluIHNlbGYuZmF1bHRzLnZh
bHVlcygpOgogICAgICAgICAgICBpZiBub3QgVmFsaWRhdGVUbnMoZmF1bHQubWVzc2FnZSxtZXNz
YWdlcyk6CiAgICAgICAgICAgICAgICByYWlzZSBXc2RsVmFsaWRhdGlvbkV4Y2VwdGlvbigiT3Bl
cmF0aW9uICVzLCBGYXVsdCAlcyByZWZlcmVuY2VzIGludmFsaWQgbWVzc2FnZSAlcyIgJSAoc2Vs
Zi5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZh
dWx0Lm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZmF1bHQubWVzc2FnZSkpCgoKY2xhc3MgSW5wdXQ6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsbWVz
c2FnZSk6CiAgICAgICAgc2VsZi5uYW1lID0gJycKICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNz
YWdlCiAgICAgICAgc2VsZi5kb2N1bWVudGF0aW9uID0gJycKCiAgICBkZWYgdG9Eb20oc2VsZixv
cGVyYXRpb24pOgogICAgICAgIGRvYyA9IG9wZXJhdGlvbi5vd25lckRvY3VtZW50CiAgICAgICAg
aSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoV1NETF9OQU1FU1BBQ0UsJ3dzZGw6aW5wdXQnKQogICAg
ICAgIGkuc2V0QXR0cmlidXRlTlMoJycsJ21lc3NhZ2UnLHNlbGYubWVzc2FnZSkKICAgICAgICBp
ZiBzZWxmLm5hbWU6CiAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMoJycsJ25hbWUnLHNlbGYu
bmFtZSkKICAgICAgICAgICAgCiAgICAgICAgRG9jdW1lbnRhdGlvblRvRG9tKGksc2VsZi5kb2N1
bWVudGF0aW9uKQogICAgICAgIG9wZXJhdGlvbi5hcHBlbmRDaGlsZChpKQoKY2xhc3MgT3V0cHV0
OgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLG1lc3NhZ2UpOgogICAgICAgIHNlbGYubmFtZSA9ICcn
CiAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQogICAgICAgIHNlbGYuZG9jdW1lbnRhdGlv
biA9ICcnCgogICAgZGVmIHRvRG9tKHNlbGYsb3BlcmF0aW9uKToKICAgICAgICBkb2MgPSBvcGVy
YXRpb24ub3duZXJEb2N1bWVudAogICAgICAgIG8gPSBkb2MuY3JlYXRlRWxlbWVudE5TKFdTRExf
TkFNRVNQQUNFLCd3c2RsOm91dHB1dCcpCiAgICAgICAgby5zZXRBdHRyaWJ1dGVOUygnJywnbWVz
c2FnZScsc2VsZi5tZXNzYWdlKQogICAgICAgIGlmIHNlbGYubmFtZToKICAgICAgICAgICAgby5z
ZXRBdHRyaWJ1dGVOUygnJywnbmFtZScsc2VsZi5uYW1lKQogICAgICAgICAgICAKICAgICAgICBE
b2N1bWVudGF0aW9uVG9Eb20obyxzZWxmLmRvY3VtZW50YXRpb24pCiAgICAgICAgb3BlcmF0aW9u
LmFwcGVuZENoaWxkKG8pCgoKY2xhc3MgRmF1bHQ6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsbmFt
ZSxtZXNzYWdlKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5tZXNzYWdl
ID0gbWVzc2FnZQogICAgICAgIHNlbGYuZG9jdW1lbnRhdGlvbiA9ICcnCgogICAgZGVmIHRvRG9t
KHNlbGYsb3BlcmF0aW9uKToKICAgICAgICBkb2MgPSBvcGVyYXRpb24ub3duZXJEb2N1bWVudAog
ICAgICAgIGYgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFdTRExfTkFNRVNQQUNFLCd3c2RsOmZhdWx0
JykKICAgICAgICBmLnNldEF0dHJpYnV0ZU5TKCcnLCdtZXNzYWdlJyxzZWxmLm1lc3NhZ2UpCiAg
ICAgICAgaWYgc2VsZi5uYW1lOgogICAgICAgICAgICBmLnNldEF0dHJpYnV0ZU5TKCcnLCduYW1l
JyxzZWxmLm5hbWUpCiAgICAgICAgICAgIAogICAgICAgIERvY3VtZW50YXRpb25Ub0RvbShmLHNl
bGYuZG9jdW1lbnRhdGlvbikKICAgICAgICBvcGVyYXRpb24uYXBwZW5kQ2hpbGQoZikKCmNsYXNz
IEJpbmRpbmdzKFVzZXJEaWN0LlVzZXJEaWN0KToKCgogICAgZGVmIGFkZEJpbmRpbmcoc2VsZixu
YW1lLF90eXBlLGRvY3VtZW50YXRpb249JycpOgogICAgICAgICIiIkFkZCBhIG5ldyBiaW5kaW5n
IHRvIHRoZSBkZWZpbml0aW9uIiIiCiAgICAgICAgaWYgc2VsZi5oYXNfa2V5KG5hbWUpOgogICAg
ICAgICAgICByYWlzZSBXc2RsRXhjZXB0aW9uKCJmYXVsdCAlcyBhbHJlYWQgZXhpc3RzIiAlIChu
YW1lKSkKCiAgICAgICAgYiA9IEJpbmRpbmcobmFtZSxfdHlwZSkKICAgICAgICBiLmRvY3VtZW50
YXRpb24gPSBkb2N1bWVudGF0aW9uCiAgICAgICAgc2VsZltuYW1lXSA9IGIKICAgICAgICByZXR1
cm4gYiAKCiAgICBkZWYgZnJvbURvbShzZWxmLGJpbmRpbmdzKToKICAgICAgICAKICAgICAgICBm
b3IgYiBpbiBiaW5kaW5nczoKICAgICAgICAgICAgaWYgYi5ub2RlVHlwZSAhPSBOb2RlLkVMRU1F
TlRfTk9ERToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgoKICAgICAgICAgICAgY29uID0geHBh
dGguQ29udGV4dC5Db250ZXh0KGIsIHByb2Nlc3Nvck5zcz17J3cnOiBXU0RMX05BTUVTUEFDRX0p
CgogICAgICAgICAgICBkb2N1bWVudGF0aW9uID0gRG9jdW1lbnRhdGlvbkZyb21Eb20oY29uKQog
ICAgICAgICAgICBiaSA9IHNlbGYuYWRkQmluZGluZyhiLmdldEF0dHJpYnV0ZU5TKCcnLCduYW1l
JyksYi5nZXRBdHRyaWJ1dGVOUygnJywndHlwZScpLGRvY3VtZW50YXRpb24pCgogICAgICAgICAg
ICBmb3IgY2hpbGQgaW4gYi5jaGlsZE5vZGVzOgogICAgICAgICAgICAgICAgaWYgY2hpbGQubm9k
ZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUK
ICAgICAgICAgICAgICAgIGlmIGNoaWxkLm5hbWVzcGFjZVVSSSAhPSBXU0RMX05BTUVTUEFDRSBv
ciBjaGlsZC5sb2NhbE5hbWUgIT0gJ29wZXJhdGlvbic6CiAgICAgICAgICAgICAgICAgICAgI0Fu
IGV4dGVuc2lvbiBFbGVtZW50CiAgICAgICAgICAgICAgICAgICAgYmkuYWRkRXh0ZW5zaW9uKEV4
dGVuc2lvbkZyb21Eb20oY2hpbGQpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAg
ICAgICAgICBjb24gPSB4cGF0aC5Db250ZXh0LkNvbnRleHQoY2hpbGQsIHByb2Nlc3Nvck5zcz17
J3cnOiBXU0RMX05BTUVTUEFDRX0pCgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24g
PSBEb2N1bWVudGF0aW9uRnJvbURvbShjb24pCiAgICAgICAgICAgICAgICAgICAgbyA9IGJpLmFk
ZE9wZXJhdGlvbihjaGlsZC5nZXRBdHRyaWJ1dGVOUygnJywnbmFtZScpLGRvY3VtZW50YXRpb24p
CgogICAgICAgICAgICAgICAgICAgIHNlbGYuX19yZWFkSW5wdXRGcm9tRG9tKGNvbixvKQogICAg
ICAgICAgICAgICAgICAgIHNlbGYuX19yZWFkT3V0cHV0RnJvbURvbShjb24sbykKICAgICAgICAg
ICAgICAgICAgICBzZWxmLl9fcmVhZEZhdWx0c0Zyb21Eb20oY29uLG8pICAgICAgICAgICAgCgog
ICAgZGVmIHRvRG9tKHNlbGYsZG9jKToKICAgICAgICBmb3IgYmluZGluZyBpbiBzZWxmLnZhbHVl
cygpOgogICAgICAgICAgICBiaW5kaW5nLnRvRG9tKGRvYykKCiAgICBkZWYgdmFsaWRhdGUoc2Vs
Zixwb3J0VHlwZXMpOgogICAgICAgIGZvciBiaW5kaW5nIGluIHNlbGYudmFsdWVzKCk6CiAgICAg
ICAgICAgIGJpbmRpbmcudmFsaWRhdGUocG9ydFR5cGVzKQoKICAgIGRlZiBfX3JlYWRJbnB1dEZy
b21Eb20oc2VsZixjb24sb3ApOgogICAgICAgIGlucHV0ID0gZ19pbnB1dEV4cHJlc3Npb24uZXZh
bHVhdGUoY29uKQogICAgICAgIGlmIGxlbihpbnB1dCk6CiAgICAgICAgICAgIGlucHV0ID0gaW5w
dXRbMF0KICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiA9ICcnCiAgICAgICAgICAgIGV4dGVuc2lv
bnMgPSBbXQogICAgICAgICAgICBmb3IgaUNoaWxkIGluIGlucHV0LmNoaWxkTm9kZXM6CiAgICAg
ICAgICAgICAgICBpZiBpQ2hpbGQubm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREU6CiAgICAg
ICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIChpQ2hpbGQubmFtZXNw
YWNlVVJJLGlDaGlsZC5sb2NhbE5hbWUpID09IChXU0RMX05BTUVTUEFDRSwnZG9jdW1lbnRhdGlv
bicpOgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBpQ2hpbGQuZmlyc3RDaGls
ZC5kYXRhCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICNBbiBleHRl
bnNpb24KICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFwcGVuZChFeHRlbnNpb25Gcm9t
RG9tKGlDaGlsZCkpCiAgICAgICAgICAgIGkgPSBvcC5zZXRJbnB1dChkb2N1bWVudGF0aW9uKQog
ICAgICAgICAgICBmb3IgZSBpbiBleHRlbnNpb25zOgogICAgICAgICAgICAgICAgaS5hZGRFeHRl
bnNpb24oZSkKCgogICAgZGVmIF9fcmVhZE91dHB1dEZyb21Eb20oc2VsZixjb24sb3ApOgogICAg
ICAgIG91dHB1dCA9IGdfb3V0cHV0RXhwcmVzc2lvbi5ldmFsdWF0ZShjb24pCiAgICAgICAgaWYg
bGVuKG91dHB1dCk6CiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dFswXQogICAgICAgICAgICBk
b2N1bWVudGF0aW9uID0gJycKICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtdCiAgICAgICAgICAg
IGZvciBpQ2hpbGQgaW4gb3V0cHV0LmNoaWxkTm9kZXM6CiAgICAgICAgICAgICAgICBpZiBpQ2hp
bGQubm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAgICAgICAgICAgICAgY29u
dGludWUKICAgICAgICAgICAgICAgIGlmIChpQ2hpbGQubmFtZXNwYWNlVVJJLGlDaGlsZC5sb2Nh
bE5hbWUpID09IChXU0RMX05BTUVTUEFDRSwnZG9jdW1lbnRhdGlvbicpOgogICAgICAgICAgICAg
ICAgICAgIGRvY3VtZW50YXRpb24gPSBpQ2hpbGQuZmlyc3RDaGlsZC5kYXRhCiAgICAgICAgICAg
ICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICNBbiBleHRlbnNpb24KICAgICAgICAgICAg
ICAgICAgICBleHRlbnNpb25zLmFwcGVuZChFeHRlbnNpb25Gcm9tRG9tKGlDaGlsZCkpCgogICAg
ICAgICAgICBibyA9IG9wLnNldE91dHB1dChkb2N1bWVudGF0aW9uKQogICAgICAgICAgICBmb3Ig
ZSBpbiBleHRlbnNpb25zOgogICAgICAgICAgICAgICAgYm8uYWRkRXh0ZW5zaW9uKGUpCgoKCiAg
ICBkZWYgX19yZWFkRmF1bHRzRnJvbURvbShzZWxmLGNvbixvcCk6CiAgICAgICAgZmF1bHRzID0g
Z19mYXVsdEV4cHJlc3Npb24uZXZhbHVhdGUoY29uKQogICAgICAgIGZvciBmYXVsdCBpbiBmYXVs
dHM6CiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSAnJwogICAgICAgICAgICBleHRlbnNpb25z
ID0gW10KICAgICAgICAgICAgZm9yIGlDaGlsZCBpbiBmYXVsdC5jaGlsZE5vZGVzOgogICAgICAg
ICAgICAgICAgaWYgaUNoaWxkLm5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFOgogICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiAoaUNoaWxkLm5hbWVzcGFj
ZVVSSSxpQ2hpbGQubG9jYWxOYW1lKSA9PSAoV1NETF9OQU1FU1BBQ0UsJ2RvY3VtZW50YXRpb24n
KToKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uID0gaUNoaWxkLmZpcnN0Q2hpbGQu
ZGF0YQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjQW4gZXh0ZW5z
aW9uCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5hcHBlbmQoRXh0ZW5zaW9uRnJvbURv
bShpQ2hpbGQpKQogICAgICAgICAgICBiZiA9IG9wLmFkZEZhdWx0KGZhdWx0LmdldEF0dHJpYnV0
ZU5TKCcnLCduYW1lJyksZG9jdW1lbnRhdGlvbikKICAgICAgICAgICAgZm9yIGUgaW4gZXh0ZW5z
aW9uczoKICAgICAgICAgICAgICAgIGJmLmFkZEV4dGVuc2lvbihlKQoKCmNsYXNzIEJpbmRpbmc6
CgogICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSxfdHlwZSk6CiAgICAgICAgc2VsZi5uYW1lID0g
bmFtZQogICAgICAgIHNlbGYudHlwZSA9IF90eXBlCiAgICAgICAgc2VsZi5leHRlbnNpb25zID0g
W10KICAgICAgICBzZWxmLm9wZXJhdGlvbnMgPSB7fQoKICAgIGRlZiBhZGRPcGVyYXRpb24oc2Vs
ZixuYW1lLGRvY3VtZW50YXRpb249JycpOgogICAgICAgIGlmIHNlbGYub3BlcmF0aW9ucy5oYXNf
a2V5KG5hbWUpOgogICAgICAgICAgICByYWlzZSBXc2RsRXhjZXB0aW9uKCJvcGVyYXRpb24gJXMg
YWxyZWFkIGV4aXN0cyBvbiBiaW5kaW5nICVzIiAlIChuYW1lLHNlbGYubmFtZSkpCgogICAgICAg
IG8gPSBCT3BlcmF0aW9uKG5hbWUpCiAgICAgICAgby5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRh
dGlvbgogICAgICAgIHNlbGYub3BlcmF0aW9uc1tuYW1lXSA9IG8KICAgICAgICByZXR1cm4gbwog
ICAgICAgIAogICAgZGVmIGFkZEV4dGVuc2lvbihzZWxmLHN0KToKICAgICAgICBzZWxmLmV4dGVu
c2lvbnMuYXBwZW5kKHN0KQoKICAgIGRlZiB0b0RvbShzZWxmLGRvYyk6CiAgICAgICAgZGUgPSBk
b2MuZG9jdW1lbnRFbGVtZW50CiAgICAgICAgYiA9IGRvYy5jcmVhdGVFbGVtZW50TlMoV1NETF9O
QU1FU1BBQ0UsJ3dzZGw6YmluZGluZycpCgogICAgICAgIGIuc2V0QXR0cmlidXRlTlMoJycsJ25h
bWUnLHNlbGYubmFtZSkKICAgICAgICBiLnNldEF0dHJpYnV0ZU5TKCcnLCd0eXBlJyxzZWxmLnR5
cGUpCgogICAgICAgIEV4dGVuc2lvbnNUb0RvbShiLHNlbGYuZXh0ZW5zaW9ucykKICAgICAgICBm
b3Igb3AgaW4gc2VsZi5vcGVyYXRpb25zLnZhbHVlcygpOgogICAgICAgICAgICBvcC50b0RvbShi
KQoKICAgICAgICBkZS5hcHBlbmRDaGlsZChiKQoKICAgIGRlZiB2YWxpZGF0ZShzZWxmLHBvcnRU
eXBlcyk6CiAgICAgICAgIiIiVmFsaWRhdGUgdGhhdCB0aGlzIGJpbmRpbmcgcmVmZXJlbmNlcyBh
IHZhbGlkIHBvcnQgdHlwZSIiIgogICAgICAgIGlmIG5vdCBWYWxpZGF0ZVRucyhzZWxmLnR5cGUs
cG9ydFR5cGVzKToKICAgICAgICAgICAgcmFpc2UgV3NkbFZhbGlkYXRpb25FeGNlcHRpb24oIkJp
bmRpbmcgJXMsIHJlZmVyZW5jZXMgaW52YWxpZCBwb3J0VHlwZSAlcyIgJSAoc2VsZi5uYW1lLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGUpKQoKY2xhc3MgQk9wZXJh
dGlvbjoKCiAgICBkZWYgX19pbml0X18oc2VsZixuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBu
YW1lCiAgICAgICAgc2VsZi5kb2N1bWVudGF0aW9uID0gIiIKCiAgICAgICAgc2VsZi5pbnB1dCA9
IE5vbmUKICAgICAgICBzZWxmLm91dHB1dCA9IE5vbmUKICAgICAgICBzZWxmLmZhdWx0cyA9IHt9
CgogICAgZGVmIHNldElucHV0KHNlbGYsZG9jdW1lbnRhdGlvbj0nJyk6CiAgICAgICAgaSA9IEJJ
bnB1dCgpCiAgICAgICAgaS5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbgogICAgICAgIHNl
bGYuaW5wdXQgPSBpCiAgICAgICAgcmV0dXJuIGkKCiAgICBkZWYgc2V0T3V0cHV0KHNlbGYsZG9j
dW1lbnRhdGlvbj0nJyk6CiAgICAgICAgbyA9IEJPdXRwdXQoKQogICAgICAgIG8uZG9jdW1lbnRh
dGlvbiA9IGRvY3VtZW50YXRpb24KICAgICAgICBzZWxmLm91dHB1dCA9IG8KICAgICAgICByZXR1
cm4gbwoKICAgIGRlZiBhZGRGYXVsdChzZWxmLG5hbWUsZG9jdW1lbnRhdGlvbj0nJyk6CiAgICAg
ICAgaWYgc2VsZi5mYXVsdHMuaGFzX2tleShuYW1lKToKICAgICAgICAgICAgcmFpc2UgV3NkbEV4
Y2VwdGlvbigiZmF1bHQgJXMgYWxyZWFkeSBleGlzdHMgb24gb3BlcmF0aW9uICVzIiAlIChuYW1l
LHNlbGYubmFtZSkpCiAgICAgICAgZiA9IEJGYXVsdChuYW1lKQogICAgICAgIGYuZG9jdW1lbnRh
dGlvbiA9IGRvY3VtZW50YXRpb24KICAgICAgICBzZWxmLmZhdWx0c1tuYW1lXSA9IGYKICAgICAg
ICByZXR1cm4gZgoKICAgIGRlZiB0b0RvbShzZWxmLGJpbmRpbmcpOgogICAgICAgIGRvYyA9IGJp
bmRpbmcub3duZXJEb2N1bWVudAoKICAgICAgICBvID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhXU0RM
X05BTUVTUEFDRSwnd3NkbDpvcGVyYXRpb24nKQogICAgICAgIG8uc2V0QXR0cmlidXRlTlMoJycs
J25hbWUnLHNlbGYubmFtZSkKCiAgICAgICAgRG9jdW1lbnRhdGlvblRvRG9tKG8sc2VsZi5kb2N1
bWVudGF0aW9uKQoKICAgICAgICBpZiBzZWxmLmlucHV0OgogICAgICAgICAgICBzZWxmLmlucHV0
LnRvRG9tKG8pCgogICAgICAgIGlmIHNlbGYub3V0cHV0OgogICAgICAgICAgICBzZWxmLm91dHB1
dC50b0RvbShvKQoKICAgICAgICBmb3IgZiBpbiBzZWxmLmZhdWx0cy52YWx1ZXMoKToKICAgICAg
ICAgICAgZi50b0RvbShvKQoKCiAgICAgICAgYmluZGluZy5hcHBlbmRDaGlsZChvKQoKCmNsYXNz
IEJJbnB1dDoKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5kb2N1bWVudGF0
aW9uID0gJycKICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSBbXQogICAgCiAgICBkZWYgYWRkRXh0
ZW5zaW9uKHNlbGYsZXh0KToKICAgICAgICBzZWxmLmV4dGVuc2lvbnMuYXBwZW5kKGV4dCkKICAg
ICAgICAKICAgIGRlZiB0b0RvbShzZWxmLG9wZXJhdGlvbik6CiAgICAgICAgZG9jID0gb3BlcmF0
aW9uLm93bmVyRG9jdW1lbnQKCiAgICAgICAgaSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoV1NETF9O
QU1FU1BBQ0UsJ3dzZGw6aW5wdXQnKQoKICAgICAgICBEb2N1bWVudGF0aW9uVG9Eb20oaSxzZWxm
LmRvY3VtZW50YXRpb24pCiAgICAgICAgRXh0ZW5zaW9uc1RvRG9tKGksc2VsZi5leHRlbnNpb25z
KQoKICAgICAgICBvcGVyYXRpb24uYXBwZW5kQ2hpbGQoaSkKCgpjbGFzcyBCT3V0cHV0OgoKICAg
IGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmRvY3VtZW50YXRpb24gPSAnJwogICAg
ICAgIHNlbGYuZXh0ZW5zaW9ucyA9IFtdCiAgICAKICAgIGRlZiBhZGRFeHRlbnNpb24oc2VsZixl
eHQpOgogICAgICAgIHNlbGYuZXh0ZW5zaW9ucy5hcHBlbmQoZXh0KQogICAgICAgIAogICAgZGVm
IHRvRG9tKHNlbGYsb3BlcmF0aW9uKToKICAgICAgICBkb2MgPSBvcGVyYXRpb24ub3duZXJEb2N1
bWVudAoKICAgICAgICBvID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhXU0RMX05BTUVTUEFDRSwnd3Nk
bDpvdXRwdXQnKQoKICAgICAgICBEb2N1bWVudGF0aW9uVG9Eb20obyxzZWxmLmRvY3VtZW50YXRp
b24pCiAgICAgICAgRXh0ZW5zaW9uc1RvRG9tKG8sc2VsZi5leHRlbnNpb25zKQoKICAgICAgICBv
cGVyYXRpb24uYXBwZW5kQ2hpbGQobykKCgpjbGFzcyBCRmF1bHQ6CgogICAgZGVmIF9faW5pdF9f
KHNlbGYsbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuZG9jdW1l
bnRhdGlvbiA9ICcnCiAgICAgICAgc2VsZi5leHRlbnNpb25zID0gW10KICAgIAogICAgZGVmIGFk
ZEV4dGVuc2lvbihzZWxmLGV4dCk6CiAgICAgICAgc2VsZi5leHRlbnNpb25zLmFwcGVuZChleHQp
CiAgICAgICAgCiAgICBkZWYgdG9Eb20oc2VsZixvcGVyYXRpb24pOgogICAgICAgIGRvYyA9IG9w
ZXJhdGlvbi5vd25lckRvY3VtZW50CgogICAgICAgIGYgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFdT
RExfTkFNRVNQQUNFLCd3c2RsOmZhdWx0JykKICAgICAgICBmLnNldEF0dHJpYnV0ZU5TKCcnLCdu
YW1lJyxzZWxmLm5hbWUpCgogICAgICAgIERvY3VtZW50YXRpb25Ub0RvbShmLHNlbGYuZG9jdW1l
bnRhdGlvbikKICAgICAgICBFeHRlbnNpb25zVG9Eb20oZixzZWxmLmV4dGVuc2lvbnMpCgogICAg
ICAgIG9wZXJhdGlvbi5hcHBlbmRDaGlsZChmKQoKCmNsYXNzIFNlcnZpY2VzKFVzZXJEaWN0LlVz
ZXJEaWN0KToKCiAgICBkZWYgYWRkU2VydmljZShzZWxmLG5hbWUsZG9jdW1lbnRhdGlvbj0nJyk6
CiAgICAgICAgaWYgc2VsZi5oYXNfa2V5KG5hbWUpOgogICAgICAgICAgICByYWlzZSBXc2RsRXhj
ZXB0aW9uKCJzZXJ2aWNlICVzIGFscmVhZHkgZXhpc3RzIiAlIChuYW1lKSkKICAgICAgICBzID0g
U2VydmljZShuYW1lKQogICAgICAgIHMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb24KICAg
ICAgICBzZWxmW25hbWVdID0gcwogICAgICAgIHJldHVybiBzCgoKICAgIGRlZiBmcm9tRG9tKHNl
bGYsc2VydmljZXMpOgoKICAgICAgICBmb3Igc2VydiBpbiBzZXJ2aWNlczoKICAgICAgICAgICAg
aWYgc2Vydi5ub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERToKICAgICAgICAgICAgICAgIGNv
bnRpbnVlCgogICAgICAgICAgICBjb24gPSB4cGF0aC5Db250ZXh0LkNvbnRleHQoc2VydiwgcHJv
Y2Vzc29yTnNzPXsndyc6IFdTRExfTkFNRVNQQUNFfSkKICAgICAgICAgICAgZG9jdW1lbnRhdGlv
biA9IERvY3VtZW50YXRpb25Gcm9tRG9tKGNvbikKICAgICAgICAgICAgcyA9IHNlbGYuYWRkU2Vy
dmljZShzZXJ2LmdldEF0dHJpYnV0ZU5TKCcnLCduYW1lJyksZG9jdW1lbnRhdGlvbikKCiAgICAg
ICAgICAgIGZvciBwZCBpbiBnX3BvcnRzRXhwcmVzc2lvbi5ldmFsdWF0ZShjb24pOgogICAgICAg
ICAgICAgICAgcGNvbiA9IHhwYXRoLkNvbnRleHQuQ29udGV4dChwZCwgcHJvY2Vzc29yTnNzPXsn
dyc6IFdTRExfTkFNRVNQQUNFfSkKICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBEb2N1
bWVudGF0aW9uRnJvbURvbShwY29uKQogICAgICAgICAgICAgICAgcCA9IHMuYWRkUG9ydChwZC5n
ZXRBdHRyaWJ1dGVOUygnJywnbmFtZScpLHBkLmdldEF0dHJpYnV0ZU5TKCcnLCdiaW5kaW5nJyks
ZG9jdW1lbnRhdGlvbikKCiAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gcGQuY2hpbGROb2Rl
czoKICAgICAgICAgICAgICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRf
Tk9ERToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAg
ICBpZiAoY2hpbGQubmFtZXNwYWNlVVJJLGNoaWxkLmxvY2FsTmFtZSkgID09IChXU0RMX05BTUVT
UEFDRSwnZG9jdW1lbnRhdGlvbicpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQog
ICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICNBbiBleHRl
bnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgcC5hZGRFeHRlbnNpb24oRXh0ZW5zaW9uRnJv
bURvbShjaGlsZCkpCgoKICAgICAgICAgICAgZm9yIGNoaWxkIGluIHNlcnYuY2hpbGROb2RlczoK
ICAgICAgICAgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFOgog
ICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubmFt
ZXNwYWNlVVJJLGNoaWxkLmxvY2FsTmFtZSkgaW4gWyhXU0RMX05BTUVTUEFDRSwnZG9jdW1lbnRh
dGlvbicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChXU0RMX05BTUVTUEFDRSwncG9ydCcpXToKICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjQW4g
ZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgcy5hZGRFeHRlbnNpb24oRXh0ZW5zaW9uRnJv
bURvbShjaGlsZCkpCgoKICAgIGRlZiB0b0RvbShzZWxmLGRvYyk6CiAgICAgICAgZm9yIHMgaW4g
c2VsZi52YWx1ZXMoKToKICAgICAgICAgICAgcy50b0RvbShkb2MpCgoKY2xhc3MgU2VydmljZToK
ICAgIGRlZiBfX2luaXRfXyhzZWxmLG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAg
ICAgICBzZWxmLmRvY3VtZW50YXRpb24gPSAiIgogICAgICAgIHNlbGYucG9ydHMgPSB7fQogICAg
ICAgIHNlbGYuZXh0ZW5zaW9ucyA9IFtdCgogICAgZGVmIGFkZFBvcnQoc2VsZixuYW1lLGJpbmRp
bmcsZG9jdW1lbnRhdGlvbj0nJyk6CiAgICAgICAgaWYgc2VsZi5wb3J0cy5oYXNfa2V5KG5hbWUp
OgogICAgICAgICAgICByYWlzZSBXc2RsRXhjZXB0aW9uKCJwb3J0ICVzIGFscmVhZHkgZXhpc3Rz
IG9uIHNlcnZpY2UgJXMiICUgKG5hbWUsc2VsZi5uYW1lKSkKICAgICAgICBwID0gUG9ydChuYW1l
LGJpbmRpbmcpCiAgICAgICAgcC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbgogICAgICAg
IHNlbGYucG9ydHNbbmFtZV0gPSBwCiAgICAgICAgcmV0dXJuIHAKCiAgICBkZWYgYWRkRXh0ZW5z
aW9uKHNlbGYsZXh0KToKICAgICAgICBzZWxmLmV4dGVuc2lvbnMuYXBwZW5kKGV4dCkKCiAgICBk
ZWYgdG9Eb20oc2VsZixkb2MpOgogICAgICAgIGRlID0gZG9jLmRvY3VtZW50RWxlbWVudAogICAg
ICAgIHMgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFdTRExfTkFNRVNQQUNFLCd3c2RsOnNlcnZpY2Un
KQogICAgICAgIHMuc2V0QXR0cmlidXRlTlMoJycsJ25hbWUnLHNlbGYubmFtZSkKICAgICAgICBE
b2N1bWVudGF0aW9uVG9Eb20ocyxzZWxmLmRvY3VtZW50YXRpb24pCgogICAgICAgIGZvciBwIGlu
IHNlbGYucG9ydHMudmFsdWVzKCk6CiAgICAgICAgICAgIHAudG9Eb20ocykKCiAgICAgICAgRXh0
ZW5zaW9uc1RvRG9tKHMsc2VsZi5leHRlbnNpb25zKQoKICAgICAgICBkZS5hcHBlbmRDaGlsZChz
KQoKCmNsYXNzIFBvcnQ6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSxiaW5kaW5nKToKICAg
ICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5iaW5kaW5nID0gYmluZGluZwogICAg
ICAgIHNlbGYuZG9jdW1lbnRhdGlvbiA9ICIiCiAgICAgICAgc2VsZi5leHRlbnNpb25zID0gW10K
CiAgICBkZWYgYWRkRXh0ZW5zaW9uKHNlbGYsZXh0KToKICAgICAgICBzZWxmLmV4dGVuc2lvbnMu
YXBwZW5kKGV4dCkKCiAgICBkZWYgdG9Eb20oc2VsZixwb3J0KToKICAgICAgICBkb2MgPSBwb3J0
Lm93bmVyRG9jdW1lbnQKICAgICAgICBwID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhXU0RMX05BTUVT
UEFDRSwnd3NkbDpwb3J0JykKICAgICAgICBwLnNldEF0dHJpYnV0ZU5TKCcnLCduYW1lJyxzZWxm
Lm5hbWUpCiAgICAgICAgcC5zZXRBdHRyaWJ1dGVOUygnJywnYmluZGluZycsc2VsZi5iaW5kaW5n
KQogICAgICAgIEV4dGVuc2lvbnNUb0RvbShwLHNlbGYuZXh0ZW5zaW9ucykKCiAgICAgICAgcG9y
dC5hcHBlbmRDaGlsZChwKQoKIyMjIyMjIyMKI1V0aWxpdHkgZnVuY3Rpb25zCiMjIyMjIyMjCmRl
ZiBEb2N1bWVudGF0aW9uVG9Eb20ocGFyZW50LGRvYyk6CiAgICBpZiBkb2M6CiAgICAgICAgZGMg
PSBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoV1NETF9OQU1FU1BBQ0UsJ3dz
ZGw6ZG9jdW1lbnRhdGlvbicpCiAgICAgICAgZGMuYXBwZW5kQ2hpbGQocGFyZW50Lm93bmVyRG9j
dW1lbnQuY3JlYXRlVGV4dE5vZGUoZG9jKSkKICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZGMp
CiAgICAKCmRlZiBEb2N1bWVudGF0aW9uRnJvbURvbShjb24pOgogICAgZG9jcyA9IGdfZG9jdW1l
bnRhdGlvbkV4cHJlc3Npb24uZXZhbHVhdGUoY29uKQogICAgaWYgZG9jczoKICAgICAgICByZXR1
cm4gQ29udmVyc2lvbnMuU3RyaW5nVmFsdWUoZG9jc1swXSkKICAgIHJldHVybiAnJwoKZGVmIEV4
dGVuc2lvbkZyb21Eb20obm9kZSk6CiAgICBzdCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCiAgICBQ
cmV0dHlQcmludChub2RlLHN0cmVhbT1zdCkKICAgIHJldHVybiBzdC5nZXR2YWx1ZSgpCiAgICAK
ZGVmIEV4dGVuc2lvbnNUb0RvbShwYXJlbnQsZXh0cyk6CiAgICByZWFkZXIgPSBwRG9tbGV0dGUu
UHlFeHBhdFJlYWRlcigpCiAgICBmb3IgZSBpbiBleHRzOgogICAgICAgIGRvbSA9IHJlYWRlci5m
cm9tU3RyaW5nKGUpCiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGRvbS5kb2N1bWVudEVsZW1l
bnQpCiAgICAgICAgcmVhZGVyLnJlbGVhc2VOb2RlKGRvbSkKICAgICAgICAgICAgCmRlZiBWYWxp
ZGF0ZVRucyhxbmFtZSxzb3VyY2VzKToKICAgIHByZWZpeCxsb2NhbE5hbWUgPSBTcGxpdFFOYW1l
KHFuYW1lKQogICAgaWYgcHJlZml4ID09ICd0bnMnOgogICAgICAgICNMb2NhbCB0byB0aGlzIGRv
Y3VtZW50CiAgICAgICAgaWYgbm90IHNvdXJjZXMuaGFzX2tleShsb2NhbE5hbWUpOgogICAgICAg
ICAgICByZXR1cm4gMAogICAgZWxzZToKICAgICAgICAjRklYTUUgQ2Fubm90IGN1cnJlbnRseXQg
dmFsaWRhdGUgdGhpcwogICAgICAgIHBhc3MKCiAgICByZXR1cm4gMQo=    (05)

--------------Boundary-00=_27XBJLWDN55MQIL2GW2F--    (06)