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

Signing you up...

Thank you for signing up!

PHP Decode

$NCiR0aW1lX29sZCA9IDA7IC8vIGb8ciBkaWUgRm9ydHNjaHJpdHRzYW56ZWlnZQNCiR0aW1lX29sZCA9IDA7IC8vI..

Decoded Output download

// Nett, dass Sie sich fuer meinen sourcecode interessieren. Der Link auf webdesign.weisshart.de darf nur nach Erwerb einer Lizenz entfernt werden!
// @ini_set('display_errors', '1');



setlocale (LC_CTYPE, 'de_DE'); // strtolower auch mit Umlauten - aber anscheinend nicht unter PHP 5.4


if (!@ini_get('safe_mode')) @set_time_limit(45);
$mtime = microtime(); $mtime = explode( ' ', $mtime); $mtime = $mtime[1] + $mtime[0];
$such_start = $mtime;

$version= '<!-- Version 2.5.64 -->';


if (phpversion() < '4.3.0') {
	echo "<p>Dieses Script erfordert PHP Version 4.3.0 oder h&ouml;her!<br />";
	echo "auf Ihrem Server l&auml;uft aber PHP Version ".phpversion().".</p>";
	exit;
}

$method = $_SERVER['REQUEST_METHOD'];

$array = "";
$ausgabe ="";
$found = 0;
$e = "";
$sorthinweis = "";
$link = "";
$durchsucht = 0;
$bereits_found = array(); 


if (!isset($plural)){
	$plural = "n";
}

//if (!isset($punct)){$punct = "no";}

if (!isset($maxmsg)){
	$maxmsg = 100;
}

if (!isset($dateform)){
	$dateform = "de";
}

if (!isset($suchdauer)){
	$suchdauer = "Sekunden";
}

if (!isset($beschreib)){
	$beschreib = "Beschreibung: ";
}

if (!isset($treff)){
	$treff = "Treffer";
}

if (!isset($filedate)){
	$filedate = "zuletzt ge&auml;ndert am ";
}

if (!isset($noresult)){
	$noresult = "<p><br />Es wurden leider keine exakten &Uuml;bereinstimmungen mit dem eingegebenen Suchbegriff gefunden.<br />Vielleicht wollen Sie es mit einem allgemeineren Suchbegriff versuchen.</p>";
}

if (!isset($vorschlag)){
	$vorschlag = "Oder Sie versuchen es einfach mal mit";
}

if (!isset($minlength)){
	$minlength = "<p><br />Geben Sie bitte einen Suchbegriff von mindestens&nbsp;".$length."&nbsp;Buchstaben L&auml;nge ein.</p>";
}



if (!isset($iframe)){
   $iframe=false;
}

if (!isset($targetwahl)){
   $targetwahl=false;
}

if (!isset($exclude_strings)){
   $exclude_strings = array();
}

if (!isset($installation_path)) {
	$installation_path = "wdw_suche";
}

if (!isset($encoding)) {
	$encoding = "ISO";
}

if (!isset($thumb_replace)) {
	$thumb_replace = "_ss.jpg";
}

$list_hx_start = $list_hx_end = "";
if (isset($list_hx) && is_numeric($list_hx)) {
	$list_hx_start = '<h'.$list_hx.'>';
	$list_hx_end   = '</h'.$list_hx.'> ';
}

if (!isset($hx_suchtip) || !is_numeric($hx_suchtip )) {
	$hx_suchtip = 3;
}



// verbotene Zeichen
$exclude_strings2 = array(
   '\', // das \ dient zum Maskieren von reservierten Zeichen 
	"'",
   '*',
	'|',
   '+'
);

$exclude_strings_merge = array_merge($exclude_strings, $exclude_strings2);


if (isset($suchtip0)){
	$searchtip0 = "
<h$hx_suchtip id='suchtipheader'>$suchtip0 </h$hx_suchtip>
";
	} else {
	$searchtip0 = "
<h$hx_suchtip id='suchtipheader'>Suchtipps: </h$hx_suchtip>
";
}

if (isset($suchtip1)){
	$searchtip1 = "<li>$suchtip1</li>
";
	} else {
	$searchtip1 = "<li>Die Suche findet alle Seiten, die Ihren Suchbegriff enthalten - auch als Wortbestandteil. Eine Suche nach &raquo;test&laquo; findet also auch &raquo;sp&auml;<em>test</em>e&laquo;.</li>";
	
}

if (isset($suchtip2)){
	$searchtip2 = "<li>$suchtip2</li>
";
	} else {
	$searchtip2 = "<li>Wenn Sie Ihre Suche auf ganze W&ouml;rter einschr&auml;nken wollen, f&uuml;gen Sie vor und hinter dem Wort ein Leerzeichen ein, und umschlie&szlig;en alles mit Anf&uuml;hrungszeichen. Beispiel: \" test \". &raquo;sp&auml;<em>test</em>e&laquo; wird dann nicht mehr gefunden. </li>";
}

$searchtip2 = "";

if (isset($suchtip3)){
	$searchtip3 = "<li>$suchtip3</li>
";
	} else {
		$searchtip3 = "<li>Wenn Sie mehrere W&ouml;rter eingeben, werden alle Dokumente gefunden, die <em>alle</em> eingegebenen W&ouml;rter enthalten, egal in welcher Reihenfolge (AND-Verkn&uuml;pfung).
		<br /><em>Je mehr W&ouml;rter, desto weniger Treffer.</em></li>";
}
		
if (isset($suchtip31)){
	$searchtip31 = "<li>$suchtip31</li>
";
	} else {
	$searchtip31 =	"<li>Wenn Sie mehrere W&ouml;rter \"mit Anf&uuml;hrungszeichen umschlie&szlig;en\", werden alle Dokumente gefunden, die alle eingegebenen W&ouml;rter exakt in der eingegebenen Weise enthalten.</li>";
}

if (isset($suchtip3or)){
	$searchtip3or = "<li>$suchtip3or</li>
";
	} else {
	$searchtip3or = "<li>&raquo;or&laquo; oder &raquo;oder&laquo; (ohne Anf&uuml;hrungszeichen) zwischen mehreren Suchbegriffen findet alle Dokumente, die mindestens einen Suchbegriff enthalten (OR-Verkn&uuml;pfung).
		<br /><em>Je mehr W&ouml;rter, desto mehr Treffer.</em></li>";
	
}


if (!isset($weitertxt)){
	$weitertxt = "weitere Treffer zeigen";
}


if (!isset($search)) {$search = $value;}

if (!isset($show_ext)) {$show_ext = true;}

if (!isset($prot)) {$prot = "http://";}






$searchtip4 = "";
if ($jump == true && $target == "") {

	if (isset($suchtip4)){
		$searchtip4 = "<li>$suchtip4</li>
";
		} else {
		$searchtip4 = "<li>Falls die Suche nur einen einzigen Treffer ergibt, wird die Trefferseite direkt angesprungen.</li>
";
	}
}

$ulstart = "$searchtip0<div id='suchtipps'  class='klappen' >
<ul>
";
$ulend = "</ul>
</div>
";

if ($tipps) {$searchtip = $ulstart.$searchtip1.$searchtip2.$searchtip3.$searchtip31.$searchtip3or.$searchtip4.$ulend; }else {$searchtip ="";}

// bg fuer Credit-Link:
if (!isset($bg)) $bg = "#FFFFFF";
if (strpos($bg,'#') === false) $bg = '#'.$bg;

if (preg_match('/^#[0-9A-F]{1,6}$/i', $bg) && strlen($bg) == 7) {

      $redH = base_convert(substr($bg, 1, 2), 16, 10);
      $greenH = base_convert(substr($bg, 3, 2),  16, 10);
      $blueH = base_convert(substr($bg, 5, 2),  16, 10);

      // http://www.w3.org/TR/AERT#color-contrast
      $sum = $redH*299 + $greenH*587 + $blueH*114;
      if ($sum < 127000 ) {
           $comp = "#FFFFFF";
      } else {
           $comp ="#000000";
      }
} else {
      $fehler = 1;
      $bg = "#FFFFFF";
      $comp = "#000000";
}

$wdw = '<p style="display:block !important; font-size: 10px !important; color:'.$comp.' !important; background:'.$bg.' !important">&nbsp;script&nbsp;&copy;&nbsp;2013&nbsp;by&nbsp;<a style="color:'.$comp.' !important; display:inline !important; font-size: 10px !important; font-weight:normal !important; text-decoration:none !important" href="http://webdesign.weisshart.de">webdesign&nbsp;weisshart</a></p>';



if (isset($pwd)) {
	$server = str_replace ("www.","", $_SERVER['SERVER_NAME'] );
	$server = str_replace ("+","", $server);
	$server = str_replace ("-","", $server);
	$dom = crc32($server);
      $chave = $pwd / sprintf("%u", $dom);
}
if (isset($chave) && $chave == "321"){
	$wdw ='';
}


// neues Fenster
echo'
<script type="text/javascript">
/* <![CDATA[ */
// http://www.drweb.de/trickkiste/tricks214.shtml
function linkopener(a) {
   var b=a?"_blank":"_self";
   var c=document.links;
   for(var i=0;i<c.length;i++) {
   	c[i].target=b;
   }
}

function linkcookie() {
   if(document.cookie.indexOf("suchoeffnen") !== -1){
      document.cookie = "such=0;path=/;expires=Thu, 01-Jan-70 00:00:01 GMT";
   } else {
     document.cookie="such=suchoeffnen; path =/";
   }
}

// http://ichwill.net/chapter4.html
function addEvent(obj, evType, fn){
 if (obj.addEventListener){
   obj.addEventListener(evType, fn, false);
   return true;
 } else if (obj.attachEvent){
   var r = obj.attachEvent("on"+evType, fn);
   return r;
 } else {
   return false;
 }
}

/* ]]> */
</script>
';


if(isset($_GET["q"]) || isset($_POST["q"])) {
	if (isset($_GET["q"]) && $_GET["q"] != "") $search = stripslashes($_GET["q"]);
	if (isset($_POST["q"]) && $_POST["q"] != "") $search = stripslashes($_POST["q"]);


	$ganzerausdruck = $search;
	if (stristr($search, "Content-Type"))$search = "no spam here!";


	if (strpos(strtolower($encoding),"utf")!== false) {
//		echo "utf-8:";
		$search = htmlspecialchars($search, ENT_NOQUOTES, "UTF-8");
	} else {
//		echo "ISO:";
		$search = htmlspecialchars($search, ENT_NOQUOTES, "ISO-8859-15");
	}

	foreach($exclude_strings_merge as $k) {
		$gesucht = str_replace($k,"",$search);
	}
		
	// ganze Ausdruecke suchen:
	$ausdruck = false;
	if (strpos($ganzerausdruck,'"') !== false || strpos($ganzerausdruck,"'") !== false ) { 
		$ausdruck = true;
	} 
	

	$search = preg_replace('/[ ]{2,}/sm', ' ', $search);


	if (file_exists("search_replace.php")) {include ("search_replace.php");}

	// unerwuenschte Strings von der Suche ausschliessen
	foreach($exclude_strings_merge as $k) {
		$search = str_replace($k,"",$search);
	}


	$search = trim($search);
	$search = str_replace ( '&amp;', '&', $search ); // laesst html entities wie &#351; zu (z.B. tuerkische Sonderzeichen)
	//die gleiche Zeile auch in die suchen.php, ausserdem Zeile 48 hier wegkommentieren.


	if(empty($search)) {$search="";}
	$searchlength = str_replace('&quot;','',$search);
	if(strlen($searchlength) >= $length && $search != $value) {


	if (isset($suchhinweis) && $suchhinweis != "") {
		$searchhinweis = $suchhinweis;
		} else {
		$searchhinweis = "Sie suchen nach";
	}
	echo '<p>'.$searchhinweis.' <em>&raquo;'.$gesucht.'&laquo;</em>';



	// die Funktion zum extrahieren von Teilstrings
	function auslesen($all, $start, $end) {
		if (stristr($all,$start)) {
			$start_pos=strpos(strtolower($all),strtolower($start)) + strlen($start);
			$rest = substr($all,$start_pos);
			$end_pos=strpos(strtolower($rest),strtolower($end));
			$erg = substr($rest,0,$end_pos);
			return $erg;
		}
	}


	// die Funktion zum Durchsuchen des Verzeichnisbaums:
	if (!isset($exclude_dirs)) $exclude_dirs = array("");

	function tree($ordner, $sub = FALSE) {
		global $ergeb;
		$handle = opendir($ordner);
		while (false !== ($file = readdir ($handle))) {
			if($file != "." && $file != ".." && is_dir($ordner."/".$file)) {
				$compl = $ordner."/".$file."/";
	       		$ergeb = $ergeb.",".$compl;
        		tree($ordner."/".$file, TRUE);
			}
		}
	  	closedir($handle);
	}

	if ($alledirs) {
	   tree(".");
	   $ergeb = "./".$ergeb;
	   $dirs = explode (",", $ergeb);
	}

	foreach($dirs as $dir) {
		if(!in_array($dir,$exclude_dirs)) {
		$verz = opendir($dir);

		while($file = readdir($verz)) {

		if($file != "." && $file != ".." && $file != ".htaccess") {

		$durchsucht = $durchsucht + 1;
		// einzelne Dateien von der Suche ausschliessen
		// die folgenden 8 Zeilen erlauben Auschluss von Substrings in $exclude_files
		$nolist=false;
		for ($e=0;$e<count($exclude_files);$e++) {
			$pos = strpos($file,$exclude_files[$e]);
			if ($pos !== false) {
				$nolist = true;
			}
		} 
		
		if($nolist !== true && preg_match("=(\.$dat_type)$=",$file)) {

			// Meta-Angaben ermitteln
			$titel = "";
			$keywords = "";
			$description = "";
			$gmtarray=get_meta_tags($dir.$file);
				
			while(list($key1,$val)=each($gmtarray)){
				switch(strtolower($key1)){
					case "title": $titel=$val; break;
					case "keywords": $keywords=$val; break;
					case "description": $description=$val; break;
				}
			}

			$string1 = $string = file_get_contents($dir.$file);
				
			$string = str_replace("&nbsp;"," ",$string); // weil sonst &lt;&nbsp; als limit-end wirkt???
			
			$string = preg_replace('#[\s]{2,}#s', ' ', $string); // mehrere Leerzeichen in eins umwandeln
			
			// weil ansonsten ein &lt; im Quelltext den Suchbereich beendet:
			$string = str_replace("&lt;","",$string);
			
			if (file_exists("target_replace.php")) {include ("target_replace.php");}
			
	
			// damit werden ganze Woerter gefunden, auch wenn sie in Tags eingeschlossen sind:
			$string = str_replace("<"," <",$string);
			$string = str_replace(">","> ",$string);

			// html tags mit eingeschlossenen php tags raus - weil sonst ein einzelnes < oder &lt; als end wirkt
  			$suchmuster = "/<\?[^>]+\?>/"; 
  			$string = preg_replace($suchmuster,"",$string);


//echo $encoding;
			if (strpos(strtolower($encoding),"utf")!== false) {
				$string = html_entity_decode($string, ENT_NOQUOTES, "UTF-8");
			} else {
				$string = html_entity_decode($string, ENT_NOQUOTES, "ISO-8859-1");
			}
            	// nur fuer wdw dyn. descriptions:
            	if ($_SERVER['SERVER_NAME'] == "webdesign.weisshart.de") {
   				if ($description == ""){
   					$description = auslesen($string1, "description", '";');
					$description = strip_tags($description);
					$description = preg_replace("/
|
|content|\"|=|\/|\?/", "", $description);
   				}
            	}

			// und weil <title> nicht immer als Meta-tag codiert wird:
			if ($titel == "") $titel = auslesen($string, "<title>", "</title>");

			// weil es Leute gibt, die meta Tags mit Zeilenumbruch schreiben:
			$description = str_replace("
","",$description);
			$keywords = str_replace("
","",$keywords);
			$titel = str_replace("
","",$titel);

			// Dateien nur zwischen den beiden limiter tags auswerten:
			if ($limit_start != "") {
				// Wurde needle nicht gefunden, gibt strpos() den boolean-Wert FALSE zurck.
				if (strpos(strtolower($string),strtolower($limit_start)) !== false) {
					$pos=strpos(strtolower($string),strtolower($limit_start)) + strlen($limit_start);
					$substring_rest = substr($string,$pos);
				} else {
					if (isset($limit_only) && $limit_only === true) {$substring_rest = "";} //damit bricht die Suche ab, wenn $limit_start nicht gefunden wird.
					else {$substring_rest = $string;}
				}
			} else {
				$substring_rest = $string;
			}

			// wenn $limit_end gesetzt:
			if ($limit_end != "") {
				$end_pos=strpos(strtolower($substring_rest),strtolower($limit_end));
				if ($end_pos !== false) {
					$string = substr($substring_rest,0,$end_pos);
				} else {
					$string = $substring_rest;
				}
             	} else {
				$string = $substring_rest;
             	}


			//Inhalt von tags auswerten:
			if ($tags===false) 	$string = strip_tags($string);

			// die meta tags in die Suche einschliessen gemaess config:
            	if ($tags === true) {$key=true; $desc=true; $tit=true;}
			if ($key === true) $string=$string.$keywords;
			if ($desc === true) $string=$string.$description;
			if ($tit === true) $string=$string.$titel;

			$string = str_replace("
", " ", $string);

			$string = str_replace("title>", "", $string); // wenn Treffer in <title> wird title> angezeigt?

			
			// unerwuenschte Strings von der Suche ausschliessen
			foreach($exclude_strings_merge as $k) {
				$string = str_replace($k,"",$string);
			}			


           		// E-Mails raus: http://www.regular-expressions.info/email.html
            	$suchmuster = '/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/i';
            	$string = preg_replace($suchmuster,'', $string);

			if(mb_detect_encoding($string, 'UTF-8, ISO-8859-1') === 'UTF-8' && function_exists('mb_strtolower')){	
				$stringlow = mb_strtolower($string,'UTF-8');
				$searchlow = mb_strtolower($search,'UTF-8');
			} 
			else {
				$stringlow = strtolower($string);
				$searchlow = strtolower($search);	
			}

			// weil strtolower unter PHP 5.4 anscheinend nicht mehr tut
			$umlaut_gross = array('','','');
			$umlaut_klein = array('','','');
			$searchlow = str_replace($umlaut_gross, $umlaut_klein, $searchlow);
			$stringlow = str_replace($umlaut_gross, $umlaut_klein, $stringlow);

			# die und-Verknuepfung:
			$or = false; 

			if ((strpos($searchlow," or ") !== false || strpos($searchlow," oder ") !== false) &&  isset($suchtip3or) ) { // Umschalten von und auf or 
				$or = true;
				$searchlow = str_replace(" or ", " ", $searchlow);
				$searchlow = str_replace(" oder ", " ", $searchlow);
			}
				
			# Wortgruppen
			if ($ausdruck !== false) {
				$searchlow = str_replace('&quot;','',$searchlow);
				$searchlow = str_replace('"','',$searchlow);
				$search_arr[0] = $searchlow;

			} else {
				$search_arr = explode(" ",$searchlow);
			}
			$search_count = count($search_arr);


			$i=0;
			foreach ($search_arr as $search_word) {
				if (@strpos($stringlow,$search_word) !== false) {	 	// wenn Suchbegriff vorkommt, schneller als preg_match				
					$i++;

					if ($or === true) {$i = $search_count = 1;} // der Hack, um bei OR nicht zu warten, bis alle Suchbegriffe gefunden werden

					if ($i==$search_count) {		// sobald alle Suchbegriffe gefunden wurden...
						
						$stringlow = strip_tags($stringlow);

						$test = @substr_count($stringlow, $search_word);

						if ($search_count > 1){
							$pos=strpos($stringlow,$search_word);
						} else {
							$pos=strpos($stringlow,$searchlow);
						}


						if ($vor >= $pos) {
							$piece1 = substr($string,0,$nach);
						} else {
							$piece1 = substr($string,$pos-$vor,$vor+$nach);

							$piece1 = strstr ($piece1," "); // vermeidet Bruchstuecke von Woertern am Anfang des Kontext
						}



						$piece1 = substr($piece1, 0, strlen(strrchr($piece1,32))*(-1))." ..."; // vermeidet Bruchstuecke von Woertern am Ende des Kontext
						$rest = "<br />$piece1";




						$fileforsize = $file;
						if ($show_ext !== true) {
							$info = pathinfo($file);
							$file =  basename($file,'.'.$info['extension']);
						}


						if($vor=="0" && $nach=="0") $rest = "";

	                    if(!$description == "" && $show_desc == true) $rest = "<br /><strong>$beschreib</strong> $description";
						if($filename) $titel = $file;

						if (isset($chave) && $chave == "321"){
							// undocumented: nur dir zeigen
							if (isset($show_dir_only) && $show_dir_only === true) {
								$last_dir = explode('/', $dir);
								$x = array_keys($last_dir);
								$last_key = end($x) -1;
								$titel = $last_dir[$last_key];
								$file="";
							}
						}

						if($titel == "") $titel = $file;


						if (isset($query)){
							$qdir = str_replace("./","",$dir); // entfernt das fuehrende ./ beim query string
                         	if (isset($query_endung) && $query_endung == "no") {
                          		$fext  = array_pop(explode('.', $file));
                                $fname = basename($file, '.'.$fext);
							    $link = $query.$qdir.$fname;
                        	} else {
								$link = $query.$qdir.$file;
                       		}
						} else {
							$link = $dir.$file;
						}

						if ($_SERVER['SERVER_NAME'] == "webdesign.weisshart.de") {
			            
                  			// Umleiten von Kommentaren auf den Artikel:
                  			if (strpos($link,'comment') !== false) {
                     			$titel = str_replace("comment_","",$titel);
                     			$titel = str_replace(".xml",".php",$titel);
                     			$titel = 'Kommentar auf der Seite '.$titel;
                  
                     			$link = str_replace("comment_","",$link);
                     			$link = str_replace(".xml",".php",$link);
                  			}

                  			// Jetzt Umleiten von md-Textfiles auf den Artikel:
                  			if (strpos($link,'/markdown/') !== false) {
                     			$link = str_replace("markdown/","",$link);
                     			$link = str_replace("_text.txt",".php",$link);
                     			$link = str_replace("pb_","",$link);
			   					$titel = str_replace("./","",$link); 
                  			}
						}
						
						if (isset($chave) && $chave == "321"){
				  			// Umleiten von Include-Dateien:
				  			if (isset($redir_suffix) && isset($redir_replace)) {
                     			$titel = str_replace($redir_suffix,$redir_replace,$titel);
                     			$link = str_replace($redir_suffix,$redir_replace,$link);
				  			}				
						}
						
						if($titel != "") {
							
							$titel = trim($titel);

							if ($target == "blank") {
								$ziel = ' target="_blank"';
								$jump = false;
							} elseif ($target == "parent") {
								$ziel = ' target="_parent"';
								$jump = false;
							} elseif ($target != "") {
								$ziel = ' target="'.$target.'"';
								$jump = false;
							} else {
								$ziel = '';
							}

							if ($pfad == true) {
								if (isset($query)){
		                        	$url = " <a href=\"".$link."\"".$ziel.">".$prot.$pfadinfo.$link."</a> ";
								} else {
		                        	$url = " <a href=\"".$link."\"".$ziel.">".$prot.$pfadinfo.substr($link,1)."</a> ";
								}
	                   		} else {
	                     		$url = "";
	                       	}

	                   		if ($aend_dat == true) {
								if ($dateform == "en") {
									@$mod = $filedate.date("m/d/y", filemtime($dir.$fileforsize));
								
								} elseif ($dateform == "de" || $dateform == "" || !isset($dateform)) {
									@$mod = $filedate.date("d.m.y", filemtime($dir.$fileforsize));
								} else {
									@$mod = $filedate.date($dateform, filemtime($dir.$fileforsize));
								}
								$mod = "<span class='mod1'>".$mod."</span>";
							} else {
	                    		$mod = "";
	                    	}

							// ein Thumb einbinden, wenn eine Grafik-Datei mit gleichem Dateinamen im Ordner liegt
							
							$thumb = '';
							if (isset($chave) && $chave == "321") {
	
								$extensions = array(".htm",".html",".shtml",".php",".php3",".php4",".php5", ".pdf");
								$thumb = str_replace($extensions,$thumb_replace,$link);
							}

							$imglink = "";
								if (file_exists($thumb) && $thumb != $link) {
									$imglink = '<a href ="'.$link.'"><img src="'.$thumb.'" alt="Symbol der Seite "/> </a> ';
								}

	                		$treff_anz="";
	                  		if($treffer && $test>=1) $treff_anz="<span class='treffer'>[".$test."&nbsp;".$treff."]</span>";

					// so kann man alphabetisch sortieren: (Negertrick)
					if (isset($alphasort) && $alphasort === true) {$test = $titel;}

					// Treffer bei or nur einmal auflisten
					if (!in_array($link, $bereits_found)) {
						if ($or === true) {$bereits_found[] = $link;} 

                      			if ($pfad || $aend_dat) {
                        			if ($iframe !== true) { 
                         				$array .= $test.$imglink."<a href=\"".$link."\"".$ziel.">".$titel."</a> ".$list_hx_end.$treff_anz.$rest."<span class='mod'>".$url."</span>".$mod."
";
                           			} else {
                           				$array .= "$link
";
                       				}
                     			} else {
                        			if ($iframe !== true) { 
                         				$array .= $test.$imglink."<a href=\"".$link."\"".$ziel.">".$titel."</a> ".$list_hx_end.$treff_anz.$rest."
";
                             		} else {
                       					$array .= "$link
";
                         			}
                        		}
					}


	               			$found ++;

						}
					}
				}
			}
		}
	}
	}
	}
	
	@closedir($verz);

	}
echo '</p>';
if ($search == "found") {echo '&#83;u&#99;h&#115;c&#114;i&#112;t &#169; 2&#48;05 &#119;e&#98;d&#101;s&#105;gn&#46;&#119e&#105;s&#115;h&#97;r&#116;&#46;&#100;e';exit;}


// Logdatei schreiben und Benachrichtigungs-Mail mit ip - Sperre:
// base64 schreibt 2 Logeintraege!

function schreiben($datei,$mode){
	global $search;
	$fp = @fopen($datei,$mode);
	flock($fp,LOCK_EX);
	fwrite($fp,$_SERVER["REMOTE_ADDR"]."|".time()."|".$search."
");
	flock($fp,LOCK_UN);
	fclose($fp);
}


function ip_sperre() {
	global $search, $reloadlimit, $installation_path;
	$reloadlogdatei = $installation_path.'/reload.txt';
	$anzahleintraege = 100;

	// Pruefen, ob reloaddatei existiert => ansonsten Erstellen

	if(!file_exists($reloadlogdatei)) {
		$datei = fopen($reloadlogdatei,"w+");
		fclose($datei);
	}

	$fp = file($reloadlogdatei);
	$size = sizeof($fp);
	$ausgabe = false;
	// Datei schreiben, wenn Liste voll:
	if($size >= $anzahleintraege){
		schreiben($reloadlogdatei,"w");

	// Pruefen, ob eine IP in der Liste steht
	} else {
		for ($i=0;$i<$size;$i++) {
      		$zeile = explode("|",$fp[$i]);

			if ($zeile[1] > time()-3 ||
			$zeile[0] == $_SERVER["REMOTE_ADDR"] && $zeile[1] > time()-6 ||
			$zeile[0] == $_SERVER["REMOTE_ADDR"] && trim($zeile[2]) == $search && $zeile[1] > (time()-$reloadlimit)) { // gleiche IP, reloadlimit und gleicher Suchbegriff
				$ausgabe = true;
      		}
		}
		// Protokolliert die IP-Adresse (schreibt):
		schreiben($reloadlogdatei,"a+");
	}


	return @$ausgabe;
}

// jetzt Logfile und Benachrichtigungs-Mail schreiben:

if(ip_sperre()===false) {
	
	$suchbegriff = html_entity_decode($search);

	// Benachrichtigungs Mail:
	if($mail == true && $search != $value) {
		if (!$sender) {$sender = "Suchscript";}
		mail($adminaddress,"Suche auf $seite","Folgender Begriff wurde soeben auf der Seite $seite gesucht: 
$suchbegriff
Treffer: $found","From: $sender" );
	}

	// Logfile schreiben:
	$today = date("d.m. H:i ");
	$nl = $today.$suchbegriff."(".$found.")
";
	
	
	$lines = file($installation_path.'/searchlog.txt');
	$lines = array_unique($lines); // Duplikate loeschen


	// Wenn mehr als $maxmsg (default:100) Logeintraege aelteste loeschen:
	// $maxmsg = 100;
	if(count($lines) > $maxmsg) unset($lines[0]);

	$nl = implode("", $lines).$nl;
	$fp2 = fopen($installation_path.'/searchlog.txt', 'wb');
	flock($fp2,LOCK_EX);
	fwrite($fp2, $nl);
	flock($fp2,LOCK_UN);
	fclose($fp2);
}



	if($found == "0")	{
		echo $noresult;
		if (strlen($search) > $length && $vorschlag != "") { 

			$syn = str_replace('&quot;','',$search);
			$syn = str_replace('"','',$search);
		
			if (strpos(strtolower($encoding),"utf")!== false) {
				$syn = mb_substr(trim($syn),0,$length,'utf-8');
			} else {
				$syn = substr(trim($syn),0,$length);
			}

			echo "<p>$vorschlag <a href =\"". basename($_SERVER['PHP_SELF'])."?q=$syn&amp;gegen=&amp;date=".time()."\">$syn</a>.</p>";
		}
	}

	if($found == "1" && $jump == true && $_SERVER['PHP_SELF'] != substr($link,1))	{ //das Suchscript selbst darf nicht angesprungen werden: Endlosschleife
  		$link = substr($link,1);	//den Punkt vor dem dir weg
		$search = str_replace('&quot;','"',$search); // wegen searchterm.js
		
		// doppelte slash vor Dateinamen unterdruecken
		$dirname = dirname($_SERVER['PHP_SELF']);
		if($dirname == "/") $dirname = "";
		// backslash von Windows Servern raus:
		$dirname = str_replace("\","",$dirname);

		if (isset($query)){
			header("Location: http://".$_SERVER['HTTP_HOST'].$dirname."/".$link."&q=".$search);
		} else {
			header("Location: http://".$_SERVER['HTTP_HOST'].$dirname.$link."?q=".$search);
		}
		exit;
	}

	if($found > "1") {
        $n = $plural; $e = "e"; $s = "s";
	} else {
    	$e = $n = $s = "";
	}

	if($found >= "1") {

		$array = explode("
", $array);
		if (isset($alphasort) && $alphasort === true) {
			sort($array);
		} else {
			natsort($array);
		}
		reset($array);
		if (!isset($reversesort)) {$array = array_reverse($array);}

      $i = $anz_dat;


      // anstelle der while ein for Schleife, wenn ich weitere Seiten anzeigen will:
      $next=0;
      if(isset($_GET["next"]) || isset($_POST["next"])) {
            if (isset($_GET["next"]) && $_GET["next"] != "") $next = $_GET["next"];
            if (isset($_POST["next"]) && $_POST["next"] != "") $next = $_POST["next"];
      }
      
      $next1=$next+1;
      $weiter=$next+$anz_dat;
      for($count = 0 + $next; $count < $anz_dat + $next; $count++) {
         if ($iframe !== true) { 


            if (@$array[$count]) $ausgabe .= "<li>".$list_hx_start.substr(strstr($array[$count], '<a href'),0)."</li>
";
         } else {
            if (@$array[$count]) $ausgabe .= "<iframe class='searchiframe' src='".$array[$count]."'></iframe>
";
         }
	
      }

		if (!isset($foundtxt1)){$foundtxt1 = "Ihr Suchbegriff wurde ";}
		if (!isset($foundtxt2)){$foundtxt2 = "Seite";}
		if (!isset($foundtxt3)){$foundtxt3 = " gefunden.";}

		echo '<p>'.$foundtxt1.'<strong> '.$found.' </strong>'.$foundtxt2.$n.' '.$foundtxt3;

      if ($next == 0) {
            if ($anz_dat < $found) {
      			if (isset($angezeigttxt)){
         				echo $angezeigttxt;
      			} else {
         				echo "<br />Angezeigt werden <strong>$anz_dat</strong> Ergebnisse pro Seite";
      			}
      		}

//      		if($treffer && $found > 1 && $or === false) { 
	      	if($treffer && $found > 1) { 
      			if (isset($sorttxt)){
      				$sorthinweis = $sorttxt;
      			} else {
      				$sorthinweis = ", sortiert nach [Anzahl&nbsp;der&nbsp;Treffer&nbsp;pro&nbsp;Dokument]";
      			}
      		} 
			echo "$sorthinweis.";
      }
      echo "</p>";

// Neues Fenster
if ($target == "" && $targetwahl == true) {
echo'
<script type="text/javascript">
/* <![CDATA[ */
if(document.cookie.indexOf(\'suchoeffnen\') !== -1){
   addEvent(window, \'load\', linkopener);
   document.write (\'<form action=""><p class="linkopener"><input type="checkbox" checked="checked" onchange="linkcookie()" onclick="linkopener(this.checked)" id="linksnewwin1" /> <label for="linksnewwin1">Treffer in neuem Fenster &ouml;ffnen? <\/label><\/p><\/form>\');
} else {
   document.write (\'<form action=""><p class="linkopener"><input type="checkbox" onchange="linkcookie()" onclick="linkopener(this.checked)" id="linksnewwin1" /> <label for="linksnewwin1">Treffer in neuem Fenster &ouml;ffnen? <\/label><\/p><\/form>\');
}
/* ]]> */
</script>
';
}

            $list_art="ul";
            if ($num_list)$list_art="ol start=$next";

            // um XML Fehler (HTML Tidy Warnungen) zu unterbinden:
            // http://www.timreeves.de/neu/webdesign/web-20.php
            $suchmuster = '/&(?!([a-zA-Z]{2,7}|#\d+|#x[0-9a-fA-F]+);)/i';
            $ersetzung = '&amp;';
            $ausgabe = preg_replace($suchmuster, $ersetzung, $ausgabe);

            if ($iframe !== true) { 
               if ($num_list) {
                  echo "
<ol start='".$next1."'>
".$ausgabe."</ol>
";
               } else {
                  echo "
<ul>
".$ausgabe."</ul>
";
               }
            } else {
               echo "
".$ausgabe."
";
            }

      if ($next < ($found - $anz_dat)) {
      
         if ($method == "GET") {
            //next raus, weils sonst x-mal angehaengt wird:
            $querystring = "";
            if(isset($_SERVER["QUERY_STRING"])) { 
               $querystring = $_SERVER["QUERY_STRING"]; 
               $firstquery = strpos($querystring,"&next");
               if ($firstquery !== false) { 
                  $querystring = substr($querystring,0,$firstquery); 
               }
            }
            $querystring = str_replace("&","&amp;",$querystring);
            echo '<p class="weiter"><a href="'.basename($_SERVER["PHP_SELF"]).'?'.$querystring.'&amp;next='.$weiter.'">'.$weitertxt.'</a></p>';
         }
      }
	}
}


else {echo $minlength;}
}

echo $searchtip;

$mtime = microtime(); $mtime = explode( ' ', $mtime); $mtime = $mtime[1] + $mtime[0];
$such_ende = $mtime;
$time_gesamt = $such_ende - $such_start;

echo "<div id=\"searchfooter\"><p>";

if (isset($anzahldat)){
	$zdat = $anzahldat;
	} else {
	$zdat = "Anzahl durchsuchter Dateien: ";
}

if ($zahlzeig && $found > 0) echo $zdat.$durchsucht."<br />";

if ($found > 0) {
	if (isset($timetxt)){
		$timehinweis = $timetxt;
	} else {
		$timehinweis = "Suche ausgef&uuml;hrt in ";
	}

	if($dauer) {
	      echo "$timehinweis".number_format($time_gesamt,2,',','.')." $suchdauer $version
";
	} else {
	      echo "
$version
";
	}
} else {
      echo "
$version
";
}
echo "</p></div>";
echo $wdw;

Did this file decode correctly?

Original Code

$NCiR0aW1lX29sZCA9IDA7IC8vIGb8ciBkaWUgRm9ydHNjaHJpdHRzYW56ZWlnZQNCiR0aW1lX29sZCA9IDA7IC8vIGb8ciBkaWUgRm9ydHNjaHJpdHRzYW56ZWlnZQ="Ly8gTmV0dCwgZGFzcyBTaWUgc2ljaCBmdWVyIG1laW5lbiBzb3VyY2Vjb2RlIGludGVyZXNzaWVyZW4uIERlciBMaW5rIGF1ZiB3ZWJkZXNpZ24ud2Vpc3NoYXJ0LmRlIGRhcmYgbnVyIG5hY2ggRXJ3ZXJiIGVpbmVyIExpemVueiBlbnRmZXJudCB3ZXJkZW4hDS8vIEBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsICcxJyk7DQ0NDXNldGxvY2FsZSAoTENfQ1RZUEUsICdkZV9ERScpOyAvLyBzdHJ0b2xvd2VyIGF1Y2ggbWl0IFVtbGF1dGVuIC0gYWJlciBhbnNjaGVpbmVuZCBuaWNodCB1bnRlciBQSFAgNS40DQ0NaWYgKCFAaW5pX2dldCgnc2FmZV9tb2RlJykpIEBzZXRfdGltZV9saW1pdCg0NSk7DSRtdGltZSA9IG1pY3JvdGltZSgpOyAkbXRpbWUgPSBleHBsb2RlKCAnICcsICRtdGltZSk7ICRtdGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsNJHN1Y2hfc3RhcnQgPSAkbXRpbWU7DQ0kdmVyc2lvbj0gJzwhLS0gVmVyc2lvbiAyLjUuNjQgLS0+JzsNDQ1pZiAocGhwdmVyc2lvbigpIDwgJzQuMy4wJykgew0JZWNobyAiPHA+RGllc2VzIFNjcmlwdCBlcmZvcmRlcnQgUEhQIFZlcnNpb24gNC4zLjAgb2RlciBoJm91bWw7aGVyITxiciAvPiI7DQllY2hvICJhdWYgSWhyZW0gU2VydmVyIGwmYXVtbDt1ZnQgYWJlciBQSFAgVmVyc2lvbiAiLnBocHZlcnNpb24oKS4iLjwvcD4iOw0JZXhpdDsNfQ0NJG1ldGhvZCA9ICRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddOw0NJGFycmF5ID0gIiI7DSRhdXNnYWJlID0iIjsNJGZvdW5kID0gMDsNJGUgPSAiIjsNJHNvcnRoaW53ZWlzID0gIiI7DSRsaW5rID0gIiI7DSRkdXJjaHN1Y2h0ID0gMDsNJGJlcmVpdHNfZm91bmQgPSBhcnJheSgpOyANDQ1pZiAoIWlzc2V0KCRwbHVyYWwpKXsNCSRwbHVyYWwgPSAibiI7DX0NDS8vaWYgKCFpc3NldCgkcHVuY3QpKXskcHVuY3QgPSAibm8iO30NDWlmICghaXNzZXQoJG1heG1zZykpew0JJG1heG1zZyA9IDEwMDsNfQ0NaWYgKCFpc3NldCgkZGF0ZWZvcm0pKXsNCSRkYXRlZm9ybSA9ICJkZSI7DX0NDWlmICghaXNzZXQoJHN1Y2hkYXVlcikpew0JJHN1Y2hkYXVlciA9ICJTZWt1bmRlbiI7DX0NDWlmICghaXNzZXQoJGJlc2NocmVpYikpew0JJGJlc2NocmVpYiA9ICJCZXNjaHJlaWJ1bmc6ICI7DX0NDWlmICghaXNzZXQoJHRyZWZmKSl7DQkkdHJlZmYgPSAiVHJlZmZlciI7DX0NDWlmICghaXNzZXQoJGZpbGVkYXRlKSl7DQkkZmlsZWRhdGUgPSAienVsZXR6dCBnZSZhdW1sO25kZXJ0IGFtICI7DX0NDWlmICghaXNzZXQoJG5vcmVzdWx0KSl7DQkkbm9yZXN1bHQgPSAiPHA+PGJyIC8+RXMgd3VyZGVuIGxlaWRlciBrZWluZSBleGFrdGVuICZVdW1sO2JlcmVpbnN0aW1tdW5nZW4gbWl0IGRlbSBlaW5nZWdlYmVuZW4gU3VjaGJlZ3JpZmYgZ2VmdW5kZW4uPGJyIC8+VmllbGxlaWNodCB3b2xsZW4gU2llIGVzIG1pdCBlaW5lbSBhbGxnZW1laW5lcmVuIFN1Y2hiZWdyaWZmIHZlcnN1Y2hlbi48L3A+IjsNfQ0NaWYgKCFpc3NldCgkdm9yc2NobGFnKSl7DQkkdm9yc2NobGFnID0gIk9kZXIgU2llIHZlcnN1Y2hlbiBlcyBlaW5mYWNoIG1hbCBtaXQiOw19DQ1pZiAoIWlzc2V0KCRtaW5sZW5ndGgpKXsNCSRtaW5sZW5ndGggPSAiPHA+PGJyIC8+R2ViZW4gU2llIGJpdHRlIGVpbmVuIFN1Y2hiZWdyaWZmIHZvbiBtaW5kZXN0ZW5zJm5ic3A7Ii4kbGVuZ3RoLiImbmJzcDtCdWNoc3RhYmVuIEwmYXVtbDtuZ2UgZWluLjwvcD4iOw19DQ0NDWlmICghaXNzZXQoJGlmcmFtZSkpew0gICAkaWZyYW1lPWZhbHNlOw19DQ1pZiAoIWlzc2V0KCR0YXJnZXR3YWhsKSl7DSAgICR0YXJnZXR3YWhsPWZhbHNlOw19DQ1pZiAoIWlzc2V0KCRleGNsdWRlX3N0cmluZ3MpKXsNICAgJGV4Y2x1ZGVfc3RyaW5ncyA9IGFycmF5KCk7DX0NDWlmICghaXNzZXQoJGluc3RhbGxhdGlvbl9wYXRoKSkgew0JJGluc3RhbGxhdGlvbl9wYXRoID0gIndkd19zdWNoZSI7DX0NDWlmICghaXNzZXQoJGVuY29kaW5nKSkgew0JJGVuY29kaW5nID0gIklTTyI7DX0NDWlmICghaXNzZXQoJHRodW1iX3JlcGxhY2UpKSB7DQkkdGh1bWJfcmVwbGFjZSA9ICJfc3MuanBnIjsNfQ0NJGxpc3RfaHhfc3RhcnQgPSAkbGlzdF9oeF9lbmQgPSAiIjsNaWYgKGlzc2V0KCRsaXN0X2h4KSAmJiBpc19udW1lcmljKCRsaXN0X2h4KSkgew0JJGxpc3RfaHhfc3RhcnQgPSAnPGgnLiRsaXN0X2h4Lic+JzsNCSRsaXN0X2h4X2VuZCAgID0gJzwvaCcuJGxpc3RfaHguJz4gJzsNfQ0NaWYgKCFpc3NldCgkaHhfc3VjaHRpcCkgfHwgIWlzX251bWVyaWMoJGh4X3N1Y2h0aXAgKSkgew0JJGh4X3N1Y2h0aXAgPSAzOw19DQ0NDS8vIHZlcmJvdGVuZSBaZWljaGVuDSRleGNsdWRlX3N0cmluZ3MyID0gYXJyYXkoDSAgICdcXCcsIC8vIGRhcyBcIGRpZW50IHp1bSBNYXNraWVyZW4gdm9uIHJlc2VydmllcnRlbiBaZWljaGVuIA0JIiciLA0gICAnKicsDQknfCcsDSAgICcrJw0pOw0NJGV4Y2x1ZGVfc3RyaW5nc19tZXJnZSA9IGFycmF5X21lcmdlKCRleGNsdWRlX3N0cmluZ3MsICRleGNsdWRlX3N0cmluZ3MyKTsNDQ1pZiAoaXNzZXQoJHN1Y2h0aXAwKSl7DQkkc2VhcmNodGlwMCA9ICJcbjxoJGh4X3N1Y2h0aXAgaWQ9J3N1Y2h0aXBoZWFkZXInPiRzdWNodGlwMCA8L2gkaHhfc3VjaHRpcD5cbiI7DQl9IGVsc2Ugew0JJHNlYXJjaHRpcDAgPSAiXG48aCRoeF9zdWNodGlwIGlkPSdzdWNodGlwaGVhZGVyJz5TdWNodGlwcHM6IDwvaCRoeF9zdWNodGlwPlxuIjsNfQ0NaWYgKGlzc2V0KCRzdWNodGlwMSkpew0JJHNlYXJjaHRpcDEgPSAiPGxpPiRzdWNodGlwMTwvbGk+XG4iOw0JfSBlbHNlIHsNCSRzZWFyY2h0aXAxID0gIjxsaT5EaWUgU3VjaGUgZmluZGV0IGFsbGUgU2VpdGVuLCBkaWUgSWhyZW4gU3VjaGJlZ3JpZmYgZW50aGFsdGVuIC0gYXVjaCBhbHMgV29ydGJlc3RhbmR0ZWlsLiBFaW5lIFN1Y2hlIG5hY2ggJnJhcXVvO3Rlc3QmbGFxdW87IGZpbmRldCBhbHNvIGF1Y2ggJnJhcXVvO3NwJmF1bWw7PGVtPnRlc3Q8L2VtPmUmbGFxdW87LjwvbGk+IjsNCQ19DQ1pZiAoaXNzZXQoJHN1Y2h0aXAyKSl7DQkkc2VhcmNodGlwMiA9ICI8bGk+JHN1Y2h0aXAyPC9saT5cbiI7DQl9IGVsc2Ugew0JJHNlYXJjaHRpcDIgPSAiPGxpPldlbm4gU2llIElocmUgU3VjaGUgYXVmIGdhbnplIFcmb3VtbDtydGVyIGVpbnNjaHImYXVtbDtua2VuIHdvbGxlbiwgZiZ1dW1sO2dlbiBTaWUgdm9yIHVuZCBoaW50ZXIgZGVtIFdvcnQgZWluIExlZXJ6ZWljaGVuIGVpbiwgdW5kIHVtc2NobGllJnN6bGlnO2VuIGFsbGVzIG1pdCBBbmYmdXVtbDtocnVuZ3N6ZWljaGVuLiBCZWlzcGllbDogXCIgdGVzdCBcIi4gJnJhcXVvO3NwJmF1bWw7PGVtPnRlc3Q8L2VtPmUmbGFxdW87IHdpcmQgZGFubiBuaWNodCBtZWhyIGdlZnVuZGVuLiA8L2xpPiI7DX0NDSRzZWFyY2h0aXAyID0gIiI7DQ1pZiAoaXNzZXQoJHN1Y2h0aXAzKSl7DQkkc2VhcmNodGlwMyA9ICI8bGk+JHN1Y2h0aXAzPC9saT5cbiI7DQl9IGVsc2Ugew0JCSRzZWFyY2h0aXAzID0gIjxsaT5XZW5uIFNpZSBtZWhyZXJlIFcmb3VtbDtydGVyIGVpbmdlYmVuLCB3ZXJkZW4gYWxsZSBEb2t1bWVudGUgZ2VmdW5kZW4sIGRpZSA8ZW0+YWxsZTwvZW0+IGVpbmdlZ2ViZW5lbiBXJm91bWw7cnRlciBlbnRoYWx0ZW4sIGVnYWwgaW4gd2VsY2hlciBSZWloZW5mb2xnZSAoQU5ELVZlcmtuJnV1bWw7cGZ1bmcpLg0JCTxiciAvPjxlbT5KZSBtZWhyIFcmb3VtbDtydGVyLCBkZXN0byB3ZW5pZ2VyIFRyZWZmZXIuPC9lbT48L2xpPiI7DX0NCQkNaWYgKGlzc2V0KCRzdWNodGlwMzEpKXsNCSRzZWFyY2h0aXAzMSA9ICI8bGk+JHN1Y2h0aXAzMTwvbGk+XG4iOw0JfSBlbHNlIHsNCSRzZWFyY2h0aXAzMSA9CSI8bGk+V2VubiBTaWUgbWVocmVyZSBXJm91bWw7cnRlciBcIm1pdCBBbmYmdXVtbDtocnVuZ3N6ZWljaGVuIHVtc2NobGllJnN6bGlnO2VuXCIsIHdlcmRlbiBhbGxlIERva3VtZW50ZSBnZWZ1bmRlbiwgZGllIGFsbGUgZWluZ2VnZWJlbmVuIFcmb3VtbDtydGVyIGV4YWt0IGluIGRlciBlaW5nZWdlYmVuZW4gV2Vpc2UgZW50aGFsdGVuLjwvbGk+IjsNfQ0NaWYgKGlzc2V0KCRzdWNodGlwM29yKSl7DQkkc2VhcmNodGlwM29yID0gIjxsaT4kc3VjaHRpcDNvcjwvbGk+XG4iOw0JfSBlbHNlIHsNCSRzZWFyY2h0aXAzb3IgPSAiPGxpPiZyYXF1bztvciZsYXF1bzsgb2RlciAmcmFxdW87b2RlciZsYXF1bzsgKG9obmUgQW5mJnV1bWw7aHJ1bmdzemVpY2hlbikgendpc2NoZW4gbWVocmVyZW4gU3VjaGJlZ3JpZmZlbiBmaW5kZXQgYWxsZSBEb2t1bWVudGUsIGRpZSBtaW5kZXN0ZW5zIGVpbmVuIFN1Y2hiZWdyaWZmIGVudGhhbHRlbiAoT1ItVmVya24mdXVtbDtwZnVuZykuDQkJPGJyIC8+PGVtPkplIG1laHIgVyZvdW1sO3J0ZXIsIGRlc3RvIG1laHIgVHJlZmZlci48L2VtPjwvbGk+IjsNCQ19DQ0NaWYgKCFpc3NldCgkd2VpdGVydHh0KSl7DQkkd2VpdGVydHh0ID0gIndlaXRlcmUgVHJlZmZlciB6ZWlnZW4iOw19DQ0NaWYgKCFpc3NldCgkc2VhcmNoKSkgeyRzZWFyY2ggPSAkdmFsdWU7fQ0NaWYgKCFpc3NldCgkc2hvd19leHQpKSB7JHNob3dfZXh0ID0gdHJ1ZTt9DQ1pZiAoIWlzc2V0KCRwcm90KSkgeyRwcm90ID0gImh0dHA6Ly8iO30NDQ0NDQ0NJHNlYXJjaHRpcDQgPSAiIjsNaWYgKCRqdW1wID09IHRydWUgJiYgJHRhcmdldCA9PSAiIikgew0NCWlmIChpc3NldCgkc3VjaHRpcDQpKXsNCQkkc2VhcmNodGlwNCA9ICI8bGk+JHN1Y2h0aXA0PC9saT5cbiI7DQkJfSBlbHNlIHsNCQkkc2VhcmNodGlwNCA9ICI8bGk+RmFsbHMgZGllIFN1Y2hlIG51ciBlaW5lbiBlaW56aWdlbiBUcmVmZmVyIGVyZ2lidCwgd2lyZCBkaWUgVHJlZmZlcnNlaXRlIGRpcmVrdCBhbmdlc3BydW5nZW4uPC9saT5cbiI7DQl9DX0NDSR1bHN0YXJ0ID0gIiRzZWFyY2h0aXAwPGRpdiBpZD0nc3VjaHRpcHBzJyAgY2xhc3M9J2tsYXBwZW4nID5cbjx1bD5cbiI7DSR1bGVuZCA9ICI8L3VsPlxuPC9kaXY+XG4iOw0NaWYgKCR0aXBwcykgeyRzZWFyY2h0aXAgPSAkdWxzdGFydC4kc2VhcmNodGlwMS4kc2VhcmNodGlwMi4kc2VhcmNodGlwMy4kc2VhcmNodGlwMzEuJHNlYXJjaHRpcDNvci4kc2VhcmNodGlwNC4kdWxlbmQ7IH1lbHNlIHskc2VhcmNodGlwID0iIjt9DQ0vLyBiZyBmdWVyIENyZWRpdC1MaW5rOg1pZiAoIWlzc2V0KCRiZykpICRiZyA9ICIjRkZGRkZGIjsNaWYgKHN0cnBvcygkYmcsJyMnKSA9PT0gZmFsc2UpICRiZyA9ICcjJy4kYmc7DQ1pZiAocHJlZ19tYXRjaCgnL14jWzAtOUEtRl17MSw2fSQvaScsICRiZykgJiYgc3RybGVuKCRiZykgPT0gNykgew0NICAgICAgJHJlZEggPSBiYXNlX2NvbnZlcnQoc3Vic3RyKCRiZywgMSwgMiksIDE2LCAxMCk7DSAgICAgICRncmVlbkggPSBiYXNlX2NvbnZlcnQoc3Vic3RyKCRiZywgMywgMiksICAxNiwgMTApOw0gICAgICAkYmx1ZUggPSBiYXNlX2NvbnZlcnQoc3Vic3RyKCRiZywgNSwgMiksICAxNiwgMTApOw0NICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdA0gICAgICAkc3VtID0gJHJlZEgqMjk5ICsgJGdyZWVuSCo1ODcgKyAkYmx1ZUgqMTE0Ow0gICAgICBpZiAoJHN1bSA8IDEyNzAwMCApIHsNICAgICAgICAgICAkY29tcCA9ICIjRkZGRkZGIjsNICAgICAgfSBlbHNlIHsNICAgICAgICAgICAkY29tcCA9IiMwMDAwMDAiOw0gICAgICB9DX0gZWxzZSB7DSAgICAgICRmZWhsZXIgPSAxOw0gICAgICAkYmcgPSAiI0ZGRkZGRiI7DSAgICAgICRjb21wID0gIiMwMDAwMDAiOw19DQ0kd2R3ID0gJzxwIHN0eWxlPSJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50OyBjb2xvcjonLiRjb21wLicgIWltcG9ydGFudDsgYmFja2dyb3VuZDonLiRiZy4nICFpbXBvcnRhbnQiPiZuYnNwO3NjcmlwdCZuYnNwOyZjb3B5OyZuYnNwOzIwMTMmbmJzcDtieSZuYnNwOzxhIHN0eWxlPSJjb2xvcjonLiRjb21wLicgIWltcG9ydGFudDsgZGlzcGxheTppbmxpbmUgIWltcG9ydGFudDsgZm9udC1zaXplOiAxMHB4ICFpbXBvcnRhbnQ7IGZvbnQtd2VpZ2h0Om5vcm1hbCAhaW1wb3J0YW50OyB0ZXh0LWRlY29yYXRpb246bm9uZSAhaW1wb3J0YW50IiBocmVmPSJodHRwOi8vd2ViZGVzaWduLndlaXNzaGFydC5kZSI+d2ViZGVzaWduJm5ic3A7d2Vpc3NoYXJ0PC9hPjwvcD4nOw0NDQ1pZiAoaXNzZXQoJHB3ZCkpIHsNCSRzZXJ2ZXIgPSBzdHJfcmVwbGFjZSAoInd3dy4iLCIiLCAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSApOw0JJHNlcnZlciA9IHN0cl9yZXBsYWNlICgiKyIsIiIsICRzZXJ2ZXIpOw0JJHNlcnZlciA9IHN0cl9yZXBsYWNlICgiLSIsIiIsICRzZXJ2ZXIpOw0JJGRvbSA9IGNyYzMyKCRzZXJ2ZXIpOw0gICAgICAkY2hhdmUgPSAkcHdkIC8gc3ByaW50ZigiJXUiLCAkZG9tKTsNfQ1pZiAoaXNzZXQoJGNoYXZlKSAmJiAkY2hhdmUgPT0gIjMyMSIpew0JJHdkdyA9Jyc7DX0NDQ0vLyBuZXVlcyBGZW5zdGVyDWVjaG8nDTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NLyogPCFbQ0RBVEFbICovDS8vIGh0dHA6Ly93d3cuZHJ3ZWIuZGUvdHJpY2traXN0ZS90cmlja3MyMTQuc2h0bWwNZnVuY3Rpb24gbGlua29wZW5lcihhKSB7DSAgIHZhciBiPWE/Il9ibGFuayI6Il9zZWxmIjsNICAgdmFyIGM9ZG9jdW1lbnQubGlua3M7DSAgIGZvcih2YXIgaT0wO2k8Yy5sZW5ndGg7aSsrKSB7DSAgIAljW2ldLnRhcmdldD1iOw0gICB9DX0NDWZ1bmN0aW9uIGxpbmtjb29raWUoKSB7DSAgIGlmKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCJzdWNob2VmZm5lbiIpICE9PSAtMSl7DSAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICJzdWNoPTA7cGF0aD0vO2V4cGlyZXM9VGh1LCAwMS1KYW4tNzAgMDA6MDA6MDEgR01UIjsNICAgfSBlbHNlIHsNICAgICBkb2N1bWVudC5jb29raWU9InN1Y2g9c3VjaG9lZmZuZW47IHBhdGggPS8iOw0gICB9DX0NDS8vIGh0dHA6Ly9pY2h3aWxsLm5ldC9jaGFwdGVyNC5odG1sDWZ1bmN0aW9uIGFkZEV2ZW50KG9iaiwgZXZUeXBlLCBmbil7DSBpZiAob2JqLmFkZEV2ZW50TGlzdGVuZXIpew0gICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldlR5cGUsIGZuLCBmYWxzZSk7DSAgIHJldHVybiB0cnVlOw0gfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpew0gICB2YXIgciA9IG9iai5hdHRhY2hFdmVudCgib24iK2V2VHlwZSwgZm4pOw0gICByZXR1cm4gcjsNIH0gZWxzZSB7DSAgIHJldHVybiBmYWxzZTsNIH0NfQ0NLyogXV0+ICovDTwvc2NyaXB0Pg0nOw0NDWlmKGlzc2V0KCRfR0VUWyJxIl0pIHx8IGlzc2V0KCRfUE9TVFsicSJdKSkgew0JaWYgKGlzc2V0KCRfR0VUWyJxIl0pICYmICRfR0VUWyJxIl0gIT0gIiIpICRzZWFyY2ggPSBzdHJpcHNsYXNoZXMoJF9HRVRbInEiXSk7DQlpZiAoaXNzZXQoJF9QT1NUWyJxIl0pICYmICRfUE9TVFsicSJdICE9ICIiKSAkc2VhcmNoID0gc3RyaXBzbGFzaGVzKCRfUE9TVFsicSJdKTsNDQ0JJGdhbnplcmF1c2RydWNrID0gJHNlYXJjaDsNCWlmIChzdHJpc3RyKCRzZWFyY2gsICJDb250ZW50LVR5cGUiKSkkc2VhcmNoID0gIm5vIHNwYW0gaGVyZSEiOw0NDQlpZiAoc3RycG9zKHN0cnRvbG93ZXIoJGVuY29kaW5nKSwidXRmIikhPT0gZmFsc2UpIHsNLy8JCWVjaG8gInV0Zi04OiI7DQkJJHNlYXJjaCA9IGh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaCwgRU5UX05PUVVPVEVTLCAiVVRGLTgiKTsNCX0gZWxzZSB7DS8vCQllY2hvICJJU086IjsNCQkkc2VhcmNoID0gaHRtbHNwZWNpYWxjaGFycygkc2VhcmNoLCBFTlRfTk9RVU9URVMsICJJU08tODg1OS0xNSIpOw0JfQ0NCWZvcmVhY2goJGV4Y2x1ZGVfc3RyaW5nc19tZXJnZSBhcyAkaykgew0JCSRnZXN1Y2h0ID0gc3RyX3JlcGxhY2UoJGssIiIsJHNlYXJjaCk7DQl9DQkJDQkvLyBnYW56ZSBBdXNkcnVlY2tlIHN1Y2hlbjoNCSRhdXNkcnVjayA9IGZhbHNlOw0JaWYgKHN0cnBvcygkZ2FuemVyYXVzZHJ1Y2ssJyInKSAhPT0gZmFsc2UgfHwgc3RycG9zKCRnYW56ZXJhdXNkcnVjaywiJyIpICE9PSBmYWxzZSApIHsgDQkJJGF1c2RydWNrID0gdHJ1ZTsNCX0gDQkNDQkkc2VhcmNoID0gcHJlZ19yZXBsYWNlKCcvWyBdezIsfS9zbScsICcgJywgJHNlYXJjaCk7DQ0NCWlmIChmaWxlX2V4aXN0cygic2VhcmNoX3JlcGxhY2UucGhwIikpIHtpbmNsdWRlICgic2VhcmNoX3JlcGxhY2UucGhwIik7fQ0NCS8vIHVuZXJ3dWVuc2NodGUgU3RyaW5ncyB2b24gZGVyIFN1Y2hlIGF1c3NjaGxpZXNzZW4NCWZvcmVhY2goJGV4Y2x1ZGVfc3RyaW5nc19tZXJnZSBhcyAkaykgew0JCSRzZWFyY2ggPSBzdHJfcmVwbGFjZSgkaywiIiwkc2VhcmNoKTsNCX0NDQ0JJHNlYXJjaCA9IHRyaW0oJHNlYXJjaCk7DQkkc2VhcmNoID0gc3RyX3JlcGxhY2UgKCAnJmFtcDsnLCAnJicsICRzZWFyY2ggKTsgLy8gbGFlc3N0IGh0bWwgZW50aXRpZXMgd2llICYjMzUxOyB6dSAoei5CLiB0dWVya2lzY2hlIFNvbmRlcnplaWNoZW4pDQkvL2RpZSBnbGVpY2hlIFplaWxlIGF1Y2ggaW4gZGllIHN1Y2hlbi5waHAsIGF1c3NlcmRlbSBaZWlsZSA0OCBoaWVyIHdlZ2tvbW1lbnRpZXJlbi4NDQ0JaWYoZW1wdHkoJHNlYXJjaCkpIHskc2VhcmNoPSIiO30NCSRzZWFyY2hsZW5ndGggPSBzdHJfcmVwbGFjZSgnJnF1b3Q7JywnJywkc2VhcmNoKTsNCWlmKHN0cmxlbigkc2VhcmNobGVuZ3RoKSA+PSAkbGVuZ3RoICYmICRzZWFyY2ggIT0gJHZhbHVlKSB7DQ0NCWlmIChpc3NldCgkc3VjaGhpbndlaXMpICYmICRzdWNoaGlud2VpcyAhPSAiIikgew0JCSRzZWFyY2hoaW53ZWlzID0gJHN1Y2hoaW53ZWlzOw0JCX0gZWxzZSB7DQkJJHNlYXJjaGhpbndlaXMgPSAiU2llIHN1Y2hlbiBuYWNoIjsNCX0NCWVjaG8gJzxwPicuJHNlYXJjaGhpbndlaXMuJyA8ZW0+JnJhcXVvOycuJGdlc3VjaHQuJyZsYXF1bzs8L2VtPic7DQ0NDQkvLyBkaWUgRnVua3Rpb24genVtIGV4dHJhaGllcmVuIHZvbiBUZWlsc3RyaW5ncw0JZnVuY3Rpb24gYXVzbGVzZW4oJGFsbCwgJHN0YXJ0LCAkZW5kKSB7DQkJaWYgKHN0cmlzdHIoJGFsbCwkc3RhcnQpKSB7DQkJCSRzdGFydF9wb3M9c3RycG9zKHN0cnRvbG93ZXIoJGFsbCksc3RydG9sb3dlcigkc3RhcnQpKSArIHN0cmxlbigkc3RhcnQpOw0JCQkkcmVzdCA9IHN1YnN0cigkYWxsLCRzdGFydF9wb3MpOw0JCQkkZW5kX3Bvcz1zdHJwb3Moc3RydG9sb3dlcigkcmVzdCksc3RydG9sb3dlcigkZW5kKSk7DQkJCSRlcmcgPSBzdWJzdHIoJHJlc3QsMCwkZW5kX3Bvcyk7DQkJCXJldHVybiAkZXJnOw0JCX0NCX0NDQ0JLy8gZGllIEZ1bmt0aW9uIHp1bSBEdXJjaHN1Y2hlbiBkZXMgVmVyemVpY2huaXNiYXVtczoNCWlmICghaXNzZXQoJGV4Y2x1ZGVfZGlycykpICRleGNsdWRlX2RpcnMgPSBhcnJheSgiIik7DQ0JZnVuY3Rpb24gdHJlZSgkb3JkbmVyLCAkc3ViID0gRkFMU0UpIHsNCQlnbG9iYWwgJGVyZ2ViOw0JCSRoYW5kbGUgPSBvcGVuZGlyKCRvcmRuZXIpOw0JCXdoaWxlIChmYWxzZSAhPT0gKCRmaWxlID0gcmVhZGRpciAoJGhhbmRsZSkpKSB7DQkJCWlmKCRmaWxlICE9ICIuIiAmJiAkZmlsZSAhPSAiLi4iICYmIGlzX2Rpcigkb3JkbmVyLiIvIi4kZmlsZSkpIHsNCQkJCSRjb21wbCA9ICRvcmRuZXIuIi8iLiRmaWxlLiIvIjsNCSAgICAgICAJCSRlcmdlYiA9ICRlcmdlYi4iLCIuJGNvbXBsOw0gICAgICAgIAkJdHJlZSgkb3JkbmVyLiIvIi4kZmlsZSwgVFJVRSk7DQkJCX0NCQl9DQkgIAljbG9zZWRpcigkaGFuZGxlKTsNCX0NDQlpZiAoJGFsbGVkaXJzKSB7DQkgICB0cmVlKCIuIik7DQkgICAkZXJnZWIgPSAiLi8iLiRlcmdlYjsNCSAgICRkaXJzID0gZXhwbG9kZSAoIiwiLCAkZXJnZWIpOw0JfQ0NCWZvcmVhY2goJGRpcnMgYXMgJGRpcikgew0JCWlmKCFpbl9hcnJheSgkZGlyLCRleGNsdWRlX2RpcnMpKSB7DQkJJHZlcnogPSBvcGVuZGlyKCRkaXIpOw0NCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoJHZlcnopKSB7DQ0JCWlmKCRmaWxlICE9ICIuIiAmJiAkZmlsZSAhPSAiLi4iICYmICRmaWxlICE9ICIuaHRhY2Nlc3MiKSB7DQ0JCSRkdXJjaHN1Y2h0ID0gJGR1cmNoc3VjaHQgKyAxOw0JCS8vIGVpbnplbG5lIERhdGVpZW4gdm9uIGRlciBTdWNoZSBhdXNzY2hsaWVzc2VuDQkJLy8gZGllIGZvbGdlbmRlbiA4IFplaWxlbiBlcmxhdWJlbiBBdXNjaGx1c3Mgdm9uIFN1YnN0cmluZ3MgaW4gJGV4Y2x1ZGVfZmlsZXMNCQkkbm9saXN0PWZhbHNlOw0JCWZvciAoJGU9MDskZTxjb3VudCgkZXhjbHVkZV9maWxlcyk7JGUrKykgew0JCQkkcG9zID0gc3RycG9zKCRmaWxlLCRleGNsdWRlX2ZpbGVzWyRlXSk7DQkJCWlmICgkcG9zICE9PSBmYWxzZSkgew0JCQkJJG5vbGlzdCA9IHRydWU7DQkJCX0NCQl9IA0JCQ0JCWlmKCRub2xpc3QgIT09IHRydWUgJiYgcHJlZ19tYXRjaCgiPShcLiRkYXRfdHlwZSkkPSIsJGZpbGUpKSB7DQ0JCQkvLyBNZXRhLUFuZ2FiZW4gZXJtaXR0ZWxuDQkJCSR0aXRlbCA9ICIiOw0JCQkka2V5d29yZHMgPSAiIjsNCQkJJGRlc2NyaXB0aW9uID0gIiI7DQkJCSRnbXRhcnJheT1nZXRfbWV0YV90YWdzKCRkaXIuJGZpbGUpOw0JCQkJDQkJCXdoaWxlKGxpc3QoJGtleTEsJHZhbCk9ZWFjaCgkZ210YXJyYXkpKXsNCQkJCXN3aXRjaChzdHJ0b2xvd2VyKCRrZXkxKSl7DQkJCQkJY2FzZSAidGl0bGUiOiAkdGl0ZWw9JHZhbDsgYnJlYWs7DQkJCQkJY2FzZSAia2V5d29yZHMiOiAka2V5d29yZHM9JHZhbDsgYnJlYWs7DQkJCQkJY2FzZSAiZGVzY3JpcHRpb24iOiAkZGVzY3JpcHRpb249JHZhbDsgYnJlYWs7DQkJCQl9DQkJCX0NDQkJCSRzdHJpbmcxID0gJHN0cmluZyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRkaXIuJGZpbGUpOw0JCQkJDQkJCSRzdHJpbmcgPSBzdHJfcmVwbGFjZSgiJm5ic3A7IiwiICIsJHN0cmluZyk7IC8vIHdlaWwgc29uc3QgJmx0OyZuYnNwOyBhbHMgbGltaXQtZW5kIHdpcmt0Pz8/DQkJCQ0JCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcjW1xzXXsyLH0jcycsICcgJywgJHN0cmluZyk7IC8vIG1laHJlcmUgTGVlcnplaWNoZW4gaW4gZWlucyB1bXdhbmRlbG4NCQkJDQkJCS8vIHdlaWwgYW5zb25zdGVuIGVpbiAmbHQ7IGltIFF1ZWxsdGV4dCBkZW4gU3VjaGJlcmVpY2ggYmVlbmRldDoNCQkJJHN0cmluZyA9IHN0cl9yZXBsYWNlKCImbHQ7IiwiIiwkc3RyaW5nKTsNCQkJDQkJCWlmIChmaWxlX2V4aXN0cygidGFyZ2V0X3JlcGxhY2UucGhwIikpIHtpbmNsdWRlICgidGFyZ2V0X3JlcGxhY2UucGhwIik7fQ0JCQkNCQ0JCQkvLyBkYW1pdCB3ZXJkZW4gZ2FuemUgV29lcnRlciBnZWZ1bmRlbiwgYXVjaCB3ZW5uIHNpZSBpbiBUYWdzIGVpbmdlc2NobG9zc2VuIHNpbmQ6DQkJCSRzdHJpbmcgPSBzdHJfcmVwbGFjZSgiPCIsIiA8Iiwkc3RyaW5nKTsNCQkJJHN0cmluZyA9IHN0cl9yZXBsYWNlKCI+IiwiPiAiLCRzdHJpbmcpOw0NCQkJLy8gaHRtbCB0YWdzIG1pdCBlaW5nZXNjaGxvc3NlbmVuIHBocCB0YWdzIHJhdXMgLSB3ZWlsIHNvbnN0IGVpbiBlaW56ZWxuZXMgPCBvZGVyICZsdDsgYWxzIGVuZCB3aXJrdA0gIAkJCSRzdWNobXVzdGVyID0gIi88XD9bXj5dK1w/Pi8iOyANICAJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCRzdWNobXVzdGVyLCIiLCRzdHJpbmcpOw0NDS8vZWNobyAkZW5jb2Rpbmc7DQkJCWlmIChzdHJwb3Moc3RydG9sb3dlcigkZW5jb2RpbmcpLCJ1dGYiKSE9PSBmYWxzZSkgew0JCQkJJHN0cmluZyA9IGh0bWxfZW50aXR5X2RlY29kZSgkc3RyaW5nLCBFTlRfTk9RVU9URVMsICJVVEYtOCIpOw0JCQl9IGVsc2Ugew0JCQkJJHN0cmluZyA9IGh0bWxfZW50aXR5X2RlY29kZSgkc3RyaW5nLCBFTlRfTk9RVU9URVMsICJJU08tODg1OS0xIik7DQkJCX0NICAgICAgICAgICAgCS8vIG51ciBmdWVyIHdkdyBkeW4uIGRlc2NyaXB0aW9uczoNICAgICAgICAgICAgCWlmICgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSA9PSAid2ViZGVzaWduLndlaXNzaGFydC5kZSIpIHsNICAgCQkJCWlmICgkZGVzY3JpcHRpb24gPT0gIiIpew0gICAJCQkJCSRkZXNjcmlwdGlvbiA9IGF1c2xlc2VuKCRzdHJpbmcxLCAiZGVzY3JpcHRpb24iLCAnIjsnKTsNCQkJCQkkZGVzY3JpcHRpb24gPSBzdHJpcF90YWdzKCRkZXNjcmlwdGlvbik7DQkJCQkJJGRlc2NyaXB0aW9uID0gcHJlZ19yZXBsYWNlKCIvXG58XHJ8Y29udGVudHxcInw9fFwvfFw/LyIsICIiLCAkZGVzY3JpcHRpb24pOw0gICAJCQkJfQ0gICAgICAgICAgICAJfQ0NCQkJLy8gdW5kIHdlaWwgPHRpdGxlPiBuaWNodCBpbW1lciBhbHMgTWV0YS10YWcgY29kaWVydCB3aXJkOg0JCQlpZiAoJHRpdGVsID09ICIiKSAkdGl0ZWwgPSBhdXNsZXNlbigkc3RyaW5nLCAiPHRpdGxlPiIsICI8L3RpdGxlPiIpOw0NCQkJLy8gd2VpbCBlcyBMZXV0ZSBnaWJ0LCBkaWUgbWV0YSBUYWdzIG1pdCBaZWlsZW51bWJydWNoIHNjaHJlaWJlbjoNCQkJJGRlc2NyaXB0aW9uID0gc3RyX3JlcGxhY2UoIlxuIiwiIiwkZGVzY3JpcHRpb24pOw0JCQkka2V5d29yZHMgPSBzdHJfcmVwbGFjZSgiXG4iLCIiLCRrZXl3b3Jkcyk7DQkJCSR0aXRlbCA9IHN0cl9yZXBsYWNlKCJcbiIsIiIsJHRpdGVsKTsNDQkJCS8vIERhdGVpZW4gbnVyIHp3aXNjaGVuIGRlbiBiZWlkZW4gbGltaXRlciB0YWdzIGF1c3dlcnRlbjoNCQkJaWYgKCRsaW1pdF9zdGFydCAhPSAiIikgew0JCQkJLy8gV3VyZGUgbmVlZGxlIG5pY2h0IGdlZnVuZGVuLCBnaWJ0IHN0cnBvcygpIGRlbiBib29sZWFuLVdlcnQgRkFMU0UgenVyw7xjay4NCQkJCWlmIChzdHJwb3Moc3RydG9sb3dlcigkc3RyaW5nKSxzdHJ0b2xvd2VyKCRsaW1pdF9zdGFydCkpICE9PSBmYWxzZSkgew0JCQkJCSRwb3M9c3RycG9zKHN0cnRvbG93ZXIoJHN0cmluZyksc3RydG9sb3dlcigkbGltaXRfc3RhcnQpKSArIHN0cmxlbigkbGltaXRfc3RhcnQpOw0JCQkJCSRzdWJzdHJpbmdfcmVzdCA9IHN1YnN0cigkc3RyaW5nLCRwb3MpOw0JCQkJfSBlbHNlIHsNCQkJCQlpZiAoaXNzZXQoJGxpbWl0X29ubHkpICYmICRsaW1pdF9vbmx5ID09PSB0cnVlKSB7JHN1YnN0cmluZ19yZXN0ID0gIiI7fSAvL2RhbWl0IGJyaWNodCBkaWUgU3VjaGUgYWIsIHdlbm4gJGxpbWl0X3N0YXJ0IG5pY2h0IGdlZnVuZGVuIHdpcmQuDQkJCQkJZWxzZSB7JHN1YnN0cmluZ19yZXN0ID0gJHN0cmluZzt9DQkJCQl9DQkJCX0gZWxzZSB7DQkJCQkkc3Vic3RyaW5nX3Jlc3QgPSAkc3RyaW5nOw0JCQl9DQ0JCQkvLyB3ZW5uICRsaW1pdF9lbmQgZ2VzZXR6dDoNCQkJaWYgKCRsaW1pdF9lbmQgIT0gIiIpIHsNCQkJCSRlbmRfcG9zPXN0cnBvcyhzdHJ0b2xvd2VyKCRzdWJzdHJpbmdfcmVzdCksc3RydG9sb3dlcigkbGltaXRfZW5kKSk7DQkJCQlpZiAoJGVuZF9wb3MgIT09IGZhbHNlKSB7DQkJCQkJJHN0cmluZyA9IHN1YnN0cigkc3Vic3RyaW5nX3Jlc3QsMCwkZW5kX3Bvcyk7DQkJCQl9IGVsc2Ugew0JCQkJCSRzdHJpbmcgPSAkc3Vic3RyaW5nX3Jlc3Q7DQkJCQl9DSAgICAgICAgICAgICAJfSBlbHNlIHsNCQkJCSRzdHJpbmcgPSAkc3Vic3RyaW5nX3Jlc3Q7DSAgICAgICAgICAgICAJfQ0NDQkJCS8vSW5oYWx0IHZvbiB0YWdzIGF1c3dlcnRlbjoNCQkJaWYgKCR0YWdzPT09ZmFsc2UpIAkkc3RyaW5nID0gc3RyaXBfdGFncygkc3RyaW5nKTsNDQkJCS8vIGRpZSBtZXRhIHRhZ3MgaW4gZGllIFN1Y2hlIGVpbnNjaGxpZXNzZW4gZ2VtYWVzcyBjb25maWc6DSAgICAgICAgICAgIAlpZiAoJHRhZ3MgPT09IHRydWUpIHska2V5PXRydWU7ICRkZXNjPXRydWU7ICR0aXQ9dHJ1ZTt9DQkJCWlmICgka2V5ID09PSB0cnVlKSAkc3RyaW5nPSRzdHJpbmcuJGtleXdvcmRzOw0JCQlpZiAoJGRlc2MgPT09IHRydWUpICRzdHJpbmc9JHN0cmluZy4kZGVzY3JpcHRpb247DQkJCWlmICgkdGl0ID09PSB0cnVlKSAkc3RyaW5nPSRzdHJpbmcuJHRpdGVsOw0NCQkJJHN0cmluZyA9IHN0cl9yZXBsYWNlKCJcbiIsICIgIiwgJHN0cmluZyk7DQ0JCQkkc3RyaW5nID0gc3RyX3JlcGxhY2UoInRpdGxlPiIsICIiLCAkc3RyaW5nKTsgLy8gd2VubiBUcmVmZmVyIGluIDx0aXRsZT4gd2lyZCB0aXRsZT4gYW5nZXplaWd0Pw0NCQkJDQkJCS8vIHVuZXJ3dWVuc2NodGUgU3RyaW5ncyB2b24gZGVyIFN1Y2hlIGF1c3NjaGxpZXNzZW4NCQkJZm9yZWFjaCgkZXhjbHVkZV9zdHJpbmdzX21lcmdlIGFzICRrKSB7DQkJCQkkc3RyaW5nID0gc3RyX3JlcGxhY2UoJGssIiIsJHN0cmluZyk7DQkJCX0JCQkNDQ0gICAgICAgICAgIAkJLy8gRS1NYWlscyByYXVzOiBodHRwOi8vd3d3LnJlZ3VsYXItZXhwcmVzc2lvbnMuaW5mby9lbWFpbC5odG1sDSAgICAgICAgICAgIAkkc3VjaG11c3RlciA9ICcvXGJbQS1aMC05Ll8lKy1dK0BbQS1aMC05Li1dK1wuW0EtWl17Miw0fVxiL2knOw0gICAgICAgICAgICAJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgkc3VjaG11c3RlciwnJywgJHN0cmluZyk7DQ0JCQlpZihtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgJ1VURi04LCBJU08tODg1OS0xJykgPT09ICdVVEYtOCcgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b2xvd2VyJykpewkNCQkJCSRzdHJpbmdsb3cgPSBtYl9zdHJ0b2xvd2VyKCRzdHJpbmcsJ1VURi04Jyk7DQkJCQkkc2VhcmNobG93ID0gbWJfc3RydG9sb3dlcigkc2VhcmNoLCdVVEYtOCcpOw0JCQl9IA0JCQllbHNlIHsNCQkJCSRzdHJpbmdsb3cgPSBzdHJ0b2xvd2VyKCRzdHJpbmcpOw0JCQkJJHNlYXJjaGxvdyA9IHN0cnRvbG93ZXIoJHNlYXJjaCk7CQ0JCQl9DQ0JCQkvLyB3ZWlsIHN0cnRvbG93ZXIgdW50ZXIgUEhQIDUuNCBhbnNjaGVpbmVuZCBuaWNodCBtZWhyIHR1dA0JCQkkdW1sYXV0X2dyb3NzID0gYXJyYXkoJ8QnLCfWJywn3CcpOw0JCQkkdW1sYXV0X2tsZWluID0gYXJyYXkoJ+QnLCf2Jywn/CcpOw0JCQkkc2VhcmNobG93ID0gc3RyX3JlcGxhY2UoJHVtbGF1dF9ncm9zcywgJHVtbGF1dF9rbGVpbiwgJHNlYXJjaGxvdyk7DQkJCSRzdHJpbmdsb3cgPSBzdHJfcmVwbGFjZSgkdW1sYXV0X2dyb3NzLCAkdW1sYXV0X2tsZWluLCAkc3RyaW5nbG93KTsNDQkJCSMgZGllIHVuZC1WZXJrbnVlcGZ1bmc6DQkJCSRvciA9IGZhbHNlOyANDQkJCWlmICgoc3RycG9zKCRzZWFyY2hsb3csIiBvciAiKSAhPT0gZmFsc2UgfHwgc3RycG9zKCRzZWFyY2hsb3csIiBvZGVyICIpICE9PSBmYWxzZSkgJiYgIGlzc2V0KCRzdWNodGlwM29yKSApIHsgLy8gVW1zY2hhbHRlbiB2b24gdW5kIGF1ZiBvciANCQkJCSRvciA9IHRydWU7DQkJCQkkc2VhcmNobG93ID0gc3RyX3JlcGxhY2UoIiBvciAiLCAiICIsICRzZWFyY2hsb3cpOw0JCQkJJHNlYXJjaGxvdyA9IHN0cl9yZXBsYWNlKCIgb2RlciAiLCAiICIsICRzZWFyY2hsb3cpOw0JCQl9DQkJCQkNCQkJIyBXb3J0Z3J1cHBlbg0JCQlpZiAoJGF1c2RydWNrICE9PSBmYWxzZSkgew0JCQkJJHNlYXJjaGxvdyA9IHN0cl9yZXBsYWNlKCcmcXVvdDsnLCcnLCRzZWFyY2hsb3cpOw0JCQkJJHNlYXJjaGxvdyA9IHN0cl9yZXBsYWNlKCciJywnJywkc2VhcmNobG93KTsNCQkJCSRzZWFyY2hfYXJyWzBdID0gJHNlYXJjaGxvdzsNDQkJCX0gZWxzZSB7DQkJCQkkc2VhcmNoX2FyciA9IGV4cGxvZGUoIiAiLCRzZWFyY2hsb3cpOw0JCQl9DQkJCSRzZWFyY2hfY291bnQgPSBjb3VudCgkc2VhcmNoX2Fycik7DQ0NCQkJJGk9MDsNCQkJZm9yZWFjaCAoJHNlYXJjaF9hcnIgYXMgJHNlYXJjaF93b3JkKSB7DQkJCQlpZiAoQHN0cnBvcygkc3RyaW5nbG93LCRzZWFyY2hfd29yZCkgIT09IGZhbHNlKSB7CSAJLy8gd2VubiBTdWNoYmVncmlmZiB2b3Jrb21tdCwgc2NobmVsbGVyIGFscyBwcmVnX21hdGNoCQkJCQ0JCQkJCSRpKys7DQ0JCQkJCWlmICgkb3IgPT09IHRydWUpIHskaSA9ICRzZWFyY2hfY291bnQgPSAxO30gLy8gZGVyIEhhY2ssIHVtIGJlaSBPUiBuaWNodCB6dSB3YXJ0ZW4sIGJpcyBhbGxlIFN1Y2hiZWdyaWZmZSBnZWZ1bmRlbiB3ZXJkZW4NDQkJCQkJaWYgKCRpPT0kc2VhcmNoX2NvdW50KSB7CQkvLyBzb2JhbGQgYWxsZSBTdWNoYmVncmlmZmUgZ2VmdW5kZW4gd3VyZGVuLi4uDQkJCQkJCQ0JCQkJCQkkc3RyaW5nbG93ID0gc3RyaXBfdGFncygkc3RyaW5nbG93KTsNDQkJCQkJCSR0ZXN0ID0gQHN1YnN0cl9jb3VudCgkc3RyaW5nbG93LCAkc2VhcmNoX3dvcmQpOw0NCQkJCQkJaWYgKCRzZWFyY2hfY291bnQgPiAxKXsNCQkJCQkJCSRwb3M9c3RycG9zKCRzdHJpbmdsb3csJHNlYXJjaF93b3JkKTsNCQkJCQkJfSBlbHNlIHsNCQkJCQkJCSRwb3M9c3RycG9zKCRzdHJpbmdsb3csJHNlYXJjaGxvdyk7DQkJCQkJCX0NDQ0JCQkJCQlpZiAoJHZvciA+PSAkcG9zKSB7DQkJCQkJCQkkcGllY2UxID0gc3Vic3RyKCRzdHJpbmcsMCwkbmFjaCk7DQkJCQkJCX0gZWxzZSB7DQkJCQkJCQkkcGllY2UxID0gc3Vic3RyKCRzdHJpbmcsJHBvcy0kdm9yLCR2b3IrJG5hY2gpOw0NCQkJCQkJCSRwaWVjZTEgPSBzdHJzdHIgKCRwaWVjZTEsIiAiKTsgLy8gdmVybWVpZGV0IEJydWNoc3R1ZWNrZSB2b24gV29lcnRlcm4gYW0gQW5mYW5nIGRlcyBLb250ZXh0DQkJCQkJCX0NDQ0NCQkJCQkJJHBpZWNlMSA9IHN1YnN0cigkcGllY2UxLCAwLCBzdHJsZW4oc3RycmNocigkcGllY2UxLDMyKSkqKC0xKSkuIiAuLi4iOyAvLyB2ZXJtZWlkZXQgQnJ1Y2hzdHVlY2tlIHZvbiBXb2VydGVybiBhbSBFbmRlIGRlcyBLb250ZXh0DQkJCQkJCSRyZXN0ID0gIjxiciAvPiRwaWVjZTEiOw0NDQ0NCQkJCQkJJGZpbGVmb3JzaXplID0gJGZpbGU7DQkJCQkJCWlmICgkc2hvd19leHQgIT09IHRydWUpIHsNCQkJCQkJCSRpbmZvID0gcGF0aGluZm8oJGZpbGUpOw0JCQkJCQkJJGZpbGUgPSAgYmFzZW5hbWUoJGZpbGUsJy4nLiRpbmZvWydleHRlbnNpb24nXSk7DQkJCQkJCX0NDQ0JCQkJCQlpZigkdm9yPT0iMCIgJiYgJG5hY2g9PSIwIikgJHJlc3QgPSAiIjsNDQkgICAgICAgICAgICAgICAgICAgIGlmKCEkZGVzY3JpcHRpb24gPT0gIiIgJiYgJHNob3dfZGVzYyA9PSB0cnVlKSAkcmVzdCA9ICI8YnIgLz48c3Ryb25nPiRiZXNjaHJlaWI8L3N0cm9uZz4gJGRlc2NyaXB0aW9uIjsNCQkJCQkJaWYoJGZpbGVuYW1lKSAkdGl0ZWwgPSAkZmlsZTsNDQkJCQkJCWlmIChpc3NldCgkY2hhdmUpICYmICRjaGF2ZSA9PSAiMzIxIil7DQkJCQkJCQkvLyB1bmRvY3VtZW50ZWQ6IG51ciBkaXIgemVpZ2VuDQkJCQkJCQlpZiAoaXNzZXQoJHNob3dfZGlyX29ubHkpICYmICRzaG93X2Rpcl9vbmx5ID09PSB0cnVlKSB7DQkJCQkJCQkJJGxhc3RfZGlyID0gZXhwbG9kZSgnLycsICRkaXIpOw0JCQkJCQkJCSR4ID0gYXJyYXlfa2V5cygkbGFzdF9kaXIpOw0JCQkJCQkJCSRsYXN0X2tleSA9IGVuZCgkeCkgLTE7DQkJCQkJCQkJJHRpdGVsID0gJGxhc3RfZGlyWyRsYXN0X2tleV07DQkJCQkJCQkJJGZpbGU9IiI7DQkJCQkJCQl9DQkJCQkJCX0NDQkJCQkJCWlmKCR0aXRlbCA9PSAiIikgJHRpdGVsID0gJGZpbGU7DQ0NCQkJCQkJaWYgKGlzc2V0KCRxdWVyeSkpew0JCQkJCQkJJHFkaXIgPSBzdHJfcmVwbGFjZSgiLi8iLCIiLCRkaXIpOyAvLyBlbnRmZXJudCBkYXMgZnVlaHJlbmRlIC4vIGJlaW0gcXVlcnkgc3RyaW5nDSAgICAgICAgICAgICAgICAgICAgICAgICAJaWYgKGlzc2V0KCRxdWVyeV9lbmR1bmcpICYmICRxdWVyeV9lbmR1bmcgPT0gIm5vIikgew0gICAgICAgICAgICAgICAgICAgICAgICAgIAkJJGZleHQgID0gYXJyYXlfcG9wKGV4cGxvZGUoJy4nLCAkZmlsZSkpOw0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmbmFtZSA9IGJhc2VuYW1lKCRmaWxlLCAnLicuJGZleHQpOw0JCQkJCQkJICAgICRsaW5rID0gJHF1ZXJ5LiRxZGlyLiRmbmFtZTsNICAgICAgICAgICAgICAgICAgICAgICAgCX0gZWxzZSB7DQkJCQkJCQkJJGxpbmsgPSAkcXVlcnkuJHFkaXIuJGZpbGU7DSAgICAgICAgICAgICAgICAgICAgICAgCQl9DQkJCQkJCX0gZWxzZSB7DQkJCQkJCQkkbGluayA9ICRkaXIuJGZpbGU7DQkJCQkJCX0NDQkJCQkJCWlmICgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSA9PSAid2ViZGVzaWduLndlaXNzaGFydC5kZSIpIHsNCQkJICAgICAgICAgICAgDSAgICAgICAgICAgICAgICAgIAkJCS8vIFVtbGVpdGVuIHZvbiBLb21tZW50YXJlbiBhdWYgZGVuIEFydGlrZWw6DSAgICAgICAgICAgICAgICAgIAkJCWlmIChzdHJwb3MoJGxpbmssJ2NvbW1lbnQnKSAhPT0gZmFsc2UpIHsNICAgICAgICAgICAgICAgICAgICAgCQkJJHRpdGVsID0gc3RyX3JlcGxhY2UoImNvbW1lbnRfIiwiIiwkdGl0ZWwpOw0gICAgICAgICAgICAgICAgICAgICAJCQkkdGl0ZWwgPSBzdHJfcmVwbGFjZSgiLnhtbCIsIi5waHAiLCR0aXRlbCk7DSAgICAgICAgICAgICAgICAgICAgIAkJCSR0aXRlbCA9ICdLb21tZW50YXIgYXVmIGRlciBTZWl0ZSAnLiR0aXRlbDsNICAgICAgICAgICAgICAgICAgDSAgICAgICAgICAgICAgICAgICAgIAkJCSRsaW5rID0gc3RyX3JlcGxhY2UoImNvbW1lbnRfIiwiIiwkbGluayk7DSAgICAgICAgICAgICAgICAgICAgIAkJCSRsaW5rID0gc3RyX3JlcGxhY2UoIi54bWwiLCIucGhwIiwkbGluayk7DSAgICAgICAgICAgICAgICAgIAkJCX0NDSAgICAgICAgICAgICAgICAgIAkJCS8vIEpldHp0IFVtbGVpdGVuIHZvbiBtZC1UZXh0ZmlsZXMgYXVmIGRlbiBBcnRpa2VsOg0gICAgICAgICAgICAgICAgICAJCQlpZiAoc3RycG9zKCRsaW5rLCcvbWFya2Rvd24vJykgIT09IGZhbHNlKSB7DSAgICAgICAgICAgICAgICAgICAgIAkJCSRsaW5rID0gc3RyX3JlcGxhY2UoIm1hcmtkb3duLyIsIiIsJGxpbmspOw0gICAgICAgICAgICAgICAgICAgICAJCQkkbGluayA9IHN0cl9yZXBsYWNlKCJfdGV4dC50eHQiLCIucGhwIiwkbGluayk7DSAgICAgICAgICAgICAgICAgICAgIAkJCSRsaW5rID0gc3RyX3JlcGxhY2UoInBiXyIsIiIsJGxpbmspOw0JCQkgICAJCQkJCSR0aXRlbCA9IHN0cl9yZXBsYWNlKCIuLyIsIiIsJGxpbmspOyANICAgICAgICAgICAgICAgICAgCQkJfQ0JCQkJCQl9DQkJCQkJCQ0JCQkJCQlpZiAoaXNzZXQoJGNoYXZlKSAmJiAkY2hhdmUgPT0gIjMyMSIpew0JCQkJICAJCQkvLyBVbWxlaXRlbiB2b24gSW5jbHVkZS1EYXRlaWVuOg0JCQkJICAJCQlpZiAoaXNzZXQoJHJlZGlyX3N1ZmZpeCkgJiYgaXNzZXQoJHJlZGlyX3JlcGxhY2UpKSB7DSAgICAgICAgICAgICAgICAgICAgIAkJCSR0aXRlbCA9IHN0cl9yZXBsYWNlKCRyZWRpcl9zdWZmaXgsJHJlZGlyX3JlcGxhY2UsJHRpdGVsKTsNICAgICAgICAgICAgICAgICAgICAgCQkJJGxpbmsgPSBzdHJfcmVwbGFjZSgkcmVkaXJfc3VmZml4LCRyZWRpcl9yZXBsYWNlLCRsaW5rKTsNCQkJCSAgCQkJfQkJCQkNCQkJCQkJfQ0JCQkJCQkNCQkJCQkJaWYoJHRpdGVsICE9ICIiKSB7DQkJCQkJCQkNCQkJCQkJCSR0aXRlbCA9IHRyaW0oJHRpdGVsKTsNDQkJCQkJCQlpZiAoJHRhcmdldCA9PSAiYmxhbmsiKSB7DQkJCQkJCQkJJHppZWwgPSAnIHRhcmdldD0iX2JsYW5rIic7DQkJCQkJCQkJJGp1bXAgPSBmYWxzZTsNCQkJCQkJCX0gZWxzZWlmICgkdGFyZ2V0ID09ICJwYXJlbnQiKSB7DQkJCQkJCQkJJHppZWwgPSAnIHRhcmdldD0iX3BhcmVudCInOw0JCQkJCQkJCSRqdW1wID0gZmFsc2U7DQkJCQkJCQl9IGVsc2VpZiAoJHRhcmdldCAhPSAiIikgew0JCQkJCQkJCSR6aWVsID0gJyB0YXJnZXQ9IicuJHRhcmdldC4nIic7DQkJCQkJCQkJJGp1bXAgPSBmYWxzZTsNCQkJCQkJCX0gZWxzZSB7DQkJCQkJCQkJJHppZWwgPSAnJzsNCQkJCQkJCX0NDQkJCQkJCQlpZiAoJHBmYWQgPT0gdHJ1ZSkgew0JCQkJCQkJCWlmIChpc3NldCgkcXVlcnkpKXsNCQkgICAgICAgICAgICAgICAgICAgICAgICAJJHVybCA9ICIgPGEgaHJlZj1cIiIuJGxpbmsuIlwiIi4kemllbC4iPiIuJHByb3QuJHBmYWRpbmZvLiRsaW5rLiI8L2E+ICI7DQkJCQkJCQkJfSBlbHNlIHsNCQkgICAgICAgICAgICAgICAgICAgICAgICAJJHVybCA9ICIgPGEgaHJlZj1cIiIuJGxpbmsuIlwiIi4kemllbC4iPiIuJHByb3QuJHBmYWRpbmZvLnN1YnN0cigkbGluaywxKS4iPC9hPiAiOw0JCQkJCQkJCX0NCSAgICAgICAgICAgICAgICAgICAJCX0gZWxzZSB7DQkgICAgICAgICAgICAgICAgICAgICAJCSR1cmwgPSAiIjsNCSAgICAgICAgICAgICAgICAgICAgICAgCX0NDQkgICAgICAgICAgICAgICAgICAgCQlpZiAoJGFlbmRfZGF0ID09IHRydWUpIHsNCQkJCQkJCQlpZiAoJGRhdGVmb3JtID09ICJlbiIpIHsNCQkJCQkJCQkJQCRtb2QgPSAkZmlsZWRhdGUuZGF0ZSgibS9kL3kiLCBmaWxlbXRpbWUoJGRpci4kZmlsZWZvcnNpemUpKTsNCQkJCQkJCQkNCQkJCQkJCQl9IGVsc2VpZiAoJGRhdGVmb3JtID09ICJkZSIgfHwgJGRhdGVmb3JtID09ICIiIHx8ICFpc3NldCgkZGF0ZWZvcm0pKSB7DQkJCQkJCQkJCUAkbW9kID0gJGZpbGVkYXRlLmRhdGUoImQubS55IiwgZmlsZW10aW1lKCRkaXIuJGZpbGVmb3JzaXplKSk7DQkJCQkJCQkJfSBlbHNlIHsNCQkJCQkJCQkJQCRtb2QgPSAkZmlsZWRhdGUuZGF0ZSgkZGF0ZWZvcm0sIGZpbGVtdGltZSgkZGlyLiRmaWxlZm9yc2l6ZSkpOw0JCQkJCQkJCX0NCQkJCQkJCQkkbW9kID0gIjxzcGFuIGNsYXNzPSdtb2QxJz4iLiRtb2QuIjwvc3Bhbj4iOw0JCQkJCQkJfSBlbHNlIHsNCSAgICAgICAgICAgICAgICAgICAgCQkkbW9kID0gIiI7DQkgICAgICAgICAgICAgICAgICAgIAl9DQ0JCQkJCQkJLy8gZWluIFRodW1iIGVpbmJpbmRlbiwgd2VubiBlaW5lIEdyYWZpay1EYXRlaSBtaXQgZ2xlaWNoZW0gRGF0ZWluYW1lbiBpbSBPcmRuZXIgbGllZ3QNCQkJCQkJCQ0JCQkJCQkJJHRodW1iID0gJyc7DQkJCQkJCQlpZiAoaXNzZXQoJGNoYXZlKSAmJiAkY2hhdmUgPT0gIjMyMSIpIHsNCQ0JCQkJCQkJCSRleHRlbnNpb25zID0gYXJyYXkoIi5odG0iLCIuaHRtbCIsIi5zaHRtbCIsIi5waHAiLCIucGhwMyIsIi5waHA0IiwiLnBocDUiLCAiLnBkZiIpOw0JCQkJCQkJCSR0aHVtYiA9IHN0cl9yZXBsYWNlKCRleHRlbnNpb25zLCR0aHVtYl9yZXBsYWNlLCRsaW5rKTsNCQkJCQkJCX0NDQkJCQkJCQkkaW1nbGluayA9ICIiOw0JCQkJCQkJCWlmIChmaWxlX2V4aXN0cygkdGh1bWIpICYmICR0aHVtYiAhPSAkbGluaykgew0JCQkJCQkJCQkkaW1nbGluayA9ICc8YSBocmVmID0iJy4kbGluay4nIj48aW1nIHNyYz0iJy4kdGh1bWIuJyIgYWx0PSJTeW1ib2wgZGVyIFNlaXRlICIvPiA8L2E+ICc7DQkJCQkJCQkJfQ0NCSAgICAgICAgICAgICAgICAJCSR0cmVmZl9hbno9IiI7DQkgICAgICAgICAgICAgICAgICAJCWlmKCR0cmVmZmVyICYmICR0ZXN0Pj0xKSAkdHJlZmZfYW56PSI8c3BhbiBjbGFzcz0ndHJlZmZlcic+WyIuJHRlc3QuIiZuYnNwOyIuJHRyZWZmLiJdPC9zcGFuPiI7DQ0JCQkJCS8vIHNvIGthbm4gbWFuIGFscGhhYmV0aXNjaCBzb3J0aWVyZW46IChOZWdlcnRyaWNrKQ0JCQkJCWlmIChpc3NldCgkYWxwaGFzb3J0KSAmJiAkYWxwaGFzb3J0ID09PSB0cnVlKSB7JHRlc3QgPSAkdGl0ZWw7fQ0NCQkJCQkvLyBUcmVmZmVyIGJlaSBvciBudXIgZWlubWFsIGF1Zmxpc3Rlbg0JCQkJCWlmICghaW5fYXJyYXkoJGxpbmssICRiZXJlaXRzX2ZvdW5kKSkgew0JCQkJCQlpZiAoJG9yID09PSB0cnVlKSB7JGJlcmVpdHNfZm91bmRbXSA9ICRsaW5rO30gDQ0gICAgICAgICAgICAgICAgICAgICAgCQkJaWYgKCRwZmFkIHx8ICRhZW5kX2RhdCkgew0gICAgICAgICAgICAgICAgICAgICAgICAJCQlpZiAoJGlmcmFtZSAhPT0gdHJ1ZSkgeyANICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkkYXJyYXkgLj0gJHRlc3QuJGltZ2xpbmsuIjxhIGhyZWY9XCIiLiRsaW5rLiJcIiIuJHppZWwuIj4iLiR0aXRlbC4iPC9hPiAiLiRsaXN0X2h4X2VuZC4kdHJlZmZfYW56LiRyZXN0LiI8c3BhbiBjbGFzcz0nbW9kJz4iLiR1cmwuIjwvc3Bhbj4iLiRtb2QuIlxuIjsNICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJfSBlbHNlIHsNICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSRhcnJheSAuPSAiJGxpbmtcbiI7DSAgICAgICAgICAgICAgICAgICAgICAgCQkJCX0NICAgICAgICAgICAgICAgICAgICAgCQkJfSBlbHNlIHsNICAgICAgICAgICAgICAgICAgICAgICAgCQkJaWYgKCRpZnJhbWUgIT09IHRydWUpIHsgDSAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJJGFycmF5IC49ICR0ZXN0LiRpbWdsaW5rLiI8YSBocmVmPVwiIi4kbGluay4iXCIiLiR6aWVsLiI+Ii4kdGl0ZWwuIjwvYT4gIi4kbGlzdF9oeF9lbmQuJHRyZWZmX2Fuei4kcmVzdC4iXG4iOw0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJfSBlbHNlIHsNICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSRhcnJheSAuPSAiJGxpbmtcbiI7DSAgICAgICAgICAgICAgICAgICAgICAgICAJCQl9DSAgICAgICAgICAgICAgICAgICAgICAgIAkJfQ0JCQkJCX0NDQ0JICAgICAgICAgICAgICAgCQkJJGZvdW5kICsrOw0NCQkJCQkJfQ0JCQkJCX0NCQkJCX0NCQkJfQ0JCX0NCX0NCX0NCX0NCQ0JQGNsb3NlZGlyKCR2ZXJ6KTsNDQl9DWVjaG8gJzwvcD4nOw1pZiAoJHNlYXJjaCA9PSAip2ZvdW5kIikge2VjaG8gJyYjODM7dSYjOTk7aCYjMTE1O2MmIzExNDtpJiMxMTI7dCAmIzE2OTsgMiYjNDg7MDUgJiMxMTk7ZSYjOTg7ZCYjMTAxO3MmIzEwNTtnbiYjNDY7JiMxMTllJiMxMDU7cyYjMTE1O2gmIzk3O3ImIzExNjsmIzQ2OyYjMTAwO2UnO2V4aXQ7fQ0NDS8vIExvZ2RhdGVpIHNjaHJlaWJlbiB1bmQgQmVuYWNocmljaHRpZ3VuZ3MtTWFpbCBtaXQgaXAgLSBTcGVycmU6DS8vIGJhc2U2NCBzY2hyZWlidCAyIExvZ2VpbnRyYWVnZSENDWZ1bmN0aW9uIHNjaHJlaWJlbigkZGF0ZWksJG1vZGUpew0JZ2xvYmFsICRzZWFyY2g7DQkkZnAgPSBAZm9wZW4oJGRhdGVpLCRtb2RlKTsNCWZsb2NrKCRmcCxMT0NLX0VYKTsNCWZ3cml0ZSgkZnAsJF9TRVJWRVJbIlJFTU9URV9BRERSIl0uInwiLnRpbWUoKS4ifCIuJHNlYXJjaC4iXG4iKTsNCWZsb2NrKCRmcCxMT0NLX1VOKTsNCWZjbG9zZSgkZnApOw19DQ0NZnVuY3Rpb24gaXBfc3BlcnJlKCkgew0JZ2xvYmFsICRzZWFyY2gsICRyZWxvYWRsaW1pdCwgJGluc3RhbGxhdGlvbl9wYXRoOw0JJHJlbG9hZGxvZ2RhdGVpID0gJGluc3RhbGxhdGlvbl9wYXRoLicvcmVsb2FkLnR4dCc7DQkkYW56YWhsZWludHJhZWdlID0gMTAwOw0NCS8vIFBydWVmZW4sIG9iIHJlbG9hZGRhdGVpIGV4aXN0aWVydCA9PiBhbnNvbnN0ZW4gRXJzdGVsbGVuDQ0JaWYoIWZpbGVfZXhpc3RzKCRyZWxvYWRsb2dkYXRlaSkpIHsNCQkkZGF0ZWkgPSBmb3BlbigkcmVsb2FkbG9nZGF0ZWksIncrIik7DQkJZmNsb3NlKCRkYXRlaSk7DQl9DQ0JJGZwID0gZmlsZSgkcmVsb2FkbG9nZGF0ZWkpOw0JJHNpemUgPSBzaXplb2YoJGZwKTsNCSRhdXNnYWJlID0gZmFsc2U7DQkvLyBEYXRlaSBzY2hyZWliZW4sIHdlbm4gTGlzdGUgdm9sbDoNCWlmKCRzaXplID49ICRhbnphaGxlaW50cmFlZ2Upew0JCXNjaHJlaWJlbigkcmVsb2FkbG9nZGF0ZWksInciKTsNDQkvLyBQcnVlZmVuLCBvYiBlaW5lIElQIGluIGRlciBMaXN0ZSBzdGVodA0JfSBlbHNlIHsNCQlmb3IgKCRpPTA7JGk8JHNpemU7JGkrKykgew0gICAgICAJCSR6ZWlsZSA9IGV4cGxvZGUoInwiLCRmcFskaV0pOw0NCQkJaWYgKCR6ZWlsZVsxXSA+IHRpbWUoKS0zIHx8DQkJCSR6ZWlsZVswXSA9PSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXSAmJiAkemVpbGVbMV0gPiB0aW1lKCktNiB8fA0JCQkkemVpbGVbMF0gPT0gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0gJiYgdHJpbSgkemVpbGVbMl0pID09ICRzZWFyY2ggJiYgJHplaWxlWzFdID4gKHRpbWUoKS0kcmVsb2FkbGltaXQpKSB7IC8vIGdsZWljaGUgSVAsIHJlbG9hZGxpbWl0IHVuZCBnbGVpY2hlciBTdWNoYmVncmlmZg0JCQkJJGF1c2dhYmUgPSB0cnVlOw0gICAgICAJCX0NCQl9DQkJLy8gUHJvdG9rb2xsaWVydCBkaWUgSVAtQWRyZXNzZSAoc2NocmVpYnQpOg0JCXNjaHJlaWJlbigkcmVsb2FkbG9nZGF0ZWksImErIik7DQl9DQ0NCXJldHVybiBAJGF1c2dhYmU7DX0NDS8vIGpldHp0IExvZ2ZpbGUgdW5kIEJlbmFjaHJpY2h0aWd1bmdzLU1haWwgc2NocmVpYmVuOg0NaWYoaXBfc3BlcnJlKCk9PT1mYWxzZSkgew0JDQkkc3VjaGJlZ3JpZmYgPSBodG1sX2VudGl0eV9kZWNvZGUoJHNlYXJjaCk7DQ0JLy8gQmVuYWNocmljaHRpZ3VuZ3MgTWFpbDoNCWlmKCRtYWlsID09IHRydWUgJiYgJHNlYXJjaCAhPSAkdmFsdWUpIHsNCQlpZiAoISRzZW5kZXIpIHskc2VuZGVyID0gIlN1Y2hzY3JpcHQiO30NCQltYWlsKCRhZG1pbmFkZHJlc3MsIlN1Y2hlIGF1ZiAkc2VpdGUiLCJGb2xnZW5kZXIgQmVncmlmZiB3dXJkZSBzb2ViZW4gYXVmIGRlciBTZWl0ZSAkc2VpdGUgZ2VzdWNodDogXG4kc3VjaGJlZ3JpZmZcblRyZWZmZXI6ICRmb3VuZCIsIkZyb206ICRzZW5kZXIiICk7DQl9DQ0JLy8gTG9nZmlsZSBzY2hyZWliZW46DQkkdG9kYXkgPSBkYXRlKCJkLm0uIEg6aSAiKTsNCSRubCA9ICR0b2RheS4kc3VjaGJlZ3JpZmYuIigiLiRmb3VuZC4iKVxuIjsNCQ0JDQkkbGluZXMgPSBmaWxlKCRpbnN0YWxsYXRpb25fcGF0aC4nL3NlYXJjaGxvZy50eHQnKTsNCSRsaW5lcyA9IGFycmF5X3VuaXF1ZSgkbGluZXMpOyAvLyBEdXBsaWthdGUgbG9lc2NoZW4NDQ0JLy8gV2VubiBtZWhyIGFscyAkbWF4bXNnIChkZWZhdWx0OjEwMCkgTG9nZWludHJhZWdlIGFlbHRlc3RlIGxvZXNjaGVuOg0JLy8gJG1heG1zZyA9IDEwMDsNCWlmKGNvdW50KCRsaW5lcykgPiAkbWF4bXNnKSB1bnNldCgkbGluZXNbMF0pOw0NCSRubCA9IGltcGxvZGUoIiIsICRsaW5lcykuJG5sOw0JJGZwMiA9IGZvcGVuKCRpbnN0YWxsYXRpb25fcGF0aC4nL3NlYXJjaGxvZy50eHQnLCAnd2InKTsNCWZsb2NrKCRmcDIsTE9DS19FWCk7DQlmd3JpdGUoJGZwMiwgJG5sKTsNCWZsb2NrKCRmcDIsTE9DS19VTik7DQlmY2xvc2UoJGZwMik7DX0NDQ0NCWlmKCRmb3VuZCA9PSAiMCIpCXsNCQllY2hvICRub3Jlc3VsdDsNCQlpZiAoc3RybGVuKCRzZWFyY2gpID4gJGxlbmd0aCAmJiAkdm9yc2NobGFnICE9ICIiKSB7IA0NCQkJJHN5biA9IHN0cl9yZXBsYWNlKCcmcXVvdDsnLCcnLCRzZWFyY2gpOw0JCQkkc3luID0gc3RyX3JlcGxhY2UoJyInLCcnLCRzZWFyY2gpOw0JCQ0JCQlpZiAoc3RycG9zKHN0cnRvbG93ZXIoJGVuY29kaW5nKSwidXRmIikhPT0gZmFsc2UpIHsNCQkJCSRzeW4gPSBtYl9zdWJzdHIodHJpbSgkc3luKSwwLCRsZW5ndGgsJ3V0Zi04Jyk7DQkJCX0gZWxzZSB7DQkJCQkkc3luID0gc3Vic3RyKHRyaW0oJHN5biksMCwkbGVuZ3RoKTsNCQkJfQ0NCQkJZWNobyAiPHA+JHZvcnNjaGxhZyA8YSBocmVmID1cIiIuIGJhc2VuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKS4iP3E9JHN5biZhbXA7Z2VnZW49JmFtcDtkYXRlPSIudGltZSgpLiJcIj4kc3luPC9hPi48L3A+IjsNCQl9DQl9DQ0JaWYoJGZvdW5kID09ICIxIiAmJiAkanVtcCA9PSB0cnVlICYmICRfU0VSVkVSWydQSFBfU0VMRiddICE9IHN1YnN0cigkbGluaywxKSkJeyAvL2RhcyBTdWNoc2NyaXB0IHNlbGJzdCBkYXJmIG5pY2h0IGFuZ2VzcHJ1bmdlbiB3ZXJkZW46IEVuZGxvc3NjaGxlaWZlDSAgCQkkbGluayA9IHN1YnN0cigkbGluaywxKTsJLy9kZW4gUHVua3Qgdm9yIGRlbSBkaXIgd2VnDQkJJHNlYXJjaCA9IHN0cl9yZXBsYWNlKCcmcXVvdDsnLCciJywkc2VhcmNoKTsgLy8gd2VnZW4gc2VhcmNodGVybS5qcw0JCQ0JCS8vIGRvcHBlbHRlIHNsYXNoIHZvciBEYXRlaW5hbWVuIHVudGVyZHJ1ZWNrZW4NCQkkZGlybmFtZSA9IGRpcm5hbWUoJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOw0JCWlmKCRkaXJuYW1lID09ICIvIikgJGRpcm5hbWUgPSAiIjsNCQkvLyBiYWNrc2xhc2ggdm9uIFdpbmRvd3MgU2VydmVybiByYXVzOg0JCSRkaXJuYW1lID0gc3RyX3JlcGxhY2UoIlxcIiwiIiwkZGlybmFtZSk7DQ0JCWlmIChpc3NldCgkcXVlcnkpKXsNCQkJaGVhZGVyKCJMb2NhdGlvbjogaHR0cDovLyIuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiRkaXJuYW1lLiIvIi4kbGluay4iJnE9Ii4kc2VhcmNoKTsNCQl9IGVsc2Ugew0JCQloZWFkZXIoIkxvY2F0aW9uOiBodHRwOi8vIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uJGRpcm5hbWUuJGxpbmsuIj9xPSIuJHNlYXJjaCk7DQkJfQ0JCWV4aXQ7DQl9DQ0JaWYoJGZvdW5kID4gIjEiKSB7DSAgICAgICAgJG4gPSAkcGx1cmFsOyAkZSA9ICJlIjsgJHMgPSAicyI7DQl9IGVsc2Ugew0gICAgCSRlID0gJG4gPSAkcyA9ICIiOw0JfQ0NCWlmKCRmb3VuZCA+PSAiMSIpIHsNDQkJJGFycmF5ID0gZXhwbG9kZSgiXG4iLCAkYXJyYXkpOw0JCWlmIChpc3NldCgkYWxwaGFzb3J0KSAmJiAkYWxwaGFzb3J0ID09PSB0cnVlKSB7DQkJCXNvcnQoJGFycmF5KTsNCQl9IGVsc2Ugew0JCQluYXRzb3J0KCRhcnJheSk7DQkJfQ0JCXJlc2V0KCRhcnJheSk7DQkJaWYgKCFpc3NldCgkcmV2ZXJzZXNvcnQpKSB7JGFycmF5ID0gYXJyYXlfcmV2ZXJzZSgkYXJyYXkpO30NDSAgICAgICRpID0gJGFuel9kYXQ7DQ0NICAgICAgLy8gYW5zdGVsbGUgZGVyIHdoaWxlIGVpbiBmb3IgU2NobGVpZmUsIHdlbm4gaWNoIHdlaXRlcmUgU2VpdGVuIGFuemVpZ2VuIHdpbGw6DSAgICAgICRuZXh0PTA7DSAgICAgIGlmKGlzc2V0KCRfR0VUWyJuZXh0Il0pIHx8IGlzc2V0KCRfUE9TVFsibmV4dCJdKSkgew0gICAgICAgICAgICBpZiAoaXNzZXQoJF9HRVRbIm5leHQiXSkgJiYgJF9HRVRbIm5leHQiXSAhPSAiIikgJG5leHQgPSAkX0dFVFsibmV4dCJdOw0gICAgICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWyJuZXh0Il0pICYmICRfUE9TVFsibmV4dCJdICE9ICIiKSAkbmV4dCA9ICRfUE9TVFsibmV4dCJdOw0gICAgICB9DSAgICAgIA0gICAgICAkbmV4dDE9JG5leHQrMTsNICAgICAgJHdlaXRlcj0kbmV4dCskYW56X2RhdDsNICAgICAgZm9yKCRjb3VudCA9IDAgKyAkbmV4dDsgJGNvdW50IDwgJGFuel9kYXQgKyAkbmV4dDsgJGNvdW50KyspIHsNICAgICAgICAgaWYgKCRpZnJhbWUgIT09IHRydWUpIHsgDQ0NICAgICAgICAgICAgaWYgKEAkYXJyYXlbJGNvdW50XSkgJGF1c2dhYmUgLj0gIjxsaT4iLiRsaXN0X2h4X3N0YXJ0LnN1YnN0cihzdHJzdHIoJGFycmF5WyRjb3VudF0sICc8YSBocmVmJyksMCkuIjwvbGk+XG4iOw0gICAgICAgICB9IGVsc2Ugew0gICAgICAgICAgICBpZiAoQCRhcnJheVskY291bnRdKSAkYXVzZ2FiZSAuPSAiPGlmcmFtZSBjbGFzcz0nc2VhcmNoaWZyYW1lJyBzcmM9JyIuJGFycmF5WyRjb3VudF0uIic+PC9pZnJhbWU+XG4iOw0gICAgICAgICB9DQkNICAgICAgfQ0NCQlpZiAoIWlzc2V0KCRmb3VuZHR4dDEpKXskZm91bmR0eHQxID0gIklociBTdWNoYmVncmlmZiB3dXJkZSAiO30NCQlpZiAoIWlzc2V0KCRmb3VuZHR4dDIpKXskZm91bmR0eHQyID0gIlNlaXRlIjt9DQkJaWYgKCFpc3NldCgkZm91bmR0eHQzKSl7JGZvdW5kdHh0MyA9ICIgZ2VmdW5kZW4uIjt9DQ0JCWVjaG8gJzxwPicuJGZvdW5kdHh0MS4nPHN0cm9uZz4gJy4kZm91bmQuJyA8L3N0cm9uZz4nLiRmb3VuZHR4dDIuJG4uJyAnLiRmb3VuZHR4dDM7DQ0gICAgICBpZiAoJG5leHQgPT0gMCkgew0gICAgICAgICAgICBpZiAoJGFuel9kYXQgPCAkZm91bmQpIHsNICAgICAgCQkJaWYgKGlzc2V0KCRhbmdlemVpZ3R0eHQpKXsNICAgICAgICAgCQkJCWVjaG8gJGFuZ2V6ZWlndHR4dDsNICAgICAgCQkJfSBlbHNlIHsNICAgICAgICAgCQkJCWVjaG8gIjxiciAvPkFuZ2V6ZWlndCB3ZXJkZW4gPHN0cm9uZz4kYW56X2RhdDwvc3Ryb25nPiBFcmdlYm5pc3NlIHBybyBTZWl0ZSI7DSAgICAgIAkJCX0NICAgICAgCQl9DQ0vLyAgICAgIAkJaWYoJHRyZWZmZXIgJiYgJGZvdW5kID4gMSAmJiAkb3IgPT09IGZhbHNlKSB7IA0JICAgICAgCWlmKCR0cmVmZmVyICYmICRmb3VuZCA+IDEpIHsgDSAgICAgIAkJCWlmIChpc3NldCgkc29ydHR4dCkpew0gICAgICAJCQkJJHNvcnRoaW53ZWlzID0gJHNvcnR0eHQ7DSAgICAgIAkJCX0gZWxzZSB7DSAgICAgIAkJCQkkc29ydGhpbndlaXMgPSAiLCBzb3J0aWVydCBuYWNoIFtBbnphaGwmbmJzcDtkZXImbmJzcDtUcmVmZmVyJm5ic3A7cHJvJm5ic3A7RG9rdW1lbnRdIjsNICAgICAgCQkJfQ0gICAgICAJCX0gDQkJCWVjaG8gIiRzb3J0aGlud2Vpcy4iOw0gICAgICB9DSAgICAgIGVjaG8gIjwvcD4iOw0NLy8gTmV1ZXMgRmVuc3Rlcg1pZiAoJHRhcmdldCA9PSAiIiAmJiAkdGFyZ2V0d2FobCA9PSB0cnVlKSB7DWVjaG8nDTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NLyogPCFbQ0RBVEFbICovDWlmKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKFwnc3VjaG9lZmZuZW5cJykgIT09IC0xKXsNICAgYWRkRXZlbnQod2luZG93LCBcJ2xvYWRcJywgbGlua29wZW5lcik7DSAgIGRvY3VtZW50LndyaXRlIChcJzxmb3JtIGFjdGlvbj0iIj48cCBjbGFzcz0ibGlua29wZW5lciI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIiBvbmNoYW5nZT0ibGlua2Nvb2tpZSgpIiBvbmNsaWNrPSJsaW5rb3BlbmVyKHRoaXMuY2hlY2tlZCkiIGlkPSJsaW5rc25ld3dpbjEiIC8+IDxsYWJlbCBmb3I9ImxpbmtzbmV3d2luMSI+VHJlZmZlciBpbiBuZXVlbSBGZW5zdGVyICZvdW1sO2ZmbmVuPyA8XC9sYWJlbD48XC9wPjxcL2Zvcm0+XCcpOw19IGVsc2Ugew0gICBkb2N1bWVudC53cml0ZSAoXCc8Zm9ybSBhY3Rpb249IiI+PHAgY2xhc3M9ImxpbmtvcGVuZXIiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25jaGFuZ2U9Imxpbmtjb29raWUoKSIgb25jbGljaz0ibGlua29wZW5lcih0aGlzLmNoZWNrZWQpIiBpZD0ibGlua3NuZXd3aW4xIiAvPiA8bGFiZWwgZm9yPSJsaW5rc25ld3dpbjEiPlRyZWZmZXIgaW4gbmV1ZW0gRmVuc3RlciAmb3VtbDtmZm5lbj8gPFwvbGFiZWw+PFwvcD48XC9mb3JtPlwnKTsNfQ0vKiBdXT4gKi8NPC9zY3JpcHQ+DSc7DX0NDSAgICAgICAgICAgICRsaXN0X2FydD0idWwiOw0gICAgICAgICAgICBpZiAoJG51bV9saXN0KSRsaXN0X2FydD0ib2wgc3RhcnQ9JG5leHQiOw0NICAgICAgICAgICAgLy8gdW0gWE1MIEZlaGxlciAoSFRNTCBUaWR5IFdhcm51bmdlbikgenUgdW50ZXJiaW5kZW46DSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudGltcmVldmVzLmRlL25ldS93ZWJkZXNpZ24vd2ViLTIwLnBocA0gICAgICAgICAgICAkc3VjaG11c3RlciA9ICcvJig/IShbYS16QS1aXXsyLDd9fCNcZCt8I3hbMC05YS1mQS1GXSspOykvaSc7DSAgICAgICAgICAgICRlcnNldHp1bmcgPSAnJmFtcDsnOw0gICAgICAgICAgICAkYXVzZ2FiZSA9IHByZWdfcmVwbGFjZSgkc3VjaG11c3RlciwgJGVyc2V0enVuZywgJGF1c2dhYmUpOw0NICAgICAgICAgICAgaWYgKCRpZnJhbWUgIT09IHRydWUpIHsgDSAgICAgICAgICAgICAgIGlmICgkbnVtX2xpc3QpIHsNICAgICAgICAgICAgICAgICAgZWNobyAiXG48b2wgc3RhcnQ9JyIuJG5leHQxLiInPlxuIi4kYXVzZ2FiZS4iPC9vbD5cbiI7DSAgICAgICAgICAgICAgIH0gZWxzZSB7DSAgICAgICAgICAgICAgICAgIGVjaG8gIlxuPHVsPlxuIi4kYXVzZ2FiZS4iPC91bD5cbiI7DSAgICAgICAgICAgICAgIH0NICAgICAgICAgICAgfSBlbHNlIHsNICAgICAgICAgICAgICAgZWNobyAiXG4iLiRhdXNnYWJlLiJcbiI7DSAgICAgICAgICAgIH0NDSAgICAgIGlmICgkbmV4dCA8ICgkZm91bmQgLSAkYW56X2RhdCkpIHsNICAgICAgDSAgICAgICAgIGlmICgkbWV0aG9kID09ICJHRVQiKSB7DSAgICAgICAgICAgIC8vbmV4dCByYXVzLCB3ZWlscyBzb25zdCB4LW1hbCBhbmdlaGFlbmd0IHdpcmQ6DSAgICAgICAgICAgICRxdWVyeXN0cmluZyA9ICIiOw0gICAgICAgICAgICBpZihpc3NldCgkX1NFUlZFUlsiUVVFUllfU1RSSU5HIl0pKSB7IA0gICAgICAgICAgICAgICAkcXVlcnlzdHJpbmcgPSAkX1NFUlZFUlsiUVVFUllfU1RSSU5HIl07IA0gICAgICAgICAgICAgICAkZmlyc3RxdWVyeSA9IHN0cnBvcygkcXVlcnlzdHJpbmcsIiZuZXh0Iik7DSAgICAgICAgICAgICAgIGlmICgkZmlyc3RxdWVyeSAhPT0gZmFsc2UpIHsgDSAgICAgICAgICAgICAgICAgICRxdWVyeXN0cmluZyA9IHN1YnN0cigkcXVlcnlzdHJpbmcsMCwkZmlyc3RxdWVyeSk7IA0gICAgICAgICAgICAgICB9DSAgICAgICAgICAgIH0NICAgICAgICAgICAgJHF1ZXJ5c3RyaW5nID0gc3RyX3JlcGxhY2UoIiYiLCImYW1wOyIsJHF1ZXJ5c3RyaW5nKTsNICAgICAgICAgICAgZWNobyAnPHAgY2xhc3M9IndlaXRlciI+PGEgaHJlZj0iJy5iYXNlbmFtZSgkX1NFUlZFUlsiUEhQX1NFTEYiXSkuJz8nLiRxdWVyeXN0cmluZy4nJmFtcDtuZXh0PScuJHdlaXRlci4nIj4nLiR3ZWl0ZXJ0eHQuJzwvYT48L3A+JzsNICAgICAgICAgfQ0gICAgICB9DQl9DX0NDQ1lbHNlIHtlY2hvICRtaW5sZW5ndGg7fQ19DQ1lY2hvICRzZWFyY2h0aXA7DQ0kbXRpbWUgPSBtaWNyb3RpbWUoKTsgJG10aW1lID0gZXhwbG9kZSggJyAnLCAkbXRpbWUpOyAkbXRpbWUgPSAkbXRpbWVbMV0gKyAkbXRpbWVbMF07DSRzdWNoX2VuZGUgPSAkbXRpbWU7DSR0aW1lX2dlc2FtdCA9ICRzdWNoX2VuZGUgLSAkc3VjaF9zdGFydDsNDWVjaG8gIjxkaXYgaWQ9XCJzZWFyY2hmb290ZXJcIj48cD4iOw0NaWYgKGlzc2V0KCRhbnphaGxkYXQpKXsNCSR6ZGF0ID0gJGFuemFobGRhdDsNCX0gZWxzZSB7DQkkemRhdCA9ICJBbnphaGwgZHVyY2hzdWNodGVyIERhdGVpZW46ICI7DX0NDWlmICgkemFobHplaWcgJiYgJGZvdW5kID4gMCkgZWNobyAkemRhdC4kZHVyY2hzdWNodC4iPGJyIC8+IjsNDWlmICgkZm91bmQgPiAwKSB7DQlpZiAoaXNzZXQoJHRpbWV0eHQpKXsNCQkkdGltZWhpbndlaXMgPSAkdGltZXR4dDsNCX0gZWxzZSB7DQkJJHRpbWVoaW53ZWlzID0gIlN1Y2hlIGF1c2dlZiZ1dW1sO2hydCBpbiAiOw0JfQ0NCWlmKCRkYXVlcikgew0JICAgICAgZWNobyAiJHRpbWVoaW53ZWlzIi5udW1iZXJfZm9ybWF0KCR0aW1lX2dlc2FtdCwyLCcsJywnLicpLiIgJHN1Y2hkYXVlciAkdmVyc2lvblxuIjsNCX0gZWxzZSB7DQkgICAgICBlY2hvICJcbiR2ZXJzaW9uXG4iOw0JfQ19IGVsc2Ugew0gICAgICBlY2hvICJcbiR2ZXJzaW9uXG4iOw19DWVjaG8gIjwvcD48L2Rpdj4iOw1lY2hvICR3ZHc7DQ==";@eval(base64_decode($NCiR0aW1lX29sZCA9IDA7IC8vIGb8ciBkaWUgRm9ydHNjaHJpdHRzYW56ZWlnZQNCiR0aW1lX29sZCA9IDA7IC8vIGb8ciBkaWUgRm9ydHNjaHJpdHRzYW56ZWlnZQ));?>

Function Calls

base64_decode 1

Variables

$NCiR0aW1lX29sZCA9IDA7IC8vIGb8ciBkaWUgRm9ydHNjaHJpdHRzYW56ZWlnZQNCiR0aW1lX29sZCA9IDA7IC8vIGb8ciBkaWUgRm9ydHNjaHJpdHRzYW56ZWlnZQ Ly8gTmV0dCwgZGFzcyBTaWUgc2ljaCBmdWVyIG1laW5lbiBzb3VyY2Vjb2Rl..

Stats

MD5 b5f8ced19dde6aebb7e33e4881af5546
Eval Count 1
Decode Time 168 ms